[LLVMdev] Stack alignment problem

Chris Lattner sabre at nondot.org
Thu Mar 24 20:55:20 PST 2005


yOn Wed, 23 Mar 2005, Vladimir Prus wrote:
>> 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?

Every target (not just x86) uses these.  Basically they are pseudo 
instructions that mark the begin/end of the call sequence.  On targets 
that support frame pointer elimination, they expand different ways (e.g. 
into a noop if fp-eliminating, or into [e.g.] "sub ESP, 40" if not).

I think it's a good idea for your target to do similar things, for 
consistency if nothing else, but if you really want to, I wouldn't be 
opposed to making that also check for instructions that isCall.

-Chris

-- 
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/




More information about the llvm-dev mailing list