diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1539,6 +1539,14 @@ Group, Flags<[CC1Option]>, MetaVarName<"">, HelpText<"Enable heap memory profiling and dump results into ">; +def spirv_use_llc : Flag<["--"], "spirv-use-llc">, Flags<[HelpHidden]>, + HelpText<"Use (in-tree) llc to emit SPIR-V. Use for development and " + "testing only.">; +def spirv_use_llc_EQ : Joined<["--"], "spirv-use-llc=">, + MetaVarName<"">, Flags<[HelpHidden]>, + HelpText<"Use speficied llc to emit SPIR-V. Use for development and " + "testing only.">; + // Begin sanitizer flags. These should all be core options exposed in all driver // modes. let Flags = [CC1Option, CoreOption] in { diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp --- a/clang/lib/Driver/ToolChains/HIPSPV.cpp +++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp @@ -97,6 +97,25 @@ // Emit SPIR-V binary. + // Use llc. Meant for testing out LLVM SPIR-V backend. Eventually HIPSPV will + // switch to use in-tree SPIR-V backend for binary emission. + if (auto *A = Args.getLastArg(options::OPT_spirv_use_llc, + options::OPT_spirv_use_llc_EQ)) { + assert(A->getNumValues() <= 1); + const char *LlcExe = nullptr; + if (A->getNumValues() == 1 && !StringRef(A->getValue()).empty()) + LlcExe = A->getValue(); + else + LlcExe = Args.MakeArgString(getToolChain().GetProgramPath("llc")); + ArgStringList LlcArgs{"--mattr=+spirv1.1", "--filetype=obj", TempFile, "-o", + Output.getFilename()}; + C.addCommand(std::make_unique(JA, *this, + ResponseFileSupport::None(), LlcExe, + LlcArgs, Inputs, Output)); + return; + } + + // Use SPIRV-LLVM Translator. llvm::opt::ArgStringList TrArgs{"--spirv-max-version=1.1", "--spirv-ext=+all"}; InputInfo TrInput = InputInfo(types::TY_LLVM_BC, TempFile, ""); diff --git a/clang/test/Driver/hipspv-options.hip b/clang/test/Driver/hipspv-options.hip new file mode 100644 --- /dev/null +++ b/clang/test/Driver/hipspv-options.hip @@ -0,0 +1,12 @@ +// REQUIRES: clang-driver +// REQUIRES: x86-registered-target +// UNSUPPORTED: system-windows + +// RUN: %clang -### -target x86_64-linux-gnu --offload=spirv64 \ +// RUN: --hip-path=%S/Inputs/hipspv -nogpuinc -nogpulib %s \ +// RUN: --spirv-use-llc=/foo/bar/llc 2>&1 | FileCheck %s + +// CHECK-NOT: llvm-spirv +// CHECK: "/foo/bar/llc" "--mattr=+spirv1.1" "--filetype=obj" "{{.*}}.bc" +// CHECK-SAME: "-o" "{{.*}}.out" +