From be8bc3cf43f07f68d89c82db45e29f63b432ceb5 Mon Sep 17 00:00:00 2001 From: Mitch Phillips Date: Fri, 5 Apr 2024 10:59:32 +0200 Subject: [PATCH] Revert "[llvm-objcopy] Add --compress-sections" This reverts commit 9e3b64b9f95aadf57568576712902a272fe66503. Reason: Broke the UBSan buildbot. See the comments in the pull request (https://github.com/llvm/llvm-project/pull/85036) for more information. --- llvm/docs/CommandGuide/llvm-objcopy.rst | 8 -- llvm/docs/ReleaseNotes.rst | 4 - llvm/include/llvm/ObjCopy/CommonConfig.h | 3 - llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp | 34 ++--- .../ELF/compress-sections-within-segment.s | 38 ------ .../llvm-objcopy/ELF/compress-sections.s | 128 ------------------ .../llvm-objcopy/ELF/decompress-sections.test | 29 ---- llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 36 ----- llvm/tools/llvm-objcopy/ObjcopyOpts.td | 6 - 9 files changed, 8 insertions(+), 278 deletions(-) delete mode 100644 llvm/test/tools/llvm-objcopy/ELF/compress-sections-within-segment.s delete mode 100644 llvm/test/tools/llvm-objcopy/ELF/compress-sections.s diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst index 57d6280d57c8b..985d16eb11cfb 100644 --- a/llvm/docs/CommandGuide/llvm-objcopy.rst +++ b/llvm/docs/CommandGuide/llvm-objcopy.rst @@ -309,14 +309,6 @@ them. Compress DWARF debug sections in the output, using the specified format. Supported formats are ``zlib`` and ``zstd``. Use ``zlib`` if ```` is omitted. -.. option:: --compress-sections
= - - Compress or decompress sections matched by ``
`` using the specified - format. Supported formats are ``zlib`` and ``zstd``. Specify ``none`` for - decompression. When a section is matched by multiple options, the last one - wins. A wildcard ``
`` starting with '!' is disallowed. - Sections within a segment cannot be (de)compressed. - .. option:: --decompress-debug-sections Decompress any compressed DWARF debug sections in the output. diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index ff7fed9ad5901..7588048334d79 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -182,10 +182,6 @@ Changes to the LLVM tools for ELF input to skip the specified symbols when executing other options that can change a symbol's name, binding or visibility. -* llvm-objcopy now supports ``--compress-sections`` to compress or decompress - arbitrary sections not within a segment. - (`#85036 `_.) - * llvm-profgen now supports COFF+DWARF binaries. This enables Sample-based PGO on Windows using Intel VTune's SEP. For details on usage, see the `end-user documentation for SPGO diff --git a/llvm/include/llvm/ObjCopy/CommonConfig.h b/llvm/include/llvm/ObjCopy/CommonConfig.h index ae08d4032736e..9d6d5fb23b18e 100644 --- a/llvm/include/llvm/ObjCopy/CommonConfig.h +++ b/llvm/include/llvm/ObjCopy/CommonConfig.h @@ -262,9 +262,6 @@ struct CommonConfig { bool DecompressDebugSections = false; DebugCompressionType CompressionType = DebugCompressionType::None; - - SmallVector, 0> - compressSections; }; } // namespace objcopy diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp index f343d1447e055..205bc1ef5b1a1 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp @@ -215,41 +215,23 @@ static Error dumpSectionToFile(StringRef SecName, StringRef Filename, } Error Object::compressOrDecompressSections(const CommonConfig &Config) { - // Build a list of sections we are going to replace. - // We can't call `addSection` while iterating over sections, + // Build a list of the debug sections we are going to replace. + // We can't call `AddSection` while iterating over sections, // because it would mutate the sections array. SmallVector>, 0> ToReplace; for (SectionBase &Sec : sections()) { - std::optional CType; - for (auto &[Matcher, T] : Config.compressSections) - if (Matcher.matches(Sec.Name)) - CType = T; - // Handle --compress-debug-sections and --decompress-debug-sections, which - // apply to non-ALLOC debug sections. - if (!(Sec.Flags & SHF_ALLOC) && StringRef(Sec.Name).starts_with(".debug")) { - if (Config.CompressionType != DebugCompressionType::None) - CType = Config.CompressionType; - else if (Config.DecompressDebugSections) - CType = DebugCompressionType::None; - } - if (!CType) + if ((Sec.Flags & SHF_ALLOC) || !StringRef(Sec.Name).starts_with(".debug")) continue; - - if (Sec.ParentSegment) - return createStringError( - errc::invalid_argument, - "section '" + Sec.Name + - "' within a segment cannot be (de)compressed"); - if (auto *CS = dyn_cast(&Sec)) { - if (*CType == DebugCompressionType::None) + if (Config.DecompressDebugSections) { ToReplace.emplace_back( &Sec, [=] { return &addSection(*CS); }); - } else if (*CType != DebugCompressionType::None) { - ToReplace.emplace_back(&Sec, [=, S = &Sec] { + } + } else if (Config.CompressionType != DebugCompressionType::None) { + ToReplace.emplace_back(&Sec, [&, S = &Sec] { return &addSection( - CompressedSection(*S, *CType, Is64Bits)); + CompressedSection(*S, Config.CompressionType, Is64Bits)); }); } } diff --git a/llvm/test/tools/llvm-objcopy/ELF/compress-sections-within-segment.s b/llvm/test/tools/llvm-objcopy/ELF/compress-sections-within-segment.s deleted file mode 100644 index 064ffcadc12e3..0000000000000 --- a/llvm/test/tools/llvm-objcopy/ELF/compress-sections-within-segment.s +++ /dev/null @@ -1,38 +0,0 @@ -## Disallow (de)compression for sections within a segment as they are -## effectively immutable. -# RUN: rm -rf %t && mkdir %t && cd %t -# RUN: yaml2obj %s -o a -# RUN: not llvm-objcopy a /dev/null --compress-sections .text=zlib 2>&1 | FileCheck %s --implicit-check-not=error: - -# CHECK: error: 'a': section '.text' within a segment cannot be (de)compressed - -# RUN: not llvm-objcopy a /dev/null --compress-sections foo=none 2>&1 | FileCheck %s --check-prefix=CHECK2 --implicit-check-not=error: - -# CHECK2: error: 'a': section 'foo' within a segment cannot be (de)compressed - -## There is an error even if 'foo' is already compressed with zlib. -# RUN: not llvm-objcopy a /dev/null --compress-sections foo=zlib 2>&1 | FileCheck %s --check-prefix=CHECK3 --implicit-check-not=error: - -# CHECK3: error: 'a': section 'foo' within a segment cannot be (de)compressed - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC - Machine: EM_X86_64 -ProgramHeaders: - - Type: PT_LOAD - FirstSec: .text - LastSec: foo - Align: 0x1000 - Offset: 0x1000 -Sections: - - Name: .text - Type: SHT_PROGBITS - Offset: 0x1000 - Content: C3 - - Name: foo - Type: SHT_PROGBITS - Flags: [ SHF_COMPRESSED ] - Content: 010000000000000040000000000000000100000000000000789cd36280002d3269002f800151 diff --git a/llvm/test/tools/llvm-objcopy/ELF/compress-sections.s b/llvm/test/tools/llvm-objcopy/ELF/compress-sections.s deleted file mode 100644 index e6fa86068a1ae..0000000000000 --- a/llvm/test/tools/llvm-objcopy/ELF/compress-sections.s +++ /dev/null @@ -1,128 +0,0 @@ -# REQUIRES: x86-registered-target, zlib, zstd - -# RUN: rm -rf %t && mkdir %t && cd %t -# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o a.o -## '*0=none' wins because it is the last. '*0' sections are decompressed (if originally compressed) or kept unchanged (if uncompressed). -## No section is named 'nomatch'. The third option is a no-op. -# RUN: llvm-objcopy a.o out --compress-sections='*0=zlib' --compress-sections '*0=none' --compress-sections 'nomatch=none' 2>&1 | count 0 -# RUN: llvm-readelf -S out | FileCheck %s --check-prefix=CHECK1 - -# CHECK1: Name Type Address Off Size ES Flg Lk Inf Al -# CHECK1: .text PROGBITS [[#%x,TEXT:]] [[#%x,]] [[#%x,]] 00 AX 0 0 4 -# CHECK1: foo0 PROGBITS [[#%x,FOO0:]] [[#%x,]] [[#%x,]] 00 A 0 0 8 -# CHECK1-NEXT: .relafoo0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 3 8 -# CHECK1-NEXT: foo1 PROGBITS [[#%x,FOO1:]] [[#%x,]] [[#%x,]] 00 A 0 0 8 -# CHECK1-NEXT: .relafoo1 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 5 8 -# CHECK1: nonalloc0 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 8 -# CHECK1-NEXT: .relanonalloc0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 7 8 -# CHECK1-NEXT: nonalloc1 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 8 -# CHECK1-NEXT: .debug_str PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 01 MS 0 0 1 - -## Mixing zlib and zstd. -# RUN: llvm-objcopy a.o out2 --compress-sections '*c0=zlib' --compress-sections .debug_str=zstd -# RUN: llvm-readelf -Sr -x nonalloc0 -x .debug_str out2 2>&1 | FileCheck %s --check-prefix=CHECK2 -# RUN: llvm-readelf -z -x nonalloc0 -x .debug_str out2 | FileCheck %s --check-prefix=CHECK2DE - -# CHECK2: Name Type Address Off Size ES Flg Lk Inf Al -# CHECK2: .text PROGBITS [[#%x,TEXT:]] [[#%x,]] [[#%x,]] 00 AX 0 0 4 -# CHECK2: foo0 PROGBITS [[#%x,FOO0:]] [[#%x,]] [[#%x,]] 00 A 0 0 8 -# CHECK2-NEXT: .relafoo0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 3 8 -# CHECK2-NEXT: foo1 PROGBITS [[#%x,FOO1:]] [[#%x,]] [[#%x,]] 00 A 0 0 8 -# CHECK2-NEXT: .relafoo1 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 5 8 -# CHECK2: nonalloc0 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 8 -# CHECK2-NEXT: .relanonalloc0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 IC 11 7 8 -# CHECK2-NEXT: nonalloc1 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 8 -# CHECK2-NEXT: .debug_str PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 01 MSC 0 0 8 - -## llvm-readelf -r doesn't support SHF_COMPRESSED SHT_RELA. -# CHECK2: warning: {{.*}}: unable to read relocations from SHT_RELA section with index 8: section [index 8] has an invalid sh_size ([[#]]) which is not a multiple of its sh_entsize (24) - -# CHECK2: Hex dump of section 'nonalloc0': -## zlib with ch_size=0x10 -# CHECK2-NEXT: 01000000 00000000 10000000 00000000 -# CHECK2-NEXT: 08000000 00000000 {{.*}} -# CHECK2: Hex dump of section '.debug_str': -## zstd with ch_size=0x38 -# CHECK2-NEXT: 02000000 00000000 38000000 00000000 -# CHECK2-NEXT: 01000000 00000000 {{.*}} - -# CHECK2DE: Hex dump of section 'nonalloc0': -# CHECK2DE-NEXT: 0x00000000 00000000 00000000 00000000 00000000 ................ -# CHECK2DE-EMPTY: -# CHECK2DE-NEXT: Hex dump of section '.debug_str': -# CHECK2DE-NEXT: 0x00000000 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA - -## --decompress-debug-sections takes precedence, even if it is before --compress-sections. -# RUN: llvm-objcopy a.o out3 --decompress-debug-sections --compress-sections .debug_str=zstd -# RUN: llvm-readelf -S out3 | FileCheck %s --check-prefix=CHECK3 - -# CHECK3: .debug_str PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 01 MS 0 0 1 - -# RUN: llvm-objcopy a.o out4 --compress-sections '*0=zlib' -# RUN: llvm-readelf -S out4 | FileCheck %s --check-prefix=CHECK4 - -# CHECK4: Name Type Address Off Size ES Flg Lk Inf Al -# CHECK4: .text PROGBITS [[#%x,TEXT:]] [[#%x,]] [[#%x,]] 00 AX 0 0 4 -# CHECK4: foo0 PROGBITS [[#%x,FOO0:]] [[#%x,]] [[#%x,]] 00 AC 0 0 8 -# CHECK4-NEXT: .relafoo0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 IC 11 3 8 -# CHECK4-NEXT: foo1 PROGBITS [[#%x,FOO1:]] [[#%x,]] [[#%x,]] 00 A 0 0 8 -# CHECK4-NEXT: .relafoo1 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 I 11 5 8 -# CHECK4: nonalloc0 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 8 -# CHECK4-NEXT: .relanonalloc0 RELA [[#%x,]] [[#%x,]] [[#%x,]] 18 IC 11 7 8 -# CHECK4-NEXT: nonalloc1 PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 8 -# CHECK4-NEXT: .debug_str PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 01 MS 0 0 1 - -## If a section is already compressed, compression request for another format is ignored. -# RUN: llvm-objcopy a.o out5 --compress-sections 'nonalloc0=zlib' -# RUN: llvm-readelf -x nonalloc0 out5 | FileCheck %s --check-prefix=CHECK5 -# RUN: llvm-objcopy out5 out5a --compress-sections 'nonalloc0=zstd' -# RUN: cmp out5 out5a - -# CHECK5: Hex dump of section 'nonalloc0': -## zlib with ch_size=0x10 -# CHECK5-NEXT: 01000000 00000000 10000000 00000000 -# CHECK5-NEXT: 08000000 00000000 {{.*}} - -# RUN: not llvm-objcopy --compress-sections=foo a.o out 2>&1 | \ -# RUN: FileCheck %s --check-prefix=ERR1 --implicit-check-not=error: -# ERR1: error: --compress-sections: parse error, not 'section-glob=[none|zlib|zstd]' - -# RUN: llvm-objcopy --compress-sections 'a[=zlib' a.o out 2>&1 | \ -# RUN: FileCheck %s --check-prefix=ERR2 --implicit-check-not=error: -# ERR2: warning: invalid glob pattern, unmatched '[' - -# RUN: not llvm-objcopy a.o out --compress-sections='.debug*=zlib-gabi' --compress-sections='.debug*=' 2>&1 | \ -# RUN: FileCheck -check-prefix=ERR3 %s -# ERR3: error: invalid or unsupported --compress-sections format: .debug*=zlib-gabi - -# RUN: not llvm-objcopy a.o out --compress-sections='!.debug*=zlib' 2>&1 | \ -# RUN: FileCheck -check-prefix=ERR4 %s -# ERR4: error: --compress-sections: negative pattern is unsupported - -.globl _start -_start: - ret - -.section foo0,"a" -.balign 8 -.quad .text-. -.quad .text-. -.section foo1,"a" -.balign 8 -.quad .text-. -.quad .text-. -.section nonalloc0,"" -.balign 8 -.quad .text+1 -.quad .text+2 -sym0: -.section nonalloc1,"" -.balign 8 -.quad 42 -sym1: - -.section .debug_str,"MS",@progbits,1 -.Linfo_string0: - .asciz "AAAAAAAAAAAAAAAAAAAAAAAAAAA" -.Linfo_string1: - .asciz "BBBBBBBBBBBBBBBBBBBBBBBBBBB" diff --git a/llvm/test/tools/llvm-objcopy/ELF/decompress-sections.test b/llvm/test/tools/llvm-objcopy/ELF/decompress-sections.test index d9f4f3809c4dd..4258ddbe66a3e 100644 --- a/llvm/test/tools/llvm-objcopy/ELF/decompress-sections.test +++ b/llvm/test/tools/llvm-objcopy/ELF/decompress-sections.test @@ -4,8 +4,6 @@ # RUN: yaml2obj %s -o %t # RUN: llvm-objcopy --decompress-debug-sections %t %t.de # RUN: llvm-readelf -S %t.de | FileCheck %s -# RUN: llvm-objcopy --compress-sections '*nonalloc=none' --compress-sections .debugx=none %t %t.1.de -# RUN: cmp %t.de %t.1.de # CHECK: Name Type Address Off Size ES Flg Lk Inf Al # CHECK: .debug_alloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 AC 0 0 0 @@ -13,33 +11,6 @@ # CHECK-NEXT: .debugx PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1 # CHECK-NEXT: nodebug PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 0 -# RUN: llvm-objcopy --compress-sections '.debug*=none' %t %t2.de -# RUN: llvm-readelf -S -x .debug_alloc -x .debug_nonalloc -x .debugx %t2.de | FileCheck %s --check-prefix=CHECK2 - -# CHECK2: Name Type Address Off Size ES Flg Lk Inf Al -# CHECK2: .debug_alloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 A 0 0 1 -# CHECK2-NEXT: .debug_nonalloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1 -# CHECK2-NEXT: .debugx PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 0 0 1 -# CHECK2-NEXT: nodebug PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 0 - -# CHECK2: Hex dump of section '.debug_alloc': -# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-EMPTY: -# CHECK2: Hex dump of section '.debug_nonalloc': -# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-EMPTY: -# CHECK2-NEXT: Hex dump of section '.debugx': -# CHECK2-NEXT: 0x00000000 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000010 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000020 2a000000 00000000 2a000000 00000000 *.......*....... -# CHECK2-NEXT: 0x00000030 2a000000 00000000 2a000000 00000000 *.......*....... - --- !ELF FileHeader: Class: ELFCLASS64 diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 70e85460d3df0..7269c51a08d6b 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -736,42 +736,6 @@ objcopy::parseObjcopyOptions(ArrayRef RawArgsArr, return createStringError(errc::invalid_argument, Reason); } - for (const auto *A : InputArgs.filtered(OBJCOPY_compress_sections)) { - SmallVector Fields; - StringRef(A->getValue()).split(Fields, '='); - if (Fields.size() != 2 || Fields[1].empty()) { - return createStringError( - errc::invalid_argument, - A->getSpelling() + - ": parse error, not 'section-glob=[none|zlib|zstd]'"); - } - - auto Type = StringSwitch(Fields[1]) - .Case("zlib", DebugCompressionType::Zlib) - .Case("zstd", DebugCompressionType::Zstd) - .Default(DebugCompressionType::None); - if (Type == DebugCompressionType::None && Fields[1] != "none") { - return createStringError( - errc::invalid_argument, - "invalid or unsupported --compress-sections format: %s", - A->getValue()); - } - - auto &P = Config.compressSections.emplace_back(); - P.second = Type; - auto Matcher = - NameOrPattern::create(Fields[0], SectionMatchStyle, ErrorCallback); - // =none allows overriding a previous =zlib or =zstd. Reject negative - // patterns, which would be confusing. - if (Matcher && !Matcher->isPositiveMatch()) { - return createStringError( - errc::invalid_argument, - "--compress-sections: negative pattern is unsupported"); - } - if (Error E = P.first.addMatcher(std::move(Matcher))) - return std::move(E); - } - Config.AddGnuDebugLink = InputArgs.getLastArgValue(OBJCOPY_add_gnu_debuglink); // The gnu_debuglink's target is expected to not change or else its CRC would // become invalidated and get rejected. We can avoid recalculating the diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td index 4bc80eba05f8e..be02616e8c68e 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td +++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td @@ -35,12 +35,6 @@ def : Flag<["--"], "compress-debug-sections">, Alias, AliasArgs<["zlib"]>; def decompress_debug_sections : Flag<["--"], "decompress-debug-sections">, HelpText<"Decompress DWARF debug sections">; -defm compress_sections - : Eq<"compress-sections", - "Compress or decompress sections using specified format. Supported " - "formats: zlib, zstd. Specify 'none' for decompression">, - MetaVarName<"=">; - defm split_dwo : Eq<"split-dwo", "Equivalent to --extract-dwo and as the output file and no other options, " "and then --strip-dwo on the input file">,