aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2024-07-27 23:34:35 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-10-23 18:26:01 +0000
commit0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583 (patch)
tree6cf5ab1f05330c6773b1f3f64799d56a9c7a1faa /contrib/llvm-project/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
parent6b9f7133aba44189d9625c352bc2c2a59baf18ef (diff)
parentac9a064cb179f3425b310fa2847f8764ac970a4d (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.cpp36
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;
}