]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/dwarf1.c
[PATCH] fix windmc typedef bug
[thirdparty/binutils-gdb.git] / bfd / dwarf1.c
CommitLineData
252b5132 1/* DWARF 1 find nearest line (_bfd_dwarf1_find_nearest_line).
b3adc24a 2 Copyright (C) 1998-2020 Free Software Foundation, Inc.
252b5132 3
116c20d2 4 Written by Gavin Romig-Koch of Cygnus Solutions (gavin@cygnus.com).
252b5132 5
116c20d2 6 This file is part of BFD.
252b5132 7
116c20d2
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
cd123cb7 10 the Free Software Foundation; either version 3 of the License, or (at
116c20d2 11 your option) any later version.
252b5132 12
116c20d2
NC
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
252b5132 17
116c20d2
NC
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
cd123cb7
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132 22
252b5132 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
252b5132
RH
25#include "libiberty.h"
26#include "libbfd.h"
27#include "elf-bfd.h"
28#include "elf/dwarf.h"
29
98591c73 30/* dwarf1_debug is the starting point for all dwarf1 info. */
252b5132 31
116c20d2
NC
32struct dwarf1_debug
33{
98591c73 34 /* The bfd we are working with. */
252b5132
RH
35 bfd* abfd;
36
ab1579fd
NS
37 /* Pointer to the symbol table. */
38 asymbol** syms;
39
98591c73 40 /* List of already parsed compilation units. */
252b5132
RH
41 struct dwarf1_unit* lastUnit;
42
98591c73
KH
43 /* The buffer for the .debug section.
44 Zero indicates that the .debug section failed to load. */
ab1579fd 45 bfd_byte *debug_section;
252b5132 46
98591c73 47 /* Pointer to the end of the .debug_info section memory buffer. */
ab1579fd 48 bfd_byte *debug_section_end;
252b5132 49
98591c73 50 /* The buffer for the .line section. */
ab1579fd 51 bfd_byte *line_section;
252b5132 52
98591c73 53 /* End of that buffer. */
ab1579fd 54 bfd_byte *line_section_end;
252b5132 55
98591c73 56 /* The current or next unread die within the .debug section. */
ab1579fd 57 bfd_byte *currentDie;
252b5132
RH
58};
59
98591c73 60/* One dwarf1_unit for each parsed compilation unit die. */
252b5132 61
116c20d2
NC
62struct dwarf1_unit
63{
98591c73 64 /* Linked starting from stash->lastUnit. */
252b5132
RH
65 struct dwarf1_unit* prev;
66
98591c73 67 /* Name of the compilation unit. */
ab1579fd 68 char *name;
252b5132 69
98591c73 70 /* The highest and lowest address used in the compilation unit. */
252b5132
RH
71 unsigned long low_pc;
72 unsigned long high_pc;
73
116c20d2 74 /* Does this unit have a statement list? */
252b5132
RH
75 int has_stmt_list;
76
98591c73 77 /* If any, the offset of the line number table in the .line section. */
252b5132
RH
78 unsigned long stmt_list_offset;
79
98591c73 80 /* If non-zero, a pointer to the first child of this unit. */
ab1579fd 81 bfd_byte *first_child;
252b5132 82
116c20d2 83 /* How many line entries? */
252b5132
RH
84 unsigned long line_count;
85
98591c73 86 /* The decoded line number table (line_count entries). */
252b5132
RH
87 struct linenumber* linenumber_table;
88
98591c73 89 /* The list of functions in this unit. */
252b5132
RH
90 struct dwarf1_func* func_list;
91};
92
252b5132
RH
93/* One dwarf1_func for each parsed function die. */
94
116c20d2
NC
95struct dwarf1_func
96{
98591c73 97 /* Linked starting from aUnit->func_list. */
252b5132 98 struct dwarf1_func* prev;
98591c73
KH
99
100 /* Name of function. */
252b5132 101 char* name;
98591c73
KH
102
103 /* The highest and lowest address used in the compilation unit. */
252b5132
RH
104 unsigned long low_pc;
105 unsigned long high_pc;
106};
107
98591c73 108/* Used to return info about a parsed die. */
116c20d2
NC
109struct die_info
110{
252b5132
RH
111 unsigned long length;
112 unsigned long sibling;
113 unsigned long low_pc;
114 unsigned long high_pc;
115 unsigned long stmt_list_offset;
98591c73
KH
116
117 char* name;
118
252b5132
RH
119 int has_stmt_list;
120
121 unsigned short tag;
122};
123
98591c73 124/* Parsed line number information. */
116c20d2
NC
125struct linenumber
126{
98591c73 127 /* First address in the line. */
252b5132
RH
128 unsigned long addr;
129
98591c73 130 /* The line number. */
252b5132
RH
131 unsigned long linenumber;
132};
133
98591c73 134/* Find the form of an attr, from the attr field. */
116c20d2 135#define FORM_FROM_ATTR(attr) ((attr) & 0xF) /* Implicitly specified. */
a7b97311 136
252b5132 137/* Return a newly allocated dwarf1_unit. It should be cleared and
98591c73 138 then attached into the 'stash' at 'stash->lastUnit'. */
252b5132
RH
139
140static struct dwarf1_unit*
116c20d2 141alloc_dwarf1_unit (struct dwarf1_debug* stash)
252b5132 142{
986f0783 143 size_t amt = sizeof (struct dwarf1_unit);
dc810e39 144
a50b1753 145 struct dwarf1_unit* x = (struct dwarf1_unit *) bfd_zalloc (stash->abfd, amt);
ab1579fd
NS
146 if (x)
147 {
148 x->prev = stash->lastUnit;
149 stash->lastUnit = x;
150 }
252b5132
RH
151
152 return x;
153}
154
155/* Return a newly allocated dwarf1_func. It must be cleared and
98591c73 156 attached into 'aUnit' at 'aUnit->func_list'. */
252b5132 157
116c20d2
NC
158static struct dwarf1_func *
159alloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
252b5132 160{
986f0783 161 size_t amt = sizeof (struct dwarf1_func);
dc810e39 162
a50b1753 163 struct dwarf1_func* x = (struct dwarf1_func *) bfd_zalloc (stash->abfd, amt);
ab1579fd
NS
164 if (x)
165 {
166 x->prev = aUnit->func_list;
167 aUnit->func_list = x;
168 }
98591c73 169
252b5132
RH
170 return x;
171}
172
173/* parse_die - parse a Dwarf1 die.
174 Parse the die starting at 'aDiePtr' into 'aDieInfo'.
175 'abfd' must be the bfd from which the section that 'aDiePtr'
98591c73 176 points to was pulled from.
252b5132 177
b34976b6 178 Return FALSE if the die is invalidly formatted; TRUE otherwise. */
252b5132 179
b34976b6 180static bfd_boolean
07d6d2b8 181parse_die (bfd * abfd,
116c20d2 182 struct die_info * aDieInfo,
07d6d2b8
AM
183 bfd_byte * aDiePtr,
184 bfd_byte * aDiePtrEnd)
252b5132 185{
ab1579fd
NS
186 bfd_byte *this_die = aDiePtr;
187 bfd_byte *xptr = this_die;
252b5132 188
116c20d2 189 memset (aDieInfo, 0, sizeof (* aDieInfo));
252b5132 190
98591c73 191 /* First comes the length. */
1da5c9a4
AM
192 if (xptr + 4 > aDiePtrEnd)
193 return FALSE;
194 aDieInfo->length = bfd_get_32 (abfd, xptr);
252b5132 195 xptr += 4;
bb731fb6 196 if (aDieInfo->length == 0
1da5c9a4 197 || this_die + aDieInfo->length > aDiePtrEnd)
b34976b6 198 return FALSE;
1da5c9a4 199 aDiePtrEnd = this_die + aDieInfo->length;
252b5132
RH
200 if (aDieInfo->length < 6)
201 {
98591c73 202 /* Just padding bytes. */
252b5132 203 aDieInfo->tag = TAG_padding;
b34976b6 204 return TRUE;
252b5132
RH
205 }
206
98591c73 207 /* Then the tag. */
1da5c9a4
AM
208 if (xptr + 2 > aDiePtrEnd)
209 return FALSE;
210 aDieInfo->tag = bfd_get_16 (abfd, xptr);
252b5132 211 xptr += 2;
98591c73
KH
212
213 /* Then the attributes. */
1da5c9a4 214 while (xptr + 2 <= aDiePtrEnd)
252b5132 215 {
eef10466 216 unsigned int block_len;
252b5132 217 unsigned short attr;
98591c73
KH
218
219 /* Parse the attribute based on its form. This section
07d6d2b8 220 must handle all dwarf1 forms, but need only handle the
98591c73 221 actual attributes that we care about. */
1da5c9a4 222 attr = bfd_get_16 (abfd, xptr);
252b5132 223 xptr += 2;
98591c73 224
252b5132
RH
225 switch (FORM_FROM_ATTR (attr))
226 {
227 case FORM_DATA2:
228 xptr += 2;
229 break;
230 case FORM_DATA4:
231 case FORM_REF:
1da5c9a4 232 if (xptr + 4 <= aDiePtrEnd)
252b5132 233 {
1da5c9a4
AM
234 if (attr == AT_sibling)
235 aDieInfo->sibling = bfd_get_32 (abfd, xptr);
236 else if (attr == AT_stmt_list)
237 {
238 aDieInfo->stmt_list_offset = bfd_get_32 (abfd, xptr);
239 aDieInfo->has_stmt_list = 1;
240 }
252b5132
RH
241 }
242 xptr += 4;
243 break;
244 case FORM_DATA8:
245 xptr += 8;
246 break;
247 case FORM_ADDR:
1da5c9a4
AM
248 if (xptr + 4 <= aDiePtrEnd)
249 {
250 if (attr == AT_low_pc)
251 aDieInfo->low_pc = bfd_get_32 (abfd, xptr);
252 else if (attr == AT_high_pc)
253 aDieInfo->high_pc = bfd_get_32 (abfd, xptr);
254 }
252b5132
RH
255 xptr += 4;
256 break;
257 case FORM_BLOCK2:
1da5c9a4 258 if (xptr + 2 <= aDiePtrEnd)
eef10466
NC
259 {
260 block_len = bfd_get_16 (abfd, xptr);
261 if (xptr + block_len > aDiePtrEnd
262 || xptr + block_len < xptr)
263 return FALSE;
264 xptr += block_len;
265 }
1da5c9a4 266 xptr += 2;
252b5132
RH
267 break;
268 case FORM_BLOCK4:
1da5c9a4 269 if (xptr + 4 <= aDiePtrEnd)
eef10466
NC
270 {
271 block_len = bfd_get_32 (abfd, xptr);
272 if (xptr + block_len > aDiePtrEnd
273 || xptr + block_len < xptr)
274 return FALSE;
275 xptr += block_len;
276 }
1da5c9a4 277 xptr += 4;
252b5132
RH
278 break;
279 case FORM_STRING:
280 if (attr == AT_name)
20b1d3e3 281 aDieInfo->name = (char *) xptr;
1da5c9a4 282 xptr += strnlen ((char *) xptr, aDiePtrEnd - xptr) + 1;
252b5132
RH
283 break;
284 }
285 }
286
b34976b6 287 return TRUE;
252b5132
RH
288}
289
290/* Parse a dwarf1 line number table for 'aUnit->stmt_list_offset'
b34976b6
AM
291 into 'aUnit->linenumber_table'. Return FALSE if an error
292 occurs; TRUE otherwise. */
98591c73 293
b34976b6 294static bfd_boolean
116c20d2 295parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
252b5132 296{
ab1579fd 297 bfd_byte *xptr;
252b5132 298
98591c73 299 /* Load the ".line" section from the bfd if we haven't already. */
252b5132
RH
300 if (stash->line_section == 0)
301 {
302 asection *msec;
dc810e39 303 bfd_size_type size;
98591c73 304
252b5132
RH
305 msec = bfd_get_section_by_name (stash->abfd, ".line");
306 if (! msec)
b34976b6 307 return FALSE;
98591c73 308
eea6121a 309 size = msec->rawsize ? msec->rawsize : msec->size;
ab1579fd
NS
310 stash->line_section
311 = bfd_simple_get_relocated_section_contents
312 (stash->abfd, msec, NULL, stash->syms);
98591c73 313
252b5132 314 if (! stash->line_section)
b34976b6 315 return FALSE;
252b5132 316
252b5132
RH
317 stash->line_section_end = stash->line_section + size;
318 }
319
320 xptr = stash->line_section + aUnit->stmt_list_offset;
1da5c9a4 321 if (xptr + 8 <= stash->line_section_end)
252b5132 322 {
7442e600 323 unsigned long eachLine;
ab1579fd 324 bfd_byte *tblend;
252b5132 325 unsigned long base;
dc810e39 326 bfd_size_type amt;
252b5132 327
98591c73 328 /* First comes the length. */
b7af50e3 329 tblend = bfd_get_32 (stash->abfd, (bfd_byte *) xptr) + xptr;
252b5132
RH
330 xptr += 4;
331
98591c73 332 /* Then the base address for each address in the table. */
b7af50e3 333 base = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
334 xptr += 4;
335
336 /* How many line entrys?
116c20d2 337 10 = 4 (line number) + 2 (pos in line) + 4 (address in line). */
252b5132
RH
338 aUnit->line_count = (tblend - xptr) / 10;
339
98591c73 340 /* Allocate an array for the entries. */
dc810e39 341 amt = sizeof (struct linenumber) * aUnit->line_count;
a50b1753 342 aUnit->linenumber_table = (struct linenumber *) bfd_alloc (stash->abfd,
07d6d2b8 343 amt);
ab1579fd
NS
344 if (!aUnit->linenumber_table)
345 return FALSE;
98591c73 346
252b5132
RH
347 for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
348 {
1da5c9a4
AM
349 if (xptr + 10 > stash->line_section_end)
350 {
351 aUnit->line_count = eachLine;
352 break;
353 }
98591c73 354 /* A line number. */
252b5132 355 aUnit->linenumber_table[eachLine].linenumber
b7af50e3 356 = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
357 xptr += 4;
358
98591c73 359 /* Skip the position within the line. */
252b5132
RH
360 xptr += 2;
361
98591c73
KH
362 /* And finally the address. */
363 aUnit->linenumber_table[eachLine].addr
b7af50e3 364 = base + bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
365 xptr += 4;
366 }
367 }
368
b34976b6 369 return TRUE;
252b5132
RH
370}
371
372/* Parse each function die in a compilation unit 'aUnit'.
373 The first child die of 'aUnit' should be in 'aUnit->first_child',
374 the result is placed in 'aUnit->func_list'.
b34976b6 375 Return FALSE if error; TRUE otherwise. */
252b5132 376
b34976b6 377static bfd_boolean
116c20d2 378parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
252b5132 379{
ab1579fd 380 bfd_byte *eachDie;
252b5132
RH
381
382 if (aUnit->first_child)
383 for (eachDie = aUnit->first_child;
07d6d2b8 384 eachDie < stash->debug_section_end;
252b5132
RH
385 )
386 {
387 struct die_info eachDieInfo;
98591c73 388
bb731fb6
L
389 if (! parse_die (stash->abfd, &eachDieInfo, eachDie,
390 stash->debug_section_end))
b34976b6 391 return FALSE;
98591c73 392
252b5132
RH
393 if (eachDieInfo.tag == TAG_global_subroutine
394 || eachDieInfo.tag == TAG_subroutine
395 || eachDieInfo.tag == TAG_inlined_subroutine
396 || eachDieInfo.tag == TAG_entry_point)
397 {
398 struct dwarf1_func* aFunc = alloc_dwarf1_func (stash,aUnit);
ab1579fd
NS
399 if (!aFunc)
400 return FALSE;
98591c73 401
252b5132
RH
402 aFunc->name = eachDieInfo.name;
403 aFunc->low_pc = eachDieInfo.low_pc;
404 aFunc->high_pc = eachDieInfo.high_pc;
405 }
98591c73 406
252b5132
RH
407 /* Move to next sibling, if none, end loop */
408 if (eachDieInfo.sibling)
409 eachDie = stash->debug_section + eachDieInfo.sibling;
410 else
411 break;
412 }
98591c73 413
b34976b6 414 return TRUE;
252b5132
RH
415}
416
417/* Find the nearest line to 'addr' in 'aUnit'.
98591c73 418 Return whether we found the line (or a function) without error. */
252b5132 419
b34976b6 420static bfd_boolean
116c20d2
NC
421dwarf1_unit_find_nearest_line (struct dwarf1_debug* stash,
422 struct dwarf1_unit* aUnit,
423 unsigned long addr,
424 const char **filename_ptr,
425 const char **functionname_ptr,
426 unsigned int *linenumber_ptr)
252b5132 427{
b34976b6
AM
428 int line_p = FALSE;
429 int func_p = FALSE;
252b5132
RH
430
431 if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
432 {
433 if (aUnit->has_stmt_list)
434 {
7442e600 435 unsigned long i;
252b5132
RH
436 struct dwarf1_func* eachFunc;
437
438 if (! aUnit->linenumber_table)
439 {
440 if (! parse_line_table (stash, aUnit))
b34976b6 441 return FALSE;
252b5132
RH
442 }
443
444 if (! aUnit->func_list)
445 {
446 if (! parse_functions_in_unit (stash, aUnit))
b34976b6 447 return FALSE;
252b5132
RH
448 }
449
450 for (i = 0; i < aUnit->line_count; i++)
451 {
452 if (aUnit->linenumber_table[i].addr <= addr
453 && addr < aUnit->linenumber_table[i+1].addr)
454 {
455 *filename_ptr = aUnit->name;
456 *linenumber_ptr = aUnit->linenumber_table[i].linenumber;
b34976b6 457 line_p = TRUE;
252b5132
RH
458 break;
459 }
460 }
461
98591c73
KH
462 for (eachFunc = aUnit->func_list;
463 eachFunc;
252b5132
RH
464 eachFunc = eachFunc->prev)
465 {
466 if (eachFunc->low_pc <= addr
467 && addr < eachFunc->high_pc)
468 {
469 *functionname_ptr = eachFunc->name;
b34976b6 470 func_p = TRUE;
252b5132
RH
471 break;
472 }
473 }
474 }
475 }
476
477 return line_p || func_p;
478}
479
252b5132 480/* The DWARF 1 version of find_nearest line.
b34976b6 481 Return TRUE if the line is found without error. */
252b5132 482
b34976b6 483bfd_boolean
116c20d2 484_bfd_dwarf1_find_nearest_line (bfd *abfd,
ab1579fd 485 asymbol **symbols,
fb167eb2 486 asection *section,
116c20d2
NC
487 bfd_vma offset,
488 const char **filename_ptr,
489 const char **functionname_ptr,
490 unsigned int *linenumber_ptr)
252b5132
RH
491{
492 struct dwarf1_debug *stash = elf_tdata (abfd)->dwarf1_find_line_info;
493
494 struct dwarf1_unit* eachUnit;
495
496 /* What address are we looking for? */
1548c54f 497 unsigned long addr = (unsigned long)(offset + section->vma);
252b5132
RH
498
499 *filename_ptr = NULL;
500 *functionname_ptr = NULL;
501 *linenumber_ptr = 0;
252b5132
RH
502
503 if (! stash)
504 {
505 asection *msec;
dc810e39 506 bfd_size_type size = sizeof (struct dwarf1_debug);
98591c73 507
dc810e39 508 stash = elf_tdata (abfd)->dwarf1_find_line_info
a50b1753 509 = (struct dwarf1_debug *) bfd_zalloc (abfd, size);
98591c73 510
252b5132 511 if (! stash)
b34976b6 512 return FALSE;
98591c73 513
252b5132
RH
514 msec = bfd_get_section_by_name (abfd, ".debug");
515 if (! msec)
116c20d2
NC
516 /* No dwarf1 info. Note that at this point the stash
517 has been allocated, but contains zeros, this lets
518 future calls to this function fail quicker. */
519 return FALSE;
252b5132 520
eea6121a 521 size = msec->rawsize ? msec->rawsize : msec->size;
ab1579fd
NS
522 stash->debug_section
523 = bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
524 symbols);
98591c73 525
252b5132 526 if (! stash->debug_section)
b34976b6 527 return FALSE;
252b5132 528
252b5132
RH
529 stash->debug_section_end = stash->debug_section + size;
530 stash->currentDie = stash->debug_section;
531 stash->abfd = abfd;
ab1579fd 532 stash->syms = symbols;
252b5132
RH
533 }
534
535 /* A null debug_section indicates that there was no dwarf1 info
98591c73 536 or that an error occured while setting up the stash. */
252b5132
RH
537
538 if (! stash->debug_section)
b34976b6 539 return FALSE;
252b5132
RH
540
541 /* Look at the previously parsed units to see if any contain
98591c73 542 the addr. */
252b5132 543 for (eachUnit = stash->lastUnit; eachUnit; eachUnit = eachUnit->prev)
116c20d2
NC
544 if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
545 return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
546 filename_ptr,
547 functionname_ptr,
548 linenumber_ptr);
252b5132
RH
549
550 while (stash->currentDie < stash->debug_section_end)
551 {
552 struct die_info aDieInfo;
553
bb731fb6
L
554 if (! parse_die (stash->abfd, &aDieInfo, stash->currentDie,
555 stash->debug_section_end))
b34976b6 556 return FALSE;
98591c73 557
252b5132
RH
558 if (aDieInfo.tag == TAG_compile_unit)
559 {
560 struct dwarf1_unit* aUnit
561 = alloc_dwarf1_unit (stash);
ab1579fd
NS
562 if (!aUnit)
563 return FALSE;
98591c73 564
252b5132
RH
565 aUnit->name = aDieInfo.name;
566 aUnit->low_pc = aDieInfo.low_pc;
567 aUnit->high_pc = aDieInfo.high_pc;
568 aUnit->has_stmt_list = aDieInfo.has_stmt_list;
569 aUnit->stmt_list_offset = aDieInfo.stmt_list_offset;
98591c73 570
252b5132 571 /* A die has a child if it's followed by a die that is
98591c73
KH
572 not it's sibling. */
573 if (aDieInfo.sibling
574 && stash->currentDie + aDieInfo.length
07d6d2b8 575 < stash->debug_section_end
98591c73 576 && stash->currentDie + aDieInfo.length
07d6d2b8 577 != stash->debug_section + aDieInfo.sibling)
252b5132
RH
578 aUnit->first_child = stash->currentDie + aDieInfo.length;
579 else
580 aUnit->first_child = 0;
581
582 if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
98591c73
KH
583 return dwarf1_unit_find_nearest_line (stash, aUnit, addr,
584 filename_ptr,
585 functionname_ptr,
252b5132
RH
586 linenumber_ptr);
587 }
98591c73 588
252b5132
RH
589 if (aDieInfo.sibling != 0)
590 stash->currentDie = stash->debug_section + aDieInfo.sibling;
591 else
592 stash->currentDie += aDieInfo.length;
593 }
594
b34976b6 595 return FALSE;
252b5132 596}