[Xtensa] Implement Windowed Register Option. (#124656)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / ptrauth-init-fini.ll
blob186a31c63ba10d97e510fed01abd09228688f9c2
1 ; RUN: rm -rf %t && split-file %s %t && cd %t
3 ;--- nodisc.ll
5 ; RUN: llc -mtriple aarch64-elf -mattr=+pauth -filetype=asm -o - nodisc.ll | \
6 ; RUN:   FileCheck %s --check-prefix=ASM
7 ; RUN: llc -mtriple aarch64-elf -mattr=+pauth -filetype=obj -o - nodisc.ll | \
8 ; RUN:   llvm-readelf -r -x .init_array -x .fini_array - | FileCheck %s --check-prefix=OBJ
10 ; ASM:      .section .init_array,"aw",@init_array
11 ; ASM-NEXT: .p2align 3, 0x0
12 ; ASM-NEXT: .xword   foo@AUTH(ia,55764)
13 ; ASM-NEXT: .section .fini_array,"aw",@fini_array
14 ; ASM-NEXT: .p2align 3, 0x0
15 ; ASM-NEXT: .xword   bar@AUTH(ia,55764)
17 ; OBJ:      Relocation section '.rela.init_array' at offset 0x[[#]] contains 1 entries:
18 ; OBJ-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
19 ; OBJ-NEXT: 0000000000000000  0000000700000244 R_AARCH64_AUTH_ABS64   0000000000000000 foo + 0
20 ; OBJ:      Relocation section '.rela.fini_array' at offset 0x[[#]] contains 1 entries:
21 ; OBJ-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
22 ; OBJ-NEXT: 0000000000000000  0000000800000244 R_AARCH64_AUTH_ABS64   0000000000000004 bar + 0
23 ; OBJ:      Hex dump of section '.init_array':
24 ; OBJ-NEXT: 0x00000000 00000000 d4d90000
25 ; OBJ:      Hex dump of section '.fini_array':
26 ; OBJ-NEXT: 0x00000000 00000000 d4d90000
27 ;;                              ^^^^ 0xD9D4: constant discriminator = 55764
28 ;;                                    ^^ 0x80: bits 61..60 key = IA; bit 63 addr disc = false
30 @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @foo, i32 0, i64 55764), ptr null }]
31 @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @bar, i32 0, i64 55764), ptr null }]
33 define void @foo() {
34   ret void
37 define void @bar() {
38   ret void
41 ;--- disc.ll
43 ; RUN: llc -mtriple aarch64-elf -mattr=+pauth -filetype=asm -o - disc.ll | \
44 ; RUN:   FileCheck %s --check-prefix=ASM-DISC
45 ; RUN: llc -mtriple aarch64-elf -mattr=+pauth -filetype=obj -o - disc.ll | \
46 ; RUN:   llvm-readelf -r -x .init_array -x .fini_array - | FileCheck %s --check-prefix=OBJ-DISC
48 ; ASM-DISC:      .section .init_array,"aw",@init_array
49 ; ASM-DISC-NEXT: .p2align 3, 0x0
50 ; ASM-DISC-NEXT: .xword   foo@AUTH(ia,55764,addr)
51 ; ASM-DISC-NEXT: .section .fini_array,"aw",@fini_array
52 ; ASM-DISC-NEXT: .p2align 3, 0x0
53 ; ASM-DISC-NEXT: .xword   bar@AUTH(ia,55764,addr)
55 ; OBJ-DISC:      Relocation section '.rela.init_array' at offset 0x[[#]] contains 1 entries:
56 ; OBJ-DISC-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
57 ; OBJ-DISC-NEXT: 0000000000000000  0000000700000244 R_AARCH64_AUTH_ABS64   0000000000000000 foo + 0
58 ; OBJ-DISC:      Relocation section '.rela.fini_array' at offset 0x[[#]] contains 1 entries:
59 ; OBJ-DISC-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
60 ; OBJ-DISC-NEXT: 0000000000000000  0000000800000244 R_AARCH64_AUTH_ABS64   0000000000000004 bar + 0
61 ; OBJ-DISC:      Hex dump of section '.init_array':
62 ; OBJ-DISC-NEXT: 0x00000000 00000000 d4d90080
63 ; OBJ-DISC:      Hex dump of section '.fini_array':
64 ; OBJ-DISC-NEXT: 0x00000000 00000000 d4d90080
65 ;;                                   ^^^^ 0xD9D4: constant discriminator = 55764
66 ;;                                         ^^ 0x80: bits 61..60 key = IA; bit 63 addr disc = true
68 @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @foo, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr)), ptr null }]
69 @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @bar, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr)), ptr null }]
71 define void @foo() {
72   ret void
75 define void @bar() {
76   ret void
79 ;--- err1.ll
81 ; RUN: not --crash llc -mtriple aarch64-elf -mattr=+pauth -filetype=asm -o - err1.ll 2>&1 | \
82 ; RUN:   FileCheck %s --check-prefix=ERR1
84 ; ERR1: LLVM ERROR: unexpected address discrimination value for ctors/dtors entry, only 'ptr inttoptr (i64 1 to ptr)' is allowed
86 @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @foo, i32 0, i64 55764, ptr inttoptr (i64 2 to ptr)), ptr null }]
88 define void @foo() {
89   ret void
92 ;--- err2.ll
94 ; RUN: not --crash llc -mtriple aarch64-elf -mattr=+pauth -filetype=asm -o - err2.ll 2>&1 | \
95 ; RUN:   FileCheck %s --check-prefix=ERR2
97 ; ERR2: LLVM ERROR: unexpected address discrimination value for ctors/dtors entry, only 'ptr inttoptr (i64 1 to ptr)' is allowed
99 @g = external global ptr
100 @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @bar, i32 0, i64 55764, ptr @g), ptr null }]
102 define void @bar() {
103   ret void