Set perl script activation and necessary GUIX variables for HIPCC. Fix libpath to ensure standard path is not modified or overwritten. NOTE: upstream clang-*-libc-search-path.patch does NOT apply cleanly for ROCm versions based on LLVM 17. Therefore it is duplicated here. diff --git a/amd/hipcc/bin/hipcc.pl b/amd/hipcc/bin/hipcc.pl index 513a4278482c..65ecd6f9c6e1 100755 --- a/amd/hipcc/bin/hipcc.pl +++ b/amd/hipcc/bin/hipcc.pl @@ -129,8 +129,10 @@ $HIP_CLANG_PATH = $hipvars::HIP_CLANG_PATH; $CUDA_PATH = $hipvars::CUDA_PATH; $HIP_PATH = $hipvars::HIP_PATH; $ROCM_PATH = $hipvars::ROCM_PATH; +$ROCMINFO_PATH = $hipvars::ROCMINFO_PATH; $HIP_VERSION = $hipvars::HIP_VERSION; -$HIP_ROCCLR_HOME = $hipvars::HIP_ROCCLR_HOME; +$HIP_ROCCLR_HOME = $hipvars::HIP_ROCCLR_HOME; +$DEVICE_LIB_PATH = $hipvars::DEVICE_LIB_PATH; sub get_normalized_path { return $doubleQuote . $_[0] . $doubleQuote; @@ -484,7 +486,7 @@ if($HIP_PLATFORM eq "amd"){ $targetsStr = $ENV{HCC_AMDGPU_TARGET}; } elsif (not $isWindows) { # Else try using rocm_agent_enumerator - $ROCM_AGENT_ENUM = "${ROCM_PATH}/bin/rocm_agent_enumerator"; + $ROCM_AGENT_ENUM = "${ROCMINFO_PATH}/bin/rocm_agent_enumerator"; $targetsStr = `${ROCM_AGENT_ENUM} -t GPU`; $targetsStr =~ s/\n/,/g; } @@ -610,6 +612,7 @@ if ($needLDFLAGS and not $compileOnly) { $CMD .= " $HIPLDFLAGS"; } $CMD .= " $toolArgs"; +$CMD .= " --hip-path=${HIP_PATH}"; if ($verbose & 0x1) { print "hipcc-cmd: ", $CMD, "\n"; diff --git a/clang/lib/Driver/Distro.cpp b/clang/lib/Driver/Distro.cpp index e86b589a1cfb..ca702717b482 100644 --- a/clang/lib/Driver/Distro.cpp +++ b/clang/lib/Driver/Distro.cpp @@ -99,6 +99,10 @@ static Distro::DistroType DetectLsbRelease(llvm::vfs::FileSystem &VFS) { } static Distro::DistroType DetectDistro(llvm::vfs::FileSystem &VFS) { + // The compiler should always behave the same, even when used via Guix on a + // foreign distro. + return Distro::UnknownDistro; + Distro::DistroType Version = Distro::UnknownDistro; // Newer freedesktop.org's compilant systemd-based systems diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 8eb0ee0ef3c9..70271113c126 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -271,6 +271,7 @@ RocmInstallationDetector::getInstallationPathCandidates() { ROCmSearchDirs.emplace_back(D.ResourceDir, /*StrictChecking=*/true); + #if 0 ROCmSearchDirs.emplace_back(D.SysRoot + "/opt/rocm", /*StrictChecking=*/true); @@ -315,6 +316,7 @@ RocmInstallationDetector::getInstallationPathCandidates() { ROCmSearchDirs.emplace_back(D.SysRoot + "/usr", /*StrictChecking=*/true); + #endif DoPrintROCmSearchDirs(); return ROCmSearchDirs; } diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp index 2511a4e73afc..351b805681bb 100644 --- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp @@ -244,9 +244,9 @@ const char *amdgpu::dlr::getLinkCommandArgs( } // If device debugging turned on, add specially built bc files - StringRef libpath = Args.MakeArgString(C.getDriver().Dir + "/../" + LibSuffix); + StringRef libpath = Args.MakeArgString(C.getDriver().InstalledDir + "/../" + LibSuffix); std::string lib_debug_perf_path = FindDebugPerfInLibraryPath(LibSuffix); - if (!lib_debug_perf_path.empty()) + if (!lib_debug_perf_path.empty() && LibSuffix != "lib") libpath = lib_debug_perf_path; llvm::SmallVector BCLibs; diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index e4691d006848..1a6b8b4b571c 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -129,6 +129,9 @@ CudaInstallationDetector::CudaInstallationDetector( const Driver &D, const llvm::Triple &HostTriple, const llvm::opt::ArgList &Args) : D(D) { + // Don't look for CUDA in /usr + return; + struct Candidate { std::string Path; bool StrictChecking; diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 957ff0f83271..e1f782d1d1e8 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -220,6 +220,10 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) Generic_GCC::PushPPaths(PPaths); + // Comment out the distro-specific tweaks so that they don't bite when + // using Guix on a foreign distro +#if 0 + Distro Distro(D.getVFS(), Triple); if (Distro.IsAlpineLinux() || Triple.isAndroid()) { @@ -280,6 +284,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) #ifdef ENABLE_LINKER_BUILD_ID ExtraOpts.push_back("--build-id"); +#endif #endif // The selection of paths to try here is designed to match the patterns which @@ -300,7 +305,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) addPathIfExists(D, concat(SysRoot, "/usr/libo32"), Paths); } Generic_GCC::AddMultilibPaths(D, SysRoot, OSLibDir, MultiarchTriple, Paths); - +#if 0 addPathIfExists(D, concat(SysRoot, "/lib", MultiarchTriple), Paths); addPathIfExists(D, concat(SysRoot, "/lib/..", OSLibDir), Paths); @@ -329,11 +334,21 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) addPathIfExists(D, concat(SysRoot, "/", OSLibDir, ABIName), Paths); addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir, ABIName), Paths); } +#endif Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths); +#if 0 addPathIfExists(D, concat(SysRoot, "/lib"), Paths); addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); +#endif + + // Add libc's lib/ directory to the search path, so that crt1.o, crti.o, + // and friends can be found + addPathIfExists(D, "@GLIBC_LIBDIR@", Paths); + + // Add GCC's lib/ directory so libstdc++.so can be found + addPathIfExists(D, GCCInstallation.getParentLibPath(), Paths); } ToolChain::RuntimeLibType Linux::GetDefaultRuntimeLibType() const {