File tree 3 files changed +61
-2
lines changed
test/tools/llvm-objcopy/ELF
3 files changed +61
-2
lines changed Original file line number Diff line number Diff line change @@ -2239,8 +2239,17 @@ Error Object::removeSections(
2239
2239
// Transfer removed sections into the Object RemovedSections container for use
2240
2240
// later.
2241
2241
std::move (Iter, Sections.end (), std::back_inserter (RemovedSections));
2242
- // Now finally get rid of them all together .
2242
+ // Now get rid of them altogether .
2243
2243
Sections.erase (Iter, std::end (Sections));
2244
+
2245
+ // Finally erase empty SHT_GROUP sections.
2246
+ llvm::erase_if (Sections, [](const SecPtr &Sec) {
2247
+ if (auto GroupSec = dyn_cast<GroupSection>(Sec.get ()))
2248
+ return GroupSec->getMembersCount () == 0 ;
2249
+
2250
+ return false ;
2251
+ });
2252
+
2244
2253
return Error::success ();
2245
2254
}
2246
2255
Original file line number Diff line number Diff line change @@ -964,6 +964,8 @@ class GroupSection : public SectionBase {
964
964
const DenseMap<SectionBase *, SectionBase *> &FromTo) override ;
965
965
void onRemove () override ;
966
966
967
+ size_t getMembersCount () const { return GroupMembers.size (); }
968
+
967
969
static bool classof (const SectionBase *S) {
968
970
return S->OriginalType == ELF::SHT_GROUP;
969
971
}
Original file line number Diff line number Diff line change 1
1
## This checks that the group section is shrunk when its member is removed.
2
2
3
- # RUN: yaml2obj %s -o - \
3
+ # RUN: yaml2obj --docnum=1 %s -o - \
4
4
# RUN: | llvm-objcopy -R .foo - - \
5
5
# RUN: | obj2yaml - \
6
6
# RUN: | FileCheck %s
@@ -35,3 +35,51 @@ Symbols:
35
35
- Name: foo_bar_grp
36
36
Section: .group
37
37
Binding: STB_GLOBAL
38
+
39
+ # RUN: yaml2obj --docnum=2 %s -o %t
40
+ # RUN: llvm-objcopy --remove-section=.debug_macro %t
41
+ # RUN: llvm-readelf --section-groups %t | FileCheck %s --check-prefix=GROUP-REMOVED
42
+
43
+ --- !ELF
44
+ FileHeader:
45
+ Class: ELFCLASS64
46
+ Data: ELFDATA2LSB
47
+ Type: ET_REL
48
+ Machine: EM_X86_64
49
+ Sections:
50
+ - Name: .group
51
+ Type: SHT_GROUP
52
+ Info: foo_grp
53
+ Members:
54
+ - SectionOrType: GRP_COMDAT
55
+ - SectionOrType: .debug_macro
56
+ - Name: .debug_macro
57
+ Type: SHT_PROGBITS
58
+ Flags: [ SHF_GROUP ]
59
+ Symbols:
60
+ - Name: foo_grp
61
+ Section: .group
62
+
63
+ # GROUP-REMOVED: There are no section groups in this file.
64
+
65
+ # RUN: yaml2obj --docnum=3 %s -o %t
66
+ # RUN: llvm-objcopy --remove-section=.group %t
67
+ # RUN: llvm-readelf --section-groups %t | FileCheck %s --check-prefix=EMPTY-GROUP-REMOVED
68
+
69
+ --- !ELF
70
+ FileHeader:
71
+ Class: ELFCLASS64
72
+ Data: ELFDATA2LSB
73
+ Type: ET_REL
74
+ Machine: EM_X86_64
75
+ Sections:
76
+ - Name: .group
77
+ Type: SHT_GROUP
78
+ Info: foo_grp
79
+ Members:
80
+ - SectionOrType: GRP_COMDAT
81
+ Symbols:
82
+ - Name: foo_grp
83
+ Section: .group
84
+
85
+ # EMPTY-GROUP-REMOVED: There are no section groups in this file.
You can’t perform that action at this time.
0 commit comments