Author: Chris B Date: 2026-02-26T13:47:33-06:00 New Revision: 3d469665a286cac528c2ef2fb018032d80843716
URL: https://github.com/llvm/llvm-project/commit/3d469665a286cac528c2ef2fb018032d80843716 DIFF: https://github.com/llvm/llvm-project/commit/3d469665a286cac528c2ef2fb018032d80843716.diff LOG: [Metal][HLSL] Add support for dumping reflection (#181258) The Metal Shader converter can output shader reflection information into a JSON file. This connects the -Fre flag (DXC's flag for reflection) to the Metal Shader Converter tool step to produce the JSON file. As a temporary state the -Fre flag will error when used without the -metal flag. This is required to address https://github.com/llvm/offload-test-suite/issues/452 Added: clang/test/Driver/HLSL/fre-errors.hlsl Modified: clang/include/clang/Basic/DiagnosticDriverKinds.td clang/include/clang/Options/Options.td clang/lib/Driver/ToolChains/HLSL.cpp clang/test/Driver/HLSL/metal-converter.hlsl Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 3206b5c78a6f1..0fe61d94e4076 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -847,6 +847,8 @@ def err_drv_dxc_invalid_matrix_layout : Error< "cannot specify /Zpr and /Zpc together">; def err_drv_dxc_missing_target_profile : Error< "target profile option (-T) is missing">; +def err_drv_dxc_Fre_requires_Fo_metal + : Error<"-Fre option requires -Fo option when targeting Metal">; def err_drv_hlsl_unsupported_target : Error< "HLSL code generation is unsupported for target '%0'">; def err_drv_hlsl_bad_shader_required_in_target : Error< diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index c8a1e478122e1..5c0a6e3c913ea 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9795,6 +9795,8 @@ def dxc_no_stdinc : DXCFlag<"hlsl-no-stdinc">, HelpText<"HLSL only. Disables all standard includes containing non-native compiler types and functions.">; def dxc_Fo : DXCJoinedOrSeparate<"Fo">, HelpText<"Output object file">; +def dxc_Fre : DXCJoinedOrSeparate<"Fre">, + HelpText<"Set output file name for reflection files">; def dxc_Fc : DXCJoinedOrSeparate<"Fc">, HelpText<"Output assembly listing file">; def dxc_Frs : DXCJoinedOrSeparate<"Frs">, diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 28835d5077db7..1070f0ef6ee9e 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -327,6 +327,13 @@ void tools::hlsl::MetalConverter::ConstructJob( CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); + StringRef Reflection = Args.getLastArgValue(options::OPT_dxc_Fre); + if (!Reflection.empty()) { + const char *ReflectionStr = + Args.MakeArgString(StringRef("--output-reflection-file=") + Reflection); + CmdArgs.push_back(ReflectionStr); + } + const char *Exec = Args.MakeArgString(MSCPath); C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, Inputs, Input)); @@ -531,6 +538,21 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch, continue; } + // This is a temporary check until we support reflection generation for + // other targets. + if (A->getOption().getID() == options::OPT_dxc_Fre) { + if (Args.hasArg(options::OPT_metal)) { + if (!Args.hasArg(options::OPT_dxc_Fo)) + getDriver().Diag(diag::err_drv_dxc_Fre_requires_Fo_metal); + } else + getDriver().Diag(diag::err_drv_unsupported_opt_for_target) + << "-Fre" << getTriple().getArchName(); + A->claim(); + DAL->AddSeparateArg(nullptr, Opts.getOption(options::OPT_dxc_Fre), + A->getValue()); + continue; + } + DAL->append(A); } diff --git a/clang/test/Driver/HLSL/fre-errors.hlsl b/clang/test/Driver/HLSL/fre-errors.hlsl new file mode 100644 index 0000000000000..84f7bf048bb16 --- /dev/null +++ b/clang/test/Driver/HLSL/fre-errors.hlsl @@ -0,0 +1,8 @@ +// These are placeholder errors since we do not currently support -Fre to +// generate reflection data for DXIL or SPIRV targets. + +// RUN: env PATH="" not %clang_dxc -T cs_6_0 %s -Fre blah.json -Vd -### 2>&1 | FileCheck --check-prefix=FRE_DXIL %s +// FRE_DXIL: error: unsupported option '-Fre' for target 'dxilv1.0' + +// RUN: env PATH="" not %clang_dxc -T cs_6_0 %s -spirv -Fre blah.json -Vd -### 2>&1 | FileCheck --check-prefix=FRE_SPV %s +// FRE_SPV: error: unsupported option '-Fre' for target 'spirv1.6' diff --git a/clang/test/Driver/HLSL/metal-converter.hlsl b/clang/test/Driver/HLSL/metal-converter.hlsl index 5c139c62e826b..46a9e06a147fc 100644 --- a/clang/test/Driver/HLSL/metal-converter.hlsl +++ b/clang/test/Driver/HLSL/metal-converter.hlsl @@ -6,6 +6,14 @@ // RUN: env PATH="" %clang_dxc -T cs_6_0 %s --dxv-path=%t.dir -metal -Vd -Fo %t.mtl -### 2>&1 | FileCheck --check-prefix=NO_DXV %s // NO_DXV: "{{.*}}metal-shaderconverter{{(.exe)?}}" "{{.*}}.obj" "-o" "{{.*}}.mtl" +// RUN: env PATH="" %clang_dxc -T cs_6_0 %s -metal -Fre blah.json -Vd -Fo %t.mtl -### 2>&1 | FileCheck --check-prefix=FRE %s +// FRE: "{{.*}}metal-shaderconverter{{(.exe)?}}" "{{.*}}.obj" "-o" "{{.*}}.mtl" "--output-reflection-file=blah.json" + +// RUN: env PATH="" not %clang_dxc -T cs_6_0 %s -metal -Fre blah.json -Vd -### 2>&1 | FileCheck --check-prefix=FRE_ERR %s +// FRE_ERR: error: -Fre option requires -Fo option when targeting Metal + +// Does not generate the metal IR when the output file is not specified since we +// cannot disassemble the metal IR reliably. // RUN: %clang_dxc -T cs_6_0 %s -metal -### 2>&1 | FileCheck --check-prefix=NO_MTL %s // NO_MTL-NOT: metal-shaderconverter _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
