From 12fe63da4994d16ba10c5ebc7aa3f754d2f2c31c Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Tue, 12 Aug 2025 19:00:19 +0000 Subject: [PATCH 1/9] add an unimplemented common option `split-section` to `objcopy` --- llvm/include/llvm/ObjCopy/CommonConfig.h | 1 + llvm/lib/ObjCopy/ConfigManager.cpp | 15 +++++++-------- llvm/tools/llvm-objcopy/CommonOpts.td | 5 +++++ llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 8 ++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/ObjCopy/CommonConfig.h b/llvm/include/llvm/ObjCopy/CommonConfig.h index faa7b0db757a3..cb743d10fe220 100644 --- a/llvm/include/llvm/ObjCopy/CommonConfig.h +++ b/llvm/include/llvm/ObjCopy/CommonConfig.h @@ -233,6 +233,7 @@ struct CommonConfig { SmallVector DumpSection; SmallVector UpdateSection; SmallVector ChangeSectionAddress; + SmallVector SplitSection; // Section matchers NameMatcher KeepSection; diff --git a/llvm/lib/ObjCopy/ConfigManager.cpp b/llvm/lib/ObjCopy/ConfigManager.cpp index c598795d4c006..2461e69179d39 100644 --- a/llvm/lib/ObjCopy/ConfigManager.cpp +++ b/llvm/lib/ObjCopy/ConfigManager.cpp @@ -27,7 +27,7 @@ Expected ConfigManager::getCOFFConfig() const { Common.DiscardMode == DiscardType::Locals || !Common.SymbolsToAdd.empty() || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty()) + !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) return createStringError(llvm::errc::invalid_argument, "option is not supported for COFF"); @@ -48,7 +48,7 @@ Expected ConfigManager::getMachOConfig() const { Common.DiscardMode == DiscardType::Locals || !Common.SymbolsToAdd.empty() || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty()) + !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) return createStringError(llvm::errc::invalid_argument, "option is not supported for MachO"); @@ -69,7 +69,7 @@ Expected ConfigManager::getWasmConfig() const { !Common.SetSectionFlags.empty() || !Common.SetSectionType.empty() || !Common.SymbolsToRename.empty() || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty()) + !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) return createStringError(llvm::errc::invalid_argument, "only flags for section dumping, removal, and " "addition are supported"); @@ -99,7 +99,7 @@ Expected ConfigManager::getXCOFFConfig() const { Common.Weaken || Common.StripUnneeded || Common.DecompressDebugSections || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty()) { + !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) { return createStringError( llvm::errc::invalid_argument, "no flags are supported yet, only basic copying is allowed"); @@ -125,10 +125,9 @@ ConfigManager::getDXContainerConfig() const { Common.StripUnneeded || Common.DecompressDebugSections || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty()) { - return createStringError( - llvm::errc::invalid_argument, - "no flags are supported yet, only basic copying is allowed"); + !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) { + return createStringError(llvm::errc::invalid_argument, + "option is not supported for directx"); } // If a flag is listed here, then it has support for DXContainer: diff --git a/llvm/tools/llvm-objcopy/CommonOpts.td b/llvm/tools/llvm-objcopy/CommonOpts.td index c247c93f6e0f2..85b39602701ed 100644 --- a/llvm/tools/llvm-objcopy/CommonOpts.td +++ b/llvm/tools/llvm-objcopy/CommonOpts.td @@ -69,6 +69,11 @@ def strip_sections : Flag<["--"], "strip-sections">, HelpText<"Remove all section headers and all section data not within segments">; +defm split_section + : Eq<"split-section", + "Split section named
into standalone object in file ">, + MetaVarName<"section=file">; + defm strip_symbol : Eq<"strip-symbol", "Strip ">, MetaVarName<"symbol">; def N : JoinedOrSeparate<["-"], "N">, diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 175f77c894825..152a700a5814c 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -1082,6 +1082,14 @@ objcopy::parseObjcopyOptions(ArrayRef ArgsArr, "bad format for --dump-section, expected section=file"); Config.DumpSection.push_back(Value); } + for (auto *Arg : InputArgs.filtered(OBJCOPY_split_section)) { + StringRef Value(Arg->getValue()); + if (Value.split('=').second.empty()) + return createStringError( + errc::invalid_argument, + "bad format for --split-section, expected section=file"); + Config.SplitSection.push_back(Value); + } Config.StripAll = InputArgs.hasArg(OBJCOPY_strip_all); Config.StripAllGNU = InputArgs.hasArg(OBJCOPY_strip_all_gnu); Config.StripDebug = InputArgs.hasArg(OBJCOPY_strip_debug); From 6933175c7b9b81e74ef5ba1d7b03216f98a24148 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Tue, 12 Aug 2025 19:29:20 +0000 Subject: [PATCH 2/9] add support for `split-section` for `dxcontainer` --- llvm/lib/ObjCopy/ConfigManager.cpp | 4 +-- .../DXContainer/DXContainerObjcopy.cpp | 33 +++++++++++++++++++ .../ObjCopy/DXContainer/DXContainerObject.h | 2 -- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/llvm/lib/ObjCopy/ConfigManager.cpp b/llvm/lib/ObjCopy/ConfigManager.cpp index 2461e69179d39..c31bfc1bb454a 100644 --- a/llvm/lib/ObjCopy/ConfigManager.cpp +++ b/llvm/lib/ObjCopy/ConfigManager.cpp @@ -125,12 +125,12 @@ ConfigManager::getDXContainerConfig() const { Common.StripUnneeded || Common.DecompressDebugSections || Common.GapFill != 0 || Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 || - !Common.ChangeSectionAddress.empty() || !Common.SplitSection.empty()) { + !Common.ChangeSectionAddress.empty()) { return createStringError(llvm::errc::invalid_argument, "option is not supported for directx"); } // If a flag is listed here, then it has support for DXContainer: - // Common.PreserveDates, Common.ToRemove + // Common.PreserveDates, Common.ToRemove, Common.SplitSection return DXContainer; } diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp index a6a978d969255..f10171ca7b498 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp @@ -11,6 +11,7 @@ #include "DXContainerWriter.h" #include "llvm/ObjCopy/CommonConfig.h" #include "llvm/ObjCopy/DXContainer/DXContainerConfig.h" +#include "llvm/Support/raw_ostream.h" namespace llvm { namespace objcopy { @@ -18,6 +19,29 @@ namespace dxbc { using namespace object; +static Error splitPartAsObject(StringRef PartName, StringRef OutFilename, + StringRef InputFilename, const Object &Obj) { + for (const Part &P : Obj.Parts) + if (P.Name == PartName) { + auto PartObj = std::make_unique(); + PartObj->Header = Obj.Header; + PartObj->Parts.push_back({P.Name, P.Data}); + PartObj->recomputeHeader(); + + auto Write = [&OutFilename, &PartObj](raw_ostream &Out) -> Error { + DXContainerWriter Writer(*PartObj, Out); + if (Error E = Writer.write()) + return createFileError(OutFilename, std::move(E)); + return Error::success(); + }; + + return writeToOutput(OutFilename, Write); + } + + return createFileError(InputFilename, object_error::parse_failed, + "part '%s' not found", PartName.str().c_str()); +} + static Error handleArgs(const CommonConfig &Config, Object &Obj) { std::function RemovePred = [](const Part &) { return false; @@ -31,6 +55,15 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { if (auto E = Obj.removeParts(RemovePred)) return E; + for (StringRef Flag : Config.SplitSection) { + StringRef SectionName; + StringRef FileName; + std::tie(SectionName, FileName) = Flag.split('='); + if (Error E = + splitPartAsObject(SectionName, FileName, Config.InputFilename, Obj)) + return E; + } + return Error::success(); } diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h b/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h index 9dcf01e3a3a2a..cbb09f5ec8e0d 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h @@ -42,8 +42,6 @@ struct Object { } Error removeParts(PartPred ToRemove); - -private: void recomputeHeader(); }; From 8bc97854737bf674823748c05ed09a611b738b7b Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Tue, 12 Aug 2025 19:46:22 +0000 Subject: [PATCH 3/9] add basic test cases --- .../llvm-objcopy/DXContainer/basic-split.test | 306 ++++++++++++++++++ .../DXContainer/headers-split.test | 53 +++ 2 files changed, 359 insertions(+) create mode 100644 llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test create mode 100644 llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test new file mode 100644 index 0000000000000..7142567b13dcb --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test @@ -0,0 +1,306 @@ +## Tests that a separate DXContainer is created for the RTS0 (root signature) +## part, specified with --split-section specified + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t --split-section=RTS0=%t.out +# RUN: obj2yaml %t.out | FileCheck %s + +## The DXContainer described below was generated with: + +## `clang-dxc -T cs_6_7 test.hlsl /Fo temp.dxo` +## `obj2yaml temp.dxo` + +## ``` test.hlsl +## [RootSignature("")] +## [numthreads(1,1,1)] +## void main() {} +## ``` + +--- !dxcontainer +Header: + Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] + Version: + Major: 1 + Minor: 0 +## CHECK: FileSize: 68 + FileSize: 1984 +## CHECK: PartCount: 1 +## CHECK: PartOffsets: [ 36 ] + PartCount: 7 + PartOffsets: [ 60, 1792, 1808, 1836, 1852, 1868, 1900 ] +Parts: +## CHECK: Name: RTS0 +## CHECK-NOT: DXIL +## CHECK-NOT: SFI0 +## CHECK-NOT: HASH +## CHECK-NOT: ISG1 +## CHECK-NOT: OSG1 +## CHECK-NOT: PSV0 +## CHECK-NOT: DXIL + - Name: DXIL + Size: 1724 + Program: + MajorVersion: 6 + MinorVersion: 7 + ShaderKind: 5 + Size: 431 + DXILMajorVersion: 1 + DXILMinorVersion: 7 + DXILSize: 1700 + DXIL: [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0xA6, + 0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, + 0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, + 0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, + 0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, + 0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, + 0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, + 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, + 0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, + 0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, + 0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, + 0x51, 0x18, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1B, + 0x90, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x7, 0xC0, + 0x1, 0x24, 0x80, 0x2, 0x0, 0x0, 0x0, 0x49, 0x18, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x13, 0x82, 0x0, + 0x0, 0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x32, 0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, + 0x22, 0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, + 0xA1, 0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, + 0x84, 0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, + 0xC1, 0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, + 0x14, 0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, + 0x11, 0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, + 0x2, 0x50, 0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, + 0x0, 0x3, 0x0, 0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, + 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x3, + 0x72, 0xC0, 0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, + 0xD0, 0xE, 0x7A, 0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, + 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, + 0x90, 0xE, 0x71, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, + 0x90, 0xE, 0x78, 0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, + 0x10, 0x7, 0x76, 0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, + 0x90, 0xE, 0x73, 0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, + 0xD0, 0x6, 0xE9, 0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, + 0x40, 0x7, 0x6D, 0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, + 0x10, 0x7, 0x76, 0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, + 0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, + 0x40, 0x7, 0x7A, 0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, + 0x80, 0x7, 0x7A, 0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, + 0x20, 0x7, 0x7A, 0x60, 0x7, 0x74, 0x30, 0xE4, + 0x21, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x20, 0xB, 0x4, 0x7, 0x0, 0x0, 0x0, + 0x32, 0x1E, 0x98, 0xC, 0x19, 0x11, 0x4C, 0x90, + 0x8C, 0x9, 0x26, 0x47, 0xC6, 0x4, 0x43, 0xBA, + 0x12, 0x28, 0x88, 0x62, 0x28, 0x87, 0x42, 0x28, + 0x2, 0x0, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xE2, + 0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, + 0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, + 0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, + 0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, + 0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, + 0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, + 0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, + 0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, + 0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, + 0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, + 0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, + 0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, + 0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, + 0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, + 0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, + 0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, + 0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, + 0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, + 0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, + 0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, + 0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, + 0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, + 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, + 0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, + 0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, + 0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, + 0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, + 0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, + 0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, + 0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, + 0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, + 0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, + 0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, + 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, + 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, + 0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, + 0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, + 0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, + 0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, + 0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, + 0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, + 0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, + 0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, + 0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, + 0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, + 0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, + 0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, + 0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, + 0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, + 0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, + 0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, + 0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, + 0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, + 0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, + 0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, + 0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, + 0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, + 0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, + 0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, + 0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, + 0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, + 0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, + 0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, + 0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, + 0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, + 0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, + 0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, + 0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, + 0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, + 0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, + 0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, + 0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, + 0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, + 0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, + 0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, + 0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, + 0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, + 0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, + 0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, + 0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, + 0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, + 0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, + 0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, + 0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, + 0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, + 0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, + 0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, + 0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, + 0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, + 0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, + 0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, + 0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, + 0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, + 0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, + 0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, + 0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, + 0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, + 0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, + 0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, + 0xC3, 0xC, 0x46, 0xD, 0xC6, 0x21, 0x1C, 0xD8, + 0x81, 0x1D, 0xCA, 0xA1, 0x1C, 0x7E, 0x81, 0x1E, + 0xF2, 0x1, 0x1E, 0xCA, 0x61, 0x86, 0xB3, 0x6, + 0xE4, 0x80, 0xF, 0x6E, 0xE0, 0xE, 0xEF, 0xE0, + 0xE, 0xF5, 0xE0, 0xE, 0xE9, 0x60, 0xE, 0xEF, 0x20, + 0xF, 0xED, 0x30, 0xA3, 0x62, 0x3, 0x72, 0xC0, + 0x7, 0x37, 0x18, 0x87, 0x77, 0x70, 0x7, 0x7A, + 0x90, 0x87, 0x77, 0x60, 0x7, 0x73, 0x60, 0x87, + 0x77, 0xB8, 0x7, 0x37, 0x40, 0x87, 0x74, 0x70, + 0x7, 0x7A, 0x98, 0x87, 0x19, 0x4B, 0x1B, 0x90, + 0x3, 0x3E, 0xB8, 0x1, 0x3C, 0xC8, 0x43, 0x39, + 0x8C, 0x43, 0x3A, 0xCC, 0x43, 0x39, 0x0, 0x0, + 0x79, 0x28, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0xC2, + 0x3C, 0x90, 0x40, 0x86, 0x10, 0x19, 0x32, 0xE2, + 0x64, 0x90, 0x40, 0x46, 0x2, 0x19, 0x23, 0x23, + 0x46, 0x2, 0x13, 0x24, 0xC6, 0x0, 0x13, 0x74, + 0xD4, 0x61, 0x8C, 0x2D, 0xCC, 0xED, 0xC, 0xC4, + 0xAE, 0x4C, 0x6E, 0x2E, 0xED, 0xCD, 0xD, 0x44, + 0x46, 0xC6, 0x5, 0xC6, 0x5, 0xE6, 0x2C, 0x8D, + 0xE, 0x4, 0xE5, 0x2C, 0x8D, 0xE, 0xE8, 0x2C, 0x8D, + 0xE, 0xAD, 0x4E, 0xCC, 0x65, 0xEC, 0xAD, 0x4D, + 0x27, 0xCD, 0x4D, 0xAC, 0x8C, 0x2D, 0x6D, 0xEC, + 0x85, 0x8D, 0xCD, 0xAE, 0xAD, 0x5, 0x4E, 0xEE, + 0x4D, 0xAD, 0x6C, 0x8C, 0xCE, 0xE5, 0x2C, 0x8D, + 0xE, 0x84, 0x86, 0xC6, 0xCC, 0xC6, 0x86, 0x4C, + 0xC, 0x87, 0x6C, 0xEC, 0x26, 0x67, 0x46, 0x26, + 0x67, 0x6C, 0xA6, 0xCC, 0x66, 0x8C, 0xC6, 0x2C, + 0xEC, 0x26, 0xC, 0x26, 0x2C, 0xEC, 0x26, 0xCC, + 0xCC, 0x86, 0x6, 0xE6, 0x6, 0x26, 0xE7, 0x86, + 0xE6, 0x26, 0xE5, 0x8, 0x63, 0x73, 0x87, 0x68, + 0xB, 0x4B, 0x73, 0x3B, 0xCA, 0xDD, 0x18, 0x5A, + 0x98, 0xDC, 0xD7, 0x5C, 0x9A, 0x5E, 0xD9, 0x69, + 0xCC, 0xE4, 0xC2, 0xDA, 0xCA, 0x5A, 0xE0, 0xDE, + 0xD2, 0xDC, 0xE8, 0xCA, 0xE4, 0x86, 0x20, 0x1C, + 0xC1, 0x10, 0x84, 0x43, 0x18, 0x82, 0x70, 0xC, + 0x43, 0x10, 0xE, 0x62, 0x8, 0x42, 0x1, 0xC, 0x41, + 0x38, 0x8A, 0x21, 0x8, 0x87, 0x31, 0x6, 0xC1, + 0x38, 0xC6, 0x10, 0x4, 0x63, 0x18, 0x4, 0x24, + 0x19, 0x83, 0x60, 0x24, 0x63, 0x18, 0xC, 0xC3, + 0x18, 0x83, 0xB0, 0x44, 0x63, 0x28, 0x94, 0x1, + 0x0, 0xA4, 0x31, 0xC, 0x6, 0xB1, 0x8C, 0x61, 0x60, + 0xA, 0xC6, 0x24, 0x64, 0x78, 0x2E, 0x76, 0x61, + 0x6C, 0x76, 0x65, 0x72, 0x43, 0x9, 0x18, 0xA3, + 0xB0, 0xB1, 0xD9, 0xB5, 0xB9, 0xA4, 0x91, 0x95, + 0xB9, 0xD1, 0xD, 0x25, 0x68, 0x8C, 0x43, 0x86, + 0xE7, 0x32, 0x87, 0x16, 0x46, 0x56, 0x26, 0xD7, + 0xF4, 0x46, 0x56, 0xC6, 0x36, 0x94, 0xC0, 0x31, + 0xA, 0x19, 0x9E, 0x8B, 0x5D, 0x99, 0xDC, 0x5C, + 0xDA, 0x9B, 0xDB, 0x50, 0x82, 0xC7, 0x38, 0x64, + 0x78, 0x2E, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x50, + 0x6F, 0x69, 0x6E, 0x74, 0x73, 0x43, 0x9, 0x24, + 0x13, 0xB1, 0xB1, 0xD9, 0xB5, 0xB9, 0xB4, 0xBD, + 0x91, 0xD5, 0xB1, 0x95, 0xB9, 0x98, 0xB1, 0x85, + 0x9D, 0xCD, 0xD, 0x45, 0x98, 0x28, 0x0, 0x0, 0x71, + 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x6, 0x40, + 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 0x61, 0x20, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 0x4, 0x1, 0x86, + 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x7, 0x50, + 0x10, 0xCD, 0x14, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 ] + - Name: SFI0 + Size: 8 + - Name: HASH + Size: 20 + Hash: + IncludesSource: false + Digest: [ 0x9F, 0xD1, 0xD9, 0xE2, 0x49, 0xFB, 0x3A, 0x6C, + 0x8C, 0x14, 0x8A, 0x96, 0x1C, 0x7D, 0x85, 0xA9 ] + - Name: ISG1 + Size: 8 + Signature: + Parameters: [] + - Name: OSG1 + Size: 8 + Signature: + Parameters: [] + - Name: RTS0 + Size: 24 + RootSignature: + Version: 2 + NumRootParameters: 0 + RootParametersOffset: 24 + NumStaticSamplers: 0 + StaticSamplersOffset: 0 + Parameters: [] + - Name: PSV0 + Size: 76 + PSVInfo: + Version: 3 + ShaderStage: 5 + MinimumWaveLaneCount: 0 + MaximumWaveLaneCount: 4294967295 + UsesViewID: 0 + SigInputVectors: 0 + SigOutputVectors: [ 0, 0, 0, 0 ] + NumThreadsX: 1 + NumThreadsY: 1 + NumThreadsZ: 1 + EntryName: main + ResourceStride: 24 + Resources: [] + SigInputElements: [] + SigOutputElements: [] + SigPatchOrPrimElements: [] + InputOutputMap: + - [ ] + - [ ] + - [ ] + - [ ] +... diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test new file mode 100644 index 0000000000000..4fdda8be085d4 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test @@ -0,0 +1,53 @@ +## Tests that a separate DXContainer is created with only the specified section +## for each --split-section specified + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t --split-section=FKE1=%t.fke1.out --split-section=FKE4=%t.fke4.out +# RUN: obj2yaml %t.fke1.out | FileCheck %s --check-prefixes=CHECK,FKE1 +# RUN: obj2yaml %t.fke4.out | FileCheck %s --check-prefixes=CHECK,FKE4 + +--- !dxcontainer +Header: + Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] + Version: + Major: 1 + Minor: 0 +## FKE1: FileSize: 52 +## FKE4: FileSize: 1732 + FileSize: 1996 +## CHECK: PartCount: 1 +## CHECK: PartOffsets: [ 36 ] + PartCount: 7 + PartOffsets: [ 60, 76, 92, 108, 236, 1932, 1960 ] +Parts: +## FKE1: Name: FKE1 +## FKE4: Name: FKE4 +## CHECK-NOT: FKE0 +## CHECK-NOT: FKE2 +## CHECK-NOT: FKE3 +## CHECK-NOT: FKE5 + - Name: FKE0 + Size: 8 + - Name: FKE1 + Size: 8 + - Name: FKE2 + Size: 8 + - Name: FKE3 + Size: 120 + - Name: FKE4 + Size: 1688 + - Name: FKE5 + Size: 20 + - Name: DXIL + Size: 28 + Program: + MajorVersion: 6 + MinorVersion: 5 + ShaderKind: 5 + Size: 8 + DXILMajorVersion: 1 + DXILMinorVersion: 5 + DXILSize: 4 + DXIL: [ 0x42, 0x43, 0xC0, 0xDE, ] +... From 1714a6f1720de51345f998054a70aa415a515328 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Wed, 13 Aug 2025 18:38:17 +0000 Subject: [PATCH 4/9] remove the split sections from orig dxcontainer --- .../DXContainer/DXContainerObjcopy.cpp | 35 ++++++++++++++----- .../llvm-objcopy/DXContainer/basic-split.test | 5 ++- .../DXContainer/headers-split.test | 6 +++- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp index f10171ca7b498..13cadede492a4 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp @@ -52,18 +52,35 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { return Config.ToRemove.matches(P.Name); }; - if (auto E = Obj.removeParts(RemovePred)) - return E; + if (!Config.SplitSection.empty()) { + NameMatcher SectionMatches; + for (StringRef Flag : Config.SplitSection) { + StringRef SectionName; + StringRef FileName; + std::tie(SectionName, FileName) = Flag.split('='); + + if (Error E = splitPartAsObject(SectionName, FileName, + Config.InputFilename, Obj)) + return E; + } + + RemovePred = [&Config, RemovePred](const Part &P) { + if (RemovePred(P)) + return true; + + for (StringRef Flag : Config.SplitSection) { + StringRef SectionName = Flag.take_front(Flag.find('=')); + if (P.Name == SectionName) + return true; + } - for (StringRef Flag : Config.SplitSection) { - StringRef SectionName; - StringRef FileName; - std::tie(SectionName, FileName) = Flag.split('='); - if (Error E = - splitPartAsObject(SectionName, FileName, Config.InputFilename, Obj)) - return E; + return false; + }; } + if (auto E = Obj.removeParts(RemovePred)) + return E; + return Error::success(); } diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test index 7142567b13dcb..b752c03be6916 100644 --- a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test +++ b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test @@ -1,8 +1,10 @@ ## Tests that a separate DXContainer is created for the RTS0 (root signature) -## part, specified with --split-section specified +## part, specified with --split-section. Also ensure that the part is removed +## from the original object. # RUN: yaml2obj %s -o %t # RUN: llvm-objcopy %t --split-section=RTS0=%t.out +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ORIG # RUN: obj2yaml %t.out | FileCheck %s ## The DXContainer described below was generated with: @@ -31,6 +33,7 @@ Header: PartOffsets: [ 60, 1792, 1808, 1836, 1852, 1868, 1900 ] Parts: ## CHECK: Name: RTS0 +## ORIG-NOT: RTS0 ## CHECK-NOT: DXIL ## CHECK-NOT: SFI0 ## CHECK-NOT: HASH diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test index 4fdda8be085d4..5819959073e99 100644 --- a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test +++ b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test @@ -1,8 +1,10 @@ ## Tests that a separate DXContainer is created with only the specified section -## for each --split-section specified +## for each --split-section specified. Also ensure that the part is removed +## from the original object. # RUN: yaml2obj %s -o %t # RUN: llvm-objcopy %t --split-section=FKE1=%t.fke1.out --split-section=FKE4=%t.fke4.out +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ORIG # RUN: obj2yaml %t.fke1.out | FileCheck %s --check-prefixes=CHECK,FKE1 # RUN: obj2yaml %t.fke4.out | FileCheck %s --check-prefixes=CHECK,FKE4 @@ -23,6 +25,8 @@ Header: Parts: ## FKE1: Name: FKE1 ## FKE4: Name: FKE4 +## ORIG-NOT: FKE1 +## ORIG-NOT: FKE4 ## CHECK-NOT: FKE0 ## CHECK-NOT: FKE2 ## CHECK-NOT: FKE3 From 5a6c11c640beb1620422e3e724c54004b1cad15a Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Wed, 13 Aug 2025 18:40:20 +0000 Subject: [PATCH 5/9] self-review: removed unused param --- llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp index 13cadede492a4..7a3365742cce3 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp @@ -53,7 +53,6 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { }; if (!Config.SplitSection.empty()) { - NameMatcher SectionMatches; for (StringRef Flag : Config.SplitSection) { StringRef SectionName; StringRef FileName; From e27256fb6ef0196f3fb7e0ba698d9881d0394de7 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Thu, 14 Aug 2025 16:55:24 +0000 Subject: [PATCH 6/9] review: fix up comments and filecheck --- llvm/lib/ObjCopy/ConfigManager.cpp | 4 +-- .../llvm-objcopy/DXContainer/basic-split.test | 25 ++++++++++--------- .../DXContainer/headers-split.test | 25 ++++++++++--------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/llvm/lib/ObjCopy/ConfigManager.cpp b/llvm/lib/ObjCopy/ConfigManager.cpp index c31bfc1bb454a..dcec6e2b696aa 100644 --- a/llvm/lib/ObjCopy/ConfigManager.cpp +++ b/llvm/lib/ObjCopy/ConfigManager.cpp @@ -127,10 +127,10 @@ ConfigManager::getDXContainerConfig() const { Common.ChangeSectionLMAValAll != 0 || !Common.ChangeSectionAddress.empty()) { return createStringError(llvm::errc::invalid_argument, - "option is not supported for directx"); + "option is not supported for DXContainer"); } // If a flag is listed here, then it has support for DXContainer: - // Common.PreserveDates, Common.ToRemove, Common.SplitSection + // Common.PreserveDates, Common.ToRemove return DXContainer; } diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test index b752c03be6916..405cec4655219 100644 --- a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test +++ b/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test @@ -25,22 +25,23 @@ Header: Version: Major: 1 Minor: 0 -## CHECK: FileSize: 68 +# ORIG: FileSize: 1948 +# CHECK: FileSize: 68 FileSize: 1984 -## CHECK: PartCount: 1 -## CHECK: PartOffsets: [ 36 ] +# CHECK: PartCount: 1 +# CHECK: PartOffsets: [ 36 ] PartCount: 7 PartOffsets: [ 60, 1792, 1808, 1836, 1852, 1868, 1900 ] Parts: -## CHECK: Name: RTS0 -## ORIG-NOT: RTS0 -## CHECK-NOT: DXIL -## CHECK-NOT: SFI0 -## CHECK-NOT: HASH -## CHECK-NOT: ISG1 -## CHECK-NOT: OSG1 -## CHECK-NOT: PSV0 -## CHECK-NOT: DXIL +# CHECK: Name: RTS0 +# ORIG-NOT: RTS0 +# CHECK-NOT: DXIL +# CHECK-NOT: SFI0 +# CHECK-NOT: HASH +# CHECK-NOT: ISG1 +# CHECK-NOT: OSG1 +# CHECK-NOT: PSV0 +# CHECK-NOT: DXIL - Name: DXIL Size: 1724 Program: diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test index 5819959073e99..c5963bf1dea5f 100644 --- a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test +++ b/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test @@ -15,22 +15,23 @@ Header: Version: Major: 1 Minor: 0 -## FKE1: FileSize: 52 -## FKE4: FileSize: 1732 +# ORIG: FileSize: 276 +# FKE1: FileSize: 52 +# FKE4: FileSize: 1732 FileSize: 1996 -## CHECK: PartCount: 1 -## CHECK: PartOffsets: [ 36 ] +# CHECK: PartCount: 1 +# CHECK: PartOffsets: [ 36 ] PartCount: 7 PartOffsets: [ 60, 76, 92, 108, 236, 1932, 1960 ] Parts: -## FKE1: Name: FKE1 -## FKE4: Name: FKE4 -## ORIG-NOT: FKE1 -## ORIG-NOT: FKE4 -## CHECK-NOT: FKE0 -## CHECK-NOT: FKE2 -## CHECK-NOT: FKE3 -## CHECK-NOT: FKE5 +# FKE1: Name: FKE1 +# FKE4: Name: FKE4 +# ORIG-NOT: FKE1 +# ORIG-NOT: FKE4 +# CHECK-NOT: FKE0 +# CHECK-NOT: FKE2 +# CHECK-NOT: FKE3 +# CHECK-NOT: FKE5 - Name: FKE0 Size: 8 - Name: FKE1 From d34866c103296cc4e8ef05503008eee42c40eb99 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Thu, 14 Aug 2025 17:00:18 +0000 Subject: [PATCH 7/9] review: rename test files --- .../DXContainer/{headers-split.test => split-headers.test} | 0 .../DXContainer/{basic-split.test => split-root-signature.test} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename llvm/test/tools/llvm-objcopy/DXContainer/{headers-split.test => split-headers.test} (100%) rename llvm/test/tools/llvm-objcopy/DXContainer/{basic-split.test => split-root-signature.test} (100%) diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/split-headers.test similarity index 100% rename from llvm/test/tools/llvm-objcopy/DXContainer/headers-split.test rename to llvm/test/tools/llvm-objcopy/DXContainer/split-headers.test diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/split-root-signature.test similarity index 100% rename from llvm/test/tools/llvm-objcopy/DXContainer/basic-split.test rename to llvm/test/tools/llvm-objcopy/DXContainer/split-root-signature.test From 1a6f132d1da181d0cec43c19488ee12bf6c2aab7 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Thu, 14 Aug 2025 17:00:59 +0000 Subject: [PATCH 8/9] review: improve check --- llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp index 7a3365742cce3..98831d481db3f 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObjcopy.cpp @@ -68,8 +68,9 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { return true; for (StringRef Flag : Config.SplitSection) { - StringRef SectionName = Flag.take_front(Flag.find('=')); - if (P.Name == SectionName) + bool CanContain = Flag.size() > P.Name.size(); + if (CanContain && Flag.starts_with(P.Name) && + Flag[P.Name.size()] == '=') return true; } From 38ba2f6f1f01b91e4d9edbe3d2d08a481fb3159b Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Thu, 14 Aug 2025 17:13:48 +0000 Subject: [PATCH 9/9] review: add failure testcase --- .../llvm-objcopy/DXContainer/errs-split.test | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 llvm/test/tools/llvm-objcopy/DXContainer/errs-split.test diff --git a/llvm/test/tools/llvm-objcopy/DXContainer/errs-split.test b/llvm/test/tools/llvm-objcopy/DXContainer/errs-split.test new file mode 100644 index 0000000000000..dc3e2dceed874 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/DXContainer/errs-split.test @@ -0,0 +1,21 @@ +## Check that llvm-objcopy reports a suitable error when it +## can't find the section to split + +## We can't have multiple DXIL parts. +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: not llvm-objcopy %t1 --split-section=UNKNOWN=%t.unknown.out 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=ERROR1 + +# ERROR1: error: '[[FILE]]': part 'UNKNOWN' not found + +--- !dxcontainer +Header: + Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ] + Version: + Major: 1 + Minor: 0 + PartCount: 1 +Parts: + - Name: FKE0 + Size: 8 +...