REQUIRES: aarch64, x86 RUN: split-file %s %t.dir && cd %t.dir RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-func.s -o arm64-func.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func-drectve.s -o arm64ec-drectve.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows func-drectve.s -o arm64-drectve.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows edata.s -o arm64-edata.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows edata.s -o arm64ec-edata.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj # A command-line export applies only to EC exports. RUN: lld-link -machine:arm64x -dll -out:out-cmd.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -noentry -export:func -output-def:out.def RUN: llvm-objdump -d out-cmd.dll | FileCheck --check-prefix=DISASM-EC %s DISASM-EC: Disassembly of section .text: DISASM-EC-EMPTY: DISASM-EC-NEXT: 0000000180001000 <.text>: DISASM-EC-NEXT: 180001000: 52800040 mov w0, #0x2 // =2 DISASM-EC-NEXT: 180001004: d65f03c0 ret DISASM-EC-EMPTY: DISASM-EC-NEXT: Disassembly of section .hexpthk: DISASM-EC-EMPTY: DISASM-EC-NEXT: 0000000180002000 <.hexpthk>: DISASM-EC-NEXT: 180002000: 48 8b c4 movq %rsp, %rax DISASM-EC-NEXT: 180002003: 48 89 58 20 movq %rbx, 0x20(%rax) DISASM-EC-NEXT: 180002007: 55 pushq %rbp DISASM-EC-NEXT: 180002008: 5d popq %rbp DISASM-EC-NEXT: 180002009: e9 f2 ef ff ff jmp 0x180001000 <.text> DISASM-EC-NEXT: 18000200e: cc int3 DISASM-EC-NEXT: 18000200f: cc int3 RUN: llvm-readobj --headers --coff-exports out-cmd.dll | FileCheck --check-prefix=EXPORTS-EC %s EXPORTS-EC: ExportTableRVA: 0x0 EXPORTS-EC-NEXT: ExportTableSize: 0x0 EXPORTS-EC-NOT: Name: func EXPORTS-EC: HybridObject { EXPORTS-EC: ExportTableRVA: 0x3{{.*}} EXPORTS-EC-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-EC: Export { EXPORTS-EC-NEXT: Ordinal: 1 EXPORTS-EC-NEXT: Name: func EXPORTS-EC-NEXT: RVA: 0x2000 EXPORTS-EC-NEXT: } EXPORTS-EC-NEXT: } RUN: llvm-readobj out-cmd.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s IMPLIB-HEADER: File: out-{{.*}}.lib(out{{.*}}.dll) IMPLIB-HEADER-NEXT: Format: COFF-ARM64 IMPLIB-HEADER-NEXT: Arch: aarch64 IMPLIB-HEADER-NEXT: AddressSize: 64bit IMPLIB-HEADER-EMPTY: IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll) IMPLIB-HEADER-NEXT: Format: COFF-ARM64 IMPLIB-HEADER-NEXT: Arch: aarch64 IMPLIB-HEADER-NEXT: AddressSize: 64bit IMPLIB-HEADER-EMPTY: IMPLIB-HEADER-NEXT: File: out-{{.*}}.lib(out{{.*}}.dll) IMPLIB-HEADER-NEXT: Format: COFF-ARM64 IMPLIB-HEADER-NEXT: Arch: aarch64 IMPLIB-HEADER-NEXT: AddressSize: 64bit IMPLIB-HEADER-EMPTY: IMPLIB-EC: File: out{{.*}}.dll IMPLIB-EC-NEXT: Format: COFF-import-file-ARM64EC IMPLIB-EC-NEXT: Type: code IMPLIB-EC-NEXT: Name type: export as IMPLIB-EC-NEXT: Export name: func IMPLIB-EC-NEXT: Symbol: __imp_func IMPLIB-EC-NEXT: Symbol: func IMPLIB-EC-NEXT: Symbol: __imp_aux_func IMPLIB-EC-NEXT: Symbol: #func RUN: FileCheck --check-prefix=OUT-DEF %s < out.def OUT-DEF: EXPORTS OUT-DEF-NEXT: func @1 # Export using the EC .drectve section. RUN: lld-link -machine:arm64x -dll -out:out-drectve-ec.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-drectve.obj -noentry RUN: llvm-objdump -d out-drectve-ec.dll | FileCheck --check-prefix=DISASM-EC %s RUN: llvm-readobj --headers --coff-exports out-drectve-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s RUN: llvm-readobj out-drectve-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s # A command-line def file applies only to EC exports. RUN: lld-link -machine:arm64x -dll -out:out-def-ec.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -noentry RUN: llvm-objdump -d out-def-ec.dll | FileCheck --check-prefix=DISASM-EC %s RUN: llvm-readobj --headers --coff-exports out-def-ec.dll | FileCheck --check-prefix=EXPORTS-EC %s RUN: llvm-readobj out-def-ec.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC %s # Export using the EC .edata section. RUN: lld-link -machine:arm64x -dll -out:out-edata-ec.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64ec-edata.obj -noentry RUN: llvm-objdump -d out-edata-ec.dll | FileCheck --check-prefix=DISASM-EDATA-EC %s DISASM-EDATA-EC: 0000000180001000 <.text>: DISASM-EDATA-EC-NEXT: 180001000: 52800040 mov w0, #0x2 // =2 DISASM-EDATA-EC-NEXT: 180001004: d65f03c0 ret RUN: llvm-readobj --headers --coff-exports out-edata-ec.dll | FileCheck --check-prefix=EXPORTS-EDATA-EC %s EXPORTS-EDATA-EC: ExportTableRVA: 0x0 EXPORTS-EDATA-EC-NEXT: ExportTableSize: 0x0 EXPORTS-EDATA-EC-NOT: Name: func EXPORTS-EDATA-EC: HybridObject { EXPORTS-EDATA-EC: ExportTableRVA: 0x2{{.*}} EXPORTS-EDATA-EC-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-EDATA-EC: Export { EXPORTS-EDATA-EC-NEXT: Ordinal: 1 EXPORTS-EDATA-EC-NEXT: Name: func EXPORTS-EDATA-EC-NEXT: RVA: 0x1000 EXPORTS-EDATA-EC-NEXT: } EXPORTS-EDATA-EC-NEXT: } # Export using the native .drectve section. RUN: lld-link -machine:arm64x -dll -out:out-drectve-native.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj -noentry RUN: llvm-objdump -d out-drectve-native.dll | FileCheck --check-prefix=DISASM-NATIVE %s DISASM-NATIVE: Disassembly of section .text: DISASM-NATIVE-EMPTY: DISASM-NATIVE-NEXT: 0000000180001000 : DISASM-NATIVE-NEXT: 180001000: 52800020 mov w0, #0x1 // =1 DISASM-NATIVE-NEXT: 180001004: d65f03c0 ret RUN: llvm-readobj --headers --coff-exports out-drectve-native.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s EXPORTS-NATIVE: ExportTableRVA: 0x2{{.*}} EXPORTS-NATIVE-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-NATIVE: Export { EXPORTS-NATIVE-NEXT: Ordinal: 1 EXPORTS-NATIVE-NEXT: Name: func EXPORTS-NATIVE-NEXT: RVA: 0x1000 EXPORTS-NATIVE-NEXT: } EXPORTS-NATIVE: HybridObject { EXPORTS-NATIVE: ExportTableRVA: 0x0 EXPORTS-NATIVE-NEXT: ExportTableSize: 0x0 EXPORTS-NATIVE-NOT: Name: func RUN: llvm-readobj out-drectve-native.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-NATIVE %s IMPLIB-NATIVE: File: out{{.*}}.dll IMPLIB-NATIVE-NEXT: Format: COFF-import-file-ARM64 IMPLIB-NATIVE-NEXT: Type: code IMPLIB-NATIVE-NEXT: Name type: name IMPLIB-NATIVE-NEXT: Export name: func IMPLIB-NATIVE-NEXT: Symbol: __imp_func IMPLIB-NATIVE-NEXT: Symbol: func # Export using the native .edata section. RUN: lld-link -machine:arm64x -dll -out:out-edata.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj -noentry RUN: llvm-objdump -d out-edata.dll | FileCheck --check-prefix=DISASM-NATIVE %s RUN: llvm-readobj --headers --coff-exports out-edata.dll | FileCheck --check-prefix=EXPORTS-NATIVE %s # Export using both the native and EC .drectve sections. RUN: lld-link -machine:arm64x -dll -out:out-both.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-drectve.obj arm64ec-drectve.obj -noentry RUN: llvm-objdump -d out-both.dll | FileCheck --check-prefix=DISASM-BOTH %s DISASM-BOTH: Disassembly of section .text: DISASM-BOTH-EMPTY: DISASM-BOTH-NEXT: 0000000180001000 : DISASM-BOTH-NEXT: 180001000: 52800020 mov w0, #0x1 // =1 DISASM-BOTH-NEXT: 180001004: d65f03c0 ret DISASM-BOTH-NEXT: ... DISASM-BOTH-NEXT: 180002000: 52800040 mov w0, #0x2 // =2 DISASM-BOTH-NEXT: 180002004: d65f03c0 ret DISASM-BOTH-EMPTY: DISASM-BOTH-NEXT: Disassembly of section .hexpthk: DISASM-BOTH-EMPTY: DISASM-BOTH-NEXT: 0000000180003000 <.hexpthk>: DISASM-BOTH-NEXT: 180003000: 48 8b c4 movq %rsp, %rax DISASM-BOTH-NEXT: 180003003: 48 89 58 20 movq %rbx, 0x20(%rax) DISASM-BOTH-NEXT: 180003007: 55 pushq %rbp DISASM-BOTH-NEXT: 180003008: 5d popq %rbp DISASM-BOTH-NEXT: 180003009: e9 f2 ef ff ff jmp 0x180002000 DISASM-BOTH-NEXT: 18000300e: cc int3 DISASM-BOTH-NEXT: 18000300f: cc int3 RUN: llvm-readobj --headers --coff-exports out-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s EXPORTS-BOTH: ExportTableRVA: 0x4{{.*}} EXPORTS-BOTH-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-BOTH: Export { EXPORTS-BOTH-NEXT: Ordinal: 1 EXPORTS-BOTH-NEXT: Name: func EXPORTS-BOTH-NEXT: RVA: 0x1000 EXPORTS-BOTH-NEXT: } EXPORTS-BOTH: HybridObject { EXPORTS-BOTH: ExportTableRVA: 0x4{{.*}} EXPORTS-BOTH-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-BOTH: Export { EXPORTS-BOTH-NEXT: Ordinal: 1 EXPORTS-BOTH-NEXT: Name: func EXPORTS-BOTH-NEXT: RVA: 0x3000 EXPORTS-BOTH-NEXT: } EXPORTS-BOTH-NEXT: } RUN: llvm-readobj out-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s # Export using both the -def and -defarm64native arguments. RUN: lld-link -machine:arm64x -dll -out:out-def-both.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -def:func.def -defarm64native:func.def -noentry RUN: llvm-objdump -d out-def-both.dll | FileCheck --check-prefix=DISASM-BOTH %s RUN: llvm-readobj --headers --coff-exports out-def-both.dll | FileCheck --check-prefix=EXPORTS-BOTH %s RUN: llvm-readobj out-def-both.lib | FileCheck --check-prefixes=IMPLIB-HEADER,IMPLIB-EC,IMPLIB-NATIVE %s # -defarm64native is ignored if -def is not specified. RUN: lld-link -machine:arm64x -dll -out:out-def-native.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -defarm64native:func.def -noentry RUN: llvm-readobj --headers --coff-exports out-def-native.dll | FileCheck --check-prefix=NO-EXPORT %s NO-EXPORT: ExportTableRVA: 0x0 NO-EXPORT: ExportTableSize: 0x0 NO-EXPORT: HybridObject { NO-EXPORT: ExportTableRVA: 0x0 NO-EXPORT: ExportTableSize: 0x0 NO-EXPORT: } # -defarm64native is ignored on ARM64 target. RUN: lld-link -machine:arm64 -dll -out:out-arm64-def.dll arm64-func.obj -defarm64native:invalid.def -def:func.def -noentry 2>&1 | count 0 # Export using both the native and EC .edata sections. RUN: lld-link -machine:arm64x -dll -out:out-edata-both.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj arm64-edata.obj arm64ec-edata.obj -noentry RUN: llvm-readobj --headers --coff-exports out-edata-both.dll | FileCheck --check-prefix=EXPORTS-EDATA-BOTH %s EXPORTS-EDATA-BOTH: ExportTableRVA: 0x3{{.*}} EXPORTS-EDATA-BOTH-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-EDATA-BOTH: Export { EXPORTS-EDATA-BOTH-NEXT: Ordinal: 1 EXPORTS-EDATA-BOTH-NEXT: Name: func EXPORTS-EDATA-BOTH-NEXT: RVA: 0x1000 EXPORTS-EDATA-BOTH-NEXT: } EXPORTS-EDATA-BOTH: HybridObject { EXPORTS-EDATA-BOTH: ExportTableRVA: 0x3{{.*}} EXPORTS-EDATA-BOTH-NEXT: ExportTableSize: 0x4{{.*}} EXPORTS-EDATA-BOTH: Export { EXPORTS-EDATA-BOTH-NEXT: Ordinal: 1 EXPORTS-EDATA-BOTH-NEXT: Name: func EXPORTS-EDATA-BOTH-NEXT: RVA: 0x2000 EXPORTS-EDATA-BOTH-NEXT: } EXPORTS-EDATA-BOTH-NEXT: } #--- arm64-func.s .section .text,"xr",discard,func .globl func .p2align 2 func: mov w0, #1 ret #--- arm64ec-func.s .section .text,"xr",discard,func .globl func .p2align 2 func: mov w0, #2 ret #--- func-drectve.s .section .drectve .ascii "-export:func" #--- edata.s .section .edata, "dr" .align 4 exports: .long 0 // ExportFlags .long 0 // TimeDateStamp .long 0 // MajorVersion + MinorVersion .rva name // NameRVA .long 1 // OrdinalBase .long 1 // AddressTableEntries .long 1 // NumberOfNamePointers .rva functions // ExportAddressTableRVA .rva names // NamePointerRVA .rva nameordinals // OrdinalTableRVA names: .rva funcname_func nameordinals: .short 0 functions: .rva func .long 0 funcname_func: .asciz "func" name: .asciz "out-edata.dll" #--- func.def LIBRARY out.dll EXPORTS func