Files
clang-p2996/lld/test/COFF/arm64ec-entry-mangle.test
Jacek Caban 5b0572875c [LLD][COFF] Add support for including native ARM64 objects in ARM64EC images (#137653)
MSVC linker accepts native ARM64 object files as input with
`-machine:arm64ec`, similar to `-machine:arm64x`. Its usefulness is very
limited; for example, both exports and imports are not reflected in the
PE structures and can't work. However, their symbol tables are otherwise
functional.

Since we already have handling of multiple symbol tables implemented for
ARM64X, the required changes are mostly about adjusting relevant checks
to account for them on the ARM64EC target.

Delay-load helper handling is a bit of a shortcut. The patch never pulls
it for native object files and just ensures that the code is fine with
that. In general, I think it would be nice to adjust the driver to pull
it only when it's actually referenced, which would allow applying the
same logic to the native symbol table on ARM64EC without worrying about
pulling too much.
2025-05-15 11:38:24 +02:00

139 lines
7.0 KiB
Plaintext

REQUIRES: aarch64, x86
RUN: split-file %s %t.dir && cd %t.dir
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-dll-main.s -o demangled-dll-main.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows mangled-dll-main.s -o mangled-dll-main.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-func.s -o demangled-func.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows mangled-func.s -o mangled-func.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows ref-demangled.s -o ref-demangled.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-entry-drectve.s -o demangled-entry-drectve.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows demangled-dll-main.s -o x64-dll-main.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows ref-demangled.s -o ref-x64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
RUN: llvm-lib -machine:arm64ec -out:func.lib mangled-func.obj
RUN: llvm-lib -machine:arm64ec -out:dllmain.lib mangled-dll-main.obj
Ensure that the linker recognizes the demangled version of _DllMainCRTStartup.
RUN: lld-link -machine:arm64ec -dll -out:demangled-main.dll demangled-dll-main.obj loadconfig-arm64ec.obj
RUN: llvm-objdump -d demangled-main.dll | FileCheck -check-prefix=DISASM %s
DISASM: 0000000180001000 <.text>:
DISASM-NEXT: 180001000: d65f03c0 ret
DISASM-EMPTY:
DISASM-NEXT: Disassembly of section .hexpthk:
DISASM-EMPTY:
DISASM: 180002000: 48 8b c4 movq %rsp, %rax
DISASM-NEXT: 180002003: 48 89 58 20 movq %rbx, 0x20(%rax)
DISASM-NEXT: 180002007: 55 pushq %rbp
DISASM-NEXT: 180002008: 5d popq %rbp
DISASM-NEXT: 180002009: e9 f2 ef ff ff jmp 0x180001000 <.text>
DISASM-NEXT: 18000200e: cc int3
DISASM-NEXT: 18000200f: cc int3
Ensure that the linker recognizes the mangled version of #_DllMainCRTStartup.
RUN: lld-link -machine:arm64ec -dll -out:mangled-dllmain.dll mangled-dll-main.obj loadconfig-arm64ec.obj
RUN: llvm-objdump -d mangled-dllmain.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled version of _DllMainCRTStartup from an archive.
RUN: lld-link -machine:arm64ec -dll -out:mangled-lib-dllmain.dll dllmain.lib loadconfig-arm64ec.obj
RUN: llvm-objdump -d mangled-lib-dllmain.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the demangled entry function.
RUN: lld-link -machine:arm64ec -dll -out:demangled-entry.dll demangled-func.obj loadconfig-arm64ec.obj -entry:func
RUN: llvm-objdump -d demangled-entry.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled entry function when it is referenced by its demangled name.
RUN: lld-link -machine:arm64ec -dll -out:mangled-entry.dll mangled-func.obj loadconfig-arm64ec.obj -entry:func
RUN: llvm-objdump -d mangled-entry.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled entry function when it is referenced by its demangled
name in drectve section.
RUN: lld-link -machine:arm64ec -dll -out:mangled-entry.dll mangled-func.obj loadconfig-arm64ec.obj demangled-entry-drectve.obj
RUN: llvm-objdump -d mangled-entry.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled entry function from an archive.
RUN: lld-link -machine:arm64ec -dll -out:mangled-lib-entry.dll func.lib loadconfig-arm64ec.obj -entry:func
RUN: llvm-objdump -d mangled-lib-entry.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the entry function when referenced by its mangled name.
RUN: lld-link -machine:arm64ec -dll -out:mangled-entry2.dll mangled-func.obj loadconfig-arm64ec.obj "-entry:#func"
RUN: llvm-objdump -d mangled-entry2.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the demangled exported function.
RUN: lld-link -machine:arm64ec -dll -out:demangled-export.dll demangled-func.obj \
RUN: loadconfig-arm64ec.obj -noentry -export:func
RUN: llvm-objdump -d demangled-export.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled exported function when referenced by its demangled name.
RUN: lld-link -machine:arm64ec -dll -out:mangled-export.dll mangled-func.obj \
RUN: loadconfig-arm64ec.obj -noentry -export:func
RUN: llvm-objdump -d mangled-export.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled exported function when referenced by its mangled name.
RUN: lld-link -machine:arm64ec -dll -out:mangled-export2.dll mangled-func.obj \
RUN: loadconfig-arm64ec.obj -noentry "-export:#func"
RUN: llvm-objdump -d mangled-export2.dll | FileCheck -check-prefix=DISASM %s
Verify that the linker recognizes the mangled exported function when referenced
by its mangled name and creates a demangled alias for it.
RUN: lld-link -machine:arm64ec -dll -noentry -out:demangled-export-ref.dll mangled-func.obj \
RUN: ref-demangled.obj loadconfig-arm64ec.obj "-export:#func"
RUN: llvm-objdump -d demangled-export-ref.dll | FileCheck -check-prefix=DISASM %s
Verify that an x86_64 object file can reference ARM64EC mangled functions without requiring an explicit alias.
RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-ref.dll mangled-func.obj ref-x64.obj loadconfig-arm64ec.obj
RUN: llvm-objdump -d x64-ref.dll | FileCheck -check-prefix=DISASM2 %s
Verify that an x86_64 object file can reference ARM64EC mangled functions provided by a library.
RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-lib-ref.dll func.lib ref-x64.obj loadconfig-arm64ec.obj
RUN: llvm-objdump -d x64-lib-ref.dll | FileCheck -check-prefix=DISASM2 %s
DISASM2: 0000000180001000 <.text>:
DISASM2-NEXT: 180001000: d65f03c0 ret
Verify that the linker emits appropriate errors for mismatched mangling.
RUN: not lld-link -machine:arm64ec -dll -out:test.dll demangled-func.obj loadconfig-arm64ec.obj \
RUN: "-entry:#func" 2>&1 | FileCheck -check-prefix=FUNC-NOT-FOUND %s
RUN: not lld-link -machine:arm64ec -dll -out:test.dll demangled-func.obj loadconfig-arm64ec.obj \
RUN: -noentry "-export:#func" 2>&1 | FileCheck -check-prefix=FUNC-NOT-FOUND %s
FUNC-NOT-FOUND: undefined symbol: #func (EC symbol)
Verify that the linker recognizes the demangled x86_64 _DllMainCRTStartup.
RUN: lld-link -machine:arm64ec -dll -out:test.dll x64-dll-main.obj loadconfig-arm64ec.obj
RUN: llvm-objdump -d test.dll | FileCheck -check-prefix=DISASM-X64 %s
DISASM-X64: 0000000180001000 <.text>:
DISASM-X64-NEXT: 180001000: c3 retq
#--- demangled-dll-main.s
.text
.globl _DllMainCRTStartup
_DllMainCRTStartup:
ret
#--- mangled-dll-main.s
.text
.globl "#_DllMainCRTStartup"
"#_DllMainCRTStartup":
ret
#--- demangled-func.s
.text
.globl func
func:
ret
#--- mangled-func.s
.text
.globl "#func"
"#func":
ret
#--- ref-demangled.s
.data
.rva func
#--- demangled-entry-drectve.s
.section .drectve,"rd"
.ascii " -entry:func"