diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/linespec.c | 16 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/prologue.c | 39 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/prologue.exp | 68 | ||||
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 9 |
6 files changed, 139 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d7be9d..59bd2da 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2007-07-31 Daniel Jacobowitz <dan@codesourcery.com> + + * linespec.c (minsym_found): Advance to the next line if possible. + 2007-07-31 Pedro Alves <pedro_alves@portugalmail.pt> * arm-wince-tdep.c (arm_wince_init_abi): Remove svr4 related call. diff --git a/gdb/linespec.c b/gdb/linespec.c index 9043ca6..a00cffe 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 8d4d846..ebbe500 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-31 Daniel Jacobowitz <dan@codesourcery.com> + + * gdb.base/prologue.c, gdb.base/prologue.exp: New. + * lib/gdb.exp (gdb_breakpoint): Handle "temporary". + 2007-07-30 Maciej W. Rozycki <macro@mips.com> * 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 0000000..d8b05e6 --- /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 0000000..c82934c --- /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 c87e488..4e9c64a 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 $" {} |