forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PAC][CodeGen][ELF][AArch64] Support signed GOT with tiny code model (l…
…lvm#114525) Support the following relocations and assembly operators: - `R_AARCH64_AUTH_GOT_ADR_PREL_LO21` (`:got_auth:` for `adr`) - `R_AARCH64_AUTH_GOT_LD_PREL19` (`:got_auth:` for `ldr`) `LOADgotAUTH` pseudo-instruction is expanded to actual instruction sequence like the following. ``` adr x16, :got_auth:sym ldr x0, [x16] autia x0, x16 ``` Both SelectionDAG and GlobalISel are suppported. For FastISel, we fall back to SelectionDAG. Tests starting with 'ptrauth-' have corresponding variants w/o this prefix.
- Loading branch information
Showing
8 changed files
with
454 additions
and
19 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
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,182 @@ | ||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \ | ||
; RUN: -relocation-model=pic < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s | ||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \ | ||
; RUN: -relocation-model=pic < %s | FileCheck --check-prefixes=CHECK,TRAP %s | ||
|
||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \ | ||
; RUN: -relocation-model=pic -fast-isel < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s | ||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \ | ||
; RUN: -relocation-model=pic -fast-isel < %s | FileCheck --check-prefixes=CHECK,TRAP %s | ||
|
||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -mattr=+fpac -code-model=tiny \ | ||
; RUN: -relocation-model=pic -global-isel -global-isel-abort=1 < %s | FileCheck --check-prefixes=CHECK,NOTRAP %s | ||
; RUN: llc -verify-machineinstrs -mtriple=aarch64 -mattr=+pauth -code-model=tiny \ | ||
; RUN: -relocation-model=pic -global-isel -global-isel-abort=1 < %s | FileCheck --check-prefixes=CHECK,TRAP %s | ||
|
||
; Note: fast-isel tests here will fall back to isel | ||
|
||
@src = external local_unnamed_addr global [65536 x i8], align 1 | ||
@dst = external global [65536 x i8], align 1 | ||
@ptr = external local_unnamed_addr global ptr, align 8 | ||
|
||
define dso_preemptable void @foo1() { | ||
; CHECK-LABEL: foo1: | ||
; CHECK: // %bb.0: // %entry | ||
; CHECK-NEXT: adr x17, :got_auth:src | ||
; NOTRAP-NEXT: ldr x8, [x17] | ||
; NOTRAP-NEXT: autda x8, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_0 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_0: | ||
; TRAP-NEXT: mov x8, x16 | ||
; CHECK-NEXT: ldrb w8, [x8] | ||
; CHECK-NEXT: adr x17, :got_auth:dst | ||
; NOTRAP-NEXT: ldr x9, [x17] | ||
; NOTRAP-NEXT: autda x9, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_1 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_1: | ||
; TRAP-NEXT: mov x9, x16 | ||
; CHECK-NEXT: strb w8, [x9] | ||
; CHECK-NEXT: ret | ||
|
||
entry: | ||
%0 = load i8, ptr @src, align 1 | ||
store i8 %0, ptr @dst, align 1 | ||
ret void | ||
} | ||
|
||
define dso_preemptable void @foo2() { | ||
; CHECK-LABEL: foo2: | ||
; CHECK: // %bb.0: // %entry | ||
; CHECK-NEXT: adr x17, :got_auth:ptr | ||
; NOTRAP-NEXT: ldr x8, [x17] | ||
; NOTRAP-NEXT: autda x8, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_2 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_2: | ||
; TRAP-NEXT: mov x8, x16 | ||
; CHECK-NEXT: adr x17, :got_auth:dst | ||
; NOTRAP-NEXT: ldr x9, [x17] | ||
; NOTRAP-NEXT: autda x9, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_3 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_3: | ||
; TRAP-NEXT: mov x9, x16 | ||
; CHECK-NEXT: str x9, [x8] | ||
; CHECK-NEXT: ret | ||
|
||
entry: | ||
store ptr @dst, ptr @ptr, align 8 | ||
ret void | ||
} | ||
|
||
define dso_preemptable void @foo3() { | ||
; CHECK-LABEL: foo3: | ||
; CHECK: // %bb.0: // %entry | ||
; CHECK-NEXT: adr x17, :got_auth:src | ||
; NOTRAP-NEXT: ldr x8, [x17] | ||
; NOTRAP-NEXT: autda x8, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_4 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_4: | ||
; TRAP-NEXT: mov x8, x16 | ||
; CHECK-NEXT: ldrb w8, [x8] | ||
; CHECK-NEXT: adr x17, :got_auth:ptr | ||
; NOTRAP-NEXT: ldr x9, [x17] | ||
; NOTRAP-NEXT: autda x9, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autda x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpacd x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_5 | ||
; TRAP-NEXT: brk #0xc472 | ||
; TRAP-NEXT: .Lauth_success_5: | ||
; TRAP-NEXT: mov x9, x16 | ||
; CHECK-NEXT: ldr x9, [x9] | ||
; CHECK-NEXT: strb w8, [x9] | ||
; CHECK-NEXT: ret | ||
|
||
entry: | ||
%0 = load i8, ptr @src, align 1 | ||
%1 = load ptr, ptr @ptr, align 8 | ||
store i8 %0, ptr %1, align 1 | ||
ret void | ||
} | ||
|
||
@lsrc = internal global i8 0, align 4 | ||
@ldst = internal global i8 0, align 4 | ||
@lptr = internal global ptr null, align 8 | ||
|
||
declare void @func(...) | ||
|
||
define dso_preemptable ptr @externfuncaddr() { | ||
; CHECK-LABEL: externfuncaddr: | ||
; CHECK: // %bb.0: // %entry | ||
; CHECK-NEXT: adr x17, :got_auth:func | ||
; NOTRAP-NEXT: ldr x0, [x17] | ||
; NOTRAP-NEXT: autia x0, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autia x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpaci x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_6 | ||
; TRAP-NEXT: brk #0xc470 | ||
; TRAP-NEXT: .Lauth_success_6: | ||
; TRAP-NEXT: mov x0, x16 | ||
; CHECK-NEXT: ret | ||
|
||
entry: | ||
ret ptr @func | ||
} | ||
|
||
define dso_preemptable ptr @localfuncaddr() { | ||
; CHECK-LABEL: localfuncaddr: | ||
; CHECK: // %bb.0: // %entry | ||
; CHECK-NEXT: adr x17, :got_auth:externfuncaddr | ||
; NOTRAP-NEXT: ldr x0, [x17] | ||
; NOTRAP-NEXT: autia x0, x17 | ||
; TRAP-NEXT: ldr x16, [x17] | ||
; TRAP-NEXT: autia x16, x17 | ||
; TRAP-NEXT: mov x17, x16 | ||
; TRAP-NEXT: xpaci x17 | ||
; TRAP-NEXT: cmp x16, x17 | ||
; TRAP-NEXT: b.eq .Lauth_success_7 | ||
; TRAP-NEXT: brk #0xc470 | ||
; TRAP-NEXT: .Lauth_success_7: | ||
; TRAP-NEXT: mov x0, x16 | ||
; CHECK-NEXT: ret | ||
|
||
entry: | ||
ret ptr @externfuncaddr | ||
} | ||
|
||
!llvm.module.flags = !{!0} | ||
!0 = !{i32 8, !"ptrauth-elf-got", i32 1} |
Oops, something went wrong.