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.
This commit is contained in:
Paul Pluzhnikov 2011-03-16 18:16:26 +00:00
parent b37520b626
commit c91513d8bc
6 changed files with 133 additions and 6 deletions

View File

@ -1,3 +1,9 @@
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.
2011-03-16 Pierre Muller <muller@ics.u-strasbg.fr> 2011-03-16 Pierre Muller <muller@ics.u-strasbg.fr>
Fix ARI warnings about new lines at the end of messages, which Fix ARI warnings about new lines at the end of messages, which

View File

@ -10364,6 +10364,14 @@ psymtab_include_file_name (const struct line_header *lh, int file_index,
return include_name; 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 /* Decode the Line Number Program (LNP) for the given line_header
structure and CU. The actual information extracted and the type structure and CU. The actual information extracted and the type
of structures created from the LNP depends on the value of PST. 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); struct gdbarch *gdbarch = get_objfile_arch (objfile);
const int decode_for_pst_p = (pst != NULL); const int decode_for_pst_p = (pst != NULL);
struct subfile *last_subfile = NULL, *first_subfile = current_subfile; 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)); 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); addr = gdbarch_addr_bits_remove (gdbarch, address);
if (last_subfile) if (last_subfile)
record_line (last_subfile, 0, addr); (*p_record_line) (last_subfile, 0, addr);
last_subfile = current_subfile; last_subfile = current_subfile;
} }
/* Append row to matrix using current values. */ /* Append row to matrix using current values. */
addr = check_cu_functions (address, cu); addr = check_cu_functions (address, cu);
addr = gdbarch_addr_bits_remove (gdbarch, addr); addr = gdbarch_addr_bits_remove (gdbarch, addr);
record_line (current_subfile, line, addr); (*p_record_line) (current_subfile, line, addr);
} }
} }
basic_block = 0; basic_block = 0;
@ -10491,10 +10501,27 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, bfd *abfd,
switch (extended_op) switch (extended_op)
{ {
case DW_LNE_end_sequence: case DW_LNE_end_sequence:
p_record_line = record_line;
end_sequence = 1; end_sequence = 1;
break; break;
case DW_LNE_set_address: case DW_LNE_set_address:
address = read_address (abfd, line_ptr, cu, &bytes_read); 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; op_index = 0;
line_ptr += bytes_read; line_ptr += bytes_read;
address += baseaddr; 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); addr = gdbarch_addr_bits_remove (gdbarch, address);
if (last_subfile) if (last_subfile)
record_line (last_subfile, 0, addr); (*p_record_line) (last_subfile, 0, addr);
last_subfile = current_subfile; last_subfile = current_subfile;
} }
addr = check_cu_functions (address, cu); addr = check_cu_functions (address, cu);
addr = gdbarch_addr_bits_remove (gdbarch, addr); addr = gdbarch_addr_bits_remove (gdbarch, addr);
record_line (current_subfile, line, addr); (*p_record_line) (current_subfile, line, addr);
} }
} }
basic_block = 0; 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) if (!decode_for_pst_p)
{ {
addr = gdbarch_addr_bits_remove (gdbarch, address); addr = gdbarch_addr_bits_remove (gdbarch, address);
record_line (current_subfile, 0, addr); (*p_record_line) (current_subfile, 0, addr);
} }
} }
} }

View File

@ -1,3 +1,10 @@
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.
2011-03-15 Andreas Tobler <andreast@fgznet.ch> 2011-03-15 Andreas Tobler <andreast@fgznet.ch>
* gdb.base/jit-main.c: Define ElfW for non glibc elf targets. * gdb.base/jit-main.c: Define ElfW for non glibc elf targets.

View File

@ -5,7 +5,8 @@ EXECUTABLES = a2-run advance all-types annota1 annota1-watch_thread_num \
annota3 anon args arrayidx async attach attach-pie-misread \ annota3 anon args arrayidx async attach attach-pie-misread \
attach2 auxv bang\! bfp-test bigcore bitfields bitfields2 \ attach2 auxv bang\! bfp-test bigcore bitfields bitfields2 \
break break-always break-entry break-interp-test breako2 \ 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 \ call-strs callexit callfuncs callfwmall charset checkpoint \
chng-syms code_elim1 code_elim2 commands compiler complex \ chng-syms code_elim1 code_elim2 commands compiler complex \
condbreak consecutive constvars coremaker cursal cvexpr \ condbreak consecutive constvars coremaker cursal cvexpr \

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
// 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;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
# 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}+: .*"