forked from OSchip/llvm-project
Don't call markLiveAt for non alloc sections.
We don't gc them anyway, so just use an early return in Enqueue. llvm-svn: 284663
This commit is contained in:
parent
7c1381a099
commit
116d83fbe0
|
@ -53,7 +53,8 @@ InputSectionBase<ELFT>::InputSectionBase(elf::ObjectFile<ELFT> *File,
|
||||||
const Elf_Shdr *Hdr, StringRef Name,
|
const Elf_Shdr *Hdr, StringRef Name,
|
||||||
Kind SectionKind)
|
Kind SectionKind)
|
||||||
: InputSectionData(SectionKind, Name, getSectionContents(File, Hdr),
|
: InputSectionData(SectionKind, Name, getSectionContents(File, Hdr),
|
||||||
isCompressed<ELFT>(Hdr, Name), !Config->GcSections),
|
isCompressed<ELFT>(Hdr, Name),
|
||||||
|
!Config->GcSections || !(Hdr->sh_flags & SHF_ALLOC)),
|
||||||
Header(Hdr), File(File), Repl(this) {
|
Header(Hdr), File(File), Repl(this) {
|
||||||
// The ELF spec states that a value of 0 means the section has
|
// The ELF spec states that a value of 0 means the section has
|
||||||
// no alignment constraits.
|
// no alignment constraits.
|
||||||
|
|
|
@ -167,7 +167,10 @@ public:
|
||||||
void splitIntoPieces();
|
void splitIntoPieces();
|
||||||
|
|
||||||
// Mark the piece at a given offset live. Used by GC.
|
// Mark the piece at a given offset live. Used by GC.
|
||||||
void markLiveAt(uintX_t Offset) { LiveOffsets.insert(Offset); }
|
void markLiveAt(uintX_t Offset) {
|
||||||
|
assert(this->getSectionHdr()->sh_flags & llvm::ELF::SHF_ALLOC);
|
||||||
|
LiveOffsets.insert(Offset);
|
||||||
|
}
|
||||||
|
|
||||||
// Translate an offset in the input section to an offset
|
// Translate an offset in the input section to an offset
|
||||||
// in the output section.
|
// in the output section.
|
||||||
|
|
|
@ -201,6 +201,10 @@ template <class ELFT> void elf::markLive() {
|
||||||
if (!R.Sec || R.Sec == &InputSection<ELFT>::Discarded)
|
if (!R.Sec || R.Sec == &InputSection<ELFT>::Discarded)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// We don't gc non alloc sections.
|
||||||
|
if (!(R.Sec->getSectionHdr()->sh_flags & SHF_ALLOC))
|
||||||
|
return;
|
||||||
|
|
||||||
// Usually, a whole section is marked as live or dead, but in mergeable
|
// Usually, a whole section is marked as live or dead, but in mergeable
|
||||||
// (splittable) sections, each piece of data has independent liveness bit.
|
// (splittable) sections, each piece of data has independent liveness bit.
|
||||||
// So we explicitly tell it which offset is in use.
|
// So we explicitly tell it which offset is in use.
|
||||||
|
@ -210,12 +214,9 @@ template <class ELFT> void elf::markLive() {
|
||||||
if (R.Sec->Live)
|
if (R.Sec->Live)
|
||||||
return;
|
return;
|
||||||
R.Sec->Live = true;
|
R.Sec->Live = true;
|
||||||
// Add input section to the queue. We don't want to consider relocations
|
// Add input section to the queue.
|
||||||
// from non-allocatable input sections, because we can bring those
|
|
||||||
// allocatable sections to living which otherwise would be dead.
|
|
||||||
if (InputSection<ELFT> *S = dyn_cast<InputSection<ELFT>>(R.Sec))
|
if (InputSection<ELFT> *S = dyn_cast<InputSection<ELFT>>(R.Sec))
|
||||||
if (S->getSectionHdr()->sh_flags & SHF_ALLOC)
|
Q.push_back(S);
|
||||||
Q.push_back(S);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
auto MarkSymbol = [&](const SymbolBody *Sym) {
|
auto MarkSymbol = [&](const SymbolBody *Sym) {
|
||||||
|
|
Loading…
Reference in New Issue