On 7/28/13 8:16 AM, David Given wrote:
I am having a great deal of trouble getting register elimination (and
stack frame layouts in general) working properly on my architecture.
There is some fundamental issue I'm simply not getting here.
[...]
Weirdness (1): I never see ARG_POINTER_REGNUM used to access arguments.
The compiler seems to want to access function arguments via
FRAME_POINTER_REGNUM plus a small value, which means they overlap the
locals. (It's definitely using the same numeric ranges. It looks like
it's trying to use ARG_POINTER_REGNUM but is getting the wrong register.)
Internally, ARG_POINTER_REGNUM is a pointer to the incoming arguments
which is pushed into stack by caller, and FRAME_POINTER_REGNUM is a
pointer to the first location of local variables.
| |
old stack pointer -> ----
| | \
| | incoming arguments pushed by caller
| | /
argument pointer -> --
| |
| |
| |
frame pointer -> --
| | \
| | local variables
| | /
--
| | \
| | outgoing arguments
| | /
stack pointer -> ----
| |
Weirdness (2): the following test function generates code with tries to
copy AP_REG into a register without eliminating it.
[...]
I don't know whether this is just talking about the MCore, or gcc in
general --- I find it interesting that most backends which use a fake
frame pointer seem to end up with FRAME_POINTER_REGNO and
HARD_FRAME_POINTER_REGNO pointing at different addresses.
If anyone can offer any suggestions as to what I'm doing wrong --- or,
better still, point me at more in-depth reading on how all this is
supposed to work!
Did you implement TARGET_CAN_ELIMINATE and INITIAL_ELIMINATION_OFFSET ??
You need to implement these two target macros to eliminate ARG_POINTER_REGNUM
and FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM.
Best regards,
jasonwucj