llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-driver

Author: Petr Hosek (petrhosek)

<details>
<summary>Changes</summary>

Guard FlagForCRT against being empty in ProcessVSRuntimeLibrary, run
ProcessVSRuntimeLibrary when -fms-omit-default-lib is passed in non-CL
MSVC mode, and select the matching CRT library (-defaultlib:msvcrt,
msvcrtd, libcmt, libcmtd) or omit default libraries when -nodefaultlibs
or -fms-omit-default-lib is specified.


---
Full diff: https://github.com/llvm/llvm-project/pull/238235.diff


4 Files Affected:

- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+4-2) 
- (modified) clang/lib/Driver/ToolChains/MSVC.cpp (+14-2) 
- (modified) clang/test/Driver/cl-runtime-flags.c (+2) 
- (modified) clang/test/Driver/msvc-link.c (+18) 


``````````diff
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index df6022c204425b..72e44c293986e0 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5149,7 +5149,8 @@ static void ProcessVSRuntimeLibrary(const ToolChain &TC, 
const ArgList &Args,
   if (Args.hasArg(options::OPT_fms_omit_default_lib)) {
     CmdArgs.push_back("-D_VC_NODEFAULTLIB");
   } else {
-    CmdArgs.push_back(FlagForCRT.data());
+    if (!FlagForCRT.empty())
+      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
@@ -7669,7 +7670,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
     CmdArgs.push_back(MSAnonOpt);
 
   if (Triple.isWindowsMSVCEnvironment() && !D.IsCLMode() &&
-      Args.hasArg(options::OPT_fms_runtime_lib_EQ))
+      Args.hasArg(options::OPT_fms_runtime_lib_EQ,
+                  options::OPT_fms_omit_default_lib))
     ProcessVSRuntimeLibrary(getToolChain(), Args, CmdArgs);
 
   // Handle -fgcc-version, if present.
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index 25ea64a4ba5055..db4327acb1edd5 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -122,8 +122,20 @@ void visualstudio::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
       !C.getDriver().IsCLMode() && !C.getDriver().IsFlangMode()) {
-    CmdArgs.push_back("-defaultlib:libcmt");
-    CmdArgs.push_back("-defaultlib:oldnames");
+    if (!Args.hasArg(options::OPT_nodefaultlibs,
+                     options::OPT_fms_omit_default_lib)) {
+      StringRef CRT = "libcmt";
+      if (const Arg *A = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
+        CRT = llvm::StringSwitch<StringRef>(A->getValue())
+                  .Case("dll", "msvcrt")
+                  .Case("dll_dbg", "msvcrtd")
+                  .Case("static", "libcmt")
+                  .Case("static_dbg", "libcmtd")
+                  .Default("libcmt");
+      }
+      CmdArgs.push_back(Args.MakeArgString("-defaultlib:" + CRT));
+      CmdArgs.push_back("-defaultlib:oldnames");
+    }
 
     // SYCL: Add runtime library for clang (non-clang-cl) with MSVC target.
     // For clang-cl, --dependent-lib is used at compiler stage instead.
diff --git a/clang/test/Driver/cl-runtime-flags.c 
b/clang/test/Driver/cl-runtime-flags.c
index 2a6151e08c046f..ca807e81f94dd3 100644
--- a/clang/test/Driver/cl-runtime-flags.c
+++ b/clang/test/Driver/cl-runtime-flags.c
@@ -97,6 +97,8 @@
 
 // RUN: %clang_cl -### /Zl -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTZl %s
 // RUN: %clang_cl -### /MT /Zl -- %s 2>&1 | FileCheck -check-prefix=CHECK-MTZl 
%s
+// RUN: %clang -### --target=x86_64-windows-msvc -fms-omit-default-lib -- %s \
+// RUN:   2>&1 | FileCheck -check-prefix=CHECK-MTZl %s
 // RUN: %clang -### --target=x86_64-windows-msvc -fms-runtime-lib=static \
 // RUN:   -fms-omit-default-lib -- %s 2>&1 | FileCheck \
 // RUN:   -check-prefix=CHECK-MTZl %s
diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index fc7a18014da735..0424ff99dd0aa4 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -14,6 +14,24 @@
 // DLL-SAME: "-defaultlib:libcmt" "-defaultlib:oldnames"
 // DLL-SAME: "-nologo" "-dll"
 
+// RUN: %clang --target=i686-pc-windows-msvc -fms-runtime-lib=dll 
-fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=RUNTIME-DLL %s
+// RUNTIME-DLL:      link.exe"
+// RUNTIME-DLL-SAME: "-defaultlib:msvcrt" "-defaultlib:oldnames"
+
+// RUN: %clang --target=i686-pc-windows-msvc -fms-runtime-lib=dll_dbg 
-fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=RUNTIME-DLL-DBG %s
+// RUNTIME-DLL-DBG:      link.exe"
+// RUNTIME-DLL-DBG-SAME: "-defaultlib:msvcrtd" "-defaultlib:oldnames"
+
+// RUN: %clang --target=i686-pc-windows-msvc -fms-runtime-lib=static_dbg 
-fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=RUNTIME-STATIC-DBG %s
+// RUNTIME-STATIC-DBG:      link.exe"
+// RUNTIME-STATIC-DBG-SAME: "-defaultlib:libcmtd" "-defaultlib:oldnames"
+
+// RUN: %clang --target=i686-pc-windows-msvc -nodefaultlibs -fuse-ld=link -### 
%s 2>&1 | FileCheck --check-prefix=NODEFAULTLIBS %s
+// RUN: %clang --target=i686-pc-windows-msvc -fms-omit-default-lib 
-fuse-ld=link -### %s 2>&1 | FileCheck --check-prefix=NODEFAULTLIBS %s
+// NODEFAULTLIBS:     link.exe"
+// NODEFAULTLIBS-NOT: "-defaultlib:
+
+
 // RUN: %clang_cl /Brepro -fuse-ld=link -### -- %s 2>&1 | FileCheck 
--check-prefix=REPRO %s
 // REPRO:      link.exe"
 // REPRO-SAME: "-out:msvc-link.exe"

``````````

</details>


https://github.com/llvm/llvm-project/pull/238235
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to