[lld] ce0f3ee - [COFF] Don't error if the only inputs are from /wholearchive:

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 15 16:10:48 PST 2019


Author: Reid Kleckner
Date: 2019-11-15T16:09:07-08:00
New Revision: ce0f3ee5e4dc2eed5390b57d4a1e37c8bf17a995

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

LOG: [COFF] Don't error if the only inputs are from /wholearchive:

Fixes PR43744

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

Added: 
    

Modified: 
    lld/COFF/Driver.cpp
    lld/test/COFF/entry-inference.test
    lld/test/COFF/out.test
    lld/test/COFF/wholearchive.s

Removed: 
    


################################################################################
diff  --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 6f558bfd340b..f7daa5fa2242 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -1171,7 +1171,7 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) {
     }
   }
 
-  if (!args.hasArg(OPT_INPUT)) {
+  if (!args.hasArg(OPT_INPUT, OPT_wholearchive_file)) {
     if (args.hasArg(OPT_deffile))
       config->noEntry = true;
     else
@@ -1700,7 +1700,7 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) {
   }
 
   // Handle generation of import library from a def file.
-  if (!args.hasArg(OPT_INPUT)) {
+  if (!args.hasArg(OPT_INPUT, OPT_wholearchive_file)) {
     fixupExports();
     createImportLibrary(/*asLib=*/true);
     return;
@@ -1749,8 +1749,8 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) {
 
   // Set default image name if neither /out or /def set it.
   if (config->outputFile.empty()) {
-    config->outputFile =
-        getOutputPath((*args.filtered(OPT_INPUT).begin())->getValue());
+    config->outputFile = getOutputPath(
+        (*args.filtered(OPT_INPUT, OPT_wholearchive_file).begin())->getValue());
   }
 
   // Fail early if an output file is not writable.

diff  --git a/lld/test/COFF/entry-inference.test b/lld/test/COFF/entry-inference.test
index b58a23a30e80..606cbd0bae7a 100644
--- a/lld/test/COFF/entry-inference.test
+++ b/lld/test/COFF/entry-inference.test
@@ -4,6 +4,11 @@
 # RUN: not lld-link /nodefaultlib /out:%t.exe %t.obj > %t.log 2>&1
 # RUN: FileCheck -check-prefix=MAIN %s < %t.log
 
+# Entry inference should work through /wholearchive:, they are also inputs.
+# RUN: lld-link /lib %t.obj /out:%t.lib
+# RUN: not lld-link /nodefaultlib /out:%t.exe /wholearchive:%t.lib > %t.log 2>&1
+# RUN: FileCheck -check-prefix=MAIN %s < %t.log
+
 # RUN: sed s/ENTRYNAME/wmain/ %s | yaml2obj > %t.obj
 # RUN: not lld-link /out:%t.exe %t.obj > %t.log 2>&1
 # RUN: FileCheck -check-prefix=WMAIN %s < %t.log

diff  --git a/lld/test/COFF/out.test b/lld/test/COFF/out.test
index a7b56145996f..6d7667e906e7 100644
--- a/lld/test/COFF/out.test
+++ b/lld/test/COFF/out.test
@@ -4,14 +4,17 @@
 # RUN: cp %t.obj %T/out/out1.obj
 # RUN: cp %t.obj %T/out/tmp/out2
 # RUN: cp %t.obj %T/out/tmp/out3.xyz
+# RUN: lld-link /lib %t.obj /out:%T/out/out4.lib
 
-# RUN: rm -f out1.exe out2.exe out3.exe out3.dll
+# RUN: rm -f out1.exe out2.exe out3.exe out3.dll out4.exe
 # RUN: lld-link /entry:main %T/out/out1.obj
 # RUN: lld-link /entry:main %T/out/tmp/out2
 # RUN: lld-link /dll /entry:main %T/out/tmp/out3.xyz
+# RUN: lld-link /entry:main -wholearchive:%T/out/out4.lib
 
 # RUN: llvm-readobj out1.exe | FileCheck %s
 # RUN: llvm-readobj out2.exe | FileCheck %s
 # RUN: llvm-readobj out3.dll | FileCheck %s
+# RUN: llvm-readobj out4.exe | FileCheck %s
 
 CHECK: File:

diff  --git a/lld/test/COFF/wholearchive.s b/lld/test/COFF/wholearchive.s
index cb19d4ddde07..3592f7e9add9 100644
--- a/lld/test/COFF/wholearchive.s
+++ b/lld/test/COFF/wholearchive.s
@@ -14,6 +14,10 @@
 # RUN: lld-link -dll -out:%t.dll -entry:main %t.main.obj %t.archive.lib -wholearchive:%t.archive.lib -implib:%t.lib
 # RUN: llvm-readobj %t.lib | FileCheck %s -check-prefix CHECK-IMPLIB
 
+# PR43744: Test no inputs except a whole archive.
+# RUN: lld-link -dll -out:%t.dll -noentry -wholearchive:%t.archive.lib -implib:%t.lib
+# RUN: llvm-readobj %t.lib | FileCheck %s -check-prefix CHECK-IMPLIB
+
 # RUN: mkdir -p %t.dir
 # RUN: cp %t.archive.lib %t.dir/foo.lib
 # RUN: lld-link -dll -out:%t.dll -entry:main -libpath:%t.dir %t.main.obj %t.dir/./foo.lib -wholearchive:foo.lib -implib:%t.lib


        


More information about the llvm-commits mailing list