diff options
Diffstat (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r-- | llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
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<const char *> ArgsArr) { return 1; } - return writeImportLibrary(Def->OutputFile, OutputPath, Def->Exports, - LibMachine, + std::vector<COFFShortExport> NativeExports; + std::string OutputFile = Def->OutputFile; + + if (isArm64EC(LibMachine) && Args.hasArg(OPT_nativedeffile)) { + std::unique_ptr<MemoryBuffer> NativeMB = + openFile(Args.getLastArg(OPT_nativedeffile)->getValue()); + if (!NativeMB) + return 1; + + if (!NativeMB->getBufferSize()) { + llvm::errs() << "native definition file empty\n"; + return 1; + } + + Expected<COFFModuleDefinition> 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; |