diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2011-03-16 18:16:26 +0000 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2011-03-16 18:16:26 +0000 |
commit | c91513d8bcbfd180dbefdb84841661abead0e9c3 (patch) | |
tree | 5dbbcdcb631ec41682ccac12002641b3d360daf5 /gdb/dwarf2read.c | |
parent | b37520b6265d8479f34d8ffa36ec1c88d4360734 (diff) | |
download | gdb-c91513d8bcbfd180dbefdb84841661abead0e9c3.zip gdb-c91513d8bcbfd180dbefdb84841661abead0e9c3.tar.gz gdb-c91513d8bcbfd180dbefdb84841661abead0e9c3.tar.bz2 |
ChangeLog:
2011-03-16 Paul Pluzhnikov <ppluzhnikov@google.com>
PR gdb/12528
* dwarf2read.c (noop_record_line): New function.
(dwarf_decode_lines): Ignore line tables for GCd functions.
testsuite/ChangeLog:
2011-03-16 Paul Pluzhnikov <ppluzhnikov@google.com>
PR gdb/12528
* gdb.base/Makefile.in: Adjust EXECUTABLES.
* gdb.base/break-on-linker-gcd-function.exp: New test.
* gdb.base/break-on-linker-gcd-function.cc: New file.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 5d498d5..810f66a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -10364,6 +10364,14 @@ psymtab_include_file_name (const struct line_header *lh, int file_index, return include_name; } +/* Ignore this record_line request. */ + +static void +noop_record_line (struct subfile *subfile, int line, CORE_ADDR pc) +{ + return; +} + /* Decode the Line Number Program (LNP) for the given line_header structure and CU. The actual information extracted and the type of structures created from the LNP depends on the value of PST. @@ -10399,6 +10407,8 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd, struct gdbarch *gdbarch = get_objfile_arch (objfile); const int decode_for_pst_p = (pst != NULL); struct subfile *last_subfile = NULL, *first_subfile = current_subfile; + void (*p_record_line) (struct subfile *subfile, int line, CORE_ADDR pc) + = record_line; baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -10468,13 +10478,13 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd, { addr = gdbarch_addr_bits_remove (gdbarch, address); if (last_subfile) - record_line (last_subfile, 0, addr); + (*p_record_line) (last_subfile, 0, addr); last_subfile = current_subfile; } /* Append row to matrix using current values. */ addr = check_cu_functions (address, cu); addr = gdbarch_addr_bits_remove (gdbarch, addr); - record_line (current_subfile, line, addr); + (*p_record_line) (current_subfile, line, addr); } } basic_block = 0; @@ -10491,10 +10501,27 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd, switch (extended_op) { case DW_LNE_end_sequence: + p_record_line = record_line; end_sequence = 1; break; case DW_LNE_set_address: address = read_address (abfd, line_ptr, cu, &bytes_read); + + if (address == 0 && !dwarf2_per_objfile->has_section_at_zero) + { + /* This line table is for a function which has been + GCd by the linker. Ignore it. PR gdb/12528 */ + + long line_offset + = line_ptr - dwarf2_per_objfile->line.buffer; + + complaint (&symfile_complaints, + _(".debug_line address at offset 0x%lx is 0 " + "[in module %s]"), + line_offset, cu->objfile->name); + p_record_line = noop_record_line; + } + op_index = 0; line_ptr += bytes_read; address += baseaddr; @@ -10551,12 +10578,12 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd, { addr = gdbarch_addr_bits_remove (gdbarch, address); if (last_subfile) - record_line (last_subfile, 0, addr); + (*p_record_line) (last_subfile, 0, addr); last_subfile = current_subfile; } addr = check_cu_functions (address, cu); addr = gdbarch_addr_bits_remove (gdbarch, addr); - record_line (current_subfile, line, addr); + (*p_record_line) (current_subfile, line, addr); } } basic_block = 0; @@ -10655,7 +10682,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd, if (!decode_for_pst_p) { addr = gdbarch_addr_bits_remove (gdbarch, address); - record_line (current_subfile, 0, addr); + (*p_record_line) (current_subfile, 0, addr); } } } |