149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
3*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2007-2020 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi
5*4d9fdb46SRobert Mustacchi This program is free software; you can redistribute it
6*4d9fdb46SRobert Mustacchi and/or modify it under the terms of version 2.1 of the
7*4d9fdb46SRobert Mustacchi GNU Lesser General Public License as published by the Free
8*4d9fdb46SRobert Mustacchi Software Foundation.
9*4d9fdb46SRobert Mustacchi
10*4d9fdb46SRobert Mustacchi This program is distributed in the hope that it would be
11*4d9fdb46SRobert Mustacchi useful, but WITHOUT ANY WARRANTY; without even the implied
12*4d9fdb46SRobert Mustacchi warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13*4d9fdb46SRobert Mustacchi PURPOSE.
14*4d9fdb46SRobert Mustacchi
15*4d9fdb46SRobert Mustacchi Further, this software is distributed without any warranty
16*4d9fdb46SRobert Mustacchi that it is free of the rightful claim of any third person
17*4d9fdb46SRobert Mustacchi regarding infringement or the like. Any license provided
18*4d9fdb46SRobert Mustacchi herein, whether implied or otherwise, applies only to this
19*4d9fdb46SRobert Mustacchi software file. Patent licenses, if any, provided herein
20*4d9fdb46SRobert Mustacchi do not apply to combinations of this program with other
21*4d9fdb46SRobert Mustacchi software, or any other product whatsoever.
22*4d9fdb46SRobert Mustacchi
23*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General
24*4d9fdb46SRobert Mustacchi Public License along with this program; if not, write the
25*4d9fdb46SRobert Mustacchi Free Software Foundation, Inc., 51 Franklin Street - Fifth
26*4d9fdb46SRobert Mustacchi Floor, Boston MA 02110-1301, USA.
2749d3bc91SRichard Lowe
2849d3bc91SRichard Lowe */
29*4d9fdb46SRobert Mustacchi /* To see the full set of DW_DLA types and nothing
30*4d9fdb46SRobert Mustacchi else try:
31*4d9fdb46SRobert Mustacchi grep DW_DLA dwarf_alloc.c | grep 0x
3207dc1947SRichard Lowe */
3349d3bc91SRichard Lowe
3449d3bc91SRichard Lowe #include "config.h"
3549d3bc91SRichard Lowe #include <sys/types.h>
36*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
3749d3bc91SRichard Lowe #include <stdlib.h>
38*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
39*4d9fdb46SRobert Mustacchi #ifdef HAVE_MALLOC_H
40*4d9fdb46SRobert Mustacchi /* Useful include for some Windows compilers. */
41*4d9fdb46SRobert Mustacchi #include <malloc.h>
42*4d9fdb46SRobert Mustacchi #endif /* HAVE_MALLOC_H */
4349d3bc91SRichard Lowe #include <stdio.h>
44*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDINT_H
45*4d9fdb46SRobert Mustacchi #include <stdint.h> /* For uintptr_t */
46*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDINT_H */
47*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
48*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
49*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
50*4d9fdb46SRobert Mustacchi /* These files are included to get the sizes
51*4d9fdb46SRobert Mustacchi of structs for malloc.
5249d3bc91SRichard Lowe */
53*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
5449d3bc91SRichard Lowe #include "dwarf_line.h"
5549d3bc91SRichard Lowe #include "dwarf_global.h"
5649d3bc91SRichard Lowe #include "dwarf_arange.h"
5749d3bc91SRichard Lowe #include "dwarf_abbrev.h"
5849d3bc91SRichard Lowe #include "dwarf_die_deliv.h"
5949d3bc91SRichard Lowe #include "dwarf_frame.h"
6049d3bc91SRichard Lowe #include "dwarf_loc.h"
6149d3bc91SRichard Lowe #include "dwarf_funcs.h"
6249d3bc91SRichard Lowe #include "dwarf_types.h"
6349d3bc91SRichard Lowe #include "dwarf_vars.h"
6449d3bc91SRichard Lowe #include "dwarf_weaks.h"
65*4d9fdb46SRobert Mustacchi #include "dwarf_harmless.h"
66*4d9fdb46SRobert Mustacchi #include "dwarf_tsearch.h"
67*4d9fdb46SRobert Mustacchi #include "dwarf_gdbindex.h"
68*4d9fdb46SRobert Mustacchi #include "dwarf_xu_index.h"
69*4d9fdb46SRobert Mustacchi #include "dwarf_macro5.h"
70*4d9fdb46SRobert Mustacchi #include "dwarf_dnames.h"
71*4d9fdb46SRobert Mustacchi #include "dwarf_rnglists.h"
72*4d9fdb46SRobert Mustacchi #include "dwarf_dsc.h"
73*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
74*4d9fdb46SRobert Mustacchi #include "dwarf_str_offsets.h"
75*4d9fdb46SRobert Mustacchi
76*4d9fdb46SRobert Mustacchi #define TRUE 1
77*4d9fdb46SRobert Mustacchi #define FALSE 0
78*4d9fdb46SRobert Mustacchi /* Some allocations are simple some not. These reduce
79*4d9fdb46SRobert Mustacchi the issue of determining which sort of thing to a simple
80*4d9fdb46SRobert Mustacchi test. See ia_multiply_count
81*4d9fdb46SRobert Mustacchi Usually when MULTIPLY_NO is set the count
82*4d9fdb46SRobert Mustacchi is 1, so MULTIPY_CT would work as well. */
83*4d9fdb46SRobert Mustacchi #define MULTIPLY_NO 0
84*4d9fdb46SRobert Mustacchi #define MULTIPLY_CT 1
85*4d9fdb46SRobert Mustacchi #define MULTIPLY_SP 2
86*4d9fdb46SRobert Mustacchi /* This translates into de_alloc_hdr into a per-instance size
87*4d9fdb46SRobert Mustacchi and allows room for a constructor/destructor pointer.
88*4d9fdb46SRobert Mustacchi Rearranging the DW_DLA values would break binary compatibility
89*4d9fdb46SRobert Mustacchi so that is not an option.
90*4d9fdb46SRobert Mustacchi */
91*4d9fdb46SRobert Mustacchi struct ial_s {
92*4d9fdb46SRobert Mustacchi /* In bytes, one struct instance. */
93*4d9fdb46SRobert Mustacchi short ia_struct_size;
9449d3bc91SRichard Lowe
95*4d9fdb46SRobert Mustacchi /* Not a count, but a MULTIPLY{_NO,_CT,_SP} value. */
96*4d9fdb46SRobert Mustacchi short ia_multiply_count;
9707dc1947SRichard Lowe
98*4d9fdb46SRobert Mustacchi /* When we really need a constructor/destructor
99*4d9fdb46SRobert Mustacchi these make applying such quite simple. */
100*4d9fdb46SRobert Mustacchi int (*specialconstructor) (Dwarf_Debug, void *);
101*4d9fdb46SRobert Mustacchi void (*specialdestructor) (void *);
102*4d9fdb46SRobert Mustacchi };
10307dc1947SRichard Lowe
104*4d9fdb46SRobert Mustacchi /* Used as a way to return meaningful errors when
105*4d9fdb46SRobert Mustacchi the malloc arena is exhausted (when malloc returns NULL).
106*4d9fdb46SRobert Mustacchi Not normally used.
107*4d9fdb46SRobert Mustacchi New in December 2014.*/
108*4d9fdb46SRobert Mustacchi struct Dwarf_Error_s _dwarf_failsafe_error = {
109*4d9fdb46SRobert Mustacchi DW_DLE_FAILSAFE_ERRVAL,
110*4d9fdb46SRobert Mustacchi 0,
111*4d9fdb46SRobert Mustacchi 1
112*4d9fdb46SRobert Mustacchi };
11349d3bc91SRichard Lowe
114*4d9fdb46SRobert Mustacchi /* If non-zero (the default) de_alloc_tree (see dwarf_alloc.c)
115*4d9fdb46SRobert Mustacchi is used normally. If zero then dwarf allocations
116*4d9fdb46SRobert Mustacchi are not tracked by libdwarf and dwarf_finish() cannot
117*4d9fdb46SRobert Mustacchi clean up any per-Dwarf_Debug allocations the
118*4d9fdb46SRobert Mustacchi caller forgot to dealloc. */
119*4d9fdb46SRobert Mustacchi static signed char global_de_alloc_tree_on = 1;
120*4d9fdb46SRobert Mustacchi #ifdef HAVE_GLOBAL_ALLOC_SUMS
121*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_allocation_count;
122*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_allocation_total;
123*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_de_alloc_tree_count;
124*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_de_alloc_tree_total;
125*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_de_alloc_tree_early_dealloc_count;
126*4d9fdb46SRobert Mustacchi static Dwarf_Unsigned global_de_alloc_tree_early_dealloc_size;
127*4d9fdb46SRobert Mustacchi #endif /* HAVE_GLOBAL_ALLOC_SUMS */
128*4d9fdb46SRobert Mustacchi
_dwarf_alloc_tree_counts(UNUSEDARG Dwarf_Unsigned * allocount,UNUSEDARG Dwarf_Unsigned * allosum,UNUSEDARG Dwarf_Unsigned * treecount,UNUSEDARG Dwarf_Unsigned * treesum,UNUSEDARG Dwarf_Unsigned * earlydealloccount,UNUSEDARG Dwarf_Unsigned * earlydeallocsize,UNUSEDARG Dwarf_Unsigned * unused1,UNUSEDARG Dwarf_Unsigned * unused2,UNUSEDARG Dwarf_Unsigned * unused3)129*4d9fdb46SRobert Mustacchi void _dwarf_alloc_tree_counts( UNUSEDARG Dwarf_Unsigned *allocount,
130*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *allosum,
131*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *treecount,
132*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *treesum,
133*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *earlydealloccount,
134*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *earlydeallocsize,
135*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *unused1,
136*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *unused2,
137*4d9fdb46SRobert Mustacchi UNUSEDARG Dwarf_Unsigned *unused3)
138*4d9fdb46SRobert Mustacchi {
139*4d9fdb46SRobert Mustacchi #ifdef HAVE_GLOBAL_ALLOC_SUMS
140*4d9fdb46SRobert Mustacchi *allocount = global_allocation_count;
141*4d9fdb46SRobert Mustacchi *allosum = global_allocation_total;
142*4d9fdb46SRobert Mustacchi *treecount = global_de_alloc_tree_count;
143*4d9fdb46SRobert Mustacchi *treesum = global_de_alloc_tree_total;
144*4d9fdb46SRobert Mustacchi *earlydealloccount =
145*4d9fdb46SRobert Mustacchi global_de_alloc_tree_early_dealloc_count;
146*4d9fdb46SRobert Mustacchi *earlydeallocsize =
147*4d9fdb46SRobert Mustacchi global_de_alloc_tree_early_dealloc_size;
148*4d9fdb46SRobert Mustacchi if (unused1) {
149*4d9fdb46SRobert Mustacchi *unused1 = 0;
150*4d9fdb46SRobert Mustacchi }
151*4d9fdb46SRobert Mustacchi if (unused2) {
152*4d9fdb46SRobert Mustacchi *unused2 = 0;
153*4d9fdb46SRobert Mustacchi }
154*4d9fdb46SRobert Mustacchi if (unused3) {
155*4d9fdb46SRobert Mustacchi *unused3 = 0;
156*4d9fdb46SRobert Mustacchi }
157*4d9fdb46SRobert Mustacchi #endif /* HAVE_GLOBAL_ALLOC_SUMS */
158*4d9fdb46SRobert Mustacchi }
15949d3bc91SRichard Lowe
160*4d9fdb46SRobert Mustacchi /* Defined March 7 2020. Allows a caller to
161*4d9fdb46SRobert Mustacchi avoid most tracking by the de_alloc_tree hash
162*4d9fdb46SRobert Mustacchi table if called with v of zero.
163*4d9fdb46SRobert Mustacchi Returns the value the flag was before this call. */
dwarf_set_de_alloc_flag(int v)164*4d9fdb46SRobert Mustacchi int dwarf_set_de_alloc_flag(int v)
165*4d9fdb46SRobert Mustacchi {
166*4d9fdb46SRobert Mustacchi int ov = global_de_alloc_tree_on;
167*4d9fdb46SRobert Mustacchi global_de_alloc_tree_on = v;
168*4d9fdb46SRobert Mustacchi return ov;
169*4d9fdb46SRobert Mustacchi }
17049d3bc91SRichard Lowe
17149d3bc91SRichard Lowe
17249d3bc91SRichard Lowe
173*4d9fdb46SRobert Mustacchi void
_dwarf_error_destructor(void * m)174*4d9fdb46SRobert Mustacchi _dwarf_error_destructor(void *m)
175*4d9fdb46SRobert Mustacchi {
176*4d9fdb46SRobert Mustacchi Dwarf_Error er = (Dwarf_Error)m;
177*4d9fdb46SRobert Mustacchi dwarfstring *erm = (dwarfstring *)er->er_msg;
178*4d9fdb46SRobert Mustacchi if (! erm) {
179*4d9fdb46SRobert Mustacchi return;
180*4d9fdb46SRobert Mustacchi }
181*4d9fdb46SRobert Mustacchi #if DEBUG
182*4d9fdb46SRobert Mustacchi printf("libdwarfdetector DEALLOC Now destruct error string %s\n",dwarfstring_string(erm));
183*4d9fdb46SRobert Mustacchi #endif
184*4d9fdb46SRobert Mustacchi dwarfstring_destructor(erm);
185*4d9fdb46SRobert Mustacchi free(erm);
186*4d9fdb46SRobert Mustacchi er->er_msg = 0;
187*4d9fdb46SRobert Mustacchi return;
188*4d9fdb46SRobert Mustacchi }
18949d3bc91SRichard Lowe
190*4d9fdb46SRobert Mustacchi /* To do destructors we need some extra data in every
191*4d9fdb46SRobert Mustacchi _dwarf_get_alloc situation. */
192*4d9fdb46SRobert Mustacchi /* Here is the extra we malloc for a prefix. */
193*4d9fdb46SRobert Mustacchi struct reserve_size_s {
194*4d9fdb46SRobert Mustacchi void *dummy_rsv1;
195*4d9fdb46SRobert Mustacchi void *dummy_rsv2;
196*4d9fdb46SRobert Mustacchi };
197*4d9fdb46SRobert Mustacchi /* Here is how we use the extra prefix area. */
198*4d9fdb46SRobert Mustacchi struct reserve_data_s {
199*4d9fdb46SRobert Mustacchi void *rd_dbg;
200*4d9fdb46SRobert Mustacchi unsigned short rd_length;
201*4d9fdb46SRobert Mustacchi unsigned short rd_type;
202*4d9fdb46SRobert Mustacchi };
203*4d9fdb46SRobert Mustacchi #define DW_RESERVE sizeof(struct reserve_size_s)
20449d3bc91SRichard Lowe
20549d3bc91SRichard Lowe
206*4d9fdb46SRobert Mustacchi static const
207*4d9fdb46SRobert Mustacchi struct ial_s alloc_instance_basics[ALLOC_AREA_INDEX_TABLE_MAX] = {
208*4d9fdb46SRobert Mustacchi /* 0 none */
209*4d9fdb46SRobert Mustacchi { 1,MULTIPLY_NO, 0, 0},
21049d3bc91SRichard Lowe
211*4d9fdb46SRobert Mustacchi /* 0x1 x1 DW_DLA_STRING */
212*4d9fdb46SRobert Mustacchi { 1,MULTIPLY_CT, 0, 0},
21349d3bc91SRichard Lowe
214*4d9fdb46SRobert Mustacchi /* 0x2 DW_DLA_LOC */
215*4d9fdb46SRobert Mustacchi { sizeof(Dwarf_Loc),MULTIPLY_NO, 0, 0} ,
21649d3bc91SRichard Lowe
217*4d9fdb46SRobert Mustacchi /* x3 DW_DLA_LOCDESC */
218*4d9fdb46SRobert Mustacchi { sizeof(Dwarf_Locdesc),MULTIPLY_NO, 0, 0},
21907dc1947SRichard Lowe
220*4d9fdb46SRobert Mustacchi /* 0x4 DW_DLA_ELLIST */ /* not used */
221*4d9fdb46SRobert Mustacchi { 1,MULTIPLY_NO, 0, 0},
22249d3bc91SRichard Lowe
223*4d9fdb46SRobert Mustacchi /* 0x5 DW_DLA_BOUNDS */ /* not used */
224*4d9fdb46SRobert Mustacchi { 1,MULTIPLY_NO, 0, 0},
22507dc1947SRichard Lowe
226*4d9fdb46SRobert Mustacchi /* 0x6 DW_DLA_BLOCK */
227*4d9fdb46SRobert Mustacchi { sizeof(Dwarf_Block),MULTIPLY_NO, 0, 0},
22807dc1947SRichard Lowe
229*4d9fdb46SRobert Mustacchi /* x7 DW_DLA_DEBUG */
230*4d9fdb46SRobert Mustacchi /* the actual dwarf_debug structure */
231*4d9fdb46SRobert Mustacchi { 1,MULTIPLY_NO, 0, 0} ,
23207dc1947SRichard Lowe
233*4d9fdb46SRobert Mustacchi /* x8 DW_DLA_DIE */
234*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Die_s),MULTIPLY_NO, 0, 0},
23549d3bc91SRichard Lowe
236*4d9fdb46SRobert Mustacchi /* x9 DW_DLA_LINE */
237*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Line_s),MULTIPLY_NO, 0, 0},
23849d3bc91SRichard Lowe
239*4d9fdb46SRobert Mustacchi /* 0xa 10 DW_DLA_ATTR */
240*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Attribute_s),MULTIPLY_NO, 0, 0},
24149d3bc91SRichard Lowe
242*4d9fdb46SRobert Mustacchi /* 0xb DW_DLA_TYPE *//* not used */
243*4d9fdb46SRobert Mustacchi {1,MULTIPLY_NO, 0, 0},
24449d3bc91SRichard Lowe
245*4d9fdb46SRobert Mustacchi /* 0xc DW_DLA_SUBSCR *//* not used */
246*4d9fdb46SRobert Mustacchi {1,MULTIPLY_NO, 0, 0},
24749d3bc91SRichard Lowe
248*4d9fdb46SRobert Mustacchi /* 0xd 13 DW_DLA_GLOBAL */
249*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_s),MULTIPLY_NO, 0, 0},
25049d3bc91SRichard Lowe
251*4d9fdb46SRobert Mustacchi /* 0xe 14 DW_DLA_ERROR */
252*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Error_s),MULTIPLY_NO, 0,
253*4d9fdb46SRobert Mustacchi _dwarf_error_destructor},
25449d3bc91SRichard Lowe
255*4d9fdb46SRobert Mustacchi /* 0xf DW_DLA_LIST */
256*4d9fdb46SRobert Mustacchi {sizeof(Dwarf_Ptr),MULTIPLY_CT, 0, 0},
25749d3bc91SRichard Lowe
258*4d9fdb46SRobert Mustacchi /* 0x10 DW_DLA_LINEBUF */ /* not used */
259*4d9fdb46SRobert Mustacchi {1,MULTIPLY_NO, 0, 0},
26049d3bc91SRichard Lowe
261*4d9fdb46SRobert Mustacchi /* 0x11 17 DW_DLA_ARANGE */
262*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Arange_s),MULTIPLY_NO, 0, 0},
26349d3bc91SRichard Lowe
264*4d9fdb46SRobert Mustacchi /* 0x12 18 DW_DLA_ABBREV */
265*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Abbrev_s),MULTIPLY_NO, 0, 0},
26607dc1947SRichard Lowe
267*4d9fdb46SRobert Mustacchi /* 0x13 19 DW_DLA_FRAME_OP */
268*4d9fdb46SRobert Mustacchi {sizeof(Dwarf_Frame_Op),MULTIPLY_NO, 0, 0} ,
26907dc1947SRichard Lowe
270*4d9fdb46SRobert Mustacchi /* 0x14 20 DW_DLA_CIE */
271*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Cie_s),MULTIPLY_NO, 0, 0},
27207dc1947SRichard Lowe
273*4d9fdb46SRobert Mustacchi /* 0x15 DW_DLA_FDE */
274*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Fde_s),MULTIPLY_NO, 0,
275*4d9fdb46SRobert Mustacchi _dwarf_fde_destructor},
27607dc1947SRichard Lowe
277*4d9fdb46SRobert Mustacchi /* 0x16 DW_DLA_LOC_BLOCK */
278*4d9fdb46SRobert Mustacchi {sizeof(Dwarf_Loc),MULTIPLY_CT, 0, 0},
27907dc1947SRichard Lowe
280*4d9fdb46SRobert Mustacchi /* 0x17 DW_DLA_FRAME_BLOCK */
281*4d9fdb46SRobert Mustacchi {sizeof(Dwarf_Frame_Op),MULTIPLY_CT, 0, 0},
28207dc1947SRichard Lowe
283*4d9fdb46SRobert Mustacchi /* 0x18 DW_DLA_FUNC UNUSED */
284*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_s),MULTIPLY_NO, 0, 0},
28507dc1947SRichard Lowe
286*4d9fdb46SRobert Mustacchi /* 0x19 DW_DLA_TYPENAME UNUSED */
287*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_s),MULTIPLY_NO, 0, 0},
28807dc1947SRichard Lowe
289*4d9fdb46SRobert Mustacchi /* 0x1a DW_DLA_VAR UNUSED */
290*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_s),MULTIPLY_NO, 0, 0},
291*4d9fdb46SRobert Mustacchi
292*4d9fdb46SRobert Mustacchi /* 0x1b DW_DLA_WEAK UNUSED */
293*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_s),MULTIPLY_NO, 0, 0},
294*4d9fdb46SRobert Mustacchi
295*4d9fdb46SRobert Mustacchi /* 0x1c DW_DLA_ADDR */
296*4d9fdb46SRobert Mustacchi {1,MULTIPLY_SP, 0, 0},
297*4d9fdb46SRobert Mustacchi
298*4d9fdb46SRobert Mustacchi /* 0x1d DW_DLA_RANGES */
299*4d9fdb46SRobert Mustacchi {sizeof(Dwarf_Ranges),MULTIPLY_CT, 0,0 },
300*4d9fdb46SRobert Mustacchi
301*4d9fdb46SRobert Mustacchi /* The following DW_DLA data types
302*4d9fdb46SRobert Mustacchi are known only inside libdwarf. */
303*4d9fdb46SRobert Mustacchi
304*4d9fdb46SRobert Mustacchi /* 0x1e DW_DLA_ABBREV_LIST */
305*4d9fdb46SRobert Mustacchi { sizeof(struct Dwarf_Abbrev_List_s),MULTIPLY_NO, 0, 0},
306*4d9fdb46SRobert Mustacchi
307*4d9fdb46SRobert Mustacchi /* 0x1f DW_DLA_CHAIN */
308*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Chain_s),MULTIPLY_NO, 0, 0},
309*4d9fdb46SRobert Mustacchi
310*4d9fdb46SRobert Mustacchi /* 0x20 DW_DLA_CU_CONTEXT */
311*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_CU_Context_s),MULTIPLY_NO, 0, 0},
312*4d9fdb46SRobert Mustacchi
313*4d9fdb46SRobert Mustacchi /* 0x21 DW_DLA_FRAME */
314*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Frame_s),MULTIPLY_NO,
315*4d9fdb46SRobert Mustacchi _dwarf_frame_constructor,
316*4d9fdb46SRobert Mustacchi _dwarf_frame_destructor},
317*4d9fdb46SRobert Mustacchi
318*4d9fdb46SRobert Mustacchi /* 0x22 DW_DLA_GLOBAL_CONTEXT */
319*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
320*4d9fdb46SRobert Mustacchi
321*4d9fdb46SRobert Mustacchi /* 0x23 DW_DLA_FILE_ENTRY */
322*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_File_Entry_s),MULTIPLY_NO, 0, 0},
323*4d9fdb46SRobert Mustacchi
324*4d9fdb46SRobert Mustacchi /* 0x24 DW_DLA_LINE_CONTEXT */
325*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Line_Context_s),MULTIPLY_NO,
326*4d9fdb46SRobert Mustacchi _dwarf_line_context_constructor,
327*4d9fdb46SRobert Mustacchi _dwarf_line_context_destructor},
328*4d9fdb46SRobert Mustacchi
329*4d9fdb46SRobert Mustacchi /* 0x25 DW_DLA_LOC_CHAIN */
330*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Loc_Chain_s),MULTIPLY_NO, 0, 0},
331*4d9fdb46SRobert Mustacchi
332*4d9fdb46SRobert Mustacchi /* 0x26 0x26 DW_DLA_HASH_TABLE */
333*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Hash_Table_s),MULTIPLY_NO, 0, 0},
33449d3bc91SRichard Lowe
335*4d9fdb46SRobert Mustacchi /* The following really use Global struct: used to be unique struct
336*4d9fdb46SRobert Mustacchi per type, but now merged (11/99). The opaque types
337*4d9fdb46SRobert Mustacchi are visible in the interface. The types for
338*4d9fdb46SRobert Mustacchi DW_DLA_FUNC, DW_DLA_TYPENAME, DW_DLA_VAR, DW_DLA_WEAK also use
339*4d9fdb46SRobert Mustacchi the global types. */
340*4d9fdb46SRobert Mustacchi
341*4d9fdb46SRobert Mustacchi /* 0x27 DW_DLA_FUNC_CONTEXT */
342*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
343*4d9fdb46SRobert Mustacchi
344*4d9fdb46SRobert Mustacchi /* 0x28 40 DW_DLA_TYPENAME_CONTEXT */
345*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
346*4d9fdb46SRobert Mustacchi
347*4d9fdb46SRobert Mustacchi /* 0x29 41 DW_DLA_VAR_CONTEXT */
348*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
349*4d9fdb46SRobert Mustacchi
350*4d9fdb46SRobert Mustacchi /* 0x2a 42 DW_DLA_WEAK_CONTEXT */
351*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
352*4d9fdb46SRobert Mustacchi
353*4d9fdb46SRobert Mustacchi /* 0x2b 43 DW_DLA_PUBTYPES_CONTEXT DWARF3 */
354*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Global_Context_s),MULTIPLY_NO, 0, 0},
355*4d9fdb46SRobert Mustacchi
356*4d9fdb46SRobert Mustacchi /* 0x2c 44 DW_DLA_HASH_TABLE_ENTRY */
357*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Hash_Table_Entry_s),MULTIPLY_CT,0,0 },
358*4d9fdb46SRobert Mustacchi
359*4d9fdb46SRobert Mustacchi /* 0x2d -0x34 reserved */
360*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
361*4d9fdb46SRobert Mustacchi
362*4d9fdb46SRobert Mustacchi /* 0x2e 46 reserved for future use */
363*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
364*4d9fdb46SRobert Mustacchi
365*4d9fdb46SRobert Mustacchi /* 0x2f 47 reserved for future use */
366*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
367*4d9fdb46SRobert Mustacchi
368*4d9fdb46SRobert Mustacchi /* 0x30 reserved for future internal use */
369*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
370*4d9fdb46SRobert Mustacchi
371*4d9fdb46SRobert Mustacchi /* 0x31 reserved for future internal use */
372*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
373*4d9fdb46SRobert Mustacchi
374*4d9fdb46SRobert Mustacchi /* 0x32 50 reserved for future internal use */
375*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
376*4d9fdb46SRobert Mustacchi
377*4d9fdb46SRobert Mustacchi /* 0x33 51 reserved for future internal use */
378*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
379*4d9fdb46SRobert Mustacchi
380*4d9fdb46SRobert Mustacchi /* 0x34 52 reserved for future internal use */
381*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
382*4d9fdb46SRobert Mustacchi
383*4d9fdb46SRobert Mustacchi /* 0x35 53 reserved for future use. */
384*4d9fdb46SRobert Mustacchi {sizeof(int),MULTIPLY_NO, 0, 0},
385*4d9fdb46SRobert Mustacchi
386*4d9fdb46SRobert Mustacchi /* 0x36 54 Used starting May 2020 DW_DLA_RNGLISTS_HEAD */
387*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Rnglists_Head_s),MULTIPLY_NO, 0,
388*4d9fdb46SRobert Mustacchi _dwarf_rnglists_head_destructor},
389*4d9fdb46SRobert Mustacchi
390*4d9fdb46SRobert Mustacchi /* now, we have types that are public. */
391*4d9fdb46SRobert Mustacchi /* 0x37 55. New in June 2014. Gdb. */
392*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Gdbindex_s),MULTIPLY_NO, 0, 0},
393*4d9fdb46SRobert Mustacchi
394*4d9fdb46SRobert Mustacchi /* 0x38 56. New in July 2014. */
395*4d9fdb46SRobert Mustacchi /* DWARF5 DebugFission dwp file sections
396*4d9fdb46SRobert Mustacchi .debug_cu_index and .debug_tu_index . */
397*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Xu_Index_Header_s),MULTIPLY_NO, 0, 0},
398*4d9fdb46SRobert Mustacchi
399*4d9fdb46SRobert Mustacchi /* These required by new features in DWARF5. Also usable
400*4d9fdb46SRobert Mustacchi for DWARF2,3,4. */
401*4d9fdb46SRobert Mustacchi /* 0x39 57 DW_DLA_LOC_BLOCK_C DWARF5 */
402*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Loc_Expr_Op_s),MULTIPLY_CT, 0, 0},
403*4d9fdb46SRobert Mustacchi
404*4d9fdb46SRobert Mustacchi /* 0x3a 58 DW_DLA_LOCDESC_C */
405*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Locdesc_c_s),MULTIPLY_CT, 0, 0},
406*4d9fdb46SRobert Mustacchi
407*4d9fdb46SRobert Mustacchi /* 0x3b 59 DW_DLA_LOC_HEAD_C */
408*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Loc_Head_c_s),MULTIPLY_NO, 0, 0},
409*4d9fdb46SRobert Mustacchi
410*4d9fdb46SRobert Mustacchi /* 0x3c 60 DW_DLA_MACRO_CONTEXT */
411*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Macro_Context_s),MULTIPLY_NO,
412*4d9fdb46SRobert Mustacchi _dwarf_macro_constructor,
413*4d9fdb46SRobert Mustacchi _dwarf_macro_destructor},
414*4d9fdb46SRobert Mustacchi
415*4d9fdb46SRobert Mustacchi /* 0x3d 61 DW_DLA_CHAIN_2 */
416*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Chain_o),MULTIPLY_NO, 0, 0},
417*4d9fdb46SRobert Mustacchi
418*4d9fdb46SRobert Mustacchi /* 0x3e 62 DW_DLA_DSC_HEAD */
419*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Dsc_Head_s),MULTIPLY_NO, 0,
420*4d9fdb46SRobert Mustacchi _dwarf_dsc_destructor},
421*4d9fdb46SRobert Mustacchi
422*4d9fdb46SRobert Mustacchi /* 0x3f 63 DW_DLA_DNAMES_HEAD */
423*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Dnames_Head_s),MULTIPLY_NO, 0,
424*4d9fdb46SRobert Mustacchi _dwarf_debugnames_destructor},
425*4d9fdb46SRobert Mustacchi
426*4d9fdb46SRobert Mustacchi /* 0x40 64 DW_DLA_STR_OFFSETS */
427*4d9fdb46SRobert Mustacchi {sizeof(struct Dwarf_Str_Offsets_Table_s),MULTIPLY_NO, 0,0},
428*4d9fdb46SRobert Mustacchi };
429*4d9fdb46SRobert Mustacchi
430*4d9fdb46SRobert Mustacchi /* We are simply using the incoming pointer as the key-pointer.
431*4d9fdb46SRobert Mustacchi */
432*4d9fdb46SRobert Mustacchi
433*4d9fdb46SRobert Mustacchi static DW_TSHASHTYPE
simple_value_hashfunc(const void * keyp)434*4d9fdb46SRobert Mustacchi simple_value_hashfunc(const void *keyp)
435*4d9fdb46SRobert Mustacchi {
436*4d9fdb46SRobert Mustacchi DW_TSHASHTYPE up = (DW_TSHASHTYPE)(uintptr_t)keyp;
437*4d9fdb46SRobert Mustacchi return up;
438*4d9fdb46SRobert Mustacchi }
439*4d9fdb46SRobert Mustacchi /* We did alloc something but not a fixed-length thing.
440*4d9fdb46SRobert Mustacchi Instead, it starts with some special data we noted.
441*4d9fdb46SRobert Mustacchi The incoming pointer is to the caller data, we
442*4d9fdb46SRobert Mustacchi destruct based on caller, but find the special
443*4d9fdb46SRobert Mustacchi extra data in a prefix area. */
444*4d9fdb46SRobert Mustacchi static void
tdestroy_free_node(void * nodep)445*4d9fdb46SRobert Mustacchi tdestroy_free_node(void *nodep)
446*4d9fdb46SRobert Mustacchi {
447*4d9fdb46SRobert Mustacchi char * m = (char *)nodep;
448*4d9fdb46SRobert Mustacchi char * malloc_addr = m - DW_RESERVE;
449*4d9fdb46SRobert Mustacchi struct reserve_data_s * reserve =(struct reserve_data_s *)malloc_addr;
450*4d9fdb46SRobert Mustacchi unsigned type = reserve->rd_type;
451*4d9fdb46SRobert Mustacchi if (type >= ALLOC_AREA_INDEX_TABLE_MAX) {
452*4d9fdb46SRobert Mustacchi /* Internal error, corrupted data. */
453*4d9fdb46SRobert Mustacchi return;
454*4d9fdb46SRobert Mustacchi }
455*4d9fdb46SRobert Mustacchi if(!reserve->rd_dbg) {
456*4d9fdb46SRobert Mustacchi /* Unused (corrupted?) node in the tree.
457*4d9fdb46SRobert Mustacchi Should never happen. */
458*4d9fdb46SRobert Mustacchi return;
459*4d9fdb46SRobert Mustacchi }
460*4d9fdb46SRobert Mustacchi if(!reserve->rd_type) {
461*4d9fdb46SRobert Mustacchi /* Unused (corrupted?) node in the tree.
462*4d9fdb46SRobert Mustacchi Should never happen. */
463*4d9fdb46SRobert Mustacchi return;
464*4d9fdb46SRobert Mustacchi }
465*4d9fdb46SRobert Mustacchi if (alloc_instance_basics[type].specialdestructor) {
466*4d9fdb46SRobert Mustacchi alloc_instance_basics[type].specialdestructor(m);
467*4d9fdb46SRobert Mustacchi }
468*4d9fdb46SRobert Mustacchi free(malloc_addr);
46949d3bc91SRichard Lowe }
47049d3bc91SRichard Lowe
471*4d9fdb46SRobert Mustacchi /* The sort of hash table entries result in very simple helper functions. */
472*4d9fdb46SRobert Mustacchi static int
simple_compare_function(const void * l,const void * r)473*4d9fdb46SRobert Mustacchi simple_compare_function(const void *l, const void *r)
474*4d9fdb46SRobert Mustacchi {
475*4d9fdb46SRobert Mustacchi DW_TSHASHTYPE lp = (DW_TSHASHTYPE)(uintptr_t)l;
476*4d9fdb46SRobert Mustacchi DW_TSHASHTYPE rp = (DW_TSHASHTYPE)(uintptr_t)r;
477*4d9fdb46SRobert Mustacchi if(lp < rp) {
478*4d9fdb46SRobert Mustacchi return -1;
479*4d9fdb46SRobert Mustacchi }
480*4d9fdb46SRobert Mustacchi if(lp > rp) {
481*4d9fdb46SRobert Mustacchi return 1;
482*4d9fdb46SRobert Mustacchi }
483*4d9fdb46SRobert Mustacchi return 0;
484*4d9fdb46SRobert Mustacchi }
48549d3bc91SRichard Lowe
486*4d9fdb46SRobert Mustacchi /* This function returns a pointer to a region
48749d3bc91SRichard Lowe of memory. For alloc_types that are not
48849d3bc91SRichard Lowe strings or lists of pointers, only 1 struct
48949d3bc91SRichard Lowe can be requested at a time. This is indicated
490*4d9fdb46SRobert Mustacchi by an input count of 1. For strings, count
49149d3bc91SRichard Lowe equals the length of the string it will
49249d3bc91SRichard Lowe contain, i.e it the length of the string
49349d3bc91SRichard Lowe plus 1 for the terminating null. For lists
49449d3bc91SRichard Lowe of pointers, count is equal to the number of
495*4d9fdb46SRobert Mustacchi pointers. For DW_DLA_FRAME_BLOCK, DW_DLA_RANGES, and
49649d3bc91SRichard Lowe DW_DLA_LOC_BLOCK allocation types also, count
49749d3bc91SRichard Lowe is the count of the number of structs needed.
49849d3bc91SRichard Lowe
499*4d9fdb46SRobert Mustacchi This function cannot be used to allocate a
500*4d9fdb46SRobert Mustacchi Dwarf_Debug_s struct. */
50107dc1947SRichard Lowe
502*4d9fdb46SRobert Mustacchi char *
_dwarf_get_alloc(Dwarf_Debug dbg,Dwarf_Small alloc_type,Dwarf_Unsigned count)50349d3bc91SRichard Lowe _dwarf_get_alloc(Dwarf_Debug dbg,
504*4d9fdb46SRobert Mustacchi Dwarf_Small alloc_type, Dwarf_Unsigned count)
50549d3bc91SRichard Lowe {
506*4d9fdb46SRobert Mustacchi char * alloc_mem = 0;
507*4d9fdb46SRobert Mustacchi Dwarf_Signed basesize = 0;
50849d3bc91SRichard Lowe Dwarf_Signed size = 0;
50949d3bc91SRichard Lowe unsigned int type = alloc_type;
510*4d9fdb46SRobert Mustacchi short action = 0;
51149d3bc91SRichard Lowe
51249d3bc91SRichard Lowe if (dbg == NULL) {
513*4d9fdb46SRobert Mustacchi return NULL;
51449d3bc91SRichard Lowe }
51549d3bc91SRichard Lowe if (type >= ALLOC_AREA_INDEX_TABLE_MAX) {
51607dc1947SRichard Lowe /* internal error */
51707dc1947SRichard Lowe return NULL;
51849d3bc91SRichard Lowe }
519*4d9fdb46SRobert Mustacchi basesize = alloc_instance_basics[alloc_type].ia_struct_size;
520*4d9fdb46SRobert Mustacchi action = alloc_instance_basics[alloc_type].ia_multiply_count;
521*4d9fdb46SRobert Mustacchi if(action == MULTIPLY_NO) {
522*4d9fdb46SRobert Mustacchi /* Usually count is 1, but do not assume it. */
523*4d9fdb46SRobert Mustacchi size = basesize;
524*4d9fdb46SRobert Mustacchi } else if (action == MULTIPLY_CT) {
525*4d9fdb46SRobert Mustacchi size = basesize * count;
526*4d9fdb46SRobert Mustacchi } else {
527*4d9fdb46SRobert Mustacchi /* MULTIPLY_SP */
528*4d9fdb46SRobert Mustacchi /* DW_DLA_ADDR.. count * largest size */
529*4d9fdb46SRobert Mustacchi size = count *
530*4d9fdb46SRobert Mustacchi (sizeof(Dwarf_Addr) > sizeof(Dwarf_Off) ?
531*4d9fdb46SRobert Mustacchi sizeof(Dwarf_Addr) : sizeof(Dwarf_Off));
532*4d9fdb46SRobert Mustacchi }
533*4d9fdb46SRobert Mustacchi size += DW_RESERVE;
534*4d9fdb46SRobert Mustacchi alloc_mem = malloc(size);
535*4d9fdb46SRobert Mustacchi if (!alloc_mem) {
536*4d9fdb46SRobert Mustacchi return NULL;
537*4d9fdb46SRobert Mustacchi }
538*4d9fdb46SRobert Mustacchi {
539*4d9fdb46SRobert Mustacchi char * ret_mem = alloc_mem + DW_RESERVE;
540*4d9fdb46SRobert Mustacchi void *key = ret_mem;
541*4d9fdb46SRobert Mustacchi struct reserve_data_s *r = (struct reserve_data_s*)alloc_mem;
542*4d9fdb46SRobert Mustacchi void *result = 0;
543*4d9fdb46SRobert Mustacchi
544*4d9fdb46SRobert Mustacchi memset(alloc_mem, 0, size);
545*4d9fdb46SRobert Mustacchi /* We are not actually using rd_dbg, we are using rd_type. */
546*4d9fdb46SRobert Mustacchi r->rd_dbg = dbg;
547*4d9fdb46SRobert Mustacchi r->rd_type = alloc_type;
548*4d9fdb46SRobert Mustacchi r->rd_length = size;
549*4d9fdb46SRobert Mustacchi if (alloc_instance_basics[type].specialconstructor) {
550*4d9fdb46SRobert Mustacchi int res = alloc_instance_basics[type].
551*4d9fdb46SRobert Mustacchi specialconstructor(dbg, ret_mem);
552*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
553*4d9fdb46SRobert Mustacchi /* We leak what we allocated in
554*4d9fdb46SRobert Mustacchi _dwarf_find_memory when
555*4d9fdb46SRobert Mustacchi constructor fails. */
556*4d9fdb46SRobert Mustacchi return NULL;
557*4d9fdb46SRobert Mustacchi }
55807dc1947SRichard Lowe }
559*4d9fdb46SRobert Mustacchi /* See global flag.
560*4d9fdb46SRobert Mustacchi If zero then caller choses not
561*4d9fdb46SRobert Mustacchi to track allocations, so dwarf_finish()
562*4d9fdb46SRobert Mustacchi is unable to free anything the caller
563*4d9fdb46SRobert Mustacchi omitted to dealloc. Normally
564*4d9fdb46SRobert Mustacchi the global flag is non-zero */
565*4d9fdb46SRobert Mustacchi #ifdef HAVE_GLOBAL_ALLOC_SUMS
566*4d9fdb46SRobert Mustacchi global_allocation_count++;
567*4d9fdb46SRobert Mustacchi global_allocation_total += size;
568*4d9fdb46SRobert Mustacchi #endif /* HAVE_GLOBAL_ALLOC_SUMS */
569*4d9fdb46SRobert Mustacchi
570*4d9fdb46SRobert Mustacchi /* As of March 14, 2020 it's
571*4d9fdb46SRobert Mustacchi not necessary to test for alloc type, but instead
572*4d9fdb46SRobert Mustacchi only call tsearch if de_alloc_tree_on. */
573*4d9fdb46SRobert Mustacchi if (global_de_alloc_tree_on) {
574*4d9fdb46SRobert Mustacchi #ifdef HAVE_GLOBAL_ALLOC_SUMS
575*4d9fdb46SRobert Mustacchi global_de_alloc_tree_total += size;
576*4d9fdb46SRobert Mustacchi global_de_alloc_tree_count++;
577*4d9fdb46SRobert Mustacchi #endif /* HAVE_GLOBAL_ALLOC_SUMS */
578*4d9fdb46SRobert Mustacchi result = dwarf_tsearch((void *)key,
579*4d9fdb46SRobert Mustacchi &dbg->de_alloc_tree,simple_compare_function);
580*4d9fdb46SRobert Mustacchi if(!result) {
581*4d9fdb46SRobert Mustacchi /* Something badly wrong. Out of memory.
582*4d9fdb46SRobert Mustacchi pretend all is well. */
58307dc1947SRichard Lowe }
584*4d9fdb46SRobert Mustacchi }
585*4d9fdb46SRobert Mustacchi #if DEBUG
586*4d9fdb46SRobert Mustacchi printf("libdwarfdetector ALLOC ret 0x%lx type 0x%x size %lu line %d %s\n",(unsigned long)ret_mem,(unsigned)alloc_type,(unsigned long)size,__LINE__,__FILE__);
58749d3bc91SRichard Lowe #endif
588*4d9fdb46SRobert Mustacchi return (ret_mem);
589*4d9fdb46SRobert Mustacchi }
590*4d9fdb46SRobert Mustacchi }
59149d3bc91SRichard Lowe
592*4d9fdb46SRobert Mustacchi /* This was once a long list of tests using dss_data
593*4d9fdb46SRobert Mustacchi and dss_size to see if 'space' was inside a debug section.
594*4d9fdb46SRobert Mustacchi This tfind approach removes that maintenance headache. */
595*4d9fdb46SRobert Mustacchi static int
string_is_in_debug_section(Dwarf_Debug dbg,void * space)596*4d9fdb46SRobert Mustacchi string_is_in_debug_section(Dwarf_Debug dbg,void * space)
597*4d9fdb46SRobert Mustacchi {
598*4d9fdb46SRobert Mustacchi /* See dwarf_line.c dwarf_srcfiles()
599*4d9fdb46SRobert Mustacchi for one way we can wind up with
600*4d9fdb46SRobert Mustacchi a DW_DLA_STRING string that may or may not be malloc-ed
601*4d9fdb46SRobert Mustacchi by _dwarf_get_alloc().
602*4d9fdb46SRobert Mustacchi
603*4d9fdb46SRobert Mustacchi dwarf_formstring(), for example, returns strings
604*4d9fdb46SRobert Mustacchi which point into .debug_info or .debug_types but
605*4d9fdb46SRobert Mustacchi dwarf_dealloc is never supposed to be applied
606*4d9fdb46SRobert Mustacchi to strings dwarf_formstring() returns!
607*4d9fdb46SRobert Mustacchi
608*4d9fdb46SRobert Mustacchi Lots of calls returning strings
609*4d9fdb46SRobert Mustacchi have always been documented as requiring
610*4d9fdb46SRobert Mustacchi dwarf_dealloc(...DW_DLA_STRING) when the code
611*4d9fdb46SRobert Mustacchi just returns a pointer to a portion of a loaded section!
612*4d9fdb46SRobert Mustacchi It is too late to change the documentation. */
613*4d9fdb46SRobert Mustacchi
614*4d9fdb46SRobert Mustacchi void *result = 0;
615*4d9fdb46SRobert Mustacchi result = dwarf_tfind((void *)space,
616*4d9fdb46SRobert Mustacchi &dbg->de_alloc_tree,simple_compare_function);
617*4d9fdb46SRobert Mustacchi if(!result) {
618*4d9fdb46SRobert Mustacchi /* Not in the tree, so not malloc-ed
619*4d9fdb46SRobert Mustacchi Nothing to delete. */
620*4d9fdb46SRobert Mustacchi return TRUE;
621*4d9fdb46SRobert Mustacchi }
622*4d9fdb46SRobert Mustacchi /* We found the address in the tree, so it is NOT
623*4d9fdb46SRobert Mustacchi part of .debug_info or any other dwarf section,
624*4d9fdb46SRobert Mustacchi but is space malloc-d in _dwarf_get_alloc(). */
625*4d9fdb46SRobert Mustacchi return FALSE;
626*4d9fdb46SRobert Mustacchi }
627*4d9fdb46SRobert Mustacchi
628*4d9fdb46SRobert Mustacchi
629*4d9fdb46SRobert Mustacchi /* These wrappers for dwarf_dealloc enable type-checking
630*4d9fdb46SRobert Mustacchi at call points. */
631*4d9fdb46SRobert Mustacchi void
dwarf_dealloc_error(Dwarf_Debug dbg,Dwarf_Error err)632*4d9fdb46SRobert Mustacchi dwarf_dealloc_error(Dwarf_Debug dbg, Dwarf_Error err)
633*4d9fdb46SRobert Mustacchi {
634*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,err,DW_DLA_ERROR);
635*4d9fdb46SRobert Mustacchi }
636*4d9fdb46SRobert Mustacchi void
dwarf_dealloc_die(Dwarf_Die die)637*4d9fdb46SRobert Mustacchi dwarf_dealloc_die( Dwarf_Die die)
638*4d9fdb46SRobert Mustacchi {
639*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
640*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context = 0;
641*4d9fdb46SRobert Mustacchi
642*4d9fdb46SRobert Mustacchi if (!die) {
64349d3bc91SRichard Lowe #ifdef DEBUG
644*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, die NULL line %d %s\n",
645*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
646*4d9fdb46SRobert Mustacchi fflush(stdout);
64749d3bc91SRichard Lowe #endif
648*4d9fdb46SRobert Mustacchi return;
64949d3bc91SRichard Lowe }
650*4d9fdb46SRobert Mustacchi context = die->di_cu_context;
651*4d9fdb46SRobert Mustacchi if (!context) {
652*4d9fdb46SRobert Mustacchi #ifdef DEBUG
653*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, context NULL line %d %s\n",
654*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
655*4d9fdb46SRobert Mustacchi fflush(stdout);
65649d3bc91SRichard Lowe #endif
657*4d9fdb46SRobert Mustacchi return;
65807dc1947SRichard Lowe }
659*4d9fdb46SRobert Mustacchi dbg = context->cc_dbg;
660*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,die,DW_DLA_DIE);
66149d3bc91SRichard Lowe }
66249d3bc91SRichard Lowe
66349d3bc91SRichard Lowe
664*4d9fdb46SRobert Mustacchi void
dwarf_dealloc_attribute(Dwarf_Attribute attr)665*4d9fdb46SRobert Mustacchi dwarf_dealloc_attribute(Dwarf_Attribute attr)
666*4d9fdb46SRobert Mustacchi {
667*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
66807dc1947SRichard Lowe
669*4d9fdb46SRobert Mustacchi if (!attr) {
670*4d9fdb46SRobert Mustacchi #ifdef DEBUG
671*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, attr is NULL line %d %s\n",
672*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
673*4d9fdb46SRobert Mustacchi fflush(stdout);
674*4d9fdb46SRobert Mustacchi #endif
675*4d9fdb46SRobert Mustacchi return;
676*4d9fdb46SRobert Mustacchi }
677*4d9fdb46SRobert Mustacchi dbg = attr->ar_dbg;
678*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,attr,DW_DLA_ATTR);
679*4d9fdb46SRobert Mustacchi }
68049d3bc91SRichard Lowe /*
68149d3bc91SRichard Lowe This function is used to deallocate a region of memory
68249d3bc91SRichard Lowe that was obtained by a call to _dwarf_get_alloc. Note
683*4d9fdb46SRobert Mustacchi that though dwarf_dealloc() is a public function,
684*4d9fdb46SRobert Mustacchi _dwarf_get_alloc() isn't.
68549d3bc91SRichard Lowe
68649d3bc91SRichard Lowe For lists, typically arrays of pointers, it is assumed
68749d3bc91SRichard Lowe that the space was allocated by a direct call to malloc,
68849d3bc91SRichard Lowe and so a straight free() is done. This is also the case
68949d3bc91SRichard Lowe for variable length blocks such as DW_DLA_FRAME_BLOCK
69007dc1947SRichard Lowe and DW_DLA_LOC_BLOCK and DW_DLA_RANGES.
69149d3bc91SRichard Lowe
692*4d9fdb46SRobert Mustacchi For strings, the pointer might point to a string in
69349d3bc91SRichard Lowe .debug_info or .debug_string. After this is checked,
69449d3bc91SRichard Lowe and if found not to be the case, a free() is done,
69549d3bc91SRichard Lowe again on the assumption that a malloc was used to
69649d3bc91SRichard Lowe obtain the space.
69749d3bc91SRichard Lowe
69849d3bc91SRichard Lowe This function does not return anything.
699*4d9fdb46SRobert Mustacchi The _dwarf_error_destructor() will be called
700*4d9fdb46SRobert Mustacchi to free the er_msg string
701*4d9fdb46SRobert Mustacchi (if this is a Dwarf_Error) just before the
702*4d9fdb46SRobert Mustacchi Dwarf_Error is freed here. See...specialdestructor()
703*4d9fdb46SRobert Mustacchi below.
704*4d9fdb46SRobert Mustacchi
70549d3bc91SRichard Lowe */
70649d3bc91SRichard Lowe void
dwarf_dealloc(Dwarf_Debug dbg,Dwarf_Ptr space,Dwarf_Unsigned alloc_type)70749d3bc91SRichard Lowe dwarf_dealloc(Dwarf_Debug dbg,
708*4d9fdb46SRobert Mustacchi Dwarf_Ptr space, Dwarf_Unsigned alloc_type)
70949d3bc91SRichard Lowe {
710*4d9fdb46SRobert Mustacchi unsigned int type = 0;
711*4d9fdb46SRobert Mustacchi char * malloc_addr = 0;
712*4d9fdb46SRobert Mustacchi struct reserve_data_s * r = 0;
71349d3bc91SRichard Lowe
714*4d9fdb46SRobert Mustacchi if (!space) {
715*4d9fdb46SRobert Mustacchi #ifdef DEBUG
716*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, space NULL line %d %s\n",
717*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
718*4d9fdb46SRobert Mustacchi fflush(stdout);
719*4d9fdb46SRobert Mustacchi abort();
720*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
72107dc1947SRichard Lowe return;
72249d3bc91SRichard Lowe }
723*4d9fdb46SRobert Mustacchi if (!dbg) {
724*4d9fdb46SRobert Mustacchi /* App error, or an app that failed to succeed in a
725*4d9fdb46SRobert Mustacchi dwarf_init() call. */
726*4d9fdb46SRobert Mustacchi #ifdef DEBUG
727*4d9fdb46SRobert Mustacchi printf( "DEALLOC does nothing, dbg NULL line %d %s\n",
728*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
729*4d9fdb46SRobert Mustacchi fflush(stdout);
730*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
731*4d9fdb46SRobert Mustacchi return;
732*4d9fdb46SRobert Mustacchi }
733*4d9fdb46SRobert Mustacchi if (dbg->de_alloc_tree) {
734*4d9fdb46SRobert Mustacchi /* If it's a string in debug_info etc doing
735*4d9fdb46SRobert Mustacchi (char *)space - DW_RESERVE is totally bogus. */
736*4d9fdb46SRobert Mustacchi if (alloc_type == DW_DLA_STRING &&
737*4d9fdb46SRobert Mustacchi string_is_in_debug_section(dbg,space)) {
738*4d9fdb46SRobert Mustacchi /* A string pointer may point into .debug_info or
739*4d9fdb46SRobert Mustacchi .debug_string etc.
740*4d9fdb46SRobert Mustacchi So must not be freed. And strings have
741*4d9fdb46SRobert Mustacchi no need of a specialdestructor().
742*4d9fdb46SRobert Mustacchi Mostly a historical mistake here.
743*4d9fdb46SRobert Mustacchi Corrected in libdwarf March 14,2020. */
74407dc1947SRichard Lowe return;
74507dc1947SRichard Lowe }
74649d3bc91SRichard Lowe }
747*4d9fdb46SRobert Mustacchi /* Otherwise it might be allocated string so it is ok
748*4d9fdb46SRobert Mustacchi do the (char *)space - DW_RESERVE */
749*4d9fdb46SRobert Mustacchi
750*4d9fdb46SRobert Mustacchi /* If it's a DW_DLA_STRING case and erroneous
751*4d9fdb46SRobert Mustacchi the following pointer operations might
752*4d9fdb46SRobert Mustacchi result in a coredump if the pointer
753*4d9fdb46SRobert Mustacchi is to the beginning of a string section.
754*4d9fdb46SRobert Mustacchi If not DW_DLA_STRING
755*4d9fdb46SRobert Mustacchi no correctly written caller could coredump
756*4d9fdb46SRobert Mustacchi here. */
757*4d9fdb46SRobert Mustacchi malloc_addr = (char *)space - DW_RESERVE;
758*4d9fdb46SRobert Mustacchi r =(struct reserve_data_s *)malloc_addr;
759*4d9fdb46SRobert Mustacchi if(dbg != r->rd_dbg) {
760*4d9fdb46SRobert Mustacchi /* Something is mixed up. */
761*4d9fdb46SRobert Mustacchi #ifdef DEBUG
762*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, dbg 0x%lx rd_dbg 0x%lx space 0x%lx line %d %s\n",
763*4d9fdb46SRobert Mustacchi (unsigned long)dbg,
764*4d9fdb46SRobert Mustacchi (unsigned long)r->rd_dbg,
765*4d9fdb46SRobert Mustacchi (unsigned long)space,
766*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
767*4d9fdb46SRobert Mustacchi fflush(stdout);
768*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
76907dc1947SRichard Lowe return;
77049d3bc91SRichard Lowe }
771*4d9fdb46SRobert Mustacchi if(alloc_type != r->rd_type) {
772*4d9fdb46SRobert Mustacchi /* Something is mixed up. */
773*4d9fdb46SRobert Mustacchi #ifdef DEBUG
774*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, type 0x%lx rd_type 0x%lx space 0x%lx line %d %s\n",
775*4d9fdb46SRobert Mustacchi (unsigned long)alloc_type,
776*4d9fdb46SRobert Mustacchi (unsigned long)r->rd_type,
777*4d9fdb46SRobert Mustacchi (unsigned long)space,
778*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
779*4d9fdb46SRobert Mustacchi fflush(stdout);
780*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
78107dc1947SRichard Lowe return;
78249d3bc91SRichard Lowe }
783*4d9fdb46SRobert Mustacchi if (alloc_type == DW_DLA_ERROR) {
784*4d9fdb46SRobert Mustacchi Dwarf_Error ep = (Dwarf_Error)space;
785*4d9fdb46SRobert Mustacchi
786*4d9fdb46SRobert Mustacchi if (ep->er_static_alloc == DE_STATIC) {
787*4d9fdb46SRobert Mustacchi /* This is special, malloc arena
788*4d9fdb46SRobert Mustacchi was exhausted or a NULL dbg
789*4d9fdb46SRobert Mustacchi was used for the error because the real
790*4d9fdb46SRobert Mustacchi dbg was unavailable.
791*4d9fdb46SRobert Mustacchi There is nothing to delete, really.
792*4d9fdb46SRobert Mustacchi Set er_errval to signal that the
793*4d9fdb46SRobert Mustacchi space was dealloc'd.
794*4d9fdb46SRobert Mustacchi Not dealing with destructor here. */
795*4d9fdb46SRobert Mustacchi _dwarf_failsafe_error.er_errval =
796*4d9fdb46SRobert Mustacchi DW_DLE_FAILSAFE_ERRVAL;
797*4d9fdb46SRobert Mustacchi #ifdef DEBUG
798*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, DE_STATIC line %d %s\n",
799*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
800*4d9fdb46SRobert Mustacchi fflush(stdout);
801*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
80207dc1947SRichard Lowe return;
80307dc1947SRichard Lowe }
804*4d9fdb46SRobert Mustacchi if (ep->er_static_alloc == DE_MALLOC) {
805*4d9fdb46SRobert Mustacchi /* This is special, we had no arena
806*4d9fdb46SRobert Mustacchi so just malloc'd a Dwarf_Error_s.
807*4d9fdb46SRobert Mustacchi Not dealing with destructor here. */
80807dc1947SRichard Lowe free(space);
80907dc1947SRichard Lowe return;
81007dc1947SRichard Lowe }
811*4d9fdb46SRobert Mustacchi /* Was normal alloc, use normal dealloc. */
812*4d9fdb46SRobert Mustacchi /* DW_DLA_ERROR has a specialdestructor */
81349d3bc91SRichard Lowe }
814*4d9fdb46SRobert Mustacchi type = alloc_type;
815*4d9fdb46SRobert Mustacchi #if DEBUG
816*4d9fdb46SRobert Mustacchi if(dbg != r->rd_dbg) {
817*4d9fdb46SRobert Mustacchi /* Something is badly wrong. Better to leak than
818*4d9fdb46SRobert Mustacchi to crash. */
819*4d9fdb46SRobert Mustacchi return;
82007dc1947SRichard Lowe }
82149d3bc91SRichard Lowe #endif
822*4d9fdb46SRobert Mustacchi #if DEBUG
823*4d9fdb46SRobert Mustacchi printf("libdwarfdetector DEALLOC ret 0x%lx type 0x%x size %lu line %d %s\n",(unsigned long)space,(unsigned)type,(unsigned long)r->rd_length,__LINE__,__FILE__);
824*4d9fdb46SRobert Mustacchi #endif
825*4d9fdb46SRobert Mustacchi if (type >= ALLOC_AREA_INDEX_TABLE_MAX) {
826*4d9fdb46SRobert Mustacchi /* internal or user app error */
827*4d9fdb46SRobert Mustacchi #ifdef DEBUG
828*4d9fdb46SRobert Mustacchi printf("DEALLOC does nothing, type too big %lu line %d %s\n",
829*4d9fdb46SRobert Mustacchi (unsigned long)type,
830*4d9fdb46SRobert Mustacchi __LINE__,__FILE__);
831*4d9fdb46SRobert Mustacchi #endif /* DEBUG*/
83207dc1947SRichard Lowe return;
83349d3bc91SRichard Lowe }
834*4d9fdb46SRobert Mustacchi #ifdef HAVE_GLOBAL_ALLOC_SUMS
835*4d9fdb46SRobert Mustacchi global_de_alloc_tree_early_dealloc_count++;
836*4d9fdb46SRobert Mustacchi global_de_alloc_tree_early_dealloc_size += r->rd_length;
837*4d9fdb46SRobert Mustacchi #endif /* HAVE_GLOBAL_ALLOC_SUMS */
838*4d9fdb46SRobert Mustacchi if (alloc_instance_basics[type].specialdestructor) {
839*4d9fdb46SRobert Mustacchi alloc_instance_basics[type].specialdestructor(space);
84049d3bc91SRichard Lowe }
841*4d9fdb46SRobert Mustacchi if (dbg->de_alloc_tree) {
842*4d9fdb46SRobert Mustacchi /* The 'space' pointer we get points after the
843*4d9fdb46SRobert Mustacchi reserve space. The key is 'space'
844*4d9fdb46SRobert Mustacchi and address to free
845*4d9fdb46SRobert Mustacchi is just a few bytes before 'space'. */
846*4d9fdb46SRobert Mustacchi void *key = space;
847*4d9fdb46SRobert Mustacchi
848*4d9fdb46SRobert Mustacchi dwarf_tdelete(key,&dbg->de_alloc_tree,
849*4d9fdb46SRobert Mustacchi simple_compare_function);
850*4d9fdb46SRobert Mustacchi /* If dwarf_tdelete returns NULL it might mean
851*4d9fdb46SRobert Mustacchi a) tree is empty.
852*4d9fdb46SRobert Mustacchi b) If hashsearch, then a single chain might
853*4d9fdb46SRobert Mustacchi now be empty,
854*4d9fdb46SRobert Mustacchi so we do not know of a 'parent node'.
855*4d9fdb46SRobert Mustacchi c) We did not find that key, we did nothing.
856*4d9fdb46SRobert Mustacchi
857*4d9fdb46SRobert Mustacchi In any case, we simply don't worry about it.
858*4d9fdb46SRobert Mustacchi Not Supposed To Happen. */
85949d3bc91SRichard Lowe }
860*4d9fdb46SRobert Mustacchi r->rd_dbg = (void *)0xfeadbeef;
861*4d9fdb46SRobert Mustacchi r->rd_length = 0;
862*4d9fdb46SRobert Mustacchi r->rd_type = 0;
863*4d9fdb46SRobert Mustacchi free(malloc_addr);
864*4d9fdb46SRobert Mustacchi return;
86549d3bc91SRichard Lowe }
86649d3bc91SRichard Lowe
86749d3bc91SRichard Lowe /*
86849d3bc91SRichard Lowe Allocates space for a Dwarf_Debug_s struct,
86949d3bc91SRichard Lowe since one does not exist.
87049d3bc91SRichard Lowe */
87149d3bc91SRichard Lowe Dwarf_Debug
_dwarf_get_debug(void)872*4d9fdb46SRobert Mustacchi _dwarf_get_debug(void)
87349d3bc91SRichard Lowe {
87449d3bc91SRichard Lowe Dwarf_Debug dbg;
87549d3bc91SRichard Lowe
87649d3bc91SRichard Lowe dbg = (Dwarf_Debug) malloc(sizeof(struct Dwarf_Debug_s));
877*4d9fdb46SRobert Mustacchi if (dbg == NULL) {
87807dc1947SRichard Lowe return (NULL);
879*4d9fdb46SRobert Mustacchi }
880*4d9fdb46SRobert Mustacchi memset(dbg, 0, sizeof(struct Dwarf_Debug_s));
881*4d9fdb46SRobert Mustacchi /* Set up for a dwarf_tsearch hash table */
882*4d9fdb46SRobert Mustacchi
883*4d9fdb46SRobert Mustacchi /* Leaving initialization on so we can track
884*4d9fdb46SRobert Mustacchi DW_DLA_STRING even when global_de_alloc_tree_on
885*4d9fdb46SRobert Mustacchi is zero. */
886*4d9fdb46SRobert Mustacchi if (global_de_alloc_tree_on) {
887*4d9fdb46SRobert Mustacchi dwarf_initialize_search_hash(&dbg->de_alloc_tree,
888*4d9fdb46SRobert Mustacchi simple_value_hashfunc,0);
88949d3bc91SRichard Lowe }
89049d3bc91SRichard Lowe return (dbg);
89149d3bc91SRichard Lowe }
89249d3bc91SRichard Lowe
89349d3bc91SRichard Lowe /*
89449d3bc91SRichard Lowe This function prints out the statistics
89549d3bc91SRichard Lowe collected on allocation of memory chunks.
896*4d9fdb46SRobert Mustacchi No longer used.
89749d3bc91SRichard Lowe */
89849d3bc91SRichard Lowe void
dwarf_print_memory_stats(UNUSEDARG Dwarf_Debug dbg)899*4d9fdb46SRobert Mustacchi dwarf_print_memory_stats(UNUSEDARG Dwarf_Debug dbg)
90049d3bc91SRichard Lowe {
90149d3bc91SRichard Lowe }
90249d3bc91SRichard Lowe
90349d3bc91SRichard Lowe
90449d3bc91SRichard Lowe
90507dc1947SRichard Lowe /* In the 'rela' relocation case we might have malloc'd
90607dc1947SRichard Lowe space to ensure it is read-write. In that case, free the space. */
907*4d9fdb46SRobert Mustacchi static void
rela_free(struct Dwarf_Section_s * sec)90807dc1947SRichard Lowe rela_free(struct Dwarf_Section_s * sec)
90907dc1947SRichard Lowe {
91007dc1947SRichard Lowe if (sec->dss_data_was_malloc) {
91107dc1947SRichard Lowe free(sec->dss_data);
91207dc1947SRichard Lowe }
91307dc1947SRichard Lowe sec->dss_data = 0;
91407dc1947SRichard Lowe sec->dss_data_was_malloc = 0;
91507dc1947SRichard Lowe }
91607dc1947SRichard Lowe
917*4d9fdb46SRobert Mustacchi static void
freecontextlist(Dwarf_Debug dbg,Dwarf_Debug_InfoTypes dis)918*4d9fdb46SRobert Mustacchi freecontextlist(Dwarf_Debug dbg, Dwarf_Debug_InfoTypes dis)
919*4d9fdb46SRobert Mustacchi {
920*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context = 0;
921*4d9fdb46SRobert Mustacchi Dwarf_CU_Context nextcontext = 0;
922*4d9fdb46SRobert Mustacchi for (context = dis->de_cu_context_list;
923*4d9fdb46SRobert Mustacchi context; context = nextcontext) {
924*4d9fdb46SRobert Mustacchi Dwarf_Hash_Table hash_table = context->cc_abbrev_hash_table;
925*4d9fdb46SRobert Mustacchi _dwarf_free_abbrev_hash_table_contents(dbg,hash_table);
926*4d9fdb46SRobert Mustacchi hash_table->tb_entries = 0;
927*4d9fdb46SRobert Mustacchi nextcontext = context->cc_next;
928*4d9fdb46SRobert Mustacchi context->cc_next = 0;
929*4d9fdb46SRobert Mustacchi /* See also local_dealloc_cu_context() in
930*4d9fdb46SRobert Mustacchi dwarf_die_deliv.c */
931*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, hash_table, DW_DLA_HASH_TABLE);
932*4d9fdb46SRobert Mustacchi context->cc_abbrev_hash_table = 0;
933*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, context, DW_DLA_CU_CONTEXT);
934*4d9fdb46SRobert Mustacchi }
935*4d9fdb46SRobert Mustacchi dis->de_cu_context_list = 0;
936*4d9fdb46SRobert Mustacchi }
937*4d9fdb46SRobert Mustacchi
93849d3bc91SRichard Lowe /*
93949d3bc91SRichard Lowe Used to free all space allocated for this Dwarf_Debug.
940*4d9fdb46SRobert Mustacchi The caller should assume that the Dwarf_Debug pointer
94149d3bc91SRichard Lowe itself is no longer valid upon return from this function.
94249d3bc91SRichard Lowe
94349d3bc91SRichard Lowe In case of difficulty, this function simply returns quietly.
94449d3bc91SRichard Lowe */
94549d3bc91SRichard Lowe int
_dwarf_free_all_of_one_debug(Dwarf_Debug dbg)94649d3bc91SRichard Lowe _dwarf_free_all_of_one_debug(Dwarf_Debug dbg)
94749d3bc91SRichard Lowe {
948*4d9fdb46SRobert Mustacchi unsigned g = 0;
94949d3bc91SRichard Lowe
950*4d9fdb46SRobert Mustacchi if (dbg == NULL) {
95107dc1947SRichard Lowe return (DW_DLV_ERROR);
95207dc1947SRichard Lowe }
953*4d9fdb46SRobert Mustacchi /* To do complete validation that we have no surprising
954*4d9fdb46SRobert Mustacchi missing or erroneous deallocs it is advisable to do
955*4d9fdb46SRobert Mustacchi the dwarf_deallocs here
956*4d9fdb46SRobert Mustacchi that are not things the user can otherwise request.
957*4d9fdb46SRobert Mustacchi Housecleaning. */
958*4d9fdb46SRobert Mustacchi if (dbg->de_cu_hashindex_data) {
959*4d9fdb46SRobert Mustacchi dwarf_xu_header_free(dbg->de_cu_hashindex_data);
960*4d9fdb46SRobert Mustacchi dbg->de_cu_hashindex_data = 0;
96149d3bc91SRichard Lowe }
962*4d9fdb46SRobert Mustacchi if (dbg->de_tu_hashindex_data) {
963*4d9fdb46SRobert Mustacchi dwarf_xu_header_free(dbg->de_tu_hashindex_data);
964*4d9fdb46SRobert Mustacchi dbg->de_tu_hashindex_data = 0;
965*4d9fdb46SRobert Mustacchi }
966*4d9fdb46SRobert Mustacchi if( dbg->de_printf_callback_null_device_handle) {
967*4d9fdb46SRobert Mustacchi fclose(dbg->de_printf_callback_null_device_handle);
968*4d9fdb46SRobert Mustacchi dbg->de_printf_callback_null_device_handle = 0;
96949d3bc91SRichard Lowe }
970*4d9fdb46SRobert Mustacchi freecontextlist(dbg,&dbg->de_info_reading);
971*4d9fdb46SRobert Mustacchi freecontextlist(dbg,&dbg->de_types_reading);
97249d3bc91SRichard Lowe
973*4d9fdb46SRobert Mustacchi /* Housecleaning done. Now really free all the space. */
97407dc1947SRichard Lowe rela_free(&dbg->de_debug_info);
975*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_types);
97607dc1947SRichard Lowe rela_free(&dbg->de_debug_abbrev);
97707dc1947SRichard Lowe rela_free(&dbg->de_debug_line);
978*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_line_str);
97907dc1947SRichard Lowe rela_free(&dbg->de_debug_loc);
98007dc1947SRichard Lowe rela_free(&dbg->de_debug_aranges);
98107dc1947SRichard Lowe rela_free(&dbg->de_debug_macinfo);
982*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_macro);
983*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_names);
98407dc1947SRichard Lowe rela_free(&dbg->de_debug_pubnames);
98507dc1947SRichard Lowe rela_free(&dbg->de_debug_str);
986*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_sup);
98707dc1947SRichard Lowe rela_free(&dbg->de_debug_frame);
98807dc1947SRichard Lowe rela_free(&dbg->de_debug_frame_eh_gnu);
98907dc1947SRichard Lowe rela_free(&dbg->de_debug_pubtypes);
99007dc1947SRichard Lowe rela_free(&dbg->de_debug_funcnames);
99107dc1947SRichard Lowe rela_free(&dbg->de_debug_typenames);
99207dc1947SRichard Lowe rela_free(&dbg->de_debug_varnames);
99307dc1947SRichard Lowe rela_free(&dbg->de_debug_weaknames);
99407dc1947SRichard Lowe rela_free(&dbg->de_debug_ranges);
995*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_str_offsets);
996*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_addr);
997*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_gdbindex);
998*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_cu_index);
999*4d9fdb46SRobert Mustacchi rela_free(&dbg->de_debug_tu_index);
100007dc1947SRichard Lowe dwarf_harmless_cleanout(&dbg->de_harmless_errors);
100107dc1947SRichard Lowe
1002*4d9fdb46SRobert Mustacchi _dwarf_dealloc_rnglists_context(dbg);
1003*4d9fdb46SRobert Mustacchi _dwarf_dealloc_loclists_context(dbg);
1004*4d9fdb46SRobert Mustacchi if (dbg->de_printf_callback.dp_buffer &&
1005*4d9fdb46SRobert Mustacchi !dbg->de_printf_callback.dp_buffer_user_provided ) {
1006*4d9fdb46SRobert Mustacchi free(dbg->de_printf_callback.dp_buffer);
1007*4d9fdb46SRobert Mustacchi }
1008*4d9fdb46SRobert Mustacchi
1009*4d9fdb46SRobert Mustacchi _dwarf_destroy_group_map(dbg);
1010*4d9fdb46SRobert Mustacchi /* de_alloc_tree might be NULL if
1011*4d9fdb46SRobert Mustacchi global_de_alloc_tree_on is zero. */
1012*4d9fdb46SRobert Mustacchi if (dbg->de_alloc_tree) {
1013*4d9fdb46SRobert Mustacchi dwarf_tdestroy(dbg->de_alloc_tree,tdestroy_free_node);
1014*4d9fdb46SRobert Mustacchi dbg->de_alloc_tree = 0;
1015*4d9fdb46SRobert Mustacchi }
1016*4d9fdb46SRobert Mustacchi if (dbg->de_tied_data.td_tied_search) {
1017*4d9fdb46SRobert Mustacchi dwarf_tdestroy(dbg->de_tied_data.td_tied_search,
1018*4d9fdb46SRobert Mustacchi _dwarf_tied_destroy_free_node);
1019*4d9fdb46SRobert Mustacchi dbg->de_tied_data.td_tied_search = 0;
1020*4d9fdb46SRobert Mustacchi }
1021*4d9fdb46SRobert Mustacchi free((void *)dbg->de_path);
1022*4d9fdb46SRobert Mustacchi dbg->de_path = 0;
1023*4d9fdb46SRobert Mustacchi for (g = 0; g < dbg->de_gnu_global_path_count; ++g) {
1024*4d9fdb46SRobert Mustacchi free((char *)dbg->de_gnu_global_paths[g]);
1025*4d9fdb46SRobert Mustacchi dbg->de_gnu_global_paths[g] = 0;
1026*4d9fdb46SRobert Mustacchi }
1027*4d9fdb46SRobert Mustacchi free((void*)dbg->de_gnu_global_paths);
1028*4d9fdb46SRobert Mustacchi dbg->de_gnu_global_paths = 0;
1029*4d9fdb46SRobert Mustacchi dbg->de_gnu_global_path_count = 0;
103007dc1947SRichard Lowe memset(dbg, 0, sizeof(*dbg)); /* Prevent accidental use later. */
103149d3bc91SRichard Lowe free(dbg);
103249d3bc91SRichard Lowe return (DW_DLV_OK);
103349d3bc91SRichard Lowe }
1034*4d9fdb46SRobert Mustacchi /* A special case: we have no dbg, no alloc header etc.
1035*4d9fdb46SRobert Mustacchi So create something out of thin air that we can recognize
1036*4d9fdb46SRobert Mustacchi in dwarf_dealloc.
1037*4d9fdb46SRobert Mustacchi Something with the prefix (prefix space hidden from caller).
103849d3bc91SRichard Lowe
1039*4d9fdb46SRobert Mustacchi Only applies to DW_DLA_ERROR, and making up an error record.
1040*4d9fdb46SRobert Mustacchi The allocated space simply leaks.
104149d3bc91SRichard Lowe */
104249d3bc91SRichard Lowe struct Dwarf_Error_s *
_dwarf_special_no_dbg_error_malloc(void)104349d3bc91SRichard Lowe _dwarf_special_no_dbg_error_malloc(void)
104449d3bc91SRichard Lowe {
1045*4d9fdb46SRobert Mustacchi Dwarf_Error e = 0;
1046*4d9fdb46SRobert Mustacchi Dwarf_Unsigned len = sizeof(struct Dwarf_Error_s);
1047*4d9fdb46SRobert Mustacchi char *mem = (char *)malloc(len);
104849d3bc91SRichard Lowe
104949d3bc91SRichard Lowe if (mem == 0) {
105007dc1947SRichard Lowe return 0;
105149d3bc91SRichard Lowe }
1052*4d9fdb46SRobert Mustacchi memset(mem, 0, len);
1053*4d9fdb46SRobert Mustacchi e = (Dwarf_Error)mem;
1054*4d9fdb46SRobert Mustacchi e->er_static_alloc = DE_MALLOC;
1055*4d9fdb46SRobert Mustacchi return e;
105649d3bc91SRichard Lowe }
1057