xref: /dflybsd-src/contrib/binutils-2.34/binutils/dwarf.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
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