[lld] r313174 - [MinGW] Support dllexport on i386

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 13 12:29:39 PDT 2017


Author: mstorsjo
Date: Wed Sep 13 12:29:39 2017
New Revision: 313174

URL: http://llvm.org/viewvc/llvm-project?rev=313174&view=rev
Log:
[MinGW] Support dllexport on i386

In MinGW configurations (GCC, or clang with a *-windows-gnu target),
the -export directives in the object file contains the undecorated
symbol name, while it is decorated in MSVC configurations. (On the
command line, link.exe takes an undecorated symbol name for the
-export argument though.)

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

Added:
    lld/trunk/test/COFF/dllexport-mingw.s
Modified:
    lld/trunk/COFF/Config.h
    lld/trunk/COFF/Driver.cpp
    lld/trunk/COFF/Options.td
    lld/trunk/MinGW/Driver.cpp
    lld/trunk/test/MinGW/driver.test

Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=313174&r1=313173&r2=313174&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Wed Sep 13 12:29:39 2017
@@ -173,6 +173,7 @@ struct Configuration {
   bool LargeAddressAware = false;
   bool HighEntropyVA = false;
   bool AppContainer = false;
+  bool MinGW = false;
 };
 
 extern Configuration *Config;

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=313174&r1=313173&r2=313174&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Wed Sep 13 12:29:39 2017
@@ -234,6 +234,12 @@ void LinkerDriver::parseDirectives(Strin
       break;
     case OPT_export: {
       Export E = parseExport(Arg->getValue());
+      if (Config->Machine == I386 && Config->MinGW) {
+        if (!isDecorated(E.Name))
+          E.Name = Saver.save("_" + E.Name);
+        if (!E.ExtName.empty() && !isDecorated(E.ExtName))
+          E.ExtName = Saver.save("_" + E.ExtName);
+      }
       E.Directives = true;
       Config->Exports.push_back(E);
       break;
@@ -719,6 +725,10 @@ void LinkerDriver::link(ArrayRef<const c
     return;
   }
 
+  // Handle /lldmingw early, since it can potentially affect how other
+  // options are handled.
+  Config->MinGW = Args.hasArg(OPT_lldmingw);
+
   if (auto *Arg = Args.getLastArg(OPT_linkrepro)) {
     SmallString<64> Path = StringRef(Arg->getValue());
     sys::path::append(Path, "repro.tar");

Modified: lld/trunk/COFF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=313174&r1=313173&r2=313174&view=diff
==============================================================================
--- lld/trunk/COFF/Options.td (original)
+++ lld/trunk/COFF/Options.td Wed Sep 13 12:29:39 2017
@@ -104,6 +104,7 @@ def help_q : Flag<["/?", "-?"], "">, Ali
 // LLD extensions
 def nopdb : F<"nopdb">, HelpText<"Disable PDB generation for DWARF users">;
 def nosymtab : F<"nosymtab">;
+def lldmingw : F<"lldmingw">;
 def msvclto : F<"msvclto">;
 def rsp_quoting : Joined<["--"], "rsp-quoting=">,
   HelpText<"Quoting style for response files, 'windows' (default) or 'posix'">;

Modified: lld/trunk/MinGW/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/MinGW/Driver.cpp?rev=313174&r1=313173&r2=313174&view=diff
==============================================================================
--- lld/trunk/MinGW/Driver.cpp (original)
+++ lld/trunk/MinGW/Driver.cpp Wed Sep 13 12:29:39 2017
@@ -120,6 +120,7 @@ bool mingw::link(ArrayRef<const char *>
   auto Add = [&](const Twine &S) { LinkArgs.push_back(S.str()); };
 
   Add("lld-link");
+  Add("-lldmingw");
 
   if (auto *A = Args.getLastArg(OPT_entry)) {
     StringRef S = A->getValue();

Added: lld/trunk/test/COFF/dllexport-mingw.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dllexport-mingw.s?rev=313174&view=auto
==============================================================================
--- lld/trunk/test/COFF/dllexport-mingw.s (added)
+++ lld/trunk/test/COFF/dllexport-mingw.s Wed Sep 13 12:29:39 2017
@@ -0,0 +1,19 @@
+# REQEUIRES: x86
+
+# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj
+
+# RUN: lld-link -lldmingw -dll -out:%t.dll -entry:main %t.obj -implib:%t.lib
+# RUN: llvm-readobj %t.lib | FileCheck %s
+
+# CHECK: Symbol: __imp__func
+# CHECK: Symbol: _func
+
+.global _main
+.global _func
+.text
+_main:
+  ret
+_func:
+  ret
+.section .drectve
+.ascii "-export:func"

Modified: lld/trunk/test/MinGW/driver.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/MinGW/driver.test?rev=313174&r1=313173&r2=313174&view=diff
==============================================================================
--- lld/trunk/test/MinGW/driver.test (original)
+++ lld/trunk/test/MinGW/driver.test Wed Sep 13 12:29:39 2017
@@ -53,3 +53,6 @@ I386-ENTRY: -entry:DllMainCRTStartup at 12
 
 RUN: ld.lld -### -m i386pep foo.o --whole-archive bar.a --no-whole-archive baz.a | FileCheck -check-prefix WHOLE-ARCHIVE %s
 WHOLE-ARCHIVE: foo.o -wholearchive:bar.a baz.a
+
+RUN: ld.lld -### -m i386pep foo.o | FileCheck -check-prefix MINGW-FLAG %s
+MINGW-FLAG: -lldmingw




More information about the llvm-commits mailing list