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 <[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