From: Michael Snyder <msnyder@cygnus.com>
To: "Peter.Schauer" <Peter.Schauer@regent.e-technik.tu-muenchen.de>
Cc: gdb-patches@sourceware.cygnus.com, taylor@cygnus.com
Subject: Re: [PATCH]: Make Sparc Target Multi-Arch
Date: Tue, 02 May 2000 10:13:00 -0000 [thread overview]
Message-ID: <390F0C46.451B@cygnus.com> (raw)
In-Reply-To: <200005021109.NAA12981@reisser.regent.e-technik.tu-muenchen.de>
Peter.Schauer wrote:
>
> > I've also included in this patch the ability to do call-dummies
> > using the AT_ENTRY_POINT method, rather than pushing instructions
> > onto the stack (since that isn't allowed in 64-bit Solaris).
>
> Using AT_ENTRY_POINT will return bad results when calling a Sun cc compiled
> function that returns a struct from within GDB.
>
> Sun cc generates code which checks the expected structure size against
> the passed structure size (in the extra word after the call) and does not
> copy to the result structure if the sizes don't match.
> Below is the disassembly of a function returning a structure with size 16.
Yuck! Well, I can't use ON_STACK, because (a) the stack section
is protected against execution in Solaris/Sparc64, and (b) it's
too far from the text section for an ordinary jump/call.
What if I write the return struct size to the entry point address,
following the trap instruction, and remove it when finished
(like the trap instruction)?
From ezannoni@cygnus.com Tue May 02 13:10:00 2000
From: Elena Zannoni <ezannoni@cygnus.com>
To: Elena Zannoni <ezannoni@cygnus.com>
Cc: Jim Blandy <jimb@cygnus.com>, gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH] in_prologue() fix
Date: Tue, 02 May 2000 13:10:00 -0000
Message-id: <14607.13887.744690.553862@kwikemart.cygnus.com>
References: <14598.9829.764888.505476@kwikemart.cygnus.com> <nphfcojymh.fsf@zwingli.cygnus.com> <14599.32044.511265.33190@kwikemart.cygnus.com>
X-SW-Source: 2000-05/msg00031.html
Content-length: 2507
Ok, just to follow up on this: after personal e-mail/phone exchanges
with Jim, we agreed on a different solution. So this patch is withdrawn.
Elena
Elena Zannoni writes:
> Jim Blandy writes:
> >
> > > It may be that the real fix is to make ecs->stop_func_start be the
> > > beginning of the function where the adjusted stop_pc is. However that
> > > would require several changes to H.I.E. But in any event in_prologue()
> > > is wrong for this particular case.
> >
> > My first question is, if HIE can find enough symbolic information to
> > set ecs->stop_func_{name,start,end}, how come in_prologue can't find
> > it?
> >
>
> I am not sure I understand your question. in_prologue finds the start
> and end of the function within which pc is (in the same way HIE does for
> the wrong pc). Because of the way in_prologue works, the info found is
> not compared with the input function address. Doing this would be
> another way to fix the problem, but you would have to rewrite
> in_prologue. What I am trying to say is that in_prologue takes 2
> inputs: a pc and a function start address. It has to determine if the
> pc is within the prologue of the function starting at the address. In
> this case it gets it wrong because it doesn't think about checking if pc
> is within the function at all.
>
>
> > In other words: your explanation implies that HIE has some way to find
> > the function extent, but happens to be wrong because of
> > DECR_PC_AFTER_BREAK lossage. But in_prologue knows the correct PC;
> > why can't it use the same mechanism HIE used earlier to get the right
> > answer?
> >
>
> It does use the same mechanism (find_pc_partial_function) but it
> doesn't check the results properly.
>
> > Also, aren't there other adverse consequences when
> > ecs->stop_func_{name,start,end} are wrong? I think the HIE fix is the
> > right thing. HIE is painful for me too, but otherwise, you'll just
> > get another CR in a month.
> >
>
> So I thought too. But in case of breakpoint being hit,
> bpstat_stop_status() computes the stop_pc again, and corrects it. All
> the info is printed correctly. I haven't looked at this in too much
> detail though. I can add a FIXME to HIE to warn for the possibility of
> problems down the road. I have no time now to try to fix this.
>
> > If you've tested the change on SPARC and i386, it's okay with me.
>
> I tested on sparc, I will test on linux.
>
> Elena
>
From ezannoni@cygnus.com Tue May 02 13:20:00 2000
From: Elena Zannoni <ezannoni@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH] in_prologue() fix #2
Date: Tue, 02 May 2000 13:20:00 -0000
Message-id: <14607.14500.451080.510575@kwikemart.cygnus.com>
X-SW-Source: 2000-05/msg00032.html
Content-length: 4726
This patch supercedes the one in:
http://sourceware.cygnus.com/ml/gdb-patches/2000-04/msg00456.html
This is a rewrite of in_prologue(). Jim is the real author of this
patch, I have tested it on d10v (solves the original problem),
solaris/sparc, linux/i386 w/ no regressions in the testsuite.
I'll check this in tomorrow, if there are no objections.
Elena
Tue May 2 13:17:21 2000 Elena Zannoni (ezannoni@makita.cygnus.com)
* symtab.c (in_prologue): From Jim Blandy. Rewrite, more
intelligently, making sure we use the information from the
symbol tables fully.
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.3
diff -u -p -r1.3 symtab.c
--- symtab.c 2000/04/04 02:08:52 1.3
+++ symtab.c 2000/05/02 20:15:12
@@ -4402,43 +4402,64 @@ in_prologue (pc, func_start)
struct symtab_and_line sal;
CORE_ADDR func_addr, func_end;
- if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
- goto nosyms; /* Might be in prologue */
+ /* We have several sources of information we can consult to figure
+ this out.
+ - Compilers usually emit line number info that marks the prologue
+ as its own "source line". So the ending address of that "line"
+ is the end of the prologue. If available, this is the most
+ reliable method.
+ - The minimal symbols and partial symbols, which can usually tell
+ us the starting and ending addresses of a function.
+ - If we know the function's start address, we can call the
+ architecture-defined SKIP_PROLOGUE function to analyze the
+ instruction stream and guess where the prologue ends.
+ - Our `func_start' argument; if non-zero, this is the caller's
+ best guess as to the function's entry point. At the time of
+ this writing, handle_inferior_event doesn't get this right, so
+ it should be our last resort. */
+
+ /* Consult the partial symbol table, to find which function
+ the PC is in. */
+ if (! find_pc_partial_function (pc, NULL, &func_addr, &func_end))
+ {
+ CORE_ADDR prologue_end;
+
+ /* We don't even have minsym information, so fall back to using
+ func_start, if given. */
+ if (! func_start)
+ return 1; /* We *might* be in a prologue. */
- sal = find_pc_line (func_addr, 0);
-
- if (sal.line == 0)
- goto nosyms;
-
- /* sal.end is the address of the first instruction past sal.line. */
- if (sal.end > func_addr
- && sal.end <= func_end) /* Is prologue in function? */
- return pc < sal.end; /* Yes, is pc in prologue? */
-
- /* The line after the prologue seems to be outside the function. In this
- case, tell the caller to find the prologue the hard way. */
+ prologue_end = SKIP_PROLOGUE (func_start);
- return 1;
+ return func_start <= pc && pc < prologue_end;
+ }
-/* Come here when symtabs don't contain line # info. In this case, it is
- likely that the user has stepped into a library function w/o symbols, or
- is doing a stepi/nexti through code without symbols. */
-
-nosyms:
-
-/* If func_start is zero (meaning unknown) then we don't know whether pc is
- in the prologue or not. I.E. it might be. */
-
- if (!func_start)
- return 1;
+ /* If we have line number information for the function, that's
+ usually pretty reliable. */
+ sal = find_pc_line (func_addr, 0);
-/* We need to call the target-specific prologue skipping functions with the
- function's start address because PC may be pointing at an instruction that
- could be mistakenly considered part of the prologue. */
+ /* Now sal describes the source line at the function's entry point,
+ which (by convention) is the prologue. The end of that "line",
+ sal.end, is the end of the prologue.
+
+ Note that, for functions whose source code is all on a single
+ line, the line number information doesn't always end up this way.
+ So we must verify that our purported end-of-prologue address is
+ *within* the function, not at its start or end. */
+ if (sal.line == 0
+ || sal.end <= func_addr
+ || func_end <= sal.end)
+ {
+ /* We don't have any good line number info, so use the minsym
+ information, together with the architecture-specific prologue
+ scanning code. */
+ CORE_ADDR prologue_end = SKIP_PROLOGUE (func_addr);
- func_start = SKIP_PROLOGUE (func_start);
+ return func_addr <= pc && pc < prologue_end;
+ }
- return pc < func_start;
+ /* We have line number info, and it looks good. */
+ return func_addr <= pc && pc < sal.end;
}
next parent reply other threads:[~2000-05-02 10:13 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200005021109.NAA12981@reisser.regent.e-technik.tu-muenchen.de>
2000-05-02 10:13 ` Michael Snyder [this message]
2000-05-02 13:46 ` Peter.Schauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=390F0C46.451B@cygnus.com \
--to=msnyder@cygnus.com \
--cc=Peter.Schauer@regent.e-technik.tu-muenchen.de \
--cc=gdb-patches@sourceware.cygnus.com \
--cc=taylor@cygnus.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox