summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-02-23 18:53:29 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-02-23 18:53:29 +0000
commitf7ae359d2c8ab309a1556a4365c52fab26281e3c (patch)
tree6e2b180c2fefd7deec1c4fbdcb004a33a94df8f2
parent75baf09be5a4e9d8223fa18e1d28f130ba5460de (diff)
downloadbcm5719-llvm-f7ae359d2c8ab309a1556a4365c52fab26281e3c.tar.gz
bcm5719-llvm-f7ae359d2c8ab309a1556a4365c52fab26281e3c.zip
Simplify. NFC.
llvm-svn: 261668
-rw-r--r--lld/ELF/InputSection.cpp2
-rw-r--r--lld/ELF/Target.cpp33
-rw-r--r--lld/ELF/Target.h1
-rw-r--r--lld/ELF/Writer.cpp2
4 files changed, 16 insertions, 22 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 608607918ef..ad817801b03 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -218,7 +218,7 @@ void InputSectionBase<ELFT>::relocate(uint8_t *Buf, uint8_t *BufEnd,
SymVA = Body->getGotVA<ELFT>();
if (Body->IsTls)
Type = Target->getTlsGotRel(Type);
- } else if (!Target->needsCopyRel(Type, *Body) &&
+ } else if (!Target->needsCopyRel<ELFT>(Type, *Body) &&
isa<SharedSymbol<ELFT>>(*Body)) {
continue;
} else if (Target->isTlsDynRel(Type, *Body)) {
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 1c5c57dd8ae..01baba91d44 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -275,25 +275,9 @@ template <typename ELFT> static bool mayNeedCopy(const SymbolBody &S) {
return SS->Sym.getType() == STT_OBJECT;
}
+template <class ELFT>
bool TargetInfo::needsCopyRel(uint32_t Type, const SymbolBody &S) const {
- bool MayNeed;
- switch (Config->EKind) {
- case ELF32LEKind:
- MayNeed = mayNeedCopy<ELF32LE>(S);
- break;
- case ELF64LEKind:
- MayNeed = mayNeedCopy<ELF64LE>(S);
- break;
- case ELF32BEKind:
- MayNeed = mayNeedCopy<ELF32BE>(S);
- break;
- case ELF64BEKind:
- MayNeed = mayNeedCopy<ELF64BE>(S);
- break;
- default:
- llvm_unreachable("Invalid ELF kind");
- }
- return MayNeed && needsCopyRelImpl(Type);
+ return mayNeedCopy<ELFT>(S) && needsCopyRelImpl(Type);
}
bool TargetInfo::isTlsDynRel(unsigned Type, const SymbolBody &S) const {
@@ -725,7 +709,7 @@ bool X86_64TargetInfo::isTlsDynRel(unsigned Type, const SymbolBody &S) const {
TargetInfo::PltNeed X86_64TargetInfo::needsPlt(uint32_t Type,
const SymbolBody &S) const {
- if (needsCopyRel(Type, S))
+ if (needsCopyRel<ELF64LE>(Type, S))
return Plt_No;
if (isGnuIFunc<ELF64LE>(S))
return Plt_Explicit;
@@ -1714,7 +1698,7 @@ bool MipsTargetInfo<ELFT>::needsGot(uint32_t Type, SymbolBody &S) const {
template <class ELFT>
TargetInfo::PltNeed MipsTargetInfo<ELFT>::needsPlt(uint32_t Type,
const SymbolBody &S) const {
- if (needsCopyRel(Type, S))
+ if (needsCopyRel<ELFT>(Type, S))
return Plt_No;
if (Type == R_MIPS_26 && canBePreempted(&S, false))
return Plt_Explicit;
@@ -1859,5 +1843,14 @@ template uint32_t getMipsGpAddr<ELF32LE>();
template uint32_t getMipsGpAddr<ELF32BE>();
template uint64_t getMipsGpAddr<ELF64LE>();
template uint64_t getMipsGpAddr<ELF64BE>();
+
+template bool TargetInfo::needsCopyRel<ELF32LE>(uint32_t,
+ const SymbolBody &) const;
+template bool TargetInfo::needsCopyRel<ELF32BE>(uint32_t,
+ const SymbolBody &) const;
+template bool TargetInfo::needsCopyRel<ELF64LE>(uint32_t,
+ const SymbolBody &) const;
+template bool TargetInfo::needsCopyRel<ELF64BE>(uint32_t,
+ const SymbolBody &) const;
}
}
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 4af596cb346..92f3e2269eb 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -63,6 +63,7 @@ public:
uint8_t *PairedLoc = nullptr) const = 0;
virtual bool isGotRelative(uint32_t Type) const;
virtual bool canRelaxTls(unsigned Type, const SymbolBody *S) const;
+ template <class ELFT>
bool needsCopyRel(uint32_t Type, const SymbolBody &S) const;
virtual unsigned relaxTls(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
uint64_t P, uint64_t SA, const SymbolBody *S) const;
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 52741b1cf46..ab844d368e1 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -335,7 +335,7 @@ void Writer<ELFT>::scanRelocs(
if (auto *B = dyn_cast_or_null<SharedSymbol<ELFT>>(Body)) {
if (B->needsCopy())
continue;
- if (Target->needsCopyRel(Type, *B)) {
+ if (Target->needsCopyRel<ELFT>(Type, *B)) {
B->NeedsCopyOrPltAddr = true;
Out<ELFT>::RelaDyn->addReloc(
{Target->CopyRel, DynamicReloc<ELFT>::Off_Bss, B});
OpenPOWER on IntegriCloud