[PATCH] ldd::COFF: better behavior when using as a library

Andrew Kelley via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 21 12:45:03 PDT 2017


Previously, the COFF driver would call exit(0) when called as
a library. Now there is a global function setLibraryMode()
which causes link() to return on success.

Furthermore, link() calls freeArena() before returning, to
clean up resources.
---
 lld/COFF/Driver.cpp | 27 +++++++++++++++++++++++----
 lld/COFF/Driver.h   |  2 ++
 2 files changed, 25 insertions(+), 4 deletions(-)


diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index c039740715c..a769196e8b8 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -46,6 +46,12 @@ using llvm::sys::Process;
 namespace lld {
 namespace coff {

+
+static bool IsLibraryMode = false;
+void setLibraryMode(void) {
+  IsLibraryMode = true;
+}
+
 Configuration *Config;
 LinkerDriver *Driver;

@@ -65,6 +71,7 @@ bool link(ArrayRef<const char *> Args, raw_ostream &Diag)
{

   Driver = make<LinkerDriver>();
   Driver->link(Args);
+  freeArena();
   return !ErrorCount;
 }

@@ -1077,7 +1084,11 @@ void LinkerDriver::link(ArrayRef<const char *>
ArgsArr) {
   if (!Args.hasArg(OPT_INPUT)) {
     fixupExports();
     createImportLibrary(/*AsLib=*/true);
-    exit(0);
+    if (IsLibraryMode) {
+      return;
+    } else {
+      exit(0);
+    }
   }

   // Handle /delayload
@@ -1169,7 +1180,11 @@ void LinkerDriver::link(ArrayRef<const char *>
ArgsArr) {
   // This is useful because MSVC link.exe can generate complete PDBs.
   if (Args.hasArg(OPT_msvclto)) {
     invokeMSVC(Args);
-    exit(0);
+    if (IsLibraryMode) {
+      return;
+    } else {
+      exit(0);
+    }
   }

   // Do LTO by compiling bitcode input files to a set of native COFF files
then
@@ -1267,8 +1282,12 @@ void LinkerDriver::link(ArrayRef<const char *>
ArgsArr) {
   if (ErrorCount)
     return;

-  // Call exit to avoid calling destructors.
-  exit(0);
+  if (IsLibraryMode) {
+    return
+  } else {
+    // Call exit to avoid calling destructors.
+    exit(0);
+  }
 }

 } // namespace coff
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
index df54fc1e45e..c1c0f36b011 100644
--- a/lld/COFF/Driver.h
+++ b/lld/COFF/Driver.h
@@ -35,6 +35,8 @@ using llvm::COFF::MachineTypes;
 using llvm::COFF::WindowsSubsystem;
 using llvm::Optional;

+void setLibraryMode(void);
+
 // Implemented in MarkLive.cpp.
 void markLive(const std::vector<Chunk *> &Chunks);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171021/5a1001ef/attachment.html>


More information about the llvm-commits mailing list