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

Evan Cheng evan.cheng at apple.com
Tue Feb 13 09:42:27 PST 2007


Ah, I see you have only changed long alignment when target isn't  
Darwin. My mistake, this will not break Mac OS X / APCS support.

What is the default ABI for Linux? Can you experiment with gcc -mabi=  
to see if this might break other ABI's?

Thanks,

Evan

On Feb 13, 2007, at 9:33 AM, Lauro Ramos Venancio wrote:

> 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