Question about DRAP register and reserving hard registers
Richard Henderson
rth@redhat.com
Mon Jun 29 10:10:00 GMT 2015
On 06/22/2015 11:14 PM, Steve Ellcey wrote:
> On Fri, 2015-06-19 at 09:09 -0400, Richard Henderson wrote:
>> On 06/16/2015 07:05 PM, Steve Ellcey wrote:
>>>
>>> I have a question about the DRAP register (used for dynamic stack alignment)
>>> and about reserving/using hard registers in general. I am trying to understand
>>> where, if a drap register is allocated, GCC is told not to use it during
>>> general register allocation. There must be some code somewhere for this
>>> but I cannot find it.
>>
>> There isn't. Because the vDRAP register is a pseudo. The DRAP register is
>> only live from somewhere in the middle of the prologue to the end of the prologue.
>>
>> See ix86_get_drap_rtx, wherein we coordinate with the to-be-generated prologue
>> (crtl->drap_reg), allocate the pseudo, and emit the hard-reg-to-pseudo copy at
>> entry_of_function.
>>
>>
>> r~
>
> OK, I think I have this part of the code working on MIPS but
> crtl->drap_reg is used in the epilogue as well as the prologue even if
> it is not 'live' in between. If I understand the code correctly the x86
> prologue pushes the drap register on to the stack so that the epilogue
> can pop it off and use it to restore the stack pointer. Is my
> understanding correct?
Yes. Although that saved copy is also used by unwind info.
>
> I also need the drap pointer in the MIPS epilogue but I would like to
> avoid having to get it from memory. Ideally I would like to restore it
> from the virtual register that the prologue code / get_drap_rtx code put
> it into. I tried just doing a move from the virtual drap register to
> the real one in expand_epilogue but that didn't work because it looks
> like you can't access virtual registers from expand_prologue or
> expand_epilogue. I guess that is why the code to copy the hard drap reg
> to the virtual drap_reg is done in get_drap_reg and not in
> expand_prologue. I thought about putting code in get_drap_reg to do
> this copying but I don't see how to access the end of a function. The
> hard drap reg to virtual drap reg copy is inserted into the beginning of
> a function with:
>
> insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
>
> Is there an equivalent method to insert code to the end of a function?
> I don't see an 'end_of_function ()' routine anywhere.
Because, while generating initial rtl for a function, the beginning of a
function has already been emitted, while the end of the function hasn't.
You'd need to hook into expand_function_end, right at the bottom, before the
call to use_return_register.
r~
More information about the Gcc
mailing list