Skip to content

Commit 7e8eccd

Browse files
committed
[AArch64] Move SLS later in pass pipeline
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. Reviewed By: kristof.beyls Differential Revision: https://reviews.llvm.org/D158511
1 parent 419c6da commit 7e8eccd

File tree

6 files changed

+36
-16
lines changed

6 files changed

+36
-16
lines changed

llvm/lib/Target/AArch64/AArch64SLSHardening.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ void SLSBLRThunkInserter::populateThunk(MachineFunction &MF) {
222222

223223
const TargetInstrInfo *TII =
224224
MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
225-
assert (MF.size() == 1);
225+
assert (MF.size() == 0);
226+
MF.push_back(MF.CreateMachineBasicBlock());
226227
MachineBasicBlock *Entry = &MF.front();
227228
Entry->clear();
228229

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,9 +796,6 @@ void AArch64PassConfig::addPreSched2() {
796796
// info.
797797
addPass(createAArch64SpeculationHardeningPass());
798798

799-
addPass(createAArch64IndirectThunks());
800-
addPass(createAArch64SLSHardeningPass());
801-
802799
if (TM->getOptLevel() != CodeGenOptLevel::None) {
803800
if (EnableFalkorHWPFFix)
804801
addPass(createFalkorHWPFFixPass());
@@ -831,6 +828,8 @@ void AArch64PassConfig::addPreEmitPass() {
831828
}
832829

833830
void AArch64PassConfig::addPostBBSections() {
831+
addPass(createAArch64IndirectThunks());
832+
addPass(createAArch64SLSHardeningPass());
834833
addPass(createAArch64PointerAuthPass());
835834
if (EnableBranchTargets)
836835
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
@@ -201,8 +201,6 @@
201201
; CHECK-NEXT: AArch64 load / store optimization pass
202202
; CHECK-NEXT: Insert KCFI indirect call checks
203203
; CHECK-NEXT: AArch64 speculation hardening pass
204-
; CHECK-NEXT: AArch64 Indirect Thunks
205-
; CHECK-NEXT: AArch64 sls hardening pass
206204
; CHECK-NEXT: MachineDominator Tree Construction
207205
; CHECK-NEXT: Machine Natural Loop Construction
208206
; CHECK-NEXT: Falkor HW Prefetch Fix Late Phase
@@ -223,6 +221,8 @@
223221
; CHECK-NEXT: Machine Sanitizer Binary Metadata
224222
; CHECK-NEXT: Machine Outliner
225223
; CHECK-NEXT: FunctionPass Manager
224+
; CHECK-NEXT: AArch64 Indirect Thunks
225+
; CHECK-NEXT: AArch64 sls hardening pass
226226
; CHECK-NEXT: AArch64 Pointer Authentication
227227
; CHECK-NEXT: AArch64 Branch Targets
228228
; 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'...

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)