Browse Source

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.
cygwin-64bit-branch
Cary Coutant 14 years ago
parent
commit
9b8d1a3603
  1. 44
      bfd/ChangeLog
  2. 9
      bfd/bfd-in2.h
  3. 5
      bfd/bfd.c
  4. 2
      bfd/coff-rs6000.c
  5. 2
      bfd/coff64-rs6000.c
  6. 2
      bfd/coffgen.c
  7. 39
      bfd/dwarf2.c
  8. 7
      bfd/elf-bfd.h
  9. 32
      bfd/elf.c
  10. 2
      bfd/elf32-arm.c
  11. 2
      bfd/elf64-alpha.c
  12. 2
      bfd/elfxx-mips.c
  13. 9
      bfd/libbfd-in.h
  14. 13
      bfd/libbfd.c
  15. 9
      bfd/libbfd.h
  16. 2
      bfd/mach-o.c
  17. 4
      bfd/targets.c
  18. 15
      binutils/ChangeLog
  19. 18
      binutils/addr2line.c
  20. 40
      binutils/objdump.c

44
bfd/ChangeLog

@ -1,3 +1,47 @@
2012-07-24 Teresa Johnson <tejohnson@google.com>
* 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.
2012-07-24 Sean Keys <skeys@ipdatasys.com> 2012-07-24 Sean Keys <skeys@ipdatasys.com>
* elf32-m68hc1x.c (elf32_m68hc11_relocate_section): Added code * elf32-m68hc1x.c (elf32_m68hc11_relocate_section): Added code

9
bfd/bfd-in2.h

@ -5810,6 +5810,11 @@ bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
BFD_SEND (abfd, _bfd_find_nearest_line, \ BFD_SEND (abfd, _bfd_find_nearest_line, \
(abfd, sec, syms, off, file, func, line)) (abfd, sec, syms, off, file, func, line))
#define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \
line, disc) \
BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \
(abfd, sec, syms, off, file, func, line, disc))
#define bfd_find_line(abfd, syms, sym, file, line) \ #define bfd_find_line(abfd, syms, sym, file, line) \
BFD_SEND (abfd, _bfd_find_line, \ BFD_SEND (abfd, _bfd_find_line, \
(abfd, syms, sym, file, line)) (abfd, syms, sym, file, line))
@ -6191,6 +6196,7 @@ typedef struct bfd_target
NAME##_bfd_is_target_special_symbol, \ NAME##_bfd_is_target_special_symbol, \
NAME##_get_lineno, \ NAME##_get_lineno, \
NAME##_find_nearest_line, \ NAME##_find_nearest_line, \
_bfd_generic_find_nearest_line_discriminator, \
_bfd_generic_find_line, \ _bfd_generic_find_line, \
NAME##_find_inliner_info, \ NAME##_find_inliner_info, \
NAME##_bfd_make_debug_symbol, \ NAME##_bfd_make_debug_symbol, \
@ -6214,6 +6220,9 @@ typedef struct bfd_target
bfd_boolean (*_bfd_find_nearest_line) bfd_boolean (*_bfd_find_nearest_line)
(bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
const char **, const char **, unsigned int *); const char **, const char **, unsigned int *);
bfd_boolean (*_bfd_find_nearest_line_discriminator)
(bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
const char **, const char **, unsigned int *, unsigned int *);
bfd_boolean (*_bfd_find_line) bfd_boolean (*_bfd_find_line)
(bfd *, struct bfd_symbol **, struct bfd_symbol *, (bfd *, struct bfd_symbol **, struct bfd_symbol *,
const char **, unsigned int *); const char **, unsigned int *);

5
bfd/bfd.c

