From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12252 invoked by alias); 2 Jun 2009 16:21:48 -0000 Received: (qmail 11973 invoked by uid 22791); 2 Jun 2009 16:21:45 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (212.99.106.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 02 Jun 2009 16:21:38 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id C289129003C for ; Tue, 2 Jun 2009 18:21:35 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iaMYnAI1Ilsp for ; Tue, 2 Jun 2009 18:21:35 +0200 (CEST) Received: from province.act-europe.fr (province.act-europe.fr [10.10.0.214]) by mel.act-europe.fr (Postfix) with ESMTP id F107D29000F for ; Tue, 2 Jun 2009 18:21:34 +0200 (CEST) Received: by province.act-europe.fr (Postfix, from userid 560) id E595A16639A; Tue, 2 Jun 2009 18:21:34 +0200 (CEST) Date: Tue, 02 Jun 2009 16:21:00 -0000 From: Jerome Guitton To: gdb-patches@sourceware.org Subject: [RFA] skip_prologue_sal and sal expansion Message-ID: <20090602162133.GA20678@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="gKMricLos+KVdGMg" Content-Disposition: inline User-Agent: Mutt/1.5.17 (2007-11-01) 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: 2009-06/txt/msg00019.txt.bz2 --gKMricLos+KVdGMg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 2355 A couple of cleanups in breakpoint.c. Let me give some background first; consider the following program: int counter = 42; inline void callee () { counter = 0; /* set breakpoint in an inlined function. */ } void caller () { callee (); } int main () { caller (); callee (); return counter; } When callee is inlined, we have three occurence for the line "counter = 0;": inlined in caller, inlined in main, and not inlined. When a breakpoint is set on this line, GDB sets a breakpoint on 3 locations. (gdb) l p.c:6 1 int counter = 42; 2 3 inline void 4 callee () 5 { 6 counter = 0; 7 } 8 9 void 10 caller () (gdb) b 6 Breakpoint 1 at 0x1800074: file p.c, line 6. (3 locations) I have recently hit a bug in an assembler which was optimizing out the prologue line info; it was making GDB think that the line "counter = 0;" was a part of callee's prologue. And this pointed me to something strange in GDB. After having used this bogus assembler to generate my program, if I try to set a breakpoint at line "counter = 0;", I end up with only one occurence instead of three: (gdb) b 6 Breakpoint 1 at 0x1800074: file p.c, line 6. The problem was in skip_prologue_sal defined in breakpoint.c. When it actually skips a prologue, it does not assure that the other sal's fields (explicit_pc and explicit_line) are left unchanged. In my case, it was accidently changing explicit_line from 1 to 0. This change disabled the line sal expansion, and in consequence we ended up with the breakpoint set in only one location. I think that it's a bug in skip_prologue_sal, this function should not change mess with these fields. Now, if I change skip_prologue_sal to copy explicit_line and explicit_pc, the line expansion is done; but we should make sure that prologue is skipped similarly, otherwise we get an assertion failure when the address returned by resolve_sal_pc cannot be found after line sal expansion: (gdb) break p.c:6 ../../src/gdb/breakpoint.c:5113: internal-error: expand_line_sal_maybe: Assertion `found' failed. Patch attached, tested on x86-linux. OK to apply? 2009-06-02 Jerome Guitton * breakpoint.c (expand_line_sal_maybe): When explicit_line, skip prologue on each sals. (skip_prologue_sal): Return explicit_line and explicit_pc unmodified. --gKMricLos+KVdGMg Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="inline.diff" Content-length: 1568 Index: breakpoint.c =================================================================== --- breakpoint.c (revision 148760) +++ breakpoint.c (working copy) @@ -207,6 +207,9 @@ static void disable_trace_command (char static void trace_pass_command (char *, int); +static void skip_prologue_sal (struct symtab_and_line *sal); + + /* Flag indicating that a command has proceeded the inferior past the current breakpoint. */ @@ -5412,6 +5415,15 @@ expand_line_sal_maybe (struct symtab_and } } } + else + { + for (i = 0; i < expanded.nelts; ++i) + { + /* If this SAL corresponds to a breakpoint inserted using a + line number, then skip the function prologue if necessary. */ + skip_prologue_sal (&expanded.sals[i]); + } + } if (expanded.nelts <= 1) @@ -5896,7 +5908,8 @@ set_breakpoint (char *address, char *con /* Adjust SAL to the first instruction past the function prologue. The end of the prologue is determined using the line table from - the debugging information. + the debugging information. explicit_pc and explicit_line are + not modified. If SAL is already past the prologue, then do nothing. */ @@ -5911,7 +5924,11 @@ skip_prologue_sal (struct symtab_and_lin start_sal = find_function_start_sal (sym, 1); if (sal->pc < start_sal.pc) - *sal = start_sal; + { + start_sal.explicit_line = sal->explicit_line; + start_sal.explicit_pc = sal->explicit_pc; + *sal = start_sal; + } } /* Helper function for break_command_1 and disassemble_command. */ --gKMricLos+KVdGMg--