diff --git a/llvm/include/llvm/Object/COFFImportFile.h b/llvm/include/llvm/Object/COFFImportFile.h index 3d148112dcbb6..0fb65fabdbcad 100644 --- a/llvm/include/llvm/Object/COFFImportFile.h +++ b/llvm/include/llvm/Object/COFFImportFile.h @@ -63,6 +63,8 @@ class COFFImportFile : public SymbolicFile { Data.getBufferStart()); } + uint16_t getMachine() const { return getCOFFImportHeader()->Machine; } + private: bool isData() const { return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA; diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index aa74a2f74ff57..a67c657b48ba0 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -18,6 +18,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/Object/Archive.h" #include "llvm/Object/COFF.h" +#include "llvm/Object/COFFImportFile.h" #include "llvm/Object/Error.h" #include "llvm/Object/IRObjectFile.h" #include "llvm/Object/MachO.h" @@ -659,6 +660,10 @@ static bool isECObject(object::SymbolicFile &Obj) { return cast(&Obj)->getMachine() != COFF::IMAGE_FILE_MACHINE_ARM64; + if (Obj.isCOFFImportFile()) + return cast(&Obj)->getMachine() != + COFF::IMAGE_FILE_MACHINE_ARM64; + if (Obj.isIR()) { Expected TripleStr = getBitcodeTargetTriple(Obj.getMemoryBufferRef()); diff --git a/llvm/lib/Object/COFFImportFile.cpp b/llvm/lib/Object/COFFImportFile.cpp index a567ecde9b7af..2cca1f728cc71 100644 --- a/llvm/lib/Object/COFFImportFile.cpp +++ b/llvm/lib/Object/COFFImportFile.cpp @@ -612,7 +612,8 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path, return writeArchive(Path, Members, SymtabWritingMode::NormalSymtab, MinGW ? object::Archive::K_GNU : object::Archive::K_COFF, - /*Deterministic*/ true, /*Thin*/ false); + /*Deterministic*/ true, /*Thin*/ false, + /*OldArchiveBuf*/ nullptr, isArm64EC(Machine)); } } // namespace object diff --git a/llvm/test/tools/llvm-lib/arm64ec-implib.test b/llvm/test/tools/llvm-lib/arm64ec-implib.test new file mode 100644 index 0000000000000..ee8b134d06b16 --- /dev/null +++ b/llvm/test/tools/llvm-lib/arm64ec-implib.test @@ -0,0 +1,54 @@ +Test creating ARM64EC importlib. + +RUN: split-file %s %t.dir && cd %t.dir +RUN: llvm-lib -machine:arm64ec -def:test.def -out:test.lib + +RUN: llvm-nm --print-armap test.lib | FileCheck -check-prefix=ARMAP %s + +ARMAP: Archive EC map +ARMAP-NEXT: __IMPORT_DESCRIPTOR_test in test.dll +ARMAP-NEXT: __NULL_IMPORT_DESCRIPTOR in test.dll +ARMAP-NEXT: __imp_dataexp in test.dll +ARMAP-NEXT: __imp_funcexp in test.dll +ARMAP-NEXT: funcexp in test.dll +ARMAP-NEXT: test_NULL_THUNK_DATA in test.dll + +RUN: llvm-readobj test.lib | FileCheck -check-prefix=READOBJ %s + +READOBJ: File: test.lib(test.dll) +READOBJ-NEXT: Format: COFF-ARM64EC +READOBJ-NEXT: Arch: aarch64 +READOBJ-NEXT: AddressSize: 64bit +READOBJ-EMPTY: +READOBJ-NEXT: File: test.lib(test.dll) +READOBJ-NEXT: Format: COFF-ARM64EC +READOBJ-NEXT: Arch: aarch64 +READOBJ-NEXT: AddressSize: 64bit +READOBJ-EMPTY: +READOBJ-NEXT: File: test.lib(test.dll) +READOBJ-NEXT: Format: COFF-ARM64 +READOBJ-NEXT: Arch: aarch64 +READOBJ-NEXT: AddressSize: 64bit +READOBJ-EMPTY: +READOBJ-NEXT: File: test.dll +READOBJ-NEXT: Format: COFF-import-file +READOBJ-NEXT: Type: code +READOBJ-NEXT: Name type: name +READOBJ-NEXT: Symbol: __imp_funcexp +READOBJ-NEXT: Symbol: funcexp +READOBJ-EMPTY: +READOBJ-NEXT: File: test.dll +READOBJ-NEXT: Format: COFF-import-file +READOBJ-NEXT: Type: data +READOBJ-NEXT: Name type: name +READOBJ-NEXT: Symbol: __imp_dataexp + +Creating a new lib containing the existing lib: +RUN: llvm-lib -machine:arm64ec test.lib -out:test2.lib +RUN: llvm-nm --print-armap test2.lib | FileCheck -check-prefix=ARMAP %s + +#--- test.def +LIBRARY test.dll +EXPORTS + funcexp + dataexp DATA