https://github.com/inbelic updated 
https://github.com/llvm/llvm-project/pull/154454

>From 9a418dfebbebd583aca8527eca4f6b0209263b15 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienf...@gmail.com>
Date: Fri, 8 Aug 2025 17:16:06 +0000
Subject: [PATCH 1/4] add BinaryModifyJobClass

---
 clang/include/clang/Driver/Action.h | 14 +++++++++++++-
 clang/lib/Driver/Action.cpp         |  7 +++++++
 clang/lib/Driver/ToolChain.cpp      |  1 +
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Driver/Action.h 
b/clang/include/clang/Driver/Action.h
index 7aecfd886adb8..6fc515f9e4049 100644
--- a/clang/include/clang/Driver/Action.h
+++ b/clang/include/clang/Driver/Action.h
@@ -76,9 +76,10 @@ class Action {
     StaticLibJobClass,
     BinaryAnalyzeJobClass,
     BinaryTranslatorJobClass,
+    BinaryModifyJobClass,
 
     JobClassFirst = PreprocessJobClass,
-    JobClassLast = BinaryTranslatorJobClass
+    JobClassLast = BinaryModifyJobClass
   };
 
   // The offloading kind determines if this action is binded to a particular
@@ -687,6 +688,17 @@ class BinaryTranslatorJobAction : public JobAction {
   }
 };
 
+class BinaryModifyJobAction : public JobAction {
+  void anchor() override;
+
+public:
+  BinaryModifyJobAction(Action *Input, types::ID Type);
+
+  static bool classof(const Action *A) {
+    return A->getKind() == BinaryModifyJobClass;
+  }
+};
+
 } // namespace driver
 } // namespace clang
 
diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp
index ec09726044812..fbf80b3c6f124 100644
--- a/clang/lib/Driver/Action.cpp
+++ b/clang/lib/Driver/Action.cpp
@@ -52,6 +52,8 @@ const char *Action::getClassName(ActionClass AC) {
     return "binary-analyzer";
   case BinaryTranslatorJobClass:
     return "binary-translator";
+  case BinaryModifyJobClass:
+    return "binary-modifier";
   }
 
   llvm_unreachable("invalid class");
@@ -467,3 +469,8 @@ void BinaryTranslatorJobAction::anchor() {}
 BinaryTranslatorJobAction::BinaryTranslatorJobAction(Action *Input,
                                                      types::ID Type)
     : JobAction(BinaryTranslatorJobClass, Input, Type) {}
