94
94
#include " AArch64InstrInfo.h"
95
95
#include " AArch64MachineFunctionInfo.h"
96
96
#include " AArch64RegisterInfo.h"
97
+ #include " AArch64StackOffset.h"
97
98
#include " AArch64Subtarget.h"
98
99
#include " AArch64TargetMachine.h"
99
100
#include " MCTargetDesc/AArch64AddressingModes.h"
@@ -173,7 +174,7 @@ static unsigned estimateRSStackSizeLimit(MachineFunction &MF) {
173
174
if (!MO.isFI ())
174
175
continue ;
175
176
176
- int Offset = 0 ;
177
+ StackOffset Offset;
177
178
if (isAArch64FrameOffsetLegal (MI, Offset, nullptr , nullptr , nullptr ) ==
178
179
AArch64FrameOffsetCannotUpdate)
179
180
return 0 ;
@@ -273,14 +274,15 @@ MachineBasicBlock::iterator AArch64FrameLowering::eliminateCallFramePseudoInstr(
273
274
// Most call frames will be allocated at the start of a function so
274
275
// this is OK, but it is a limitation that needs dealing with.
275
276
assert (Amount > -0xffffff && Amount < 0xffffff && " call frame too large" );
276
- emitFrameOffset (MBB, I, DL, AArch64::SP, AArch64::SP, Amount, TII);
277
+ emitFrameOffset (MBB, I, DL, AArch64::SP, AArch64::SP, {Amount, MVT::i8 },
278
+ TII);
277
279
}
278
280
} else if (CalleePopAmount != 0 ) {
279
281
// If the calling convention demands that the callee pops arguments from the
280
282
// stack, we want to add it back if we have a reserved call frame.
281
283
assert (CalleePopAmount < 0xffffff && " call frame too large" );
282
- emitFrameOffset (MBB, I, DL, AArch64::SP, AArch64::SP, -CalleePopAmount,
283
- TII);
284
+ emitFrameOffset (MBB, I, DL, AArch64::SP, AArch64::SP,
285
+ {-( int64_t )CalleePopAmount, MVT:: i8 }, TII);
284
286
}
285
287
return MBB.erase (I);
286
288
}
@@ -866,8 +868,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
866
868
AFI->setHasRedZone (true );
867
869
++NumRedZoneFunctions;
868
870
} else {
869
- emitFrameOffset (MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
870
- MachineInstr::FrameSetup, false , NeedsWinCFI, &HasWinCFI);
871
+ emitFrameOffset (MBB, MBBI, DL, AArch64::SP, AArch64::SP,
872
+ {-NumBytes, MVT::i8 }, TII, MachineInstr::FrameSetup,
873
+ false , NeedsWinCFI, &HasWinCFI);
871
874
if (!NeedsWinCFI) {
872
875
// Label used to tie together the PROLOG_LABEL and the MachineMoves.
873
876
MCSymbol *FrameLabel = MMI.getContext ().createTempSymbol ();
@@ -901,8 +904,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
901
904
AFI->setLocalStackSize (NumBytes - PrologueSaveSize);
902
905
bool CombineSPBump = shouldCombineCSRLocalStackBump (MF, NumBytes);
903
906
if (CombineSPBump) {
904
- emitFrameOffset (MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
905
- MachineInstr::FrameSetup, false , NeedsWinCFI, &HasWinCFI);
907
+ emitFrameOffset (MBB, MBBI, DL, AArch64::SP, AArch64::SP,
908
+ {-NumBytes, MVT::i8 }, TII, MachineInstr::FrameSetup, false ,
909
+ NeedsWinCFI, &HasWinCFI);
906
910
NumBytes = 0 ;
907
911
} else if (PrologueSaveSize != 0 ) {
908
912
MBBI = convertCalleeSaveRestoreToSPPrePostIncDec (
@@ -958,8 +962,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
958
962
// mov fp,sp when FPOffset is zero.
959
963
// Note: All stores of callee-saved registers are marked as "FrameSetup".
960
964
// This code marks the instruction(s) that set the FP also.
961
- emitFrameOffset (MBB, MBBI, DL, AArch64::FP, AArch64::SP, FPOffset, TII,
962
- MachineInstr::FrameSetup, false , NeedsWinCFI, &HasWinCFI);
965
+ emitFrameOffset (MBB, MBBI, DL, AArch64::FP, AArch64::SP,
966
+ {FPOffset, MVT::i8 }, TII, MachineInstr::FrameSetup, false ,
967
+ NeedsWinCFI, &HasWinCFI);
963
968
}
964
969
965
970
if (windowsRequiresStackProbe (MF, NumBytes)) {
@@ -1071,8 +1076,9 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1071
1076
// FIXME: in the case of dynamic re-alignment, NumBytes doesn't have
1072
1077
// the correct value here, as NumBytes also includes padding bytes,
1073
1078
// which shouldn't be counted here.
1074
- emitFrameOffset (MBB, MBBI, DL, scratchSPReg, AArch64::SP, -NumBytes, TII,
1075
- MachineInstr::FrameSetup, false , NeedsWinCFI, &HasWinCFI);
1079
+ emitFrameOffset (MBB, MBBI, DL, scratchSPReg, AArch64::SP,
1080
+ {-NumBytes, MVT::i8 }, TII, MachineInstr::FrameSetup,
1081
+ false , NeedsWinCFI, &HasWinCFI);
1076
1082
1077
1083
if (NeedsRealignment) {
1078
1084
const unsigned Alignment = MFI.getMaxAlignment ();
@@ -1404,8 +1410,8 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
1404
1410
// If there is a single SP update, insert it before the ret and we're done.
1405
1411
if (CombineSPBump) {
1406
1412
emitFrameOffset (MBB, MBB.getFirstTerminator (), DL, AArch64::SP, AArch64::SP,
1407
- NumBytes + AfterCSRPopSize, TII, MachineInstr::FrameDestroy ,
1408
- false , NeedsWinCFI, &HasWinCFI);
1413
+ { NumBytes + ( int64_t ) AfterCSRPopSize, MVT:: i8 }, TII ,
1414
+ MachineInstr::FrameDestroy, false , NeedsWinCFI, &HasWinCFI);
1409
1415
if (NeedsWinCFI && HasWinCFI)
1410
1416
BuildMI (MBB, MBB.getFirstTerminator (), DL,
1411
1417
TII->get (AArch64::SEH_EpilogEnd))
@@ -1437,8 +1443,8 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
1437
1443
adaptForLdStOpt (MBB, MBB.getFirstTerminator (), LastPopI);
1438
1444
1439
1445
emitFrameOffset (MBB, LastPopI, DL, AArch64::SP, AArch64::SP,
1440
- StackRestoreBytes, TII, MachineInstr::FrameDestroy, false ,
1441
- NeedsWinCFI, &HasWinCFI);
1446
+ { StackRestoreBytes, MVT:: i8 }, TII ,
1447
+ MachineInstr::FrameDestroy, false , NeedsWinCFI, &HasWinCFI);
1442
1448
if (Done) {
1443
1449
if (NeedsWinCFI) {
1444
1450
HasWinCFI = true ;
@@ -1458,11 +1464,12 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
1458
1464
// be able to save any instructions.
1459
1465
if (!IsFunclet && (MFI.hasVarSizedObjects () || AFI->isStackRealigned ()))
1460
1466
emitFrameOffset (MBB, LastPopI, DL, AArch64::SP, AArch64::FP,
1461
- - AFI->getCalleeSavedStackSize () + 16 , TII ,
1462
- MachineInstr::FrameDestroy, false , NeedsWinCFI);
1467
+ {-( int64_t ) AFI->getCalleeSavedStackSize () + 16 , MVT:: i8 } ,
1468
+ TII, MachineInstr::FrameDestroy, false , NeedsWinCFI);
1463
1469
else if (NumBytes)
1464
- emitFrameOffset (MBB, LastPopI, DL, AArch64::SP, AArch64::SP, NumBytes, TII,
1465
- MachineInstr::FrameDestroy, false , NeedsWinCFI);
1470
+ emitFrameOffset (MBB, LastPopI, DL, AArch64::SP, AArch64::SP,
1471
+ {NumBytes, MVT::i8 }, TII, MachineInstr::FrameDestroy, false ,
1472
+ NeedsWinCFI);
1466
1473
1467
1474
// This must be placed after the callee-save restore code because that code
1468
1475
// assumes the SP is at the same location as it was after the callee-save save
@@ -1483,8 +1490,8 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
1483
1490
adaptForLdStOpt (MBB, FirstSPPopI, LastPopI);
1484
1491
1485
1492
emitFrameOffset (MBB, FirstSPPopI, DL, AArch64::SP, AArch64::SP,
1486
- AfterCSRPopSize, TII, MachineInstr::FrameDestroy, false ,
1487
- NeedsWinCFI, &HasWinCFI);
1493
+ {( int64_t ) AfterCSRPopSize, MVT:: i8 }, TII ,
1494
+ MachineInstr::FrameDestroy, false , NeedsWinCFI, &HasWinCFI);
1488
1495
}
1489
1496
if (NeedsWinCFI && HasWinCFI)
1490
1497
BuildMI (MBB, MBB.getFirstTerminator (), DL, TII->get (AArch64::SEH_EpilogEnd))
@@ -1501,29 +1508,30 @@ int AArch64FrameLowering::getFrameIndexReference(const MachineFunction &MF,
1501
1508
int FI,
1502
1509
unsigned &FrameReg) const {
1503
1510
return resolveFrameIndexReference (
1504
- MF, FI, FrameReg,
1505
- /* PreferFP=*/
1506
- MF.getFunction ().hasFnAttribute (Attribute::SanitizeHWAddress),
1507
- /* ForSimm=*/ false );
1511
+ MF, FI, FrameReg,
1512
+ /* PreferFP=*/
1513
+ MF.getFunction ().hasFnAttribute (Attribute::SanitizeHWAddress),
1514
+ /* ForSimm=*/ false )
1515
+ .getBytes ();
1508
1516
}
1509
1517
1510
1518
int AArch64FrameLowering::getNonLocalFrameIndexReference (
1511
1519
const MachineFunction &MF, int FI) const {
1512
1520
return getSEHFrameIndexOffset (MF, FI);
1513
1521
}
1514
1522
1515
- static int getFPOffset (const MachineFunction &MF, int ObjectOffset) {
1523
+ static StackOffset getFPOffset (const MachineFunction &MF, int ObjectOffset) {
1516
1524
const auto *AFI = MF.getInfo <AArch64FunctionInfo>();
1517
1525
const auto &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1518
1526
bool IsWin64 =
1519
1527
Subtarget.isCallingConvWin64 (MF.getFunction ().getCallingConv ());
1520
1528
unsigned FixedObject = IsWin64 ? alignTo (AFI->getVarArgsGPRSize (), 16 ) : 0 ;
1521
- return ObjectOffset + FixedObject + 16 ;
1529
+ return { ObjectOffset + FixedObject + 16 , MVT:: i8 } ;
1522
1530
}
1523
1531
1524
- static int getStackOffset (const MachineFunction &MF, int ObjectOffset) {
1532
+ static StackOffset getStackOffset (const MachineFunction &MF, int ObjectOffset) {
1525
1533
const auto &MFI = MF.getFrameInfo ();
1526
- return ObjectOffset + MFI.getStackSize ();
1534
+ return { ObjectOffset + ( int ) MFI.getStackSize (), MVT:: i8 } ;
1527
1535
}
1528
1536
1529
1537
int AArch64FrameLowering::getSEHFrameIndexOffset (const MachineFunction &MF,
@@ -1532,22 +1540,21 @@ int AArch64FrameLowering::getSEHFrameIndexOffset(const MachineFunction &MF,
1532
1540
MF.getSubtarget ().getRegisterInfo ());
1533
1541
int ObjectOffset = MF.getFrameInfo ().getObjectOffset (FI);
1534
1542
return RegInfo->getLocalAddressRegister (MF) == AArch64::FP
1535
- ? getFPOffset (MF, ObjectOffset)
1536
- : getStackOffset (MF, ObjectOffset);
1543
+ ? getFPOffset (MF, ObjectOffset). getBytes ()
1544
+ : getStackOffset (MF, ObjectOffset). getBytes () ;
1537
1545
}
1538
1546
1539
- int AArch64FrameLowering::resolveFrameIndexReference (const MachineFunction &MF,
1540
- int FI, unsigned &FrameReg,
1541
- bool PreferFP,
1542
- bool ForSimm) const {
1547
+ StackOffset AArch64FrameLowering::resolveFrameIndexReference (
1548
+ const MachineFunction &MF, int FI, unsigned &FrameReg, bool PreferFP,
1549
+ bool ForSimm) const {
1543
1550
const auto &MFI = MF.getFrameInfo ();
1544
1551
int ObjectOffset = MFI.getObjectOffset (FI);
1545
1552
bool isFixed = MFI.isFixedObjectIndex (FI);
1546
1553
return resolveFrameOffsetReference (MF, ObjectOffset, isFixed, FrameReg,
1547
1554
PreferFP, ForSimm);
1548
1555
}
1549
1556
1550
- int AArch64FrameLowering::resolveFrameOffsetReference (
1557
+ StackOffset AArch64FrameLowering::resolveFrameOffsetReference (
1551
1558
const MachineFunction &MF, int ObjectOffset, bool isFixed,
1552
1559
unsigned &FrameReg, bool PreferFP, bool ForSimm) const {
1553
1560
const auto &MFI = MF.getFrameInfo ();
@@ -1556,8 +1563,8 @@ int AArch64FrameLowering::resolveFrameOffsetReference(
1556
1563
const auto *AFI = MF.getInfo <AArch64FunctionInfo>();
1557
1564
const auto &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1558
1565
1559
- int FPOffset = getFPOffset (MF, ObjectOffset);
1560
- int Offset = getStackOffset (MF, ObjectOffset);
1566
+ int FPOffset = getFPOffset (MF, ObjectOffset). getBytes () ;
1567
+ int Offset = getStackOffset (MF, ObjectOffset). getBytes () ;
1561
1568
bool isCSR =
1562
1569
!isFixed && ObjectOffset >= -((int )AFI->getCalleeSavedStackSize ());
1563
1570
@@ -1627,7 +1634,7 @@ int AArch64FrameLowering::resolveFrameOffsetReference(
1627
1634
1628
1635
if (UseFP) {
1629
1636
FrameReg = RegInfo->getFrameRegister (MF);
1630
- return FPOffset;
1637
+ return StackOffset ( FPOffset, MVT:: i8 ) ;
1631
1638
}
1632
1639
1633
1640
// Use the base pointer if we have one.
@@ -1644,7 +1651,7 @@ int AArch64FrameLowering::resolveFrameOffsetReference(
1644
1651
Offset -= AFI->getLocalStackSize ();
1645
1652
}
1646
1653
1647
- return Offset;
1654
+ return StackOffset ( Offset, MVT:: i8 ) ;
1648
1655
}
1649
1656
1650
1657
static unsigned getPrologueDeath (MachineFunction &MF, unsigned Reg) {
0 commit comments