Skip to content

Commit d3c72d6

Browse files
authored
[HLSL] Add the Frs DXC driver option (#157690)
This pr adds `Frs` as a `DXC` driver option. It is done by invoking `llvm-objcopy` with the `extract-section=RTS0` argument specified to output the separate `DXContainer`. Option behaviour as a reference is found [here](https://github.com/llvm/wg-hlsl/blob/main/proposals/0029-root-signature-driver-options.md#option-frs). This resolves: #150277.
1 parent 6a9d43a commit d3c72d6

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9418,6 +9418,8 @@ def dxc_Fo : DXCJoinedOrSeparate<"Fo">,
94189418
HelpText<"Output object file">;
94199419
def dxc_Fc : DXCJoinedOrSeparate<"Fc">,
94209420
HelpText<"Output assembly listing file">;
9421+
def dxc_Frs : DXCJoinedOrSeparate<"Frs">,
9422+
HelpText<"Output additional root signature object file">;
94219423
def dxil_validator_version : Option<["/", "-"], "validator-version", KIND_SEPARATE>,
94229424
Group<dxc_Group>, Flags<[HelpHidden]>,
94239425
Visibility<[DXCOption, ClangOption, CC1Option]>,

clang/lib/Driver/ToolChains/HLSL.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,13 @@ void tools::hlsl::LLVMObjcopy::ConstructJob(Compilation &C, const JobAction &JA,
337337
CmdArgs.push_back(Output.getFilename());
338338

339339
if (Args.hasArg(options::OPT_dxc_strip_rootsignature)) {
340-
const char *Frs = Args.MakeArgString("--remove-section=RTS0");
340+
const char *StripRS = Args.MakeArgString("--remove-section=RTS0");
341+
CmdArgs.push_back(StripRS);
342+
}
343+
344+
if (Arg *Arg = Args.getLastArg(options::OPT_dxc_Frs)) {
345+
const char *Frs =
346+
Args.MakeArgString("--extract-section=RTS0=" + Twine(Arg->getValue()));
341347
CmdArgs.push_back(Frs);
342348
}
343349

@@ -524,7 +530,7 @@ bool HLSLToolChain::requiresBinaryTranslation(DerivedArgList &Args) const {
524530
bool HLSLToolChain::requiresObjcopy(DerivedArgList &Args) const {
525531
return Args.hasArg(options::OPT_dxc_Fo) &&
526532
(Args.hasArg(options::OPT_dxc_strip_rootsignature) ||
527-
isRootSignatureTarget(Args));
533+
Args.hasArg(options::OPT_dxc_Frs) || isRootSignatureTarget(Args));
528534
}
529535

530536
bool HLSLToolChain::isLastJob(DerivedArgList &Args,

clang/test/Driver/dxc_frs.hlsl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %clang_dxc -T cs_6_0 /Fo %t.dxo /Frs %t.rs.dxo -### %s 2>&1 | FileCheck %s
2+
3+
// Test to demonstrate extracting the root signature to the specified
4+
// output file with /Frs.
5+
6+
// CHECK: "{{.*}}llvm-objcopy{{(.exe)?}}" "{{.*}}.obj" "{{.*}}.dxo" "--extract-section=RTS0={{.*}}.rs.dxo"
7+
8+
[shader("compute"), RootSignature("")]
9+
[numthreads(1,1,1)]
10+
void EmptyEntry() {}

0 commit comments

Comments
 (0)