[llvm-commits] Stack and register alignment in linux/ppc calls

Chris Lattner clattner at apple.com
Fri Mar 9 03:38:46 PST 2007


On Mar 6, 2007, at 10:03 AM, Nicolas Geoffray wrote:
> This patch corrects arguments passing alignment for linux/ppc calls  
> (ELF ABI).
> It affects LowerFORMAL_ARGUMENTS and LowerCALL of PPCISelLowering.cpp.

Sure, sorry for the delay.  Please add some high-level comments that  
explain what is going on here (what the ABI says).  I would  
eventually like to switch PPC over to using autogenerated callingconv  
code, but I haven't had a chance to finish argument passing.

> @@ -1164,24 +1165,34 @@ static SDOperand LowerFORMAL_ARGUMENTS(S
>      SDOperand ArgVal;
>      bool needsLoad = false;
>      MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
>      unsigned ObjSize = MVT::getSizeInBits(ObjectVT)/8;
>      unsigned ArgSize = ObjSize;
> +    unsigned Flags = cast<ConstantSDNode>(Op.getOperand(ArgNo+3))- 
> >getValue();
> +    // See if next argument requires stack alignment in ELF
> +    unsigned Expand = (ObjectVT == MVT::f64) || ((ArgNo + 1 < e) &&
> +      (cast<ConstantSDNode>(Op.getOperand(ArgNo+4))->getValue() &  
> (1 << 27)) &&
> +      (!(Flags & (1 << 27))));

Please update this to use the enums that anton recently added for  
decoding the flags values.

>      unsigned CurArgOffset = ArgOffset;
>      switch (ObjectVT) {
>      default: assert(0 && "Unhandled argument type!");
>      case MVT::i32:
> +      // Double word align in ELF
> +      if (Expand && !isELF_ABI && !isPPC64) GPR_idx += (GPR_idx % 2);

This says "!isELF_ABI", shouldn't it be "isELF_ABI"?  If not, you're  
modifying the Darwin/PPC ABI.

> -
> +    unsigned Flags = cast<ConstantSDNode>(Op.getOperand(5+2*i+1))- 
> >getValue();
> +    // See if next argument requires stack alignment in ELF
> +    unsigned Expand = (Arg.getValueType() == MVT::f64) ||
> +      ((i + 1 < NumOps) &&
> +      (cast<ConstantSDNode>(Op.getOperand(5+2*(i+1)+1))->getValue()
> +                                                            & (1  
> << 27)) &&
> +      (!(Flags & (1 << 27))));

Likewise, plz use enums here.  Also, there is some funky indentation  
going on here.  Perhaps making a "ConstantSDNode *Tmp" would make  
this more natural.

>      // PtrOff will be used to store the current argument to the  
> stack if a
>      // register cannot be found for it.
> -    SDOperand PtrOff = DAG.getConstant(ArgOffset,  
> StackPtr.getValueType());
> +    SDOperand PtrOff;
> +
> +    // Stack align in ELF
> +    if (isELF_ABI && Expand && !isPPC64)
> +        PtrOff = DAG.getConstant(ArgOffset + ((ArgOffset/4) % 2) *  
> PtrByteSize,
> +            StackPtr.getValueType());
> +    else
> +        PtrOff = DAG.getConstant(ArgOffset, StackPtr.getValueType());
> +

Funky indentation.  Statements should be indented by 2.   
Subexpressions (StackPtr.getValueType() should be aligned to the (.

Otherwise, looks great, thanks!

-Chris



More information about the llvm-commits mailing list