+
+void BinaryModifyJobAction::anchor() {}
+
+BinaryModifyJobAction::BinaryModifyJobAction(Action *Input, types::ID Type)
+    : JobAction(BinaryModifyJobClass, Input, Type) {}
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 25c6b5a486fd5..713bda1d7244d 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -652,6 +652,7 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const {
   case Action::VerifyDebugInfoJobClass:
   case Action::BinaryAnalyzeJobClass:
   case Action::BinaryTranslatorJobClass:
+  case Action::BinaryModifyJobClass:
     llvm_unreachable("Invalid tool kind.");
 
   case Action::CompileJobClass:

>From 4887c6029deca7048437f3cf58fd70a8463975eb Mon Sep 17 00:00:00 2001
From: Finn Plummer <m...@inbelic.dev>
Date: Tue, 19 Aug 2025 18:35:51 -0700
Subject: [PATCH 2/4] [HLSL] Add the `Qstrip-rootsignature` DXC driver option

---
 clang/include/clang/Basic/CodeGenOptions.def  |  3 ++
 clang/include/clang/Driver/Options.td         |  6 +++
 clang/lib/Driver/Driver.cpp                   | 10 +++++
 clang/lib/Driver/ToolChains/HLSL.cpp          | 41 ++++++++++++++++++-
 clang/lib/Driver/ToolChains/HLSL.h            | 15 +++++++
 .../test/Driver/dxc_strip_rootsignature.hlsl  | 22 ++++++++++
 6 files changed, 95 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Driver/dxc_strip_rootsignature.hlsl

diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index 423b696785500..89e9f5b5853bb 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -479,6 +479,9 @@ CODEGENOPT(StaticClosure, 1, 0, Benign)
 /// Assume that UAVs/SRVs may alias
 CODEGENOPT(ResMayAlias, 1, 0, Benign)
 
+/// Omit the root signature from produced DXContainer
+CODEGENOPT(HLSLRootSigStrip, 1, 0, Benign)
+
 /// Controls how unwind v2 (epilog) information should be generated for x64
 /// Windows.
 ENUM_CODEGENOPT(WinX64EHUnwindV2, WinX64EHUnwindV2Mode,
diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 6aab43c9ed57f..1bd3f09ae1df1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -9381,6 +9381,12 @@ def res_may_alias : Option<["/", "-"], "res-may-alias", 
KIND_FLAG>,
   Visibility<[DXCOption, ClangOption, CC1Option]>,
   HelpText<"Assume that UAVs/SRVs may alias">,
   MarshallingInfoFlag<CodeGenOpts<"ResMayAlias">>;
+def dxc_strip_rootsignature :
+  Option<["/", "-"], "Qstrip-rootsignature", KIND_FLAG>,
+  Group<dxc_Group>,
+  Visibility<[DXCOption]>,
+  HelpText<"Omit the root signature from produced DXContainer">,
+  MarshallingInfoFlag<CodeGenOpts<"HLSLRootSigStrip">>;
 def target_profile : DXCJoinedOrSeparate<"T">, MetaVarName<"<profile>">,
   HelpText<"Set target profile">,
   Values<"ps_6_0, ps_6_1, ps_6_2, ps_6_3, ps_6_4, ps_6_5, ps_6_6, ps_6_7,"
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 586f287843f3e..59a4eadcd5d85 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4601,6 +4601,16 @@ void Driver::BuildActions(Compilation &C, DerivedArgList 
&Args,
         Actions.push_back(C.MakeAction<BinaryTranslatorJobAction>(
             LastAction, types::TY_DX_CONTAINER));
     }
+    if (TC.requiresObjcopy(Args)) {
+      Action *LastAction = Actions.back();
+      // llvm-objcopy expects a DXIL container, which can either be
+      // validated (in which case they are TY_DX_CONTAINER), or unvalidated
+      // (TY_OBJECT).
+      if (LastAction->getType() == types::TY_DX_CONTAINER ||
+          LastAction->getType() == types::TY_Object)
+        Actions.push_back(C.MakeAction<BinaryModifyJobAction>(
+            LastAction, types::TY_DX_CONTAINER));
+    }
   }
 
   // Claim ignored clang-cl options.
diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp 
b/clang/lib/Driver/ToolChains/HLSL.cpp
index 38f4643abad98..a554c15f1e7c6 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -247,6 +247,30 @@ void tools::hlsl::MetalConverter::ConstructJob(
                                          Exec, CmdArgs, Inputs, Input));
 }
 
+void tools::hlsl::LLVMObjcopy::ConstructJob(Compilation &C, const JobAction 
&JA,
+                                            const InputInfo &Output,
+                                            const InputInfoList &Inputs,
+                                            const ArgList &Args,
+                                            const char *LinkingOutput) const {
+
+  std::string ObjcopyPath = getToolChain().GetProgramPath("llvm-objcopy");
+  const char *Exec = Args.MakeArgString(ObjcopyPath);
+
+  ArgStringList CmdArgs;
+  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
+  const InputInfo &Input = Inputs[0];
+  CmdArgs.push_back(Input.getFilename());
+  CmdArgs.push_back(Output.getFilename());
+
+  if (Args.hasArg(options::OPT_dxc_strip_rootsignature)) {
+    const char *Frs = Args.MakeArgString("--remove-section=RTS0");
+    CmdArgs.push_back(Frs);
+  }
+
+  C.addCommand(std::make_unique<Command>(JA, *this, 
ResponseFileSupport::None(),
+                                         Exec, CmdArgs, Inputs, Input));
+}
+
 /// DirectX Toolchain
 HLSLToolChain::HLSLToolChain(const Driver &D, const llvm::Triple &Triple,
                              const ArgList &Args)
