Kenneth Zadeck <[EMAIL PROTECTED]> writes:
> 1) Do you believe that this code could be correct?
Well, no.
> 2) Most of the paragraphs are protected by either reload_completed or
> epilogue_completed (which has a comment at the its point of
> declaration that it is true for both the prologue and epilogue). Is
> it true that after these epochs, that there will really be code in the
> first basic block that will def these registers? I.e. are any of them
> implicitly set before the function is called so I will not find a def?
This isn't quite accurate. When the RTL is initially generated, for
any values passed in parameters you will see at the start of the
function
(set (pseudo-reg) (param-reg))
That is, parameter handling is independent of the prologue/epilogue
code, and thus independent of epilogue_completed. If you want to
declare that all FUNCTION_ARG_REGNO_P registers are live, you should
do that regardless of epilogue_completed.
Actually FUNCTION_ARG_REGNO_P is not enough. It returns true for
outgoing function registers. On a target with register windows, at
the start of the function you need to apply INCOMING_REGNO to each
register for which FUNCTION_ARG_REGNO_P returns true.
The prologue code which is set up when epilogue_completed is true is
code which sets up the stack frame and saves the callee saved
registers on the stack. So when epilogue_completed is true, then at
the start of the function you will probably want to treat as live
every callee saved register for which regs_ever_live is true. For
some targets the frame pointer will be live on function entry, for
others it is initialized by the prologue if necessary.
Assuming that PIC_OFFSET_TABLE_REGNUM is defined isn't always going to
be correct, although it may not matter. On some targets, e.g., i386,
the register will be defined by the prologue code anyhow.
> 3) Am I missing any classes of registers?
For complete accuracy, there are probably going to be some target
specific registers which need to be handled, unfortunately. For
example, on MIPS, with -mabicalls (which is the default on GNU/Linux),
$25 is live on function entry. It holds the address of the function,
and is used to initialize $28, which is PIC_OFFSET_TABLE_REGNUM. I
don't think there is any target independent way of getting at that
fact.
It is also worth noting that rather than assuming that all
FUNCTION_ARG_REGNO_P registers are live, you could use
FUNCTION_ARG/FUNCTION_ARG_ADVANCE to walk through the parameters and
determine precisely which ones are live. I don't know whether that
will make a significant difference for the rest of the code, though.
Ian