Author: yaxunl Date: Fri May 11 12:21:39 2018 New Revision: 332123 URL: http://llvm.org/viewvc/llvm-project?rev=332123&view=rev Log: [HIP] Set proper triple and offload kind for the toolchain
Also introduce --hip-link option to indicate HIP for linking. Differential Revision: https://reviews.llvm.org/D46475 Added: cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/ cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/a.cu cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/b.hip cfe/trunk/test/Driver/hip-inputs.hip Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Driver/Types.h cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/lib/Driver/Types.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=332123&r1=332122&r2=332123&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Fri May 11 12:21:39 2018 @@ -41,6 +41,7 @@ def err_drv_cuda_version_unsupported : E "install, pass a different GPU arch with --cuda-gpu-arch, or pass " "--no-cuda-version-check.">; def err_drv_cuda_host_arch : Error<"unsupported architecture '%0' for host compilation.">; +def err_drv_mix_cuda_hip : Error<"Mixed Cuda and HIP compilation is not supported.">; def err_drv_invalid_thread_model_for_target : Error< "invalid thread model '%0' in '%1' for this target">; def err_drv_invalid_linker_name : Error< Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=332123&r1=332122&r2=332123&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Fri May 11 12:21:39 2018 @@ -557,6 +557,8 @@ def no_cuda_include_ptx_EQ : Joined<["-- HelpText<"Do not include PTX for the follwing GPU architecture (e.g. sm_35) or 'all'. May be specified more than once.">; def cuda_gpu_arch_EQ : Joined<["--"], "cuda-gpu-arch=">, Flags<[DriverOption]>, HelpText<"CUDA GPU architecture (e.g. sm_35). May be specified more than once.">; +def hip_link : Flag<["--"], "hip-link">, + HelpText<"Link clang-offload-bundler bundles for HIP">; def no_cuda_gpu_arch_EQ : Joined<["--"], "no-cuda-gpu-arch=">, Flags<[DriverOption]>, HelpText<"Remove GPU architecture (e.g. sm_35) from the list of GPUs to compile for. " "'all' resets the list to its default value.">; Modified: cfe/trunk/include/clang/Driver/Types.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Types.h?rev=332123&r1=332122&r2=332123&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Types.h (original) +++ cfe/trunk/include/clang/Driver/Types.h Fri May 11 12:21:39 2018 @@ -77,6 +77,9 @@ namespace types { /// isCuda - Is this a CUDA input. bool isCuda(ID Id); + /// isHIP - Is this a HIP input. + bool isHIP(ID Id); + /// isObjC - Is this an "ObjC" input (Obj-C and Obj-C++ sources and headers). bool isObjC(ID Id); Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=332123&r1=332122&r2=332123&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Fri May 11 12:21:39 2018 @@ -538,24 +538,46 @@ void Driver::CreateOffloadingDeviceToolC InputList &Inputs) { // - // CUDA + // CUDA/HIP // - // We need to generate a CUDA toolchain if any of the inputs has a CUDA type. - if (llvm::any_of(Inputs, [](std::pair<types::ID, const llvm::opt::Arg *> &I) { + // We need to generate a CUDA toolchain if any of the inputs has a CUDA + // or HIP type. However, mixed CUDA/HIP compilation is not supported. + bool IsCuda = + llvm::any_of(Inputs, [](std::pair<types::ID, const llvm::opt::Arg *> &I) { return types::isCuda(I.first); - })) { + }); + bool IsHIP = + llvm::any_of(Inputs, + [](std::pair<types::ID, const llvm::opt::Arg *> &I) { + return types::isHIP(I.first); + }) || + C.getInputArgs().hasArg(options::OPT_hip_link); + if (IsCuda && IsHIP) { + Diag(clang::diag::err_drv_mix_cuda_hip); + return; + } + if (IsCuda || IsHIP) { const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); const llvm::Triple &HostTriple = HostTC->getTriple(); - llvm::Triple CudaTriple(HostTriple.isArch64Bit() ? "nvptx64-nvidia-cuda" - : "nvptx-nvidia-cuda"); - // Use the CUDA and host triples as the key into the ToolChains map, because - // the device toolchain we create depends on both. + StringRef DeviceTripleStr; + auto OFK = IsHIP ? Action::OFK_HIP : Action::OFK_Cuda; + if (IsHIP) { + // HIP is only supported on amdgcn. + DeviceTripleStr = "amdgcn-amd-amdhsa"; + } else { + // CUDA is only supported on nvptx. + DeviceTripleStr = HostTriple.isArch64Bit() ? "nvptx64-nvidia-cuda" + : "nvptx-nvidia-cuda"; + } + llvm::Triple CudaTriple(DeviceTripleStr); + // Use the CUDA/HIP and host triples as the key into the ToolChains map, + // because the device toolchain we create depends on both. auto &CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()]; if (!CudaTC) { CudaTC = llvm::make_unique<toolchains::CudaToolChain>( - *this, CudaTriple, *HostTC, C.getInputArgs(), Action::OFK_Cuda); + *this, CudaTriple, *HostTC, C.getInputArgs(), OFK); } - C.addOffloadDeviceToolChain(CudaTC.get(), Action::OFK_Cuda); + C.addOffloadDeviceToolChain(CudaTC.get(), OFK); } // Modified: cfe/trunk/lib/Driver/Types.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Types.cpp?rev=332123&r1=332122&r2=332123&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Types.cpp (original) +++ cfe/trunk/lib/Driver/Types.cpp Fri May 11 12:21:39 2018 @@ -172,6 +172,15 @@ bool types::isCuda(ID Id) { case TY_CUDA: case TY_PP_CUDA: case TY_CUDA_DEVICE: + return true; + } +} + +bool types::isHIP(ID Id) { + switch (Id) { + default: + return false; + case TY_HIP: case TY_PP_HIP: case TY_HIP_DEVICE: @@ -230,6 +239,7 @@ types::ID types::lookupTypeForExtension( .Case("fpp", TY_Fortran) .Case("FPP", TY_Fortran) .Case("gch", TY_PCH) + .Case("hip", TY_HIP) .Case("hpp", TY_CXXHeader) .Case("iim", TY_PP_CXXModule) .Case("lib", TY_Object) Added: cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/a.cu URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/a.cu?rev=332123&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/b.hip URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/hip_multiple_inputs/b.hip?rev=332123&view=auto ============================================================================== (empty) Added: cfe/trunk/test/Driver/hip-inputs.hip URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/hip-inputs.hip?rev=332123&view=auto ============================================================================== --- cfe/trunk/test/Driver/hip-inputs.hip (added) +++ cfe/trunk/test/Driver/hip-inputs.hip Fri May 11 12:21:39 2018 @@ -0,0 +1,23 @@ +// REQUIRES: clang-driver +// REQUIRES: x86-registered-target +// REQUIRES: amdgpu-registered-target + +// RUN: %clang -ccc-print-phases -target x86_64-linux-gnu \ +// RUN: -x hip --cuda-gpu-arch=gfx803 -c \ +// RUN: %S/Inputs/hip_multiple_inputs/a.cu \ +// RUN: %S/Inputs/hip_multiple_inputs/b.hip 2>&1 \ +// RUN: | FileCheck %s + +// RUN: not %clang -ccc-print-phases -target x86_64-linux-gnu \ +// RUN: --cuda-gpu-arch=gfx803 -c \ +// RUN: %S/Inputs/hip_multiple_inputs/a.cu \ +// RUN: %S/Inputs/hip_multiple_inputs/b.hip 2>&1 \ +// RUN: | FileCheck -check-prefix=MIX %s + +// RUN: not %clang -ccc-print-phases -target x86_64-linux-gnu \ +// RUN: --cuda-gpu-arch=gfx803 -c \ +// RUN: --hip-link %S/Inputs/hip_multiple_inputs/a.cu 2>&1 \ +// RUN: | FileCheck -check-prefix=MIX %s + +// CHECK-NOT: error: Mixed Cuda and HIP compilation is not supported. +// MIX: error: Mixed Cuda and HIP compilation is not supported. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits