From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24533 invoked by alias); 1 Nov 2004 16:04:08 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 24438 invoked from network); 1 Nov 2004 16:04:05 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 1 Nov 2004 16:04:05 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id iA1G443L009534 for ; Mon, 1 Nov 2004 11:04:05 -0500 Received: from localhost.redhat.com (to-dhcp51.toronto.redhat.com [172.16.14.151]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id iA1G44r21128; Mon, 1 Nov 2004 11:04:04 -0500 Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 68E6D129D8C; Mon, 1 Nov 2004 09:20:32 -0500 (EST) Message-ID: <4186462E.5080103@gnu.org> Date: Mon, 01 Nov 2004 16:04:00 -0000 From: Andrew Cagney User-Agent: Mozilla Thunderbird 0.8 (X11/20041020) MIME-Version: 1.0 To: Felix Lee Cc: gdb-patches@sources.redhat.com Subject: Re: backtrace changes current source location References: <20041026075115.4A2C354AAB5@stray.canids> <20041026132924.GA26886@nevyn.them.org> <20041026150127.6ED3E54AAB5@stray.canids> <417FDC11.7060700@gnu.org> <20041028005157.259D34E8F0A@stray.canids> <41825FD5.1030607@gnu.org> <20041029220723.CCE45501085@stray.canids> <4182D9AD.5010003@gnu.org> <20041030032828.DB2D2501085@stray.canids> <20041101043803.A261E50346B@stray.canids> In-Reply-To: <20041101043803.A261E50346B@stray.canids> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-11/txt/msg00014.txt.bz2 Felix Lee wrote: > ok, here's a new patch and testcase. built and tested on > i686-pc-linux-gnu. the testcase adds 7 PASS and 1 FAIL, which > becomes 8 PASS with the patch. > > gdb/ChangeLog > 2004-10-31 Felix Lee > > * stack.c (set_current_sal_from_frame): New function. > (print_args_stub): Use it. > (print_frame_info): Don't set sal here. Hey, cute. Yes, thanks! Andrew > gdb/testsuite/ChangeLog > 2004-10-31 Felix Lee > > * gdb.base/cursal.exp: New file. > * gdb.base/cursal.c: New file. > > Index: gdb/stack.c > =================================================================== > RCS file: /cvs/src/src/gdb/stack.c,v > retrieving revision 1.115 > diff -p -u -r1.115 stack.c > --- gdb/stack.c 30 Oct 2004 21:16:10 -0000 1.115 > +++ gdb/stack.c 31 Oct 2004 10:42:55 -0000 > @@ -100,6 +100,8 @@ static void print_frame (struct frame_in > 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, > > 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, > 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) > Index: gdb/testsuite/gdb.base/cursal.c > =================================================================== > RCS file: gdb/testsuite/gdb.base/cursal.c > diff -N gdb/testsuite/gdb.base/cursal.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ gdb/testsuite/gdb.base/cursal.c 31 Oct 2004 10:42:55 -0000 > @@ -0,0 +1,19 @@ > +void > +func2 () > +{ > + int v2 = 2; > +} > + > +void > +func1 () > +{ > + func2 (); > +} > + > + > +int > +main () > +{ > + int v0 = 0; > + func1 (); > +} > Index: gdb/testsuite/gdb.base/cursal.exp > =================================================================== > RCS file: gdb/testsuite/gdb.base/cursal.exp > diff -N gdb/testsuite/gdb.base/cursal.exp > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ gdb/testsuite/gdb.base/cursal.exp 31 Oct 2004 10:42:55 -0000 > @@ -0,0 +1,78 @@ > +# 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}] != ""} { > + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." > +} > + > +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]} { > + gdb_suppress_tests > +} > + > +gdb_test "list" \ > + "v0 = 0;" \ > + "list in main" > + > +if {! [runto "func2"]} { > + gdb_suppress_tests > +} > + > +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]} { > + gdb_suppress_tests > +} > +gdb_test "list" \ > + "func1 \\(\\);" \ > + "list size 3" > + > +return 0 >