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,7 @@ 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; @@ -2666,7 +2668,7 @@ assert(!CompileHostOnly && "Not expecting CUDA actions in host-only compilation."); - if (!Relocatable && CurPhase == phases::Backend) { + if (!Relocatable && CurPhase == phases::Backend && !EmitLLVM) { // If we are in backend phase, we attempt to generate the fat binary. // We compile each arch to IR and use a link action to generate code // object containing ISA. Then we use a special "link" action to create @@ -2734,7 +2736,9 @@ A = C.getDriver().ConstructPhaseAction(C, Args, CurPhase, A, AssociatedOffloadKind); - return ABRT_Success; + return (EmitLLVM && CompileDeviceOnly && CurPhase == phases::Backend) + ? ABRT_Ignore_Host + : ABRT_Success; } void appendLinkDependences(OffloadAction::DeviceDependences &DA) override { Index: test/Driver/hip-toolchain-emit-llvm.hip =================================================================== --- /dev/null +++ test/Driver/hip-toolchain-emit-llvm.hip @@ -0,0 +1,35 @@ +// 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,BC %s + +// RUN: %clang -c -S -emit-llvm --cuda-device-only -### -target x86_64-linux-gnu \ +// RUN: -o a.ll -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,LL %s + +// CHECK: {{".*clang.*"}} "-cc1" "-triple" "amdgcn-amd-amdhsa" +// CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" +// BC-SAME: "-emit-llvm-bc" +// LL-SAME: "-emit-llvm" +// CHECK-SAME: "-main-file-name" "a.cu" {{.*}} "-target-cpu" "gfx900" +// CHECK-SAME: "-fcuda-is-device" +// CHECK-SAME: {{".*lib1.bc"}} +// BC-SAME: "-o" "a.bc" +// LL-SAME: "-o" "a.ll" +// 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.*"}}