[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