[PATCH] D29170: [ELF] - Remove unnessesary checks from GC logic.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 26 01:40:05 PST 2017
grimar updated this revision to Diff 85874.
grimar added a comment.
- Minor improvement.
https://reviews.llvm.org/D29170
Files:
ELF/InputSection.h
ELF/MarkLive.cpp
Index: ELF/MarkLive.cpp
===================================================================
--- ELF/MarkLive.cpp
+++ ELF/MarkLive.cpp
@@ -156,20 +156,16 @@
scanEhFrameSection(EH, EH.rels(), Enqueue);
}
-// We do not garbage-collect two types of sections:
-// 1) Sections used by the loader (.init, .fini, .ctors, .dtors or .jcr)
-// 2) Non-allocatable sections which typically contain debugging information
+// We do not garbage-collect sections used by the loader (.init, .fini, .ctors,
+// .dtors or .jcr)
template <class ELFT> static bool isReserved(InputSectionBase<ELFT> *Sec) {
switch (Sec->Type) {
case SHT_FINI_ARRAY:
case SHT_INIT_ARRAY:
case SHT_NOTE:
case SHT_PREINIT_ARRAY:
return true;
default:
- if (!(Sec->Flags & SHF_ALLOC))
- return true;
-
// We do not want to reclaim sections if they can be referred
// by __start_* and __stop_* symbols.
StringRef S = Sec->Name;
@@ -196,10 +192,6 @@
if (!R.Sec || R.Sec == &InputSection<ELFT>::Discarded)
return;
- // We don't gc non alloc sections.
- if (!(R.Sec->Flags & SHF_ALLOC))
- return;
-
// Usually, a whole section is marked as live or dead, but in mergeable
// (splittable) sections, each piece of data has independent liveness bit.
// So we explicitly tell it which offset is in use.
@@ -240,7 +232,7 @@
// referred by .eh_frame here.
if (auto *EH = dyn_cast_or_null<EhInputSection<ELFT>>(Sec))
scanEhFrameSection<ELFT>(*EH, Enqueue);
- if (isReserved(Sec) || Script<ELFT>::X->shouldKeep(Sec))
+ if (Sec->Live || isReserved(Sec) || Script<ELFT>::X->shouldKeep(Sec))
Enqueue({Sec, 0});
}
Index: ELF/InputSection.h
===================================================================
--- ELF/InputSection.h
+++ ELF/InputSection.h
@@ -174,9 +174,10 @@
void splitIntoPieces();
// Mark the piece at a given offset live. Used by GC.
+ // We always keep whole non-alloc sections (usually debug ones).
void markLiveAt(uintX_t Offset) {
- assert(this->Flags & llvm::ELF::SHF_ALLOC);
- LiveOffsets.insert(Offset);
+ if (this->Flags & SHF_ALLOC)
+ LiveOffsets.insert(Offset);
}
// Translate an offset in the input section to an offset
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29170.85874.patch
Type: text/x-patch
Size: 2253 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170126/514626f4/attachment.bin>
More information about the llvm-commits
mailing list