@@ -267,6 +291,10 @@ Tool *clang::driver::toolchains::HLSLToolChain::getTool(
     if (!MetalConverter)
       MetalConverter.reset(new tools::hlsl::MetalConverter(*this));
     return MetalConverter.get();
+  case Action::BinaryModifyJobClass:
+    if (!LLVMObjcopy)
+      LLVMObjcopy.reset(new tools::hlsl::LLVMObjcopy(*this));
+    return LLVMObjcopy.get();
   default:
     return ToolChain::getTool(AC);
   }
@@ -404,16 +432,25 @@ bool 
HLSLToolChain::requiresBinaryTranslation(DerivedArgList &Args) const {
   return Args.hasArg(options::OPT_metal) && Args.hasArg(options::OPT_dxc_Fo);
 }
 
+bool HLSLToolChain::requiresObjcopy(DerivedArgList &Args) const {
+  return Args.hasArg(options::OPT_dxc_Fo) &&
+         Args.hasArg(options::OPT_dxc_strip_rootsignature);
+}
+
 bool HLSLToolChain::isLastJob(DerivedArgList &Args,
                               Action::ActionClass AC) const {
   bool HasTranslation = requiresBinaryTranslation(Args);
   bool HasValidation = requiresValidation(Args);
+  bool HasObjcopy = requiresObjcopy(Args);
   // If translation and validation are not required, we should only have one
   // action.
-  if (!HasTranslation && !HasValidation)
+  if (!HasTranslation && !HasValidation && !HasObjcopy)
     return true;
   if ((HasTranslation && AC == Action::BinaryTranslatorJobClass) ||
-      (!HasTranslation && HasValidation && AC == 
Action::BinaryAnalyzeJobClass))
+      (!HasTranslation && HasValidation &&
+       AC == Action::BinaryAnalyzeJobClass) ||
+      (!HasTranslation && !HasValidation && HasObjcopy &&
+       AC == Action::BinaryModifyJobClass))
     return true;
   return false;
 }
diff --git a/clang/lib/Driver/ToolChains/HLSL.h 
b/clang/lib/Driver/ToolChains/HLSL.h
index 3824b4252324b..b81141b26b4e6 100644
--- a/clang/lib/Driver/ToolChains/HLSL.h
+++ b/clang/lib/Driver/ToolChains/HLSL.h
@@ -42,6 +42,19 @@ class LLVM_LIBRARY_VISIBILITY MetalConverter : public Tool {
                     const llvm::opt::ArgList &TCArgs,
                     const char *LinkingOutput) const override;
 };
+
+class LLVM_LIBRARY_VISIBILITY LLVMObjcopy : public Tool {
+public:
+  LLVMObjcopy(const ToolChain &TC)
+      : Tool("hlsl::LLVMObjcopy", "llvm-objcopy", TC) {}
+
+  bool hasIntegratedCPP() const override { return false; }
+
+  void ConstructJob(Compilation &C, const JobAction &JA,
+                    const InputInfo &Output, const InputInfoList &Inputs,
+                    const llvm::opt::ArgList &TCArgs,
+                    const char *LinkingOutput) const override;
+};
 } // namespace hlsl
 } // namespace tools
 
@@ -65,6 +78,7 @@ class LLVM_LIBRARY_VISIBILITY HLSLToolChain : public 
ToolChain {
   static std::optional<std::string> parseTargetProfile(StringRef 
TargetProfile);
   bool requiresValidation(llvm::opt::DerivedArgList &Args) const;
   bool requiresBinaryTranslation(llvm::opt::DerivedArgList &Args) const;
+  bool requiresObjcopy(llvm::opt::DerivedArgList &Args) const;
   bool isLastJob(llvm::opt::DerivedArgList &Args, Action::ActionClass AC) 
const;
 
   // Set default DWARF version to 4 for DXIL uses version 4.
@@ -73,6 +87,7 @@ class LLVM_LIBRARY_VISIBILITY HLSLToolChain : public 
ToolChain {
 private:
   mutable std::unique_ptr<tools::hlsl::Validator> Validator;
   mutable std::unique_ptr<tools::hlsl::MetalConverter> MetalConverter;
+  mutable std::unique_ptr<tools::hlsl::LLVMObjcopy> LLVMObjcopy;
 };
 
 } // end namespace toolchains
