[lld] [LLD][COFF] Move Archive::create call to LinkerDriver::addBuffer (NFC) (PR #194346)

Jacek Caban via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 04:32:55 PDT 2026


https://github.com/cjacek created https://github.com/llvm/llvm-project/pull/194346

None

>From 6003a2aa977dd7a475b6f322367607aa5fff7a3d Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Wed, 1 Apr 2026 12:08:58 +0200
Subject: [PATCH] [LLD][COFF] Move Archive::create call to
 LinkerDriver::addBuffer (NFC)

---
 lld/COFF/Driver.cpp     |  9 +++++----
 lld/COFF/InputFiles.cpp | 10 +++++-----
 lld/COFF/InputFiles.h   |  3 ++-
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 6d0973c1d0b78..c08ffbd8ae839 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -291,10 +291,10 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> mb,
   case file_magic::windows_resource:
     resources.push_back(mbref);
     break;
-  case file_magic::archive:
+  case file_magic::archive: {
+    std::unique_ptr<Archive> file =
+        CHECK(Archive::create(mbref), filename + ": failed to parse archive");
     if (wholeArchive) {
-      std::unique_ptr<Archive> file =
-          CHECK(Archive::create(mbref), filename + ": failed to parse archive");
       Archive *archive = file.get();
       make<std::unique_ptr<Archive>>(std::move(file)); // take ownership
 
@@ -308,8 +308,9 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> mb,
 
       return;
     }
-    addFile(make<ArchiveFile>(ctx, mbref));
+    addFile(make<ArchiveFile>(ctx, mbref, file));
     break;
+  }
   case file_magic::bitcode:
     addFile(BitcodeFile::create(ctx, mbref, "", 0, lazy));
     break;
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 5e66ff182cd96..0c29e7f670550 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -150,16 +150,16 @@ static bool fixupDllMain(COFFLinkerContext &ctx, llvm::object::Archive *file,
   return false;
 }
 
-ArchiveFile::ArchiveFile(COFFLinkerContext &ctx, MemoryBufferRef m)
-    : InputFile(ctx.symtab, ArchiveKind, m) {}
+ArchiveFile::ArchiveFile(COFFLinkerContext &ctx, MemoryBufferRef m,
+                         std::unique_ptr<Archive> &f)
+    : InputFile(ctx.symtab, ArchiveKind, m) {
+  file.swap(f);
+}
 
 void ArchiveFile::parse() {
   COFFLinkerContext &ctx = symtab.ctx;
   SymbolTable *archiveSymtab = &symtab;
 
-  // Parse a MemoryBufferRef as an archive file.
-  file = CHECK(Archive::create(mb), this);
-
   // Try to read symbols from ECSYMBOLS section on ARM64EC.
   if (ctx.symtab.isEC()) {
     iterator_range<Archive::symbol_iterator> symbols =
diff --git a/lld/COFF/InputFiles.h b/lld/COFF/InputFiles.h
index 21b9aeef21d4f..ce8bc6705e489 100644
--- a/lld/COFF/InputFiles.h
+++ b/lld/COFF/InputFiles.h
@@ -118,7 +118,8 @@ class InputFile {
 // .lib or .a file.
 class ArchiveFile : public InputFile {
 public:
-  explicit ArchiveFile(COFFLinkerContext &ctx, MemoryBufferRef m);
+  explicit ArchiveFile(COFFLinkerContext &ctx, MemoryBufferRef mb,
+                       std::unique_ptr<Archive> &f);
   static bool classof(const InputFile *f) { return f->kind() == ArchiveKind; }
   void parse() override;
 



More information about the llvm-commits mailing list