
Move the emission of the checks performed on the authenticated LR value during tail calls to AArch64AsmPrinter class, so that different checker sequences can be reused by pseudo instructions expanded there. This adds one more option to AuthCheckMethod enumeration, the generic XPAC variant which is not restricted to checking the LR register.
114 lines
4.6 KiB
LLVM
114 lines
4.6 KiB
LLVM
; RUN: llc -mtriple aarch64 -o - %s \
|
|
; RUN: -aarch64-authenticated-lr-check-method=xpac-hint \
|
|
; RUN: -stop-before=aarch64-ptrauth \
|
|
; RUN: | FileCheck --check-prefix=MIR %s
|
|
|
|
; RUN: llc -mtriple aarch64 -o - %s -asm-verbose=0 \
|
|
; RUN: -aarch64-authenticated-lr-check-method=xpac-hint \
|
|
; RUN: | FileCheck --check-prefix=ASM %s
|
|
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
|
|
|
|
;; Test that expansion of AUTH_TCRETURN does not crash due to unavailability of
|
|
;; neither x16 nor x17 as a scratch register.
|
|
define i32 @test_scratch_reg_nobti(ptr %callee, ptr %addr) #0 {
|
|
entry:
|
|
;; Force spilling of LR
|
|
tail call void asm sideeffect "", "~{lr}"()
|
|
;; Clobber x0-x15 and x18-x29. This is rather fragile but it was observed to
|
|
;; trick regalloc into allocating both x16 and x17 as inputs of AUTH_TCRETURN.
|
|
tail call void asm sideeffect "", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15}"()
|
|
tail call void asm sideeffect "", "~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{fp}"()
|
|
%addr.i = ptrtoint ptr %addr to i64
|
|
%call = tail call i32 %callee() #1 [ "ptrauth"(i32 0, i64 %addr.i) ]
|
|
ret i32 %call
|
|
}
|
|
;; Ensure the specific tail call pseudo instruction is used.
|
|
; MIR-LABEL: name: test_scratch_reg_nobti
|
|
; MIR: AUTH_TCRETURN{{ }}
|
|
;
|
|
; ASM-LABEL: test_scratch_reg_nobti:
|
|
; ASM-NEXT: pacibsp
|
|
; ASM-NEXT: sub sp, sp, #112
|
|
; ASM-NEXT: stp x29, x30, [sp, #16]
|
|
; ASM-NEXT: mov x16, x1
|
|
; ASM-NEXT: stp x28, x27, [sp, #32]
|
|
; ASM-NEXT: stp x26, x25, [sp, #48]
|
|
; ASM-NEXT: stp x24, x23, [sp, #64]
|
|
; ASM-NEXT: stp x22, x21, [sp, #80]
|
|
; ASM-NEXT: stp x20, x19, [sp, #96]
|
|
; ASM-NEXT: str x0, [sp, #8]
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: ldr x0, [sp, #8]
|
|
; ASM-NEXT: ldp x20, x19, [sp, #96]
|
|
; ASM-NEXT: ldp x22, x21, [sp, #80]
|
|
; ASM-NEXT: ldp x24, x23, [sp, #64]
|
|
; ASM-NEXT: ldp x26, x25, [sp, #48]
|
|
; ASM-NEXT: ldp x28, x27, [sp, #32]
|
|
; ASM-NEXT: ldp x29, x30, [sp, #16]
|
|
; ASM-NEXT: add sp, sp, #112
|
|
; ASM-NEXT: autibsp
|
|
; ASM-NEXT: eor x17, x30, x30, lsl #1
|
|
; ASM-NEXT: tbz x17, #62, .Lauth_success_0
|
|
; ASM-NEXT: brk #0xc471
|
|
; ASM-NEXT: .Lauth_success_0:
|
|
; ASM-NEXT: braa x0, x16
|
|
; ASM-NEXT: .Lfunc_end0:
|
|
|
|
;; The same for AUTH_TCRETURN_BTI.
|
|
define i32 @test_scratch_reg_bti(ptr %callee, ptr %addr) "branch-target-enforcement" #0 {
|
|
entry:
|
|
;; Force spilling of LR
|
|
tail call void asm sideeffect "", "~{lr}"()
|
|
;; Clobber x0-x15 and x18-x29. This is rather fragile but it was observed to
|
|
;; trick regalloc into allocating both x16 and x17 as inputs of AUTH_TCRETURN_BTI.
|
|
tail call void asm sideeffect "", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15}"()
|
|
tail call void asm sideeffect "", "~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{fp}"()
|
|
%addr.i = ptrtoint ptr %addr to i64
|
|
%call = tail call i32 %callee() #1 [ "ptrauth"(i32 0, i64 %addr.i) ]
|
|
ret i32 %call
|
|
}
|
|
;; Ensure the specific tail call pseudo instruction is used.
|
|
; MIR-LABEL: name: test_scratch_reg_bti
|
|
; MIR: AUTH_TCRETURN_BTI
|
|
;
|
|
; ASM-LABEL: test_scratch_reg_bti:
|
|
; ASM-NEXT: pacibsp
|
|
; ASM-NEXT: sub sp, sp, #112
|
|
; ASM-NEXT: stp x29, x30, [sp, #16]
|
|
; ASM-NEXT: mov x16, x0
|
|
; ASM-NEXT: stp x28, x27, [sp, #32]
|
|
; ASM-NEXT: stp x26, x25, [sp, #48]
|
|
; ASM-NEXT: stp x24, x23, [sp, #64]
|
|
; ASM-NEXT: stp x22, x21, [sp, #80]
|
|
; ASM-NEXT: stp x20, x19, [sp, #96]
|
|
; ASM-NEXT: str x1, [sp, #8]
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: //APP
|
|
; ASM-NEXT: //NO_APP
|
|
; ASM-NEXT: ldr x0, [sp, #8]
|
|
; ASM-NEXT: ldp x20, x19, [sp, #96]
|
|
; ASM-NEXT: ldp x22, x21, [sp, #80]
|
|
; ASM-NEXT: ldp x24, x23, [sp, #64]
|
|
; ASM-NEXT: ldp x26, x25, [sp, #48]
|
|
; ASM-NEXT: ldp x28, x27, [sp, #32]
|
|
; ASM-NEXT: ldp x29, x30, [sp, #16]
|
|
; ASM-NEXT: add sp, sp, #112
|
|
; ASM-NEXT: autibsp
|
|
; ASM-NEXT: eor x17, x30, x30, lsl #1
|
|
; ASM-NEXT: tbz x17, #62, .Lauth_success_1
|
|
; ASM-NEXT: brk #0xc471
|
|
; ASM-NEXT: .Lauth_success_1:
|
|
; ASM-NEXT: braa x16, x0
|
|
; ASM-NEXT: .Lfunc_end1:
|
|
|
|
attributes #0 = { nounwind "ptrauth-auth-traps" "ptrauth-calls" "ptrauth-returns" "target-features"="+pauth" }
|