[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-10-07 Thread Amy Huang via Phabricator via cfe-commits
akhuang added a comment.

In D133457#3832590 , @mstorsjo wrote:

> @akhuang I noticed that 
> https://github.com/llvm/llvm-project/blob/main/clang/lib/Driver/ToolChains/MSVC.cpp#L199-L200
>  has got an explicit check for `Args.hasArg(options::OPT__SLASH_MD, 
> options::OPT__SLASH_MDd)` - I think that this would need to be amended to 
> handle these cases too - or is that inferred from here somehow?

You're right, those cases aren't being handled right now. I'll upload a patch 
for that.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-10-03 Thread Martin Storsjö via Phabricator via cfe-commits
mstorsjo added a comment.

@akhuang I noticed that 
https://github.com/llvm/llvm-project/blob/main/clang/lib/Driver/ToolChains/MSVC.cpp#L199-L200
 has got an explicit check for `Args.hasArg(options::OPT__SLASH_MD, 
options::OPT__SLASH_MDd)` - I think that this would need to be amended to 
handle these cases too - or is that inferred from here somehow?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-15 Thread Amy Huang via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfda44bedd64d: Add Clang driver flags equivalent to cls 
/MD, /MT, /MDd, /MTd. (authored by akhuang).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c

Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -10,6 +10,8 @@
 
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // CHECK-MT-NOT: "-D_DEBUG"
 // CHECK-MT: "-D_MT"
 // CHECK-MT-NOT: "-D_DLL"
@@ -19,6 +21,8 @@
 
 // RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // CHECK-MTd: "-D_DEBUG"
 // CHECK-MTd: "-D_MT"
 // CHECK-MTd-NOT: "-D_DLL"
@@ -27,6 +31,8 @@
 // CHECK-MTd: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD-NOT: "-D_DEBUG"
 // CHECK-MD: "-D_MT"
 // CHECK-MD: "-D_DLL"
@@ -34,6 +40,8 @@
 // CHECK-MD: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
 // CHECK-MDd: "-D_DEBUG"
 // CHECK-MDd: "-D_MT"
 // CHECK-MDd: "-D_DLL"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -4437,6 +4437,71 @@
   RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
 }
 
+static void ProcessVSRuntimeLibrary(const ArgList ,
+ArgStringList ) {
+  unsigned RTOptionID = options::OPT__SLASH_MT;
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,
+// but defining _DEBUG is sticky.
+RTOptionID = options::OPT__SLASH_MTd;
+
+  if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
+RTOptionID = A->getOption().getID();
+
+  if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+RTOptionID = llvm::StringSwitch(A->getValue())
+ .Case("static", options::OPT__SLASH_MT)
+ .Case("static_dbg", options::OPT__SLASH_MTd)
+ .Case("dll", options::OPT__SLASH_MD)
+ .Case("dll_dbg", options::OPT__SLASH_MDd)
+ .Default(options::OPT__SLASH_MT);
+  }
+
+  StringRef FlagForCRT;
+  switch (RTOptionID) {
+  case options::OPT__SLASH_MD:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrt";
+break;
+  case options::OPT__SLASH_MDd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrtd";
+break;
+  case options::OPT__SLASH_MT:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmt";
+break;
+  case options::OPT__SLASH_MTd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmtd";
+break;
+  default:
+llvm_unreachable("Unexpected option ID.");
+  }
+
+  if (Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");
+  } else {
+CmdArgs.push_back(FlagForCRT.data());
+
+// This provides POSIX compatibility (maps 'open' to '_open'), which most
+// users want.  The /Za flag to cl.exe turns this off, but it's not
+// implemented in clang.
+CmdArgs.push_back("--dependent-lib=oldnames");
+  }
+}
+
 void Clang::ConstructJob(Compilation , const JobAction ,
  const InputInfo , const InputInfoList ,
  const ArgList , const char *LinkingOutput) 

