diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 2c85d21ebd738..54b7cc261437b 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -306,23 +306,25 @@ RocmInstallationDetector::getInstallationPathCandidates() { LatestVer = Ver; } } - if (!LatestROCm.empty()) - ROCmSearchDirs.emplace_back(D.SysRoot + "/opt/" + LatestROCm, - /*StrictChecking=*/true); + if (!isHostWindows()) { + if (!LatestROCm.empty()) + ROCmSearchDirs.emplace_back(D.SysRoot + "/opt/" + LatestROCm, + /*StrictChecking=*/true); - ROCmSearchDirs.emplace_back(D.SysRoot + "/usr/local", - /*StrictChecking=*/true); - ROCmSearchDirs.emplace_back(D.SysRoot + "/usr", - /*StrictChecking=*/true); + ROCmSearchDirs.emplace_back(D.SysRoot + "/usr/local", + /*StrictChecking=*/true); + ROCmSearchDirs.emplace_back(D.SysRoot + "/usr", + /*StrictChecking=*/true); + } DoPrintROCmSearchDirs(); return ROCmSearchDirs; } RocmInstallationDetector::RocmInstallationDetector( - const Driver &D, const llvm::Triple &HostTriple, + const Driver &D, const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args, bool DetectHIPRuntime, bool DetectDeviceLib) - : D(D) { + : D(D), TargetTriple(TargetTriple) { Verbose = Args.hasArg(options::OPT_v); RocmPathArg = Args.getLastArgValue(clang::driver::options::OPT_rocm_path_EQ); PrintROCmSearchDirs = @@ -835,8 +837,10 @@ bool AMDGPUToolChain::isWave64(const llvm::opt::ArgList &DriverArgs, /// ROCM Toolchain ROCMToolChain::ROCMToolChain(const Driver &D, const llvm::Triple &Triple, - const ArgList &Args) + const ArgList &Args, bool isHostTCMSVC) : AMDGPUToolChain(D, Triple, Args) { + RocmInstallation->setHostWindows(isHostTCMSVC); + RocmInstallation->detectDeviceLibrary(); } diff --git a/clang/lib/Driver/ToolChains/AMDGPU.h b/clang/lib/Driver/ToolChains/AMDGPU.h index a9b4552a1f91a..73409a725a7a3 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.h +++ b/clang/lib/Driver/ToolChains/AMDGPU.h @@ -135,7 +135,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUToolChain : public Generic_ELF { class LLVM_LIBRARY_VISIBILITY ROCMToolChain : public AMDGPUToolChain { public: ROCMToolChain(const Driver &D, const llvm::Triple &Triple, - const llvm::opt::ArgList &Args); + const llvm::opt::ArgList &Args, bool isHostTCMSVC=false); void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index bae05cc0bb735..4c2ca949f868c 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -213,7 +213,7 @@ void AMDGCN::Linker::ConstructJob(Compilation &C, const JobAction &JA, HIPAMDToolChain::HIPAMDToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const ArgList &Args) - : ROCMToolChain(D, Triple, Args), HostTC(HostTC) { + : ROCMToolChain(D, Triple, Args, HostTC.getTriple().isWindowsMSVCEnvironment()), HostTC(HostTC) { // Lookup binaries into the driver directory, this is used to // discover the clang-offload-bundler executable. getProgramPaths().push_back(getDriver().Dir); diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 80799d1e715f0..b683682ad30a9 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -425,6 +425,9 @@ MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) { + + RocmInstallation->setHostWindows(true); + getProgramPaths().push_back(getDriver().Dir); std::optional VCToolsDir, VCToolsVersion; @@ -450,6 +453,7 @@ MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple, llvm::findVCToolChainViaSetupConfig(getVFS(), VCToolsVersion, VCToolChainPath, VSLayout) || llvm::findVCToolChainViaRegistry(VCToolChainPath, VSLayout); + } Tool *MSVCToolChain::buildLinker() const { diff --git a/clang/lib/Driver/ToolChains/ROCm.h b/clang/lib/Driver/ToolChains/ROCm.h index dceb0ab036693..d766422396135 100644 --- a/clang/lib/Driver/ToolChains/ROCm.h +++ b/clang/lib/Driver/ToolChains/ROCm.h @@ -80,6 +80,7 @@ class RocmInstallationDetector { bool HasHIPStdParLibrary = false; bool HasRocThrustLibrary = false; bool HasRocPrimLibrary = false; + bool IsHostMSVC = false; // Default version if not detected or specified. const unsigned DefaultVersionMajor = 3; @@ -111,6 +112,8 @@ class RocmInstallationDetector { // Wheter -nogpulib is specified. bool NoBuiltinLibs = false; + llvm::Triple TargetTriple; + // Paths SmallString<0> InstallPath; SmallString<0> BinPath; @@ -166,7 +169,7 @@ class RocmInstallationDetector { StringRef PackageName); public: - RocmInstallationDetector(const Driver &D, const llvm::Triple &HostTriple, + RocmInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args, bool DetectHIPRuntime = true, bool DetectDeviceLib = false); @@ -193,6 +196,10 @@ class RocmInstallationDetector { /// Check whether we detected a valid HIP STDPAR Acceleration library. bool hasHIPStdParLibrary() const { return HasHIPStdParLibrary; } + /// Check whether the target triple is for Windows. + bool isHostWindows() const { return IsHostMSVC; } + void setHostWindows(bool val) { IsHostMSVC=val; } + /// Print information about the detected ROCm installation. void print(raw_ostream &OS) const; diff --git a/clang/test/Driver/rocm-detect-windows.hip b/clang/test/Driver/rocm-detect-windows.hip new file mode 100644 index 0000000000000..d37a708e80b4f --- /dev/null +++ b/clang/test/Driver/rocm-detect-windows.hip @@ -0,0 +1,9 @@ +// REQUIRES: system-windows + +// Test to ensure that on Windows, we do not include linux sesrch paths +// RUN: %clang -### -nogpulib -nogpuinc \ +// RUN: --print-rocm-search-dirs %s 2>&1 \ +// RUN: | FileCheck %s + +// CHECK-NOT: ROCm installation search path: {{/usr/local}} +// CHECK-NOT: ROCm installation search path: {{/usr}}