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.
190 lines
7.0 KiB
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 {
|