1*fae548d3Szrj /* dwarf.h - DWARF support header file
2*fae548d3Szrj Copyright (C) 2005-2020 Free Software Foundation, Inc.
3*fae548d3Szrj
4*fae548d3Szrj This file is part of GNU Binutils.
5*fae548d3Szrj
6*fae548d3Szrj This program is free software; you can redistribute it and/or modify
7*fae548d3Szrj it under the terms of the GNU General Public License as published by
8*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or
9*fae548d3Szrj (at your option) any later version.
10*fae548d3Szrj
11*fae548d3Szrj This program is distributed in the hope that it will be useful,
12*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
13*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*fae548d3Szrj GNU General Public License for more details.
15*fae548d3Szrj
16*fae548d3Szrj You should have received a copy of the GNU General Public License
17*fae548d3Szrj along with this program; if not, write to the Free Software
18*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19*fae548d3Szrj MA 02110-1301, USA. */
20*fae548d3Szrj
21*fae548d3Szrj #include "dwarf2.h" /* for enum dwarf_unit_type */
22*fae548d3Szrj
23*fae548d3Szrj typedef unsigned HOST_WIDEST_INT dwarf_vma;
24*fae548d3Szrj typedef HOST_WIDEST_INT dwarf_signed_vma;
25*fae548d3Szrj typedef unsigned HOST_WIDEST_INT dwarf_size_type;
26*fae548d3Szrj
27*fae548d3Szrj /* Structure found in the .debug_line section. */
28*fae548d3Szrj typedef struct
29*fae548d3Szrj {
30*fae548d3Szrj dwarf_vma li_length;
31*fae548d3Szrj unsigned short li_version;
32*fae548d3Szrj dwarf_vma li_prologue_length;
33*fae548d3Szrj unsigned char li_min_insn_length;
34*fae548d3Szrj unsigned char li_max_ops_per_insn;
35*fae548d3Szrj unsigned char li_default_is_stmt;
36*fae548d3Szrj int li_line_base;
37*fae548d3Szrj unsigned char li_line_range;
38*fae548d3Szrj unsigned char li_opcode_base;
39*fae548d3Szrj unsigned int li_offset_size;
40*fae548d3Szrj }
41*fae548d3Szrj DWARF2_Internal_LineInfo;
42*fae548d3Szrj
43*fae548d3Szrj /* Structure found in .debug_pubnames section. */
44*fae548d3Szrj typedef struct
45*fae548d3Szrj {
46*fae548d3Szrj dwarf_vma pn_length;
47*fae548d3Szrj unsigned short pn_version;
48*fae548d3Szrj dwarf_vma pn_offset;
49*fae548d3Szrj dwarf_vma pn_size;
50*fae548d3Szrj }
51*fae548d3Szrj DWARF2_Internal_PubNames;
52*fae548d3Szrj
53*fae548d3Szrj /* Structure found in .debug_info section. */
54*fae548d3Szrj typedef struct
55*fae548d3Szrj {
56*fae548d3Szrj dwarf_vma cu_length;
57*fae548d3Szrj unsigned short cu_version;
58*fae548d3Szrj dwarf_vma cu_abbrev_offset;
59*fae548d3Szrj unsigned char cu_pointer_size;
60*fae548d3Szrj enum dwarf_unit_type cu_unit_type;
61*fae548d3Szrj }
62*fae548d3Szrj DWARF2_Internal_CompUnit;
63*fae548d3Szrj
64*fae548d3Szrj /* Structure found in .debug_aranges section. */
65*fae548d3Szrj typedef struct
66*fae548d3Szrj {
67*fae548d3Szrj dwarf_vma ar_length;
68*fae548d3Szrj unsigned short ar_version;
69*fae548d3Szrj dwarf_vma ar_info_offset;
70*fae548d3Szrj unsigned char ar_pointer_size;
71*fae548d3Szrj unsigned char ar_segment_size;
72*fae548d3Szrj }
73*fae548d3Szrj DWARF2_Internal_ARange;
74*fae548d3Szrj
75*fae548d3Szrj /* N.B. The order here must match the order in debug_displays. */
76*fae548d3Szrj
77*fae548d3Szrj enum dwarf_section_display_enum
78*fae548d3Szrj {
79*fae548d3Szrj abbrev = 0,
80*fae548d3Szrj aranges,
81*fae548d3Szrj frame,
82*fae548d3Szrj info,
83*fae548d3Szrj line,
84*fae548d3Szrj pubnames,
85*fae548d3Szrj gnu_pubnames,
86*fae548d3Szrj eh_frame,
87*fae548d3Szrj macinfo,
88*fae548d3Szrj macro,
89*fae548d3Szrj str,
90*fae548d3Szrj line_str,
91*fae548d3Szrj loc,
92*fae548d3Szrj loclists,
93*fae548d3Szrj pubtypes,
94*fae548d3Szrj gnu_pubtypes,
95*fae548d3Szrj ranges,
96*fae548d3Szrj rnglists,
97*fae548d3Szrj static_func,
98*fae548d3Szrj static_vars,
99*fae548d3Szrj types,
100*fae548d3Szrj weaknames,
101*fae548d3Szrj gdb_index,
102*fae548d3Szrj debug_names,
103*fae548d3Szrj trace_info,
104*fae548d3Szrj trace_abbrev,
105*fae548d3Szrj trace_aranges,
106*fae548d3Szrj info_dwo,
107*fae548d3Szrj abbrev_dwo,
108*fae548d3Szrj types_dwo,
109*fae548d3Szrj line_dwo,
110*fae548d3Szrj loc_dwo,
111*fae548d3Szrj macro_dwo,
112*fae548d3Szrj macinfo_dwo,
113*fae548d3Szrj str_dwo,
114*fae548d3Szrj str_index,
115*fae548d3Szrj str_index_dwo,
116*fae548d3Szrj debug_addr,
117*fae548d3Szrj dwp_cu_index,
118*fae548d3Szrj dwp_tu_index,
119*fae548d3Szrj gnu_debuglink,
120*fae548d3Szrj gnu_debugaltlink,
121*fae548d3Szrj separate_debug_str,
122*fae548d3Szrj max
123*fae548d3Szrj };
124*fae548d3Szrj
125*fae548d3Szrj struct dwarf_section
126*fae548d3Szrj {
127*fae548d3Szrj /* A debug section has a different name when it's stored compressed
128*fae548d3Szrj or not. COMPRESSED_NAME and UNCOMPRESSED_NAME are the two
129*fae548d3Szrj possibilities. NAME is set to whichever one is used for this
130*fae548d3Szrj input file, as determined by load_debug_section(). */
131*fae548d3Szrj const char * uncompressed_name;
132*fae548d3Szrj const char * compressed_name;
133*fae548d3Szrj const char * name;
134*fae548d3Szrj /* If non-NULL then FILENAME is the name of the separate debug info
135*fae548d3Szrj file containing the section. */
136*fae548d3Szrj const char * filename;
137*fae548d3Szrj unsigned char * start;
138*fae548d3Szrj dwarf_vma address;
139*fae548d3Szrj dwarf_size_type size;
140*fae548d3Szrj enum dwarf_section_display_enum abbrev_sec;
141*fae548d3Szrj /* Used by clients to help them implement the reloc_at callback. */
142*fae548d3Szrj void * reloc_info;
143*fae548d3Szrj unsigned long num_relocs;
144*fae548d3Szrj /* A spare field for random use. */
145*fae548d3Szrj void * user_data;
146*fae548d3Szrj };
147*fae548d3Szrj
148*fae548d3Szrj /* A structure containing the name of a debug section
149*fae548d3Szrj and a pointer to a function that can decode it. */
150*fae548d3Szrj struct dwarf_section_display
151*fae548d3Szrj {
152*fae548d3Szrj struct dwarf_section section;
153*fae548d3Szrj int (* display) (struct dwarf_section *, void *);
154*fae548d3Szrj int * enabled;
155*fae548d3Szrj bfd_boolean relocate;
156*fae548d3Szrj };
157*fae548d3Szrj
158*fae548d3Szrj extern struct dwarf_section_display debug_displays [];
159*fae548d3Szrj
160*fae548d3Szrj /* This structure records the information that
161*fae548d3Szrj we extract from the.debug_info section. */
162*fae548d3Szrj typedef struct
163*fae548d3Szrj {
164*fae548d3Szrj unsigned int pointer_size;
165*fae548d3Szrj unsigned int offset_size;
166*fae548d3Szrj int dwarf_version;
167*fae548d3Szrj dwarf_vma cu_offset;
168*fae548d3Szrj dwarf_vma base_address;
169*fae548d3Szrj /* This field is filled in when reading the attribute DW_AT_GNU_addr_base and
170*fae548d3Szrj is used with the form DW_AT_GNU_FORM_addr_index. */
171*fae548d3Szrj dwarf_vma addr_base;
172*fae548d3Szrj /* This field is filled in when reading the attribute DW_AT_GNU_ranges_base and
173*fae548d3Szrj is used when calculating ranges. */
174*fae548d3Szrj dwarf_vma ranges_base;
175*fae548d3Szrj /* This is an array of offsets to the location list table. */
176*fae548d3Szrj dwarf_vma * loc_offsets;
177*fae548d3Szrj /* This is an array of offsets to the location view table. */
178*fae548d3Szrj dwarf_vma * loc_views;
179*fae548d3Szrj int * have_frame_base;
180*fae548d3Szrj unsigned int num_loc_offsets;
181*fae548d3Szrj unsigned int max_loc_offsets;
182*fae548d3Szrj unsigned int num_loc_views;
183*fae548d3Szrj /* List of .debug_ranges offsets seen in this .debug_info. */
184*fae548d3Szrj dwarf_vma * range_lists;
185*fae548d3Szrj unsigned int num_range_lists;
186*fae548d3Szrj unsigned int max_range_lists;
187*fae548d3Szrj }
188*fae548d3Szrj debug_info;
189*fae548d3Szrj
190*fae548d3Szrj typedef struct separate_info
191*fae548d3Szrj {
192*fae548d3Szrj void * handle; /* The pointer returned by open_debug_file(). */
193*fae548d3Szrj const char * filename;
194*fae548d3Szrj struct separate_info * next;
195*fae548d3Szrj } separate_info;
196*fae548d3Szrj
197*fae548d3Szrj extern separate_info * first_separate_info;
198*fae548d3Szrj
199*fae548d3Szrj extern unsigned int eh_addr_size;
200*fae548d3Szrj
201*fae548d3Szrj extern int do_debug_info;
202*fae548d3Szrj extern int do_debug_abbrevs;
203*fae548d3Szrj extern int do_debug_lines;
204*fae548d3Szrj extern int do_debug_pubnames;
205*fae548d3Szrj extern int do_debug_pubtypes;
206*fae548d3Szrj extern int do_debug_aranges;
207*fae548d3Szrj extern int do_debug_ranges;
208*fae548d3Szrj extern int do_debug_frames;
209*fae548d3Szrj extern int do_debug_frames_interp;
210*fae548d3Szrj extern int do_debug_macinfo;
211*fae548d3Szrj extern int do_debug_str;
212*fae548d3Szrj extern int do_debug_loc;
213*fae548d3Szrj extern int do_gdb_index;
214*fae548d3Szrj extern int do_trace_info;
215*fae548d3Szrj extern int do_trace_abbrevs;
216*fae548d3Szrj extern int do_trace_aranges;
217*fae548d3Szrj extern int do_debug_addr;
218*fae548d3Szrj extern int do_debug_cu_index;
219*fae548d3Szrj extern int do_wide;
220*fae548d3Szrj extern int do_debug_links;
221*fae548d3Szrj extern int do_follow_links;
222*fae548d3Szrj
223*fae548d3Szrj extern int dwarf_cutoff_level;
224*fae548d3Szrj extern unsigned long dwarf_start_die;
225*fae548d3Szrj
226*fae548d3Szrj extern int dwarf_check;
227*fae548d3Szrj
228*fae548d3Szrj extern void init_dwarf_regnames_by_elf_machine_code (unsigned int);
229*fae548d3Szrj extern void init_dwarf_regnames_by_bfd_arch_and_mach (enum bfd_architecture arch,
230*fae548d3Szrj unsigned long mach);
231*fae548d3Szrj
232*fae548d3Szrj extern bfd_boolean load_debug_section (enum dwarf_section_display_enum, void *);
233*fae548d3Szrj extern void free_debug_section (enum dwarf_section_display_enum);
234*fae548d3Szrj extern bfd_boolean load_separate_debug_files (void *, const char *);
235*fae548d3Szrj extern void close_debug_file (void *);
236*fae548d3Szrj extern void * open_debug_file (const char *);
237*fae548d3Szrj
238*fae548d3Szrj extern void free_debug_memory (void);
239*fae548d3Szrj
240*fae548d3Szrj extern void dwarf_select_sections_by_names (const char *);
241*fae548d3Szrj extern void dwarf_select_sections_by_letters (const char *);
242*fae548d3Szrj extern void dwarf_select_sections_all (void);
243*fae548d3Szrj
244*fae548d3Szrj extern unsigned int * find_cu_tu_set (void *, unsigned int);
245*fae548d3Szrj
246*fae548d3Szrj extern void * cmalloc (size_t, size_t);
247*fae548d3Szrj extern void * xcalloc2 (size_t, size_t);
248*fae548d3Szrj extern void * xcmalloc (size_t, size_t);
249*fae548d3Szrj extern void * xcrealloc (void *, size_t, size_t);
250*fae548d3Szrj
251*fae548d3Szrj /* A callback into the client. Returns TRUE if there is a
252*fae548d3Szrj relocation against the given debug section at the given
253*fae548d3Szrj offset. */
254*fae548d3Szrj extern bfd_boolean reloc_at (struct dwarf_section *, dwarf_vma);
255*fae548d3Szrj
256*fae548d3Szrj extern dwarf_vma read_leb128 (unsigned char *, const unsigned char *const,
257*fae548d3Szrj bfd_boolean, unsigned int *, int *);
258*fae548d3Szrj
259*fae548d3Szrj #if HAVE_LIBDEBUGINFOD
260*fae548d3Szrj extern unsigned char * get_build_id (void *);
261*fae548d3Szrj #endif
262*fae548d3Szrj
263*fae548d3Szrj static inline void
report_leb_status(int status)264*fae548d3Szrj report_leb_status (int status)
265*fae548d3Szrj {
266*fae548d3Szrj if ((status & 1) != 0)
267*fae548d3Szrj error (_("LEB end of data\n"));
268*fae548d3Szrj else if ((status & 2) != 0)
269*fae548d3Szrj error (_("LEB value too large\n"));
270*fae548d3Szrj }
271*fae548d3Szrj
272*fae548d3Szrj #define SKIP_ULEB(start, end) \
273*fae548d3Szrj do \
274*fae548d3Szrj { \
275*fae548d3Szrj unsigned int _len; \
276*fae548d3Szrj read_leb128 (start, end, FALSE, &_len, NULL); \
277*fae548d3Szrj start += _len; \
278*fae548d3Szrj } while (0)
279*fae548d3Szrj
280*fae548d3Szrj #define SKIP_SLEB(start, end) \
281*fae548d3Szrj do \
282*fae548d3Szrj { \
283*fae548d3Szrj unsigned int _len; \
284*fae548d3Szrj read_leb128 (start, end, TRUE, &_len, NULL); \
285*fae548d3Szrj start += _len; \
286*fae548d3Szrj } while (0)
287*fae548d3Szrj
288*fae548d3Szrj #define READ_ULEB(var, start, end) \
289*fae548d3Szrj do \
290*fae548d3Szrj { \
291*fae548d3Szrj dwarf_vma _val; \
292*fae548d3Szrj unsigned int _len; \
293*fae548d3Szrj int _status; \
294*fae548d3Szrj \
295*fae548d3Szrj _val = read_leb128 (start, end, FALSE, &_len, &_status); \
296*fae548d3Szrj start += _len; \
297*fae548d3Szrj (var) = _val; \
298*fae548d3Szrj if ((var) != _val) \
299*fae548d3Szrj _status |= 2; \
300*fae548d3Szrj report_leb_status (_status); \
301*fae548d3Szrj } while (0)
302*fae548d3Szrj
303*fae548d3Szrj #define READ_SLEB(var, start, end) \
304*fae548d3Szrj do \
305*fae548d3Szrj { \
306*fae548d3Szrj dwarf_signed_vma _val; \
307*fae548d3Szrj unsigned int _len; \
308*fae548d3Szrj int _status; \
309*fae548d3Szrj \
310*fae548d3Szrj _val = read_leb128 (start, end, TRUE, &_len, &_status); \
311*fae548d3Szrj start += _len; \
312*fae548d3Szrj (var) = _val; \
313*fae548d3Szrj if ((var) != _val) \
314*fae548d3Szrj _status |= 2; \
315*fae548d3Szrj report_leb_status (_status); \
316*fae548d3Szrj } while (0)
317