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