1/*- 2 * Copyright (c) 2007 John Birrell (jb@freebsd.org) 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#include <stdlib.h> 30#include "_libdwarf.h" 31 32int 33dwarf_finish(Dwarf_Debug *dbgp, Dwarf_Error *error) 34{ 35 Dwarf_Abbrev ab; 36 Dwarf_Abbrev tab; 37 Dwarf_Attribute at; 38 Dwarf_Attribute tat; 39 Dwarf_AttrValue av; 40 Dwarf_AttrValue tav; 41 Dwarf_CU cu; 42 Dwarf_CU tcu; 43 Dwarf_Debug dbg; 44 Dwarf_Die die; 45 Dwarf_Die tdie; 46 47 if (error == NULL) 48 /* Can only return a generic error. */ 49 return DWARF_E_ERROR; 50 51 if (dbgp == NULL) { 52 DWARF_SET_ERROR(error, DWARF_E_ARGUMENT); 53 return DWARF_E_ERROR; 54 } 55 56 if ((dbg = *dbgp) == NULL) 57 return DWARF_E_NONE; 58 59 /* Free entries in the compilation unit list. */ 60 STAILQ_FOREACH_SAFE(cu, &dbg->dbg_cu, cu_next, tcu) { 61 /* Free entries in the die list */ 62 STAILQ_FOREACH_SAFE(die, &cu->cu_die, die_next, tdie) { 63 /* Free entries in the attribute value list */ 64 STAILQ_FOREACH_SAFE(av, &die->die_attrval, av_next, tav) { 65 STAILQ_REMOVE(&die->die_attrval, av, _Dwarf_AttrValue, av_next); 66 free(av); 67 } 68 69 STAILQ_REMOVE(&cu->cu_die, die, _Dwarf_Die, die_next); 70 free(die); 71 } 72 73 /* Free entries in the abbrev list */ 74 STAILQ_FOREACH_SAFE(ab, &cu->cu_abbrev, a_next, tab) { 75 /* Free entries in the attribute list */ 76 STAILQ_FOREACH_SAFE(at, &ab->a_attrib, at_next, tat) { 77 STAILQ_REMOVE(&ab->a_attrib, at, _Dwarf_Attribute, at_next); 78 free(at); 79 } 80 81 STAILQ_REMOVE(&cu->cu_abbrev, ab, _Dwarf_Abbrev, a_next); 82 free(ab); 83 } 84 85 STAILQ_REMOVE(&dbg->dbg_cu, cu, _Dwarf_CU, cu_next); 86 free(cu); 87 } 88 89 if (dbg->dbg_elf_close) 90 /* Free resources associated with the ELF file. */ 91 elf_end(dbg->dbg_elf); 92 93 free(dbg); 94 95 *dbgp = NULL; 96 97 return DWARF_E_NONE; 98} 99