Index: lib/Driver/Driver.cpp =================================================================== --- lib/Driver/Driver.cpp +++ lib/Driver/Driver.cpp @@ -2314,6 +2314,7 @@ /// compilation. bool CompileHostOnly = false; bool CompileDeviceOnly = false; + bool EmitLLVM = false; /// List of GPU architectures to use in this compilation. SmallVector GpuArchList; @@ -2480,6 +2481,8 @@ CompileDeviceOnly = PartialCompilationArg && PartialCompilationArg->getOption().matches( options::OPT_cuda_device_only); + EmitLLVM = Args.getLastArg(options::OPT_emit_llvm); + // Collect all cuda_gpu_arch parameters, removing duplicates. std::set GpuArchs; @@ -2660,6 +2663,11 @@ CurPhase == phases::Assemble) return ABRT_Success; + if (EmitLLVM && + (CurPhase == phases::Backend || CurPhase == phases::Assemble || + CurPhase == phases::Link)) + return CompileDeviceOnly ? ABRT_Ignore_Host : ABRT_Success; + assert(((CurPhase == phases::Link && Relocatable) || CudaDeviceActions.size() == GpuArchList.size()) && "Expecting one action per GPU architecture."); Index: test/Driver/hip-toolchain-emit-llvm.hip =================================================================== --- /dev/null +++ test/Driver/hip-toolchain-emit-llvm.hip @@ -0,0 +1,26 @@ +// REQUIRES: clang-driver +// REQUIRES: x86-registered-target +// REQUIRES: amdgpu-registered-target + +// RUN: %clang -c -emit-llvm --cuda-device-only -### -target x86_64-linux-gnu \ +// RUN: -o a.bc -x hip --cuda-gpu-arch=gfx900 \ +// RUN: --hip-device-lib=lib1.bc \ +// RUN: --hip-device-lib-path=%S/Inputs/hip_multiple_inputs/lib1 \ +// RUN: %S/Inputs/hip_multiple_inputs/a.cu \ +// RUN: 2>&1 | FileCheck -check-prefixes=CHECK %s + +// CHECK: {{".*clang.*"}} "-cc1" "-triple" "amdgcn-amd-amdhsa" +// CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" +// CHECK-SAME: "-emit-llvm-bc" +// CHECK-SAME: "-main-file-name" "a.cu" {{.*}} "-target-cpu" "gfx900" +// CHECK-SAME: "-fcuda-is-device" +// CHECK-SAME: {{".*lib1.bc"}} +// CHECK-SAME: "-o" "a.bc" +// CHECK-SAME: {{".*a.cu"}} + +// CHECK-NOT: {{"*.llvm-link"}} +// CHECK-NOT: {{".*opt"}} +// CHECK-NOT: {{".*llc"}} +// CHECK-NOT: {{".*lld"}} +// CHECK-NOT: {{".*clang-offload-bundler"}} +// CHECK-NOT: {{".*ld.*"}}