xref: /llvm-project/llvm/test/MC/AArch64/coff-relocations.s (revision 46b853a82ce64e5213f8dfa2c12c6e6a950018a0)
1// RUN: llvm-mc -triple aarch64-windows -filetype obj -o %t.obj %s
2// RUN: llvm-mc -triple arm64ec-windows -filetype obj -o %t-ec.obj %s
3// RUN: llvm-readobj -r %t.obj | FileCheck %s --check-prefixes=CHECK,CHECK-ARM64
4// RUN: llvm-readobj -r %t-ec.obj | FileCheck %s --check-prefixes=CHECK,CHECK-ARM64EC
5// RUN: llvm-objdump --no-print-imm-hex -d %t.obj | FileCheck %s --check-prefix=DISASM
6// RUN: llvm-objdump --no-print-imm-hex -d %t-ec.obj | FileCheck %s --check-prefix=DISASM
7// RUN: llvm-objdump -s %t.obj | FileCheck %s --check-prefix=DATA
8// RUN: llvm-objdump -s %t-ec.obj | FileCheck %s --check-prefix=DATA
9
10// IMAGE_REL_ARM64_ADDR32
11.Linfo_foo:
12  .asciz "foo"
13  .long foo
14
15// IMAGE_REL_ARM64_ADDR32NB
16.long func@IMGREL
17
18// IMAGE_REL_ARM64_ADDR64
19.globl struc
20struc:
21  .quad arr
22
23// IMAGE_REL_ARM64_BRANCH26
24b target
25
26// IMAGE_REL_ARM64_PAGEBASE_REL21
27adrp x0, foo
28
29// IMAGE_REL_ARM64_PAGEOFFSET_12A
30add x0, x0, :lo12:foo
31
32// IMAGE_REL_ARM64_PAGEOFFSET_12L
33ldr x0, [x0, :lo12:foo]
34
35// IMAGE_REL_ARM64_PAGEBASE_REL21, even if the symbol offset is known
36adrp x0, bar
37bar:
38
39// IMAGE_REL_ARM64_SECREL
40.secrel32 .Linfo_bar
41.Linfo_bar:
42
43// IMAGE_REL_ARM64_SECTION
44.secidx func
45
46.align 2
47adrp x0, baz + 0x12345
48baz:
49add x0, x0, :lo12:foo + 0x12345
50ldrb w0, [x0, :lo12:foo + 0x12345]
51ldr x0, [x0, :lo12:foo + 0x12348]
52
53// IMAGE_REL_ARM64_SECREL_LOW12A
54add x0, x0, :secrel_lo12:foo
55// IMAGE_REL_ARM64_SECREL_HIGH12A
56add x0, x0, :secrel_hi12:foo
57// IMAGE_REL_ARM64_SECREL_LOW12L
58ldr x0, [x0, :secrel_lo12:foo]
59
60// IMAGE_REL_ARM64_REL21
61adr x0, foo + 0x12345
62
63// IMAGE_REL_ARM64_BRANCH19
64bne target
65
66// IMAGE_REL_ARM64_BRANCH14
67tbz x0, #0, target
68
69.section .rdata, "dr"
70.Ltable:
71.word .Linfo_bar - .Ltable
72.word .Linfo_foo - .Ltable
73
74// As an extension, we allow 64-bit label differences. They lower to
75// IMAGE_REL_ARM64_REL32 because IMAGE_REL_ARM64_REL64 does not exist.
76.xword .Linfo_foo - .Ltable
77
78// CHECK-ARM64: Format: COFF-ARM64
79// CHECK-ARM64EC: Format: COFF-ARM64EC
80// CHECK-ARM64: Arch: aarch64
81// CHECK-ARM64EC: Arch: aarch64
82// CHECK: AddressSize: 64bit
83// CHECK: Relocations [
84// CHECK:   Section (1) .text {
85// CHECK: 0x4 IMAGE_REL_ARM64_ADDR32 foo
86// CHECK: 0x8 IMAGE_REL_ARM64_ADDR32NB func
87// CHECK: 0xC IMAGE_REL_ARM64_ADDR64 arr
88// CHECK: 0x14 IMAGE_REL_ARM64_BRANCH26 target
89// CHECK: 0x18 IMAGE_REL_ARM64_PAGEBASE_REL21 foo
90// CHECK: 0x1C IMAGE_REL_ARM64_PAGEOFFSET_12A foo
91// CHECK: 0x20 IMAGE_REL_ARM64_PAGEOFFSET_12L foo
92// CHECK: 0x24 IMAGE_REL_ARM64_PAGEBASE_REL21 bar
93// CHECK: 0x28 IMAGE_REL_ARM64_SECREL .text
94// CHECK: 0x2C IMAGE_REL_ARM64_SECTION func
95// CHECK: 0x30 IMAGE_REL_ARM64_PAGEBASE_REL21 baz
96// CHECK: 0x34 IMAGE_REL_ARM64_PAGEOFFSET_12A foo
97// CHECK: 0x38 IMAGE_REL_ARM64_PAGEOFFSET_12L foo
98// CHECK: 0x3C IMAGE_REL_ARM64_PAGEOFFSET_12L foo
99// CHECK: 0x40 IMAGE_REL_ARM64_SECREL_LOW12A foo
100// CHECK: 0x44 IMAGE_REL_ARM64_SECREL_HIGH12A foo
101// CHECK: 0x48 IMAGE_REL_ARM64_SECREL_LOW12L foo
102// CHECK: 0x4C IMAGE_REL_ARM64_REL21 foo
103// CHECK: 0x50 IMAGE_REL_ARM64_BRANCH19 target
104// CHECK: 0x54 IMAGE_REL_ARM64_BRANCH14 target
105// CHECK:   }
106// CHECK:   Section (4) .rdata {
107// CHECK: 0x0 IMAGE_REL_ARM64_REL32 .text
108// CHECK: 0x4 IMAGE_REL_ARM64_REL32 .text
109// CHECK: 0x8 IMAGE_REL_ARM64_REL32 .text
110// CHECK:   }
111// CHECK: ]
112
113// DISASM: 30:       b0091a20     adrp    x0, 0x12345000
114// DISASM: 34:       910d1400     add     x0, x0, #837
115// DISASM: 38:       394d1400     ldrb    w0, [x0, #837]
116// DISASM: 3c:       f941a400     ldr     x0, [x0, #840]
117// DISASM: 40:       91000000     add     x0, x0, #0
118// DISASM: 44:       91400000     add     x0, x0, #0, lsl #12
119// DISASM: 48:       f9400000     ldr     x0, [x0]
120// DISASM: 4c:       30091a20     adr     x0, 0x12391
121
122// DATA: Contents of section .rdata:
123// DATA-NEXT:  0000 30000000 08000000
124