mstorsjo created this revision.

This allows linking to e.g. msvcr120.dll or ucrtbase.dll instead of the 
unversioned (and officially unsupported) msvcrt.dll. In GCC setups, this can be 
overridden by using custom spec files, but this isn't supported in clang.

This is just an initial attempt at implementing this - suggestions are most 
welcome.


https://reviews.llvm.org/D37530

Files:
  include/clang/Driver/Options.td
  lib/Driver/ToolChains/MinGW.cpp
  test/Driver/mingw-msvcrt.c


Index: test/Driver/mingw-msvcrt.c
===================================================================
--- /dev/null
+++ test/Driver/mingw-msvcrt.c
@@ -0,0 +1,5 @@
+// RUN: %clang -v -target i686-pc-windows-gnu -### %s 2>&1 | FileCheck 
-check-prefix=CHECK_DEFAULT %s
+// RUN: %clang -v -target i686-pc-windows-gnu -mmsvcrt=msvcr120 -### %s 2>&1 | 
FileCheck -check-prefix=CHECK_MSVCR120 %s
+
+// CHECK_DEFAULT: "-lmingwex" "-lmsvcrt"
+// CHECK_MSVCR120: "-lmingwex" "-lmsvcr120"
Index: lib/Driver/ToolChains/MinGW.cpp
===================================================================
--- lib/Driver/ToolChains/MinGW.cpp
+++ lib/Driver/ToolChains/MinGW.cpp
@@ -82,7 +82,8 @@
 
   CmdArgs.push_back("-lmoldname");
   CmdArgs.push_back("-lmingwex");
-  CmdArgs.push_back("-lmsvcrt");
+  CmdArgs.push_back(Args.MakeArgString(
+      "-l" + Args.getLastArgValue(options::OPT_mmsvcrt_EQ, "msvcrt")));
 }
 
 void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
@@ -157,7 +158,7 @@
     if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
       CmdArgs.push_back("-e");
       if (TC.getArch() == llvm::Triple::x86)
-        CmdArgs.push_back("_DllMainCRTStartup@12");
+        CmdArgs.push_back("DllMainCRTStartup@12");
       else
         CmdArgs.push_back("DllMainCRTStartup");
       CmdArgs.push_back("--enable-auto-image-base");
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1710,6 +1710,7 @@
 def mdll : Joined<["-"], "mdll">, Group<m_Group>, Flags<[DriverOption]>;
 def municode : Joined<["-"], "municode">, Group<m_Group>, 
Flags<[DriverOption]>;
 def mthreads : Joined<["-"], "mthreads">, Group<m_Group>, 
Flags<[DriverOption]>;
+def mmsvcrt_EQ : Joined<["-"], "mmsvcrt=">, Group<m_Group>, 
Flags<[DriverOption]>;
 def mcpu_EQ : Joined<["-"], "mcpu=">, Group<m_Group>;
 def mmcu_EQ : Joined<["-"], "mmcu=">, Group<m_Group>;
 def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group<m_Group>;


Index: test/Driver/mingw-msvcrt.c
===================================================================
--- /dev/null
+++ test/Driver/mingw-msvcrt.c
@@ -0,0 +1,5 @@
+// RUN: %clang -v -target i686-pc-windows-gnu -### %s 2>&1 | FileCheck -check-prefix=CHECK_DEFAULT %s
+// RUN: %clang -v -target i686-pc-windows-gnu -mmsvcrt=msvcr120 -### %s 2>&1 | FileCheck -check-prefix=CHECK_MSVCR120 %s
+
+// CHECK_DEFAULT: "-lmingwex" "-lmsvcrt"
+// CHECK_MSVCR120: "-lmingwex" "-lmsvcr120"
Index: lib/Driver/ToolChains/MinGW.cpp
===================================================================
--- lib/Driver/ToolChains/MinGW.cpp
+++ lib/Driver/ToolChains/MinGW.cpp
@@ -82,7 +82,8 @@
 
   CmdArgs.push_back("-lmoldname");
   CmdArgs.push_back("-lmingwex");
-  CmdArgs.push_back("-lmsvcrt");
+  CmdArgs.push_back(Args.MakeArgString(
+      "-l" + Args.getLastArgValue(options::OPT_mmsvcrt_EQ, "msvcrt")));
 }
 
 void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
@@ -157,7 +158,7 @@
     if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
       CmdArgs.push_back("-e");
       if (TC.getArch() == llvm::Triple::x86)
-        CmdArgs.push_back("_DllMainCRTStartup@12");
+        CmdArgs.push_back("DllMainCRTStartup@12");
       else
         CmdArgs.push_back("DllMainCRTStartup");
       CmdArgs.push_back("--enable-auto-image-base");
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1710,6 +1710,7 @@
 def mdll : Joined<["-"], "mdll">, Group<m_Group>, Flags<[DriverOption]>;
 def municode : Joined<["-"], "municode">, Group<m_Group>, Flags<[DriverOption]>;
 def mthreads : Joined<["-"], "mthreads">, Group<m_Group>, Flags<[DriverOption]>;
+def mmsvcrt_EQ : Joined<["-"], "mmsvcrt=">, Group<m_Group>, Flags<[DriverOption]>;
 def mcpu_EQ : Joined<["-"], "mcpu=">, Group<m_Group>;
 def mmcu_EQ : Joined<["-"], "mmcu=">, Group<m_Group>;
 def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group<m_Group>;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to