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">;
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 {
Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
const ArgList &Args)
- : ToolChain(D, Triple, Args), GCCInstallation(), CudaInstallation() {
+ : ToolChain(D, Triple, Args), GCCInstallation() {
getProgramPaths().push_back(getDriver().getInstalledDir());
if (getDriver().getInstalledDir() != getDriver().Dir)
getProgramPaths().push_back(getDriver().Dir);
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 {
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();
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);