[ELF] Reorder SectionBase/InputSectionBase members
[llvm-project.git] / llvm / test / CodeGen / AArch64 / ptrauth-ret-trap.ll
blob4821b3c0f274be2c7d037001db1ed65054880f77
1 ; RUN: llc -mtriple aarch64-linux-gnu -mattr=+pauth -asm-verbose=false -disable-post-ra -o - %s | FileCheck %s
3 ; CHECK-LABEL:  test_tailcall:
4 ; CHECK-NEXT:   pacibsp
5 ; CHECK-NEXT:   str x30, [sp, #-16]!
6 ; CHECK-NEXT:   bl bar
7 ; CHECK-NEXT:   ldr x30, [sp], #16
8 ; CHECK-NEXT:   autibsp
9 ; CHECK-NEXT:   eor x16, x30, x30, lsl #1
10 ; CHECK-NEXT:   tbz x16, #62, [[GOOD:.L.*]]
11 ; CHECK-NEXT:   brk #0xc471
12 ; CHECK-NEXT:   [[GOOD]]:
13 ; CHECK-NEXT:   b bar
14 define i32 @test_tailcall() #0 {
15   call i32 @bar()
16   %c = tail call i32 @bar()
17   ret i32 %c
20 ; CHECK-LABEL: test_tailcall_noframe:
21 ; CHECK-NEXT:  b bar
22 define i32 @test_tailcall_noframe() #0 {
23   %c = tail call i32 @bar()
24   ret i32 %c
27 ; CHECK-LABEL: test_tailcall_indirect:
28 ; CHECK:         autibsp
29 ; CHECK:         eor     x16, x30, x30, lsl #1
30 ; CHECK:         tbz     x16, #62, [[GOOD:.L.*]]
31 ; CHECK:         brk     #0xc471
32 ; CHECK: [[GOOD]]:
33 ; CHECK:         br      x0
34 define void @test_tailcall_indirect(ptr %fptr) #0 {
35   call i32 @test_tailcall()
36   tail call void %fptr()
37   ret void
40 ; CHECK-LABEL: test_tailcall_indirect_in_x9:
41 ; CHECK:         autibsp
42 ; CHECK:         eor     x16, x30, x30, lsl #1
43 ; CHECK:         tbz     x16, #62, [[GOOD:.L.*]]
44 ; CHECK:         brk     #0xc471
45 ; CHECK: [[GOOD]]:
46 ; CHECK:         br      x9
47 define void @test_tailcall_indirect_in_x9(ptr sret(i64) %ret, [8 x i64] %in, ptr %fptr) #0 {
48   %ptr = alloca i8, i32 16
49   call i32 @test_tailcall()
50   tail call void %fptr(ptr sret(i64) %ret, [8 x i64] %in)
51   ret void
54 ; CHECK-LABEL: test_auth_tailcall_indirect:
55 ; CHECK:         autibsp
56 ; CHECK:         eor     x16, x30, x30, lsl #1
57 ; CHECK:         tbz     x16, #62, [[GOOD:.L.*]]
58 ; CHECK:         brk     #0xc471
59 ; CHECK: [[GOOD]]:
60 ; CHECK:         mov x16, #42
61 ; CHECK:         braa      x0, x16
62 define void @test_auth_tailcall_indirect(ptr %fptr) #0 {
63   call i32 @test_tailcall()
64   tail call void %fptr() [ "ptrauth"(i32 0, i64 42) ]
65   ret void
68 ; CHECK-LABEL: test_auth_tailcall_indirect_in_x9:
69 ; CHECK:         autibsp
70 ; CHECK:         eor     x16, x30, x30, lsl #1
71 ; CHECK:         tbz     x16, #62, [[GOOD:.L.*]]
72 ; CHECK:         brk     #0xc471
73 ; CHECK: [[GOOD]]:
74 ; CHECK:         brabz      x9
75 define void @test_auth_tailcall_indirect_in_x9(ptr sret(i64) %ret, [8 x i64] %in, ptr %fptr) #0 {
76   %ptr = alloca i8, i32 16
77   call i32 @test_tailcall()
78   tail call void %fptr(ptr sret(i64) %ret, [8 x i64] %in) [ "ptrauth"(i32 1, i64 0) ]
79   ret void
82 ; CHECK-LABEL: test_auth_tailcall_indirect_bti:
83 ; CHECK:         autibsp
84 ; CHECK:         eor     x17, x30, x30, lsl #1
85 ; CHECK:         tbz     x17, #62, [[GOOD:.L.*]]
86 ; CHECK:         brk     #0xc471
87 ; CHECK: [[GOOD]]:
88 ; CHECK:         brabz      x16
89 define void @test_auth_tailcall_indirect_bti(ptr sret(i64) %ret, [8 x i64] %in, ptr %fptr) #0 "branch-target-enforcement"="true" {
90   %ptr = alloca i8, i32 16
91   call i32 @test_tailcall()
92   tail call void %fptr(ptr sret(i64) %ret, [8 x i64] %in) [ "ptrauth"(i32 1, i64 0) ]
93   ret void
96 declare i32 @bar()
98 attributes #0 = { nounwind "ptrauth-returns" "ptrauth-auth-traps" }