diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 060f76fb653c9..cd93456dfa5cd 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6849,11 +6849,17 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, TC = std::make_unique(*this, Target, Args); break; case llvm::Triple::AMDHSA: { - bool DL = - usesInput(Args, types::isOpenCL) || usesInput(Args, types::isLLVMIR); - TC = DL ? std::make_unique(*this, Target, Args) - : std::make_unique(*this, Target, - Args); + if (Target.getArch() == llvm::Triple::spirv64) { + TC = std::make_unique(*this, Target, + Args); + } else { + bool DL = usesInput(Args, types::isOpenCL) || + usesInput(Args, types::isLLVMIR); + TC = DL ? std::make_unique(*this, Target, + Args) + : std::make_unique(*this, Target, + Args); + } break; } case llvm::Triple::AMDPAL: diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index a8f2b09b1b20f..74ac8306e7cc1 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -417,3 +417,15 @@ void HIPAMDToolChain::checkTargetID( getDriver().Diag(clang::diag::err_drv_bad_target_id) << *PTID.OptionalTargetID; } + +SPIRVAMDToolChain::SPIRVAMDToolChain(const Driver &D, + const llvm::Triple &Triple, + const ArgList &Args) + : ROCMToolChain(D, Triple, Args) { + getProgramPaths().push_back(getDriver().Dir); +} + +Tool *SPIRVAMDToolChain::buildLinker() const { + assert(getTriple().getArch() == llvm::Triple::spirv64); + return new tools::AMDGCN::Linker(*this); +} diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index c31894e22c5c8..3630b11cd8b1a 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -97,6 +97,15 @@ class LLVM_LIBRARY_VISIBILITY HIPAMDToolChain final : public ROCMToolChain { Tool *buildLinker() const override; }; +class LLVM_LIBRARY_VISIBILITY SPIRVAMDToolChain final : public ROCMToolChain { +public: + SPIRVAMDToolChain(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + +protected: + Tool *buildLinker() const override; +}; + } // end namespace toolchains } // end namespace driver } // end namespace clang diff --git a/clang/test/Driver/spirv-amd-toolchain.c b/clang/test/Driver/spirv-amd-toolchain.c new file mode 100644 index 0000000000000..c9417400a9378 --- /dev/null +++ b/clang/test/Driver/spirv-amd-toolchain.c @@ -0,0 +1,19 @@ +// RUN: %clang -### -ccc-print-phases --target=spirv64-amd-amdhsa %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=PHASES +// PHASES: 0: input, "[[INPUT:.+]]", c +// PHASES: 1: preprocessor, {0}, cpp-output +// PHASES: 2: compiler, {1}, ir +// PHASES: 3: backend, {2}, assembler +// PHASES: 4: assembler, {3}, object +// PHASES: 5: linker, {4}, image + +// RUN: %clang -### -ccc-print-bindings --target=spirv64-amd-amdhsa %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=BINDINGS +// BINDINGS: # "spirv64-amd-amdhsa" - "clang", inputs: ["[[INPUT:.+]]"], output: "[[OUTPUT:.+]]" +// BINDINGS: # "spirv64-amd-amdhsa" - "AMDGCN::Linker", inputs: ["[[OUTPUT]]"], output: "a.out" + +// RUN: %clang -### --target=spirv64-amd-amdhsa %s -nogpulib -nogpuinc 2>&1 \ +// RUN: | FileCheck %s --check-prefix=INVOCATION +// INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c" +// INVOCATION: "{{.*}}llvm-link" "-o" "a.out" "[[OUTPUT]]" +// INVOCATION: "{{.*}}llvm-spirv" "--spirv-max-version=1.6" "--spirv-ext=+all" "--spirv-allow-unknown-intrinsics" "--spirv-lower-const-expr" "--spirv-preserve-auxdata" "--spirv-debug-info-version=nonsemantic-shader-200" "a.out" "-o" "a.out"