From e48883f7911b90ba2b9af24705be25a0289db16a Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 31 Jul 2007 19:58:40 +0000 Subject: [PATCH] * linespec.c (minsym_found): Advance to the next line if possible. * gdb.base/prologue.c, gdb.base/prologue.exp: New. * lib/gdb.exp (gdb_breakpoint): Handle "temporary". --- gdb/ChangeLog | 4 ++ gdb/linespec.c | 16 +++++++ gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.base/prologue.c | 39 +++++++++++++++++ gdb/testsuite/gdb.base/prologue.exp | 68 +++++++++++++++++++++++++++++ gdb/testsuite/lib/gdb.exp | 9 +++- 6 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.base/prologue.c create mode 100644 gdb/testsuite/gdb.base/prologue.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d7be9d7f58..59bd2da36a2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2007-07-31 Daniel Jacobowitz + + * linespec.c (minsym_found): Advance to the next line if possible. + 2007-07-31 Pedro Alves * arm-wince-tdep.c (arm_wince_init_abi): Remove svr4 related call. diff --git a/gdb/linespec.c b/gdb/linespec.c index 9043ca6651b..a00cffe4613 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1833,11 +1833,27 @@ minsym_found (int funfirstline, struct minimal_symbol *msymbol) values.sals[0].section = SYMBOL_BFD_SECTION (msymbol); if (funfirstline) { + struct symtab_and_line sal; + values.sals[0].pc += gdbarch_deprecated_function_start_offset (current_gdbarch); values.sals[0].pc = gdbarch_skip_prologue (current_gdbarch, values.sals[0].pc); + + sal = find_pc_sect_line (values.sals[0].pc, values.sals[0].section, 0); + + /* Check if SKIP_PROLOGUE left us in mid-line, and the next + line is still part of the same function. If there is no + line information here, sal.pc will be the passed in PC. */ + if (sal.pc != values.sals[0].pc + && (lookup_minimal_symbol_by_pc_section (values.sals[0].pc, + values.sals[0].section) + == lookup_minimal_symbol_by_pc_section (sal.end, + values.sals[0].section))) + /* Recalculate the line number (might not be N+1). */ + values.sals[0] = find_pc_sect_line (sal.end, values.sals[0].section, 0); } + values.nelts = 1; return values; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8d4d8462b66..ebbe5003983 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-31 Daniel Jacobowitz + + * gdb.base/prologue.c, gdb.base/prologue.exp: New. + * lib/gdb.exp (gdb_breakpoint): Handle "temporary". + 2007-07-30 Maciej W. Rozycki * gdb.base/dump.exp: Force the correct endianness for binary diff --git a/gdb/testsuite/gdb.base/prologue.c b/gdb/testsuite/gdb.base/prologue.c new file mode 100644 index 00000000000..d8b05e63a27 --- /dev/null +++ b/gdb/testsuite/gdb.base/prologue.c @@ -0,0 +1,39 @@ +/* This test is part of GDB, the GNU debugger. + + Copyright 2007 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +int leaf (void) +{ + return 1; +} + +int marker (int val) +{ + leaf (); + return leaf () * val; +} + +int other (int val) __attribute__((alias("marker"))); + +int main(void) +{ + marker (0); + marker (0); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/prologue.exp b/gdb/testsuite/gdb.base/prologue.exp new file mode 100644 index 00000000000..c82934c5954 --- /dev/null +++ b/gdb/testsuite/gdb.base/prologue.exp @@ -0,0 +1,68 @@ +# Test for prologue skipping in minimal symbols with line info. +# Copyright 2007 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if { [skip_cplus_tests] } { continue } + +set testfile "prologue" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + untested prologue.exp + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +proc find_breakpoint_pc { sym } { + global decimal hex gdb_prompt + + if { [gdb_breakpoint $sym temporary] } { + pass "setting breakpoint at $sym" + } + + gdb_test "continue" "marker \\(.*\\) at.*" "continue to $sym" + + set pc 0 + set msg "reading \$pc: $sym" + gdb_test_multiple "print/x \$pc" $msg { + -re "\\\$$decimal = ($hex)\r\n$gdb_prompt $" { + set pc $expect_out(1,string) + pass $msg + } + } + + return $pc +} + +# GDB would skip the prologue differently when given a symbol with +# debug info than when given a minimal symbol from the symbol table. +# Make sure this is fixed. + +set pc1 [find_breakpoint_pc "marker"] + +set pc2 [find_breakpoint_pc "other"] + +gdb_test "print $pc1 == $pc2" "\\\$$decimal = 1" "same pc from minimal symbol" diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index c87e488b754..4e9c64acb0f 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -324,7 +324,7 @@ proc gdb_start_cmd {args} { } # Set a breakpoint at FUNCTION. If there is an additional argument it is -# a list of options; the only currently supported option is allow-pending. +# a list of options; the supported options are allow-pending and temporary. proc gdb_breakpoint { function args } { global gdb_prompt @@ -335,7 +335,12 @@ proc gdb_breakpoint { function args } { set pending_response y } - send_gdb "break $function\n" + set break_command "break" + if {[lsearch -exact [lindex $args 0] temporary] != -1} { + set break_command "tbreak" + } + + send_gdb "$break_command $function\n" # The first two regexps are what we get with -g, the third is without -g. gdb_expect 30 { -re "Breakpoint \[0-9\]* at .*: file .*, line $decimal.\r\n$gdb_prompt $" {} -- 2.30.2