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@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits