This question is similar to my last; however, I think it provides a
bit more clarity as to how I am obtaining offsets from the frame
pointer.  I have an RTL pass that is processed after expand passes.  I
keep track of a list of stack allocated variables.  For each VAR_DECL,
I obtain the DECL_RTL rtx.  Since these variables are local, the RTL
expression reflects an offset from the stack frame pointer.  For
instance, the variable 'matt':

(mem/f/c:DI (plus:DI (reg/f:DI 20 frame)
        (const_int -8 [0xfffffffffffffff8])) [0 matt+0 S8 A64])

I interpret this as being -8 bytes away from the frame pointer, when
the function 'matt' has scope in is executing.  Since 'matt' is a
pointer, and the stack grows downward (x86), and this is a 64-bit
machine, the contents of 'matt' end at the frame pointer and span 8
bytes below the frame pointer to where the first byte of 'matt'
begins.  This is fine in some cases, but if I were to rewrite the
source and add a few more variables.  It seems that there might be a
few words of padding before the data for the first variable from the
stack pointer begins.  If I were to add a 4 byte integer to this
function, 'matt' would still be declared in RTL as above, but instead
of really being -8 it is actually -32.  Where do the 24 bytes of
padding between the frame pointer and the last byte of 'matt' come
from?   Further, how can I find this initial padding offset at compile
time?  I originally thought that the offset in the rtx, as above,
would reflect this stack realignment, but it appears not to.

-Matt

Reply via email to