r248433 - [CUDA] Added CUDA installation detector class.
Rui Ueyama via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 23 16:51:47 PDT 2015
Yes I can. Create a deep nested directly, create a symlink from there to
your Inputs/CUDA, and run "clang -v --target=i386-unknown-linux
--sysroot=<very long directory>/Inputs/CUDA".
On Wed, Sep 23, 2015 at 4:47 PM, Artem Belevich <tra at google.com> wrote:
> I'm looking into it. Can you reproduce it on linux?
>
>
> On Wed, Sep 23, 2015 at 4:43 PM, Rui Ueyama <ruiu at google.com> wrote:
>
>> On Wed, Sep 23, 2015 at 2:49 PM, Artem Belevich via cfe-commits <
>> cfe-commits at 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?
>>
>
>
>
> --
> --Artem Belevich
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150923/bbc9f5ee/attachment-0001.html>
More information about the cfe-commits
mailing list