diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2006-01-17 17:12:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2006-01-17 17:12:58 +0000 |
commit | 6dd55cb711112860860407fe47f18e1ddb17c599 (patch) | |
tree | 04ed3e9e2afe21d8b8cc83d2c1b7ee04ab039590 /bfd/dwarf2.c | |
parent | 64d03ab565d55c20bfa7267bc669876a8fbea912 (diff) | |
download | gdb-6dd55cb711112860860407fe47f18e1ddb17c599.zip gdb-6dd55cb711112860860407fe47f18e1ddb17c599.tar.gz gdb-6dd55cb711112860860407fe47f18e1ddb17c599.tar.bz2 |
2006-01-17 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/2096
* dwarf2.c (comp_unit_contains_address): Update comment.
(_bfd_dwarf2_find_nearest_line): Use section's vma, instead of
lma. Return TRUE only if both comp_unit_contains_address and
comp_unit_find_nearest_line return TRUE.
(_bfd_dwarf2_find_line): Use section's vma, instead of lma.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 51 |
1 files changed, 22 insertions, 29 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 123dd9c..1d55e9e 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -2006,7 +2006,11 @@ parse_comp_unit (bfd *abfd, return unit; } -/* Return TRUE if UNIT contains the address given by ADDR. */ +/* Return TRUE if UNIT may contain the address given by ADDR. When + there are functions written entirely with inline asm statements, the + range info in the compilation unit header may not be correct. We + need to consult the line info table to see if a compilation unit + really contains the given address. */ static bfd_boolean comp_unit_contains_address (struct comp_unit *unit, bfd_vma addr) @@ -2210,9 +2214,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, stash = *pinfo; addr = offset; if (section->output_section) - addr += section->output_section->lma + section->output_offset; + addr += section->output_section->vma + section->output_offset; else - addr += section->lma; + addr += section->vma; *filename_ptr = NULL; *functionname_ptr = NULL; *linenumber_ptr = 0; @@ -2293,16 +2297,16 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, /* Check the previously read comp. units first. */ for (each = stash->all_comp_units; each; each = each->next_unit) - if (comp_unit_contains_address (each, addr)) - return comp_unit_find_nearest_line (each, addr, filename_ptr, - functionname_ptr, linenumber_ptr, - stash); + if (comp_unit_contains_address (each, addr) + && comp_unit_find_nearest_line (each, addr, filename_ptr, + functionname_ptr, + linenumber_ptr, stash)) + return TRUE; /* Read each remaining comp. units checking each as they are read. */ while (stash->info_ptr < stash->info_ptr_end) { bfd_vma length; - bfd_boolean found; unsigned int offset_size = addr_size; bfd_byte *info_ptr_unit = stash->info_ptr; @@ -2358,25 +2362,14 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, unit->high == 0), we need to consult the line info table to see if a compilation unit contains the given address. */ - if (each->arange.high > 0) - { - if (comp_unit_contains_address (each, addr)) - return comp_unit_find_nearest_line (each, addr, - filename_ptr, - functionname_ptr, - linenumber_ptr, - stash); - } - else - { - found = comp_unit_find_nearest_line (each, addr, - filename_ptr, - functionname_ptr, - linenumber_ptr, - stash); - if (found) - return TRUE; - } + if ((each->arange.high == 0 + || comp_unit_contains_address (each, addr)) + && comp_unit_find_nearest_line (each, addr, + filename_ptr, + functionname_ptr, + linenumber_ptr, + stash)) + return TRUE; } } } @@ -2419,9 +2412,9 @@ _bfd_dwarf2_find_line (bfd *abfd, addr = symbol->value; if (section->output_section) - addr += section->output_section->lma + section->output_offset; + addr += section->output_section->vma + section->output_offset; else - addr += section->lma; + addr += section->vma; *filename_ptr = NULL; stash = *pinfo; |