On Mon, 2015-06-29 at 11:10 +0100, Richard Henderson wrote: > > 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~
I ran into an interesting issue while doing this. Right now the expand pass calls construct_exit_block (which calls expand_function_end) before it calls expand_stack_alignment. That means that crtl->drap_reg, etc are not yet set up when in expand_function_end. I moved the expand_stack_alignment call up before construct_exit_block to fix that. I hope moving it up doesn't break anything. Steve Ellcey sell...@imgtec.com