Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.509 diff -u -p -p -u -r1.509 dwarf2read.c --- dwarf2read.c 15 Mar 2011 15:57:11 -0000 1.509 +++ dwarf2read.c 15 Mar 2011 19:18:30 -0000 @@ -10364,6 +10364,14 @@ psymtab_include_file_name (const struct 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 * 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 * { 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,12 +10501,24 @@ dwarf_decode_lines (struct line_header * 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); op_index = 0; line_ptr += 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 */ + + complaint (&symfile_complaints, + _(".debug_line section at address 0")); + p_record_line = noop_record_line; + } + address += baseaddr; break; case DW_LNE_define_file: @@ -10551,12 +10573,12 @@ dwarf_decode_lines (struct line_header * { 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 +10677,7 @@ dwarf_decode_lines (struct line_header * 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); } } } Index: testsuite/gdb.base/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/Makefile.in,v retrieving revision 1.9 diff -u -p -p -u -r1.9 Makefile.in --- testsuite/gdb.base/Makefile.in 22 Feb 2011 20:52:46 -0000 1.9 +++ testsuite/gdb.base/Makefile.in 15 Mar 2011 19:18:30 -0000 @@ -5,7 +5,8 @@ EXECUTABLES = a2-run advance all-types a 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 \ Index: testsuite/gdb.base/break-on-linker-gcd-function.cc =================================================================== RCS file: testsuite/gdb.base/break-on-linker-gcd-function.cc diff -N testsuite/gdb.base/break-on-linker-gcd-function.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.base/break-on-linker-gcd-function.cc 15 Mar 2011 19:18:30 -0000 @@ -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; +} Index: testsuite/gdb.base/break-on-linker-gcd-function.exp =================================================================== RCS file: testsuite/gdb.base/break-on-linker-gcd-function.exp diff -N testsuite/gdb.base/break-on-linker-gcd-function.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.base/break-on-linker-gcd-function.exp 15 Mar 2011 19:18:30 -0000 @@ -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}+: .*"