diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2024-07-27 23:34:35 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2024-10-23 18:26:01 +0000 |
commit | 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583 (patch) | |
tree | 6cf5ab1f05330c6773b1f3f64799d56a9c7a1faa /contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | |
parent | 6b9f7133aba44189d9625c352bc2c2a59baf18ef (diff) | |
parent | ac9a064cb179f3425b310fa2847f8764ac970a4d (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 5d7ec0fb0309..6f8ce174ea4d 100644 --- a/contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -95,7 +95,8 @@ static std::vector<StringRef> getSearchPaths(opt::InputArgList *Args, // Opens a file. Path has to be resolved already. (used for def file) std::unique_ptr<MemoryBuffer> openFile(const Twine &Path) { - ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB = MemoryBuffer::getFile(Path); + ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB = + MemoryBuffer::getFile(Path, /*IsText=*/true); if (std::error_code EC = MB.getError()) { llvm::errs() << "cannot open file " << Path << ": " << EC.message() << "\n"; @@ -144,7 +145,7 @@ static void doList(opt::InputArgList &Args) { return; Error Err = Error::success(); - object::Archive Archive(B.get()->getMemBufferRef(), Err); + object::Archive Archive(B->getMemBufferRef(), Err); fatalOpenError(std::move(Err), B->getBufferIdentifier()); std::vector<StringRef> Names; @@ -392,9 +393,34 @@ int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) { return 1; } - return writeImportLibrary(Def->OutputFile, OutputPath, Def->Exports, - LibMachine, - /*MinGW=*/false) + 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, LibMachine, + /*MinGW=*/false, NativeExports) ? 1 : 0; } |