diff --git a/clang/test/Driver/dxc_strip_rootsignature.hlsl 
b/clang/test/Driver/dxc_strip_rootsignature.hlsl
new file mode 100644
index 0000000000000..b4af1f4b1541d
--- /dev/null
+++ b/clang/test/Driver/dxc_strip_rootsignature.hlsl
@@ -0,0 +1,22 @@
+// RUN: %clang_dxc -Qstrip-rootsignature -T cs_6_0 -HV 202x -Vd /Fo %t %s
+// RUN: obj2yaml %t | FileCheck %s
+// RUN: obj2yaml %t | FileCheck %s --check-prefix=OTHERS
+
+// Test to demonstrate that we specify to the root signature with the
+// -Qstrip-rootsignature option
+
+// CHECK-NOT: RTS0
+
+// OTHERS: FileSize:       1964
+// OTHERS-NEXT: PartCount:      6
+// OTHERS: Parts:
+// OTHERS: Name:            DXIL
+// OTHERS: Name:            SFI0
+// OTHERS: Name:            HASH
+// OTHERS: Name:            ISG1
+// OTHERS: Name:            OSG1
+// OTHERS: Name:            PSV0
+
+[shader("compute"), RootSignature("")]
+[numthreads(1,1,1)]
+void EmptyEntry() {}

>From ebae438ab14f1103fc1642dfa790f60fc0732878 Mon Sep 17 00:00:00 2001
From: Finn Plummer <m...@inbelic.dev>
Date: Tue, 19 Aug 2025 18:45:16 -0700
Subject: [PATCH 3/4] fix comment typo

---
 clang/test/Driver/dxc_strip_rootsignature.hlsl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/Driver/dxc_strip_rootsignature.hlsl 
b/clang/test/Driver/dxc_strip_rootsignature.hlsl
index b4af1f4b1541d..bd624dc55df82 100644
--- a/clang/test/Driver/dxc_strip_rootsignature.hlsl
+++ b/clang/test/Driver/dxc_strip_rootsignature.hlsl
@@ -2,7 +2,7 @@
 // RUN: obj2yaml %t | FileCheck %s
 // RUN: obj2yaml %t | FileCheck %s --check-prefix=OTHERS
 
-// Test to demonstrate that we specify to the root signature with the
+// Test to demonstrate that we specify to strip the root signature with the
 // -Qstrip-rootsignature option
 
 // CHECK-NOT: RTS0

>From a6391c8ac0f2994d14f98101b1fddd561cf63568 Mon Sep 17 00:00:00 2001
From: Finn Plummer <m...@inbelic.dev>
Date: Tue, 19 Aug 2025 20:45:17 -0700
Subject: [PATCH 4/4] use valid version

---
 clang/test/Driver/dxc_strip_rootsignature.hlsl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/Driver/dxc_strip_rootsignature.hlsl 
b/clang/test/Driver/dxc_strip_rootsignature.hlsl
index bd624dc55df82..b08f182738e6d 100644
--- a/clang/test/Driver/dxc_strip_rootsignature.hlsl
+++ b/clang/test/Driver/dxc_strip_rootsignature.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_dxc -Qstrip-rootsignature -T cs_6_0 -HV 202x -Vd /Fo %t %s
+// RUN: %clang_dxc -Qstrip-rootsignature -T cs_6_6 -HV 202x -Vd /Fo %t %s
 // RUN: obj2yaml %t | FileCheck %s
 // RUN: obj2yaml %t | FileCheck %s --check-prefix=OTHERS
 
@@ -7,7 +7,7 @@
 
 // CHECK-NOT: RTS0
 
-// OTHERS: FileSize:       1964
+// OTHERS: FileSize:       1956
 // OTHERS-NEXT: PartCount:      6
 // OTHERS: Parts:
 // OTHERS: Name:            DXIL

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to