diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -447,6 +447,8 @@ applyRelARM(off, rel.Type, os, s, p, imageBase); break; case ARM64: + case ARM64EC: + case ARM64X: applyRelARM64(off, rel.Type, os, s, p, imageBase); break; default: @@ -532,6 +534,8 @@ return IMAGE_REL_BASED_ARM_MOV32T; return IMAGE_REL_BASED_ABSOLUTE; case ARM64: + case ARM64EC: + case ARM64X: if (rel.Type == IMAGE_REL_ARM64_ADDR64) return IMAGE_REL_BASED_DIR64; return IMAGE_REL_BASED_ABSOLUTE; diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -37,6 +37,8 @@ // Short aliases. static const auto AMD64 = llvm::COFF::IMAGE_FILE_MACHINE_AMD64; static const auto ARM64 = llvm::COFF::IMAGE_FILE_MACHINE_ARM64; +static const auto ARM64EC = llvm::COFF::IMAGE_FILE_MACHINE_ARM64EC; +static const auto ARM64X = llvm::COFF::IMAGE_FILE_MACHINE_ARM64X; static const auto ARMNT = llvm::COFF::IMAGE_FILE_MACHINE_ARMNT; static const auto I386 = llvm::COFF::IMAGE_FILE_MACHINE_I386; @@ -96,7 +98,9 @@ // Global configuration. struct Configuration { enum ManifestKind { Default, SideBySide, Embed, No }; - bool is64() const { return machine == AMD64 || machine == ARM64; } + bool is64() const { + return machine == AMD64 || llvm::COFF::isAnyArm64(machine); + } llvm::COFF::MachineTypes machine = IMAGE_FILE_MACHINE_UNKNOWN; size_t wordsize; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1436,7 +1436,16 @@ // Write COFF header auto *coff = reinterpret_cast(buf); buf += sizeof(*coff); - coff->Machine = config->machine; + switch (config->machine) { + case ARM64EC: + coff->Machine = AMD64; + break; + case ARM64X: + coff->Machine = ARM64; + break; + default: + coff->Machine = config->machine; + } coff->NumberOfSections = ctx.outputSections.size(); coff->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE; if (config->largeAddressAware) diff --git a/lld/test/COFF/arm64ec.test b/lld/test/COFF/arm64ec.test new file mode 100644 --- /dev/null +++ b/lld/test/COFF/arm64ec.test @@ -0,0 +1,21 @@ +# REQUIRES: aarch64 +# RUN: split-file %s %t.dir && cd %t.dir + +RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-data-sym.s -o arm64ec-data-sym.obj + +RUN: lld-link -out:test.dll -machine:arm64ec arm64ec-data-sym.obj -dll -noentry +RUN: llvm-readobj --file-headers test.dll | FileCheck -check-prefix=ARM64EC-HEADER %s +ARM64EC-HEADER: Format: COFF-x86-64 +ARM64EC-HEADER-NEXT: Arch: x86_64 +ARM64EC-HEADER-NEXT: AddressSize: 64bit +ARM64EC-HEADER: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664) + +RUN: llvm-readobj --hex-dump=.data test.dll | FileCheck -check-prefix=DATAEC %s +DATAEC: 02020202 + +#--- arm64ec-data-sym.s + .data + .globl arm64ec_data_sym + .p2align 2, 0x0 +arm64ec_data_sym: + .word 0x02020202