From a38152e2156a467520dae29fa3760802c308d54c Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 13 Feb 2024 01:49:45 +0100 Subject: [llvm-lib] Add support for -defArm64Native argument. (#81426) This can be used to create import libraries that contain both ARM64EC and native exports. The implementation follows observed MSVC lib.exe behaviour. It's ignored on targets other than ARM64EC. --- llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 30 +++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp') diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 5d7ec0f..3baa0a08c 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -392,8 +392,34 @@ int llvm::libDriverMain(ArrayRef ArgsArr) { return 1; } - return writeImportLibrary(Def->OutputFile, OutputPath, Def->Exports, - LibMachine, + std::vector NativeExports; + std::string OutputFile = Def->OutputFile; + + if (isArm64EC(LibMachine) && Args.hasArg(OPT_nativedeffile)) { + std::unique_ptr NativeMB = + openFile(Args.getLastArg(OPT_nativedeffile)->getValue()); + if (!NativeMB) + return 1; + + if (!NativeMB->getBufferSize()) { + llvm::errs() << "native definition file empty\n"; + return 1; + } + + Expected NativeDef = + parseCOFFModuleDefinition(*NativeMB, COFF::IMAGE_FILE_MACHINE_ARM64); + + if (!NativeDef) { + llvm::errs() << "error parsing native definition\n" + << errorToErrorCode(NativeDef.takeError()).message(); + return 1; + } + NativeExports = std::move(NativeDef->Exports); + OutputFile = std::move(NativeDef->OutputFile); + } + + return writeImportLibrary(OutputFile, OutputPath, Def->Exports, + NativeExports, LibMachine, /*MinGW=*/false) ? 1 : 0; -- cgit v1.1