[llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelLowering.cpp ARMTargetMachine.cpp

Lauro Ramos Venancio lauro.venancio at gmail.com
Tue Feb 13 09:33:11 PST 2007


Hi Evan,

I change function arguments alignment only for ELF. The code generated
for mtriple=arm-apple-darwin remains the same. For now, I am
implementing only ARM EABI. I don't have testing environment for
others ABIs. Did you found any miscompilation caused by this patch?

Lauro

2007/2/13, Evan Cheng <evan.cheng at apple.com>:
> Hi Lauro,
>
> This is wrong for Mac OS X. Please back out the patch until it is
> fixed. Make sure you conditionalize base on the ABI of choice
>
> Please add an ABI enum ABIType to ARMSubtarget.h and the
> corresponding methods. Looking at llvm-gcc/gcc/config/arm/arm.h, I
> see there are 5 ARM abi's:
>
>    ARM_ABI_APCS,
>    ARM_ABI_ATPCS,
>    ARM_ABI_AAPCS,
>    ARM_ABI_IWMMXT,
>    ARM_ABI_AAPCS_LINUX
>
> The default is ARM_ABI_APCS, I suppose ARM EABI is ARM_ABI_AAPCS_LINUX?
>
> Thanks,
>
> Evan
>
> On Feb 13, 2007, at 6:07 AM, Lauro Ramos Venancio wrote:
>
> >
> >
> > Changes in directory llvm/lib/Target/ARM:
> >
> > ARMISelLowering.cpp updated: 1.13 -> 1.14
> > ARMTargetMachine.cpp updated: 1.20 -> 1.21
> > ---
> > Log message:
> >
> > According to ARM EABI, 8-bytes function arguments must be 8-bytes
> > aligned.
> >
> >
> > ---
> > Diffs of the changes:  (+53 -30)
> >
> >  ARMISelLowering.cpp  |   79 +++++++++++++++++++++++++++++++
> > +-------------------
> >  ARMTargetMachine.cpp |    4 +-
> >  2 files changed, 53 insertions(+), 30 deletions(-)
> >
> >
> > Index: llvm/lib/Target/ARM/ARMISelLowering.cpp
> > diff -u llvm/lib/Target/ARM/ARMISelLowering.cpp:1.13 llvm/lib/
> > Target/ARM/ARMISelLowering.cpp:1.14
> > --- llvm/lib/Target/ARM/ARMISelLowering.cpp:1.13      Sat Feb  3
> > 02:53:01 2007
> > +++ llvm/lib/Target/ARM/ARMISelLowering.cpp   Tue Feb 13 08:07:13 2007
> > @@ -338,29 +338,36 @@
> >  }
> >
> >  static void
> > -HowToPassArgument(MVT::ValueType ObjectVT,
> > -                  unsigned NumGPRs, unsigned &ObjSize, unsigned
> > &ObjGPRs) {
> > -  ObjSize = 0;
> > -  ObjGPRs = 0;
> > -
> > +HowToPassArgument(MVT::ValueType ObjectVT, unsigned NumGPRs,
> > +                  unsigned StackOffset, unsigned &NeededGPRs,
> > +                  unsigned &NeededStackSize, unsigned &GPRPad,
> > +                  unsigned &StackPad, unsigned Flags) {
> > +  NeededStackSize = 0;
> > +  NeededGPRs = 0;
> > +  StackPad = 0;
> > +  GPRPad = 0;
> > +  unsigned align = (Flags >> 27);
> > +  GPRPad = NumGPRs % ((align + 3)/4);
> > +  StackPad = StackOffset % align;
> > +  unsigned firstGPR = NumGPRs + GPRPad;
> >    switch (ObjectVT) {
> >    default: assert(0 && "Unhandled argument type!");
> >    case MVT::i32:
> >    case MVT::f32:
> > -    if (NumGPRs < 4)
> > -      ObjGPRs = 1;
> > +    if (firstGPR < 4)
> > +      NeededGPRs = 1;
> >      else
> > -      ObjSize = 4;
> > +      NeededStackSize = 4;
> >      break;
> >    case MVT::i64:
> >    case MVT::f64:
> > -    if (NumGPRs < 3)
> > -      ObjGPRs = 2;
> > -    else if (NumGPRs == 3) {
> > -      ObjGPRs = 1;
> > -      ObjSize = 4;
> > +    if (firstGPR < 3)
> > +      NeededGPRs = 2;
> > +    else if (firstGPR == 3) {
> > +      NeededGPRs = 1;
> > +      NeededStackSize = 4;
> >      } else
> > -      ObjSize = 8;
> > +      NeededStackSize = 8;
> >    }
> >  }
> >
> > @@ -383,12 +390,16 @@
> >
> >    // Add up all the space actually used.
> >    for (unsigned i = 0; i < NumOps; ++i) {
> > -    unsigned ObjSize = 0;
> > -    unsigned ObjGPRs = 0;
> > +    unsigned ObjSize;
> > +    unsigned ObjGPRs;
> > +    unsigned StackPad;
> > +    unsigned GPRPad;
> >      MVT::ValueType ObjectVT = Op.getOperand(5+2*i).getValueType();
> > -    HowToPassArgument(ObjectVT, NumGPRs, ObjSize, ObjGPRs);
> > -    NumBytes += ObjSize;
> > -    NumGPRs += ObjGPRs;
> > +    unsigned Flags = Op.getConstantOperandVal(5+2*i+1);
> > +    HowToPassArgument(ObjectVT, NumGPRs, NumBytes, ObjGPRs, ObjSize,
> > +                      GPRPad, StackPad, Flags);
> > +    NumBytes += ObjSize + StackPad;
> > +    NumGPRs += ObjGPRs + GPRPad;
> >    }
> >
> >    // Adjust the stack pointer for the new arguments...
> > @@ -407,18 +418,24 @@
> >    std::vector<SDOperand> MemOpChains;
> >    for (unsigned i = 0; i != NumOps; ++i) {
> >      SDOperand Arg = Op.getOperand(5+2*i);
> > +    unsigned Flags = Op.getConstantOperandVal(5+2*i+1);
> >      MVT::ValueType ArgVT = Arg.getValueType();
> >
> > -    unsigned ObjSize = 0;
> > -    unsigned ObjGPRs = 0;
> > -    HowToPassArgument(ArgVT, NumGPRs, ObjSize, ObjGPRs);
> > +    unsigned ObjSize;
> > +    unsigned ObjGPRs;
> > +    unsigned GPRPad;
> > +    unsigned StackPad;
> > +    HowToPassArgument(ArgVT, NumGPRs, ArgOffset, ObjGPRs,
> > +                      ObjSize, GPRPad, StackPad, Flags);
> > +    NumGPRs += GPRPad;
> > +    ArgOffset += StackPad;
> >      if (ObjGPRs > 0) {
> >        switch (ArgVT) {
> >        default: assert(0 && "Unexpected ValueType for argument!");
> >        case MVT::i32:
> >          RegsToPass.push_back(std::make_pair(GPRArgRegs[NumGPRs],
> > Arg));
> >          break;
> > -      case MVT::f32:
> > +      case MVT::f32:
> >          RegsToPass.push_back(std::make_pair(GPRArgRegs[NumGPRs],
> >                                   DAG.getNode(ISD::BIT_CONVERT,
> > MVT::i32, Arg)));
> >          break;
> > @@ -436,7 +453,7 @@
> >            MemOpChains.push_back(DAG.getStore(Chain, Hi, PtrOff,
> > NULL, 0));
> >          }
> >          break;
> > -      }
> > +      }
> >        case MVT::f64: {
> >          SDOperand Cvt = DAG.getNode(ARMISD::FMRRD,
> >                                      DAG.getVTList(MVT::i32,
> > MVT::i32),
> > @@ -715,7 +732,7 @@
> >  }
> >
> >  static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG
> > &DAG,
> > -                                   unsigned *vRegs, unsigned ArgNo,
> > +                                      unsigned *vRegs, unsigned
> > ArgNo,
> >                                        unsigned &NumGPRs, unsigned
> > &ArgOffset) {
> >    MachineFunction &MF = DAG.getMachineFunction();
> >    MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
> > @@ -727,9 +744,15 @@
> >      ARM::R0, ARM::R1, ARM::R2, ARM::R3
> >    };
> >
> > -  unsigned ObjSize = 0;
> > -  unsigned ObjGPRs = 0;
> > -  HowToPassArgument(ObjectVT, NumGPRs, ObjSize, ObjGPRs);
> > +  unsigned ObjSize;
> > +  unsigned ObjGPRs;
> > +  unsigned GPRPad;
> > +  unsigned StackPad;
> > +  unsigned Flags = Op.getConstantOperandVal(ArgNo + 3);
> > +  HowToPassArgument(ObjectVT, NumGPRs, ArgOffset, ObjGPRs,
> > +                    ObjSize, GPRPad, StackPad, Flags);
> > +  NumGPRs += GPRPad;
> > +  ArgOffset += StackPad;
> >
> >    SDOperand ArgValue;
> >    if (ObjGPRs == 1) {
> >
> >
> > Index: llvm/lib/Target/ARM/ARMTargetMachine.cpp
> > diff -u llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.20 llvm/lib/
> > Target/ARM/ARMTargetMachine.cpp:1.21
> > --- llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.20     Wed Jan 31
> > 20:18:36 2007
> > +++ llvm/lib/Target/ARM/ARMTargetMachine.cpp  Tue Feb 13 08:07:13 2007
> > @@ -39,8 +39,8 @@
> >             std::string("e-p:32:32-d:32:32-l:32:32-s:16:32-b:8:32-B:
> > 8:32-A:32") :
> >             std::string("e-p:32:32-d:32:32-l:32:32")) :
> >            (Subtarget.isThumb() ?
> > -           std::string("e-p:32:32-d:32:64-l:32:64-s:16:32-b:8:32-B:
> > 8:32-A:32") :
> > -           std::string("e-p:32:32-d:32:64-l:32:64"))),
> > +           std::string("e-p:32:32-d:32:64-l:64:64-s:16:32-b:8:32-B:
> > 8:32-A:32") :
> > +           std::string("e-p:32:32-d:32:64-l:64:64"))),
> >      InstrInfo(Subtarget),
> >      FrameInfo(Subtarget) {}
> >
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



More information about the llvm-commits mailing list