@@ -134,10 +134,9 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
134134 setOperationAction (ISD::STACKSAVE, MVT::Other, Custom);
135135 setOperationAction (ISD::STACKRESTORE, MVT::Other, Custom);
136136
137- // VASTART and VACOPY need to deal with the Xtensa-specific varargs
137+ // VASTART, VAARG and VACOPY need to deal with the Xtensa-specific varargs
138138 // structure, but VAEND is a no-op.
139139 setOperationAction (ISD::VASTART, MVT::Other, Custom);
140- // we use special va_list structure so we have to customize this
141140 setOperationAction (ISD::VAARG, MVT::Other, Custom);
142141 setOperationAction (ISD::VACOPY, MVT::Other, Custom);
143142 setOperationAction (ISD::VAEND, MVT::Other, Expand);
@@ -220,23 +219,18 @@ void XtensaTargetLowering::LowerAsmOperandForConstraint(
220219 TargetLowering::LowerAsmOperandForConstraint (Op, Constraint, Ops, DAG);
221220}
222221
223- unsigned XtensaTargetLowering::getVaListSizeInBits (const DataLayout &DL) const {
224- // 2 * sizeof(int*) + sizeof(int)
225- return 3 * 4 ;
226- }
227-
228222// ===----------------------------------------------------------------------===//
229223// Calling conventions
230224// ===----------------------------------------------------------------------===//
231225
232226#include " XtensaGenCallingConv.inc"
233227
228+ static const MCPhysReg IntRegs[] = {Xtensa::A2, Xtensa::A3, Xtensa::A4,
229+ Xtensa::A5, Xtensa::A6, Xtensa::A7};
230+
234231static bool CC_Xtensa_Custom (unsigned ValNo, MVT ValVT, MVT LocVT,
235232 CCValAssign::LocInfo LocInfo,
236233 ISD::ArgFlagsTy ArgFlags, CCState &State) {
237- static const MCPhysReg IntRegs[] = {Xtensa::A2, Xtensa::A3, Xtensa::A4,
238- Xtensa::A5, Xtensa::A6, Xtensa::A7};
239-
240234 if (ArgFlags.isByVal ()) {
241235 Align ByValAlign = ArgFlags.getNonZeroByValAlign ();
242236 unsigned ByValSize = ArgFlags.getByValSize ();
@@ -319,9 +313,6 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
319313 MachineFunction &MF = DAG.getMachineFunction ();
320314 MachineFrameInfo &MFI = MF.getFrameInfo ();
321315 XtensaMachineFunctionInfo *XtensaFI = MF.getInfo <XtensaMachineFunctionInfo>();
322- EVT PtrVT = getPointerTy (MF.getDataLayout ());
323-
324- XtensaFI->setVarArgsFrameIndex (0 );
325316
326317 // Used with vargs to acumulate store chains.
327318 std::vector<SDValue> OutChains;
@@ -338,16 +329,13 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
338329 // Arguments stored on registers
339330 if (VA.isRegLoc ()) {
340331 EVT RegVT = VA.getLocVT ();
341- const TargetRegisterClass *RC;
342332
343- if (RegVT == MVT::i32 )
344- RC = &Xtensa::ARRegClass;
345- else
333+ if (RegVT != MVT::i32 )
346334 report_fatal_error (" RegVT not supported by FormalArguments Lowering" );
347335
348336 // Transform the arguments stored on
349337 // physical registers into virtual ones
350- unsigned Register = MF.addLiveIn (VA.getLocReg (), RC );
338+ unsigned Register = MF.addLiveIn (VA.getLocReg (), &Xtensa::ARRegClass );
351339 SDValue ArgValue = DAG.getCopyFromReg (Chain, DL, Register, RegVT);
352340
353341 // If this is an 8 or 16-bit value, it has been passed promoted
@@ -394,20 +382,18 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
394382 }
395383
396384 if (IsVarArg) {
397- static const MCPhysReg XtensaArgRegs[6 ] = {
398- Xtensa::A2, Xtensa::A3, Xtensa::A4, Xtensa::A5, Xtensa::A6, Xtensa::A7};
399- ArrayRef<MCPhysReg> ArgRegs = ArrayRef (XtensaArgRegs);
385+ ArrayRef<MCPhysReg> ArgRegs = ArrayRef (IntRegs);
400386 unsigned Idx = CCInfo.getFirstUnallocated (ArgRegs);
401387 const TargetRegisterClass *RC = &Xtensa::ARRegClass;
402388 MachineFrameInfo &MFI = MF.getFrameInfo ();
403389 MachineRegisterInfo &RegInfo = MF.getRegInfo ();
404390 unsigned RegSize = 4 ;
405- MVT RegTy = MVT::getIntegerVT (RegSize * 8 ) ;
391+ MVT RegTy = MVT::i32 ;
406392
407393 XtensaFI->setVarArgsFirstGPR (Idx + 2 ); // 2 - number of a2 register
408394
409- XtensaFI->setVarArgsStackOffset (MFI. CreateFixedObject (
410- PtrVT. getSizeInBits () / 8 , CCInfo.getStackSize (), true ));
395+ XtensaFI->setVarArgsOnStackFrameIndex (
396+ MFI. CreateFixedObject ( 4 , CCInfo.getStackSize (), true ));
411397
412398 // Offset of the first variable argument from stack pointer, and size of
413399 // the vararg save area. For now, the varargs save area is either zero or
@@ -422,36 +408,26 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
422408 } else {
423409 VarArgsSaveSize = RegSize * (ArgRegs.size () - Idx);
424410 VaArgOffset = -VarArgsSaveSize;
425- }
426411
427- // Record the frame index of the first variable argument
428- // which is a value necessary to VASTART.
429- int FI = MFI.CreateFixedObject (RegSize, VaArgOffset, true );
430- XtensaFI->setVarArgsFrameIndex (FI);
431-
432- // Copy the integer registers that may have been used for passing varargs
433- // to the vararg save area.
434- for (unsigned I = Idx; I < ArgRegs.size (); ++I, VaArgOffset += RegSize) {
435- const unsigned Reg = RegInfo.createVirtualRegister (RC);
436- unsigned FrameReg = Subtarget.getRegisterInfo ()->getFrameRegister (MF);
437-
438- // Argument passed in FrameReg we save in A8 (in emitPrologue),
439- // so load argument from A8
440- if (ArgRegs[I] == FrameReg) {
441- RegInfo.addLiveIn (Xtensa::A8, Reg);
442- } else {
412+ // Record the frame index of the first variable argument
413+ // which is a value necessary to VASTART.
414+ int FI = MFI.CreateFixedObject (RegSize, VaArgOffset, true );
415+ XtensaFI->setVarArgsInRegsFrameIndex (FI);
416+
417+ // Copy the integer registers that may have been used for passing varargs
418+ // to the vararg save area.
419+ for (unsigned I = Idx; I < ArgRegs.size (); ++I, VaArgOffset += RegSize) {
420+ const Register Reg = RegInfo.createVirtualRegister (RC);
443421 RegInfo.addLiveIn (ArgRegs[I], Reg);
444- }
445422
446- SDValue ArgValue = DAG.getCopyFromReg (Chain, DL, Reg, RegTy);
447- FI = MFI.CreateFixedObject (RegSize, VaArgOffset, true );
448- SDValue PtrOff = DAG.getFrameIndex (FI, getPointerTy (DAG.getDataLayout ()));
449- SDValue Store = DAG.getStore (Chain, DL, ArgValue, PtrOff,
450- MachinePointerInfo::getFixedStack (MF, FI));
451- cast<StoreSDNode>(Store.getNode ())
452- ->getMemOperand ()
453- ->setValue ((Value *)nullptr );
454- OutChains.push_back (Store);
423+ SDValue ArgValue = DAG.getCopyFromReg (Chain, DL, Reg, RegTy);
424+ FI = MFI.CreateFixedObject (RegSize, VaArgOffset, true );
425+ SDValue PtrOff =
426+ DAG.getFrameIndex (FI, getPointerTy (DAG.getDataLayout ()));
427+ SDValue Store = DAG.getStore (Chain, DL, ArgValue, PtrOff,
428+ MachinePointerInfo::getFixedStack (MF, FI));
429+ OutChains.push_back (Store);
430+ }
455431 }
456432 }
457433
@@ -950,7 +926,7 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
950926
951927 SDValue VAIndex;
952928 SDValue StackOffsetFI =
953- DAG.getFrameIndex (XtensaFI->getVarArgsStackOffset (), PtrVT);
929+ DAG.getFrameIndex (XtensaFI->getVarArgsOnStackFrameIndex (), PtrVT);
954930 unsigned ArgWords = XtensaFI->getVarArgsFirstGPR () - 2 ;
955931
956932 // If first variable argument passed in registers (maximum words in registers
@@ -964,7 +940,7 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
964940 }
965941
966942 SDValue FrameIndex =
967- DAG.getFrameIndex (XtensaFI->getVarArgsFrameIndex (), PtrVT);
943+ DAG.getFrameIndex (XtensaFI->getVarArgsInRegsFrameIndex (), PtrVT);
968944 uint64_t FrameOffset = PtrVT.getStoreSize ();
969945 const Value *SV = cast<SrcValueSDNode>(Op.getOperand (2 ))->getValue ();
970946
@@ -991,7 +967,8 @@ SDValue XtensaTargetLowering::LowerVASTART(SDValue Op,
991967}
992968
993969SDValue XtensaTargetLowering::LowerVACOPY (SDValue Op, SelectionDAG &DAG) const {
994- unsigned VAListSize = getVaListSizeInBits (DAG.getDataLayout ()) / 8 ;
970+ // Size of the va_list_tag structure
971+ constexpr unsigned VAListSize = 3 * 4 ;
995972 return DAG.getMemcpy (
996973 Op.getOperand (0 ), Op, Op.getOperand (1 ), Op.getOperand (2 ),
997974 DAG.getConstant (VAListSize, SDLoc (Op), MVT::i32 ), Align (4 ),
0 commit comments