4 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * $FreeBSD: src/lib/libdwarf/dwarf_finish.c,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
32 #include "_libdwarf.h"
35 dwarf_finish(Dwarf_Debug
*dbgp
, Dwarf_Error
*error
)
50 /* Can only return a generic error. */
54 DWARF_SET_ERROR(error
, DWARF_E_ARGUMENT
);
58 if ((dbg
= *dbgp
) == NULL
)
61 /* Free entries in the compilation unit list. */
62 STAILQ_FOREACH_SAFE(cu
, &dbg
->dbg_cu
, cu_next
, tcu
) {
63 /* Free entries in the die list */
64 STAILQ_FOREACH_SAFE(die
, &cu
->cu_die
, die_next
, tdie
) {
65 /* Free entries in the attribute value list */
66 STAILQ_FOREACH_SAFE(av
, &die
->die_attrval
, av_next
, tav
) {
67 STAILQ_REMOVE(&die
->die_attrval
, av
, _Dwarf_AttrValue
, av_next
);
71 STAILQ_REMOVE(&cu
->cu_die
, die
, _Dwarf_Die
, die_next
);
75 /* Free entries in the abbrev list */
76 STAILQ_FOREACH_SAFE(ab
, &cu
->cu_abbrev
, a_next
, tab
) {
77 /* Free entries in the attribute list */
78 STAILQ_FOREACH_SAFE(at
, &ab
->a_attrib
, at_next
, tat
) {
79 STAILQ_REMOVE(&ab
->a_attrib
, at
, _Dwarf_Attribute
, at_next
);
83 STAILQ_REMOVE(&cu
->cu_abbrev
, ab
, _Dwarf_Abbrev
, a_next
);
87 STAILQ_REMOVE(&dbg
->dbg_cu
, cu
, _Dwarf_CU
, cu_next
);
91 if (dbg
->dbg_elf_close
)
92 /* Free resources associated with the ELF file. */
93 elf_end(dbg
->dbg_elf
);