[lld] r354386 - [COFF] Add -exclude-all-symbols for MinGW

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 19 13:57:44 PST 2019


Author: mstorsjo
Date: Tue Feb 19 13:57:44 2019
New Revision: 354386

URL: http://llvm.org/viewvc/llvm-project?rev=354386&view=rev
Log:
[COFF] Add -exclude-all-symbols for MinGW

This is a private undocumented option, intended to be used by
the MinGW driver frontend.

Also restructure the condition to put if (Config->MinGW) first.
This changes the behaviour for the tautological combination of
-export-all-symbols without -lldmingw.

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

Added:
    lld/trunk/test/COFF/exclude-all.s
Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/COFF/Options.td

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=354386&r1=354385&r2=354386&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Tue Feb 19 13:57:44 2019
@@ -1604,10 +1604,15 @@ void LinkerDriver::link(ArrayRef<const c
       return;
   }
 
-  // In MinGW, all symbols are automatically exported if no symbols
-  // are chosen to be exported.
-  if (Config->DLL && ((Config->MinGW && Config->Exports.empty()) ||
-                      Args.hasArg(OPT_export_all_symbols))) {
+  // In MinGW, if no symbols are chosen to be exported, then all symbols are
+  // automatically exported by default. This behavior can be forced by the
+  // -export-all-symbols option, so that it happens even when exports are
+  // explicitly specified. The automatic behavior can be disabled using the
+  // -exclude-all-symbols option, so that lld-link behaves like link.exe rather
+  // than MinGW in the case that nothing is explicitly exported.
+  if (Config->MinGW && Config->DLL &&
+      ((Config->Exports.empty() && !Args.hasArg(OPT_exclude_all_symbols)) ||
+       Args.hasArg(OPT_export_all_symbols))) {
     Exporter.initSymbolExcludes();
 
     Symtab->forEachSymbol([=](Symbol *S) {

Modified: lld/trunk/COFF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=354386&r1=354385&r2=354386&view=diff
==============================================================================
--- lld/trunk/COFF/Options.td (original)
+++ lld/trunk/COFF/Options.td Tue Feb 19 13:57:44 2019
@@ -150,6 +150,7 @@ def help : F<"help">;
 def help_q : Flag<["/?", "-?"], "">, Alias<help>;
 
 // LLD extensions
+def exclude_all_symbols : F<"exclude-all-symbols">;
 def export_all_symbols : F<"export-all-symbols">;
 def kill_at : F<"kill-at">;
 def lldmingw : F<"lldmingw">;

Added: lld/trunk/test/COFF/exclude-all.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/exclude-all.s?rev=354386&view=auto
==============================================================================
--- lld/trunk/test/COFF/exclude-all.s (added)
+++ lld/trunk/test/COFF/exclude-all.s Tue Feb 19 13:57:44 2019
@@ -0,0 +1,31 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj
+
+# RUN: lld-link -lldmingw -exclude-all-symbols -dll -out:%t.dll -entry:DllMainCRTStartup at 12 %t.obj
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck %s -check-prefix=NO-EXPORTS
+
+# NO-EXPORTS-NOT: Name:
+
+.global _foobar
+.global _DllMainCRTStartup at 12
+.global _dataSym
+.text
+_DllMainCRTStartup at 12:
+  ret
+_foobar:
+  ret
+.data
+_dataSym:
+  .int 4
+
+# Test specifying -exclude-all-symbols, on an object file that contains
+# dllexport directive for some of the symbols. In this case, the dllexported
+# symbols are still exported.
+
+# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
+#
+# RUN: lld-link -out:%t.dll -dll %t.obj -lldmingw -exclude-all-symbols -output-def:%t.def
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix=DLLEXPORT %s
+
+# DLLEXPORT: Name: exportfn3




More information about the llvm-commits mailing list