diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index cc68348d04413..337460a2a0a1c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -9418,6 +9418,8 @@ def dxc_Fo : DXCJoinedOrSeparate<"Fo">, HelpText<"Output object file">; def dxc_Fc : DXCJoinedOrSeparate<"Fc">, HelpText<"Output assembly listing file">; +def dxc_Frs : DXCJoinedOrSeparate<"Frs">, + HelpText<"Output additional root signature object file">; def dxil_validator_version : Option<["/", "-"], "validator-version", KIND_SEPARATE>, Group, Flags<[HelpHidden]>, Visibility<[DXCOption, ClangOption, CC1Option]>, diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index b36297c169376..f4858e4c960de 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -337,7 +337,13 @@ void tools::hlsl::LLVMObjcopy::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Output.getFilename()); if (Args.hasArg(options::OPT_dxc_strip_rootsignature)) { - const char *Frs = Args.MakeArgString("--remove-section=RTS0"); + const char *StripRS = Args.MakeArgString("--remove-section=RTS0"); + CmdArgs.push_back(StripRS); + } + + if (Arg *Arg = Args.getLastArg(options::OPT_dxc_Frs)) { + const char *Frs = + Args.MakeArgString("--extract-section=RTS0=" + Twine(Arg->getValue())); CmdArgs.push_back(Frs); } @@ -524,7 +530,7 @@ bool HLSLToolChain::requiresBinaryTranslation(DerivedArgList &Args) const { bool HLSLToolChain::requiresObjcopy(DerivedArgList &Args) const { return Args.hasArg(options::OPT_dxc_Fo) && (Args.hasArg(options::OPT_dxc_strip_rootsignature) || - isRootSignatureTarget(Args)); + Args.hasArg(options::OPT_dxc_Frs) || isRootSignatureTarget(Args)); } bool HLSLToolChain::isLastJob(DerivedArgList &Args, diff --git a/clang/test/Driver/dxc_frs.hlsl b/clang/test/Driver/dxc_frs.hlsl new file mode 100644 index 0000000000000..767cab604c829 --- /dev/null +++ b/clang/test/Driver/dxc_frs.hlsl @@ -0,0 +1,10 @@ +// RUN: %clang_dxc -T cs_6_0 /Fo %t.dxo /Frs %t.rs.dxo -### %s 2>&1 | FileCheck %s + +// Test to demonstrate extracting the root signature to the specified +// output file with /Frs. + +// CHECK: "{{.*}}llvm-objcopy{{(.exe)?}}" "{{.*}}.obj" "{{.*}}.dxo" "--extract-section=RTS0={{.*}}.rs.dxo" + +[shader("compute"), RootSignature("")] +[numthreads(1,1,1)] +void EmptyEntry() {}