You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/sys-devel/llvm-roc/files/llvm-roc-4.3.0-hip-location...

190 lines
7.0 KiB

replace hardcoded hip finder with Gentoo paths.
It is not necessary to check HIP runtime each time.
Author: Benda Xu <heroxbd@gentoo.org>
Author: Yiyang Wu <xgreenlandforwyy@gmail.com>
--- 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::Candidate> &
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
- // <rocm_root>/llvm-amdgpu-<rocm_release_string>-<hash>/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<Candidate, 4> 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
- // <rocm_root>/hip-<rocm_release_string>-<hash> 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<std::unique_ptr<llvm::MemoryBuffer>> 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 {