[lld] r310620 - Remove ResolvedReloc.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 10 18:02:06 PDT 2017
Thanks!
Rui Ueyama via llvm-commits <llvm-commits at lists.llvm.org> writes:
> Author: ruiu
> Date: Thu Aug 10 09:21:04 2017
> New Revision: 310620
>
> URL: http://llvm.org/viewvc/llvm-project?rev=310620&view=rev
> Log:
> Remove ResolvedReloc.
>
> ResolvedReloc struct is always passed to a callback function and not
> stored anywhere. That is, in effect, we use the struct to pack multiple
> arguments to one argument, which doesn't make much sense. This patch
> removes the struct and passes the members to the callback directly.
>
> Modified:
> lld/trunk/ELF/MarkLive.cpp
>
> Modified: lld/trunk/ELF/MarkLive.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=310620&r1=310619&r2=310620&view=diff
> ==============================================================================
> --- lld/trunk/ELF/MarkLive.cpp (original)
> +++ lld/trunk/ELF/MarkLive.cpp Thu Aug 10 09:21:04 2017
> @@ -42,15 +42,6 @@ using namespace llvm::support::endian;
> using namespace lld;
> using namespace lld::elf;
>
> -namespace {
> -// A resolved relocation. The Sec and Offset fields are set if the relocation
> -// was resolved to an offset within a section.
> -struct ResolvedReloc {
> - InputSectionBase *Sec;
> - uint64_t Offset;
> -};
> -} // end anonymous namespace
> -
> template <class ELFT>
> static typename ELFT::uint getAddend(InputSectionBase &Sec,
> const typename ELFT::Rel &Rel) {
> @@ -70,7 +61,7 @@ static DenseMap<StringRef, std::vector<I
>
> template <class ELFT, class RelT>
> static void resolveReloc(InputSectionBase &Sec, RelT &Rel,
> - std::function<void(ResolvedReloc)> Fn) {
> + std::function<void(InputSectionBase *, uint64_t)> Fn) {
> SymbolBody &B = Sec.getFile<ELFT>()->getRelocTargetSym(Rel);
>
> if (auto *Sym = dyn_cast<DefinedCommon>(&B)) {
> @@ -81,22 +72,23 @@ static void resolveReloc(InputSectionBas
> if (auto *D = dyn_cast<DefinedRegular>(&B)) {
> if (!D->Section)
> return;
> - typename ELFT::uint Offset = D->Value;
> + uint64_t Offset = D->Value;
> if (D->isSection())
> Offset += getAddend<ELFT>(Sec, Rel);
> - Fn({cast<InputSectionBase>(D->Section), Offset});
> + Fn(cast<InputSectionBase>(D->Section), Offset);
> return;
> }
>
> if (auto *U = dyn_cast<Undefined>(&B))
> for (InputSectionBase *Sec : CNamedSections.lookup(U->getName()))
> - Fn({Sec, 0});
> + Fn(Sec, 0);
> }
>
> // Calls Fn for each section that Sec refers to via relocations.
> template <class ELFT>
> -static void forEachSuccessor(InputSection &Sec,
> - std::function<void(ResolvedReloc)> Fn) {
> +static void
> +forEachSuccessor(InputSection &Sec,
> + std::function<void(InputSectionBase *, uint64_t)> Fn) {
> if (Sec.AreRelocsRela) {
> for (const typename ELFT::Rela &Rel : Sec.template relas<ELFT>())
> resolveReloc<ELFT>(Sec, Rel, Fn);
> @@ -104,8 +96,9 @@ static void forEachSuccessor(InputSectio
> for (const typename ELFT::Rel &Rel : Sec.template rels<ELFT>())
> resolveReloc<ELFT>(Sec, Rel, Fn);
> }
> +
> for (InputSectionBase *IS : Sec.DependentSections)
> - Fn({IS, 0});
> + Fn(IS, 0);
> }
>
> // The .eh_frame section is an unfortunate special case.
> @@ -123,9 +116,11 @@ static void forEachSuccessor(InputSectio
> // the gc pass. With that we would be able to also gc some sections holding
> // LSDAs and personality functions if we found that they were unused.
> template <class ELFT, class RelTy>
> -static void scanEhFrameSection(EhInputSection &EH, ArrayRef<RelTy> Rels,
> - std::function<void(ResolvedReloc)> Enqueue) {
> +static void
> +scanEhFrameSection(EhInputSection &EH, ArrayRef<RelTy> Rels,
> + std::function<void(InputSectionBase *, uint64_t)> Fn) {
> const endianness E = ELFT::TargetEndianness;
> +
> for (unsigned I = 0, N = EH.Pieces.size(); I < N; ++I) {
> EhSectionPiece &Piece = EH.Pieces[I];
> unsigned FirstRelI = Piece.FirstRelocation;
> @@ -134,7 +129,7 @@ static void scanEhFrameSection(EhInputSe
> if (read32<E>(Piece.data().data() + 4) == 0) {
> // This is a CIE, we only need to worry about the first relocation. It is
> // known to point to the personality function.
> - resolveReloc<ELFT>(EH, Rels[FirstRelI], Enqueue);
> + resolveReloc<ELFT>(EH, Rels[FirstRelI], Fn);
> continue;
> }
> // This is a FDE. The relocations point to the described function or to
> @@ -145,20 +140,20 @@ static void scanEhFrameSection(EhInputSe
> const RelTy &Rel = Rels[I2];
> if (Rel.r_offset >= PieceEnd)
> break;
> - resolveReloc<ELFT>(EH, Rels[I2], [&](ResolvedReloc R) {
> - if (!R.Sec || R.Sec == &InputSection::Discarded)
> - return;
> - if (R.Sec->Flags & SHF_EXECINSTR)
> - return;
> - Enqueue({R.Sec, 0});
> - });
> + resolveReloc<ELFT>(EH, Rels[I2],
> + [&](InputSectionBase *Sec, uint64_t Offset) {
> + if (Sec && Sec != &InputSection::Discarded &&
> + !(Sec->Flags & SHF_EXECINSTR))
> + Fn(Sec, 0);
> + });
> }
> }
> }
>
> template <class ELFT>
> -static void scanEhFrameSection(EhInputSection &EH,
> - std::function<void(ResolvedReloc)> Enqueue) {
> +static void
> +scanEhFrameSection(EhInputSection &EH,
> + std::function<void(InputSectionBase *, uint64_t)> Fn) {
> if (!EH.NumRelocations)
> return;
>
> @@ -167,9 +162,9 @@ static void scanEhFrameSection(EhInputSe
> EH.split<ELFT>();
>
> if (EH.AreRelocsRela)
> - scanEhFrameSection<ELFT>(EH, EH.template relas<ELFT>(), Enqueue);
> + scanEhFrameSection<ELFT>(EH, EH.template relas<ELFT>(), Fn);
> else
> - scanEhFrameSection<ELFT>(EH, EH.template rels<ELFT>(), Enqueue);
> + scanEhFrameSection<ELFT>(EH, EH.template rels<ELFT>(), Fn);
> }
>
> // We do not garbage-collect two types of sections:
> @@ -200,36 +195,37 @@ template <class ELFT> void elf::markLive
> SmallVector<InputSection *, 256> Q;
> CNamedSections.clear();
>
> - auto Enqueue = [&](ResolvedReloc R) {
> + auto Enqueue = [&](InputSectionBase *Sec, uint64_t Offset) {
> // Skip over discarded sections. This in theory shouldn't happen, because
> // the ELF spec doesn't allow a relocation to point to a deduplicated
> // COMDAT section directly. Unfortunately this happens in practice (e.g.
> // .eh_frame) so we need to add a check.
> - if (R.Sec == &InputSection::Discarded)
> + if (Sec == &InputSection::Discarded)
> return;
>
> // We don't gc non alloc sections.
> - if (!(R.Sec->Flags & SHF_ALLOC))
> + if (!(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.
> - if (auto *MS = dyn_cast<MergeInputSection>(R.Sec))
> - MS->markLiveAt(R.Offset);
> + if (auto *MS = dyn_cast<MergeInputSection>(Sec))
> + MS->markLiveAt(Offset);
>
> - if (R.Sec->Live)
> + if (Sec->Live)
> return;
> - R.Sec->Live = true;
> + Sec->Live = true;
> +
> // Add input section to the queue.
> - if (InputSection *S = dyn_cast<InputSection>(R.Sec))
> + if (InputSection *S = dyn_cast<InputSection>(Sec))
> Q.push_back(S);
> };
>
> auto MarkSymbol = [&](SymbolBody *Sym) {
> if (auto *D = dyn_cast_or_null<DefinedRegular>(Sym)) {
> if (auto *IS = cast_or_null<InputSectionBase>(D->Section))
> - Enqueue({IS, D->Value});
> + Enqueue(IS, D->Value);
> return;
> }
> if (auto *S = dyn_cast_or_null<DefinedCommon>(Sym))
> @@ -262,7 +258,7 @@ template <class ELFT> void elf::markLive
> if (Sec->Flags & SHF_LINK_ORDER)
> continue;
> if (isReserved<ELFT>(Sec) || Script->shouldKeep(Sec))
> - Enqueue({Sec, 0});
> + Enqueue(Sec, 0);
> else if (isValidCIdentifier(Sec->Name)) {
> CNamedSections[Saver.save("__start_" + Sec->Name)].push_back(Sec);
> CNamedSections[Saver.save("__stop_" + Sec->Name)].push_back(Sec);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list