https://github.com/jhuber6 created 
https://github.com/llvm/llvm-project/pull/200212

Summary:
This was pushed to a follow-up, and I think the previous has lingered
long enough to expand this to Windows. the per-target runtime directory
this uses is default-off, but nothing stops us from just providing this.
The interest in this is for ROCm builds on Windows to be able to provide
asan / debug builds the same way on Linux.


>From 152e1f50d9b6a1d513658072c5bdd7b70a7f92db Mon Sep 17 00:00:00 2001
From: Joseph Huber <[email protected]>
Date: Thu, 28 May 2026 10:55:53 -0500
Subject: [PATCH] [Clang] Support multilibs on Windows

Summary:
This was pushed to a follow-up, and I think the previous has lingered
long enough to expand this to Windows. the per-target runtime directory
this uses is default-off, but nothing stops us from just providing this.
The interest in this is for ROCm builds on Windows to be able to provide
asan / debug builds the same way on Linux.
---
 clang/lib/Driver/ToolChains/MSVC.cpp          | 14 ++++
 .../Inputs/multilib_msvc_tree/bin/.keep       |  0
 .../include/x86_64-pc-windows-msvc/.keep      |  0
 .../x86_64-pc-windows-msvc/debug/.keep        |  0
 .../x86_64-pc-windows-msvc/noexcept/.keep     |  0
 .../x86_64-pc-windows-msvc/release/.keep      |  0
 clang/test/Driver/msvc-multilib.yaml          | 81 +++++++++++++++++++
 7 files changed, 95 insertions(+)
 create mode 100644 clang/test/Driver/Inputs/multilib_msvc_tree/bin/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/debug/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/noexcept/.keep
 create mode 100644 
clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/release/.keep
 create mode 100644 clang/test/Driver/msvc-multilib.yaml

diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index f0cb01058e9c9..d7486ddeef09e 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -523,6 +523,8 @@ MSVCToolChain::MSVCToolChain(const Driver &D, const 
llvm::Triple &Triple,
       llvm::findVCToolChainViaSetupConfig(getVFS(), VCToolsVersion,
                                           VCToolChainPath, VSLayout) ||
       llvm::findVCToolChainViaRegistry(VCToolChainPath, VSLayout);
+
+  loadMultilibsFromYAML(Args, D);
 }
 
 Tool *MSVCToolChain::buildLinker() const {
@@ -767,6 +769,18 @@ void MSVCToolChain::AddClangSystemIncludeArgs(const 
ArgList &DriverArgs,
   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
     return;
 
+  // Add multilib variant include paths in priority order.
+  for (const Multilib &M : getOrderedMultilibs()) {
+    if (M.isDefault())
+      continue;
+    if (std::optional<std::string> StdlibIncDir = getStdlibIncludePath()) {
+      SmallString<128> Dir(*StdlibIncDir);
+      llvm::sys::path::append(Dir, M.includeSuffix());
+      if (getDriver().getVFS().exists(Dir))
+        addSystemInclude(DriverArgs, CC1Args, Dir);
+    }
+  }
+
   // Honor %INCLUDE% and %EXTERNAL_INCLUDE%. It should have essential search
   // paths set by vcvarsall.bat. Skip if the user expressly set any of the
   // Windows SDK or VC Tools options.
diff --git a/clang/test/Driver/Inputs/multilib_msvc_tree/bin/.keep 
b/clang/test/Driver/Inputs/multilib_msvc_tree/bin/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/.keep
 
b/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/debug/.keep
 
b/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/debug/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/noexcept/.keep
 
b/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/noexcept/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git 
a/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/release/.keep
 
b/clang/test/Driver/Inputs/multilib_msvc_tree/include/x86_64-pc-windows-msvc/release/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/msvc-multilib.yaml 
b/clang/test/Driver/msvc-multilib.yaml
new file mode 100644
index 0000000000000..34ac47149b19b
--- /dev/null
+++ b/clang/test/Driver/msvc-multilib.yaml
@@ -0,0 +1,81 @@
+# Basic selection where -fmultilib-flag=debug selects the debug variant.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x c %s -### -o 
/dev/null 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc -fmultilib-flag=debug \
+# RUN:     -ccc-install-dir %S/Inputs/multilib_msvc_tree/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-DEBUG %s
+# CHECK-DEBUG:      "-cc1" "-triple" "x86_64-pc-windows-msvc
+# CHECK-DEBUG:      "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/debug"
+
+# Default behavior where no variant path is prepended.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x c %s -### -o 
/dev/null 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc \
+# RUN:     -ccc-install-dir %S/Inputs/multilib_msvc_tree/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-DEFAULT %s
+# CHECK-DEFAULT-NOT: "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/debug"
+# CHECK-DEFAULT-NOT: "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/release"
+# CHECK-DEFAULT-NOT: "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/noexcept"
+
+# Multiple matches stacking on top of each-other.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -x c %s -### -o 
/dev/null 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc -fmultilib-flag=debug 
-fno-exceptions \
+# RUN:     -ccc-install-dir %S/Inputs/multilib_msvc_tree/bin \
+# RUN:   | FileCheck --check-prefix=CHECK-LAYERED %s
+# CHECK-LAYERED:      "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/noexcept"
+# CHECK-LAYERED-SAME: "-internal-isystem" 
"{{[^"]*}}{{[/\\]}}x86_64-pc-windows-msvc/debug"
+
+# Lists selected variant directories.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes 
-print-multi-directory 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc -fmultilib-flag=debug \
+# RUN:   | FileCheck --check-prefix=CHECK-PRINT-DIR %s
+# CHECK-PRINT-DIR: debug
+
+# Lists all non-default variants with flags.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes -print-multi-lib 
2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc \
+# RUN:   | FileCheck --check-prefix=CHECK-PRINT-LIB %s
+# CHECK-PRINT-LIB: debug;@fmultilib-flag=debug
+# CHECK-PRINT-LIB: release;@fmultilib-flag=release
+# CHECK-PRINT-LIB: noexcept;@fno-exceptions
+
+# Error emitted when custom flag value is invalid.
+# RUN: not %clang --multi-lib-config=%s -no-canonical-prefixes -x c %s -### -o 
/dev/null 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc -fmultilib-flag=nonexistent \
+# RUN:   | FileCheck --check-prefix=CHECK-NOMATCH %s
+# CHECK-NOMATCH: error: unsupported option '-fmultilib-flag=nonexistent'
+
+# Check exclusivity so that only one of debug/release selected.
+# RUN: %clang --multi-lib-config=%s -no-canonical-prefixes 
-print-multi-directory 2>&1 \
+# RUN:     --target=x86_64-pc-windows-msvc -fmultilib-flag=release \
+# RUN:   | FileCheck --check-prefix=CHECK-EXCLUSIVE %s
+# CHECK-EXCLUSIVE:     release
+# CHECK-EXCLUSIVE-NOT: debug
+
+---
+MultilibVersion: 1.0
+
+Groups:
+- Name: build-type
+  Type: Exclusive
+
+Variants:
+- Dir: .
+  Flags: []
+- Dir: debug
+  Flags: [-fmultilib-flag=debug]
+  Group: build-type
+- Dir: release
+  Flags: [-fmultilib-flag=release]
+  Group: build-type
+- Dir: noexcept
+  Flags: [-fno-exceptions]
+
+Mappings: []
+
+Flags:
+- Name: build-type
+  Values:
+  - Name: none
+  - Name: debug
+  - Name: release
+  Default: none
+...

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

Reply via email to