On Wed, Sep 23, 2015 at 2:49 PM, Artem Belevich via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> 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: > This test seems to fail on Linux if the full path to Inputs directory is very long because it fails to detect the cuda installation path. Can you take a look?
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits