[lld] r286261 - Don't add null and discarded sections to the global list.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 8 11:41:01 PST 2016


Thanks! This is a nice change. I wonder if we could remove dead sections
from the list as well. This will remove all "S->Live" checks, but it might
slows it down a little bit because we have to shift section pointers in the
vector.

On Tue, Nov 8, 2016 at 10:23 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Tue Nov  8 12:23:02 2016
> New Revision: 286261
>
> URL: http://llvm.org/viewvc/llvm-project?rev=286261&view=rev
> Log:
> Don't add null and discarded sections to the global list.
>
> Avoids having to skip them multiple times.
>
> Modified:
>     lld/trunk/ELF/Driver.cpp
>     lld/trunk/ELF/ICF.cpp
>     lld/trunk/ELF/LinkerScript.cpp
>     lld/trunk/ELF/MarkLive.cpp
>     lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.
> cpp?rev=286261&r1=286260&r2=286261&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Tue Nov  8 12:23:02 2016
> @@ -761,7 +761,8 @@ template <class ELFT> void LinkerDriver:
>    // Aggregate all input sections into one place.
>    for (elf::ObjectFile<ELFT> *F : Symtab.getObjectFiles())
>      for (InputSectionBase<ELFT> *S : F->getSections())
> -      Symtab.Sections.push_back(S);
> +      if (S && S != &InputSection<ELFT>::Discarded)
> +        Symtab.Sections.push_back(S);
>    for (BinaryFile *F : Symtab.getBinaryFiles())
>      for (InputSectionData *S : F->getSections())
>        Symtab.Sections.push_back(cast<InputSection<ELFT>>(S));
> @@ -775,7 +776,7 @@ template <class ELFT> void LinkerDriver:
>    // MergeInputSection::splitIntoPieces needs to be called before
>    // any call of MergeInputSection::getOffset. Do that.
>    for (InputSectionBase<ELFT> *S : Symtab.Sections) {
> -    if (!S || S == &InputSection<ELFT>::Discarded || !S->Live)
> +    if (!S->Live)
>        continue;
>      if (S->Compressed)
>        S->uncompress();
>
> Modified: lld/trunk/ELF/ICF.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ICF.cpp?
> rev=286261&r1=286260&r2=286261&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/ICF.cpp (original)
> +++ lld/trunk/ELF/ICF.cpp Tue Nov  8 12:23:02 2016
> @@ -128,7 +128,7 @@ template <class ELFT> uint64_t ICF<ELFT>
>
>  // Returns true if Sec is subject of ICF.
>  template <class ELFT> bool ICF<ELFT>::isEligible(InputSectionBase<ELFT>
> *Sec) {
> -  if (!Sec || Sec == &InputSection<ELFT>::Discarded || !Sec->Live)
> +  if (!Sec->Live)
>      return false;
>    auto *S = dyn_cast<InputSection<ELFT>>(Sec);
>    if (!S)
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.cpp?rev=286261&r1=286260&r2=286261&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Tue Nov  8 12:23:02 2016
> @@ -117,10 +117,6 @@ bool BytesDataCommand::classof(const Bas
>    return C->Kind == BytesDataKind;
>  }
>
> -template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S)
> {
> -  return !S || !S->Live;
> -}
> -
>  template <class ELFT> LinkerScript<ELFT>::LinkerScript() = default;
>  template <class ELFT> LinkerScript<ELFT>::~LinkerScript() = default;
>
> @@ -195,7 +191,7 @@ void LinkerScript<ELFT>::computeInputSec
>      size_t SizeBefore = I->Sections.size();
>
>      for (InputSectionBase<ELFT> *S : Symtab<ELFT>::X->Sections) {
> -      if (isDiscarded(S) || S->OutSec)
> +      if (!S->Live || S->OutSec)
>          continue;
>
>        StringRef Filename;
> @@ -368,7 +364,7 @@ void LinkerScript<ELFT>::createSections(
>
>    // Add orphan sections.
>    for (InputSectionBase<ELFT> *S : Symtab<ELFT>::X->Sections)
> -    if (!isDiscarded(S) && !S->OutSec)
> +    if (S->Live && !S->OutSec)
>        addSection(Factory, S, getOutputSectionName(S->Name));
>  }
>
>
> Modified: lld/trunk/ELF/MarkLive.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> MarkLive.cpp?rev=286261&r1=286260&r2=286261&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/MarkLive.cpp (original)
> +++ lld/trunk/ELF/MarkLive.cpp Tue Nov  8 12:23:02 2016
> @@ -239,8 +239,6 @@ template <class ELFT> void elf::markLive
>    // Preserve special sections and those which are specified in linker
>    // script KEEP command.
>    for (InputSectionBase<ELFT> *Sec : Symtab<ELFT>::X->Sections) {
> -    if (!Sec || Sec == &InputSection<ELFT>::Discarded)
> -      continue;
>      // .eh_frame is always marked as live now, but also it can reference
> to
>      // sections that contain personality. We preserve all non-text
> sections
>      // referred by .eh_frame here.
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
> cpp?rev=286261&r1=286260&r2=286261&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Tue Nov  8 12:23:02 2016
> @@ -118,8 +118,7 @@ StringRef elf::getOutputSectionName(Stri
>  }
>
>  template <class ELFT> void elf::reportDiscarded(InputSectionBase<ELFT>
> *IS) {
> -  if (!Config->PrintGcSections || !IS || IS ==
> &InputSection<ELFT>::Discarded ||
> -      IS->Live)
> +  if (!Config->PrintGcSections)
>      return;
>    errs() << "removing unused section from '" << IS->Name << "' in file '"
>           << IS->getFile()->getName() << "'\n";
> @@ -512,10 +511,6 @@ static bool compareSections(const Output
>    return compareSectionsNonScript(A, B);
>  }
>
> -template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S)
> {
> -  return !S || S == &InputSection<ELFT>::Discarded || !S->Live;
> -}
> -
>  // Program header entry
>  template <class ELFT>
>  PhdrEntry<ELFT>::PhdrEntry(unsigned Type, unsigned Flags) {
> @@ -653,7 +648,7 @@ void Writer<ELFT>::forEachRelSec(
>      std::function<void(InputSectionBase<ELFT> &, const typename
> ELFT::Shdr &)>
>          Fn) {
>    for (InputSectionBase<ELFT> *IS : Symtab<ELFT>::X->Sections) {
> -    if (isDiscarded(IS))
> +    if (!IS->Live)
>        continue;
>      // Scan all relocations. Each relocation goes through a series
>      // of tests to determine if it needs special treatment, such as
> @@ -675,7 +670,7 @@ void Writer<ELFT>::forEachRelSec(
>
>  template <class ELFT>
>  void Writer<ELFT>::addInputSec(InputSectionBase<ELFT> *IS) {
> -  if (isDiscarded(IS)) {
> +  if (!IS->Live) {
>      reportDiscarded(IS);
>      return;
>    }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161108/3a9a2193/attachment.html>


More information about the llvm-commits mailing list