Coverage Report

Created: 2023-06-29 07:03

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