[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-15 Thread Amy Huang via Phabricator via cfe-commits
akhuang updated this revision to Diff 460456.
akhuang added a comment.

ran clang-format


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c

Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -10,6 +10,8 @@
 
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // CHECK-MT-NOT: "-D_DEBUG"
 // CHECK-MT: "-D_MT"
 // CHECK-MT-NOT: "-D_DLL"
@@ -19,6 +21,8 @@
 
 // RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // CHECK-MTd: "-D_DEBUG"
 // CHECK-MTd: "-D_MT"
 // CHECK-MTd-NOT: "-D_DLL"
@@ -27,6 +31,8 @@
 // CHECK-MTd: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD-NOT: "-D_DEBUG"
 // CHECK-MD: "-D_MT"
 // CHECK-MD: "-D_DLL"
@@ -34,6 +40,8 @@
 // CHECK-MD: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
 // CHECK-MDd: "-D_DEBUG"
 // CHECK-MDd: "-D_MT"
 // CHECK-MDd: "-D_DLL"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -4437,6 +4437,71 @@
   RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
 }
 
+static void ProcessVSRuntimeLibrary(const ArgList ,
+ArgStringList ) {
+  unsigned RTOptionID = options::OPT__SLASH_MT;
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,
+// but defining _DEBUG is sticky.
+RTOptionID = options::OPT__SLASH_MTd;
+
+  if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
+RTOptionID = A->getOption().getID();
+
+  if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+RTOptionID = llvm::StringSwitch(A->getValue())
+ .Case("static", options::OPT__SLASH_MT)
+ .Case("static_dbg", options::OPT__SLASH_MTd)
+ .Case("dll", options::OPT__SLASH_MD)
+ .Case("dll_dbg", options::OPT__SLASH_MDd)
+ .Default(options::OPT__SLASH_MT);
+  }
+
+  StringRef FlagForCRT;
+  switch (RTOptionID) {
+  case options::OPT__SLASH_MD:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrt";
+break;
+  case options::OPT__SLASH_MDd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrtd";
+break;
+  case options::OPT__SLASH_MT:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmt";
+break;
+  case options::OPT__SLASH_MTd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmtd";
+break;
+  default:
+llvm_unreachable("Unexpected option ID.");
+  }
+
+  if (Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");
+  } else {
+CmdArgs.push_back(FlagForCRT.data());
+
+// This provides POSIX compatibility (maps 'open' to '_open'), which most
+// users want.  The /Za flag to cl.exe turns this off, but it's not
+// implemented in clang.
+CmdArgs.push_back("--dependent-lib=oldnames");
+  }
+}
+
 void Clang::ConstructJob(Compilation , const JobAction ,
  const InputInfo , const InputInfoList ,
  const ArgList , const char *LinkingOutput) const {
@@ -6478,6 +6543,9 @@
   if (IsMSVCCompat)
 CmdArgs.push_back("-fms-compatibility");
 
+  if (Triple.isWindowsMSVCEnvironment() && !D.IsCLMode())
+

[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-15 Thread Amy Huang via Phabricator via cfe-commits
akhuang added inline comments.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4493
+
+  if (Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");

mstorsjo wrote:
> If I understand correctly, we still don't have any corresponding gcc style 
> driver flag for this? Would you consider adding that in a separate, later 
> patch?
Yep, I can add that too. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-15 Thread Martin Storsjö via Phabricator via cfe-commits
mstorsjo added a comment.

LGTM from my perspective now too.




Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4493
+
+  if (Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");

If I understand correctly, we still don't have any corresponding gcc style 
driver flag for this? Would you consider adding that in a separate, later patch?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-14 Thread Amy Huang via Phabricator via cfe-commits
akhuang updated this revision to Diff 460271.
akhuang marked 3 inline comments as done.
akhuang added a comment.

more comments


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c

Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -10,6 +10,8 @@
 
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // CHECK-MT-NOT: "-D_DEBUG"
 // CHECK-MT: "-D_MT"
 // CHECK-MT-NOT: "-D_DLL"
@@ -19,6 +21,8 @@
 
 // RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // CHECK-MTd: "-D_DEBUG"
 // CHECK-MTd: "-D_MT"
 // CHECK-MTd-NOT: "-D_DLL"
@@ -27,6 +31,8 @@
 // CHECK-MTd: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD-NOT: "-D_DEBUG"
 // CHECK-MD: "-D_MT"
 // CHECK-MD: "-D_DLL"
@@ -34,6 +40,8 @@
 // CHECK-MD: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
 // CHECK-MDd: "-D_DEBUG"
 // CHECK-MDd: "-D_MT"
 // CHECK-MDd: "-D_DLL"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -4437,6 +4437,71 @@
   RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
 }
 
+static void ProcessVSRuntimeLibrary(const ArgList ,
+ArgStringList ) {
+  unsigned RTOptionID = options::OPT__SLASH_MT;
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,
+// but defining _DEBUG is sticky.
+RTOptionID = options::OPT__SLASH_MTd;
+
+  if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
+RTOptionID = A->getOption().getID();
+
+  if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+RTOptionID = llvm::StringSwitch(A->getValue())
+  .Case("static", options::OPT__SLASH_MT)
+  .Case("static_dbg", options::OPT__SLASH_MTd)
+  .Case("dll", options::OPT__SLASH_MD)
+  .Case("dll_dbg", options::OPT__SLASH_MDd)
+  .Default(options::OPT__SLASH_MT);
+  }
+
+  StringRef FlagForCRT;
+  switch (RTOptionID) {
+  case options::OPT__SLASH_MD:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrt";
+break;
+  case options::OPT__SLASH_MDd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrtd";
+break;
+  case options::OPT__SLASH_MT:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmt";
+break;
+  case options::OPT__SLASH_MTd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmtd";
+break;
+  default:
+llvm_unreachable("Unexpected option ID.");
+  }
+
+  if (Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");
+  } else {
+CmdArgs.push_back(FlagForCRT.data());
+
+// This provides POSIX compatibility (maps 'open' to '_open'), which most
+// users want.  The /Za flag to cl.exe turns this off, but it's not
+// implemented in clang.
+CmdArgs.push_back("--dependent-lib=oldnames");
+  }
+}
+
 void Clang::ConstructJob(Compilation , const JobAction ,
  const InputInfo , const InputInfoList ,
  const ArgList , const char *LinkingOutput) const {
@@ -6478,6 +6543,9 @@
   if (IsMSVCCompat)
 CmdArgs.push_back("-fms-compatibility");
 
+  if (Triple.isWindowsMSVCEnvironment() && !D.IsCLMode())
+ProcessVSRuntimeLibrary(Args, 

[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-14 Thread Martin Storsjö via Phabricator via cfe-commits
mstorsjo added inline comments.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:6546
 
+  if (Triple.isOSWindows() && !D.IsCLMode())
+ProcessVSRuntimeLibrary(Args, CmdArgs);

Should this be `Triple.isWindowsMSVCEnvironment()`? We don't want to do this at 
least for the mingw/cygwin environments.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-14 Thread Hans Wennborg via Phabricator via cfe-commits
hans accepted this revision.
hans added a comment.
This revision is now accepted and ready to land.

lgtm, nice!




Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4452
+
+  if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+StringRef Val = A->getValue();

This could use llvm::StringSwitch



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4493
+
+  if (/*IsClangCL && */Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");

leftover IsClangCL comment?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-14 Thread Amy Huang via Phabricator via cfe-commits
akhuang updated this revision to Diff 460154.
akhuang marked an inline comment as done.
akhuang added a comment.

Address comments, more cleanup


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c

Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -10,6 +10,8 @@
 
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // CHECK-MT-NOT: "-D_DEBUG"
 // CHECK-MT: "-D_MT"
 // CHECK-MT-NOT: "-D_DLL"
@@ -19,6 +21,8 @@
 
 // RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // CHECK-MTd: "-D_DEBUG"
 // CHECK-MTd: "-D_MT"
 // CHECK-MTd-NOT: "-D_DLL"
@@ -27,6 +31,8 @@
 // CHECK-MTd: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD-NOT: "-D_DEBUG"
 // CHECK-MD: "-D_MT"
 // CHECK-MD: "-D_DLL"
@@ -34,6 +40,8 @@
 // CHECK-MD: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
 // CHECK-MDd: "-D_DEBUG"
 // CHECK-MDd: "-D_MT"
 // CHECK-MDd: "-D_DLL"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -4437,6 +4437,71 @@
   RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
 }
 
+static void ProcessVSRuntimeLibrary(const ArgList ,
+ArgStringList ) {
+  unsigned RTOptionID = options::OPT__SLASH_MT;
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,
+// but defining _DEBUG is sticky.
+RTOptionID = options::OPT__SLASH_MTd;
+
+  if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
+RTOptionID = A->getOption().getID();
+
+  if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+StringRef Val = A->getValue();
+if (Val == "static")  RTOptionID = options::OPT__SLASH_MT;
+else if (Val == "static_dbg") RTOptionID = options::OPT__SLASH_MTd;
+else if (Val == "dll")RTOptionID = options::OPT__SLASH_MD;
+else if (Val == "dll_dbg")RTOptionID = options::OPT__SLASH_MDd;
+else llvm_unreachable("Unexpected option ID.");
+  }
+
+  StringRef FlagForCRT;
+  switch (RTOptionID) {
+  case options::OPT__SLASH_MD:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrt";
+break;
+  case options::OPT__SLASH_MDd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrtd";
+break;
+  case options::OPT__SLASH_MT:
+if (Args.hasArg(options::OPT__SLASH_LDd))
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmt";
+break;
+  case options::OPT__SLASH_MTd:
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmtd";
+break;
+  default:
+llvm_unreachable("Unexpected option ID.");
+  }
+
+  if (/*IsClangCL && */Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");
+  } else {
+CmdArgs.push_back(FlagForCRT.data());
+
+// This provides POSIX compatibility (maps 'open' to '_open'), which most
+// users want.  The /Za flag to cl.exe turns this off, but it's not
+// implemented in clang.
+CmdArgs.push_back("--dependent-lib=oldnames");
+  }
+}
+
 void Clang::ConstructJob(Compilation , const JobAction ,
  const InputInfo , const InputInfoList ,
  const ArgList , const char *LinkingOutput) const {
@@ -6478,6 +6543,9 @@
   if (IsMSVCCompat)
 

[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-14 Thread Amy Huang via Phabricator via cfe-commits
akhuang marked 3 inline comments as done.
akhuang added inline comments.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4442
+bool IsClangCL) {
+  unsigned RTOptionID = 0; // MT=0, MTd=1, MD=2, MDd=3
+  bool HasLDdFlag = IsClangCL && Args.hasArg(options::OPT__SLASH_LDd);

hans wrote:
> Could this be an enum, or reuse existing values like the /Mx option ids?
Oh, right, resuing the options::OPT__SLASH_ flags makes more sense.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4461
+  } else {
+if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  StringRef Val = A->getValue();

hans wrote:
> Is there a getLastArg() variant that allows getting the last argument of 
> either the /Mx options or -fms-runtime-lib, so we don't need to check 
> IsClangCL?
Actually, I think I can just remove the IsClangCL option since this function 
now runs either in `AddClangCLArgs` or under `!IsCLMode()`. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-13 Thread Hans Wennborg via Phabricator via cfe-commits
hans added inline comments.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4442
+bool IsClangCL) {
+  unsigned RTOptionID = 0; // MT=0, MTd=1, MD=2, MDd=3
+  bool HasLDdFlag = IsClangCL && Args.hasArg(options::OPT__SLASH_LDd);

Could this be an enum, or reuse existing values like the /Mx option ids?



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4443
+  unsigned RTOptionID = 0; // MT=0, MTd=1, MD=2, MDd=3
+  bool HasLDdFlag = IsClangCL && Args.hasArg(options::OPT__SLASH_LDd);
+

The `IsClangCL &&` part seems redundant?



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4445
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,

Should this use HasLDdFlag?



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:4461
+  } else {
+if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  StringRef Val = A->getValue();

Is there a getLastArg() variant that allows getting the last argument of either 
the /Mx options or -fms-runtime-lib, so we don't need to check IsClangCL?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-12 Thread Amy Huang via Phabricator via cfe-commits
akhuang added inline comments.



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:6480
 
+  // Process Windows runtime flags (equivalent to cl flags /MD, /MDd, /MT, 
/MTd)
+  if (Triple.isOSWindows()) {

hans wrote:
> Could we somehow re-use the logic in Clang::AddClangCLArgs()? Perhaps the 
> main switch from that could be extracted to a function that could be called 
> from here?
Put it in a separate function; I guess it's a bit messy as some clang-cl flags 
aren't implemented for clang.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-12 Thread Amy Huang via Phabricator via cfe-commits
akhuang updated this revision to Diff 459577.
akhuang marked 2 inline comments as done.
akhuang added a comment.

Clean up test, add doc brief to new flag, try to put the flag logic in a 
separate function


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c

Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -10,6 +10,8 @@
 
 // RUN: %clang_cl -### -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // RUN: %clang_cl -### /MT -- %s 2>&1 | FileCheck -check-prefix=CHECK-MT %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MT %s
 // CHECK-MT-NOT: "-D_DEBUG"
 // CHECK-MT: "-D_MT"
 // CHECK-MT-NOT: "-D_DLL"
@@ -19,6 +21,8 @@
 
 // RUN: %clang_cl -### /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // RUN: %clang_cl -### /LD /MTd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTd %s
 // CHECK-MTd: "-D_DEBUG"
 // CHECK-MTd: "-D_MT"
 // CHECK-MTd-NOT: "-D_DLL"
@@ -27,6 +31,8 @@
 // CHECK-MTd: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MD %s
 // CHECK-MD-NOT: "-D_DEBUG"
 // CHECK-MD: "-D_MT"
 // CHECK-MD: "-D_DLL"
@@ -34,6 +40,8 @@
 // CHECK-MD: "--dependent-lib=oldnames"
 
 // RUN: %clang_cl -### /MDd -- %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-MDd %s
 // CHECK-MDd: "-D_DEBUG"
 // CHECK-MDd: "-D_MT"
 // CHECK-MDd: "-D_DLL"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -4436,6 +4436,82 @@
   RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC);
 }
 
+static void ProcessVSRuntimeLibrary(const ArgList ,
+ArgStringList ,
+bool IsClangCL) {
+  unsigned RTOptionID = 0; // MT=0, MTd=1, MD=2, MDd=3
+  bool HasLDdFlag = IsClangCL && Args.hasArg(options::OPT__SLASH_LDd);
+
+  if (Args.hasArg(options::OPT__SLASH_LDd))
+// The /LDd option implies /MTd. The dependent lib part can be overridden,
+// but defining _DEBUG is sticky.
+RTOptionID = 1; // options::OPT__SLASH_MTd;
+
+  if (IsClangCL) {
+if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) {
+  switch (A->getOption().getID()) {
+  case options::OPT__SLASH_MT:  RTOptionID = 0; break;
+  case options::OPT__SLASH_MTd: RTOptionID = 1; break;
+  case options::OPT__SLASH_MD:  RTOptionID = 2; break;
+  case options::OPT__SLASH_MDd: RTOptionID = 3; break;
+  default: llvm_unreachable("Unexpected option ID.");
+  }
+}
+  } else {
+if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  StringRef Val = A->getValue();
+  if (Val == "static")  RTOptionID = 0;
+  else if (Val == "static_dbg") RTOptionID = 1;
+  else if (Val == "dll")RTOptionID = 2;
+  else if (Val == "dll_dbg")RTOptionID = 3;
+  else llvm_unreachable("Unexpected option ID.");
+}
+  }
+
+  StringRef FlagForCRT;
+  switch (RTOptionID) {
+  case 2:  // MD
+if (HasLDdFlag)
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrt";
+break;
+  case 3:  // MDd
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+FlagForCRT = "--dependent-lib=msvcrtd";
+break;
+  case 0:  // MT
+if (HasLDdFlag)
+  CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmt";
+break;
+  case 1:  // MTd
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+FlagForCRT = "--dependent-lib=libcmtd";
+break;
+  default:
+llvm_unreachable("Unexpected option ID.");
+  }
+
+  if (IsClangCL && Args.hasArg(options::OPT__SLASH_Zl)) {
+CmdArgs.push_back("-D_VC_NODEFAULTLIB");
+  } else {
+CmdArgs.push_back(FlagForCRT.data());
+
+// This provides POSIX compatibility (maps 'open' to '_open'), which most
+// users want.  The /Za flag to cl.exe turns this off, 

[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd.

2022-09-09 Thread Hans Wennborg via Phabricator via cfe-commits
hans added inline comments.



Comment at: clang/include/clang/Driver/Options.td:2209
+def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
+  Flags<[NoXarchOption, CoreOption]>, HelpText<"Select Windows run-time 
library">;
 defm delayed_template_parsing : BoolFOption<"delayed-template-parsing",

Could this also list the allowed options? And maybe it could also have a 
DocBrief that explains how to use it?



Comment at: clang/lib/Driver/ToolChains/Clang.cpp:6480
 
+  // Process Windows runtime flags (equivalent to cl flags /MD, /MDd, /MT, 
/MTd)
+  if (Triple.isOSWindows()) {

Could we somehow re-use the logic in Clang::AddClangCLArgs()? Perhaps the main 
switch from that could be extracted to a function that could be called from 
here?



Comment at: clang/test/Driver/cl-runtime-flags.c:99
+
+// Check for clang versions of the /MD and /MT flags.
+

If we want these to behave as the /MD and /MT flags, maybe we can re-use the 
tests for those, so e.g. we'd do:


```
// RUN: %clang_cl -### /MD -- %s 2>&1 | FileCheck -check-prefix=CHECK-MD %s
// RUN: %clang -### -target ... -fms-runtime-lib=dll -- %s 2>&1 | FileCheck 
-check-prefix=CHECK-MD %s
// CHECK-MD-NOT: "-D_DEBUG"
// CHECK-MD: "-D_MT"
// CHECK-MD: "-D_DLL"
...
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133457/new/

https://reviews.llvm.org/D133457

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D133457: Add Clang driver flags equivalent to cl's /MD, /MT, /MDd, /MTd. This will allow selecting the MS C runtime library without having to use cc1 flags.

2022-09-07 Thread Amy Huang via Phabricator via cfe-commits
akhuang created this revision.
Herald added a project: All.
akhuang requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D133457

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-runtime-flags.c


Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -95,3 +95,39 @@
 // CHECK-MTZl-SAME: "-D_VC_NODEFAULTLIB"
 // CHECK-MTZl-NOT: "--dependent-lib=libcmt"
 // CHECK-MTZl-NOT: "--dependent-lib=oldnames"
+
+// Check for clang versions of the /MD and /MT flags.
+
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static -- %s 
\
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-CLANG-STATIC %s
+// CHECK-CLANG-STATIC-NOT: "-D_DEBUG"
+// CHECK-CLANG-STATIC: "-D_MT"
+// CHECK-CLANG-STATIC-NOT: "-D_DLL"
+// CHECK-CLANG-STATIC: "-flto-visibility-public-std"
+// CHECK-CLANG-STATIC: "--dependent-lib=libcmt"
+// CHECK-CLANG-STATIC: "--dependent-lib=oldnames"
+
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static_dbg \
+// RUN:   -- %s 2>&1 | FileCheck -check-prefix=CHECK-CLANG-STATIC-DBG %s
+// CHECK-CLANG-STATIC-DBG: "-D_DEBUG"
+// CHECK-CLANG-STATIC-DBG: "-D_MT"
+// CHECK-CLANG-STATIC-DBG-NOT: "-D_DLL"
+// CHECK-CLANG-STATIC-DBG: "-flto-visibility-public-std"
+// CHECK-CLANG-STATIC-DBG: "--dependent-lib=libcmtd"
+// CHECK-CLANG-STATIC-DBG: "--dependent-lib=oldnames"
+
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-CLANG-DLL %s
+// CHECK-CLANG-DLL-NOT: "-D_DEBUG"
+// CHECK-CLANG-DLL: "-D_MT"
+// CHECK-CLANG-DLL: "-D_DLL"
+// CHECK-CLANG-DLL: "--dependent-lib=msvcrt"
+// CHECK-CLANG-DLL: "--dependent-lib=oldnames"
+
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=dll_dbg -- \
+// RUN:   %s 2>&1 | FileCheck -check-prefix=CHECK-CLANG-DLL-DBG %s
+// CHECK-CLANG-DLL-DBG: "-D_DEBUG"
+// CHECK-CLANG-DLL-DBG: "-D_MT"
+// CHECK-CLANG-DLL-DBG: "-D_DLL"
+// CHECK-CLANG-DLL-DBG: "--dependent-lib=msvcrtd"
+// CHECK-CLANG-DLL-DBG: "--dependent-lib=oldnames"
Index: clang/lib/Driver/ToolChains/Clang.cpp
===
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -6477,6 +6477,35 @@
   if (IsMSVCCompat)
 CmdArgs.push_back("-fms-compatibility");
 
+  // Process Windows runtime flags (equivalent to cl flags /MD, /MDd, /MT, 
/MTd)
+  if (Triple.isOSWindows()) {
+if (Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+  StringRef Val = A->getValue();
+  if (Val == "dll") {
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+CmdArgs.push_back("--dependent-lib=msvcrt");
+  } else if (Val == "dll_dbg") {
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-D_DLL");
+CmdArgs.push_back("--dependent-lib=msvcrtd");
+  } else if (Val == "static") {
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+CmdArgs.push_back("--dependent-lib=libcmt");
+  } else if (Val == "static_dbg") {
+CmdArgs.push_back("-D_DEBUG");
+CmdArgs.push_back("-D_MT");
+CmdArgs.push_back("-flto-visibility-public-std");
+CmdArgs.push_back("--dependent-lib=libcmtd");
+  } else {
+D.Diag(diag::err_drv_invalid_value) << A->getSpelling() << Val;
+  }
+  CmdArgs.push_back("--dependent-lib=oldnames");
+}
+  }
+
   // Handle -fgcc-version, if present.
   VersionTuple GNUCVer;
   if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
Index: clang/include/clang/Driver/Options.td
===
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -2205,6 +2205,8 @@
   HelpText<"Dot-separated value representing the Microsoft compiler "
"version number to report in _MSC_VER (0 = don't define it "
"(default))">;
+def fms_runtime_lib_EQ : Joined<["-"], "fms-runtime-lib=">, Group,
+  Flags<[NoXarchOption, CoreOption]>, HelpText<"Select Windows run-time 
library">;
 defm delayed_template_parsing : BoolFOption<"delayed-template-parsing",
   LangOpts<"DelayedTemplateParsing">, DefaultFalse,
   PosFlag,


Index: clang/test/Driver/cl-runtime-flags.c
===
--- clang/test/Driver/cl-runtime-flags.c
+++ clang/test/Driver/cl-runtime-flags.c
@@ -95,3 +95,39 @@
 // CHECK-MTZl-SAME: "-D_VC_NODEFAULTLIB"
 // CHECK-MTZl-NOT: "--dependent-lib=libcmt"
 // CHECK-MTZl-NOT: "--dependent-lib=oldnames"
+
+// Check for clang versions of the