From c91513d8bcbfd180dbefdb84841661abead0e9c3 Mon Sep 17 00:00:00 2001 From: Paul Pluzhnikov Date: Wed, 16 Mar 2011 18:16:26 +0000 Subject: [PATCH] ChangeLog: 2011-03-16 Paul Pluzhnikov 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 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. --- gdb/ChangeLog | 6 +++ gdb/dwarf2read.c | 37 +++++++++++-- gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.base/Makefile.in | 3 +- .../gdb.base/break-on-linker-gcd-function.cc | 32 +++++++++++ .../gdb.base/break-on-linker-gcd-function.exp | 54 +++++++++++++++++++ 6 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 gdb/testsuite/gdb.base/break-on-linker-gcd-function.cc create mode 100644 gdb/testsuite/gdb.base/break-on-linker-gcd-function.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0f38bdfb07..2bddd4abdf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2011-03-16 Paul Pluzhnikov + + PR gdb/12528 + * dwarf2read.c (noop_record_line): New function. + (dwarf_decode_lines): Ignore line tables for GCd functions. + 2011-03-16 Pierre Muller Fix ARI warnings about new lines at the end of messages, which diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 5d498d56f0..810f66a0c7 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); } } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index df52132dfd..6dd99413df 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-03-16 Paul Pluzhnikov + + 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. + 2011-03-15 Andreas Tobler * gdb.base/jit-main.c: Define ElfW for non glibc elf targets. diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in index e80209ac7b..72f1ba41a0 100644 --- a/gdb/testsuite/gdb.base/Makefile.in +++ b/gdb/testsuite/gdb.base/Makefile.in @@ -5,7 +5,8 @@ EXECUTABLES = a2-run advance all-types annota1 annota1-watch_thread_num \ annota3 anon args arrayidx async attach attach-pie-misread \ attach2 auxv bang\! bfp-test bigcore bitfields bitfields2 \ break break-always break-entry break-interp-test breako2 \ - breakpoint-shadow call-ar-st call-rt-st call-sc-t* call-signals \ + breakpoint-shadow break-on-linker-gcd-function \ + call-ar-st call-rt-st call-sc-t* call-signals \ call-strs callexit callfuncs callfwmall charset checkpoint \ chng-syms code_elim1 code_elim2 commands compiler complex \ condbreak consecutive constvars coremaker cursal cvexpr \ diff --git a/gdb/testsuite/gdb.base/break-on-linker-gcd-function.cc b/gdb/testsuite/gdb.base/break-on-linker-gcd-function.cc new file mode 100644 index 0000000000..df781aca1d --- /dev/null +++ b/gdb/testsuite/gdb.base/break-on-linker-gcd-function.cc @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +// Test case for PR gdb/12528 + +void +foo () +{ + // This function is not referenced and should be GCd by the linker + return; // gdb break here +} + +int +main () +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/break-on-linker-gcd-function.exp b/gdb/testsuite/gdb.base/break-on-linker-gcd-function.exp new file mode 100644 index 0000000000..9d0b4813f9 --- /dev/null +++ b/gdb/testsuite/gdb.base/break-on-linker-gcd-function.exp @@ -0,0 +1,54 @@ +# Copyright 2011 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the gdb testsuite + +# Test casting, especially between class types or pointer-to-class +# types. + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +if { [skip_cplus_tests] } { continue } + +set testfile "break-on-linker-gcd-function" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +set additional_flags {-ffunction-sections -Wl,--gc-sections} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ + [list debug c++ additional_flags=$additional_flags]] != "" } { + untested $srcfile + return -1 +} + +clean_restart $testfile + +# Single hex digit +set xd {[0-9a-f]} + +# This accepts e.g. "Breakpoint 1 at 0x40968a" (fixed GDB) +# but rejects e.g. "Breakpoint 1 at 0x4" (broken GDB). +gdb_test "b [gdb_get_line_number "gdb break here"]" "Breakpoint \[0-9\] at 0x${xd}${xd}+: .*"