forked from OSchip/llvm-project
[CUDA,HIP] Use VFS for SDK detection.
It's useful for using clang from tools that may need need to provide SDK files from non-standard locations. Clang CLI only provides a way to specify VFS for include files, so there's no good way to test this yet. Differential Revision: https://reviews.llvm.org/D81771
This commit is contained in:
parent
7df80e3f23
commit
d700237f1a
|
@ -27,7 +27,9 @@ void RocmInstallationDetector::scanLibDevicePath() {
|
||||||
const StringRef Suffix(".bc");
|
const StringRef Suffix(".bc");
|
||||||
|
|
||||||
std::error_code EC;
|
std::error_code EC;
|
||||||
for (llvm::sys::fs::directory_iterator LI(LibDevicePath, EC), LE;
|
for (llvm::vfs::directory_iterator
|
||||||
|
LI = D.getVFS().dir_begin(LibDevicePath, EC),
|
||||||
|
LE;
|
||||||
!EC && LI != LE; LI = LI.increment(EC)) {
|
!EC && LI != LE; LI = LI.increment(EC)) {
|
||||||
StringRef FilePath = LI->path();
|
StringRef FilePath = LI->path();
|
||||||
StringRef FileName = llvm::sys::path::filename(FilePath);
|
StringRef FileName = llvm::sys::path::filename(FilePath);
|
||||||
|
@ -137,11 +139,12 @@ RocmInstallationDetector::RocmInstallationDetector(
|
||||||
LibDevicePath = LibPathEnv;
|
LibDevicePath = LibPathEnv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto &FS = D.getVFS();
|
||||||
if (!LibDevicePath.empty()) {
|
if (!LibDevicePath.empty()) {
|
||||||
// Maintain compatability with HIP flag/envvar pointing directly at the
|
// Maintain compatability with HIP flag/envvar pointing directly at the
|
||||||
// bitcode library directory. This points directly at the library path instead
|
// bitcode library directory. This points directly at the library path instead
|
||||||
// of the rocm root installation.
|
// of the rocm root installation.
|
||||||
if (!D.getVFS().exists(LibDevicePath))
|
if (!FS.exists(LibDevicePath))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scanLibDevicePath();
|
scanLibDevicePath();
|
||||||
|
@ -151,7 +154,7 @@ RocmInstallationDetector::RocmInstallationDetector(
|
||||||
|
|
||||||
for (const auto &Candidate : Candidates) {
|
for (const auto &Candidate : Candidates) {
|
||||||
InstallPath = Candidate.Path;
|
InstallPath = Candidate.Path;
|
||||||
if (InstallPath.empty() || !D.getVFS().exists(InstallPath))
|
if (InstallPath.empty() || !FS.exists(InstallPath))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// The install path situation in old versions of ROCm is a real mess, and
|
// The install path situation in old versions of ROCm is a real mess, and
|
||||||
|
@ -167,8 +170,6 @@ RocmInstallationDetector::RocmInstallationDetector(
|
||||||
llvm::sys::path::append(IncludePath, InstallPath, "include");
|
llvm::sys::path::append(IncludePath, InstallPath, "include");
|
||||||
llvm::sys::path::append(LibDevicePath, InstallPath, "amdgcn", "bitcode");
|
llvm::sys::path::append(LibDevicePath, InstallPath, "amdgcn", "bitcode");
|
||||||
|
|
||||||
auto &FS = D.getVFS();
|
|
||||||
|
|
||||||
// We don't need the include path for OpenCL, since clang already ships with
|
// We don't need the include path for OpenCL, since clang already ships with
|
||||||
// the default header.
|
// the default header.
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,7 @@ CudaInstallationDetector::CudaInstallationDetector(
|
||||||
|
|
||||||
// In decreasing order so we prefer newer versions to older versions.
|
// In decreasing order so we prefer newer versions to older versions.
|
||||||
std::initializer_list<const char *> Versions = {"8.0", "7.5", "7.0"};
|
std::initializer_list<const char *> Versions = {"8.0", "7.5", "7.0"};
|
||||||
|
auto &FS = D.getVFS();
|
||||||
|
|
||||||
if (Args.hasArg(clang::driver::options::OPT_cuda_path_EQ)) {
|
if (Args.hasArg(clang::driver::options::OPT_cuda_path_EQ)) {
|
||||||
Candidates.emplace_back(
|
Candidates.emplace_back(
|
||||||
|
@ -114,7 +115,7 @@ CudaInstallationDetector::CudaInstallationDetector(
|
||||||
for (const char *Ver : Versions)
|
for (const char *Ver : Versions)
|
||||||
Candidates.emplace_back(D.SysRoot + "/usr/local/cuda-" + Ver);
|
Candidates.emplace_back(D.SysRoot + "/usr/local/cuda-" + Ver);
|
||||||
|
|
||||||
Distro Dist(D.getVFS(), llvm::Triple(llvm::sys::getProcessTriple()));
|
Distro Dist(FS, llvm::Triple(llvm::sys::getProcessTriple()));
|
||||||
if (Dist.IsDebian() || Dist.IsUbuntu())
|
if (Dist.IsDebian() || Dist.IsUbuntu())
|
||||||
// Special case for Debian to have nvidia-cuda-toolkit work
|
// Special case for Debian to have nvidia-cuda-toolkit work
|
||||||
// out of the box. More info on http://bugs.debian.org/882505
|
// out of the box. More info on http://bugs.debian.org/882505
|
||||||
|
@ -125,14 +126,13 @@ CudaInstallationDetector::CudaInstallationDetector(
|
||||||
|
|
||||||
for (const auto &Candidate : Candidates) {
|
for (const auto &Candidate : Candidates) {
|
||||||
InstallPath = Candidate.Path;
|
InstallPath = Candidate.Path;
|
||||||
if (InstallPath.empty() || !D.getVFS().exists(InstallPath))
|
if (InstallPath.empty() || !FS.exists(InstallPath))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BinPath = InstallPath + "/bin";
|
BinPath = InstallPath + "/bin";
|
||||||
IncludePath = InstallPath + "/include";
|
IncludePath = InstallPath + "/include";
|
||||||
LibDevicePath = InstallPath + "/nvvm/libdevice";
|
LibDevicePath = InstallPath + "/nvvm/libdevice";
|
||||||
|
|
||||||
auto &FS = D.getVFS();
|
|
||||||
if (!(FS.exists(IncludePath) && FS.exists(BinPath)))
|
if (!(FS.exists(IncludePath) && FS.exists(BinPath)))
|
||||||
continue;
|
continue;
|
||||||
bool CheckLibDevice = (!NoCudaLib || Candidate.StrictChecking);
|
bool CheckLibDevice = (!NoCudaLib || Candidate.StrictChecking);
|
||||||
|
@ -177,7 +177,8 @@ CudaInstallationDetector::CudaInstallationDetector(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::error_code EC;
|
std::error_code EC;
|
||||||
for (llvm::sys::fs::directory_iterator LI(LibDevicePath, EC), LE;
|
for (llvm::vfs::directory_iterator LI = FS.dir_begin(LibDevicePath, EC),
|
||||||
|
LE;
|
||||||
!EC && LI != LE; LI = LI.increment(EC)) {
|
!EC && LI != LE; LI = LI.increment(EC)) {
|
||||||
StringRef FilePath = LI->path();
|
StringRef FilePath = LI->path();
|
||||||
StringRef FileName = llvm::sys::path::filename(FilePath);
|
StringRef FileName = llvm::sys::path::filename(FilePath);
|
||||||
|
|
Loading…
Reference in New Issue