Skip to content

Commit 0b73b5a

Browse files
authored
[AArch64] Correct position of CFI Instruction for Pointer Authentication (llvm#121559)
As part llvm#112171, support for FEAT_PAuthLR's CFI instructions was added. However, the CFI instructions are emitted in the incorrect location. This leads to incorrect CodeGen being generated and possible issues when running a program. According to the ABI, the CFI instructions should be emitted before the signing instruction. This is now done properly. ABI information can be found here: https://github.com/ARM-software/abi-aa/blob/bf0e2c8047c70987165f3e05e571d7836370ade9/aadwarf64/aadwarf64.rst#44call-frame-instructions
1 parent 3c8344f commit 0b73b5a

14 files changed

+130
-128
lines changed

llvm/lib/Target/AArch64/AArch64PointerAuth.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -144,20 +144,20 @@ void AArch64PointerAuth::signLR(MachineFunction &MF,
144144
// No SEH opcode for this one; it doesn't materialize into an
145145
// instruction on Windows.
146146
if (MFnI.branchProtectionPAuthLR() && Subtarget->hasPAuthLR()) {
147+
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameSetup, EmitCFI);
147148
BuildMI(MBB, MBBI, DL,
148149
TII->get(MFnI.shouldSignWithBKey() ? AArch64::PACIBSPPC
149150
: AArch64::PACIASPPC))
150151
.setMIFlag(MachineInstr::FrameSetup)
151152
->setPreInstrSymbol(MF, MFnI.getSigningInstrLabel());
152-
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameSetup, EmitCFI);
153153
} else {
154154
BuildPACM(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameSetup);
155+
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameSetup, EmitCFI);
155156
BuildMI(MBB, MBBI, DL,
156157
TII->get(MFnI.shouldSignWithBKey() ? AArch64::PACIBSP
157158
: AArch64::PACIASP))
158159
.setMIFlag(MachineInstr::FrameSetup)
159160
->setPreInstrSymbol(MF, MFnI.getSigningInstrLabel());
160-
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameSetup, EmitCFI);
161161
}
162162

163163
if (!EmitCFI && NeedsWinCFI) {
@@ -212,19 +212,19 @@ void AArch64PointerAuth::authenticateLR(
212212
if (MFnI->branchProtectionPAuthLR() && Subtarget->hasPAuthLR()) {
213213
assert(PACSym && "No PAC instruction to refer to");
214214
emitPACSymOffsetIntoX16(*TII, MBB, MBBI, DL, PACSym);
215+
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameDestroy,
216+
EmitAsyncCFI);
215217
BuildMI(MBB, MBBI, DL,
216218
TII->get(UseBKey ? AArch64::AUTIBSPPCi : AArch64::AUTIASPPCi))
217219
.addSym(PACSym)
218220
.setMIFlag(MachineInstr::FrameDestroy);
219-
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameDestroy,
220-
EmitAsyncCFI);
221221
} else {
222222
BuildPACM(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameDestroy, PACSym);
223+
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameDestroy,
224+
EmitAsyncCFI);
223225
BuildMI(MBB, MBBI, DL,
224226
TII->get(UseBKey ? AArch64::AUTIBSP : AArch64::AUTIASP))
225227
.setMIFlag(MachineInstr::FrameDestroy);
226-
emitPACCFI(*Subtarget, MBB, MBBI, DL, MachineInstr::FrameDestroy,
227-
EmitAsyncCFI);
228228
}
229229

