File tree 3 files changed +61
-1
lines changed
test/tools/llvm-objcopy/ELF
3 files changed +61
-1
lines changed Original file line number Diff line number Diff line change @@ -2203,6 +2203,11 @@ Error Object::removeSections(
2203
2203
if (auto ToRelSec = RelSec->getSection ())
2204
2204
return !ToRemove (*ToRelSec);
2205
2205
}
2206
+ // Remove empty group sections.
2207
+ if (Sec->Type == ELF::SHT_GROUP) {
2208
+ auto GroupSec = cast<GroupSection>(Sec.get ());
2209
+ return !llvm::all_of (GroupSec->members (), ToRemove);
2210
+ }
2206
2211
return true ;
2207
2212
});
2208
2213
if (SymbolTable != nullptr && ToRemove (*SymbolTable))
Original file line number Diff line number Diff line change @@ -941,6 +941,9 @@ class GroupSection : public SectionBase {
941
941
SmallVector<SectionBase *, 3 > GroupMembers;
942
942
943
943
public:
944
+ template <class T >
945
+ using ConstRange = iterator_range<
946
+ pointee_iterator<typename llvm::SmallVector<T *, 3 >::const_iterator>>;
944
947
// TODO: Contents is present in several classes of the hierarchy.
945
948
// This needs to be refactored to avoid duplication.
946
949
ArrayRef<uint8_t > Contents;
@@ -964,6 +967,10 @@ class GroupSection : public SectionBase {
964
967
const DenseMap<SectionBase *, SectionBase *> &FromTo) override ;
965
968
void onRemove () override ;
966
969
970
+ ConstRange<SectionBase> members () const {
971
+ return make_pointee_range (GroupMembers);
972
+ }
973
+
967
974
static bool classof (const SectionBase *S) {
968
975
return S->OriginalType == ELF::SHT_GROUP;
969
976
}
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