forked from OSchip/llvm-project
[ELF] Simplify SectionBase::partition handling and make it live by default. NFC
Previously an InputSectionBase is dead (`partition==0`) by default.
SyntheticSection calls markLive and BssSection overrides that with markDead.
It is more natural to make InputSectionBase live by default and let
--gc-sections mark InputSectionBase dead.
When linking a Release build of clang:
* --no-gc-sections:, the removed `inputSections` loop decreases markLive time from 4ms to 1ms.
* --gc-sections: the extra `inputSections` loop increases markLive time from 0.181296s to 0.188526s.
This is as of we lose the removing one `inputSections` loop optimization (4374824ccf
).
I believe the loss can be mitigated if we refactor markLive.
This commit is contained in:
parent
a8a7bf922c
commit
7cd0c45364
|
@ -1828,7 +1828,6 @@ static void replaceCommonSymbols() {
|
|||
|
||||
auto *bss = make<BssSection>("COMMON", s->size, s->alignment);
|
||||
bss->file = s->file;
|
||||
bss->markDead();
|
||||
inputSections.push_back(bss);
|
||||
s->replace(Defined{s->file, s->getName(), s->binding, s->stOther, s->type,
|
||||
/*value=*/0, s->size, bss});
|
||||
|
|
|
@ -65,7 +65,7 @@ public:
|
|||
// The 1-indexed partition that this section is assigned to by the garbage
|
||||
// collector, or 0 if this section is dead. Normally there is only one
|
||||
// partition, so this will either be 0 or 1.
|
||||
uint8_t partition;
|
||||
uint8_t partition = 1;
|
||||
elf::Partition &getPartition() const;
|
||||
|
||||
// These corresponds to the fields in Elf_Shdr.
|
||||
|
@ -96,8 +96,8 @@ protected:
|
|||
uint32_t entsize, uint32_t alignment, uint32_t type,
|
||||
uint32_t info, uint32_t link)
|
||||
: name(name), sectionKind(sectionKind), bss(false), keepUnique(false),
|
||||
partition(0), alignment(alignment), flags(flags), entsize(entsize),
|
||||
type(type), link(link), info(info) {}
|
||||
alignment(alignment), flags(flags), entsize(entsize), type(type),
|
||||
link(link), info(info) {}
|
||||
};
|
||||
|
||||
// This corresponds to a section of an input file.
|
||||
|
|
|
@ -371,9 +371,6 @@ template <class ELFT> void elf::markLive() {
|
|||
llvm::TimeTraceScope timeScope("markLive");
|
||||
// If --gc-sections is not given, retain all input sections.
|
||||
if (!config->gcSections) {
|
||||
for (InputSectionBase *sec : inputSections)
|
||||
sec->markLive();
|
||||
|
||||
// If a DSO defines a symbol referenced in a regular object, it is needed.
|
||||
for (Symbol *sym : symtab->symbols())
|
||||
if (auto *s = dyn_cast<SharedSymbol>(sym))
|
||||
|
@ -382,6 +379,9 @@ template <class ELFT> void elf::markLive() {
|
|||
return;
|
||||
}
|
||||
|
||||
for (InputSectionBase *sec : inputSections)
|
||||
sec->markDead();
|
||||
|
||||
// Follow the graph to mark all live sections.
|
||||
for (unsigned curPart = 1; curPart <= partitions.size(); ++curPart)
|
||||
MarkLive<ELFT>(curPart).run();
|
||||
|
|
|
@ -40,9 +40,7 @@ public:
|
|||
SyntheticSection(uint64_t flags, uint32_t type, uint32_t alignment,
|
||||
StringRef name)
|
||||
: InputSection(nullptr, flags, type, alignment, {}, name,
|
||||
InputSectionBase::Synthetic) {
|
||||
markLive();
|
||||
}
|
||||
InputSectionBase::Synthetic) {}
|
||||
|
||||
virtual ~SyntheticSection() = default;
|
||||
virtual void writeTo(uint8_t *buf) = 0;
|
||||
|
|
|
@ -315,8 +315,7 @@ template <class ELFT> void elf::createSyntheticSections() {
|
|||
// If there is a SECTIONS command and a .data.rel.ro section name use name
|
||||
// .data.rel.ro.bss so that we match in the .data.rel.ro output section.
|
||||
// This makes sure our relro is contiguous.
|
||||
bool hasDataRelRo =
|
||||
script->hasSectionsCommand && findSection(".data.rel.ro", 0);
|
||||
bool hasDataRelRo = script->hasSectionsCommand && findSection(".data.rel.ro");
|
||||
in.bssRelRo = std::make_unique<BssSection>(
|
||||
hasDataRelRo ? ".data.rel.ro.bss" : ".bss.rel.ro", 0, 1);
|
||||
add(*in.bssRelRo);
|
||||
|
|
Loading…
Reference in New Issue