[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