summaryrefslogtreecommitdiff
path: root/bfd/dwarf2.c
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2012-07-24 21:06:55 +0000
committerCary Coutant <ccoutant@google.com>2012-07-24 21:06:55 +0000
commitf1859405f7b7b4ee238a153ab83c249610c02085 (patch)
tree62f7cffa0d6c00c3fe67177f1ee0013c13ec5c34 /bfd/dwarf2.c
parent7978dc27681393bacdc9865d10a2d526279ecd8f (diff)
downloadbinutils-redhat-f1859405f7b7b4ee238a153ab83c249610c02085.tar.gz
2012-07-24 Teresa Johnson <tejohnson@google.com>
bfd/ * bfd.c (bfd_find_nearest_line_discriminator): New macro. * coff-rs6000.c: Init _bfd_find_nearest_line_discriminator. * coff64-rs6000.c: Likewise. * dwarf2.c (struct line_info): Add discriminator field. (add_line_info): Fill in new discriminator field. (decode_line_info): Record discriminator information instead of ignoring it. (lookup_address_in_line_info_table): Return discriminator field if requested. (comp_unit_find_nearest_line): Add discriminator argument. (find_line): Likewise. (_bfd_dwarf2_find_nearest_line): Likewise. (_bfd_dwarf2_find_line): Likewise. * elf-bfd.h (_bfd_elf_find_nearest_line_discriminator): New. (_bfd_elf_find_line_discriminator): Likewise. (_bfd_generic_find_nearest_line_discriminator): Likewise. Defined. * elf.c (_bfd_elf_find_nearest_line): Change to a wrapper that invokes _bfd_elf_find_nearest_line_discriminator with correct arguments. (_bfd_elf_find_nearest_line_discriminator): New. (_bfd_elf_find_line): Change to a wrapper that invokes _bfd_elf_find_line_discriminator with correct arguments. (_bfd_elf_find_line_discriminator): New. * coffgen.c (coff_find_nearest_line_with_names): Handle new discriminator argument. * elf32-arm.c (elf32_arm_find_nearest_line): Likewise. * elf64-alpha.c (elf64_alpha_find_nearest_line): Likewise. * elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Likewise. * mach-o.c (bfd_mach_o_find_nearest_line): Likewise. * libbfd-in.h (_bfd_dwarf2_find_nearest_line): Add discriminator argument. (_bfd_dwarf2_find_line): Likewise. (_bfd_generic_find_nearest_line_discriminator): New. * libbfd.c (_bfd_generic_find_nearest_line_discriminator): New. * bfd-in2.h: Regenerated. * libbfd.h: Likewise. * targets.c (BFD_JUMP_TABLE_SYMBOLS): Initialize _bfd_find_nearest_line_discriminator with _bfd_generic_find_nearest_line_discriminator. (bfd_target): Add _bfd_find_nearest_line_discriminator. binutils/ * addr2line.c (find_address_in_section): Invoke bfd_find_nearest_line_discriminator to get the discriminator. (find_offset_in_section): Likewise. (translate_addresses): Print discriminator if it is non-zero. * objdump.c (show_line): Invoke bfd_find_nearest_line_discriminator to get the discriminator, and keep track of prev_discriminator. Print discriminator if it is non-zero. (disassemble_data): Initialize prev_discriminator. (dump_reloc_set): Invoke bfd_find_nearest_line_discriminator to get the discriminator, and keep track of last_discriminator. Print discriminator if it is non-zero.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r--bfd/dwarf2.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index d31b84939a..069d6141a7 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -980,6 +980,7 @@ struct line_info
char *filename;
unsigned int line;
unsigned int column;
+ unsigned int discriminator;
unsigned char op_index;
unsigned char end_sequence; /* End of (sequential) code sequence. */
};
@@ -1080,6 +1081,7 @@ add_line_info (struct line_info_table *table,
char *filename,
unsigned int line,
unsigned int column,
+ unsigned int discriminator,
int end_sequence)
{
bfd_size_type amt = sizeof (struct line_info);
@@ -1095,6 +1097,7 @@ add_line_info (struct line_info_table *table,
info->op_index = op_index;
info->line = line;
info->column = column;
+ info->discriminator = discriminator;
info->end_sequence = end_sequence;
if (filename && filename[0])
@@ -1573,6 +1576,7 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
char * filename = table->num_files ? concat_filename (table, 1) : NULL;
unsigned int line = 1;
unsigned int column = 0;
+ unsigned int discriminator = 0;
int is_stmt = lh.default_is_stmt;
int end_sequence = 0;
/* eraxxon@alumni.rice.edu: Against the DWARF2 specs, some
@@ -1607,8 +1611,9 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
line += lh.line_base + (adj_opcode % lh.line_range);
/* Append row to matrix using current values. */
if (!add_line_info (table, address, op_index, filename,
- line, column, 0))
+ line, column, discriminator, 0))
goto line_fail;
+ discriminator = 0;
if (address < low_pc)
low_pc = address;
if (address > high_pc)
@@ -1626,9 +1631,10 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
{
case DW_LNE_end_sequence:
end_sequence = 1;
- if (!add_line_info (table, address, op_index, filename,
- line, column, end_sequence))
+ if (!add_line_info (table, address, op_index, filename, line,
+ column, discriminator, end_sequence))
goto line_fail;
+ discriminator = 0;
if (address < low_pc)
low_pc = address;
if (address > high_pc)
@@ -1668,7 +1674,8 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
table->num_files++;
break;
case DW_LNE_set_discriminator:
- (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
+ discriminator =
+ read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
line_ptr += bytes_read;
break;
case DW_LNE_HP_source_file_correlation:
@@ -1686,8 +1693,9 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
break;
case DW_LNS_copy:
if (!add_line_info (table, address, op_index,
- filename, line, column, 0))
+ filename, line, column, discriminator, 0))
goto line_fail;
+ discriminator = 0;
if (address < low_pc)
low_pc = address;
if (address > high_pc)
@@ -1788,7 +1796,8 @@ static bfd_boolean
lookup_address_in_line_info_table (struct line_info_table *table,
bfd_vma addr,
const char **filename_ptr,
- unsigned int *linenumber_ptr)
+ unsigned int *linenumber_ptr,
+ unsigned int *discriminator_ptr)
{
struct line_sequence *seq = NULL;
struct line_info *each_line;
@@ -1823,6 +1832,8 @@ lookup_address_in_line_info_table (struct line_info_table *table,
{
*filename_ptr = each_line->filename;
*linenumber_ptr = each_line->line;
+ if (discriminator_ptr)
+ *discriminator_ptr = each_line->discriminator;
return TRUE;
}
}
@@ -2552,6 +2563,7 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
const char **filename_ptr,
const char **functionname_ptr,
unsigned int *linenumber_ptr,
+ unsigned int *discriminator_ptr,
struct dwarf2_debug *stash)
{
bfd_boolean line_p;
@@ -2592,7 +2604,8 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
stash->inliner_chain = function;
line_p = lookup_address_in_line_info_table (unit->line_table, addr,
filename_ptr,
- linenumber_ptr);
+ linenumber_ptr,
+ discriminator_ptr);
return line_p || func_p;
}
@@ -3308,6 +3321,7 @@ find_line (bfd *abfd,
const char **filename_ptr,
const char **functionname_ptr,
unsigned int *linenumber_ptr,
+ unsigned int *discriminator_ptr,
unsigned int addr_size,
void **pinfo)
{
@@ -3419,6 +3433,7 @@ find_line (bfd *abfd,
filename_ptr,
functionname_ptr,
linenumber_ptr,
+ discriminator_ptr,
stash));
if (found)
goto done;
@@ -3512,6 +3527,7 @@ find_line (bfd *abfd,
filename_ptr,
functionname_ptr,
linenumber_ptr,
+ discriminator_ptr,
stash));
if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
@@ -3546,12 +3562,13 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
const char **filename_ptr,
const char **functionname_ptr,
unsigned int *linenumber_ptr,
+ unsigned int *discriminator_ptr,
unsigned int addr_size,
void **pinfo)
{
return find_line (abfd, debug_sections, section, offset, NULL, symbols,
- filename_ptr, functionname_ptr, linenumber_ptr, addr_size,
- pinfo);
+ filename_ptr, functionname_ptr, linenumber_ptr,
+ discriminator_ptr, addr_size, pinfo);
}
/* The DWARF2 version of find_line.
@@ -3563,11 +3580,13 @@ _bfd_dwarf2_find_line (bfd *abfd,
asymbol *symbol,
const char **filename_ptr,
unsigned int *linenumber_ptr,
+ unsigned int *discriminator_ptr,
unsigned int addr_size,
void **pinfo)
{
return find_line (abfd, dwarf_debug_sections, NULL, 0, symbol, symbols,
- filename_ptr, NULL, linenumber_ptr, addr_size, pinfo);
+ filename_ptr, NULL, linenumber_ptr, discriminator_ptr,
+ addr_size, pinfo);
}
bfd_boolean