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 <[EMAIL PROTECTED]>: > 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