@ -1424,6 +1424,11 @@ DESCRIPTION
. BFD_SEND (abfd, _bfd_find_nearest_line, \ . BFD_SEND (abfd, _bfd_find_nearest_line, \
. (abfd, sec, syms, off, file, func, line)) . (abfd, sec, syms, off, file, func, line))
. .
.#define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \
. line, disc) \
. BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \
. (abfd, sec, syms, off, file, func, line, disc))
.
.#define bfd_find_line(abfd, syms, sym, file, line) \ .#define bfd_find_line(abfd, syms, sym, file, line) \
. BFD_SEND (abfd, _bfd_find_line, \ . BFD_SEND (abfd, _bfd_find_line, \
. (abfd, syms, sym, file, line)) . (abfd, syms, sym, file, line))

2
bfd/coff-rs6000.c

@ -4118,6 +4118,7 @@ const bfd_target rs6000coff_vec =
coff_bfd_is_target_special_symbol, coff_bfd_is_target_special_symbol,
coff_get_lineno, coff_get_lineno,
xcoff_find_nearest_line, xcoff_find_nearest_line,
_bfd_generic_find_nearest_line_discriminator,
_bfd_generic_find_line, _bfd_generic_find_line,
coff_find_inliner_info, coff_find_inliner_info,
coff_bfd_make_debug_symbol, coff_bfd_make_debug_symbol,
@ -4373,6 +4374,7 @@ const bfd_target pmac_xcoff_vec =
coff_bfd_is_target_special_symbol, coff_bfd_is_target_special_symbol,
coff_get_lineno, coff_get_lineno,
xcoff_find_nearest_line, xcoff_find_nearest_line,
_bfd_generic_find_nearest_line_discriminator,
_bfd_generic_find_line, _bfd_generic_find_line,
coff_find_inliner_info, coff_find_inliner_info,
coff_bfd_make_debug_symbol, coff_bfd_make_debug_symbol,

2
bfd/coff64-rs6000.c

@ -2710,6 +2710,7 @@ const bfd_target rs6000coff64_vec =
coff_bfd_is_target_special_symbol, coff_bfd_is_target_special_symbol,
coff_get_lineno, coff_get_lineno,
coff_find_nearest_line, coff_find_nearest_line,
_bfd_generic_find_nearest_line_discriminator,
_bfd_generic_find_line, _bfd_generic_find_line,
coff_find_inliner_info, coff_find_inliner_info,
coff_bfd_make_debug_symbol, coff_bfd_make_debug_symbol,
@ -2967,6 +2968,7 @@ const bfd_target aix5coff64_vec =
coff_bfd_is_target_special_symbol, coff_bfd_is_target_special_symbol,
coff_get_lineno, coff_get_lineno,
coff_find_nearest_line, coff_find_nearest_line,
_bfd_generic_find_nearest_line_discriminator,
_bfd_generic_find_line, _bfd_generic_find_line,
coff_find_inliner_info, coff_find_inliner_info,
coff_bfd_make_debug_symbol, coff_bfd_make_debug_symbol,

2
bfd/coffgen.c

@ -2153,7 +2153,7 @@ coff_find_nearest_line_with_names (bfd *abfd,
if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, 0, line_ptr, NULL, 0,
&coff_data(abfd)->dwarf2_find_line_info)) &coff_data(abfd)->dwarf2_find_line_info))
return TRUE; return TRUE;

39
bfd/dwarf2.c

