aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/LTO
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/LTO')
-rw-r--r--llvm/test/LTO/AArch64/Inputs/bar.ll35
-rw-r--r--llvm/test/LTO/AArch64/Inputs/fiz.ll41
-rw-r--r--llvm/test/LTO/AArch64/Inputs/foo.ll24
-rw-r--r--llvm/test/LTO/AArch64/Inputs/old.ll59
-rw-r--r--llvm/test/LTO/AArch64/link-branch-target-enforcement.ll21
-rw-r--r--llvm/test/LTO/AArch64/link-sign-return-address.ll127
6 files changed, 297 insertions, 10 deletions
diff --git a/llvm/test/LTO/AArch64/Inputs/bar.ll b/llvm/test/LTO/AArch64/Inputs/bar.ll
new file mode 100644
index 0000000..7c2a753
--- /dev/null
+++ b/llvm/test/LTO/AArch64/Inputs/bar.ll
@@ -0,0 +1,35 @@
+;; This file contains the new semantic of the branch-target-enforcement, sign-return-address.
+;; Used for test mixing a mixed link case and also verify the import too in llc.
+
+; RUN: llc -mattr=+pauth -mattr=+bti %s -o - | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+define dso_local void @bar() #0 {
+entry:
+ ret void
+}
+; CHECK-LABEL: bar:
+; CHECK-NOT: hint
+; CHECK-NOT: bti
+; CHECK: ret
+
+define dso_local void @baz() #1 {
+entry:
+ ret void
+}
+
+; CHECK-LABEL: baz:
+; CHECK: bti c
+; CHECK: ret
+
+attributes #0 = { noinline nounwind optnone uwtable }
+attributes #1 = { noinline nounwind optnone uwtable "branch-target-enforcement" }
+
+!llvm.module.flags = !{!0, !1, !2, !3}
+
+!0 = !{i32 8, !"branch-target-enforcement", i32 2}
+!1 = !{i32 8, !"sign-return-address", i32 2}
+!2 = !{i32 8, !"sign-return-address-all", i32 2}
+!3 = !{i32 8, !"sign-return-address-with-bkey", i32 2}
diff --git a/llvm/test/LTO/AArch64/Inputs/fiz.ll b/llvm/test/LTO/AArch64/Inputs/fiz.ll
new file mode 100644
index 0000000..e578426
--- /dev/null
+++ b/llvm/test/LTO/AArch64/Inputs/fiz.ll
@@ -0,0 +1,41 @@
+;; This file contains the previous semantic of the branch-target-enforcement, sign-return-address.
+;; Used for test mixing a mixed link case and also verify the import too in llc.
+
+; RUN: llc -mattr=+pauth -mattr=+bti %s -o - | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+declare void @func()
+
+define i32 @fiz_on() #0 {
+entry:
+ call void @func()
+ ret i32 42
+}
+
+; CHECK-LABEL: fiz_on:
+; CHECK: paciasp
+; CHECK: bl func
+; CHECK: retaa
+
+define i32 @fiz_off() #1 {
+entry:
+ ret i32 43
+}
+
+; CHECK-LABEL: fiz_off:
+; CHECK-NOT: pac
+; CHECK-NOT: hint
+; CHECK-NOT: bti
+; CHECK: ret
+
+attributes #0 = { noinline nounwind optnone uwtable }
+attributes #1 = { noinline nounwind optnone uwtable "branch-target-enforcement"="false" "sign-return-address"="none" }
+
+!llvm.module.flags = !{!0, !1, !2, !3}
+
+!0 = !{i32 8, !"branch-target-enforcement", i32 1}
+!1 = !{i32 8, !"sign-return-address", i32 1}
+!2 = !{i32 8, !"sign-return-address-all", i32 0}
+!3 = !{i32 8, !"sign-return-address-with-bkey", i32 0}
diff --git a/llvm/test/LTO/AArch64/Inputs/foo.ll b/llvm/test/LTO/AArch64/Inputs/foo.ll
index 961b0d4..689d938 100644
--- a/llvm/test/LTO/AArch64/Inputs/foo.ll
+++ b/llvm/test/LTO/AArch64/Inputs/foo.ll
@@ -1,12 +1,34 @@
+;; This file contains the previous semantic of the branch-target-enforcement, sign-return-address.
+;; Used for test mixing a mixed link case and also verify the import too in llc.
+
+; RUN: llc -mattr=+pauth -mattr=+bti %s -o - | FileCheck %s
+
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"
-define dso_local i32 @foo() #0 {
+define i32 @foo_on() #0 {
entry:
ret i32 42
}
+; CHECK-LABEL: foo_on:
+; CHECK: pacibsp
+; CHECK: mov
+; CHECK: retab
+
+define i32 @foo_off() #1 {
+entry:
+ ret i32 43
+}
+
+; CHECK-LABEL: foo_off:
+; CHECK-NOT: pac
+; CHECK-NOT: hint
+; CHECK-NOT: bti
+; CHECK: ret
+
attributes #0 = { noinline nounwind optnone uwtable }
+attributes #1 = { noinline nounwind optnone uwtable "branch-target-enforcement"="false" "sign-return-address"="none" }
!llvm.module.flags = !{!0, !1, !2, !3}
diff --git a/llvm/test/LTO/AArch64/Inputs/old.ll b/llvm/test/LTO/AArch64/Inputs/old.ll
new file mode 100644
index 0000000..2b1758b
--- /dev/null
+++ b/llvm/test/LTO/AArch64/Inputs/old.ll
@@ -0,0 +1,59 @@
+;; This file contains the previous semantic of the branch-target-enforcement, sign-return-address.
+;; Used for test mixing a mixed link case and also verify the import too in llc.
+
+; RUN: llc -mattr=+pauth -mattr=+bti %s -o - | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+define i32 @old_bti() #0 {
+entry:
+ ret i32 2
+}
+
+; CHECK-LABEL: old_bti:
+; CHECK: bti c
+; CHECK: mov
+; CHECK: ret
+
+define i32 @old_pac() #1 {
+entry:
+ ret i32 2
+}
+
+; CHECK-LABEL: old_pac:
+; CHECK: paciasp
+; CHECK: mov
+; CHECK: retaa
+
+
+define i32 @old_none() #2 {
+entry:
+ ret i32 3
+}
+
+; CHECK-LABEL: old_none:
+; CHECK-NOT: hint
+; CHECK-NOT: paci
+; CHECK-NOT: bti
+; CHECK: ret
+
+declare i32 @func(i32)
+
+define i32 @old_none_leaf() #3 {
+entry:
+ %0 = call i32 @func()
+ ret i32 %0
+}
+
+; CHECK-LABEL: old_none_leaf:
+; CHECK: paciasp
+; CHECK: bl func
+; CHECK: retaa
+
+attributes #0 = { noinline nounwind optnone "branch-target-enforcement"="true" }
+attributes #1 = { noinline nounwind optnone "branch-target-enforcement"="false" "sign-return-address"="all" "sign-return-address-key"="a_key" }
+attributes #2 = { noinline nounwind optnone "branch-target-enforcement"="false" "sign-return-address"="none" }
+attributes #3 = { noinline nounwind optnone "branch-target-enforcement"="false" "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" }
+
+;; Intentionally no module flags
diff --git a/llvm/test/LTO/AArch64/link-branch-target-enforcement.ll b/llvm/test/LTO/AArch64/link-branch-target-enforcement.ll
index b3c9828..20254de 100644
--- a/llvm/test/LTO/AArch64/link-branch-target-enforcement.ll
+++ b/llvm/test/LTO/AArch64/link-branch-target-enforcement.ll
@@ -1,10 +1,10 @@
-; Testcase to check that module with different branch-target-enforcement can
-; be mixed.
-;
+;; Testcase to check that module with different branch-target-enforcement can
+;; be mixed.
+;;
; RUN: llvm-as %s -o %t1.bc
; RUN: llvm-as %p/Inputs/foo.ll -o %t2.bc
; RUN: llvm-lto -exported-symbol main \
-; RUN: -exported-symbol foo \
+; RUN: -exported-symbol foo_on \
; RUN: -filetype=obj \
; RUN: %t1.bc %t2.bc \
; RUN: -o %t1.exe 2>&1 | FileCheck --allow-empty %s
@@ -14,11 +14,11 @@
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"
-declare i32 @foo();
+declare i32 @foo_on();
define i32 @main() "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" {
entry:
- %add = call i32 @foo()
+ %add = call i32 @foo_on()
ret i32 %add
}
@@ -30,9 +30,12 @@ entry:
; CHECK-NOT: linking module flags 'branch-target-enforcement': IDs have conflicting values in
; CHECK-DUMP: <main>:
+; CHECK-DUMP: paciasp
+; CHECK-DUMP: str
; CHECK-DUMP: bl 0x8 <main+0x8>
-; CHECK-DUMP: <foo>:
+; CHECK-DUMP: <foo_on>:
+; CHECK-DUMP: pacibsp
-; `main` doesn't support BTI while `foo` does, so in the binary
-; we should see only PAC which is supported by both.
+;; `main` doesn't support BTI while `foo` does, so in the binary
+;; we should see only PAC which is supported by both.
; CHECK-PROP: Properties: aarch64 feature: PAC \ No newline at end of file
diff --git a/llvm/test/LTO/AArch64/link-sign-return-address.ll b/llvm/test/LTO/AArch64/link-sign-return-address.ll
new file mode 100644
index 0000000..331e481
--- /dev/null
+++ b/llvm/test/LTO/AArch64/link-sign-return-address.ll
@@ -0,0 +1,127 @@
+;; Testcase to check that module with different sign return address can
+;; be mixed.
+;
+; RUN: llvm-as %s -o %t1.bc
+; RUN: llvm-as %p/Inputs/foo.ll -o %t2.bc
+; RUN: llvm-as %p/Inputs/fiz.ll -o %t3.bc
+; RUN: llvm-as %p/Inputs/bar.ll -o %t4.bc
+; RUN: llvm-as %p/Inputs/old.ll -o %t5.bc
+; RUN: llvm-lto -exported-symbol main \
+; RUN: -exported-symbol foo_on \
+; RUN: -exported-symbol foo_off \
+; RUN: -exported-symbol fiz_on \
+; RUN: -exported-symbol fiz_off \
+; RUN: -exported-symbol bar \
+; RUN: -exported-symbol baz \
+; RUN: -exported-symbol old_bti \
+; RUN: -exported-symbol old_pac \
+; RUN: -exported-symbol old_none \
+; RUN: -filetype=obj \
+; RUN: %t5.bc %t4.bc %t3.bc %t2.bc %t1.bc \
+; RUN: -o %t1.exe 2>&1
+; RUN: llvm-objdump -d %t1.exe | FileCheck --check-prefix=CHECK-DUMP %s
+; RUN: llvm-readelf -n %t1.exe | FileCheck --allow-empty --check-prefix=CHECK-PROP %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+declare i32 @foo_on();
+declare i32 @foo_off();
+declare i32 @fiz_on();
+declare i32 @fiz_off();
+declare void @baz();
+declare void @bar();
+declare i32 @old_bti();
+declare i32 @old_pac();
+declare i32 @old_none();
+
+define i32 @main() #0 {
+entry:
+ call i32 @foo_on()
+ call i32 @foo_off()
+ call i32 @fiz_on()
+ call i32 @fiz_off()
+ call void @bar()
+ call void @baz()
+ call i32 @old_bti()
+ call i32 @old_pac()
+ call i32 @old_none()
+ ret i32 0
+}
+
+attributes #0 = { noinline nounwind optnone }
+
+!llvm.module.flags = !{!0, !1, !2, !3 }
+!0 = !{i32 8, !"branch-target-enforcement", i32 0}
+!1 = !{i32 8, !"sign-return-address", i32 0}
+!2 = !{i32 8, !"sign-return-address-all", i32 0}
+!3 = !{i32 8, !"sign-return-address-with-bkey", i32 0}
+
+
+; CHECK-DUMP-LABEL: <old_bti>:
+; CHECK-DUMP-NEXT: bti c
+; CHECK-DUMP-NEXT: mov w0, #0x2
+; CHECK-DUMP-NEXT: ret
+
+; CHECK-DUMP-LABEL: <old_pac>:
+; CHECK-DUMP-NEXT: paciasp
+; CHECK-DUMP-NEXT: mov w0, #0x2
+; CHECK-DUMP-NEXT: autiasp
+; CHECK-DUMP-NEXT: ret
+
+; CHECK-DUMP-LABEL: <old_none>:
+; CHECK-DUMP-NEXT: mov w0, #0x3
+; CHECK-DUMP-NEXT: ret
+
+; CHECK-DUMP-LABEL: <bar>:
+; CHECK-DUMP-NEXT: ret
+
+; CHECK-DUMP-LABEL: <baz>:
+; CHECK-DUMP-NEXT: bti c
+; CHECK-DUMP-NEXT: ret
+
+;; fiz.ll represents a module with the old style of the function attributes.
+;; fiz_on shall have PAC with A-key as it requested at module level.
+; CHECK-DUMP-LABEL: <fiz_on>:
+; CHECK-DUMP-NEXT: paciasp
+; CHECK-DUMP-NEXT: str x30, [sp, #-0x10]!
+; CHECK-DUMP-NEXT: bl 0x38 <fiz_on+0x8>
+; CHECK-DUMP-NEXT: mov w0, #0x2a
+; CHECK-DUMP-NEXT: ldr x30, [sp], #0x10
+; CHECK-DUMP-NEXT: autiasp
+; CHECK-DUMP-NEXT: ret
+
+;; fiz_off shall not have BTI or PAC instructions as they are disabled at function scope.
+; CHECK-DUMP-LABEL: <fiz_off>:
+; CHECK-DUMP-NEXT: mov w0, #0x2b
+; CHECK-DUMP-NEXT: ret
+
+;; foo.ll represents a module with the old style of the function attributes.
+;; foo_on shall have PAC with B-key as it requested at module level.
+; CHECK-DUMP-LABEL: <foo_on>:
+; CHECK-DUMP-NEXT: pacibsp
+; CHECK-DUMP-NEXT: mov w0, #0x2a
+; CHECK-DUMP-NEXT: autibsp
+; CHECK-DUMP-NEXT: ret
+
+;; foo_off shall not have BTI or PAC instructions as they are disabled at function scope.
+; CHECK-DUMP-LABEL: <foo_off>:
+; CHECK-DUMP-NEXT: mov w0, #0x2b
+; CHECK-DUMP-NEXT: ret
+
+; CHECK-DUMP-LABEL: <main>:
+; CHECK-DUMP-NOT: paciasp
+; CHECK-DUMP-NEXT: str x30,
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+; CHECK-DUMP-NEXT: bl
+
+;; `main` doesn't support PAC sign-return-address while `foo` does, so in the binary
+;; we should not see anything.
+; CHECK-PROP-NOT: Properties: aarch64 feature: PAC