]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/elftoolchain/libdwarf/dwarf_dealloc.c
MFV r360158:
[FreeBSD/FreeBSD.git] / contrib / elftoolchain / libdwarf / dwarf_dealloc.c
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
27 #include "_libdwarf.h"
28
29 ELFTC_VCSID("$Id: dwarf_dealloc.c 2073 2011-10-27 03:30:47Z jkoshy $");
30
31 void
32 dwarf_dealloc(Dwarf_Debug dbg, Dwarf_Ptr p, Dwarf_Unsigned alloc_type)
33 {
34         Dwarf_Abbrev ab;
35         Dwarf_AttrDef ad, tad;
36         Dwarf_Attribute at, tat;
37         Dwarf_Die die;
38
39         /*
40          * This libdwarf implementation does not use the SGI/libdwarf
41          * style of memory allocation. In most cases it does not copy
42          * things to return to the client, so the client does not need
43          * to remember to free them.  The remaining cases are handled
44          * below.
45          */
46
47         (void) dbg;
48
49         if (alloc_type == DW_DLA_LIST || alloc_type == DW_DLA_FRAME_BLOCK ||
50             alloc_type == DW_DLA_LOC_BLOCK || alloc_type == DW_DLA_LOCDESC)
51                 free(p);
52         else if (alloc_type == DW_DLA_ABBREV) {
53                 ab = p;
54                 STAILQ_FOREACH_SAFE(ad, &ab->ab_attrdef, ad_next, tad) {
55                         STAILQ_REMOVE(&ab->ab_attrdef, ad, _Dwarf_AttrDef,
56                             ad_next);
57                         free(ad);
58                 }
59                 free(ab);
60         } else if (alloc_type == DW_DLA_DIE) {
61                 die = p;
62                 STAILQ_FOREACH_SAFE(at, &die->die_attr, at_next, tat) {
63                         STAILQ_REMOVE(&die->die_attr, at,
64                             _Dwarf_Attribute, at_next);
65                         if (at->at_ld != NULL)
66                                 free(at->at_ld);
67                         free(at);
68                 }
69                 if (die->die_attrarray)
70                         free(die->die_attrarray);
71                 free(die);
72         }
73 }
74
75 void
76 dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line *linebuf,
77         Dwarf_Signed count)
78 {
79         /*
80          * In this libdwarf implementation, line information remains
81          * associated with the DIE for a compilation unit for the
82          * lifetime of the DIE.  The client does not need to free
83          * the memory returned by `dwarf_srclines()`.
84          */ 
85
86         (void) dbg; (void) linebuf; (void) count;
87 }
88
89 void
90 dwarf_ranges_dealloc(Dwarf_Debug dbg, Dwarf_Ranges *ranges,
91     Dwarf_Signed range_count)
92 {
93         /*
94          * In this libdwarf implementation, ranges information is
95          * kept by a STAILQ inside Dwarf_Debug object. The client
96          * does not need to free the memory returned by
97          * `dwarf_get_ranges()` or `dwarf_get_ranges_a()`.
98          */
99
100         (void) dbg; (void) ranges; (void) range_count;
101 }
102
103 void
104 dwarf_fde_cie_list_dealloc(Dwarf_Debug dbg, Dwarf_Cie *cie_list,
105     Dwarf_Signed cie_count, Dwarf_Fde *fde_list, Dwarf_Signed fde_count)
106 {
107         /*
108          * In this implementation, FDE and CIE information is managed
109          * as part of the Dwarf_Debug object.  The client does not need
110          * to explicitly free these memory arenas.
111          */
112         (void) dbg;
113         (void) cie_list;
114         (void) cie_count;
115         (void) fde_list;
116         (void) fde_count;
117 }