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
