[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