diff options
author | Jacek Caban <jacek@codeweavers.com> | 2023-04-21 15:32:07 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2023-04-21 15:46:20 +0300 |
commit | cea5d2870f379e7f93ba9da01747a279e4225998 (patch) | |
tree | cb7aef44a3ed7066ddba72a4ffd653fce1ea80ec /llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
parent | 85a2c50ec4979b87267e4f2068f2921beb0b98f2 (diff) | |
download | llvm-cea5d2870f379e7f93ba9da01747a279e4225998.zip llvm-cea5d2870f379e7f93ba9da01747a279e4225998.tar.gz llvm-cea5d2870f379e7f93ba9da01747a279e4225998.tar.bz2 |
[llvm-lib] [llvm-readobj] [llvm-cvtres] Add Support for ARM64X object files.
Similar to D125411, but for ARM64X.
ARM64X PE binaries are hybrids containing both ARM64EC and pure ARM64
variants in one file. They are usually linked by passing separate
ARM64EC and ARM64 object files to linker. Linked binaries use ARM64
machine and contain additional CHPE metadata in their load config.
CHPE metadata support is not part of this patch, I plan to send that later.
Using ARM64X as a machine type of object files themselves is somewhat
ambiguous, but such files are allowed by MSVC. It treats them as ARM64
or ARM64EC object, depending on the context. Such objects can be
produced with cvtres.exe -machine:arm64x.
Reviewed By: efriedma
Differential Revision: https://reviews.llvm.org/D148517
Diffstat (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r-- | llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 9bde40d..17bdb12 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -167,9 +167,7 @@ static Expected<COFF::MachineTypes> getCOFFFileMachine(MemoryBufferRef MB) { uint16_t Machine = (*Obj)->getMachine(); if (Machine != COFF::IMAGE_FILE_MACHINE_I386 && Machine != COFF::IMAGE_FILE_MACHINE_AMD64 && - Machine != COFF::IMAGE_FILE_MACHINE_ARMNT && - Machine != COFF::IMAGE_FILE_MACHINE_ARM64 && - Machine != COFF::IMAGE_FILE_MACHINE_ARM64EC) { + Machine != COFF::IMAGE_FILE_MACHINE_ARMNT && !COFF::isAnyArm64(Machine)) { return createStringError(inconvertibleErrorCode(), "unknown machine: " + std::to_string(Machine)); } @@ -205,9 +203,16 @@ static bool machineMatches(COFF::MachineTypes LibMachine, return true; // ARM64EC mode allows both pure ARM64, ARM64EC and X64 objects to be mixed in // the archive. - return LibMachine == COFF::IMAGE_FILE_MACHINE_ARM64EC && - (FileMachine == COFF::IMAGE_FILE_MACHINE_ARM64 || - FileMachine == COFF::IMAGE_FILE_MACHINE_AMD64); + switch (LibMachine) { + case COFF::IMAGE_FILE_MACHINE_ARM64: + return FileMachine == COFF::IMAGE_FILE_MACHINE_ARM64X; + case COFF::IMAGE_FILE_MACHINE_ARM64EC: + case COFF::IMAGE_FILE_MACHINE_ARM64X: + return COFF::isAnyArm64(FileMachine) || + FileMachine == COFF::IMAGE_FILE_MACHINE_AMD64; + default: + return false; + } } static void appendFile(std::vector<NewArchiveMember> &Members, @@ -482,7 +487,7 @@ int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) { /*WriteSymtab=*/true, Thin ? object::Archive::K_GNU : object::Archive::K_COFF, /*Deterministic*/ true, Thin, nullptr, - LibMachine == COFF::IMAGE_FILE_MACHINE_ARM64EC)) { + COFF::isArm64EC(LibMachine))) { handleAllErrors(std::move(E), [&](const ErrorInfoBase &EI) { llvm::errs() << OutputPath << ": " << EI.message() << "\n"; }); |