Skip to content

Commit 503c55e

Browse files
authored
[AArch64] Move SLS later in pass pipeline (#84210)
Currently, the SLS hardening pass is run before the machine outliner, which means that the outliner creates new functions and calls which do not have the SLS hardening applied. The fix for this is to move the SLS passes to after the outliner, as has recently been done for the return address signing pass. This also avoids a bug where the SLS outliner emits code with instructions after a return, which the outliner doesn't correctly handle.
1 parent 812c22b commit 503c55e

File tree

7 files changed

+54
-16
lines changed

7 files changed

+54
-16
lines changed

llvm/lib/Target/AArch64/AArch64SLSHardening.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,20 @@ void SLSBLRThunkInserter::populateThunk(MachineFunction &MF) {
220220

221221
const TargetInstrInfo *TII =
222222
MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
223-
assert (MF.size() == 1);
223+
224+
// Depending on whether this pass is in the same FunctionPassManager as the
225+
// IR->MIR conversion, the thunk may be completely empty, or contain a single
226+
// basic block with a single return instruction. Normalise it to contain a
227+
// single empty basic block.
228+
if (MF.size() == 1) {
229+
assert(MF.front().size() == 1);
230+
assert(MF.front().front().getOpcode() == AArch64::RET);
231+
MF.front().erase(MF.front().begin());
232+
} else {
233+
assert(MF.size() == 0);
234+
MF.push_back(MF.CreateMachineBasicBlock());
235+
}
236+
224237
MachineBasicBlock *Entry = &MF.front();
225238
Entry->clear();
226239

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,6 @@ void AArch64PassConfig::addPreSched2() {
820820
// info.
821821
addPass(createAArch64SpeculationHardeningPass());
822822

823-
addPass(createAArch64IndirectThunks());
824-
addPass(createAArch64SLSHardeningPass());
825-
826823
if (TM->getOptLevel() != CodeGenOptLevel::None) {
827824
if (EnableFalkorHWPFFix)
828825
addPass(createFalkorHWPFFixPass());
@@ -855,6 +852,8 @@ void AArch64PassConfig::addPreEmitPass() {
855852
}
856853

857854
void AArch64PassConfig::addPostBBSections() {
855+
addPass(createAArch64IndirectThunks());
856+
addPass(createAArch64SLSHardeningPass());
858857
addPass(createAArch64PointerAuthPass());
859858
if (EnableBranchTargets)
860859
addPass(createAArch64BranchTargetsPass());

llvm/test/CodeGen/AArch64/O0-pipeline.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@
6464
; CHECK-NEXT: AArch64 pseudo instruction expansion pass
6565
; CHECK-NEXT: Insert KCFI indirect call checks
6666
; CHECK-NEXT: AArch64 speculation hardening pass
67-
; CHECK-NEXT: AArch64 Indirect Thunks
68-
; CHECK-NEXT: AArch64 sls hardening pass
6967
; CHECK-NEXT: Analyze Machine Code For Garbage Collection
7068
; CHECK-NEXT: Insert fentry calls
7169
; CHECK-NEXT: Insert XRay ops
@@ -75,6 +73,8 @@
7573
; CHECK-NEXT: StackMap Liveness Analysis
7674
; CHECK-NEXT: Live DEBUG_VALUE analysis
7775
; CHECK-NEXT: Machine Sanitizer Binary Metadata
76+
; CHECK-NEXT: AArch64 Indirect Thunks
77+
; CHECK-NEXT: AArch64 sls hardening pass
7878
; CHECK-NEXT: AArch64 Pointer Authentication
7979
; CHECK-NEXT: AArch64 Branch Targets
8080
; CHECK-NEXT: Branch relaxation pass

llvm/test/CodeGen/AArch64/O3-pipeline.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,6 @@
205205
; CHECK-NEXT: AArch64 load / store optimization pass
206206
; CHECK-NEXT: Insert KCFI indirect call checks
207207
; CHECK-NEXT: AArch64 speculation hardening pass
208-
; CHECK-NEXT: AArch64 Indirect Thunks
209-
; CHECK-NEXT: AArch64 sls hardening pass
210208
; CHECK-NEXT: MachineDominator Tree Construction
211209
; CHECK-NEXT: Machine Natural Loop Construction
212210
; CHECK-NEXT: Falkor HW Prefetch Fix Late Phase
@@ -227,6 +225,8 @@
227225
; CHECK-NEXT: Machine Sanitizer Binary Metadata
228226
; CHECK-NEXT: Machine Outliner
229227
; CHECK-NEXT: FunctionPass Manager
228+
; CHECK-NEXT: AArch64 Indirect Thunks
229+
; CHECK-NEXT: AArch64 sls hardening pass
230230
; CHECK-NEXT: AArch64 Pointer Authentication
231231
; CHECK-NEXT: AArch64 Branch Targets
232232
; CHECK-NEXT: Branch relaxation pass

llvm/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,16 @@
3232

3333
; HOTNESS: Freeing Pass 'Machine Outliner'
3434
; HOTNESS-NEXT: Executing Pass 'Function Pass Manager'
35-
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
36-
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'
35+
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
36+
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
37+
; HOTNESS-NEXT: Executing Pass 'AArch64 Indirect Thunks' on Function 'empty_func'...
38+
; HOTNESS-NEXT: Freeing Pass 'AArch64 Indirect Thunks' on Function 'empty_func'...
39+
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
40+
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
41+
; HOTNESS-NEXT: Executing Pass 'AArch64 sls hardening pass' on Function 'empty_func'...
42+
; HOTNESS-NEXT: Freeing Pass 'AArch64 sls hardening pass' on Function 'empty_func'...
43+
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
44+
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
3745
; HOTNESS-NEXT: Executing Pass 'AArch64 Pointer Authentication' on Function 'empty_func'...
3846
; HOTNESS-NEXT: Freeing Pass 'AArch64 Pointer Authentication' on Function 'empty_func'...
3947
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
@@ -73,8 +81,16 @@
7381

7482
; NO_HOTNESS: Freeing Pass 'Machine Outliner'
7583
; NO_HOTNESS-NEXT: Executing Pass 'Function Pass Manager'
76-
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
77-
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'
84+
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
85+
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
86+
; NO_HOTNESS-NEXT: Executing Pass 'AArch64 Indirect Thunks' on Function 'empty_func'...
87+
; NO_HOTNESS-NEXT: Freeing Pass 'AArch64 Indirect Thunks' on Function 'empty_func'...
88+
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
89+
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
90+
; NO_HOTNESS-NEXT: Executing Pass 'AArch64 sls hardening pass' on Function 'empty_func'...
91+
; NO_HOTNESS-NEXT: Freeing Pass 'AArch64 sls hardening pass' on Function 'empty_func'...
92+
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
93+
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code' on Function 'empty_func'...
7894
; NO_HOTNESS-NEXT: Executing Pass 'AArch64 Pointer Authentication' on Function 'empty_func'...
7995
; NO_HOTNESS-NEXT: Freeing Pass 'AArch64 Pointer Authentication' on Function 'empty_func'...
8096
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code' on Function 'empty_func'...
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
; RUN: llc -mtriple aarch64 -O0 < %s
2+
3+
define hidden void @foo() "target-features"="+harden-sls-blr" {
4+
entry:
5+
ret void
6+
}

llvm/test/CodeGen/AArch64/sls-stackprotector-outliner.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ define hidden void @_ZTv0_n24_N2C6D1Ev(ptr %this) minsize sspreq "target-feature
1818
; CHECK-NEXT: b.ne .LBB0_2
1919
; CHECK-NEXT: // %bb.1: // %entry
2020
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
21-
; CHECK-NEXT: bl OUTLINED_FUNCTION_1
21+
; CHECK-NEXT: add x0, x0, x8
22+
; CHECK-NEXT: add sp, sp, #32
2223
; CHECK-NEXT: b _ZN2C6D1Ev
2324
; CHECK-NEXT: dsb sy
2425
; CHECK-NEXT: isb
@@ -45,7 +46,8 @@ define hidden void @_ZTv0_n24_N2C6D0Ev(ptr %this) minsize sspreq "target-feature
4546
; CHECK-NEXT: b.ne .LBB1_2
4647
; CHECK-NEXT: // %bb.1: // %entry
4748
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
48-
; CHECK-NEXT: bl OUTLINED_FUNCTION_1
49+
; CHECK-NEXT: add x0, x0, x8
50+
; CHECK-NEXT: add sp, sp, #32
4951
; CHECK-NEXT: b _ZN2C6D0Ev
5052
; CHECK-NEXT: dsb sy
5153
; CHECK-NEXT: isb
@@ -71,7 +73,8 @@ define hidden void @_ZTv0_n24_N3C10D1Ev(ptr %this) minsize sspreq "target-featur
7173
; CHECK-NEXT: b.ne .LBB2_2
7274
; CHECK-NEXT: // %bb.1: // %entry
7375
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
74-
; CHECK-NEXT: bl OUTLINED_FUNCTION_1
76+
; CHECK-NEXT: add x0, x0, x8
77+
; CHECK-NEXT: add sp, sp, #32
7578
; CHECK-NEXT: b _ZN3C10D1Ev
7679
; CHECK-NEXT: dsb sy
7780
; CHECK-NEXT: isb
@@ -97,7 +100,8 @@ define hidden void @_ZTv0_n24_N3C10D0Ev(ptr %this) minsize sspreq "target-featur
97100
; CHECK-NEXT: b.ne .LBB3_2
98101
; CHECK-NEXT: // %bb.1: // %entry
99102
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
100-
; CHECK-NEXT: bl OUTLINED_FUNCTION_1
103+
; CHECK-NEXT: add x0, x0, x8
104+
; CHECK-NEXT: add sp, sp, #32
101105
; CHECK-NEXT: b _ZN3C10D0Ev
102106
; CHECK-NEXT: dsb sy
103107
; CHECK-NEXT: isb

0 commit comments

Comments
 (0)