230230
if (NeedsWinCFI) {

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-cfi.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ define void @a() "sign-return-address"="all" "sign-return-address-key"="b_key" {
99
; CHECK-LABEL: a: // @a
1010
; CHECK: // %bb.0:
1111
; CHECK-NEXT: .cfi_b_key_frame
12+
; CHECK-NEXT: .cfi_negate_ra_state
1213
; V8A-NEXT: hint #27
1314
; V83A-NEXT: pacibsp
14-
; CHECK-NEXT: .cfi_negate_ra_state
1515
%1 = alloca i32, align 4
1616
%2 = alloca i32, align 4
1717
%3 = alloca i32, align 4

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-diff-scope-same-key.ll

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
define void @a() "sign-return-address"="all" {
77
; CHECK-LABEL: a: // @a
8-
; V8A: hint #25
9-
; V83A: paciasp
10-
; CHECK-NEXT: .cfi_negate_ra_state
8+
; CHECK: .cfi_negate_ra_state
9+
; V8A-NEXT: hint #25
10+
; V83A-NEXT: paciasp
1111
%1 = alloca i32, align 4
1212
%2 = alloca i32, align 4
1313
%3 = alloca i32, align 4
@@ -52,9 +52,9 @@ define void @b() "sign-return-address"="non-leaf" {
5252

5353
define void @c() "sign-return-address"="all" {
5454
; CHECK-LABEL: c: // @c
55-
; V8A: hint #25
56-
; V83A: paciasp
57-
; CHECK-NEXT .cfi_negate_ra_state
55+
; CHECK: .cfi_negate_ra_state
56+
; V8A-NEXT: hint #25
57+
; V83A-NEXT: paciasp
5858
%1 = alloca i32, align 4
5959
%2 = alloca i32, align 4
6060
%3 = alloca i32, align 4

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-non-leaf.ll

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ define i64 @a(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
88
; V8A-LABEL: a:
99
; V8A: // %bb.0:
1010
; V8A-NEXT: .cfi_b_key_frame
11-
; V8A-NEXT: hint #27
1211
; V8A-NEXT: .cfi_negate_ra_state
12+
; V8A-NEXT: hint #27
1313
; V8A-NEXT: sub sp, sp, #32
1414
; V8A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
1515
; V8A-NEXT: .cfi_def_cfa_offset 32
@@ -26,8 +26,8 @@ define i64 @a(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
2626
; V83A-LABEL: a:
2727
; V83A: // %bb.0:
2828
; V83A-NEXT: .cfi_b_key_frame
29-
; V83A-NEXT: pacibsp
3029
; V83A-NEXT: .cfi_negate_ra_state
30+
; V83A-NEXT: pacibsp
3131
; V83A-NEXT: sub sp, sp, #32
3232
; V83A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
3333
; V83A-NEXT: .cfi_def_cfa_offset 32
@@ -59,8 +59,8 @@ define i64 @b(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
5959
; V8A-LABEL: b:
6060
; V8A: // %bb.0:
6161
; V8A-NEXT: .cfi_b_key_frame
62-
; V8A-NEXT: hint #27
6362
; V8A-NEXT: .cfi_negate_ra_state
63+
; V8A-NEXT: hint #27
6464
; V8A-NEXT: sub sp, sp, #32
6565
; V8A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
6666
; V8A-NEXT: .cfi_def_cfa_offset 32
@@ -77,8 +77,8 @@ define i64 @b(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
7777
; V83A-LABEL: b:
7878
; V83A: // %bb.0:
7979
; V83A-NEXT: .cfi_b_key_frame
80-
; V83A-NEXT: pacibsp
8180
; V83A-NEXT: .cfi_negate_ra_state
81+
; V83A-NEXT: pacibsp
8282
; V83A-NEXT: sub sp, sp, #32
8383
; V83A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
8484
; V83A-NEXT: .cfi_def_cfa_offset 32
@@ -110,8 +110,8 @@ define i64 @c(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
110110
; V8A-LABEL: c:
111111
; V8A: // %bb.0:
112112
; V8A-NEXT: .cfi_b_key_frame
113-
; V8A-NEXT: hint #27
114113
; V8A-NEXT: .cfi_negate_ra_state
114+
; V8A-NEXT: hint #27
115115
; V8A-NEXT: sub sp, sp, #32
116116
; V8A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
117117
; V8A-NEXT: .cfi_def_cfa_offset 32
@@ -128,8 +128,8 @@ define i64 @c(i64 %x) "sign-return-address"="non-leaf" "sign-return-address-key"
128128
; V83A-LABEL: c:
129129
; V83A: // %bb.0:
130130
; V83A-NEXT: .cfi_b_key_frame
131-
; V83A-NEXT: pacibsp
132131
; V83A-NEXT: .cfi_negate_ra_state
132+
; V83A-NEXT: pacibsp
133133
; V83A-NEXT: sub sp, sp, #32
134134
; V83A-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
135135
; V83A-NEXT: .cfi_def_cfa_offset 32

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-regsave.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ body: |
8181
# CHECK: name: bar
8282
# CHECK: bb.0:
8383
# CHECK: frame-setup EMITBKEY
84-
# CHECK-NEXT: frame-setup PACIBSP implicit-def $lr, implicit $lr, implicit $sp
8584
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
85+
# CHECK-NEXT: frame-setup PACIBSP implicit-def $lr, implicit $lr, implicit $sp
8686
# CHECK-NOT: OUTLINED_FUNCTION_
8787
# CHECK: bb.1:
8888
# CHECK-NOT: OUTLINED_FUNCTION_

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-same-scope-diff-key.ll

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
define void @a() "sign-return-address"="all" {
88
; V8A-LABEL: a:
99
; V8A: // %bb.0:
10-
; V8A-NEXT: hint #25
1110
; V8A-NEXT: .cfi_negate_ra_state
11+
; V8A-NEXT: hint #25
1212
; V8A-NEXT: sub sp, sp, #32
1313
; V8A-NEXT: .cfi_def_cfa_offset 32
1414
; V8A-NEXT: mov w8, #1 // =0x1
@@ -26,8 +26,8 @@ define void @a() "sign-return-address"="all" {
2626
;
2727
; V83A-LABEL: a:
2828
; V83A: // %bb.0:
29-
; V83A-NEXT: paciasp
3029
; V83A-NEXT: .cfi_negate_ra_state
30+
; V83A-NEXT: paciasp
3131
; V83A-NEXT: sub sp, sp, #32
3232
; V83A-NEXT: .cfi_def_cfa_offset 32
3333
; V83A-NEXT: mov w8, #1 // =0x1
@@ -60,8 +60,8 @@ define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" {
6060
; V8A-LABEL: b:
6161
; V8A: // %bb.0:
6262
; V8A-NEXT: .cfi_b_key_frame
63-
; V8A-NEXT: hint #27
6463
; V8A-NEXT: .cfi_negate_ra_state
64+
; V8A-NEXT: hint #27
6565
; V8A-NEXT: sub sp, sp, #32
6666
; V8A-NEXT: .cfi_def_cfa_offset 32
6767
; V8A-NEXT: mov w8, #1 // =0x1
@@ -80,8 +80,8 @@ define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" {
8080
; V83A-LABEL: b:
8181
; V83A: // %bb.0:
8282
; V83A-NEXT: .cfi_b_key_frame
83-
; V83A-NEXT: pacibsp
8483
; V83A-NEXT: .cfi_negate_ra_state
84+
; V83A-NEXT: pacibsp
8585
; V83A-NEXT: sub sp, sp, #32
8686
; V83A-NEXT: .cfi_def_cfa_offset 32
8787
; V83A-NEXT: mov w8, #1 // =0x1
@@ -113,8 +113,8 @@ define void @b() "sign-return-address"="all" "sign-return-address-key"="b_key" {
113113
define void @c() "sign-return-address"="all" {
114114
; V8A-LABEL: c:
115115
; V8A: // %bb.0:
116-
; V8A-NEXT: hint #25
117116
; V8A-NEXT: .cfi_negate_ra_state
117+
; V8A-NEXT: hint #25
118118
; V8A-NEXT: sub sp, sp, #32
119119
; V8A-NEXT: .cfi_def_cfa_offset 32
120120
; V8A-NEXT: mov w8, #1 // =0x1
@@ -132,8 +132,8 @@ define void @c() "sign-return-address"="all" {
132132
;
133133
; V83A-LABEL: c:
134134
; V83A: // %bb.0:
135-
; V83A-NEXT: paciasp
136135
; V83A-NEXT: .cfi_negate_ra_state
136+
; V83A-NEXT: paciasp
137137
; V83A-NEXT: sub sp, sp, #32
138138
; V83A-NEXT: .cfi_def_cfa_offset 32
139139
; V83A-NEXT: mov w8, #1 // =0x1

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-sp-mod.mir

+17-17
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ body: |
8686
# CHECK: body: |
8787
# CHECK-NEXT: bb.0 (%ir-block.0):
8888
# CHECK-NEXT: liveins: $lr
89-
# CHECK: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
90-
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
89+
# CHECK: frame-setup CFI_INSTRUCTION negate_ra_sign_state
90+
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
9191
# CHECK: BL @[[OUTLINED_FUNC:OUTLINED_FUNCTION_[0-9]+]]
92-
# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
93-
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
92+
# CHECK: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
93+
# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
9494
# CHECK-NEXT: RET undef $lr
9595

9696
...
@@ -119,11 +119,11 @@ body: |
119119
# CHECK: body: |
120120
# CHECK-NEXT: bb.0 (%ir-block.0):
121121
# CHECK-NEXT: liveins: $lr
122-
# CHECK: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
123-
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
122+
# CHECK: frame-setup CFI_INSTRUCTION negate_ra_sign_state
123+
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
124124
# CHECK: BL @[[OUTLINED_FUNC]]
125-
# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
126-
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
125+
# CHECK: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
126+
# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
127127
# CHECK-NEXT: RET undef $lr
128128

129129
...
@@ -174,22 +174,22 @@ body: |
174174
# CHECK: body: |
175175
# CHECK-NEXT: bb.0 (%ir-block.0):
176176
# CHECK-NEXT: liveins: $lr
177-
# CHECK: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
178-
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
177+
# CHECK: frame-setup CFI_INSTRUCTION negate_ra_sign_state
178+
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
179179
# CHECK-NOT: BL @OUTLINED_FUNCTION_{{.*}}
180-
# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
181-
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
180+
# CHECK: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
181+
# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
182182
# CHECK-NEXT: RET undef $lr
183183

184184
# CHECK-LABEL: name: illegal1
185185
# CHECK: body: |
186186
# CHECK-NEXT: bb.0 (%ir-block.0):
187187
# CHECK-NEXT: liveins: $lr
188-
# CHECK: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
189-
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
188+
# CHECK: frame-setup CFI_INSTRUCTION negate_ra_sign_state
189+
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
190190
# CHECK-NOT: BL @OUTLINED_FUNCTION_{{.*}}
191-
# CHECK: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
192-
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
191+
# CHECK: frame-destroy CFI_INSTRUCTION negate_ra_sign_state
192+
# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp
193193
# CHECK-NEXT: RET undef $lr
194194

195195
# Outlined function that contains only legal sp modifications
@@ -198,8 +198,8 @@ body: |
198198
# CHECK-NEXT: bb.0:
199199
# CHECK-NEXT: liveins: $lr
200200
# CHECK-NEXT: {{^ $}}
201-
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
202201
# CHECK-NEXT: frame-setup CFI_INSTRUCTION negate_ra_sign_state
202+
# CHECK-NEXT: frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp
203203
# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
204204
# CHECK: $sp = frame-destroy ADDXri $sp, 16, 0
205205
# CHECK-NEXT: frame-destroy AUTIASP implicit-def $lr, implicit $lr, implicit $sp

llvm/test/CodeGen/AArch64/machine-outliner-retaddr-sign-subtarget.ll

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ define void @a() #0 {
99
; CHECK-LABEL: a: // @a
1010
; CHECK: // %bb.0:
1111
; CHECK-NEXT: .cfi_b_key_frame
12-
; CHECK-NEXT: pacibsp
1312
; CHECK-NEXT: .cfi_negate_ra_state
13+
; CHECK-NEXT: pacibsp
1414
; CHECK-NOT: OUTLINED_FUNCTION_
1515
%1 = alloca i32, align 4
1616
%2 = alloca i32, align 4
@@ -33,8 +33,8 @@ define void @b() #0 {
3333
; CHECK-LABEL: b: // @b
3434
; CHECK: // %bb.0:
3535
; CHECK-NEXT: .cfi_b_key_frame
36-
; CHECK-NEXT: pacibsp
3736
; CHECK-NEXT: .cfi_negate_ra_state
37+
; CHECK-NEXT: pacibsp
3838
; CHECK-NOT: OUTLINED_FUNCTION_
3939
%1 = alloca i32, align 4
4040
%2 = alloca i32, align 4
@@ -57,8 +57,8 @@ define void @c() #1 {
5757
; CHECK-LABEL: c: // @c
5858
; CHECK: // %bb.0:
5959
; CHECK-NEXT: .cfi_b_key_frame
60-
; CHECK-NEXT: hint #27
6160
; CHECK-NEXT: .cfi_negate_ra_state
61+
; CHECK-NEXT: hint #27
6262
; CHECK-NOT: OUTLINED_FUNCTION_
6363
%1 = alloca i32, align 4
6464
%2 = alloca i32, align 4

0 commit comments

Comments
 (0)