From: Andrew Cagney <ac131313@cygnus.com>
To: Michael Snyder <msnyder@redhat.com>, Kevin Buettner <kevinb@redhat.com>
Cc: gdb@sources.redhat.com
Subject: Re: [rfc] ``pc'' -> resume_addr?
Date: Fri, 12 Apr 2002 08:59:00 -0000 [thread overview]
Message-ID: <3CB70459.2010405@cygnus.com> (raw)
In-Reply-To: <3CB628D0.8DC57F22@redhat.com>
>> I think the name ``pc'' brings with it a certain amount of baggage.
>> When reading a piece of code, it isn't clear if the hardware ``pc''
>> (possibly needing adjustment) or the program's resume address is being used.
>
>
> When are they not the same?
I'm not sure. I'm also not the only one :-) cf:
/* Are we in a call dummy? The code below which allows DECR_PC_AFTER_BREAK
below is for infrun.c, which may give the macro a pc without that
subtracted out. */
int
pc_in_call_dummy_before_text_end (CORE_ADDR pc, CORE_ADDR sp,
CORE_ADDR frame_address)
{
return ((pc) >= text_end - CALL_DUMMY_LENGTH
&& (pc) <= text_end + DECR_PC_AFTER_BREAK);
}
In reading the code, I never know if I've got a ``pc'' or a ``pc''. If
I print the value and it isn't as expected, I'm left wondering if I
should adjust it, or that something somewhere else forgot to adjust it.
>> On an x86, and m68k, for instance, the hardware PC may or may not need
>> to be adjusted (decr_pc_after_break()) before it becomes a frame->pc.
>
>
> Yeah -- but this is done almost immediately after the target stops.
> Past that point, the hardware pc _is_ equal to the address at which
> execution will resume. Before that point, we haven't really built
> or used very many of these objects called 'pc' or 'something->pc'.
> Have we?
Ok, I think I've figured out how this ``works'':
- target stops
- infrun has an initial look round. If it doesn't think the read_pc()
value is interesting, it resumes the target. Thing is, I can't detect
any write_pc() for this case - as best as I can tell it resumes the
target without adjusting the PC.
- Otherwise infrun calls bpstat_stop_status() and that will eventually call:
write_pc(read_pc()-decr);
and patch up that PC value. Ulgh!
- finally the block/frame is created. This calls read_pc() and gets
the ``fixed'' pc.
I don't know if this can really be called ``immediatly after'' the
target stops. infrun.c, for instance, can call functions (such as
pc_in_call_dummy) with either [PC] or [PC]-DECR_PC_AFTER_BREAK.
I think even more troubling (and something I didn't realize) is that the
meaning of read_pc() its self changes as you step through the code:
read_pc() != read_pc().
>> Within the frame, the ``pc'' designates ``resume'' address of the
>> function. Knowing this is important when understanding why some of the
>> frame code does:
>>
>> if (frame->next != NULL)
>> return frame->pc - 1;
>> else
>> return frame->pc;
>
>
> Uggh. Where does THAT code come from? ;-)
blockframe.c:get_frame_block() (it is lightly different). The code is
wierd but correct.
>> Remember, when making an inferior function call, GDB does not set the
>> PC. Rather it sets the resume/continue address using the debug info.
>> For instance, on the sparc, it sets:
>>
>> [PC] = resume_addr;
>> [NPC] = resume_addr + 4;
>>
>> This behavour is very different to what the user is trying to achieve if
>> they enter:
>>
>> (gdb) jump *foo *bar
>>
>> On a sparc, that would execute:
>>
>> *foo
>> *bar
>> *(bar + 4)
>> *(bar + 8)
>
>
> Whoa, you lost me. The "jump" command only accepts one argument.
> What does "jump *foo *bar" mean?
Sorry, I'm wrong. I thought that was implemented but (fortunatly) it
isn't. The semantics would be: [PC] = '*foo'. [NPC] = '*bar'.
--
I guess there are several things here:
frame->pc
this is the resume address (always?)
read_pc()
thanks to decr_pc_after_break, this
isn't defined.
decr_pc_after_break
the real villian
enjoy,
Andrew
next prev parent reply other threads:[~2002-04-12 15:59 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-04-11 13:38 Andrew Cagney
2002-04-11 13:58 ` Kevin Buettner
2002-04-11 15:15 ` Andrew Cagney
2002-04-11 16:35 ` Andrew Cagney
2002-04-11 16:48 ` Kevin Buettner
2002-04-11 17:08 ` Andrew Cagney
2002-04-11 17:37 ` Michael Snyder
2002-04-11 16:42 ` Kevin Buettner
2002-04-11 17:39 ` Michael Snyder
2002-04-11 17:34 ` Michael Snyder
2002-04-12 8:59 ` Andrew Cagney [this message]
2002-04-13 20:21 ` Andrew Cagney
2002-04-11 17:25 ` Michael Snyder
2002-04-26 8:09 ` Andrew Cagney
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=3CB70459.2010405@cygnus.com \
--to=ac131313@cygnus.com \
--cc=gdb@sources.redhat.com \
--cc=kevinb@redhat.com \
--cc=msnyder@redhat.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