[lld] r265142 - Refactor duplicated code.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 1 07:14:49 PDT 2016
Author: rafael
Date: Fri Apr 1 09:14:48 2016
New Revision: 265142
URL: http://llvm.org/viewvc/llvm-project?rev=265142&view=rev
Log:
Refactor duplicated code.
We had almost identical code to handle creating a plt entry in two
places.
Modified:
lld/trunk/ELF/Writer.cpp
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=265142&r1=265141&r2=265142&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Apr 1 09:14:48 2016
@@ -384,27 +384,6 @@ void Writer<ELFT>::scanRelocs(InputSecti
}
}
- // An STT_GNU_IFUNC symbol always uses a PLT entry, and all references
- // to the symbol go through the PLT. This is true even for a local
- // symbol, although local symbols normally do not require PLT entries.
- if (Body.IsGnuIFunc) {
- if (Body.isInPlt())
- continue;
- Out<ELFT>::Plt->addEntry(Body);
- if (Target->UseLazyBinding) {
- Out<ELFT>::GotPlt->addEntry(Body);
- Out<ELFT>::RelaPlt->addReloc(
- {Preemptible ? Target->PltRel : Target->IRelativeRel,
- DynamicReloc<ELFT>::Off_GotPlt, !Preemptible, &Body});
- } else {
- Out<ELFT>::Got->addEntry(Body);
- Out<ELFT>::RelaDyn->addReloc(
- {Preemptible ? Target->PltRel : Target->IRelativeRel,
- DynamicReloc<ELFT>::Off_Got, !Preemptible, &Body});
- }
- continue;
- }
-
// If a relocation needs PLT, we create a PLT and a GOT slot
// for the symbol.
TargetInfo::PltNeed NeedPlt = Target->needsPlt(Type, Body);
@@ -415,16 +394,22 @@ void Writer<ELFT>::scanRelocs(InputSecti
continue;
Out<ELFT>::Plt->addEntry(Body);
+ uint32_t Rel;
+ if (Body.IsGnuIFunc)
+ Rel = Preemptible ? Target->PltRel : Target->IRelativeRel;
+ else
+ Rel = Target->UseLazyBinding ? Target->PltRel : Target->GotRel;
+
if (Target->UseLazyBinding) {
Out<ELFT>::GotPlt->addEntry(Body);
Out<ELFT>::RelaPlt->addReloc(
- {Target->PltRel, DynamicReloc<ELFT>::Off_GotPlt, &Body});
+ {Rel, DynamicReloc<ELFT>::Off_GotPlt, !Preemptible, &Body});
} else {
if (Body.isInGot())
continue;
Out<ELFT>::Got->addEntry(Body);
Out<ELFT>::RelaDyn->addReloc(
- {Target->GotRel, DynamicReloc<ELFT>::Off_Got, &Body});
+ {Rel, DynamicReloc<ELFT>::Off_Got, !Preemptible, &Body});
}
continue;
}
More information about the llvm-commits
mailing list