@ -980,6 +980,7 @@ struct line_info
char *filename; char *filename;
unsigned int line; unsigned int line;
unsigned int column; unsigned int column;
unsigned int discriminator;
unsigned char op_index; unsigned char op_index;
unsigned char end_sequence; /* End of (sequential) code sequence. */ unsigned char end_sequence; /* End of (sequential) code sequence. */
}; };
@ -1080,6 +1081,7 @@ add_line_info (struct line_info_table *table,
char *filename, char *filename,
unsigned int line, unsigned int line,
unsigned int column, unsigned int column,
unsigned int discriminator,
int end_sequence) int end_sequence)
{ {
bfd_size_type amt = sizeof (struct line_info); 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->op_index = op_index;
info->line = line; info->line = line;
info->column = column; info->column = column;
info->discriminator = discriminator;
info->end_sequence = end_sequence; info->end_sequence = end_sequence;
if (filename && filename[0]) 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; char * filename = table->num_files ? concat_filename (table, 1) : NULL;
unsigned int line = 1; unsigned int line = 1;
unsigned int column = 0; unsigned int column = 0;
unsigned int discriminator = 0;
int is_stmt = lh.default_is_stmt; int is_stmt = lh.default_is_stmt;
int end_sequence = 0; int end_sequence = 0;
/* eraxxon@alumni.rice.edu: Against the DWARF2 specs, some /* 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); line += lh.line_base + (adj_opcode % lh.line_range);
/* Append row to matrix using current values. */ /* Append row to matrix using current values. */
if (!add_line_info (table, address, op_index, filename, if (!add_line_info (table, address, op_index, filename,
line, column, 0)) line, column, discriminator, 0))
goto line_fail; goto line_fail;
discriminator = 0;
if (address < low_pc) if (address < low_pc)
low_pc = address; low_pc = address;
if (address > high_pc) if (address > high_pc)
@ -1626,9 +1631,10 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
{ {
case DW_LNE_end_sequence: case DW_LNE_end_sequence:
end_sequence = 1; end_sequence = 1;
if (!add_line_info (table, address, op_index, filename, if (!add_line_info (table, address, op_index, filename, line,
line, column, end_sequence)) column, discriminator, end_sequence))
goto line_fail; goto line_fail;
discriminator = 0;
if (address < low_pc) if (address < low_pc)
low_pc = address; low_pc = address;
if (address > high_pc) if (address > high_pc)
@ -1668,7 +1674,8 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
table->num_files++; table->num_files++;
break; break;
case DW_LNE_set_discriminator: 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; line_ptr += bytes_read;
break; break;
case DW_LNE_HP_source_file_correlation: case DW_LNE_HP_source_file_correlation:
@ -1686,8 +1693,9 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
break; break;
case DW_LNS_copy: case DW_LNS_copy:
if (!add_line_info (table, address, op_index, if (!add_line_info (table, address, op_index,
filename, line, column, 0)) filename, line, column, discriminator, 0))
goto line_fail; goto line_fail;
discriminator = 0;
if (address < low_pc) if (address < low_pc)
low_pc = address; low_pc = address;
if (address > high_pc) if (address > high_pc)
@ -1788,7 +1796,8 @@ static bfd_boolean
lookup_address_in_line_info_table (struct line_info_table *table, lookup_address_in_line_info_table (struct line_info_table *table,
bfd_vma addr, bfd_vma addr,
const char **filename_ptr, const char **filename_ptr,
unsigned int *linenumber_ptr) unsigned int *linenumber_ptr,
unsigned int *discriminator_ptr)
{ {
struct line_sequence *seq = NULL; struct line_sequence *seq = NULL;
struct line_info *each_line; 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; *filename_ptr = each_line->filename;
*linenumber_ptr = each_line->line; *linenumber_ptr = each_line->line;
if (discriminator_ptr)
*discriminator_ptr = each_line->discriminator;
return TRUE; return TRUE;
} }
} }
@ -2552,6 +2563,7 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
const char **filename_ptr, const char **filename_ptr,
const char **functionname_ptr, const char **functionname_ptr,
unsigned int *linenumber_ptr, unsigned int *linenumber_ptr,
unsigned int *discriminator_ptr,
struct dwarf2_debug *stash) struct dwarf2_debug *stash)
{ {
bfd_boolean line_p; bfd_boolean line_p;
@ -2592,7 +2604,8 @@ comp_unit_find_nearest_line (struct comp_unit *unit,
stash->inliner_chain = function; stash->inliner_chain = function;
line_p = lookup_address_in_line_info_table (unit->line_table, addr, line_p = lookup_address_in_line_info_table (unit->line_table, addr,
filename_ptr, filename_ptr,
linenumber_ptr); linenumber_ptr,
discriminator_ptr);
return line_p || func_p; return line_p || func_p;
} }
@ -3308,6 +3321,7 @@ find_line (bfd *abfd,
const char **filename_ptr, const char **filename_ptr,
const char **functionname_ptr, const char **functionname_ptr,
unsigned int *linenumber_ptr, unsigned int *linenumber_ptr,
unsigned int *discriminator_ptr,
unsigned int addr_size, unsigned int addr_size,
void **pinfo) void **pinfo)
{ {
@ -3419,6 +3433,7 @@ find_line (bfd *abfd,
filename_ptr, filename_ptr,
functionname_ptr, functionname_ptr,
linenumber_ptr, linenumber_ptr,
discriminator_ptr,
stash)); stash));
if (found) if (found)
goto done; goto done;
@ -3512,6 +3527,7 @@ find_line (bfd *abfd,
filename_ptr, filename_ptr,
functionname_ptr, functionname_ptr,
linenumber_ptr, linenumber_ptr,
discriminator_ptr,
stash)); stash));
if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr) 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 **filename_ptr,
const char **functionname_ptr, const char **functionname_ptr,
unsigned int *linenumber_ptr, unsigned int *linenumber_ptr,
unsigned int *discriminator_ptr,
unsigned int addr_size, unsigned int addr_size,
void **pinfo) void **pinfo)
{ {
return find_line (abfd, debug_sections, section, offset, NULL, symbols, return find_line (abfd, debug_sections, section, offset, NULL, symbols,
filename_ptr, functionname_ptr, linenumber_ptr, addr_size, filename_ptr, functionname_ptr, linenumber_ptr,
pinfo); discriminator_ptr, addr_size, pinfo);
} }
/* The DWARF2 version of find_line. /* The DWARF2 version of find_line.
@ -3563,11 +3580,13 @@ _bfd_dwarf2_find_line (bfd *abfd,
asymbol *symbol, asymbol *symbol,
const char **filename_ptr, const char **filename_ptr,
unsigned int *linenumber_ptr, unsigned int *linenumber_ptr,
unsigned int *discriminator_ptr,
unsigned int addr_size, unsigned int addr_size,
void **pinfo) void **pinfo)
{ {
return find_line (abfd, dwarf_debug_sections, NULL, 0, symbol, symbols, 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 bfd_boolean

7
bfd/elf-bfd.h

@ -1876,9 +1876,16 @@ extern bfd_boolean _bfd_elf_set_arch_mach
extern bfd_boolean _bfd_elf_find_nearest_line extern bfd_boolean _bfd_elf_find_nearest_line
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **, (bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
unsigned int *); unsigned int *);
extern bfd_boolean _bfd_elf_find_nearest_line_discriminator
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
unsigned int *, unsigned int *);
extern bfd_boolean _bfd_elf_find_line extern bfd_boolean _bfd_elf_find_line
(bfd *, asymbol **, asymbol *, const char **, unsigned int *); (bfd *, asymbol **, asymbol *, const char **, unsigned int *);
extern bfd_boolean _bfd_elf_find_line_discriminator
(bfd *, asymbol **, asymbol *, const char **, unsigned int *, unsigned int *);
#define _bfd_generic_find_line _bfd_elf_find_line #define _bfd_generic_find_line _bfd_elf_find_line
#define _bfd_generic_find_nearest_line_discriminator \
_bfd_elf_find_nearest_line_discriminator
extern bfd_boolean _bfd_elf_find_inliner_info extern bfd_boolean _bfd_elf_find_inliner_info
(bfd *, const char **, const char **, unsigned int *); (bfd *, const char **, const char **, unsigned int *);
#define _bfd_elf_read_minisymbols _bfd_generic_read_minisymbols #define _bfd_elf_read_minisymbols _bfd_generic_read_minisymbols

32
bfd/elf.c

@ -7566,6 +7566,23 @@ _bfd_elf_find_nearest_line (bfd *abfd,
const char **filename_ptr, const char **filename_ptr,
const char **functionname_ptr, const char **functionname_ptr,
unsigned int *line_ptr) unsigned int *line_ptr)
{
return _bfd_elf_find_nearest_line_discriminator (abfd, section, symbols,
offset, filename_ptr,
functionname_ptr,
line_ptr,
NULL);
}
bfd_boolean
_bfd_elf_find_nearest_line_discriminator (bfd *abfd,
asection *section,
asymbol **symbols,
bfd_vma offset,
const char **filename_ptr,
const char **functionname_ptr,
unsigned int *line_ptr,
unsigned int *discriminator_ptr)
{ {
bfd_boolean found; bfd_boolean found;
@ -7584,7 +7601,7 @@ _bfd_elf_find_nearest_line (bfd *abfd,
if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, 0, line_ptr, discriminator_ptr, 0,
&elf_tdata (abfd)->dwarf2_find_line_info)) &elf_tdata (abfd)->dwarf2_find_line_info))
{ {
if (!*functionname_ptr) if (!*functionname_ptr)
@ -7619,9 +7636,20 @@ _bfd_elf_find_nearest_line (bfd *abfd,
bfd_boolean bfd_boolean
_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol, _bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
const char **filename_ptr, unsigned int *line_ptr) const char **filename_ptr, unsigned int *line_ptr)
{
return _bfd_elf_find_line_discriminator (abfd, symbols, symbol,
filename_ptr, line_ptr,
NULL);
}
bfd_boolean
_bfd_elf_find_line_discriminator (bfd *abfd, asymbol **symbols, asymbol *symbol,
const char **filename_ptr,
unsigned int *line_ptr,
unsigned int *discriminator_ptr)
{ {
return _bfd_dwarf2_find_line (abfd, symbols, symbol, return _bfd_dwarf2_find_line (abfd, symbols, symbol,
filename_ptr, line_ptr, 0, filename_ptr, line_ptr, discriminator_ptr, 0,
&elf_tdata (abfd)->dwarf2_find_line_info); &elf_tdata (abfd)->dwarf2_find_line_info);
} }

2
bfd/elf32-arm.c

@ -12886,7 +12886,7 @@ elf32_arm_find_nearest_line (bfd * abfd,
if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, 0, line_ptr, NULL, 0,
& elf_tdata (abfd)->dwarf2_find_line_info)) & elf_tdata (abfd)->dwarf2_find_line_info))
{ {
if (!*functionname_ptr) if (!*functionname_ptr)

2
bfd/elf64-alpha.c

@ -1452,7 +1452,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, 0, line_ptr, NULL, 0,
&elf_tdata (abfd)->dwarf2_find_line_info)) &elf_tdata (abfd)->dwarf2_find_line_info))
return TRUE; return TRUE;

2
bfd/elfxx-mips.c

@ -11709,7 +11709,7 @@ _bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, ABI_64_P (abfd) ? 8 : 0, line_ptr, NULL, ABI_64_P (abfd) ? 8 : 0,
&elf_tdata (abfd)->dwarf2_find_line_info)) &elf_tdata (abfd)->dwarf2_find_line_info))
return TRUE; return TRUE;

9
bfd/libbfd-in.h

@ -540,16 +540,21 @@ extern const struct dwarf_debug_section dwarf_debug_sections[];
/* Find the nearest line using DWARF 2 debugging information. */ /* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line extern bfd_boolean _bfd_dwarf2_find_nearest_line
(bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma, (bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma,
const char **, const char **, unsigned int *, unsigned int, void **); const char **, const char **, unsigned int *, unsigned int *, unsigned int,
void **);
/* Find the line using DWARF 2 debugging information. */ /* Find the line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_line extern bfd_boolean _bfd_dwarf2_find_line
(bfd *, asymbol **, asymbol *, const char **, (bfd *, asymbol **, asymbol *, const char **,
unsigned int *, unsigned int, void **); unsigned int *, unsigned int *, unsigned int, void **);
bfd_boolean _bfd_generic_find_line bfd_boolean _bfd_generic_find_line
(bfd *, asymbol **, asymbol *, const char **, unsigned int *); (bfd *, asymbol **, asymbol *, const char **, unsigned int *);
bfd_boolean _bfd_generic_find_nearest_line_discriminator
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
unsigned int *, unsigned int *);
/* Find inliner info after calling bfd_find_nearest_line. */ /* Find inliner info after calling bfd_find_nearest_line. */
extern bfd_boolean _bfd_dwarf2_find_inliner_info extern bfd_boolean _bfd_dwarf2_find_inliner_info
(bfd *, const char **, const char **, unsigned int *, void **); (bfd *, const char **, const char **, unsigned int *, void **);

