Update year range in copyright notice of all files.
[deliverable/binutils-gdb.git] / bfd / dwarf1.c
CommitLineData
252b5132 1/* DWARF 1 find nearest line (_bfd_dwarf1_find_nearest_line).
2571583a 2 Copyright (C) 1998-2017 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{
dc810e39
AM
143 bfd_size_type amt = sizeof (struct dwarf1_unit);
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{
dc810e39
AM
161 bfd_size_type amt = sizeof (struct dwarf1_func);
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
116c20d2
NC
181parse_die (bfd * abfd,
182 struct die_info * aDieInfo,
ab1579fd
NS
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. */
b7af50e3 192 aDieInfo->length = bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132 193 xptr += 4;
bb731fb6
L
194 if (aDieInfo->length == 0
195 || (this_die + aDieInfo->length) >= aDiePtrEnd)
b34976b6 196 return FALSE;
252b5132
RH
197 if (aDieInfo->length < 6)
198 {
98591c73 199 /* Just padding bytes. */
252b5132 200 aDieInfo->tag = TAG_padding;
b34976b6 201 return TRUE;
252b5132
RH
202 }
203
98591c73 204 /* Then the tag. */
b7af50e3 205 aDieInfo->tag = bfd_get_16 (abfd, (bfd_byte *) xptr);
252b5132 206 xptr += 2;
98591c73
KH
207
208 /* Then the attributes. */
252b5132
RH
209 while (xptr < (this_die + aDieInfo->length))
210 {
211 unsigned short attr;
98591c73
KH
212
213 /* Parse the attribute based on its form. This section
252b5132 214 must handle all dwarf1 forms, but need only handle the
98591c73 215 actual attributes that we care about. */
b7af50e3 216 attr = bfd_get_16 (abfd, (bfd_byte *) xptr);
252b5132 217 xptr += 2;
98591c73 218
252b5132
RH
219 switch (FORM_FROM_ATTR (attr))
220 {
221 case FORM_DATA2:
222 xptr += 2;
223 break;
224 case FORM_DATA4:
225 case FORM_REF:
226 if (attr == AT_sibling)
b7af50e3 227 aDieInfo->sibling = bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132
RH
228 else if (attr == AT_stmt_list)
229 {
b7af50e3 230 aDieInfo->stmt_list_offset = bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132
RH
231 aDieInfo->has_stmt_list = 1;
232 }
233 xptr += 4;
234 break;
235 case FORM_DATA8:
236 xptr += 8;
237 break;
238 case FORM_ADDR:
239 if (attr == AT_low_pc)
b7af50e3 240 aDieInfo->low_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132 241 else if (attr == AT_high_pc)
b7af50e3 242 aDieInfo->high_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132
RH
243 xptr += 4;
244 break;
245 case FORM_BLOCK2:
b7af50e3 246 xptr += 2 + bfd_get_16 (abfd, (bfd_byte *) xptr);
252b5132
RH
247 break;
248 case FORM_BLOCK4:
b7af50e3 249 xptr += 4 + bfd_get_32 (abfd, (bfd_byte *) xptr);
252b5132
RH
250 break;
251 case FORM_STRING:
252 if (attr == AT_name)
20b1d3e3
AM
253 aDieInfo->name = (char *) xptr;
254 xptr += strlen ((char *) xptr) + 1;
252b5132
RH
255 break;
256 }
257 }
258
b34976b6 259 return TRUE;
252b5132
RH
260}
261
262/* Parse a dwarf1 line number table for 'aUnit->stmt_list_offset'
b34976b6
AM
263 into 'aUnit->linenumber_table'. Return FALSE if an error
264 occurs; TRUE otherwise. */
98591c73 265
b34976b6 266static bfd_boolean
116c20d2 267parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
252b5132 268{
ab1579fd 269 bfd_byte *xptr;
252b5132 270
98591c73 271 /* Load the ".line" section from the bfd if we haven't already. */
252b5132
RH
272 if (stash->line_section == 0)
273 {
274 asection *msec;
dc810e39 275 bfd_size_type size;
98591c73 276
252b5132
RH
277 msec = bfd_get_section_by_name (stash->abfd, ".line");
278 if (! msec)
b34976b6 279 return FALSE;
98591c73 280
eea6121a 281 size = msec->rawsize ? msec->rawsize : msec->size;
ab1579fd
NS
282 stash->line_section
283 = bfd_simple_get_relocated_section_contents
284 (stash->abfd, msec, NULL, stash->syms);
98591c73 285
252b5132 286 if (! stash->line_section)
b34976b6 287 return FALSE;
252b5132 288
252b5132
RH
289 stash->line_section_end = stash->line_section + size;
290 }
291
292 xptr = stash->line_section + aUnit->stmt_list_offset;
293 if (xptr < stash->line_section_end)
294 {
7442e600 295 unsigned long eachLine;
ab1579fd 296 bfd_byte *tblend;
252b5132 297 unsigned long base;
dc810e39 298 bfd_size_type amt;
252b5132 299
98591c73 300 /* First comes the length. */
b7af50e3 301 tblend = bfd_get_32 (stash->abfd, (bfd_byte *) xptr) + xptr;
252b5132
RH
302 xptr += 4;
303
98591c73 304 /* Then the base address for each address in the table. */
b7af50e3 305 base = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
306 xptr += 4;
307
308 /* How many line entrys?
116c20d2 309 10 = 4 (line number) + 2 (pos in line) + 4 (address in line). */
252b5132
RH
310 aUnit->line_count = (tblend - xptr) / 10;
311
98591c73 312 /* Allocate an array for the entries. */
dc810e39 313 amt = sizeof (struct linenumber) * aUnit->line_count;
a50b1753
NC
314 aUnit->linenumber_table = (struct linenumber *) bfd_alloc (stash->abfd,
315 amt);
ab1579fd
NS
316 if (!aUnit->linenumber_table)
317 return FALSE;
98591c73 318
252b5132
RH
319 for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
320 {
98591c73 321 /* A line number. */
252b5132 322 aUnit->linenumber_table[eachLine].linenumber
b7af50e3 323 = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
324 xptr += 4;
325
98591c73 326 /* Skip the position within the line. */
252b5132
RH
327 xptr += 2;
328
98591c73
KH
329 /* And finally the address. */
330 aUnit->linenumber_table[eachLine].addr
b7af50e3 331 = base + bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
252b5132
RH
332 xptr += 4;
333 }
334 }
335
b34976b6 336 return TRUE;
252b5132
RH
337}
338
339/* Parse each function die in a compilation unit 'aUnit'.
340 The first child die of 'aUnit' should be in 'aUnit->first_child',
341 the result is placed in 'aUnit->func_list'.
b34976b6 342 Return FALSE if error; TRUE otherwise. */
252b5132 343
b34976b6 344static bfd_boolean
116c20d2 345parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
252b5132 346{
ab1579fd 347 bfd_byte *eachDie;
252b5132
RH
348
349 if (aUnit->first_child)
350 for (eachDie = aUnit->first_child;
116c20d2 351 eachDie < stash->debug_section_end;
252b5132
RH
352 )
353 {
354 struct die_info eachDieInfo;
98591c73 355
bb731fb6
L
356 if (! parse_die (stash->abfd, &eachDieInfo, eachDie,
357 stash->debug_section_end))
b34976b6 358 return FALSE;
98591c73 359
252b5132
RH
360 if (eachDieInfo.tag == TAG_global_subroutine
361 || eachDieInfo.tag == TAG_subroutine
362 || eachDieInfo.tag == TAG_inlined_subroutine
363 || eachDieInfo.tag == TAG_entry_point)
364 {
365 struct dwarf1_func* aFunc = alloc_dwarf1_func (stash,aUnit);
ab1579fd
NS
366 if (!aFunc)
367 return FALSE;
98591c73 368
252b5132
RH
369 aFunc->name = eachDieInfo.name;
370 aFunc->low_pc = eachDieInfo.low_pc;
371 aFunc->high_pc = eachDieInfo.high_pc;
372 }
98591c73 373
252b5132
RH
374 /* Move to next sibling, if none, end loop */
375 if (eachDieInfo.sibling)
376 eachDie = stash->debug_section + eachDieInfo.sibling;
377 else
378 break;
379 }
98591c73 380
b34976b6 381 return TRUE;
252b5132
RH
382}
383
384/* Find the nearest line to 'addr' in 'aUnit'.
98591c73 385 Return whether we found the line (or a function) without error. */
252b5132 386
b34976b6 387static bfd_boolean
116c20d2
NC
388dwarf1_unit_find_nearest_line (struct dwarf1_debug* stash,
389 struct dwarf1_unit* aUnit,
390 unsigned long addr,
391 const char **filename_ptr,
392 const char **functionname_ptr,
393 unsigned int *linenumber_ptr)
252b5132 394{
b34976b6
AM
395 int line_p = FALSE;
396 int func_p = FALSE;
252b5132
RH
397
398 if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
399 {
400 if (aUnit->has_stmt_list)
401 {
7442e600 402 unsigned long i;
252b5132
RH
403 struct dwarf1_func* eachFunc;
404
405 if (! aUnit->linenumber_table)
406 {
407 if (! parse_line_table (stash, aUnit))
b34976b6 408 return FALSE;
252b5132
RH
409 }
410
411 if (! aUnit->func_list)
412 {
413 if (! parse_functions_in_unit (stash, aUnit))
b34976b6 414 return FALSE;
252b5132
RH
415 }
416
417 for (i = 0; i < aUnit->line_count; i++)
418 {
419 if (aUnit->linenumber_table[i].addr <= addr
420 && addr < aUnit->linenumber_table[i+1].addr)
421 {
422 *filename_ptr = aUnit->name;
423 *linenumber_ptr = aUnit->linenumber_table[i].linenumber;
b34976b6 424 line_p = TRUE;
252b5132
RH
425 break;
426 }
427 }
428
98591c73
KH
429 for (eachFunc = aUnit->func_list;
430 eachFunc;
252b5132
RH
431 eachFunc = eachFunc->prev)
432 {
433 if (eachFunc->low_pc <= addr
434 && addr < eachFunc->high_pc)
435 {
436 *functionname_ptr = eachFunc->name;
b34976b6 437 func_p = TRUE;
252b5132
RH
438 break;
439 }
440 }
441 }
442 }
443
444 return line_p || func_p;
445}
446
252b5132 447/* The DWARF 1 version of find_nearest line.
b34976b6 448 Return TRUE if the line is found without error. */
252b5132 449
b34976b6 450bfd_boolean
116c20d2 451_bfd_dwarf1_find_nearest_line (bfd *abfd,
ab1579fd 452 asymbol **symbols,
fb167eb2 453 asection *section,
116c20d2
NC
454 bfd_vma offset,
455 const char **filename_ptr,
456 const char **functionname_ptr,
457 unsigned int *linenumber_ptr)
252b5132
RH
458{
459 struct dwarf1_debug *stash = elf_tdata (abfd)->dwarf1_find_line_info;
460
461 struct dwarf1_unit* eachUnit;
462
463 /* What address are we looking for? */
1548c54f 464 unsigned long addr = (unsigned long)(offset + section->vma);
252b5132
RH
465
466 *filename_ptr = NULL;
467 *functionname_ptr = NULL;
468 *linenumber_ptr = 0;
252b5132
RH
469
470 if (! stash)
471 {
472 asection *msec;
dc810e39 473 bfd_size_type size = sizeof (struct dwarf1_debug);
98591c73 474
dc810e39 475 stash = elf_tdata (abfd)->dwarf1_find_line_info
a50b1753 476 = (struct dwarf1_debug *) bfd_zalloc (abfd, size);
98591c73 477
252b5132 478 if (! stash)
b34976b6 479 return FALSE;
98591c73 480
252b5132
RH
481 msec = bfd_get_section_by_name (abfd, ".debug");
482 if (! msec)
116c20d2
NC
483 /* No dwarf1 info. Note that at this point the stash
484 has been allocated, but contains zeros, this lets
485 future calls to this function fail quicker. */
486 return FALSE;
252b5132 487
eea6121a 488 size = msec->rawsize ? msec->rawsize : msec->size;
ab1579fd
NS
489 stash->debug_section
490 = bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
491 symbols);
98591c73 492
252b5132 493 if (! stash->debug_section)
b34976b6 494 return FALSE;
252b5132 495
252b5132
RH
496 stash->debug_section_end = stash->debug_section + size;
497 stash->currentDie = stash->debug_section;
498 stash->abfd = abfd;
ab1579fd 499 stash->syms = symbols;
252b5132
RH
500 }
501
502 /* A null debug_section indicates that there was no dwarf1 info
98591c73 503 or that an error occured while setting up the stash. */
252b5132
RH
504
505 if (! stash->debug_section)
b34976b6 506 return FALSE;
252b5132
RH
507
508 /* Look at the previously parsed units to see if any contain
98591c73 509 the addr. */
252b5132 510 for (eachUnit = stash->lastUnit; eachUnit; eachUnit = eachUnit->prev)
116c20d2
NC
511 if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
512 return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
513 filename_ptr,
514 functionname_ptr,
515 linenumber_ptr);
252b5132
RH
516
517 while (stash->currentDie < stash->debug_section_end)
518 {
519 struct die_info aDieInfo;
520
bb731fb6
L
521 if (! parse_die (stash->abfd, &aDieInfo, stash->currentDie,
522 stash->debug_section_end))
b34976b6 523 return FALSE;
98591c73 524
252b5132
RH
525 if (aDieInfo.tag == TAG_compile_unit)
526 {
527 struct dwarf1_unit* aUnit
528 = alloc_dwarf1_unit (stash);
ab1579fd
NS
529 if (!aUnit)
530 return FALSE;
98591c73 531
252b5132
RH
532 aUnit->name = aDieInfo.name;
533 aUnit->low_pc = aDieInfo.low_pc;
534 aUnit->high_pc = aDieInfo.high_pc;
535 aUnit->has_stmt_list = aDieInfo.has_stmt_list;
536 aUnit->stmt_list_offset = aDieInfo.stmt_list_offset;
98591c73 537
252b5132 538 /* A die has a child if it's followed by a die that is
98591c73
KH
539 not it's sibling. */
540 if (aDieInfo.sibling
541 && stash->currentDie + aDieInfo.length
252b5132 542 < stash->debug_section_end
98591c73 543 && stash->currentDie + aDieInfo.length
252b5132
RH
544 != stash->debug_section + aDieInfo.sibling)
545 aUnit->first_child = stash->currentDie + aDieInfo.length;
546 else
547 aUnit->first_child = 0;
548
549 if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
98591c73
KH
550 return dwarf1_unit_find_nearest_line (stash, aUnit, addr,
551 filename_ptr,
552 functionname_ptr,
252b5132
RH
553 linenumber_ptr);
554 }
98591c73 555
252b5132
RH
556 if (aDieInfo.sibling != 0)
557 stash->currentDie = stash->debug_section + aDieInfo.sibling;
558 else
559 stash->currentDie += aDieInfo.length;
560 }
561
b34976b6 562 return FALSE;
252b5132 563}
This page took 1.165217 seconds and 4 git commands to generate.