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