File tree Expand file tree Collapse file tree 3 files changed +61
-2
lines changed
test/tools/llvm-objcopy/ELF Expand file tree Collapse file tree 3 files changed +61
-2
lines changed Original file line number Diff line number Diff line change @@ -2206,8 +2206,17 @@ Error Object::removeSections(
2206
2206
// Transfer removed sections into the Object RemovedSections container for use
2207
2207
// later.
2208
2208
std::move (Iter, Sections.end (), std::back_inserter (RemovedSections));
2209
- // Now finally get rid of them all together .
2209
+ // Now get rid of them altogether .
2210
2210
Sections.erase (Iter, std::end (Sections));
2211
+
2212
+ // Finally erase empty SHT_GROUP sections.
2213
+ llvm::erase_if (Sections, [](const SecPtr &Sec) {
2214
+ if (auto GroupSec = dyn_cast<GroupSection>(Sec.get ()))
2215
+ return GroupSec->getMembersCount () == 0 ;
2216
+
2217
+ return false ;
2218
+ });
2219
+
2211
2220
return Error::success ();
2212
2221
}
2213
2222
Original file line number Diff line number Diff line change @@ -963,6 +963,8 @@ class GroupSection : public SectionBase {
963
963
const DenseMap<SectionBase *, SectionBase *> &FromTo) override ;
964
964
void onRemove () override ;
965
965
966
+ size_t getMembersCount () const { return GroupMembers.size (); }
967
+
966
968
static bool classof (const SectionBase *S) {
967
969
return S->OriginalType == ELF::SHT_GROUP;
968
970
}
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