https://github.com/kuilpd updated https://github.com/llvm/llvm-project/pull/203960
>From 93fea845381549590b58db341f898d9f7526e0ca Mon Sep 17 00:00:00 2001 From: Ilia Kuklin <[email protected]> Date: Thu, 21 May 2026 21:30:09 +0500 Subject: [PATCH 1/2] [Driver][DirectX] Add -Zss flag --- clang/include/clang/Options/Options.td | 2 ++ clang/lib/Driver/ToolChains/Clang.cpp | 5 ++++ .../lib/Target/DirectX/DXContainerGlobals.cpp | 20 +++++++++++-- .../DirectX/ContainerData/DebugShaderHash.ll | 30 +++++++++++++++---- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index fdc288b27017d..8b10d0b97075f 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9662,6 +9662,8 @@ def dxc_Fc : DXCJoinedOrSeparate<"Fc">, HelpText<"Output assembly listing file">; def dxc_Frs : DXCJoinedOrSeparate<"Frs">, HelpText<"Output additional root signature object file">; +def dxc_Zss : DXCFlag<"Zss">, + HelpText<"Compute Shader Hash considering source information">; def dxil_validator_version : Option<["/", "-"], "validator-version", KIND_SEPARATE>, Group<dxc_Group>, Flags<[HelpHidden]>, Visibility<[DXCOption, ClangOption, CC1Option]>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index dcab2e41391bb..5c40f20728554 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3838,6 +3838,11 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, if (!Args.hasArg(options::OPT_dxc_no_stdinc) && !Args.hasArg(options::OPT_nostdinc)) CmdArgs.push_back("-finclude-default-header"); + + if (Args.hasArg(options::OPT_dxc_Zss)) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-dx-Zss"); + } } static void RenderOpenACCOptions(const Driver &D, const ArgList &Args, diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp index 49a02d82bd108..63ec5a551f69c 100644 --- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp +++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp @@ -39,6 +39,8 @@ using namespace llvm; using namespace llvm::dxil; using namespace llvm::mcdxbc; +static cl::opt<bool> ShaderHashDependsOnSource( + "dx-Zss", cl::desc("Compute Shader Hash considering source information")); static cl::opt<std::string> PdbFileName("dx-pdb-file", cl::desc("Specify the PDB output file path for DirectX target"), @@ -129,10 +131,22 @@ void DXContainerGlobals::addSection(Module &M, void DXContainerGlobals::computeShaderHashAndDebugName( Module &M, SmallVector<GlobalValue *> &Globals) { - // TODO: Add -Zss flag to enable/disable calculating shader hash from ILDB. - auto *DXILConstant = - cast<ConstantDataArray>(M.getNamedGlobal("dx.dxil")->getInitializer()); + ConstantDataArray *DXILConstant; MD5 Digest; + dxbc::ShaderHash HashData = {0, {0}}; + + if (ShaderHashDependsOnSource) { + if (auto *ILDB = M.getNamedGlobal("dx.ildb")) { + DXILConstant = cast<ConstantDataArray>(ILDB->getInitializer()); + HashData.Flags = static_cast<uint32_t>(dxbc::HashFlags::IncludesSource); + } else { + reportFatalUsageError("/Zss requires debug info (/Zi or /Zs)"); + } + } else { + DXILConstant = + cast<ConstantDataArray>(M.getNamedGlobal("dx.dxil")->getInitializer()); + } + Digest.update(DXILConstant->getRawDataValues()); MD5::MD5Result Result = Digest.final(); dxbc::ShaderHash HashData = {0, {0}}; diff --git a/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll b/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll index c0febd5bf758d..1675367252121 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll @@ -1,5 +1,10 @@ ; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s -; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC + +; RUN: llc %s --filetype=obj -o - | obj2yaml -o %t0.yaml +; RUN: llc -dx-Zss %s --filetype=obj -o - | obj2yaml -o %t1.yaml +;; Put the YAML files together to compare matched hashes. +; RUN: cat %t0.yaml %t1.yaml | FileCheck %s --check-prefix=YAML + target triple = "dxil-unknown-shadermodel6.5-library" ; CHECK: @dx.hash = private constant [20 x i8] c"\00\00\00\00{{.*}}", section "HASH", align 4 @@ -18,8 +23,21 @@ define i32 @add(i32 %a, i32 %b) { !3 = !{i32 7, !"Dwarf Version", i32 2} !4 = !{i32 2, !"Debug Info Version", i32 3} -; DXC: - Name: HASH -; DXC: Size: 20 -; DXC: Hash: -; DXC: IncludesSource: false -; DXC: Digest: [ +;; Check that the default DXContainer has a hash that doesn't include the source +; YAML: --- !dxcontainer +; YAML: - Name: HASH +; YAML: Size: 20 +; YAML: Hash: +; YAML: IncludesSource: false +; YAML: Digest: [ [[HASH:.+]] +; YAML: ... + +;; Check that the -Zss DXContainer has a hash that includes the source and +;; is not the same as the hash from the other one. +; YAML: --- !dxcontainer +; YAML: - Name: HASH +; YAML: Size: 20 +; YAML: Hash: +; YAML: IncludesSource: true +; YAML: Digest: [ +; YAML-NOT: Digest: [ [[HASH]] >From 3283162cd7646c77a90a44712d31a310942c4dfe Mon Sep 17 00:00:00 2001 From: Ilia Kuklin <[email protected]> Date: Fri, 22 May 2026 20:58:40 +0500 Subject: [PATCH 2/2] [Driver][DirectX] Add -Zsb flag and fix/add flag tests --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 ++ clang/include/clang/Options/Options.td | 2 ++ clang/lib/Driver/ToolChains/Clang.cpp | 10 +++++++--- clang/test/Driver/dxc_debug.hlsl | 7 +++++++ llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 1 - .../CodeGen/DirectX/ContainerData/DebugShaderHash.ll | 2 +- llvm/test/CodeGen/DirectX/ContainerData/ShaderHash.ll | 6 ++++++ 7 files changed, 25 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 6aba0622be193..8edac14f4972a 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -881,6 +881,8 @@ 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_dxc_invalid_shader_hash + : Error<"cannot specify both /Zss and /Zsb">; 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 8b10d0b97075f..919d46c449750 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9664,6 +9664,8 @@ def dxc_Frs : DXCJoinedOrSeparate<"Frs">, HelpText<"Output additional root signature object file">; def dxc_Zss : DXCFlag<"Zss">, HelpText<"Compute Shader Hash considering source information">; +def dxc_Zsb : DXCFlag<"Zsb">, + HelpText<"Compute Shader Hash considering only output binary">; def dxil_validator_version : Option<["/", "-"], "validator-version", KIND_SEPARATE>, Group<dxc_Group>, Flags<[HelpHidden]>, Visibility<[DXCOption, ClangOption, CC1Option]>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 5c40f20728554..3f35000cfe455 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3808,8 +3808,8 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs, } } -static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, - types::ID InputType) { +static void RenderHLSLOptions(const Driver &D, const ArgList &Args, + ArgStringList &CmdArgs, types::ID InputType) { const unsigned ForwardedArguments[] = { options::OPT_hlsl_all_resources_bound, options::OPT_dxil_validator_version, @@ -3840,9 +3840,13 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, CmdArgs.push_back("-finclude-default-header"); if (Args.hasArg(options::OPT_dxc_Zss)) { + if (Args.hasArg(options::OPT_dxc_Zsb)) + D.Diag(diag::err_drv_dxc_invalid_shader_hash); CmdArgs.push_back("-mllvm"); CmdArgs.push_back("-dx-Zss"); } + if (Arg *A = Args.getLastArg(options::OPT_dxc_Zsb)) + A->claim(); // /Zsb is the default behavior, no need to forward it to llc. } static void RenderOpenACCOptions(const Driver &D, const ArgList &Args, @@ -7210,7 +7214,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, RenderOpenCLOptions(Args, CmdArgs, InputType); // Forward hlsl options to -cc1 - RenderHLSLOptions(Args, CmdArgs, InputType); + RenderHLSLOptions(D, Args, CmdArgs, InputType); // Forward OpenACC options to -cc1 RenderOpenACCOptions(D, Args, CmdArgs, InputType); diff --git a/clang/test/Driver/dxc_debug.hlsl b/clang/test/Driver/dxc_debug.hlsl index d250e95a0bfae..1a6c26c80750b 100644 --- a/clang/test/Driver/dxc_debug.hlsl +++ b/clang/test/Driver/dxc_debug.hlsl @@ -3,6 +3,7 @@ // RUN: %clang_dxc -Tlib_6_7 -### /Zi /Qembed_debug %s 2>&1 | FileCheck %s // RUN: %clang_dxc -Tlib_6_7 -### -Zi %s 2>&1 | FileCheck %s // RUN: %clang_dxc -Tlib_6_7 -### -Zi -Qembed_debug %s 2>&1 | FileCheck %s +// RUN: %clang_dxc -Tlib_6_7 -### -Zi -Zss %s 2>&1 | FileCheck %s --check-prefix=CHECK,CHECK-ZSS // RUN: %clang_dxc -Tlib_6_7 -### -Zi -gcodeview %s 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-CV // RUN: %clang_dxc -Tlib_6_7 -### -Zi -gdwarf %s 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-DWARF // RUN: %clang_dxc -Tlib_6_7 -### -gcodeview -Zi %s 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-CV @@ -13,6 +14,12 @@ // CHECK-SAME: "-debug-info-kind=constructor" // Make sure dwarf-version is 4. // CHECK-DWARF-SAME: -dwarf-version=4 +// Check that the flags are converted to their llc equivalents. +// CHECK-ZSS-SAME: -dx-Zss // Make sure dxc command line arguments are passed to clang invocation. // CHECK-SAME: -fdx-record-command-line // CHECK-CMD-SAME: --driver-mode=dxc -T lib_6_7 -### -g {{.*}}dxc_debug.hlsl + +// Check errors and warnings +// RUN: not %clang_dxc -Tlib_6_7 -### -Zss -Zsb %s 2>&1 | FileCheck %s --check-prefix=CHECK-ZSS-ZSB +// CHECK-ZSS-ZSB: cannot specify both /Zss and /Zsb diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp index 63ec5a551f69c..5a03b1854c9d7 100644 --- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp +++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp @@ -149,7 +149,6 @@ void DXContainerGlobals::computeShaderHashAndDebugName( Digest.update(DXILConstant->getRawDataValues()); MD5::MD5Result Result = Digest.final(); - dxbc::ShaderHash HashData = {0, {0}}; memcpy(reinterpret_cast<void *>(&HashData.Digest), Result.data(), 16); if (sys::IsBigEndianHost) diff --git a/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll b/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll index 1675367252121..ae4fb427887c6 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/DebugShaderHash.ll @@ -40,4 +40,4 @@ define i32 @add(i32 %a, i32 %b) { ; YAML: Hash: ; YAML: IncludesSource: true ; YAML: Digest: [ -; YAML-NOT: Digest: [ [[HASH]] +; YAML-NOT: [[HASH]] diff --git a/llvm/test/CodeGen/DirectX/ContainerData/ShaderHash.ll b/llvm/test/CodeGen/DirectX/ContainerData/ShaderHash.ll index 088a7b0071663..49539b384f5df 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/ShaderHash.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/ShaderHash.ll @@ -1,5 +1,11 @@ ; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s ; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC + +;; Check that llc reports an error when attempting to calculate shader hash with sources +;; when no debug info is present. +; RUN: not llc -dx-Zss %s --filetype=obj -o - 2>&1 | FileCheck %s --check-prefix=ZSS +; ZSS: /Zss requires debug info + target triple = "dxil-unknown-shadermodel6.5-library" ; CHECK: @dx.hash = private constant [20 x i8] c"\00\00\00\00{{.*}}", section "HASH", align 4 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
