From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4847 invoked by alias); 15 Jun 2009 10:49:02 -0000 Received: (qmail 4839 invoked by uid 22791); 15 Jun 2009 10:49:01 -0000 X-SWARE-Spam-Status: No, hits=-2.4 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; Mon, 15 Jun 2009 10:48:55 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 7C4C7290006 for ; Mon, 15 Jun 2009 12:48:52 +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 0EOgQQE-XdwF for ; Mon, 15 Jun 2009 12:48:51 +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 C8B53290004 for ; Mon, 15 Jun 2009 12:48:51 +0200 (CEST) Received: by province.act-europe.fr (Postfix, from userid 560) id BC5001663D9; Mon, 15 Jun 2009 12:48:51 +0200 (CEST) Date: Mon, 15 Jun 2009 10:49:00 -0000 From: Jerome Guitton To: gdb-patches@sourceware.org Subject: Re: [RFA] skip_prologue_sal and sal expansion Message-ID: <20090615104851.GA50666@adacore.com> References: <20090602162133.GA20678@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090602162133.GA20678@adacore.com> 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/msg00381.txt.bz2 Ping Jerome Guitton (guitton@adacore.com): > > 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. > 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. */