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, Flags<[DriverOption]>; def municode : Joined<["-"], "municode">, Group, Flags<[DriverOption]>; def mthreads : Joined<["-"], "mthreads">, Group, Flags<[DriverOption]>; +def mmsvcrt_EQ : Joined<["-"], "mmsvcrt=">, Group, Flags<[DriverOption]>; def mcpu_EQ : Joined<["-"], "mcpu=">, Group; def mmcu_EQ : Joined<["-"], "mmcu=">, Group; def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group; 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: 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"