-
Notifications
You must be signed in to change notification settings - Fork 11k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AArch64] __builtin_return_address for PAuth.
This change adds the support for __builtin_return_address for ARMv8.3A Pointer Authentication. Location of the authentication code in the pointer depends on the system configuration, therefore a dedicated instruction is used for effectively removing the authentication code without authenticating the pointer. Reviewed By: chill Differential Revision: https://reviews.llvm.org/D75044
- Loading branch information
1 parent
0a925a8
commit 2a96f47
Showing
6 changed files
with
93 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
; RUN: llc < %s -mtriple=arm64-eabi -asm-verbose=false -mattr=v8.2a | FileCheck %s | ||
; RUN: llc < %s -mtriple=arm64-eabi -asm-verbose=false -mattr=v8.3a | FileCheck %s --check-prefix=CHECKV83 | ||
|
||
; Armv8.3-A Pointer Authetication requires a special intsruction to strip the | ||
; pointer authentication code from the pointer. | ||
; The XPACLRI instruction assembles to a hint-space instruction before Armv8.3-A | ||
; therefore this instruction can be safely used for any pre Armv8.3-A architectures. | ||
; On Armv8.3-A and onwards XPACI is available so use that instead. | ||
|
||
define i8* @ra0() nounwind readnone { | ||
entry: | ||
; CHECK-LABEL: ra0: | ||
; CHECK-NEXT: str x30, [sp, #-16]! | ||
; CHECK-NEXT: hint #7 | ||
; CHECK-NEXT: mov x0, x30 | ||
; CHECK-NEXT: ldr x30, [sp], #16 | ||
; CHECK-NEXT: ret | ||
; CHECKV83: str x30, [sp, #-16]! | ||
; CHECKV83-NEXT: xpaci x30 | ||
; CHECKV83-NEXT: mov x0, x30 | ||
; CHECKV83-NEXT: ldr x30, [sp], #16 | ||
; CHECKV83-NEXT: ret | ||
%0 = tail call i8* @llvm.returnaddress(i32 0) | ||
ret i8* %0 | ||
} | ||
|
||
define i8* @ra1() nounwind readnone #0 { | ||
entry: | ||
; CHECK-LABEL: ra1: | ||
; CHECK: hint #25 | ||
; CHECK-NEXT: str x30, [sp, #-16]! | ||
; CHECK-NEXT: hint #7 | ||
; CHECK-NEXT: mov x0, x30 | ||
; CHECK-NEXT: ldr x30, [sp], #16 | ||
; CHECK-NEXT: hint #29 | ||
; CHECK-NEXT: ret | ||
; CHECKV83: paciasp | ||
; CHECKV83-NEXT: str x30, [sp, #-16]! | ||
; CHECKV83-NEXT: xpaci x30 | ||
; CHECKV83-NEXT: mov x0, x30 | ||
; CHECKV83-NEXT: ldr x30, [sp], #16 | ||
; CHECKV83-NEXT: retaa | ||
%0 = tail call i8* @llvm.returnaddress(i32 0) | ||
ret i8* %0 | ||
} | ||
|
||
attributes #0 = { "sign-return-address"="all" } | ||
|
||
declare i8* @llvm.returnaddress(i32) nounwind readnone |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters