1REQUIRES: aarch64, x86 2RUN: split-file %s %t.dir && cd %t.dir 3 4RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data.s -o arm64ec-data.obj 5RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj 6RUN: llvm-mc -filetype=obj -triple=arm64ec-windows antidep-func.s -o antidep-func.obj 7RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data-sym.s -o arm64ec-data-sym.obj 8RUN: llvm-mc -filetype=obj -triple=x86_64-windows x86_64-func.s -o x86_64-func.obj 9RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj 10 11RUN: lld-link -out:exports.dll -machine:arm64ec arm64ec-func.obj x86_64-func.obj loadconfig-arm64ec.obj \ 12RUN: arm64ec-data.obj -dll -noentry -export:arm64ec_func -export:func=arm64ec_func \ 13RUN: -export:x86_64_func -export:data_sym,DATA 14 15RUN: llvm-objdump -d exports.dll | FileCheck -check-prefix=EXP-DISASM %s 16EXP-DISASM: Disassembly of section .text: 17EXP-DISASM-EMPTY: 18EXP-DISASM-NEXT: 0000000180001000 <.text>: 19EXP-DISASM-NEXT: 180001000: 90000008 adrp x8, 0x180001000 <.text> 20EXP-DISASM-NEXT: 180001004: 52800040 mov w0, #0x2 21EXP-DISASM-NEXT: 180001008: d65f03c0 ret 22EXP-DISASM-NEXT: ... 23EXP-DISASM-EMPTY: 24EXP-DISASM-NEXT: 0000000180002000 <x86_64_func>: 25EXP-DISASM-NEXT: 180002000: e8 fb ef ff ff callq 0x180001000 <.text> 26EXP-DISASM-NEXT: 180002005: b8 03 00 00 00 movl $0x3, %eax 27EXP-DISASM-NEXT: 18000200a: c3 retq 28EXP-DISASM-EMPTY: 29EXP-DISASM-NEXT: Disassembly of section .hexpthk: 30EXP-DISASM-EMPTY: 31EXP-DISASM-NEXT: 0000000180003000 <func>: 32EXP-DISASM-NEXT: 180003000: 48 8b c4 movq %rsp, %rax 33EXP-DISASM-NEXT: 180003003: 48 89 58 20 movq %rbx, 0x20(%rax) 34EXP-DISASM-NEXT: 180003007: 55 pushq %rbp 35EXP-DISASM-NEXT: 180003008: 5d popq %rbp 36EXP-DISASM-NEXT: 180003009: e9 f2 df ff ff jmp 0x180001000 <.text> 37EXP-DISASM-NEXT: 18000300e: cc int3 38EXP-DISASM-NEXT: 18000300f: cc int3 39EXP-DISASM-EMPTY: 40EXP-DISASM-NEXT: 0000000180003010 <arm64ec_func>: 41EXP-DISASM-NEXT: 180003010: 48 8b c4 movq %rsp, %rax 42EXP-DISASM-NEXT: 180003013: 48 89 58 20 movq %rbx, 0x20(%rax) 43EXP-DISASM-NEXT: 180003017: 55 pushq %rbp 44EXP-DISASM-NEXT: 180003018: 5d popq %rbp 45EXP-DISASM-NEXT: 180003019: e9 e2 df ff ff jmp 0x180001000 <.text> 46EXP-DISASM-NEXT: 18000301e: cc int3 47EXP-DISASM-NEXT: 18000301f: cc int3 48 49RUN: llvm-objdump -p exports.dll | FileCheck -check-prefix=EXP-EXPORT %s 50EXP-EXPORT: Ordinal RVA Name 51EXP-EXPORT-NEXT: 1 0x3010 arm64ec_func 52EXP-EXPORT-NEXT: 2 0x7000 data_sym 53EXP-EXPORT-NEXT: 3 0x3000 func 54EXP-EXPORT-NEXT: 4 0x2000 x86_64_func 55 56RUN: llvm-readobj --coff-load-config exports.dll | FileCheck -check-prefix=EXP-CHPE %s 57EXP-CHPE: CodeMap [ 58EXP-CHPE-NEXT: 0x1000 - 0x100C ARM64EC 59EXP-CHPE-NEXT: 0x2000 - 0x3020 X64 60EXP-CHPE-NEXT: ] 61EXP-CHPE-NEXT: CodeRangesToEntryPoints [ 62EXP-CHPE-NEXT: 0x3000 - 0x3010 -> 0x3000 63EXP-CHPE-NEXT: 0x3010 - 0x3020 -> 0x3010 64EXP-CHPE-NEXT: ] 65EXP-CHPE-NEXT: RedirectionMetadata [ 66EXP-CHPE-NEXT: 0x3000 -> 0x1000 67EXP-CHPE-NEXT: 0x3010 -> 0x1000 68EXP-CHPE-NEXT: ] 69 70RUN: llvm-readobj --sections exports.dll | FileCheck --check-prefix=A64XRM %s 71 72A64XRM: Name: .a64xrm (2E 61 36 34 78 72 6D 00) 73A64XRM-NEXT: VirtualSize: 0x18 74A64XRM-NEXT: VirtualAddress: 0x6000 75A64XRM-NEXT: RawDataSize: 512 76A64XRM-NEXT: PointerToRawData: 77A64XRM-NEXT: PointerToRelocations: 0x0 78A64XRM-NEXT: PointerToLineNumbers: 0x0 79A64XRM-NEXT: RelocationCount: 0 80A64XRM-NEXT: LineNumberCount: 0 81A64XRM-NEXT: Characteristics [ (0x40000040) 82A64XRM-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40) 83A64XRM-NEXT: IMAGE_SCN_MEM_READ (0x40000000) 84A64XRM-NEXT: ] 85 86RUN: llvm-readobj --hex-dump=.a64xrm exports.dll | FileCheck --check-prefix=A64XRM-DUMP %s 87 88A64XRM-DUMP: 0x180006000 00300000 00100000 10300000 00100000 89A64XRM-DUMP-NEXT: 0x180006010 00000000 00000000 90 91RUN: llvm-objdump -s --section=.test exports.dll | FileCheck --check-prefix=EXP-DATA %s 92EXP-DATA: 180007000 00300000 10300000 93 94RUN: lld-link -out:exports2.dll -machine:arm64ec antidep-func.obj x86_64-func.obj loadconfig-arm64ec.obj \ 95RUN: arm64ec-data.obj -dll -noentry -export:arm64ec_func -export:func=arm64ec_func \ 96RUN: -export:x86_64_func -export:data_sym,DATA 97 98RUN: llvm-objdump -d exports2.dll | FileCheck -check-prefix=EXP-DISASM %s 99RUN: llvm-objdump -p exports2.dll | FileCheck -check-prefix=EXP-EXPORT %s 100RUN: llvm-objdump -s --section=.test exports2.dll | FileCheck --check-prefix=EXP-DATA %s 101RUN: llvm-readobj --coff-load-config exports2.dll | FileCheck -check-prefix=EXP-CHPE %s 102 103RUN: lld-link -out:entry.dll -machine:arm64ec arm64ec-func.obj loadconfig-arm64ec.obj -dll -entry:arm64ec_func 104 105RUN: llvm-objdump -d entry.dll | FileCheck -check-prefix=ENTRY-DISASM %s 106ENTRY-DISASM: Disassembly of section .text: 107ENTRY-DISASM-EMPTY: 108ENTRY-DISASM-NEXT: 0000000180001000 <.text>: 109ENTRY-DISASM-NEXT: 180001000: 90000008 adrp x8, 0x180001000 <.text> 110ENTRY-DISASM-NEXT: 180001004: 52800040 mov w0, #0x2 // =2 111ENTRY-DISASM-NEXT: 180001008: d65f03c0 ret 112ENTRY-DISASM-EMPTY: 113ENTRY-DISASM-NEXT: Disassembly of section .hexpthk: 114ENTRY-DISASM-EMPTY: 115ENTRY-DISASM-NEXT: 0000000180002000 <.hexpthk>: 116ENTRY-DISASM-NEXT: 180002000: 48 8b c4 movq %rsp, %rax 117ENTRY-DISASM-NEXT: 180002003: 48 89 58 20 movq %rbx, 0x20(%rax) 118ENTRY-DISASM-NEXT: 180002007: 55 pushq %rbp 119ENTRY-DISASM-NEXT: 180002008: 5d popq %rbp 120ENTRY-DISASM-NEXT: 180002009: e9 f2 ef ff ff jmp 0x180001000 <.text> 121ENTRY-DISASM-NEXT: 18000200e: cc int3 122ENTRY-DISASM-NEXT: 18000200f: cc int3 123 124RUN: llvm-readobj --headers entry.dll | FileCheck -check-prefix=ENTRY %s 125ENTRY: AddressOfEntryPoint: 0x2000 126 127RUN: llvm-readobj --coff-load-config entry.dll | FileCheck -check-prefix=ENTRY-CHPE %s 128ENTRY-CHPE: CodeMap [ 129ENTRY-CHPE-NEXT: 0x1000 - 0x100C ARM64EC 130ENTRY-CHPE-NEXT: 0x2000 - 0x2010 X64 131ENTRY-CHPE-NEXT: ] 132ENTRY-CHPE-NEXT: CodeRangesToEntryPoints [ 133ENTRY-CHPE-NEXT: 0x2000 - 0x2010 -> 0x2000 134ENTRY-CHPE-NEXT: ] 135ENTRY-CHPE-NEXT: RedirectionMetadata [ 136ENTRY-CHPE-NEXT: 0x2000 -> 0x1000 137ENTRY-CHPE-NEXT: ] 138 139 140Test exporting data symbol as a function: 141 142RUN: lld-link -out:data-func.dll -machine:arm64ec arm64ec-data-sym.obj loadconfig-arm64ec.obj -dll -noentry -export:data_sym 143 144RUN: llvm-readobj --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-TEST %s 145DATAFUNC-TEST: Hex dump of section '.test': 146DATAFUNC-TEST-NEXT: 0x180004000 00000000 .... 147 148RUN: llvm-readobj --coff-exports --hex-dump=.test data-func.dll | FileCheck --check-prefix=DATAFUNC-EXP %s 149DATAFUNC-EXP: Export { 150DATAFUNC-EXP-NEXT: Ordinal: 1 151DATAFUNC-EXP-NEXT: Name: data_sym 152DATAFUNC-EXP-NEXT: RVA: 0x4000 153DATAFUNC-EXP-NEXT: } 154 155 156Test mingw-style auto-export: 157 158RUN: lld-link -out:export-all.dll -machine:arm64ec arm64ec-func.obj loadconfig-arm64ec.obj -dll -noentry -lldmingw 159RUN: llvm-objdump -d export-all.dll | FileCheck --check-prefix=EXPORT-ALL %s 160 161EXPORT-ALL: Disassembly of section .text: 162EXPORT-ALL-EMPTY: 163EXPORT-ALL-NEXT: 0000000180001000 <.text>: 164EXPORT-ALL-NEXT: 180001000: 90000008 adrp x8, 0x180001000 <.text> 165EXPORT-ALL-NEXT: 180001004: 52800040 mov w0, #0x2 // =2 166EXPORT-ALL-NEXT: 180001008: d65f03c0 ret 167EXPORT-ALL-EMPTY: 168EXPORT-ALL-NEXT: Disassembly of section .hexpthk: 169EXPORT-ALL-EMPTY: 170EXPORT-ALL-NEXT: 0000000180002000 <arm64ec_func>: 171EXPORT-ALL-NEXT: 180002000: 48 8b c4 movq %rsp, %rax 172EXPORT-ALL-NEXT: 180002003: 48 89 58 20 movq %rbx, 0x20(%rax) 173EXPORT-ALL-NEXT: 180002007: 55 pushq %rbp 174EXPORT-ALL-NEXT: 180002008: 5d popq %rbp 175EXPORT-ALL-NEXT: 180002009: e9 f2 ef ff ff jmp 0x180001000 <.text> 176EXPORT-ALL-NEXT: 18000200e: cc int3 177EXPORT-ALL-NEXT: 18000200f: cc int3 178 179 180#--- arm64ec-func.s 181 .text 182 .globl arm64ec_func 183 .p2align 2, 0x0 184arm64ec_func: 185 adrp x8,arm64ec_func 186 mov w0, #2 187 ret 188 189#--- antidep-func.s 190 .text 191 .globl "#arm64ec_func" 192 .p2align 2, 0x0 193"#arm64ec_func": 194 adrp x8,arm64ec_func 195 mov w0, #2 196 ret 197 198 .weak_anti_dep arm64ec_func 199arm64ec_func = "#arm64ec_func" 200 201#--- arm64ec-data.s 202 .section .test, "r" 203 .globl data_sym 204 .p2align 2, 0x0 205data_sym: 206 .rva "EXP+#func" 207 .rva "EXP+#arm64ec_func" 208 209#--- x86_64-func.s 210 .text 211 .globl x86_64_func 212 .p2align 2, 0x0 213x86_64_func: 214 call arm64ec_func 215 movl $3, %eax 216 retq 217 218#--- arm64ec-data-sym.s 219 .section .test, "r" 220 .globl data_sym 221 .p2align 2, 0x0 222data_sym: 223 .word 0 224