From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4995 invoked by alias); 23 Jan 2013 18:39:32 -0000 Received: (qmail 4984 invoked by uid 22791); 23 Jan 2013 18:39:31 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from e7.ny.us.ibm.com (HELO e7.ny.us.ibm.com) (32.97.182.137) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 23 Jan 2013 18:39:23 +0000 Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 23 Jan 2013 13:39:22 -0500 Received: from d01dlp01.pok.ibm.com (9.56.250.166) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 23 Jan 2013 13:39:18 -0500 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id E7B0038C8042 for ; Wed, 23 Jan 2013 13:39:17 -0500 (EST) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r0NIdFYN18940124 for ; Wed, 23 Jan 2013 13:39:15 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r0NIdFWX019857 for ; Wed, 23 Jan 2013 16:39:15 -0200 Received: from igoo.rch.stglabs.ibm.com (igoo.rch.stglabs.ibm.com [9.5.12.222]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id r0NIdEig019752; Wed, 23 Jan 2013 16:39:14 -0200 Date: Wed, 23 Jan 2013 18:39:00 -0000 From: Tiago =?iso-8859-1?Q?St=FCrmer?= Daitx To: gdb-patches@sourceware.org Subject: [PATCH] Fix handling of #include files during prologue skipping Cc: emachado@linux.vnet.ibm.com, Ulrich.Weigand@de.ibm.com Message-ID: <51002e51.hBZ7tcMHUsAupjpI%tdaitx@linux.vnet.ibm.com> User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13012318-5806-0000-0000-00001EA83B73 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-01/txt/msg00558.txt.bz2 In symtab.c:skip_prologue_using_sal, the code goes through the SAL markers starting from the beginning of the function, and checks for markers with the same (or increasing line numbers). The idea behind this is that if one gets decreasing line numbers, than one probably have the case where the optimizer scheduled code from later in the function into the prologue. However, the problem was that this code was simply comparing the line *numbers* -- even if they refered to a different file! That's why the presence of the comment makes a difference, because it makes the line number in t.c larger (or smaller) than the line number in t.h. This patch simply considers a change in file equivalent to an increasing line number. Before the fix: $ gdb prologue-include [snip] (gdb) break main Breakpoint 1 at 0x10000594: file prologue-include.h, line 2. After the fix: $ gdb prologue-include [snip] (gdb) break main Breakpoint 1 at 0x1000058c: file prologue-include.h, line 1. No regressions detected on PPC32, PPC64, and AMD64. Regards, Tiago Daitx gdb/ChangeLog 2012-11-01 Ulrich Weigand * symtab.c (skip_prologue_using_sal): Consider a file change the same as an increased file number gdb/testsuite/ChangeLog 2012-11-01 Tiago Stürmer Daitx * gdb.base/prologue-include.c: New file. * gdb.base/prologue-include.exp: New file. * gdb.base/prologue-include.h: New file. diff --git a/gdb/symtab.c b/gdb/symtab.c index d40436a..b200b36 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4905,6 +4905,10 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr) line mark the prologue -> body transition. */ if (sal.line >= prologue_sal.line) break; + /* Likewise if we are in a different symtab altogether + (e.g. within a file included via #include).  */ + if (sal.symtab != prologue_sal.symtab) + break; /* The line number is smaller. Check that it's from the same function, not something inlined. If it's inlined, diff --git a/gdb/testsuite/gdb.base/prologue-include.c b/gdb/testsuite/gdb.base/prologue-include.c new file mode 100644 index 0000000..b39e24d --- /dev/null +++ b/gdb/testsuite/gdb.base/prologue-include.c @@ -0,0 +1,25 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012-2013 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 3 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, see . */ + +int +main (void) +{ + int i, j; +#include "prologue-include.h" + return 0; +} + diff --git a/gdb/testsuite/gdb.base/prologue-include.exp b/gdb/testsuite/gdb.base/prologue-include.exp new file mode 100644 index 0000000..aa30439 --- /dev/null +++ b/gdb/testsuite/gdb.base/prologue-include.exp @@ -0,0 +1,31 @@ +# Copyright (C) 2012-2013 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 3 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, see . + +standard_testfile + +if { [prepare_for_testing ${testfile}.exp ${testfile}] } { + return -1 +} + +#if ![runto callee] { +# return 0 +#} + +set test "break main" +gdb_test_multiple $test $test { + -re "\r\nBreakpoint \[0-9\]+ at .*: file .*/$testfile.h, line 1\\.\r\n$gdb_prompt $" { + pass $test + } +} diff --git a/gdb/testsuite/gdb.base/prologue-include.h b/gdb/testsuite/gdb.base/prologue-include.h new file mode 100644 index 0000000..34b920c --- /dev/null +++ b/gdb/testsuite/gdb.base/prologue-include.h @@ -0,0 +1,2 @@ + i = 2; + j = 2;