[lld] eb4eef9 - [LLD][COFF] Add support for /noimplib

Tobias Hieta via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 13 01:32:50 PDT 2022


Author: Tobias Hieta
Date: 2022-04-13T10:32:44+02:00
New Revision: eb4eef9ec4e5c4869aa76295a10e422f54951214

URL: https://github.com/llvm/llvm-project/commit/eb4eef9ec4e5c4869aa76295a10e422f54951214
DIFF: https://github.com/llvm/llvm-project/commit/eb4eef9ec4e5c4869aa76295a10e422f54951214.diff

LOG: [LLD][COFF] Add support for /noimplib

Mostly for compatibility reasons with link.exe this flag
makes sure we don't write a implib - not even when /implib
is also passed, that's how link.exe works.

Reviewed By: mstorsjo

Differential Revision: https://reviews.llvm.org/D123591

Added: 
    lld/test/COFF/noimplib.test

Modified: 
    lld/COFF/Config.h
    lld/COFF/Driver.cpp
    lld/COFF/Options.td

Removed: 
    


################################################################################
diff  --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index 21b1b5a1db5b1..8edb545cd653e 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -140,6 +140,7 @@ struct Configuration {
   // True if we are creating a DLL.
   bool dll = false;
   StringRef implib;
+  bool noimplib = false;
   std::vector<Export> exports;
   bool hadExplicitExports;
   std::set<std::string> delayLoads;

diff  --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 95ab92462a979..4ae75de4586a8 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -1673,6 +1673,9 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   if (auto *arg = args.getLastArg(OPT_implib))
     config->implib = arg->getValue();
 
+  if (auto *arg = args.getLastArg(OPT_noimplib))
+    config->noimplib = true;
+
   // Handle /opt.
   bool doGC = debug == DebugKind::None || args.hasArg(OPT_profile);
   Optional<ICFLevel> icfLevel = None;
@@ -2022,7 +2025,8 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   // Handle generation of import library from a def file.
   if (!args.hasArg(OPT_INPUT, OPT_wholearchive_file)) {
     fixupExports();
-    createImportLibrary(/*asLib=*/true);
+    if (!config->noimplib)
+      createImportLibrary(/*asLib=*/true);
     return;
   }
 
@@ -2281,7 +2285,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   // -implib option is given explicitly, for compatibility with GNU ld.
   if (!config->exports.empty() || config->dll) {
     fixupExports();
-    if (!config->mingw || !config->implib.empty())
+    if (!config->noimplib && (!config->mingw || !config->implib.empty()))
       createImportLibrary(/*asLib=*/false);
     assignExportOrdinals();
   }

diff  --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index 331da34a7a90f..54555fa6f92a4 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -56,6 +56,8 @@ def guard   : P<"guard", "Control flow guard">;
 def heap    : P<"heap", "Size of the heap">;
 def ignore : P<"ignore", "Specify warning codes to ignore">;
 def implib  : P<"implib", "Import library name">;
+def noimplib : F<"noimplib">,
+    HelpText<"Don't output an import lib">;
 def lib : F<"lib">,
     HelpText<"Act like lib.exe; must be first argument if present">;
 def libpath : P<"libpath", "Additional library search path">;

diff  --git a/lld/test/COFF/noimplib.test b/lld/test/COFF/noimplib.test
new file mode 100644
index 0000000000000..ba1cee76c81f6
--- /dev/null
+++ b/lld/test/COFF/noimplib.test
@@ -0,0 +1,20 @@
+REQUIRES: x86
+RUN: mkdir -p %t-out
+RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t-out/object.obj %S/Inputs/object.s
+
+Test that /noimplib writes no .lib file
+
+RUN: rm -f %t-out/library.lib
+RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /noimplib
+RUN: not test -f %t-out/library.lib
+
+Just make sure the normal stuff works and then we just add /noimplib
+
+RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /implib:%t-out/nolibrary.lib
+RUN: test -f %t-out/nolibrary.lib
+
+Test that it overrides /implib as well. This is how link.exe works
+
+RUN: rm -f %t-out/nolibrary.lib
+RUN: lld-link -dll -machine:x64 -def:%S/Inputs/named.def -out:%t-out/library.dll %t-out/object.obj -entry:f -subsystem:console /implib:%t-out/nolibrary.lib /noimplib
+RUN: not test -f %t-out/nolibrary.lib


        


More information about the llvm-commits mailing list