mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 03:16:37 +00:00
310 lines
12 KiB
Plaintext
310 lines
12 KiB
Plaintext
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 <func>:
|
|
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 <func>:
|
|
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 <func+0x1000>
|
|
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
|