13
bfd/libbfd.c

@ -1117,6 +1117,19 @@ _bfd_generic_find_line (bfd *abfd ATTRIBUTE_UNUSED,
return FALSE; return FALSE;
} }
bfd_boolean
_bfd_generic_find_nearest_line_discriminator (bfd *abfd ATTRIBUTE_UNUSED,
asection *section ATTRIBUTE_UNUSED,
asymbol **symbols ATTRIBUTE_UNUSED,
bfd_vma offset ATTRIBUTE_UNUSED,
const char **filename_ptr ATTRIBUTE_UNUSED,
const char **functionname_ptr ATTRIBUTE_UNUSED,
unsigned int *line_ptr ATTRIBUTE_UNUSED,
unsigned int *discriminator_ptr ATTRIBUTE_UNUSED)
{
return FALSE;
}
bfd_boolean bfd_boolean
_bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED, _bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
asection *isec ATTRIBUTE_UNUSED, asection *isec ATTRIBUTE_UNUSED,

9
bfd/libbfd.h

@ -545,16 +545,21 @@ extern const struct dwarf_debug_section dwarf_debug_sections[];
/* Find the nearest line using DWARF 2 debugging information. */ /* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line extern bfd_boolean _bfd_dwarf2_find_nearest_line
(bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma, (bfd *, const struct dwarf_debug_section *, asection *, asymbol **, bfd_vma,
const char **, const char **, unsigned int *, unsigned int, void **); const char **, const char **, unsigned int *, unsigned int *, unsigned int,
void **);
/* Find the line using DWARF 2 debugging information. */ /* Find the line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_line extern bfd_boolean _bfd_dwarf2_find_line
(bfd *, asymbol **, asymbol *, const char **, (bfd *, asymbol **, asymbol *, const char **,
unsigned int *, unsigned int, void **); unsigned int *, unsigned int *, unsigned int, void **);
bfd_boolean _bfd_generic_find_line bfd_boolean _bfd_generic_find_line
(bfd *, asymbol **, asymbol *, const char **, unsigned int *); (bfd *, asymbol **, asymbol *, const char **, unsigned int *);
bfd_boolean _bfd_generic_find_nearest_line_discriminator
(bfd *, asection *, asymbol **, bfd_vma, const char **, const char **,
unsigned int *, unsigned int *);
/* Find inliner info after calling bfd_find_nearest_line. */ /* Find inliner info after calling bfd_find_nearest_line. */
extern bfd_boolean _bfd_dwarf2_find_inliner_info extern bfd_boolean _bfd_dwarf2_find_inliner_info
(bfd *, const char **, const char **, unsigned int *, void **); (bfd *, const char **, const char **, unsigned int *, void **);

