[lld] r258430 - ELF: Move code to emit copyrel to one place. NFC.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 21 12:59:22 PST 2016
Author: ruiu
Date: Thu Jan 21 14:59:22 2016
New Revision: 258430
URL: http://llvm.org/viewvc/llvm-project?rev=258430&view=rev
Log:
ELF: Move code to emit copyrel to one place. NFC.
In this code, we avoid calling needsCopyRel in writeTo because
we called that function already in scanRelocs. Making the same
decision twice is a waste and has a risk of a bug that we get
inconsistent resuts.
Modified:
lld/trunk/ELF/OutputSections.cpp
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=258430&r1=258429&r2=258430&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Thu Jan 21 14:59:22 2016
@@ -290,7 +290,16 @@ template <class ELFT> void RelocationSec
uint32_t Type = RI.getType(Config->Mips64EL);
if (applyTlsDynamicReloc(Body, Type, P, reinterpret_cast<Elf_Rel *>(Buf)))
continue;
- bool NeedsCopy = Body && Target->needsCopyRel(Type, *Body);
+
+ // Emit a copy relocation.
+ auto *SS = dyn_cast_or_null<SharedSymbol<ELFT>>(Body);
+ if (SS && SS->NeedsCopy) {
+ P->setSymbolAndType(Body->DynamicSymbolTableIndex, Target->getCopyReloc(),
+ Config->Mips64EL);
+ P->r_offset = Out<ELFT>::Bss->getVA() + SS->OffsetInBss;
+ continue;
+ }
+
bool NeedsGot = Body && Target->relocNeedsGot(Type, *Body);
bool CBP = canBePreempted(Body, NeedsGot);
bool LazyReloc = Body && Target->supportsLazyRelocations() &&
@@ -307,8 +316,6 @@ template <class ELFT> void RelocationSec
Reloc = Target->getPltReloc();
else if (NeedsGot)
Reloc = Body->isTls() ? Target->getTlsGotReloc() : Target->getGotReloc();
- else if (NeedsCopy)
- Reloc = Target->getCopyReloc();
else
Reloc = Target->getDynReloc(Type);
P->setSymbolAndType(Sym, Reloc, Config->Mips64EL);
@@ -317,9 +324,6 @@ template <class ELFT> void RelocationSec
P->r_offset = Out<ELFT>::GotPlt->getEntryAddr(*Body);
else if (NeedsGot)
P->r_offset = Out<ELFT>::Got->getEntryAddr(*Body);
- else if (NeedsCopy)
- P->r_offset = Out<ELFT>::Bss->getVA() +
- cast<SharedSymbol<ELFT>>(Body)->OffsetInBss;
else
P->r_offset = C.getOffset(RI.r_offset) + C.OutSec->getVA();
@@ -328,9 +332,7 @@ template <class ELFT> void RelocationSec
OrigAddend = static_cast<const Elf_Rela &>(RI).r_addend;
uintX_t Addend;
- if (NeedsCopy)
- Addend = 0;
- else if (CBP || IsDynRelative)
+ if (CBP || IsDynRelative)
Addend = OrigAddend;
else if (Body)
Addend = getSymVA<ELFT>(*Body) + OrigAddend;
More information about the llvm-commits
mailing list