149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   Copyright (C) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2007-2019 David Anderson. All Rights Reserved.
407dc1947SRichard Lowe   Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved.
549d3bc91SRichard Lowe 
6*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it
7*4d9fdb46SRobert Mustacchi   and/or modify it under the terms of version 2.1 of the
8*4d9fdb46SRobert Mustacchi   GNU Lesser General Public License as published by the Free
9*4d9fdb46SRobert Mustacchi   Software Foundation.
10*4d9fdb46SRobert Mustacchi 
11*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be
12*4d9fdb46SRobert Mustacchi   useful, but WITHOUT ANY WARRANTY; without even the implied
13*4d9fdb46SRobert Mustacchi   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14*4d9fdb46SRobert Mustacchi   PURPOSE.
15*4d9fdb46SRobert Mustacchi 
16*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty
17*4d9fdb46SRobert Mustacchi   that it is free of the rightful claim of any third person
18*4d9fdb46SRobert Mustacchi   regarding infringement or the like.  Any license provided
19*4d9fdb46SRobert Mustacchi   herein, whether implied or otherwise, applies only to this
20*4d9fdb46SRobert Mustacchi   software file.  Patent licenses, if any, provided herein
21*4d9fdb46SRobert Mustacchi   do not apply to combinations of this program with other
22*4d9fdb46SRobert Mustacchi   software, or any other product whatsoever.
23*4d9fdb46SRobert Mustacchi 
24*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General
25*4d9fdb46SRobert Mustacchi   Public License along with this program; if not, write the
26*4d9fdb46SRobert Mustacchi   Free Software Foundation, Inc., 51 Franklin Street - Fifth
27*4d9fdb46SRobert Mustacchi   Floor, Boston MA 02110-1301, USA.
2849d3bc91SRichard Lowe 
2949d3bc91SRichard Lowe */
30*4d9fdb46SRobert Mustacchi /*  Following the nomenclature of the DWARF standard
31*4d9fdb46SRobert Mustacchi     Section Version Numbers (DWARF 5):
32*4d9fdb46SRobert Mustacchi     * means not applicable.
33*4d9fdb46SRobert Mustacchi     - means not defined in that version.
34*4d9fdb46SRobert Mustacchi     The version numbers for .debug_info is the same as .debug_info.dwo
35*4d9fdb46SRobert Mustacchi     (etc for the other dwo sections).
36*4d9fdb46SRobert Mustacchi     The versions applicable by section are:
37*4d9fdb46SRobert Mustacchi     .                  DWARF2 DWARF3 DWARF4 DWARF5
38*4d9fdb46SRobert Mustacchi     .debug_abbrev           *      *      *      *
39*4d9fdb46SRobert Mustacchi     .debug_addr             -      -      -      5
40*4d9fdb46SRobert Mustacchi     .debug_aranges          2      2      2      2
41*4d9fdb46SRobert Mustacchi     .debug_frame            1      3      4      4
42*4d9fdb46SRobert Mustacchi     .debug_info             2      3      4      5
43*4d9fdb46SRobert Mustacchi     .debug_line             2      3      4      5
44*4d9fdb46SRobert Mustacchi     .debug_line_str         -      -      -      5
45*4d9fdb46SRobert Mustacchi     .debug_loc              *      *      *      -
46*4d9fdb46SRobert Mustacchi     .debug_loclists         -      -      -      5
47*4d9fdb46SRobert Mustacchi     .debug_macinfo          *      *      *      -
48*4d9fdb46SRobert Mustacchi     .debug_macro            -      -      -      5
49*4d9fdb46SRobert Mustacchi     .debug_names            -      -      -      5
50*4d9fdb46SRobert Mustacchi     .debug_pubnames         2      2      2      -
51*4d9fdb46SRobert Mustacchi     .debug_pubtypes         -      2      2      -
52*4d9fdb46SRobert Mustacchi     .debug_ranges           -      *      *      -
53*4d9fdb46SRobert Mustacchi     .debug_rnglists         -      -      -      5
54*4d9fdb46SRobert Mustacchi     .debug_str              *      *      *      *
55*4d9fdb46SRobert Mustacchi     .debug_str_offsets      -      -      -      5
56*4d9fdb46SRobert Mustacchi     .debug_sup              -      -      -      5
57*4d9fdb46SRobert Mustacchi     .debug_types            -      -      4      -
58*4d9fdb46SRobert Mustacchi 
59*4d9fdb46SRobert Mustacchi     .debug_abbrev.dwo       -      -      -      *
60*4d9fdb46SRobert Mustacchi     .debug_info.dwo         -      -      -      5
61*4d9fdb46SRobert Mustacchi     .debug_line.dwo         -      -      -      5
62*4d9fdb46SRobert Mustacchi     .debug_loc.dwo          -      -      -      -
63*4d9fdb46SRobert Mustacchi     .debug_loclists.dwo     -      -      -      5
64*4d9fdb46SRobert Mustacchi     .debug_macro.dwo        -      -      -      5
65*4d9fdb46SRobert Mustacchi     .debug_rnglists.dwo     -      -      -      5
66*4d9fdb46SRobert Mustacchi     .debug_str.dwo          -      -      -      *
67*4d9fdb46SRobert Mustacchi     .debug_str_offsets.dwo  -      -      -      5
68*4d9fdb46SRobert Mustacchi 
69*4d9fdb46SRobert Mustacchi     .debug_cu_index         -      -      -      5
70*4d9fdb46SRobert Mustacchi     .debug_tu_index         -      -      -      5
7149d3bc91SRichard Lowe 
72*4d9fdb46SRobert Mustacchi */
7349d3bc91SRichard Lowe 
74*4d9fdb46SRobert Mustacchi struct Dwarf_Rnglists_Context_s;
75*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Rnglists_Context_s *Dwarf_Rnglists_Context;
76*4d9fdb46SRobert Mustacchi struct Dwarf_Loclists_Context_s;
77*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Loclists_Context_s *Dwarf_Loclists_Context;
7849d3bc91SRichard Lowe 
7949d3bc91SRichard Lowe struct Dwarf_Die_s {
80*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr di_debug_ptr;
8149d3bc91SRichard Lowe     Dwarf_Abbrev_List di_abbrev_list;
8249d3bc91SRichard Lowe     Dwarf_CU_Context di_cu_context;
8307dc1947SRichard Lowe     int  di_abbrev_code;
84*4d9fdb46SRobert Mustacchi 
85*4d9fdb46SRobert Mustacchi     /* TRUE if part of debug_info. FALSE if part of .debug_types. */
86*4d9fdb46SRobert Mustacchi     Dwarf_Bool di_is_info;
8749d3bc91SRichard Lowe };
8849d3bc91SRichard Lowe 
8949d3bc91SRichard Lowe struct Dwarf_Attribute_s {
90*4d9fdb46SRobert Mustacchi     Dwarf_Half ar_attribute;             /* Attribute Value. */
91*4d9fdb46SRobert Mustacchi     Dwarf_Half ar_attribute_form;        /* Attribute Form. */
9249d3bc91SRichard Lowe     Dwarf_Half ar_attribute_form_direct;
93*4d9fdb46SRobert Mustacchi         /*  Identical to ar_attribute_form except that if
94*4d9fdb46SRobert Mustacchi             the original form uleb was DW_FORM_indirect,
95*4d9fdb46SRobert Mustacchi             ar_attribute_form_direct contains DW_FORM_indirect
96*4d9fdb46SRobert Mustacchi             but ar_attribute_form contains the true form. */
9749d3bc91SRichard Lowe     Dwarf_CU_Context ar_cu_context;
98*4d9fdb46SRobert Mustacchi         /*  The following points to either debug_info or debug_types
99*4d9fdb46SRobert Mustacchi             depending on if context is cc_is_info  or not. */
100*4d9fdb46SRobert Mustacchi     Dwarf_Small *ar_debug_ptr;
101*4d9fdb46SRobert Mustacchi         /*  If DW_FORM_implicit const, the value is here, not
102*4d9fdb46SRobert Mustacchi             in the DIE. */
103*4d9fdb46SRobert Mustacchi     Dwarf_Signed ar_implicit_const;
104*4d9fdb46SRobert Mustacchi     Dwarf_Debug  ar_dbg; /* dbg owning the attr */
105*4d9fdb46SRobert Mustacchi 
106*4d9fdb46SRobert Mustacchi     Dwarf_Die ar_die;/* Access to the DIE owning the attribute */
10749d3bc91SRichard Lowe     Dwarf_Attribute ar_next;
10849d3bc91SRichard Lowe };
10949d3bc91SRichard Lowe 
110*4d9fdb46SRobert Mustacchi 
11149d3bc91SRichard Lowe /*
112*4d9fdb46SRobert Mustacchi     This structure provides the context for a compilation unit.
11349d3bc91SRichard Lowe     Thus, it contains the Dwarf_Debug, cc_dbg, that this cu
114*4d9fdb46SRobert Mustacchi     belongs to.  It contains the information in the compilation
11549d3bc91SRichard Lowe     unit header, cc_length, cc_version_stamp, cc_abbrev_offset,
116*4d9fdb46SRobert Mustacchi     and cc_address_size, in the .debug_info section for that cu.
117*4d9fdb46SRobert Mustacchi     In addition, it contains the count, cc_count_cu, of the cu
118*4d9fdb46SRobert Mustacchi     number of that cu in the list of cu's in the .debug_info.
119*4d9fdb46SRobert Mustacchi     The count starts at 1, ie cc_count_cu is 1 for the first cu,
120*4d9fdb46SRobert Mustacchi     2 for the second and so on.  This struct also contains a
121*4d9fdb46SRobert Mustacchi     pointer, cc_abbrev_table, to a list of pairs of abbrev code
122*4d9fdb46SRobert Mustacchi     and a pointer to the start of that abbrev
12349d3bc91SRichard Lowe     in the .debug_abbrev section.
12449d3bc91SRichard Lowe 
125*4d9fdb46SRobert Mustacchi     Each die will also contain a pointer to such a struct to
126*4d9fdb46SRobert Mustacchi     record the context for that die.
12707dc1947SRichard Lowe 
128*4d9fdb46SRobert Mustacchi     Notice that a pointer to the CU DIE itself is
12907dc1947SRichard Lowe     Dwarf_Off off2 = cu_context->cc_debug_info_offset;
13007dc1947SRichard Lowe     cu_die_info_ptr = dbg->de_debug_info.dss_data +
131*4d9fdb46SRobert Mustacchi         off2 + _dwarf_length_of_cu_header(dbg, off2);
132*4d9fdb46SRobert Mustacchi     Or similar for de_debug_types.
133*4d9fdb46SRobert Mustacchi 
13449d3bc91SRichard Lowe     **Updated by dwarf_next_cu_header in dwarf_die_deliv.c
13549d3bc91SRichard Lowe */
13649d3bc91SRichard Lowe struct Dwarf_CU_Context_s {
13749d3bc91SRichard Lowe     Dwarf_Debug cc_dbg;
138*4d9fdb46SRobert Mustacchi     /*  The sum of cc_length, cc_length_size, and cc_extension_size
139*4d9fdb46SRobert Mustacchi         is the total length of the CU including its header.
140*4d9fdb46SRobert Mustacchi 
141*4d9fdb46SRobert Mustacchi         cc_length is the length of the compilation unit excluding
142*4d9fdb46SRobert Mustacchi         cc_length_size and cc_extension_size.  */
143*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_length;
144*4d9fdb46SRobert Mustacchi 
145*4d9fdb46SRobert Mustacchi     /*  cc_length_size is the size in bytes of an offset.
146*4d9fdb46SRobert Mustacchi         Should probably be renamed cc_offset_size.
147*4d9fdb46SRobert Mustacchi         4 for 32bit dwarf, 8 for 64bit dwarf (whether MIPS/IRIX
148*4d9fdb46SRobert Mustacchi         64bit dwarf or standard 64bit dwarf using the extension
149*4d9fdb46SRobert Mustacchi         mechanism). */
15049d3bc91SRichard Lowe     Dwarf_Small cc_length_size;
151*4d9fdb46SRobert Mustacchi 
152*4d9fdb46SRobert Mustacchi     /*  cc_extension_size is zero unless this is standard
153*4d9fdb46SRobert Mustacchi         DWARF3 and later 64bit dwarf using the extension mechanism.
154*4d9fdb46SRobert Mustacchi         64bit DWARF3 and later: cc_extension_size is 4.
155*4d9fdb46SRobert Mustacchi         64bit DWARF2 MIPS/IRIX: cc_extension_size is zero.
156*4d9fdb46SRobert Mustacchi         32bit DWARF:            cc_extension_size is zero.  */
15749d3bc91SRichard Lowe     Dwarf_Small cc_extension_size;
158*4d9fdb46SRobert Mustacchi 
159*4d9fdb46SRobert Mustacchi     /*  cc_version_stamp is the DWARF version number applicable
160*4d9fdb46SRobert Mustacchi         to the  DWARF in this compilation unit. 2,3,4,... */
16149d3bc91SRichard Lowe     Dwarf_Half cc_version_stamp;
162*4d9fdb46SRobert Mustacchi     /*  cc_abbrev_offset is the section-global offset
163*4d9fdb46SRobert Mustacchi         of the .debug_abbrev section this CU uses.
164*4d9fdb46SRobert Mustacchi         Data from CU header. Includes DWP adjustment made
165*4d9fdb46SRobert Mustacchi         as soon as we create a cu_context. */
166*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_abbrev_offset;
167*4d9fdb46SRobert Mustacchi 
168*4d9fdb46SRobert Mustacchi     /*  cc_address_size is the size of an address in this
169*4d9fdb46SRobert Mustacchi         compilation unit. */
17049d3bc91SRichard Lowe     Dwarf_Small cc_address_size;
171*4d9fdb46SRobert Mustacchi     Dwarf_Small cc_segment_selector_size;
172*4d9fdb46SRobert Mustacchi 
173*4d9fdb46SRobert Mustacchi     /*  cc_debug_offset is the global offset in the section
174*4d9fdb46SRobert Mustacchi         of the CU header of this CU.
175*4d9fdb46SRobert Mustacchi         That is, it is a section global offset.
176*4d9fdb46SRobert Mustacchi         May be debug_info or debug_types
177*4d9fdb46SRobert Mustacchi         but those are distinct.
178*4d9fdb46SRobert Mustacchi         Even in DWP this is set to true global offset
179*4d9fdb46SRobert Mustacchi         right away when cu_context created.
180*4d9fdb46SRobert Mustacchi         See cc_is_info flag. */
181*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_debug_offset;
182*4d9fdb46SRobert Mustacchi 
183*4d9fdb46SRobert Mustacchi     /* === START DEBUG FISSION (Split Dwarf) data
184*4d9fdb46SRobert Mustacchi         cc_signature is in the TU header
185*4d9fdb46SRobert Mustacchi         of a type unit of a TU DIE (or for DW5 in the
186*4d9fdb46SRobert Mustacchi         skeleton or split_compile header is a dwo_id).
187*4d9fdb46SRobert Mustacchi         Ignore this field if cc_signature_present is zero.
188*4d9fdb46SRobert Mustacchi         (TU CUs signature is not the same namespace
189*4d9fdb46SRobert Mustacchi         as DW_AT_dwo_id signatures. The two must be
190*4d9fdb46SRobert Mustacchi         kept separate (for DWARF5))
191*4d9fdb46SRobert Mustacchi 
192*4d9fdb46SRobert Mustacchi         If cc_unit_type == DW_UT_compile or DW_UT_partial
193*4d9fdb46SRobert Mustacchi             the signature is a CU signature (dwo_id).
194*4d9fdb46SRobert Mustacchi         Some early DW5 drafts encouraged DWARF4 output
195*4d9fdb46SRobert Mustacchi             of some compilers to include dwo_id, but
196*4d9fdb46SRobert Mustacchi             in a messier way(lacking DW_UT_*).
197*4d9fdb46SRobert Mustacchi         If cc_unit_type == DW_UT_type ( DW_UT_split_type
198*4d9fdb46SRobert Mustacchi             was never part of DW5, never standard).
199*4d9fdb46SRobert Mustacchi             the signature is a type signature. */
200*4d9fdb46SRobert Mustacchi 
201*4d9fdb46SRobert Mustacchi     Dwarf_Half  cc_cu_die_tag;
202*4d9fdb46SRobert Mustacchi     Dwarf_Sig8  cc_signature;
203*4d9fdb46SRobert Mustacchi 
204*4d9fdb46SRobert Mustacchi     /*  cc_type_signature_offset contains the
205*4d9fdb46SRobert Mustacchi         section-local DIE offset of the type
206*4d9fdb46SRobert Mustacchi         the signature applies to if the cc_unit_type
207*4d9fdb46SRobert Mustacchi         is DW_UT_type or DW_UT_split_type. */
208*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_signature_offset;
209*4d9fdb46SRobert Mustacchi 
210*4d9fdb46SRobert Mustacchi     /*  For each CU and each TU
211*4d9fdb46SRobert Mustacchi         in a dwp package file there is
212*4d9fdb46SRobert Mustacchi         is a hash and
213*4d9fdb46SRobert Mustacchi         a set of offsets indexed by DW_SECT_* id.
214*4d9fdb46SRobert Mustacchi         Only one such set per CU or TU.
215*4d9fdb46SRobert Mustacchi         The data on all that is in cc_dwp_offsets
216*4d9fdb46SRobert Mustacchi 
217*4d9fdb46SRobert Mustacchi         If it is a TU the signature in cc_dwp_offsets
218*4d9fdb46SRobert Mustacchi         must match the signature in cc_signature.
219*4d9fdb46SRobert Mustacchi         */
220*4d9fdb46SRobert Mustacchi     struct Dwarf_Debug_Fission_Per_CU_s  cc_dwp_offsets;
221*4d9fdb46SRobert Mustacchi 
222*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_signature_present; /* Meaning type signature
223*4d9fdb46SRobert Mustacchi         in TU header or, for CU header, signature in CU DIE. */
224*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_low_pc_present;
225*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_addr_base_present;   /* Not TRUE in .dwo */
226*4d9fdb46SRobert Mustacchi     /*  DW_AT_GNU_ranges_base was a GNU extension that appeared
227*4d9fdb46SRobert Mustacchi         but was unused. See dwarf_die_deliv.c for details. */
228*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_ranges_base_present; /* unused */
229*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_rnglists_base_present; /* DW5 */
230*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_str_offsets_base_present;
231*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_loclists_base_present;
232*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_cu_die_has_children;
233*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_dwo_name_present;
234*4d9fdb46SRobert Mustacchi 
235*4d9fdb46SRobert Mustacchi     /*  Non zero if this context is a dwo section. Either
236*4d9fdb46SRobert Mustacchi         dwo or dwp file. */
237*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_is_dwo;
238*4d9fdb46SRobert Mustacchi 
239*4d9fdb46SRobert Mustacchi     /*  cc_cu_die_offset_present is non-zero if
240*4d9fdb46SRobert Mustacchi         cc_cu_die_global_sec_offset is meaningful.  */
241*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_cu_die_offset_present;
242*4d9fdb46SRobert Mustacchi 
243*4d9fdb46SRobert Mustacchi     /* if present, is base address of CU */
244*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_low_pc;
245*4d9fdb46SRobert Mustacchi     /*  from DW_AT_addr_base in CU DIE, offset to .debug_addr table */
246*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_addr_base;     /* Zero in .dwo */
247*4d9fdb46SRobert Mustacchi     /*  DW_AT_GNU_ranges_base was a GNU extension that appeared
248*4d9fdb46SRobert Mustacchi         but was unused. See dwarf_die_deliv.c for details. */
249*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_ranges_base;   /* unused */
250*4d9fdb46SRobert Mustacchi     /*  from DW_AT_rnglists_base in CU DIE */
251*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_rnglists_base;    /*DW5 */
252*4d9fdb46SRobert Mustacchi     /*  from DW_AT_str_offsets_base in CU DIE */
253*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_str_offsets_base;
254*4d9fdb46SRobert Mustacchi     /*  From DW_AT_loclists_base */
255*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_loclists_base;
256*4d9fdb46SRobert Mustacchi 
257*4d9fdb46SRobert Mustacchi     char *     cc_dwo_name;
258*4d9fdb46SRobert Mustacchi     /* === END DEBUG FISSION (Split Dwarf) data */
259*4d9fdb46SRobert Mustacchi 
260*4d9fdb46SRobert Mustacchi     /*  Global section offset to the bytes of the CU die for this CU.
261*4d9fdb46SRobert Mustacchi         Set when the CU die is accessed by dwarf_siblingof_b(). */
262*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned cc_cu_die_global_sec_offset;
263*4d9fdb46SRobert Mustacchi 
264*4d9fdb46SRobert Mustacchi 
26549d3bc91SRichard Lowe     Dwarf_Byte_Ptr cc_last_abbrev_ptr;
266*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr cc_last_abbrev_endptr;
26749d3bc91SRichard Lowe     Dwarf_Hash_Table cc_abbrev_hash_table;
26849d3bc91SRichard Lowe     Dwarf_CU_Context cc_next;
269*4d9fdb46SRobert Mustacchi 
27007dc1947SRichard Lowe     /*unsigned char cc_offset_length; */
271*4d9fdb46SRobert Mustacchi     Dwarf_Bool cc_is_info; /* TRUE means context is
272*4d9fdb46SRobert Mustacchi         in debug_info, FALSE means is in debug_types.
273*4d9fdb46SRobert Mustacchi         FALSE only possible for DWARF4 .debug_types
274*4d9fdb46SRobert Mustacchi         section CUs.
275*4d9fdb46SRobert Mustacchi         For DWARF5 all DIEs are in .debug_info[.dwo] */
276*4d9fdb46SRobert Mustacchi 
277*4d9fdb46SRobert Mustacchi     Dwarf_Half cc_unit_type;
278*4d9fdb46SRobert Mustacchi         /*  DWARF5: set from header
279*4d9fdb46SRobert Mustacchi             For DWARF 2,3,4 this is filled in initially
280*4d9fdb46SRobert Mustacchi         from the CU header and refined by inspecting
281*4d9fdb46SRobert Mustacchi         the CU DIE to detect the correct setting. */
282*4d9fdb46SRobert Mustacchi 
28307dc1947SRichard Lowe };
28407dc1947SRichard Lowe 
285*4d9fdb46SRobert Mustacchi /*  Consolidates section-specific data in one place.
286*4d9fdb46SRobert Mustacchi     Section is an Elf specific term, intended as a general
287*4d9fdb46SRobert Mustacchi     term (for non-Elf objects some code must synthesize the
288*4d9fdb46SRobert Mustacchi     values somehow).  */
28907dc1947SRichard Lowe struct Dwarf_Section_s {
29007dc1947SRichard Lowe     Dwarf_Small *  dss_data;
29107dc1947SRichard Lowe     Dwarf_Unsigned dss_size;
292*4d9fdb46SRobert Mustacchi     /*  Some Elf sections have a non-zero dss_entrysize which
293*4d9fdb46SRobert Mustacchi         is the size in bytes of a table entry in the section.
294*4d9fdb46SRobert Mustacchi         Relocations and symbols are both in tables, so have a
295*4d9fdb46SRobert Mustacchi         non-zero entrysize.  Object formats which do not care
296*4d9fdb46SRobert Mustacchi         about this should leave this field zero. */
297*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dss_entrysize;
298*4d9fdb46SRobert Mustacchi     /*  dss_index is the section index as things are numbered in
299*4d9fdb46SRobert Mustacchi         an object file being read.   An Elf section number. */
300*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned     dss_index;
301*4d9fdb46SRobert Mustacchi     /*  dss_addr is the 'section address' which is only
302*4d9fdb46SRobert Mustacchi         non-zero for a GNU eh section.
303*4d9fdb46SRobert Mustacchi         Purpose: to handle DW_EH_PE_pcrel encoding. Leaving
304*4d9fdb46SRobert Mustacchi         it zero is fine for non-elf.  */
30507dc1947SRichard Lowe     Dwarf_Addr     dss_addr;
30607dc1947SRichard Lowe     Dwarf_Small    dss_data_was_malloc;
307*4d9fdb46SRobert Mustacchi     /*  is_in_use set during initial object reading to
308*4d9fdb46SRobert Mustacchi         detect duplicates. Ignored after setup done. */
309*4d9fdb46SRobert Mustacchi     Dwarf_Small    dss_is_in_use;
310*4d9fdb46SRobert Mustacchi 
311*4d9fdb46SRobert Mustacchi     /*  When loading COMDAT they refer (sometimes) to
312*4d9fdb46SRobert Mustacchi         base sections, so we need to have the BASE
313*4d9fdb46SRobert Mustacchi         group sections filled in when the corresponding is
314*4d9fdb46SRobert Mustacchi         not in the COMDAT group list.  .debug_abbrev is
315*4d9fdb46SRobert Mustacchi         an example. */
316*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned     dss_group_number;
317*4d9fdb46SRobert Mustacchi 
318*4d9fdb46SRobert Mustacchi     /* These for reporting compression */
319*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dss_uncompressed_length;
320*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dss_compressed_length;
321*4d9fdb46SRobert Mustacchi 
322*4d9fdb46SRobert Mustacchi     /*  If this is zdebug, to start  data/size are the
323*4d9fdb46SRobert Mustacchi         raw section bytes.
324*4d9fdb46SRobert Mustacchi         Initially for all sections dss_data_was_malloc set FALSE
325*4d9fdb46SRobert Mustacchi             and dss_requires_decompress set FALSE.
326*4d9fdb46SRobert Mustacchi         For zdebug set dss_zdebug_requires_decompress set TRUE
327*4d9fdb46SRobert Mustacchi             In that case it is likely ZLIB compressed but
328*4d9fdb46SRobert Mustacchi             we do not know that just scanning section headers.
329*4d9fdb46SRobert Mustacchi         If not .zdebug but it is SHF_COMPRESSED
330*4d9fdb46SRobert Mustacchi             then decompress is required.
331*4d9fdb46SRobert Mustacchi 
332*4d9fdb46SRobert Mustacchi         On translation (ie zlib use and malloc)
333*4d9fdb46SRobert Mustacchi         Set dss_data dss_size to point to malloc space and
334*4d9fdb46SRobert Mustacchi             malloc size.
335*4d9fdb46SRobert Mustacchi         Set dss_did_decompress FALSE
336*4d9fdb46SRobert Mustacchi         Set dss_was_malloc  TRUE */
337*4d9fdb46SRobert Mustacchi     Dwarf_Small    dss_zdebug_requires_decompress;
338*4d9fdb46SRobert Mustacchi     Dwarf_Small    dss_did_decompress;
339*4d9fdb46SRobert Mustacchi     Dwarf_Small dss_shf_compressed;  /* section flag SHF_COMPRESS */
340*4d9fdb46SRobert Mustacchi     Dwarf_Small dss_ZLIB_compressed; /* Section compression starts with ZLIB chars*/
341*4d9fdb46SRobert Mustacchi 
342*4d9fdb46SRobert Mustacchi     /*  For non-elf, leaving the following fields zero
343*4d9fdb46SRobert Mustacchi         will mean they are ignored. */
344*4d9fdb46SRobert Mustacchi     /*  dss_link should be zero unless a section has a link
345*4d9fdb46SRobert Mustacchi         to another (sh_link).  Used to access relocation data for
346*4d9fdb46SRobert Mustacchi         a section (and for symtab section, access its strtab). */
347*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned     dss_link;
348*4d9fdb46SRobert Mustacchi     /*  The following is used when reading .rela sections
349*4d9fdb46SRobert Mustacchi         (such sections appear in some .o files). */
35007dc1947SRichard Lowe     Dwarf_Half     dss_reloc_index; /* Zero means ignore the reloc fields. */
35107dc1947SRichard Lowe     Dwarf_Small *  dss_reloc_data;
35207dc1947SRichard Lowe     Dwarf_Unsigned dss_reloc_size;
353*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dss_reloc_entrysize;
35407dc1947SRichard Lowe     Dwarf_Addr     dss_reloc_addr;
355*4d9fdb46SRobert Mustacchi     /*  dss_reloc_symtab is the sh_link of a .rela to its .symtab, leave
356*4d9fdb46SRobert Mustacchi         it 0 if non-meaningful. */
35707dc1947SRichard Lowe     Dwarf_Addr     dss_reloc_symtab;
358*4d9fdb46SRobert Mustacchi     /*  dss_reloc_link should be zero unless a reloc section has a link
359*4d9fdb46SRobert Mustacchi         to another (sh_link).  Used to access the symtab for relocations
360*4d9fdb46SRobert Mustacchi         a section. */
361*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned     dss_reloc_link;
362*4d9fdb46SRobert Mustacchi     /*  Pointer to the elf symtab, used for elf .rela. Leave it 0
363*4d9fdb46SRobert Mustacchi         if not relevant. */
36407dc1947SRichard Lowe     struct Dwarf_Section_s *dss_symtab;
365*4d9fdb46SRobert Mustacchi     /*  dss_name, dss_standard_name must never be freed,
366*4d9fdb46SRobert Mustacchi         they are static strings in libdwarf. */
367*4d9fdb46SRobert Mustacchi     const char * dss_name;
368*4d9fdb46SRobert Mustacchi     const char * dss_standard_name;
369*4d9fdb46SRobert Mustacchi 
370*4d9fdb46SRobert Mustacchi     /* Object section number in object file. */
371*4d9fdb46SRobert Mustacchi     unsigned dss_number;
372*4d9fdb46SRobert Mustacchi 
373*4d9fdb46SRobert Mustacchi     /*  These are elf flags and non-elf object should
374*4d9fdb46SRobert Mustacchi         just leave these fields zero. Which is essentially
375*4d9fdb46SRobert Mustacchi         automatic as they are not in
376*4d9fdb46SRobert Mustacchi         Dwarf_Obj_Access_Section_s.  */
377*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  dss_flags;
378*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  dss_addralign;
379*4d9fdb46SRobert Mustacchi 
380*4d9fdb46SRobert Mustacchi     /*  Set when loading .group section as those are special and
381*4d9fdb46SRobert Mustacchi         neither compressed nor have relocations so never malloc
382*4d9fdb46SRobert Mustacchi         space for libdwarf.  */
383*4d9fdb46SRobert Mustacchi     Dwarf_Small     dss_ignore_reloc_group_sec;
384*4d9fdb46SRobert Mustacchi     char dss_is_rela;
38549d3bc91SRichard Lowe };
38649d3bc91SRichard Lowe 
387*4d9fdb46SRobert Mustacchi /*  Overview: if next_to_use== first, no error slots are used.
388*4d9fdb46SRobert Mustacchi     If next_to_use+1 (mod maxcount) == first the slots are all used
38907dc1947SRichard Lowe */
39007dc1947SRichard Lowe struct Dwarf_Harmless_s {
39107dc1947SRichard Lowe   unsigned dh_maxcount;
39207dc1947SRichard Lowe   unsigned dh_next_to_use;
39307dc1947SRichard Lowe   unsigned dh_first;
39407dc1947SRichard Lowe   unsigned dh_errs_count;
39507dc1947SRichard Lowe   char **  dh_errors;
39607dc1947SRichard Lowe };
39749d3bc91SRichard Lowe 
398*4d9fdb46SRobert Mustacchi /* Data needed seperately for debug_info and debug_types
399*4d9fdb46SRobert Mustacchi    as we may be reading both interspersed. */
40049d3bc91SRichard Lowe 
401*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_InfoTypes_s {
402*4d9fdb46SRobert Mustacchi     /*  Context for the compilation_unit just read by a call to
403*4d9fdb46SRobert Mustacchi         dwarf_next_cu_header. **Updated by dwarf_next_cu_header in
404*4d9fdb46SRobert Mustacchi         dwarf_die_deliv.c */
40549d3bc91SRichard Lowe     Dwarf_CU_Context de_cu_context;
406*4d9fdb46SRobert Mustacchi     /*  Points to linked list of CU Contexts for the
407*4d9fdb46SRobert Mustacchi         CU's already read.  These are only CU's read
408*4d9fdb46SRobert Mustacchi         by dwarf_next_cu_header(). */
40949d3bc91SRichard Lowe     Dwarf_CU_Context de_cu_context_list;
410*4d9fdb46SRobert Mustacchi     /*  Points to the last CU Context added to the list by
411*4d9fdb46SRobert Mustacchi         dwarf_next_cu_header(). */
41249d3bc91SRichard Lowe     Dwarf_CU_Context de_cu_context_list_end;
41349d3bc91SRichard Lowe 
414*4d9fdb46SRobert Mustacchi     /*  Offset of last byte of last CU read.
415*4d9fdb46SRobert Mustacchi         Actually one-past that last byte.  So
416*4d9fdb46SRobert Mustacchi         use care and compare as offset >= de_last_offset
417*4d9fdb46SRobert Mustacchi         to know if offset is too big. */
418*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_last_offset;
419*4d9fdb46SRobert Mustacchi     /*  de_last_di_info_ptr and de_last_die are used with
420*4d9fdb46SRobert Mustacchi         dwarf_siblingof, dwarf_child, and dwarf_validate_die_sibling.
421*4d9fdb46SRobert Mustacchi         dwarf_validate_die_sibling will not give meaningful results
422*4d9fdb46SRobert Mustacchi         if called inappropriately. */
423*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr  de_last_di_ptr;
424*4d9fdb46SRobert Mustacchi     Dwarf_Die  de_last_die;
425*4d9fdb46SRobert Mustacchi };
426*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Debug_InfoTypes_s *Dwarf_Debug_InfoTypes;
427*4d9fdb46SRobert Mustacchi 
428*4d9fdb46SRobert Mustacchi /*  As the tasks performed on a debug related section is the same,
429*4d9fdb46SRobert Mustacchi     in order to make the process of adding a new section
430*4d9fdb46SRobert Mustacchi     (very unlikely) a little bit easy and to reduce the
431*4d9fdb46SRobert Mustacchi     possibility of errors, a simple table
432*4d9fdb46SRobert Mustacchi     build dynamically, will contain the relevant information.
433*4d9fdb46SRobert Mustacchi */
434*4d9fdb46SRobert Mustacchi 
435*4d9fdb46SRobert Mustacchi struct Dwarf_dbg_sect_s {
436*4d9fdb46SRobert Mustacchi     /*  Debug section name must not be freed, is quoted string.
437*4d9fdb46SRobert Mustacchi         This is the name from the object file itself. */
438*4d9fdb46SRobert Mustacchi     const char *ds_name;
439*4d9fdb46SRobert Mustacchi     /* The section number in object section numbering. */
440*4d9fdb46SRobert Mustacchi     unsigned ds_number;
441*4d9fdb46SRobert Mustacchi     /*   Debug section information, points to de_debug_*member
442*4d9fdb46SRobert Mustacchi         (or the like) of the dbg struct.  */
443*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *ds_secdata;
444*4d9fdb46SRobert Mustacchi 
445*4d9fdb46SRobert Mustacchi     unsigned ds_groupnumber;
446*4d9fdb46SRobert Mustacchi     int ds_duperr;                     /* Error code for duplicated section */
447*4d9fdb46SRobert Mustacchi     int ds_emptyerr;                   /* Error code for empty section */
448*4d9fdb46SRobert Mustacchi     int ds_have_dwarf;                 /* Section contains DWARF */
449*4d9fdb46SRobert Mustacchi     int ds_have_zdebug;                /* Section compressed: .zdebug name */
450*4d9fdb46SRobert Mustacchi };
451*4d9fdb46SRobert Mustacchi 
452*4d9fdb46SRobert Mustacchi /*  As the number of debug sections does not change very often, in the case a
453*4d9fdb46SRobert Mustacchi     new section is added in 'enter_section_in_array()'
454*4d9fdb46SRobert Mustacchi     the 'MAX_DEBUG_SECTIONS' must
455*4d9fdb46SRobert Mustacchi     be updated accordingly.
456*4d9fdb46SRobert Mustacchi     This does not yet allow for section-groups in object files,
457*4d9fdb46SRobert Mustacchi     for which many .debug_info (and other) sections may exist.
458*4d9fdb46SRobert Mustacchi */
459*4d9fdb46SRobert Mustacchi #define DWARF_MAX_DEBUG_SECTIONS 50
460*4d9fdb46SRobert Mustacchi #define DWARFSTRING_ALLOC_SIZE   200
461*4d9fdb46SRobert Mustacchi 
462*4d9fdb46SRobert Mustacchi 
463*4d9fdb46SRobert Mustacchi /*  All the Dwarf_Debug tied-file info in one place.  */
464*4d9fdb46SRobert Mustacchi struct Dwarf_Tied_Data_s {
465*4d9fdb46SRobert Mustacchi     /*  Used to access executable from .dwo or .dwp object.
466*4d9fdb46SRobert Mustacchi         Pointer to the tied_to Dwarf_Debug*/
467*4d9fdb46SRobert Mustacchi     Dwarf_Debug td_tied_object;
468*4d9fdb46SRobert Mustacchi 
469*4d9fdb46SRobert Mustacchi     /*  TRUE if this tied object is tied to.
470*4d9fdb46SRobert Mustacchi         It's extra work to look for a DW_AT_dwo_id.
471*4d9fdb46SRobert Mustacchi         Set when tied dbg (on the base) was created.
472*4d9fdb46SRobert Mustacchi         This helps us do it only when it may be productive. */
473*4d9fdb46SRobert Mustacchi     Dwarf_Bool td_is_tied_object;
474*4d9fdb46SRobert Mustacchi 
475*4d9fdb46SRobert Mustacchi     /*  Used for Type Unit signatures.
476*4d9fdb46SRobert Mustacchi         Type Units are in .debug_types in DW4
477*4d9fdb46SRobert Mustacchi         but in .debug_info in DW5.
478*4d9fdb46SRobert Mustacchi         Some .debug_info point to them symbolically
479*4d9fdb46SRobert Mustacchi         via DW_AT_signature attributes.
480*4d9fdb46SRobert Mustacchi         If non-zero is a dwarf_tsearch 'tree'.
481*4d9fdb46SRobert Mustacchi         Only non-zero if td_is_tied_object is set and
482*4d9fdb46SRobert Mustacchi         we had a reason to build the search tree..
483*4d9fdb46SRobert Mustacchi         Type Units have a Dwarf_Sig8 signature
484*4d9fdb46SRobert Mustacchi         in the header, and such is recorded here.
485*4d9fdb46SRobert Mustacchi 
486*4d9fdb46SRobert Mustacchi         Type Unit signatures can conflict with
487*4d9fdb46SRobert Mustacchi         signatures in split-dwarf (dwo/dwp) sections.
488*4d9fdb46SRobert Mustacchi 
489*4d9fdb46SRobert Mustacchi         The Key for each record is a Dwarf_Sig8 (8 bytes).
490*4d9fdb46SRobert Mustacchi         The data for each is a pointer to a Dwarf_CU_context
491*4d9fdb46SRobert Mustacchi         record in this dbg (cu_context in
492*4d9fdb46SRobert Mustacchi         one of tied dbg's de_cu_context_list). */
493*4d9fdb46SRobert Mustacchi     void *td_tied_search;
494*4d9fdb46SRobert Mustacchi 
495*4d9fdb46SRobert Mustacchi };
496*4d9fdb46SRobert Mustacchi 
497*4d9fdb46SRobert Mustacchi /*  dg_groupnum 0 does not exist.
498*4d9fdb46SRobert Mustacchi     dg_groupnum 1 is base
499*4d9fdb46SRobert Mustacchi     dg_groupnum 2 is dwo
500*4d9fdb46SRobert Mustacchi     dg_groupnum 3 and higher are COMDAT groups (if any).
501*4d9fdb46SRobert Mustacchi   */
502*4d9fdb46SRobert Mustacchi struct Dwarf_Group_Data_s {
503*4d9fdb46SRobert Mustacchi     /* For traditional DWARF the value is one, just one group. */
504*4d9fdb46SRobert Mustacchi     unsigned gd_number_of_groups;
505*4d9fdb46SRobert Mustacchi 
506*4d9fdb46SRobert Mustacchi     /* Raw elf (elf-like) section count. */
507*4d9fdb46SRobert Mustacchi     unsigned gd_number_of_sections;
508*4d9fdb46SRobert Mustacchi 
509*4d9fdb46SRobert Mustacchi     unsigned gd_map_entry_count;
51049d3bc91SRichard Lowe 
511*4d9fdb46SRobert Mustacchi     /* A map from section number to group number. */
512*4d9fdb46SRobert Mustacchi     void *gd_map;
513*4d9fdb46SRobert Mustacchi };
514*4d9fdb46SRobert Mustacchi 
515*4d9fdb46SRobert Mustacchi struct Dwarf_Debug_s {
516*4d9fdb46SRobert Mustacchi     /*  All file access methods and support data
517*4d9fdb46SRobert Mustacchi         are hidden in this structure.
518*4d9fdb46SRobert Mustacchi         We get a pointer, callers control the lifetime of the
519*4d9fdb46SRobert Mustacchi         structure and contents. */
520*4d9fdb46SRobert Mustacchi     struct Dwarf_Obj_Access_Interface_s *de_obj_file;
52149d3bc91SRichard Lowe 
522*4d9fdb46SRobert Mustacchi     Dwarf_Handler de_errhand;
523*4d9fdb46SRobert Mustacchi     Dwarf_Ptr de_errarg;
524*4d9fdb46SRobert Mustacchi 
525*4d9fdb46SRobert Mustacchi     /*  Enabling us to close an fd if we own it,
526*4d9fdb46SRobert Mustacchi         as in the case of dwarf_init_path().
527*4d9fdb46SRobert Mustacchi         de_fd is only meaningful
528*4d9fdb46SRobert Mustacchi         if de_owns_fd is set.  Each object
529*4d9fdb46SRobert Mustacchi         file type has any necessary fd recorded
530*4d9fdb46SRobert Mustacchi         under de_obj_file. */
531*4d9fdb46SRobert Mustacchi     int  de_fd;
532*4d9fdb46SRobert Mustacchi     char de_owns_fd;
533*4d9fdb46SRobert Mustacchi     /*  de_path is only set automatically if dwarf_init_path()
534*4d9fdb46SRobert Mustacchi         was used to initialize things.
535*4d9fdb46SRobert Mustacchi         Used with the .gnu_debuglink section. */
536*4d9fdb46SRobert Mustacchi     const char *de_path;
537*4d9fdb46SRobert Mustacchi 
538*4d9fdb46SRobert Mustacchi     const char ** de_gnu_global_paths;
539*4d9fdb46SRobert Mustacchi     unsigned      de_gnu_global_path_count;
540*4d9fdb46SRobert Mustacchi 
541*4d9fdb46SRobert Mustacchi     struct Dwarf_Debug_InfoTypes_s de_info_reading;
542*4d9fdb46SRobert Mustacchi     struct Dwarf_Debug_InfoTypes_s de_types_reading;
543*4d9fdb46SRobert Mustacchi 
544*4d9fdb46SRobert Mustacchi     /*  DW_GROUPNUMBER_ANY, DW_GROUPNUMBER_BASE, DW_GROUPNUMBER_DWO,
545*4d9fdb46SRobert Mustacchi         or a comdat group number > 2
546*4d9fdb46SRobert Mustacchi         Selected at init time of this dbg based on
547*4d9fdb46SRobert Mustacchi         user request and on data in the object. */
548*4d9fdb46SRobert Mustacchi     unsigned de_groupnumber;
549*4d9fdb46SRobert Mustacchi 
550*4d9fdb46SRobert Mustacchi     /* Supporting data for groupnumbers. */
551*4d9fdb46SRobert Mustacchi     struct Dwarf_Group_Data_s de_groupnumbers;
552*4d9fdb46SRobert Mustacchi 
553*4d9fdb46SRobert Mustacchi     /*  Number of bytes in the length, and offset field in various
554*4d9fdb46SRobert Mustacchi         .debu* sections.  It's not very meaningful, and is
555*4d9fdb46SRobert Mustacchi         only used in one 'approximate' calculation.
556*4d9fdb46SRobert Mustacchi         de_offset_size would be a more appropos name. */
55749d3bc91SRichard Lowe     Dwarf_Small de_length_size;
55849d3bc91SRichard Lowe 
559*4d9fdb46SRobert Mustacchi     /*  Size of the object file in bytes. If Unknown
560*4d9fdb46SRobert Mustacchi         leave this zero. */
561*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_filesize;
562*4d9fdb46SRobert Mustacchi 
563*4d9fdb46SRobert Mustacchi     /*  number of bytes in a pointer of the target in various .debug_
564*4d9fdb46SRobert Mustacchi         sections. 4 in 32bit, 8 in MIPS 64, ia64. */
56549d3bc91SRichard Lowe     Dwarf_Small de_pointer_size;
56649d3bc91SRichard Lowe 
567*4d9fdb46SRobert Mustacchi     /*  set at creation of a Dwarf_Debug to say if form_string should be
568*4d9fdb46SRobert Mustacchi         checked for valid length at every call. 0 means do the check.
569*4d9fdb46SRobert Mustacchi         non-zero means do not do the check. */
57049d3bc91SRichard Lowe     Dwarf_Small de_assume_string_in_bounds;
57149d3bc91SRichard Lowe 
572*4d9fdb46SRobert Mustacchi     /*  Keep track of allocations so a dwarf_finish call can clean up.
573*4d9fdb46SRobert Mustacchi         Null till a tree is created */
574*4d9fdb46SRobert Mustacchi     void * de_alloc_tree;
575*4d9fdb46SRobert Mustacchi 
576*4d9fdb46SRobert Mustacchi     /*  These fields are used to process debug_frame section.  **Updated
577*4d9fdb46SRobert Mustacchi         by dwarf_get_fde_list in dwarf_frame.h */
578*4d9fdb46SRobert Mustacchi     /*  Points to contiguous block of pointers to Dwarf_Cie_s structs. */
57949d3bc91SRichard Lowe     Dwarf_Cie *de_cie_data;
580*4d9fdb46SRobert Mustacchi     /*  Count of number of Dwarf_Cie_s structs. */
58149d3bc91SRichard Lowe     Dwarf_Signed de_cie_count;
582*4d9fdb46SRobert Mustacchi     /*  Keep eh (GNU) separate!. */
58307dc1947SRichard Lowe     Dwarf_Cie *de_cie_data_eh;
58407dc1947SRichard Lowe     Dwarf_Signed de_cie_count_eh;
585*4d9fdb46SRobert Mustacchi     /*  Points to contiguous block of pointers to Dwarf_Fde_s structs. */
58649d3bc91SRichard Lowe     Dwarf_Fde *de_fde_data;
587*4d9fdb46SRobert Mustacchi     /*  Count of number of Dwarf_Fde_s structs. */
588*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_fde_count;
589*4d9fdb46SRobert Mustacchi     /*  Keep eh (GNU) separate!. */
59007dc1947SRichard Lowe     Dwarf_Fde *de_fde_data_eh;
591*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_fde_count_eh;
59207dc1947SRichard Lowe 
593*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_info;
594*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_types;
59507dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_abbrev;
59607dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_line;
597*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_line_str; /* New in DWARF5 */
59807dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_loc;
59907dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_aranges;
60007dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_macinfo;
601*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_macro;    /* New in DWARF5 */
602*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_names;    /* New in DWARF5 */
60307dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_pubnames;
60407dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_str;
605*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_sup;      /* New in DWARF5 */
606*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_loclists; /* New in DWARF5 */
607*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_rnglists; /* New in DWARF5 */
60807dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_frame;
609*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_gnu_debuglink;  /* New September 2019 */
610*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_note_gnu_buildid; /* New September 2019 */
611*4d9fdb46SRobert Mustacchi 
61207dc1947SRichard Lowe 
61307dc1947SRichard Lowe     /* gnu: the g++ eh_frame section */
61407dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_frame_eh_gnu;
61507dc1947SRichard Lowe 
61607dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_pubtypes; /* DWARF3 .debug_pubtypes */
61707dc1947SRichard Lowe 
618*4d9fdb46SRobert Mustacchi 
619*4d9fdb46SRobert Mustacchi     /*  Four SGI IRIX extensions essentially
620*4d9fdb46SRobert Mustacchi         identical to DWARF3 .debug_pubtypes.
621*4d9fdb46SRobert Mustacchi         Only on SGI IRIX. */
62207dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_funcnames;
623*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_typenames;
62407dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_varnames;
62507dc1947SRichard Lowe     struct Dwarf_Section_s de_debug_weaknames;
62649d3bc91SRichard Lowe 
627*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_ranges;
628*4d9fdb46SRobert Mustacchi     /*  Following two part of DebugFission and DWARF5 */
629*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_str_offsets;
630*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_addr;
631*4d9fdb46SRobert Mustacchi 
632*4d9fdb46SRobert Mustacchi     /*  For the .debug_rnglists[.dwo] section */
633*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_rnglists_context_count;
634*4d9fdb46SRobert Mustacchi     /*  pointer to array of pointers to
635*4d9fdb46SRobert Mustacchi         rnglists context instances */
636*4d9fdb46SRobert Mustacchi     Dwarf_Rnglists_Context *  de_rnglists_context;
637*4d9fdb46SRobert Mustacchi 
638*4d9fdb46SRobert Mustacchi     /*  For the .debug_loclists[.dwo] section */
639*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned de_loclists_context_count;
640*4d9fdb46SRobert Mustacchi     /*  pointer to array of pointers to
641*4d9fdb46SRobert Mustacchi         loclists context instances */
642*4d9fdb46SRobert Mustacchi     Dwarf_Loclists_Context *  de_loclists_context;
643*4d9fdb46SRobert Mustacchi 
644*4d9fdb46SRobert Mustacchi     /* Following for the .gdb_index section.  */
645*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_gdbindex;
646*4d9fdb46SRobert Mustacchi 
647*4d9fdb46SRobert Mustacchi     /*  Types in DWARF5 are in .debug_info
648*4d9fdb46SRobert Mustacchi         and in DWARF4 are in .debug_types.
649*4d9fdb46SRobert Mustacchi         These indexes first standardized in DWARF5,
650*4d9fdb46SRobert Mustacchi         DWARF4 can have them as an extension.
651*4d9fdb46SRobert Mustacchi         The next to refer to the DWP index sections and the
652*4d9fdb46SRobert Mustacchi         tu and cu indexes sections are distinct in DWARF4 & 5. */
653*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_cu_index;
654*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_debug_tu_index;
655*4d9fdb46SRobert Mustacchi 
656*4d9fdb46SRobert Mustacchi     /*  For non-elf, simply leave the following two structs zeroed and
657*4d9fdb46SRobert Mustacchi         they will be ignored. */
658*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_elf_symtab;
659*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s de_elf_strtab;
660*4d9fdb46SRobert Mustacchi 
661*4d9fdb46SRobert Mustacchi     /*  For a .dwp object file .
662*4d9fdb46SRobert Mustacchi         For DWARF4, type units are in .debug_types
663*4d9fdb46SRobert Mustacchi             (DWP is a GNU extension in DW4)..
664*4d9fdb46SRobert Mustacchi         For DWARF5, type units are in .debug_info.
665*4d9fdb46SRobert Mustacchi     */
666*4d9fdb46SRobert Mustacchi     Dwarf_Xu_Index_Header  de_cu_hashindex_data;
667*4d9fdb46SRobert Mustacchi     Dwarf_Xu_Index_Header  de_tu_hashindex_data;
668*4d9fdb46SRobert Mustacchi 
669*4d9fdb46SRobert Mustacchi     void (*de_copy_word) (void *, const void *, unsigned long);
67049d3bc91SRichard Lowe     unsigned char de_same_endian;
671*4d9fdb46SRobert Mustacchi     unsigned char de_elf_must_close; /* If non-zero, then
672*4d9fdb46SRobert Mustacchi         it was dwarf_init (not dwarf_elf_init)
673*4d9fdb46SRobert Mustacchi         so must elf_end() */
67449d3bc91SRichard Lowe 
67507dc1947SRichard Lowe     /* Default is DW_FRAME_INITIAL_VALUE from header. */
676*4d9fdb46SRobert Mustacchi     Dwarf_Half de_frame_rule_initial_value;
67707dc1947SRichard Lowe 
67807dc1947SRichard Lowe     /* Default is   DW_FRAME_LAST_REG_NUM. */
679*4d9fdb46SRobert Mustacchi     Dwarf_Half de_frame_reg_rules_entry_count;
680*4d9fdb46SRobert Mustacchi 
681*4d9fdb46SRobert Mustacchi     Dwarf_Half de_frame_cfa_col_number;
682*4d9fdb46SRobert Mustacchi     Dwarf_Half de_frame_same_value_number;
683*4d9fdb46SRobert Mustacchi     Dwarf_Half de_frame_undefined_value_number;
684*4d9fdb46SRobert Mustacchi 
685*4d9fdb46SRobert Mustacchi     unsigned char de_big_endian_object; /* Non-zero if
686*4d9fdb46SRobert Mustacchi         object being read is big-endian. */
687*4d9fdb46SRobert Mustacchi 
688*4d9fdb46SRobert Mustacchi     /*  Non-zero if dwarf_get_globals(), dwarf_get_funcs,
689*4d9fdb46SRobert Mustacchi         dwarf_get_types,dwarf_get_pubtypes,
690*4d9fdb46SRobert Mustacchi         dwarf_get_vars,dwarf_get_weaks should create
691*4d9fdb46SRobert Mustacchi         and return a special zero-die-offset for the
692*4d9fdb46SRobert Mustacchi         corresponding pubnames-style section CU header with
693*4d9fdb46SRobert Mustacchi         zero pubnames-style named DIEs.  In that case the
694*4d9fdb46SRobert Mustacchi         list returned will have an entry with a zero for
695*4d9fdb46SRobert Mustacchi         the die-offset (which is an impossible debug_info
696*4d9fdb46SRobert Mustacchi         die_offset). New March 2019.
697*4d9fdb46SRobert Mustacchi         See dwarf_return_empty_pubnames() */
698*4d9fdb46SRobert Mustacchi     unsigned char de_return_empty_pubnames;
699*4d9fdb46SRobert Mustacchi 
700*4d9fdb46SRobert Mustacchi     struct Dwarf_dbg_sect_s de_debug_sections[DWARF_MAX_DEBUG_SECTIONS];
701*4d9fdb46SRobert Mustacchi     unsigned de_debug_sections_total_entries; /* Number actually used. */
702*4d9fdb46SRobert Mustacchi 
703*4d9fdb46SRobert Mustacchi     struct Dwarf_Harmless_s de_harmless_errors;
70407dc1947SRichard Lowe 
705*4d9fdb46SRobert Mustacchi     struct Dwarf_Printf_Callback_Info_s  de_printf_callback;
706*4d9fdb46SRobert Mustacchi     void *   de_printf_callback_null_device_handle;
70707dc1947SRichard Lowe 
708*4d9fdb46SRobert Mustacchi     /*  Used in a tied dbg  to hold global info
709*4d9fdb46SRobert Mustacchi         on the tied object (DW_AT_dwo_id).
710*4d9fdb46SRobert Mustacchi         And for Type Unit signatures whether tied
711*4d9fdb46SRobert Mustacchi         or not. */
712*4d9fdb46SRobert Mustacchi     struct Dwarf_Tied_Data_s de_tied_data;
71307dc1947SRichard Lowe 
71449d3bc91SRichard Lowe };
71549d3bc91SRichard Lowe 
716*4d9fdb46SRobert Mustacchi /* New style. takes advantage of dwarfstrings capability.
717*4d9fdb46SRobert Mustacchi     This not a public function. */
718*4d9fdb46SRobert Mustacchi int _dwarf_printf(Dwarf_Debug dbg, const char * data);
719*4d9fdb46SRobert Mustacchi 
72049d3bc91SRichard Lowe typedef struct Dwarf_Chain_s *Dwarf_Chain;
72149d3bc91SRichard Lowe struct Dwarf_Chain_s {
72249d3bc91SRichard Lowe     void *ch_item;
723*4d9fdb46SRobert Mustacchi     int  ch_itemtype; /* Needed to dealloc chain contents */
72449d3bc91SRichard Lowe     Dwarf_Chain ch_next;
72549d3bc91SRichard Lowe };
72649d3bc91SRichard Lowe 
727*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Chain_o *Dwarf_Chain_2;
728*4d9fdb46SRobert Mustacchi struct Dwarf_Chain_o {
729*4d9fdb46SRobert Mustacchi     Dwarf_Off ch_item;
730*4d9fdb46SRobert Mustacchi     Dwarf_Chain_2 ch_next;
731*4d9fdb46SRobert Mustacchi };
73249d3bc91SRichard Lowe 
73349d3bc91SRichard Lowe     /* Size of cu header version stamp field. */
734*4d9fdb46SRobert Mustacchi #define CU_VERSION_STAMP_SIZE   DWARF_HALF_SIZE
73549d3bc91SRichard Lowe 
73649d3bc91SRichard Lowe     /* Size of cu header address size field. */
737*4d9fdb46SRobert Mustacchi #define CU_ADDRESS_SIZE_SIZE    sizeof(Dwarf_Small)
73849d3bc91SRichard Lowe 
73949d3bc91SRichard Lowe #define ORIGINAL_DWARF_OFFSET_SIZE  4
740*4d9fdb46SRobert Mustacchi /*  The DISTINGUISHED VALUE is 4 byte value defined by DWARF
741*4d9fdb46SRobert Mustacchi     since DWARF3. */
74249d3bc91SRichard Lowe #define DISTINGUISHED_VALUE  0xffffffff
74349d3bc91SRichard Lowe #define DISTINGUISHED_VALUE_OFFSET_SIZE 8
744*4d9fdb46SRobert Mustacchi #define DISTINGUISHED_VALUE_ARRAY(x)  char x[4] = { 0xff,0xff,0xff,0xff }
74549d3bc91SRichard Lowe 
746*4d9fdb46SRobert Mustacchi 
747*4d9fdb46SRobert Mustacchi int _dwarf_ignorethissection(const char *scn_name);
748*4d9fdb46SRobert Mustacchi 
749*4d9fdb46SRobert Mustacchi /*  We don't load the sections until they are needed. This function is
750*4d9fdb46SRobert Mustacchi     used to load the section.  */
75149d3bc91SRichard Lowe int _dwarf_load_section(Dwarf_Debug,
75207dc1947SRichard Lowe     struct Dwarf_Section_s *,
75307dc1947SRichard Lowe     Dwarf_Error *);
754*4d9fdb46SRobert Mustacchi 
755*4d9fdb46SRobert Mustacchi void _dwarf_dealloc_rnglists_context(Dwarf_Debug dbg);
756*4d9fdb46SRobert Mustacchi void _dwarf_dealloc_loclists_context(Dwarf_Debug dbg);
757*4d9fdb46SRobert Mustacchi 
758*4d9fdb46SRobert Mustacchi int _dwarf_get_string_base_attr_value(Dwarf_Debug dbg,
759*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context,
760*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *sbase_out,
761*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
762*4d9fdb46SRobert Mustacchi 
763*4d9fdb46SRobert Mustacchi int _dwarf_extract_string_offset_via_str_offsets(Dwarf_Debug dbg,
764*4d9fdb46SRobert Mustacchi     Dwarf_Small *data_ptr,
765*4d9fdb46SRobert Mustacchi     Dwarf_Small *end_data_ptr,
766*4d9fdb46SRobert Mustacchi     Dwarf_Half   attrnum,
767*4d9fdb46SRobert Mustacchi     Dwarf_Half   attrform,
768*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
769*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *str_sect_offset_out,
770*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
771*4d9fdb46SRobert Mustacchi 
772*4d9fdb46SRobert Mustacchi 
773*4d9fdb46SRobert Mustacchi int _dwarf_extract_address_from_debug_addr(Dwarf_Debug dbg,
774*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context,
775*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index,
776*4d9fdb46SRobert Mustacchi     Dwarf_Addr *addr_out,
777*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
778*4d9fdb46SRobert Mustacchi 
779*4d9fdb46SRobert Mustacchi int _dwarf_get_base_and_size_given_signature(
780*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context *context,
781*4d9fdb46SRobert Mustacchi     Dwarf_Sig8 *signature_in,
782*4d9fdb46SRobert Mustacchi     /* xu_sect_index means DW_SECT_info etc. */
783*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned xu_sect_index,
784*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *base_out,
785*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *size_out,
786*4d9fdb46SRobert Mustacchi     Dwarf_Error *err);
787*4d9fdb46SRobert Mustacchi 
788*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_cu_index(Dwarf_Debug dbg);
789*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_tu_index(Dwarf_Debug dbg);
790*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_file_has_debug_fission_index(Dwarf_Debug dbg);
791*4d9fdb46SRobert Mustacchi 
792*4d9fdb46SRobert Mustacchi /* This should only be called on a CU. Never a TU. */
793*4d9fdb46SRobert Mustacchi int _dwarf_get_debugfission_for_offset(Dwarf_Debug dbg,
794*4d9fdb46SRobert Mustacchi     Dwarf_Off   offset_wanted,
795*4d9fdb46SRobert Mustacchi     const char *keytype, /* "cu" or "tu" */
796*4d9fdb46SRobert Mustacchi     Dwarf_Debug_Fission_Per_CU *  percu_out,
797*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
798*4d9fdb46SRobert Mustacchi 
799*4d9fdb46SRobert Mustacchi /* whichone: must be a valid DW_SECT* macro value. */
800*4d9fdb46SRobert Mustacchi Dwarf_Unsigned _dwarf_get_dwp_extra_offset(
801*4d9fdb46SRobert Mustacchi     struct Dwarf_Debug_Fission_Per_CU_s* dwp,
802*4d9fdb46SRobert Mustacchi     unsigned whichone, Dwarf_Unsigned * size);
803*4d9fdb46SRobert Mustacchi 
804*4d9fdb46SRobert Mustacchi /*  This will look into the tied Dwarf_Debug
805*4d9fdb46SRobert Mustacchi     to which should have a skeleton CU DIE
806*4d9fdb46SRobert Mustacchi     and an addr_base and also have the .debug_addr
807*4d9fdb46SRobert Mustacchi     section. */
808*4d9fdb46SRobert Mustacchi 
809*4d9fdb46SRobert Mustacchi int _dwarf_get_addr_from_tied(Dwarf_Debug dbg,
810*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context,
811*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned addrindex,
812*4d9fdb46SRobert Mustacchi     Dwarf_Addr *addr_out,
813*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
814*4d9fdb46SRobert Mustacchi 
815*4d9fdb46SRobert Mustacchi 
816*4d9fdb46SRobert Mustacchi int _dwarf_get_fission_addition_die(Dwarf_Die die, int dw_sect_index,
817*4d9fdb46SRobert Mustacchi    Dwarf_Unsigned* offset, Dwarf_Unsigned*size,
818*4d9fdb46SRobert Mustacchi    Dwarf_Error *error);
819*4d9fdb46SRobert Mustacchi 
820*4d9fdb46SRobert Mustacchi int _dwarf_get_addr_index_itself(int theform,
821*4d9fdb46SRobert Mustacchi     Dwarf_Small *info_ptr,
822*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg,
823*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
824*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *val_out,
825*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
826*4d9fdb46SRobert Mustacchi Dwarf_Bool _dwarf_addr_form_is_indexed(int form);
827*4d9fdb46SRobert Mustacchi 
828*4d9fdb46SRobert Mustacchi int
829*4d9fdb46SRobert Mustacchi _dwarf_search_for_signature(Dwarf_Debug dbg,
830*4d9fdb46SRobert Mustacchi    Dwarf_Sig8 sig,
831*4d9fdb46SRobert Mustacchi    Dwarf_CU_Context *context_out,
832*4d9fdb46SRobert Mustacchi    Dwarf_Error *error);
833*4d9fdb46SRobert Mustacchi 
834*4d9fdb46SRobert Mustacchi 
835*4d9fdb46SRobert Mustacchi void _dwarf_tied_destroy_free_node(void *node);
836*4d9fdb46SRobert Mustacchi void _dwarf_destroy_group_map(Dwarf_Debug dbg);
837*4d9fdb46SRobert Mustacchi 
838*4d9fdb46SRobert Mustacchi int _dwarf_section_get_target_group(Dwarf_Debug dbg,
839*4d9fdb46SRobert Mustacchi     unsigned   obj_section_index,
840*4d9fdb46SRobert Mustacchi     unsigned * groupnumber,
841*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error);
842*4d9fdb46SRobert Mustacchi 
843*4d9fdb46SRobert Mustacchi int _dwarf_dwo_groupnumber_given_name(
844*4d9fdb46SRobert Mustacchi     const char *name,
845*4d9fdb46SRobert Mustacchi     unsigned *grpnum_out);
846*4d9fdb46SRobert Mustacchi 
847*4d9fdb46SRobert Mustacchi int _dwarf_section_get_target_group_from_map(Dwarf_Debug dbg,
848*4d9fdb46SRobert Mustacchi     unsigned   obj_section_index,
849*4d9fdb46SRobert Mustacchi     unsigned * groupnumber_out,
850*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Error    * error);
851*4d9fdb46SRobert Mustacchi 
852*4d9fdb46SRobert Mustacchi int _dwarf_insert_in_group_map(Dwarf_Debug dbg,
853*4d9fdb46SRobert Mustacchi     unsigned groupnum,
854*4d9fdb46SRobert Mustacchi     unsigned section_index,
855*4d9fdb46SRobert Mustacchi     const char *name,
856*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
857*4d9fdb46SRobert Mustacchi 
858*4d9fdb46SRobert Mustacchi /* returns TRUE/FALSE: meaning this section name is in
859*4d9fdb46SRobert Mustacchi    map for this groupnum  or not.*/
860*4d9fdb46SRobert Mustacchi int _dwarf_section_in_group_by_name(Dwarf_Debug dbg,
861*4d9fdb46SRobert Mustacchi     const char * scn_name,
862*4d9fdb46SRobert Mustacchi     unsigned groupnum);
863*4d9fdb46SRobert Mustacchi 
864*4d9fdb46SRobert Mustacchi int
865*4d9fdb46SRobert Mustacchi _dwarf_next_cu_header_internal(Dwarf_Debug dbg,
866*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_info,
867*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * cu_header_length,
868*4d9fdb46SRobert Mustacchi     Dwarf_Half * version_stamp,
869*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * abbrev_offset,
870*4d9fdb46SRobert Mustacchi     Dwarf_Half * address_size,
871*4d9fdb46SRobert Mustacchi     Dwarf_Half * offset_size,
872*4d9fdb46SRobert Mustacchi     Dwarf_Half * extension_size,
873*4d9fdb46SRobert Mustacchi     Dwarf_Sig8 * signature,
874*4d9fdb46SRobert Mustacchi     Dwarf_Bool * has_signature,
875*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *typeoffset,
876*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * next_cu_offset,
877*4d9fdb46SRobert Mustacchi     Dwarf_Half     * header_cu_type,
878*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
879*4d9fdb46SRobert Mustacchi 
880*4d9fdb46SRobert Mustacchi /* Relates to .debug_addr */
881*4d9fdb46SRobert Mustacchi int _dwarf_look_in_local_and_tied(Dwarf_Half attr_form,
882*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context,
883*4d9fdb46SRobert Mustacchi     Dwarf_Small *info_ptr,
884*4d9fdb46SRobert Mustacchi     Dwarf_Addr *return_addr,
885*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
886*4d9fdb46SRobert Mustacchi 
887*4d9fdb46SRobert Mustacchi int _dwarf_get_ranges_base_attr_from_tied(Dwarf_Debug dbg,
888*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context,
889*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * ranges_base_out,
890*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * addr_base_out,
891*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error);
892*4d9fdb46SRobert Mustacchi 
893*4d9fdb46SRobert Mustacchi int _dwarf_get_string_from_tied(Dwarf_Debug dbg, Dwarf_Unsigned offset,
894*4d9fdb46SRobert Mustacchi     char **return_str, Dwarf_Error*error);
895*4d9fdb46SRobert Mustacchi 
896*4d9fdb46SRobert Mustacchi int _dwarf_valid_form_we_know(Dwarf_Unsigned at_form,
897*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned at_name);
898*4d9fdb46SRobert Mustacchi int _dwarf_extract_local_debug_str_string_given_offset(Dwarf_Debug dbg,
899*4d9fdb46SRobert Mustacchi     unsigned attrform,
900*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset,
901*4d9fdb46SRobert Mustacchi     char ** return_str,
902*4d9fdb46SRobert Mustacchi     Dwarf_Error *  error);
903*4d9fdb46SRobert Mustacchi 
904*4d9fdb46SRobert Mustacchi int _dwarf_file_name_is_full_path(Dwarf_Small  *fname);
905*4d9fdb46SRobert Mustacchi 
906*4d9fdb46SRobert Mustacchi /*  This is an elf-only extension to
907*4d9fdb46SRobert Mustacchi     get SHF_COMPRESSED flag from sh_flags.
908*4d9fdb46SRobert Mustacchi     if pointer not set (which is normal for non-elf objects)
909*4d9fdb46SRobert Mustacchi     it is fine.  */
910*4d9fdb46SRobert Mustacchi typedef int (*_dwarf_get_elf_flags_func_ptr_type)(
911*4d9fdb46SRobert Mustacchi     void* obj_in,
912*4d9fdb46SRobert Mustacchi     Dwarf_Half section_index,
913*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *flags_out,
914*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *addralign_out,
915*4d9fdb46SRobert Mustacchi     int *error);
916*4d9fdb46SRobert Mustacchi extern _dwarf_get_elf_flags_func_ptr_type _dwarf_get_elf_flags_func_ptr;
917*4d9fdb46SRobert Mustacchi 
918*4d9fdb46SRobert Mustacchi /* This is libelf access to Elf object. */
919*4d9fdb46SRobert Mustacchi extern int _dwarf_elf_setup(int fd,
920*4d9fdb46SRobert Mustacchi     char *true_path_out_buffer,
921*4d9fdb46SRobert Mustacchi     unsigned ftype,
922*4d9fdb46SRobert Mustacchi     unsigned endian,
923*4d9fdb46SRobert Mustacchi     unsigned offsetsize,
924*4d9fdb46SRobert Mustacchi     size_t filesize,
925*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned access,
926*4d9fdb46SRobert Mustacchi     unsigned groupnumber,
927*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
928*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
929*4d9fdb46SRobert Mustacchi     Dwarf_Debug *dbg,Dwarf_Error *error);
930*4d9fdb46SRobert Mustacchi 
931*4d9fdb46SRobert Mustacchi /*  This is non-libelf Elf access */
932*4d9fdb46SRobert Mustacchi extern int
933*4d9fdb46SRobert Mustacchi _dwarf_elf_nlsetup(int fd,
934*4d9fdb46SRobert Mustacchi     char *true_path,
935*4d9fdb46SRobert Mustacchi     unsigned ftype,
936*4d9fdb46SRobert Mustacchi     unsigned endian,
937*4d9fdb46SRobert Mustacchi     unsigned offsetsize,
938*4d9fdb46SRobert Mustacchi     size_t filesize,
939*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned access,
940*4d9fdb46SRobert Mustacchi     unsigned groupnumber,
941*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
942*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
943*4d9fdb46SRobert Mustacchi     Dwarf_Debug *dbg,Dwarf_Error *error);
944*4d9fdb46SRobert Mustacchi void _dwarf_destruct_elf_nlaccess(struct Dwarf_Obj_Access_Interface_s *aip);
945*4d9fdb46SRobert Mustacchi 
946*4d9fdb46SRobert Mustacchi extern int _dwarf_macho_setup(int fd,
947*4d9fdb46SRobert Mustacchi     char *true_path,
948*4d9fdb46SRobert Mustacchi     unsigned ftype,
949*4d9fdb46SRobert Mustacchi     unsigned endian,
950*4d9fdb46SRobert Mustacchi     unsigned offsetsize,
951*4d9fdb46SRobert Mustacchi     size_t filesize,
952*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned access,
953*4d9fdb46SRobert Mustacchi     unsigned groupnumber,
954*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
955*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
956*4d9fdb46SRobert Mustacchi     Dwarf_Debug *dbg,Dwarf_Error *error);
957*4d9fdb46SRobert Mustacchi void _dwarf_destruct_macho_access(struct Dwarf_Obj_Access_Interface_s *aip);
958*4d9fdb46SRobert Mustacchi 
959*4d9fdb46SRobert Mustacchi extern int _dwarf_pe_setup(int fd,
960*4d9fdb46SRobert Mustacchi     char *path,
961*4d9fdb46SRobert Mustacchi     unsigned ftype,
962*4d9fdb46SRobert Mustacchi     unsigned endian,
963*4d9fdb46SRobert Mustacchi     unsigned offsetsize,
964*4d9fdb46SRobert Mustacchi     size_t filesize,
965*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned access,
966*4d9fdb46SRobert Mustacchi     unsigned groupnumber,
967*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
968*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
969*4d9fdb46SRobert Mustacchi     Dwarf_Debug *dbg,Dwarf_Error *error);
970*4d9fdb46SRobert Mustacchi void _dwarf_destruct_pe_access(struct Dwarf_Obj_Access_Interface_s *aip);
971*4d9fdb46SRobert Mustacchi 
972*4d9fdb46SRobert Mustacchi void _dwarf_create_address_size_dwarf_error(Dwarf_Debug dbg,
973*4d9fdb46SRobert Mustacchi     Dwarf_Error *error,
974*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned addrsize,
975*4d9fdb46SRobert Mustacchi     int errcode,const char *errname);
976*4d9fdb46SRobert Mustacchi 
977*4d9fdb46SRobert Mustacchi 
978*4d9fdb46SRobert Mustacchi extern Dwarf_Bool _dwarf_allow_formudata(unsigned form);
979*4d9fdb46SRobert Mustacchi extern int _dwarf_formudata_internal(Dwarf_Debug dbg,
980*4d9fdb46SRobert Mustacchi     unsigned form,
981*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr data,
982*4d9fdb46SRobert Mustacchi     Dwarf_Byte_Ptr section_end,
983*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *return_uval,
984*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *bytes_read,
985*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
986*4d9fdb46SRobert Mustacchi 
987*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_info_section_start_ptr(Dwarf_CU_Context context, Dwarf_Unsigned *section_len_out);
988*4d9fdb46SRobert Mustacchi 
989*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_info_section_end_ptr(Dwarf_CU_Context context);
990*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr _dwarf_calculate_abbrev_section_end_ptr(Dwarf_CU_Context context);
991*4d9fdb46SRobert Mustacchi 
992*4d9fdb46SRobert Mustacchi int _dwarf_formblock_internal(Dwarf_Debug dbg,
993*4d9fdb46SRobert Mustacchi     Dwarf_Attribute attr,
994*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context cu_context,
995*4d9fdb46SRobert Mustacchi     Dwarf_Block * return_block,
996*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
997*4d9fdb46SRobert Mustacchi 
998*4d9fdb46SRobert Mustacchi int _dwarf_extract_data16(Dwarf_Debug dbg,
999*4d9fdb46SRobert Mustacchi     Dwarf_Small *data,
1000*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start,
1001*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end,
1002*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16  * returned_val,
1003*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
1004*4d9fdb46SRobert Mustacchi 
1005*4d9fdb46SRobert Mustacchi 
1006*4d9fdb46SRobert Mustacchi void _dwarf_dumpsig(const char *msg, Dwarf_Sig8 *sig,int lineno);
1007