2
bfd/mach-o.c

@ -4836,7 +4836,7 @@ bfd_mach_o_find_nearest_line (bfd *abfd,
if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections, if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
section, symbols, offset, section, symbols, offset,
filename_ptr, functionname_ptr, filename_ptr, functionname_ptr,
line_ptr, 0, line_ptr, NULL, 0,
&mdata->dwarf2_find_line_info)) &mdata->dwarf2_find_line_info))
return TRUE; return TRUE;
return FALSE; return FALSE;

4
bfd/targets.c

@ -369,6 +369,7 @@ BFD_JUMP_TABLE macros.
. NAME##_bfd_is_target_special_symbol, \ . NAME##_bfd_is_target_special_symbol, \
. NAME##_get_lineno, \ . NAME##_get_lineno, \
. NAME##_find_nearest_line, \ . NAME##_find_nearest_line, \
. _bfd_generic_find_nearest_line_discriminator, \
. _bfd_generic_find_line, \ . _bfd_generic_find_line, \
. NAME##_find_inliner_info, \ . NAME##_find_inliner_info, \
. NAME##_bfd_make_debug_symbol, \ . NAME##_bfd_make_debug_symbol, \
@ -392,6 +393,9 @@ BFD_JUMP_TABLE macros.
. bfd_boolean (*_bfd_find_nearest_line) . bfd_boolean (*_bfd_find_nearest_line)
. (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma, . (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
. const char **, const char **, unsigned int *); . const char **, const char **, unsigned int *);
. bfd_boolean (*_bfd_find_nearest_line_discriminator)
. (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
. const char **, const char **, unsigned int *, unsigned int *);
. bfd_boolean (*_bfd_find_line) . bfd_boolean (*_bfd_find_line)
. (bfd *, struct bfd_symbol **, struct bfd_symbol *, . (bfd *, struct bfd_symbol **, struct bfd_symbol *,
. const char **, unsigned int *); . const char **, unsigned int *);

