r291131 - [Driver] Driver changes to support CUDA compilation on Windows.
Justin Lebar via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 6 10:12:30 PST 2017
chapuni pointed it out in the review thread a few minutes ago --
ongoing discussion there, would actually appreciate a pointer or two.
-Justin
On Fri, Jan 6, 2017 at 9:46 AM, Reid Kleckner <rnk at google.com> wrote:
> cuda-version-check.cu seems to be failing since this change:
> http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/1768
>
> The relevant failing part:
>
> $
> "C:/b/slave/clang-x86-windows-msvc2015/clang-x86-windows-msvc2015/stage1/./bin/clang.EXE"
> "-v" "-###" "--cuda-gpu-arch=sm_60"
> "--sysroot=C:\b\slave\clang-x86-windows-msvc2015\clang-x86-windows-msvc2015\llvm\tools\clang\test\Driver/Inputs/CUDA"
> "C:\b\slave\clang-x86-windows-msvc2015\clang-x86-windows-msvc2015\llvm\tools\clang\test\Driver\cuda-version-check.cu"
> $
> "C:/b/slave/clang-x86-windows-msvc2015/clang-x86-windows-msvc2015/stage1/./bin\FileCheck.EXE"
> "C:\b\slave\clang-x86-windows-msvc2015\clang-x86-windows-msvc2015\llvm\tools\clang\test\Driver\cuda-version-check.cu"
> "--check-prefix=ERR_SM60"
> # command stderr:
> C:\b\slave\clang-x86-windows-msvc2015\clang-x86-windows-msvc2015\llvm\tools\clang\test\Driver\cuda-version-check.cu:56:14:
> error: expected string not found in input
> // ERR_SM60: error: GPU arch sm_60 {{.*}}
> ^
> <stdin>:1:1: note: scanning from here
> clang version 4.0.0 (trunk 291142)
> ^
> <stdin>:5:12: note: possible intended match here
> clang.EXE: error: cannot find libdevice for sm_60. Provide path to different
> CUDA installation via --cuda-path, or pass -nocudalib to build without
> linking with libdevice.
> ^
>
> On Thu, Jan 5, 2017 at 8:52 AM, Justin Lebar via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: jlebar
>> Date: Thu Jan 5 10:52:29 2017
>> New Revision: 291131
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=291131&view=rev
>> Log:
>> [Driver] Driver changes to support CUDA compilation on Windows.
>>
>> Summary:
>> For the most part this is straightforward: Just add a CudaInstallation
>> object to the MSVC and MinGW toolchains.
>>
>> CudaToolChain has to override computeMSVCVersion so that
>> Clang::constructJob passes the right version flag to cc1. We have to
>> modify IsWindowsMSVC and friends in Clang::constructJob to be true when
>> compiling CUDA device code on Windows for the same reason.
>>
>> Depends on: D28319
>>
>> Reviewers: tra
>>
>> Subscribers: cfe-commits
>>
>> Differential Revision: https://reviews.llvm.org/D28320
>>
>> Added:
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/bin/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/bin/.keep
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/include/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/include/.keep
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/lib/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/lib/.keep
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/libdevice/
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_30.10.bc
>> cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_35.10.bc
>> cfe/trunk/test/Driver/cuda-windows.cu
>> Modified:
>> cfe/trunk/include/clang/Driver/ToolChain.h
>> cfe/trunk/lib/Driver/MSVCToolChain.cpp
>> cfe/trunk/lib/Driver/MinGWToolChain.cpp
>> cfe/trunk/lib/Driver/ToolChains.cpp
>> cfe/trunk/lib/Driver/ToolChains.h
>> cfe/trunk/lib/Driver/Tools.cpp
>>
>> Modified: cfe/trunk/include/clang/Driver/ToolChain.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/ToolChain.h (original)
>> +++ cfe/trunk/include/clang/Driver/ToolChain.h Thu Jan 5 10:52:29 2017
>> @@ -139,6 +139,13 @@ public:
>> vfs::FileSystem &getVFS() const;
>> const llvm::Triple &getTriple() const { return Triple; }
>>
>> + /// Get the toolchain's aux triple, if it has one.
>> + ///
>> + /// Exactly what the aux triple represents depends on the toolchain,
>> but for
>> + /// example when compiling CUDA code for the GPU, the triple might be
>> NVPTX,
>> + /// while the aux triple is the host (CPU) toolchain, e.g.
>> x86-linux-gnu.
>> + virtual const llvm::Triple *getAuxTriple() const { return nullptr; }
>> +
>> llvm::Triple::ArchType getArch() const { return Triple.getArch(); }
>> StringRef getArchName() const { return Triple.getArchName(); }
>> StringRef getPlatform() const { return Triple.getVendorName(); }
>>
>> Modified: cfe/trunk/lib/Driver/MSVCToolChain.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MSVCToolChain.cpp?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/MSVCToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/MSVCToolChain.cpp Thu Jan 5 10:52:29 2017
>> @@ -47,9 +47,9 @@ using namespace clang::driver::toolchain
>> using namespace clang;
>> using namespace llvm::opt;
>>
>> -MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple& Triple,
>> +MSVCToolChain::MSVCToolChain(const Driver &D, const llvm::Triple &Triple,
>> const ArgList &Args)
>> - : ToolChain(D, Triple, Args) {
>> + : ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args) {
>> getProgramPaths().push_back(getDriver().getInstalledDir());
>> if (getDriver().getInstalledDir() != getDriver().Dir)
>> getProgramPaths().push_back(getDriver().Dir);
>> @@ -94,6 +94,15 @@ bool MSVCToolChain::isPICDefaultForced()
>> return getArch() == llvm::Triple::x86_64;
>> }
>>
>> +void MSVCToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs,
>> + ArgStringList &CC1Args) const {
>> + CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
>> +}
>> +
>> +void MSVCToolChain::printVerboseInfo(raw_ostream &OS) const {
>> + CudaInstallation.print(OS);
>> +}
>> +
>> #ifdef USE_WIN32
>> static bool readFullStringValue(HKEY hkey, const char *valueName,
>> std::string &value) {
>>
>> Modified: cfe/trunk/lib/Driver/MinGWToolChain.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MinGWToolChain.cpp?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/MinGWToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/MinGWToolChain.cpp Thu Jan 5 10:52:29 2017
>> @@ -63,7 +63,7 @@ void MinGW::findGccLibDir() {
>> }
>>
>> MinGW::MinGW(const Driver &D, const llvm::Triple &Triple, const ArgList
>> &Args)
>> - : ToolChain(D, Triple, Args) {
>> + : ToolChain(D, Triple, Args), CudaInstallation(D, Triple, Args) {
>> getProgramPaths().push_back(getDriver().getInstalledDir());
>>
>> // In Windows there aren't any standard install locations, we search
>> @@ -135,6 +135,15 @@ bool MinGW::UseSEHExceptions() const {
>> return getArch() == llvm::Triple::x86_64;
>> }
>>
>> +void MinGW::AddCudaIncludeArgs(const ArgList &DriverArgs,
>> + ArgStringList &CC1Args) const {
>> + CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
>> +}
>> +
>> +void MinGW::printVerboseInfo(raw_ostream &OS) const {
>> + CudaInstallation.print(OS);
>> +}
>> +
>> // Include directories for various hosts:
>>
>> // Windows, mingw.org
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Thu Jan 5 10:52:29 2017
>> @@ -1810,14 +1810,21 @@ CudaInstallationDetector::CudaInstallati
>> : D(D) {
>> SmallVector<std::string, 4> CudaPathCandidates;
>>
>> - if (Args.hasArg(options::OPT_cuda_path_EQ))
>> + // In decreasing order so we prefer newer versions to older versions.
>> + std::initializer_list<const char *> Versions = {"8.0", "7.5", "7.0"};
>> +
>> + if (Args.hasArg(options::OPT_cuda_path_EQ)) {
>> CudaPathCandidates.push_back(
>> Args.getLastArgValue(options::OPT_cuda_path_EQ));
>> - else {
>> + } else if (HostTriple.isOSWindows()) {
>> + for (const char *Ver : Versions)
>> + CudaPathCandidates.push_back(
>> + D.SysRoot + "/Program Files/NVIDIA GPU Computing
>> Toolkit/CUDA/v" +
>> + Ver);
>> + } else {
>> CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
>> - CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-8.0");
>> - CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
>> - CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
>> + for (const char *Ver : Versions)
>> + CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-" + Ver);
>> }
>>
>> for (const auto &CudaPath : CudaPathCandidates) {
>> @@ -5021,6 +5028,11 @@ SanitizerMask CudaToolChain::getSupporte
>> return HostTC.getSupportedSanitizers();
>> }
>>
>> +VersionTuple CudaToolChain::computeMSVCVersion(const Driver *D,
>> + const ArgList &Args) const
>> {
>> + return HostTC.computeMSVCVersion(D, Args);
>> +}
>> +
>> /// XCore tool chain
>> XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple
>> &Triple,
>> const ArgList &Args)
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains.h (original)
>> +++ cfe/trunk/lib/Driver/ToolChains.h Thu Jan 5 10:52:29 2017
>> @@ -709,12 +709,19 @@ public:
>> const llvm::opt::ArgList &DriverArgs,
>> llvm::opt::ArgStringList &CC1Args) const override;
>>
>> + void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
>> + llvm::opt::ArgStringList &CC1Args) const
>> override;
>> +
>> + void printVerboseInfo(raw_ostream &OS) const override;
>> +
>> protected:
>> Tool *getTool(Action::ActionClass AC) const override;
>> Tool *buildLinker() const override;
>> Tool *buildAssembler() const override;
>>
>> private:
>> + CudaInstallationDetector CudaInstallation;
>> +
>> std::string Base;
>> std::string GccLibDir;
>> std::string Ver;
>> @@ -892,6 +899,10 @@ public:
>> CudaToolChain(const Driver &D, const llvm::Triple &Triple,
>> const ToolChain &HostTC, const llvm::opt::ArgList &Args);
>>
>> + virtual const llvm::Triple *getAuxTriple() const override {
>> + return &HostTC.getTriple();
>> + }
>> +
>> llvm::opt::DerivedArgList *
>> TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef
>> BoundArch,
>> Action::OffloadKind DeviceOffloadKind) const override;
>> @@ -924,6 +935,10 @@ public:
>>
>> SanitizerMask getSupportedSanitizers() const override;
>>
>> + VersionTuple
>> + computeMSVCVersion(const Driver *D,
>> + const llvm::opt::ArgList &Args) const override;
>> +
>> const ToolChain &HostTC;
>> CudaInstallationDetector CudaInstallation;
>>
>> @@ -1147,6 +1162,9 @@ public:
>> const llvm::opt::ArgList &DriverArgs,
>> llvm::opt::ArgStringList &CC1Args) const override;
>>
>> + void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
>> + llvm::opt::ArgStringList &CC1Args) const
>> override;
>> +
>> bool getWindowsSDKDir(std::string &path, int &major,
>> std::string &windowsSDKIncludeVersion,
>> std::string &windowsSDKLibVersion) const;
>> @@ -1166,6 +1184,8 @@ public:
>> types::ID InputType) const
>> override;
>> SanitizerMask getSupportedSanitizers() const override;
>>
>> + void printVerboseInfo(raw_ostream &OS) const override;
>> +
>> protected:
>> void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList
>> &DriverArgs,
>> llvm::opt::ArgStringList &CC1Args,
>> @@ -1179,6 +1199,8 @@ protected:
>> private:
>> VersionTuple getMSVCVersionFromTriple() const;
>> VersionTuple getMSVCVersionFromExe() const;
>> +
>> + CudaInstallationDetector CudaInstallation;
>> };
>>
>> class LLVM_LIBRARY_VISIBILITY CrossWindowsToolChain : public Generic_GCC
>> {
>>
>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=291131&r1=291130&r2=291131&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>> +++ cfe/trunk/lib/Driver/Tools.cpp Thu Jan 5 10:52:29 2017
>> @@ -4086,13 +4086,6 @@ void Clang::ConstructJob(Compilation &C,
>> const Driver &D = getToolChain().getDriver();
>> ArgStringList CmdArgs;
>>
>> - bool IsWindowsGNU =
>> getToolChain().getTriple().isWindowsGNUEnvironment();
>> - bool IsWindowsCygnus =
>> - getToolChain().getTriple().isWindowsCygwinEnvironment();
>> - bool IsWindowsMSVC =
>> getToolChain().getTriple().isWindowsMSVCEnvironment();
>> - bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
>> - bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
>> -
>> // Check number of inputs for sanity. We need at least one input.
>> assert(Inputs.size() >= 1 && "Must have at least one input.");
>> const InputInfo &Input = Inputs[0];
>> @@ -4106,6 +4099,23 @@ void Clang::ConstructJob(Compilation &C,
>> Inputs.size() == 1) &&
>> "Unable to handle multiple inputs.");
>>
>> + bool IsWindowsGNU =
>> getToolChain().getTriple().isWindowsGNUEnvironment();
>> + bool IsWindowsCygnus =
>> + getToolChain().getTriple().isWindowsCygwinEnvironment();
>> + bool IsWindowsMSVC =
>> getToolChain().getTriple().isWindowsMSVCEnvironment();
>> + bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
>> + bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
>> +
>> + // Adjust IsWindowsXYZ for CUDA compilations. Even when compiling in
>> device
>> + // mode (i.e., getToolchain().getTriple() is NVPTX, not Windows), we
>> need to
>> + // pass Windows-specific flags to cc1.
>> + if (IsCuda) {
>> + const llvm::Triple *AuxTriple = getToolChain().getAuxTriple();
>> + IsWindowsMSVC |= AuxTriple && AuxTriple->isWindowsMSVCEnvironment();
>> + IsWindowsGNU |= AuxTriple && AuxTriple->isWindowsGNUEnvironment();
>> + IsWindowsCygnus |= AuxTriple &&
>> AuxTriple->isWindowsCygwinEnvironment();
>> + }
>> +
>> // C++ is not supported for IAMCU.
>> if (IsIAMCU && types::isCXX(Input.getType()))
>> D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU";
>>
>> Added: cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/bin/.keep
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA-windows/Program%20Files/NVIDIA%20GPU%20Computing%20Toolkit/CUDA/v8.0/bin/.keep?rev=291131&view=auto
>>
>> ==============================================================================
>> (empty)
>>
>> Added: cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/include/.keep
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA-windows/Program%20Files/NVIDIA%20GPU%20Computing%20Toolkit/CUDA/v8.0/include/.keep?rev=291131&view=auto
>>
>> ==============================================================================
>> (empty)
>>
>> Added: cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/lib/.keep
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA-windows/Program%20Files/NVIDIA%20GPU%20Computing%20Toolkit/CUDA/v8.0/lib/.keep?rev=291131&view=auto
>>
>> ==============================================================================
>> (empty)
>>
>> Added: cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_30.10.bc
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA-windows/Program%20Files/NVIDIA%20GPU%20Computing%20Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_30.10.bc?rev=291131&view=auto
>>
>> ==============================================================================
>> (empty)
>>
>> Added: cfe/trunk/test/Driver/Inputs/CUDA-windows/Program Files/NVIDIA GPU
>> Computing Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_35.10.bc
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/CUDA-windows/Program%20Files/NVIDIA%20GPU%20Computing%20Toolkit/CUDA/v8.0/nvvm/libdevice/libdevice.compute_35.10.bc?rev=291131&view=auto
>>
>> ==============================================================================
>> (empty)
>>
>> Added: cfe/trunk/test/Driver/cuda-windows.cu
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cuda-windows.cu?rev=291131&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/Driver/cuda-windows.cu (added)
>> +++ cfe/trunk/test/Driver/cuda-windows.cu Thu Jan 5 10:52:29 2017
>> @@ -0,0 +1,14 @@
>> +// REQUIRES: clang-driver
>> +// REQUIRES: x86-registered-target
>> +// REQUIRES: nvptx-registered-target
>> +//
>> +// RUN: %clang -v --target=i386-pc-windows-msvc \
>> +// RUN: --sysroot=%S/Inputs/CUDA-windows 2>&1 %s -### | FileCheck %s
>> +// RUN: %clang -v --target=i386-pc-windows-mingw32 \
>> +// RUN: --sysroot=%S/Inputs/CUDA-windows 2>&1 %s -### | FileCheck %s
>> +
>> +// CHECK: Found CUDA installation: {{.*}}/Inputs/CUDA-windows/Program
>> Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0
>> +// CHECK: "-cc1" "-triple" "nvptx-nvidia-cuda"
>> +// CHECK-SAME: "-fms-extensions"
>> +// CHECK-SAME: "-fms-compatibility"
>> +// CHECK-SAME: "-fms-compatibility-version=
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list