This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Stack offset computation for incoming arguments.


Hi All,

Our private backend has the macro  defined as

#define FIRST_PARM_OFFSET(FNDECL)  (get_frame_size() +
STARTING_FRAME_OFFSET  + RETURN_BYTES )

#define STARTING_FRAME_OFFSET  1

#define STACK_POINTER_REGNUM    10

#define FRAME_POINTER_REGNUM STACK_POINTER_REGNUM

#define ARG_POINTER_REGNUM STACK_POINTER_REGNUM

                #define  RETURN_BYTES  2

The  pass i.e instantiate_virtual_regs  set the  in_arg_offset as

in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);

the computed  frame_size is X and in_arg_offset is X + 1 + 2  i.e X + 3.

And calls the instantiate_virtual_regs_in_rtx function  ,which emits
the insns to access the incoming argumnets (that are passed with
stack) via stack_pointer_rtx  + in_arg_offset (stack grows downward).

But in the reload pass the the alter_reg function (spill the  reg to
stack ) expand the stack frame and update the frame_size i.e  X = X +
allocated space.

For each spill the frame_size is updated  and at the end of the reload
pass the frame_size=frame_size+ total_allocated_spilled _space;

Our prologue  code looks like

void expand_prologue()
{

        HOST_WIDE_INT frame_size = get_frame_size ();  //here
frame_size=frame_size+ total_allocated_spilled _space;
        rtx reg,insn ;

        if(frame_size > 0 )
        {
                insn =
emit_move_insn(stack_pointer_rtx,gen_rtx_MINUS(GET_MODE(stack_pointer_rtx),stack_pointer_rtx,(GEN_INT(frame_size))
));
                RTX_FRAME_RELATED_P (insn) = 1;
        }
}


The problem is that the frame_size is not same ,when there is the
spill code between  instantiate_virtual_regs_in_rtx()  and
expand_prologue() ,hence incoming arg offset goes for a  toss like

sub sp ,10            // prologue where frame_size =10

ld  R1,sp               // accessing the first argument that is passed
in the stack;
add R1, 11           // the offset should be 13  i.e frame_size + 1 +
2; but it is 11 (stack_pointer_rtx  + (in_arg_offset =11)  where the
frame_size is 8  for locals )
ld  R2, [R1]

ld[sp+9] ,R10      // spill code

add sp,10 // epilogue

In the above asm  the  incoming arguments fetch  going for a  toss
,Any idea what  going wrong with the computation offset for incoming
arguments  here ??

Thank you
~Umesh


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]