1REQUIRES: aarch64, x86 2RUN: split-file %s %t.dir && cd %t.dir 3 4RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj 5RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-func.s -o arm64-func.obj 6RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func-drectve.s -o arm64ec-drectve.obj 7RUN: llvm-mc -filetype=obj -triple=aarch64-windows func-drectve.s -o arm64-drectve.obj 8RUN: llvm-mc -filetype=obj -triple=aarch64-windows edata.s -o arm64-edata.obj 9RUN: llvm-mc -filetype=obj -triple=arm64ec-windows edata.s -o arm64ec-edata.obj 10RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj 11RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj 12 13 14# A command-line export applies only to EC exports. 15 16RUN: lld-link -machine:arm64x -dll -out:out-cmd.dll arm64ec-func.obj arm64-func.obj \ 17RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -noentry -export:func 18 19RUN: llvm-objdump -d out-cmd.dll | FileCheck --check-prefix=DISASM-EC %s 20DISASM-EC: Disassembly of section .text: 21DISASM-EC-EMPTY: 22DISASM-EC-NEXT: 0000000180001000 <.text>: 23DISASM-EC-NEXT: 180001000: 52800040 mov w0, #0x2 // =2 24DISASM-EC-NEXT: 180001004: d65f03c0 ret 25DISASM-EC-EMPTY: 26DISASM-EC-NEXT: Disassembly of section .hexpthk: 27DISASM-EC-EMPTY: 28DISASM-EC-NEXT: 0000000180002000 <.hexpthk>: 29DISASM-EC-NEXT: 180002000: 48 8b c4 movq %rsp, %rax 30DISASM-EC-NEXT: 180002003: 48 89 58 20 movq %rbx, 0x20(%rax) 31DISASM-EC-NEXT: 180002007: 55 pushq %rbp 32DISASM-EC-NEXT: 180002008: 5d popq %rbp 33DISASM-EC-NEXT: 180002009: e9 f2 ef ff ff jmp 0x180001000 <.text> 34DISASM-EC-NEXT: 18000200e: cc int3 35DISASM-EC-NEXT: 18000200f: cc int3 36 37RUN: llvm-readobj --headers --coff-exports out-cmd.dll | FileCheck --check-prefix=EXPORTS-EC %s 38EXPORTS-EC: ExportTableRVA: 0x0 39EXPORTS-EC-NEXT: ExportTableSize: 0x0 40EXPORTS-EC-NOT: Name: func 41EXPORTS-EC: HybridObject { 42EXPORTS-EC: ExportTableRVA: 0x3{{.*}} 43EXPORTS-EC-NEXT: ExportTableSize: 0x4{{.*}} 44EXPORTS-EC: Export { 45EXPORTS-EC-NEXT: Ordinal: 1 46EXPORTS-EC-NEXT: Name: func 47EXPORTS-EC-NEXT: RVA: 0x2000 48EXPORTS-EC-NEXT: } 49EXPORTS-EC-NEXT: } 50 51RUN: llvm-readobj out-cmd.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s 52IMPLIB-HEADER: File: out-{{.*}}.lib(out{{.*}}.dll) 53IMPLIB-HEADER-NEXT: Format: COFF-ARM64 54IMPLIB-HEADER-NEXT: Arch: aarch64 55IMPLIB-HEADER-NEXT: AddressSize: 64bit 56IMPLIB-HEADER-EMPTY: 57IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll) 58IMPLIB-HEADER-NEXT: Format: COFF-ARM64 59IMPLIB-HEADER-NEXT: Arch: aarch64 60IMPLIB-HEADER-NEXT: AddressSize: 64bit 61IMPLIB-HEADER-EMPTY: 62IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll) 63IMPLIB-HEADER-NEXT: Format: COFF-ARM64 64IMPLIB-HEADER-NEXT: Arch: aarch64 65IMPLIB-HEADER-NEXT: AddressSize: 64bit 66IMPLIB-HEADER-EMPTY: 67IMPLIB-EC: File: out{{.*}}.dll 68IMPLIB-EC-NEXT: Format: COFF-import-file-ARM64EC 69IMPLIB-EC-NEXT: Type: code 70IMPLIB-EC-NEXT: Name type: export as 71IMPLIB-EC-NEXT: Export name: func 72IMPLIB-EC-NEXT: Symbol: __imp_func 73IMPLIB-EC-NEXT: Symbol: func 74IMPLIB-EC-NEXT: Symbol: __imp_aux_func 75IMPLIB-EC-NEXT: Symbol: #func 76 77 78# Export using the EC .drectve section. 79 80RUN: lld-link -machine:arm64x -dll -out:out-drectve-ec.dll arm64ec-func.obj arm64-func.obj \ 81RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-drectve.obj -noentry 82RUN: llvm-objdump -d out-drectve-ec.dll | FileCheck --check-prefix=DISASM-EC %s 83RUN: llvm-readobj --headers --coff-exports out-drectve-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s 84RUN: llvm-readobj out-drectve-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s 85 86# A command-line def file applies only to EC exports. 87 88RUN: lld-link -machine:arm64x -dll -out:out-def-ec.dll arm64ec-func.obj arm64-func.obj \ 89RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -noentry 90RUN: llvm-objdump -d out-def-ec.dll | FileCheck --check-prefix=DISASM-EC %s 91RUN: llvm-readobj --headers --coff-exports out-def-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s 92RUN: llvm-readobj out-def-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s 93 94# Export using the EC .edata section. 95 96RUN: lld-link -machine:arm64x -dll -out:out-edata-ec.dll arm64ec-func.obj arm64-func.obj \ 97RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-edata.obj -noentry 98 99RUN: llvm-objdump -d out-edata-ec.dll | FileCheck --check-prefix=DISASM-EDATA-EC %s 100DISASM-EDATA-EC: 0000000180001000 <.text>: 101DISASM-EDATA-EC-NEXT: 180001000: 52800040 mov w0, #0x2 // =2 102DISASM-EDATA-EC-NEXT: 180001004: d65f03c0 ret 103 104RUN: llvm-readobj --headers --coff-exports out-edata-ec.dll | FileCheck --check-prefix=EXPORTS-EDATA-EC %s 105EXPORTS-EDATA-EC: ExportTableRVA: 0x0 106EXPORTS-EDATA-EC-NEXT: ExportTableSize: 0x0 107EXPORTS-EDATA-EC-NOT: Name: func 108EXPORTS-EDATA-EC: HybridObject { 109EXPORTS-EDATA-EC: ExportTableRVA: 0x2{{.*}} 110EXPORTS-EDATA-EC-NEXT: ExportTableSize: 0x4{{.*}} 111EXPORTS-EDATA-EC: Export { 112EXPORTS-EDATA-EC-NEXT: Ordinal: 1 113EXPORTS-EDATA-EC-NEXT: Name: func 114EXPORTS-EDATA-EC-NEXT: RVA: 0x1000 115EXPORTS-EDATA-EC-NEXT: } 116EXPORTS-EDATA-EC-NEXT: } 117 118# Export using the native .drectve section. 119 120RUN: lld-link -machine:arm64x -dll -out:out-drectve-native.dll arm64ec-func.obj arm64-func.obj \ 121RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj -noentry 122 123RUN: llvm-objdump -d out-drectve-native.dll | FileCheck --check-prefix=DISASM-NATIVE %s 124DISASM-NATIVE: Disassembly of section .text: 125DISASM-NATIVE-EMPTY: 126DISASM-NATIVE-NEXT: 0000000180001000 <func>: 127DISASM-NATIVE-NEXT: 180001000: 52800020 mov w0, #0x1 // =1 128DISASM-NATIVE-NEXT: 180001004: d65f03c0 ret 129 130RUN: llvm-readobj --headers --coff-exports out-drectve-native.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s 131EXPORTS-NATIVE: ExportTableRVA: 0x2{{.*}} 132EXPORTS-NATIVE-NEXT: ExportTableSize: 0x4{{.*}} 133EXPORTS-NATIVE: Export { 134EXPORTS-NATIVE-NEXT: Ordinal: 1 135EXPORTS-NATIVE-NEXT: Name: func 136EXPORTS-NATIVE-NEXT: RVA: 0x1000 137EXPORTS-NATIVE-NEXT: } 138EXPORTS-NATIVE: HybridObject { 139EXPORTS-NATIVE: ExportTableRVA: 0x0 140EXPORTS-NATIVE-NEXT: ExportTableSize: 0x0 141EXPORTS-NATIVE-NOT: Name: func 142 143RUN: llvm-readobj out-drectve-native.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-NATIVE %s 144IMPLIB-NATIVE: File: out{{.*}}.dll 145IMPLIB-NATIVE-NEXT: Format: COFF-import-file-ARM64 146IMPLIB-NATIVE-NEXT: Type: code 147IMPLIB-NATIVE-NEXT: Name type: name 148IMPLIB-NATIVE-NEXT: Export name: func 149IMPLIB-NATIVE-NEXT: Symbol: __imp_func 150IMPLIB-NATIVE-NEXT: Symbol: func 151 152# Export using the native .edata section. 153 154RUN: lld-link -machine:arm64x -dll -out:out-edata.dll arm64ec-func.obj arm64-func.obj \ 155RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj -noentry 156RUN: llvm-objdump -d out-edata.dll | FileCheck --check-prefix=DISASM-NATIVE %s 157RUN: llvm-readobj --headers --coff-exports out-edata.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s 158 159# Export using both the native and EC .drectve sections. 160 161RUN: lld-link -machine:arm64x -dll -out:out-both.dll arm64ec-func.obj arm64-func.obj \ 162RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj arm64ec-drectve.obj -noentry 163 164RUN: llvm-objdump -d out-both.dll | FileCheck --check-prefix=DISASM-BOTH %s 165DISASM-BOTH: Disassembly of section .text: 166DISASM-BOTH-EMPTY: 167DISASM-BOTH-NEXT: 0000000180001000 <func>: 168DISASM-BOTH-NEXT: 180001000: 52800020 mov w0, #0x1 // =1 169DISASM-BOTH-NEXT: 180001004: d65f03c0 ret 170DISASM-BOTH-NEXT: ... 171DISASM-BOTH-NEXT: 180002000: 52800040 mov w0, #0x2 // =2 172DISASM-BOTH-NEXT: 180002004: d65f03c0 ret 173DISASM-BOTH-EMPTY: 174DISASM-BOTH-NEXT: Disassembly of section .hexpthk: 175DISASM-BOTH-EMPTY: 176DISASM-BOTH-NEXT: 0000000180003000 <.hexpthk>: 177DISASM-BOTH-NEXT: 180003000: 48 8b c4 movq %rsp, %rax 178DISASM-BOTH-NEXT: 180003003: 48 89 58 20 movq %rbx, 0x20(%rax) 179DISASM-BOTH-NEXT: 180003007: 55 pushq %rbp 180DISASM-BOTH-NEXT: 180003008: 5d popq %rbp 181DISASM-BOTH-NEXT: 180003009: e9 f2 ef ff ff jmp 0x180002000 <func+0x1000> 182DISASM-BOTH-NEXT: 18000300e: cc int3 183DISASM-BOTH-NEXT: 18000300f: cc int3 184 185RUN: llvm-readobj --headers --coff-exports out-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s 186EXPORTS-BOTH: ExportTableRVA: 0x4{{.*}} 187EXPORTS-BOTH-NEXT: ExportTableSize: 0x4{{.*}} 188EXPORTS-BOTH: Export { 189EXPORTS-BOTH-NEXT: Ordinal: 1 190EXPORTS-BOTH-NEXT: Name: func 191EXPORTS-BOTH-NEXT: RVA: 0x1000 192EXPORTS-BOTH-NEXT: } 193EXPORTS-BOTH: HybridObject { 194EXPORTS-BOTH: ExportTableRVA: 0x4{{.*}} 195EXPORTS-BOTH-NEXT: ExportTableSize: 0x4{{.*}} 196EXPORTS-BOTH: Export { 197EXPORTS-BOTH-NEXT: Ordinal: 1 198EXPORTS-BOTH-NEXT: Name: func 199EXPORTS-BOTH-NEXT: RVA: 0x3000 200EXPORTS-BOTH-NEXT: } 201EXPORTS-BOTH-NEXT: } 202 203RUN: llvm-readobj out-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s 204 205# Export using both the -def and -defarm64native arguments. 206 207RUN: lld-link -machine:arm64x -dll -out:out-def-both.dll arm64ec-func.obj arm64-func.obj \ 208RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -defarm64native:func.def -noentry 209RUN: llvm-objdump -d out-def-both.dll | FileCheck --check-prefix=DISASM-BOTH %s 210RUN: llvm-readobj --headers --coff-exports out-def-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s 211RUN: llvm-readobj out-def-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s 212 213# -defarm64native is ignored if -def is not specified. 214 215RUN: lld-link -machine:arm64x -dll -out:out-def-native.dll arm64ec-func.obj arm64-func.obj \ 216RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -defarm64native:func.def -noentry 217RUN: llvm-readobj --headers --coff-exports out-def-native.dll | FileCheck --check-prefix=NO-EXPORT %s 218NO-EXPORT: ExportTableRVA: 0x0 219NO-EXPORT: ExportTableSize: 0x0 220NO-EXPORT: HybridObject { 221NO-EXPORT: ExportTableRVA: 0x0 222NO-EXPORT: ExportTableSize: 0x0 223NO-EXPORT: } 224 225# -defarm64native is ignored on ARM64 target. 226 227RUN: lld-link -machine:arm64 -dll -out:out-arm64-def.dll arm64-func.obj -defarm64native:invalid.def -def:func.def -noentry 2>&1 | count 0 228 229# Export using both the native and EC .edata sections. 230 231RUN: lld-link -machine:arm64x -dll -out:out-edata-both.dll arm64ec-func.obj arm64-func.obj \ 232RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj arm64ec-edata.obj -noentry 233RUN: llvm-readobj --headers --coff-exports out-edata-both.dll | FileCheck --check-prefix=EXPORTS-EDATA-BOTH %s 234EXPORTS-EDATA-BOTH: ExportTableRVA: 0x3{{.*}} 235EXPORTS-EDATA-BOTH-NEXT: ExportTableSize: 0x4{{.*}} 236EXPORTS-EDATA-BOTH: Export { 237EXPORTS-EDATA-BOTH-NEXT: Ordinal: 1 238EXPORTS-EDATA-BOTH-NEXT: Name: func 239EXPORTS-EDATA-BOTH-NEXT: RVA: 0x1000 240EXPORTS-EDATA-BOTH-NEXT: } 241EXPORTS-EDATA-BOTH: HybridObject { 242EXPORTS-EDATA-BOTH: ExportTableRVA: 0x3{{.*}} 243EXPORTS-EDATA-BOTH-NEXT: ExportTableSize: 0x4{{.*}} 244EXPORTS-EDATA-BOTH: Export { 245EXPORTS-EDATA-BOTH-NEXT: Ordinal: 1 246EXPORTS-EDATA-BOTH-NEXT: Name: func 247EXPORTS-EDATA-BOTH-NEXT: RVA: 0x2000 248EXPORTS-EDATA-BOTH-NEXT: } 249EXPORTS-EDATA-BOTH-NEXT: } 250 251#--- arm64-func.s 252 .section .text,"xr",discard,func 253 .globl func 254 .p2align 2 255func: 256 mov w0, #1 257 ret 258 259#--- arm64ec-func.s 260 .section .text,"xr",discard,func 261 .globl func 262 .p2align 2 263func: 264 mov w0, #2 265 ret 266 267#--- func-drectve.s 268.section .drectve 269 .ascii "-export:func" 270 271#--- edata.s 272 .section .edata, "dr" 273 .align 4 274exports: 275 .long 0 // ExportFlags 276 .long 0 // TimeDateStamp 277 .long 0 // MajorVersion + MinorVersion 278 .rva name // NameRVA 279 .long 1 // OrdinalBase 280 .long 1 // AddressTableEntries 281 .long 1 // NumberOfNamePointers 282 .rva functions // ExportAddressTableRVA 283 .rva names // NamePointerRVA 284 .rva nameordinals // OrdinalTableRVA 285 286names: 287 .rva funcname_func 288 289nameordinals: 290 .short 0 291 292functions: 293 .rva func 294 .long 0 295 296funcname_func: 297 .asciz "func" 298 299name: 300 .asciz "out-edata.dll" 301 302#--- func.def 303LIBRARY out.dll 304EXPORTS 305 func 306