15
binutils/ChangeLog

@ -1,3 +1,18 @@
2012-07-24 Teresa Johnson <tejohnson@google.com>
* 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.
2012-07-17 Nick Clifton <nickc@redhat.com> 2012-07-17 Nick Clifton <nickc@redhat.com>
* elfcomm.c (setup_archive): Extract index table and symbol table * elfcomm.c (setup_archive): Extract index table and symbol table

18
binutils/addr2line.c

@ -139,6 +139,7 @@ static bfd_vma pc;
static const char *filename; static const char *filename;
static const char *functionname; static const char *functionname;
static unsigned int line; static unsigned int line;
static unsigned int discriminator;
static bfd_boolean found; static bfd_boolean found;
/* Look for an address in a section. This is called via /* Look for an address in a section. This is called via
@ -165,8 +166,9 @@ find_address_in_section (bfd *abfd, asection *section,
if (pc >= vma + size) if (pc >= vma + size)
return; return;
found = bfd_find_nearest_line (abfd, section, syms, pc - vma, found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc - vma,
&filename, &functionname, &line); &filename, &functionname,
&line, &discriminator);
} }
/* Look for an offset in a section. This is directly called. */ /* Look for an offset in a section. This is directly called. */
@ -186,8 +188,9 @@ find_offset_in_section (bfd *abfd, asection *section)
if (pc >= size) if (pc >= size)
return; return;
found = bfd_find_nearest_line (abfd, section, syms, pc, found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc,
&filename, &functionname, &line); &filename, &functionname,
&line, &discriminator);
} }
/* Read hexadecimal addresses from stdin, translate into /* Read hexadecimal addresses from stdin, translate into
@ -294,7 +297,12 @@ translate_addresses (bfd *abfd, asection *section)
printf ("%s:", filename ? filename : "??"); printf ("%s:", filename ? filename : "??");
if (line != 0) if (line != 0)
printf ("%u\n", line); {
if (discriminator != 0)
printf ("%u (discriminator %u)\n", line, discriminator);
else
printf ("%u\n", line);
}
else else
printf ("?\n"); printf ("?\n");
if (!unwind_inlines) if (!unwind_inlines)

40
binutils/objdump.c

@ -1086,6 +1086,7 @@ objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
static char *prev_functionname; static char *prev_functionname;
static unsigned int prev_line; static unsigned int prev_line;
static unsigned int prev_discriminator;
/* We keep a list of all files that we have seen when doing a /* We keep a list of all files that we have seen when doing a
disassembly with source, so that we know how much of the file to disassembly with source, so that we know how much of the file to
@ -1312,13 +1313,15 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
const char *filename; const char *filename;
const char *functionname; const char *functionname;
unsigned int linenumber; unsigned int linenumber;
unsigned int discriminator;
bfd_boolean reloc; bfd_boolean reloc;
if (! with_line_numbers && ! with_source_code) if (! with_line_numbers && ! with_source_code)
return; return;
if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename, if (! bfd_find_nearest_line_discriminator (abfd, section, syms, addr_offset,
&functionname, &linenumber)) &filename, &functionname,
&linenumber, &discriminator))
return; return;
if (filename != NULL && *filename == '\0') if (filename != NULL && *filename == '\0')
@ -1370,8 +1373,15 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
&& (prev_functionname == NULL && (prev_functionname == NULL
|| strcmp (functionname, prev_functionname) != 0)) || strcmp (functionname, prev_functionname) != 0))
printf ("%s():\n", functionname); printf ("%s():\n", functionname);
if (linenumber > 0 && linenumber != prev_line) if (linenumber > 0 && (linenumber != prev_line ||
printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber); (discriminator != prev_discriminator)))
{
if (discriminator > 0)
printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
linenumber, discriminator);
else
printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
}
} }
if (with_source_code if (with_source_code
@ -1423,6 +1433,9 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
if (linenumber > 0 && linenumber != prev_line) if (linenumber > 0 && linenumber != prev_line)
prev_line = linenumber; prev_line = linenumber;
if (discriminator != prev_discriminator)
prev_discriminator = discriminator;
} }
/* Pseudo FILE object for strings. */ /* Pseudo FILE object for strings. */
@ -2115,6 +2128,7 @@ disassemble_data (bfd *abfd)
print_files = NULL; print_files = NULL;
prev_functionname = NULL; prev_functionname = NULL;
prev_line = -1; prev_line = -1;
prev_discriminator = 0;
/* We make a copy of syms to sort. We don't want to sort syms /* We make a copy of syms to sort. We don't want to sort syms
because that will screw up the relocs. */ because that will screw up the relocs. */
@ -2895,6 +2909,7 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
arelent **p; arelent **p;
char *last_filename, *last_functionname; char *last_filename, *last_functionname;
unsigned int last_line; unsigned int last_line;
unsigned int last_discriminator;
/* Get column headers lined up reasonably. */ /* Get column headers lined up reasonably. */
{ {
@ -2913,12 +2928,14 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
last_filename = NULL; last_filename = NULL;
last_functionname = NULL; last_functionname = NULL;
last_line = 0; last_line = 0;
last_discriminator = 0;
for (p = relpp; relcount && *p != NULL; p++, relcount--) for (p = relpp; relcount && *p != NULL; p++, relcount--)
{ {
arelent *q = *p; arelent *q = *p;
const char *filename, *functionname; const char *filename, *functionname;
unsigned int linenumber; unsigned int linenumber;
unsigned int discriminator;
const char *sym_name; const char *sym_name;
const char *section_name; const char *section_name;
bfd_vma addend2 = 0; bfd_vma addend2 = 0;
@ -2932,8 +2949,9 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
if (with_line_numbers if (with_line_numbers
&& sec != NULL && sec != NULL
&& bfd_find_nearest_line (abfd, sec, syms, q->address, && bfd_find_nearest_line_discriminator (abfd, sec, syms, q->address,
&filename, &functionname, &linenumber)) &filename, &functionname,
&linenumber, &discriminator))
{ {
if (functionname != NULL if (functionname != NULL
&& (last_functionname == NULL && (last_functionname == NULL
@ -2949,10 +2967,16 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
&& (linenumber != last_line && (linenumber != last_line
|| (filename != NULL || (filename != NULL
&& last_filename != NULL && last_filename != NULL
&& filename_cmp (filename, last_filename) != 0))) && filename_cmp (filename, last_filename) != 0)
|| (discriminator != last_discriminator)))
{ {
printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber); if (discriminator > 0)
printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
else
printf ("%s:%u (discriminator %u)\n", filename == NULL ? "???" : filename,
linenumber, discriminator);
last_line = linenumber; last_line = linenumber;
last_discriminator = discriminator;
if (last_filename != NULL) if (last_filename != NULL)
free (last_filename); free (last_filename);
if (filename == NULL) if (filename == NULL)

Loading…
Cancel
Save