Author: tra Date: Wed Sep 23 16:49:39 2015 New Revision: 248433 URL: http://llvm.org/viewvc/llvm-project?rev=248433&view=rev Log: [CUDA] Added CUDA installation detector class.
Added new option --cuda-path=<path> which allows overriding default search paths. If it's not specified we look for CUDA installation in /usr/include/cuda and /usr/include/cuda-7.0. Differential Revision: http://reviews.llvm.org/D12989 Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep cfe/trunk/test/Driver/cuda-detect.cu Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/lib/Driver/ToolChains.cpp cfe/trunk/lib/Driver/ToolChains.h Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=248433&r1=248432&r2=248433&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Wed Sep 23 16:49:39 2015 @@ -359,6 +359,8 @@ def cuda_gpu_arch_EQ : Joined<["--"], "c Flags<[DriverOption, HelpHidden]>, HelpText<"CUDA GPU architecture">; def cuda_host_only : Flag<["--"], "cuda-host-only">, HelpText<"Do host-side CUDA compilation only">; +def cuda_path_EQ : Joined<["--"], "cuda-path=">, Group<i_Group>, + HelpText<"CUDA installation path">; def dA : Flag<["-"], "dA">, Group<d_Group>; def dD : Flag<["-"], "dD">, Group<d_Group>, Flags<[CC1Option]>, HelpText<"Print macro definitions in -E mode in addition to normal output">; Modified: cfe/trunk/lib/Driver/ToolChains.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=248433&r1=248432&r2=248433&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Sep 23 16:49:39 2015 @@ -1482,6 +1482,48 @@ bool Generic_GCC::GCCInstallationDetecto BiarchTripleAliases.push_back(BiarchTriple.str()); } +// \brief -- try common CUDA installation paths looking for files we need for +// CUDA compilation. + +void +Generic_GCC::CudaInstallationDetector::init(const Driver &D, + const llvm::Triple &TargetTriple, + const llvm::opt::ArgList &Args) { + SmallVector<StringRef, 4> CudaPathCandidates; + + if (Args.hasArg(options::OPT_cuda_path_EQ)) + CudaPathCandidates.push_back( + Args.getLastArgValue(options::OPT_cuda_path_EQ)); + else { + CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda"); + CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0"); + } + + for (const auto CudaPath : CudaPathCandidates) { + if (CudaPath.empty() || !llvm::sys::fs::exists(CudaPath)) + continue; + + CudaInstallPath = CudaPath; + CudaIncludePath = CudaInstallPath + "/include"; + CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice"; + CudaLibPath = + CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib"); + + if (!(llvm::sys::fs::exists(CudaIncludePath) && + llvm::sys::fs::exists(CudaLibPath) && + llvm::sys::fs::exists(CudaLibDevicePath))) + continue; + + IsValid = true; + break; + } +} + +void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const { + if (isValid()) + OS << "Found CUDA installation: " << CudaInstallPath << "\n"; +} + namespace { // Filter to remove Multilibs that don't exist as a suffix to Path class FilterNonExistent { @@ -2053,7 +2095,7 @@ void Generic_GCC::GCCInstallationDetecto Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) - : ToolChain(D, Triple, Args), GCCInstallation() { + : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() { getProgramPaths().push_back(getDriver().getInstalledDir()); if (getDriver().getInstalledDir() != getDriver().Dir) getProgramPaths().push_back(getDriver().Dir); @@ -2085,6 +2127,7 @@ Tool *Generic_GCC::buildLinker() const { void Generic_GCC::printVerboseInfo(raw_ostream &OS) const { // Print the information about how we detected the GCC installation. GCCInstallation.print(OS); + CudaInstallation.print(OS); } bool Generic_GCC::IsUnwindTablesDefault() const { @@ -3261,6 +3304,7 @@ static StringRef getOSLibDir(const llvm: Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : Generic_ELF(D, Triple, Args) { GCCInstallation.init(D, Triple, Args); + CudaInstallation.init(D, Triple, Args); Multilibs = GCCInstallation.getMultilibs(); llvm::Triple::ArchType Arch = Triple.getArch(); std::string SysRoot = computeSysRoot(); Modified: cfe/trunk/lib/Driver/ToolChains.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=248433&r1=248432&r2=248433&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.h (original) +++ cfe/trunk/lib/Driver/ToolChains.h Wed Sep 23 16:49:39 2015 @@ -157,6 +157,38 @@ public: protected: GCCInstallationDetector GCCInstallation; + // \brief A class to find a viable CUDA installation + + class CudaInstallationDetector { + bool IsValid; + std::string CudaInstallPath; + std::string CudaLibPath; + std::string CudaLibDevicePath; + std::string CudaIncludePath; + + public: + CudaInstallationDetector() : IsValid(false) {} + void init(const Driver &D, const llvm::Triple &TargetTriple, + const llvm::opt::ArgList &Args); + + /// \brief Check whether we detected a valid Cuda install. + bool isValid() const { return IsValid; } + /// \brief Print information about the detected CUDA installation. + void print(raw_ostream &OS) const; + + /// \brief Get the detected Cuda installation path. + StringRef getInstallPath() const { return CudaInstallPath; } + /// \brief Get the detected Cuda Include path. + StringRef getIncludePath() const { return CudaIncludePath; } + /// \brief Get the detected Cuda library path. + StringRef getLibPath() const { return CudaLibPath; } + /// \brief Get the detected Cuda device library path. + StringRef getLibDevicePath() const { return CudaLibDevicePath; } + /// \brief Get libdevice file for given architecture + }; + + CudaInstallationDetector CudaInstallation; + public: Generic_GCC(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/include/.keep?rev=248433&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib/.keep?rev=248433&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/lib64/.keep?rev=248433&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA/usr/local/cuda/nvvm/libdevice/.keep?rev=248433&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/cuda-detect.cu URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cuda-detect.cu?rev=248433&view=auto ============================================================================== --- cfe/trunk/test/Driver/cuda-detect.cu (added) +++ cfe/trunk/test/Driver/cuda-detect.cu Wed Sep 23 16:49:39 2015 @@ -0,0 +1,12 @@ +// REQUIRES: clang-driver +// REQUIRES: x86-registered-target +// +// RUN: %clang -v --target=i386-unknown-linux \ +// RUN: --sysroot=/tmp/no-cuda-there 2>&1 | FileCheck %s -check-prefix NOCUDA +// RUN: %clang -v --target=i386-unknown-linux \ +// RUN: --sysroot=%S/Inputs/CUDA 2>&1 | FileCheck %s +// RUN: %clang -v --target=i386-unknown-linux \ +// RUN: --cuda-path=%S/Inputs/CUDA/usr/local/cuda 2>&1 | FileCheck %s + +// CHECK: Found CUDA installation: {{.*}}/Inputs/CUDA/usr/local/cuda +// NOCUDA-NOT: Found CUDA installation: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits