diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/stack.c | 34 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/cursal.c | 39 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/cursal.exp | 80 |
5 files changed, 154 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index da910ab..6cc77e9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2004-11-05 Felix Lee <felix+log1@specifixinc.com> + + * stack.c (set_current_sal_from_frame): New function. + (print_args_stub): Use it. + (print_frame_info): Don't set sal here. + 2004-11-04 Mark Kettenis <kettenis@gnu.org> * dwarf2-frame.c (read_encoded_value): Change type of third diff --git a/gdb/stack.c b/gdb/stack.c index f2f9cae..cceb1c1 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -100,6 +100,8 @@ static void print_frame (struct frame_info *fi, int print_args, struct symtab_and_line sal); +static void set_current_sal_from_frame (struct frame_info *, int); + static void backtrace_command (char *, int); static void frame_info (char *, int); @@ -128,9 +130,12 @@ struct print_stack_frame_args static int print_stack_frame_stub (void *args) { - struct print_stack_frame_args *p = (struct print_stack_frame_args *) args; + struct print_stack_frame_args *p = args; + int center = (p->print_what == SRC_LINE + || p->print_what == SRC_AND_LOC); print_frame_info (p->fi, p->print_level, p->print_what, p->print_args); + set_current_sal_from_frame (p->fi, center); return 0; } @@ -401,6 +406,24 @@ print_args_stub (void *args) return 0; } +/* Set the current source and line to the location of the given + frame, if possible. When CENTER is true, adjust so the + relevant line is in the center of the next 'list'. */ + +static void +set_current_sal_from_frame (struct frame_info *fi, int center) +{ + struct symtab_and_line sal; + + find_frame_sal (fi, &sal); + if (sal.symtab) + { + if (center) + sal.line = max (sal.line - get_lines_to_list () / 2, 1); + set_current_source_symtab_and_line (&sal); + } +} + /* Print information about a frame for frame "fi" at level "level". Used in "where" output, also used to emit breakpoint or step messages. @@ -477,12 +500,8 @@ print_frame_info (struct frame_info *fi, int print_level, source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC); - if (sal.symtab) - set_current_source_symtab_and_line (&sal); - if (source_print && sal.symtab) { - struct symtab_and_line cursal; int done = 0; int mid_statement = ((print_what == SRC_LINE) && (get_frame_pc (fi) != sal.pc)); @@ -513,11 +532,6 @@ print_frame_info (struct frame_info *fi, int print_level, print_source_lines (sal.symtab, sal.line, sal.line + 1, 0); } } - /* Make sure we have at least a default source file */ - set_default_source_symtab_and_line (); - cursal = get_current_source_symtab_and_line (); - cursal.line = max (sal.line - get_lines_to_list () / 2, 1); - set_current_source_symtab_and_line (&cursal); } if (print_what != LOCATION) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0bc5456..21fd8e3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-11-05 Felix Lee <felix+log1@specifixinc.com> + + * gdb.base/cursal.exp: New file. + * gdb.base/cursal.c: New file. + 2004-11-03 Andrew Cagney <cagney@gnu.org> * gdb.base/savedregs.exp, gdb.base/savedregs.c: New files. diff --git a/gdb/testsuite/gdb.base/cursal.c b/gdb/testsuite/gdb.base/cursal.c new file mode 100644 index 0000000..b9d28c6 --- /dev/null +++ b/gdb/testsuite/gdb.base/cursal.c @@ -0,0 +1,39 @@ +/* Copyright 2004 Free Software Foundation, Inc. + + This file is part of GDB. + + 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. */ + + +void +func2 () +{ + int v2 = 2; +} + +void +func1 () +{ + func2 (); +} + + +int +main () +{ + int v0 = 0; + func1 (); +} diff --git a/gdb/testsuite/gdb.base/cursal.exp b/gdb/testsuite/gdb.base/cursal.exp new file mode 100644 index 0000000..c3ddc55 --- /dev/null +++ b/gdb/testsuite/gdb.base/cursal.exp @@ -0,0 +1,80 @@ +# Copyright 2004 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 $tracelevel { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "cursal" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != ""} { + untested "Couldn't compile $srcfile" + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set listsize 1" \ + ".*" + +# initial sal should be first statement in main +gdb_test "list" \ + "v0 = 0;" \ + "list before run" + +if {! [runto_main]} { + return -1 +} + +gdb_test "list" \ + "v0 = 0;" \ + "list in main" + +if {! [runto "func2"]} { + return -1 +} + +gdb_test "list" \ + "v2 = 2;" \ + "list in func2" + +# make sure backtrace doesn't change current source location. +gdb_test "backtrace" \ + ".*" +gdb_test "list -1" \ + "v2 = 2;" \ + "list after backtrace" + +# check the window +gdb_test "set listsize 3" \ + ".*" +if {! [runto_main]} { + return -1 +} +gdb_test "list" \ + "func1 \\(\\);" \ + "list size 3" + +return 0 |