@@ -1381,42 +1381,6 @@ static void emitDefineCFAWithFP(MachineFunction &MF, MachineBasicBlock &MBB,
1381
1381
.setMIFlags (MachineInstr::FrameSetup);
1382
1382
}
1383
1383
1384
- void AArch64FrameLowering::signLR (MachineFunction &MF, MachineBasicBlock &MBB,
1385
- MachineBasicBlock::iterator MBBI,
1386
- bool NeedsWinCFI, bool *HasWinCFI) {
1387
- const auto &MFnI = *MF.getInfo <AArch64FunctionInfo>();
1388
- const AArch64Subtarget &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1389
- const TargetInstrInfo *TII = Subtarget.getInstrInfo ();
1390
- bool EmitCFI = MFnI.needsDwarfUnwindInfo (MF);
1391
-
1392
- // Debug location must be unknown, see emitPrologue().
1393
- DebugLoc DL;
1394
-
1395
- if (MFnI.shouldSignWithBKey ()) {
1396
- BuildMI (MBB, MBBI, DL, TII->get (AArch64::EMITBKEY))
1397
- .setMIFlag (MachineInstr::FrameSetup);
1398
- }
1399
-
1400
- // No SEH opcode for this one; it doesn't materialize into an
1401
- // instruction on Windows.
1402
- BuildMI (
1403
- MBB, MBBI, DL,
1404
- TII->get (MFnI.shouldSignWithBKey () ? AArch64::PACIBSP : AArch64::PACIASP))
1405
- .setMIFlag (MachineInstr::FrameSetup);
1406
-
1407
- if (EmitCFI) {
1408
- unsigned CFIIndex =
1409
- MF.addFrameInst (MCCFIInstruction::createNegateRAState (nullptr ));
1410
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
1411
- .addCFIIndex (CFIIndex)
1412
- .setMIFlags (MachineInstr::FrameSetup);
1413
- } else if (NeedsWinCFI) {
1414
- *HasWinCFI = true ;
1415
- BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_PACSignLR))
1416
- .setMIFlag (MachineInstr::FrameSetup);
1417
- }
1418
- }
1419
-
1420
1384
void AArch64FrameLowering::emitPrologue (MachineFunction &MF,
1421
1385
MachineBasicBlock &MBB) const {
1422
1386
MachineBasicBlock::iterator MBBI = MBB.begin ();
@@ -1450,8 +1414,12 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1450
1414
emitShadowCallStackPrologue (*TII, MF, MBB, MBBI, DL, NeedsWinCFI,
1451
1415
MFnI.needsDwarfUnwindInfo (MF));
1452
1416
1453
- if (MFnI.shouldSignReturnAddress (MF))
1454
- signLR (MF, MBB, MBBI, NeedsWinCFI, &HasWinCFI);
1417
+ if (MFnI.shouldSignReturnAddress (MF)) {
1418
+ BuildMI (MBB, MBBI, DL, TII->get (AArch64::PAUTH_PROLOGUE))
1419
+ .setMIFlag (MachineInstr::FrameSetup);
1420
+ if (NeedsWinCFI)
1421
+ HasWinCFI = true ; // AArch64PointerAuth pass will insert SEH_PACSignLR
1422
+ }
1455
1423
1456
1424
if (EmitCFI && MFnI.isMTETagged ()) {
1457
1425
BuildMI (MBB, MBBI, DL, TII->get (AArch64::EMITMTETAGGED))
@@ -1911,54 +1879,6 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
1911
1879
}
1912
1880
}
1913
1881
1914
- void AArch64FrameLowering::authenticateLR (MachineFunction &MF,
1915
- MachineBasicBlock &MBB,
1916
- bool NeedsWinCFI, bool *HasWinCFI) {
1917
- const auto &MFI = *MF.getInfo <AArch64FunctionInfo>();
1918
- const AArch64Subtarget &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1919
- const TargetInstrInfo *TII = Subtarget.getInstrInfo ();
1920
- bool EmitAsyncCFI = MFI.needsAsyncDwarfUnwindInfo (MF);
1921
-
1922
- MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator ();
1923
- DebugLoc DL;
1924
- if (MBBI != MBB.end ())
1925
- DL = MBBI->getDebugLoc ();
1926
-
1927
- // The AUTIASP instruction assembles to a hint instruction before v8.3a so
1928
- // this instruction can safely used for any v8a architecture.
1929
- // From v8.3a onwards there are optimised authenticate LR and return
1930
- // instructions, namely RETA{A,B}, that can be used instead. In this case the
1931
- // DW_CFA_AARCH64_negate_ra_state can't be emitted.
1932
- bool TerminatorIsCombinable =
1933
- MBBI != MBB.end () && (MBBI->getOpcode () == AArch64::RET_ReallyLR ||
1934
- MBBI->getOpcode () == AArch64::RET);
1935
- if (Subtarget.hasPAuth () && TerminatorIsCombinable && !NeedsWinCFI &&
1936
- !MF.getFunction ().hasFnAttribute (Attribute::ShadowCallStack)) {
1937
- BuildMI (MBB, MBBI, DL,
1938
- TII->get (MFI.shouldSignWithBKey () ? AArch64::RETAB : AArch64::RETAA))
1939
- .copyImplicitOps (*MBBI);
1940
- MBB.erase (MBBI);
1941
- } else {
1942
- BuildMI (
1943
- MBB, MBBI, DL,
1944
- TII->get (MFI.shouldSignWithBKey () ? AArch64::AUTIBSP : AArch64::AUTIASP))
1945
- .setMIFlag (MachineInstr::FrameDestroy);
1946
-
1947
- if (EmitAsyncCFI) {
1948
- unsigned CFIIndex =
1949
- MF.addFrameInst (MCCFIInstruction::createNegateRAState (nullptr ));
1950
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
1951
- .addCFIIndex (CFIIndex)
1952
- .setMIFlags (MachineInstr::FrameDestroy);
1953
- }
1954
- if (NeedsWinCFI) {
1955
- *HasWinCFI = true ;
1956
- BuildMI (MBB, MBBI, DL, TII->get (AArch64::SEH_PACSignLR))
1957
- .setMIFlag (MachineInstr::FrameDestroy);
1958
- }
1959
- }
1960
- }
1961
-
1962
1882
static bool isFuncletReturnInstr (const MachineInstr &MI) {
1963
1883
switch (MI.getOpcode ()) {
1964
1884
default :
@@ -1990,8 +1910,13 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
1990
1910
MachineBasicBlock::iterator EpilogStartI = MBB.end ();
1991
1911
1992
1912
auto FinishingTouches = make_scope_exit ([&]() {
1993
- if (AFI->shouldSignReturnAddress (MF))
1994
- authenticateLR (MF, MBB, NeedsWinCFI, &HasWinCFI);
1913
+ if (AFI->shouldSignReturnAddress (MF)) {
1914
+ BuildMI (MBB, MBB.getFirstTerminator (), DL,
1915
+ TII->get (AArch64::PAUTH_EPILOGUE))
1916
+ .setMIFlag (MachineInstr::FrameDestroy);
1917
+ if (NeedsWinCFI)
1918
+ HasWinCFI = true ; // AArch64PointerAuth pass will insert SEH_PACSignLR
1919
+ }
1995
1920
if (needsShadowCallStackPrologueEpilogue (MF))
1996
1921
emitShadowCallStackEpilogue (*TII, MF, MBB, MBB.getFirstTerminator (), DL);
1997
1922
if (EmitCFI)
0 commit comments