From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31507 invoked by alias); 1 Nov 2004 04:38: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 31497 invoked from network); 1 Nov 2004 04:38:05 -0000 Received: from unknown (HELO capitol.mail.pas.earthlink.net) (207.217.120.180) by sourceware.org with SMTP; 1 Nov 2004 04:38:05 -0000 Received: from ip216-26-76-19.dsl.du.teleport.com ([216.26.76.19] helo=stray.canids) by capitol.mail.pas.earthlink.net with esmtp (Exim 3.33 #1) id 1COTxE-0007N4-00 for gdb-patches@sources.redhat.com; Sun, 31 Oct 2004 20:38:04 -0800 Received: from stray.canids (localhost.localdomain [127.0.0.1]) by stray.canids (Postfix) with ESMTP id A261E50346B for ; Sun, 31 Oct 2004 20:38:03 -0800 (PST) From: Felix Lee To: 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> In-Reply-To: <20041030032828.DB2D2501085@stray.canids> on Fri, 29 Oct 2004 20:28:28 PDT from Felix Lee Date: Mon, 01 Nov 2004 04:38:00 -0000 Message-Id: <20041101043803.A261E50346B@stray.canids> X-SW-Source: 2004-11/txt/msg00006.txt.bz2 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. 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