[LLVMdev] Stack alignment problem
Vladimir Prus
ghost at cs.msu.su
Tue Mar 22 23:26:59 PST 2005
On Tuesday 22 March 2005 20:34, Chris Lattner wrote:
> Can you explain the problem in more detail? Specifically the LLVM code
> gneerator assumes that there is some alignment that the stack is required
> to have as part of its ABI. For example, in X86 target machine, the stack
> is 8-byte aligned on entry to function calls.
>
> What this means is that the frame info can assume that the stack pointer
> is 8-byte aligned on entry to every function, but that it has to preserve
> this alignment for any functions that call another function (oh and it
> also has to remember that the return address gets pushed as well).
>
> This is why frame info works the way it does: it assumes that there is no
> reason to keep the outgoing stack pointer aligned unless there is a call.
>
> How is your target different here? Can you give an example of why this
> causes a problem?
Here's the code which computes the hasCalls flag:
bool HasCalls = false;
for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); )
if (I->getOpcode() == FrameSetupOpcode ||
I->getOpcode() == FrameDestroyOpcode) {
.........
HasCalls = true;
........
So, stack is aligned only if there is instruction with FrameSetupOpcode or
FrameDestroyOpcode. In X86, it's defined as
def ADJCALLSTACKDOWN : I<0, Pseudo, (ops), "#ADJCALLSTACKDOWN">;
def ADJCALLSTACKUP : I<0, Pseudo, (ops), "#ADJCALLSTACKUP">;
And I'm not quite sure why I need to define and insert something similar. Why
can't the above code just check for call instructions, as opposed to
"FrameSetup" instructions?
- Volodya
More information about the llvm-dev
mailing list