replace hardcoded hip finder with Gentoo paths. It is not necessary to check HIP runtime each time. Author: Benda Xu Author: Yiyang Wu --- orig/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ llvm-project-rocm-4.3.0/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -165,133 +165,8 @@ bool RocmInstallationDetector::parseHIPV /// cached and populated only once. const SmallVectorImpl & RocmInstallationDetector::getInstallationPathCandidates() { - - // Return the cached candidate list if it has already been populated. - if (!ROCmSearchDirs.empty()) - return ROCmSearchDirs; - - auto DoPrintROCmSearchDirs = [&]() { - if (PrintROCmSearchDirs) - for (auto Cand : ROCmSearchDirs) { - llvm::errs() << "ROCm installation search path"; - if (Cand.isSPACK()) - llvm::errs() << " (Spack " << Cand.SPACKReleaseStr << ")"; - llvm::errs() << ": " << Cand.Path << '\n'; - } - }; - - // For candidate specified by --rocm-path we do not do strict check, i.e., - // checking existence of HIP version file and device library files. - if (!RocmPathArg.empty()) { - ROCmSearchDirs.emplace_back(RocmPathArg.str()); - DoPrintROCmSearchDirs(); - return ROCmSearchDirs; - } else if (const char *RocmPathEnv = ::getenv("ROCM_PATH")) { - if (!StringRef(RocmPathEnv).empty()) { - ROCmSearchDirs.emplace_back(RocmPathEnv); - DoPrintROCmSearchDirs(); - return ROCmSearchDirs; - } - } - - // Try to find relative to the compiler binary. - const char *InstallDir = D.getInstalledDir(); - - // Check both a normal Unix prefix position of the clang binary, as well as - // the Windows-esque layout the ROCm packages use with the host architecture - // subdirectory of bin. - auto DeduceROCmPath = [](StringRef ClangPath) { - // Strip off directory (usually bin) - StringRef ParentDir = llvm::sys::path::parent_path(ClangPath); - StringRef ParentName = llvm::sys::path::filename(ParentDir); - - // Some builds use bin/{host arch}, so go up again. - if (ParentName == "bin") { - ParentDir = llvm::sys::path::parent_path(ParentDir); - ParentName = llvm::sys::path::filename(ParentDir); - } - - // Detect ROCm packages built with SPACK. - // clang is installed at - // /llvm-amdgpu--/bin directory. - // We only consider the parent directory of llvm-amdgpu package as ROCm - // installation candidate for SPACK. - if (ParentName.startswith("llvm-amdgpu-")) { - auto SPACKPostfix = - ParentName.drop_front(strlen("llvm-amdgpu-")).split('-'); - auto SPACKReleaseStr = SPACKPostfix.first; - if (!SPACKReleaseStr.empty()) { - ParentDir = llvm::sys::path::parent_path(ParentDir); - return Candidate(ParentDir.str(), /*StrictChecking=*/true, - SPACKReleaseStr); - } - } - - // Some versions of the rocm llvm package install to /opt/rocm/llvm/bin - // Some versions of the aomp package install to /opt/rocm/aomp/bin - if (ParentName == "llvm" || ParentName.startswith("aomp")) - ParentDir = llvm::sys::path::parent_path(ParentDir); - - return Candidate(ParentDir.str(), /*StrictChecking=*/true); - }; - - // Deduce ROCm path by the path used to invoke clang. Do not resolve symbolic - // link of clang itself. - ROCmSearchDirs.emplace_back(DeduceROCmPath(InstallDir)); - - // Deduce ROCm path by the real path of the invoked clang, resolving symbolic - // link of clang itself. - llvm::SmallString<256> RealClangPath; - llvm::sys::fs::real_path(D.getClangProgramPath(), RealClangPath); - auto ParentPath = llvm::sys::path::parent_path(RealClangPath); - if (ParentPath != InstallDir) - ROCmSearchDirs.emplace_back(DeduceROCmPath(ParentPath)); - - // Device library may be installed in clang resource directory. - ROCmSearchDirs.emplace_back(D.ResourceDir, - /*StrictChecking=*/true); - - ROCmSearchDirs.emplace_back(D.SysRoot + "/opt/rocm", - /*StrictChecking=*/true); - - // Find the latest /opt/rocm-{release} directory. - std::error_code EC; - std::string LatestROCm; - llvm::VersionTuple LatestVer; - // Get ROCm version from ROCm directory name. - auto GetROCmVersion = [](StringRef DirName) { - llvm::VersionTuple V; - std::string VerStr = DirName.drop_front(strlen("rocm-")).str(); - // The ROCm directory name follows the format of - // rocm-{major}.{minor}.{subMinor}[-{build}] - std::replace(VerStr.begin(), VerStr.end(), '-', '.'); - V.tryParse(VerStr); - return V; - }; - for (llvm::vfs::directory_iterator - File = D.getVFS().dir_begin(D.SysRoot + "/opt", EC), - FileEnd; - File != FileEnd && !EC; File.increment(EC)) { - llvm::StringRef FileName = llvm::sys::path::filename(File->path()); - if (!FileName.startswith("rocm-")) - continue; - if (LatestROCm.empty()) { - LatestROCm = FileName.str(); - LatestVer = GetROCmVersion(LatestROCm); - continue; - } - auto Ver = GetROCmVersion(FileName); - if (LatestVer < Ver) { - LatestROCm = FileName.str(); - LatestVer = Ver; - } - } - if (!LatestROCm.empty()) - ROCmSearchDirs.emplace_back(D.SysRoot + "/opt/" + LatestROCm, - /*StrictChecking=*/true); - - DoPrintROCmSearchDirs(); - return ROCmSearchDirs; + ROCmSearchDirs.emplace_back(D.SysRoot + "/usr", /*StrictChecking=*/true); + return ROCmSearchDirs; } RocmInstallationDetector::RocmInstallationDetector( @@ -423,42 +298,7 @@ void RocmInstallationDetector::detectDev } void RocmInstallationDetector::detectHIPRuntime() { - SmallVector HIPSearchDirs; - if (!HIPPathArg.empty()) - HIPSearchDirs.emplace_back(HIPPathArg.str(), /*StrictChecking=*/true); - else - HIPSearchDirs.append(getInstallationPathCandidates()); - auto &FS = D.getVFS(); - - for (const auto &Candidate : HIPSearchDirs) { - InstallPath = Candidate.Path; - if (InstallPath.empty() || !FS.exists(InstallPath)) - continue; - // HIP runtime built by SPACK is installed to - // /hip-- directory. - auto SPACKPath = findSPACKPackage(Candidate, "hip"); - InstallPath = SPACKPath.empty() ? InstallPath : SPACKPath; - - BinPath = InstallPath; - llvm::sys::path::append(BinPath, "bin"); - IncludePath = InstallPath; - llvm::sys::path::append(IncludePath, "include"); - LibPath = InstallPath; - llvm::sys::path::append(LibPath, "lib"); - - llvm::ErrorOr> VersionFile = - FS.getBufferForFile(BinPath + "/.hipVersion"); - if (!VersionFile && Candidate.StrictChecking) - continue; - - if (HIPVersionArg.empty() && VersionFile) - if (parseHIPVersionFile((*VersionFile)->getBuffer())) - continue; - - HasHIPRuntime = true; - return; - } - HasHIPRuntime = false; + HasHIPRuntime = true; } void RocmInstallationDetector::print(raw_ostream &OS) const {