[ELF] - Simplify a SymbolBody class interface a bit.
authorGeorge Rimar <grimar@accesssoftek.com>
Sun, 6 Mar 2016 06:26:18 +0000 (06:26 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Sun, 6 Mar 2016 06:26:18 +0000 (06:26 +0000)
Get rid of few accessors in that class, and replace
them with direct fields access.

Differential revision: http://reviews.llvm.org/D17879

llvm-svn: 262796

lld/ELF/InputSection.cpp
lld/ELF/OutputSections.cpp
lld/ELF/SymbolTable.cpp
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/ELF/Target.cpp
lld/ELF/Writer.cpp

index 4d74f842e29e3e05aeeea988fbd230f92c32f236..9e0ecd9aaff720fef4feb6a282562fb41bb2a781 100644 (file)
@@ -282,7 +282,7 @@ void InputSectionBase<ELFT>::relocate(uint8_t *Buf, uint8_t *BufEnd,
         SymVA = Out<ELFT>::Got->getMipsLocalFullAddr(*Body);
       else
         SymVA = Body->getGotVA<ELFT>();
-      if (Body->isTls())
+      if (Body->IsTls)
         Type = Target->getTlsGotRel(Type);
     } else if (!Target->needsCopyRel<ELFT>(Type, *Body) &&
                isa<SharedSymbol<ELFT>>(*Body)) {
index c717344ccbe92966d3d19f4550b214abc47baa2f..8c294f6865af961f7cc55b27f972060cd0c727be 100644 (file)
@@ -955,7 +955,7 @@ bool elf::canBePreempted(const SymbolBody *Body) {
     return false;
   if (Body->getVisibility() != STV_DEFAULT)
     return false;
-  if (Config->Bsymbolic || (Config->BsymbolicFunctions && Body->isFunc()))
+  if (Config->Bsymbolic || (Config->BsymbolicFunctions && Body->IsFunc))
     return false;
   return true;
 }
index 7f41724bd34874958bdb5908d62b8526c7ae84e6..cd8c8d2bc43b7690d2ba835150495352be0ff544 100644 (file)
@@ -285,7 +285,7 @@ template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) {
     return;
   }
 
-  if (New->isTls() != Existing->isTls()) {
+  if (New->IsTls != Existing->IsTls) {
     error("TLS attribute mismatch for symbol: " + conflictMsg(Existing, New));
     return;
   }
@@ -346,8 +346,7 @@ void SymbolTable<ELFT>::addMemberFile(Undefined *Undef, Lazy *L) {
     L->setWeak();
 
     // FIXME: Do we need to copy more?
-    if (Undef->isTls())
-      L->setTls();
+    L->IsTls |= Undef->IsTls;
     return;
   }
 
index 49304e4bcdad2c7ece142ec158d0d86df4327bca..f67b20639ca79684f7e5cb736d42aadb47031da7 100644 (file)
@@ -61,7 +61,7 @@ typename ELFFile<ELFT>::uintX_t SymbolBody::getVA() const {
     auto *SS = cast<SharedSymbol<ELFT>>(this);
     if (!SS->NeedsCopyOrPltAddr)
       return 0;
-    if (SS->isFunc())
+    if (SS->IsFunc)
       return getPltVA<ELFT>();
     else
       return Out<ELFT>::Bss->getVA() + SS->OffsetInBss;
index fc240b13895fa32bc1253c340c02233a3d94d16d..c73371ab1eaf7f93ee04de7d1170ebea3c8145ee 100644 (file)
@@ -84,8 +84,6 @@ public:
   bool isLazy() const { return SymbolKind == LazyKind; }
   bool isShared() const { return SymbolKind == SharedKind; }
   bool isUsedInRegularObj() const { return IsUsedInRegularObj; }
-  bool isFunc() const { return Type == llvm::ELF::STT_FUNC; }
-  bool isTls() const { return Type == llvm::ELF::STT_TLS; }
 
   // Returns the symbol name.
   StringRef getName() const { return Name; }
@@ -131,8 +129,9 @@ protected:
   SymbolBody(Kind K, StringRef Name, bool IsWeak, uint8_t Visibility,
              uint8_t Type)
       : SymbolKind(K), IsWeak(IsWeak), Visibility(Visibility),
-        MustBeInDynSym(false), NeedsCopyOrPltAddr(false),
-        Type(Type), Name(Name) {
+        MustBeInDynSym(false), NeedsCopyOrPltAddr(false), Name(Name) {
+    IsFunc = Type == llvm::ELF::STT_FUNC;
+    IsTls = Type == llvm::ELF::STT_TLS;
     IsUsedInRegularObj = K != SharedKind && K != LazyKind;
   }
 
@@ -154,9 +153,10 @@ public:
   // symbol or if the symbol should point to its plt entry.
   unsigned NeedsCopyOrPltAddr : 1;
 
-protected:
-  uint8_t Type;
+  unsigned IsTls : 1;
+  unsigned IsFunc : 1;
 
+protected:
   StringRef Name;
   Symbol *Backref = nullptr;
 };
@@ -305,7 +305,7 @@ public:
   // OffsetInBss is significant only when needsCopy() is true.
   uintX_t OffsetInBss = 0;
 
-  bool needsCopy() const { return this->NeedsCopyOrPltAddr && !this->isFunc(); }
+  bool needsCopy() const { return this->NeedsCopyOrPltAddr && !this->IsFunc; }
 };
 
 // This class represents a symbol defined in an archive file. It is
@@ -326,7 +326,6 @@ public:
   // was already returned.
   std::unique_ptr<InputFile> getMember();
 
-  void setTls() { this->Type = llvm::ELF::STT_TLS; }
   void setWeak() { IsWeak = true; }
   void setUsedInRegularObj() { IsUsedInRegularObj = true; }
 
index e4ba6d7f8a19eda0dc01cb9818e660af7e0bcdce..c38a087cf5803b7782dbedc46f68ff645f50af76 100644 (file)
@@ -264,7 +264,7 @@ TargetInfo *createTarget() {
 TargetInfo::~TargetInfo() {}
 
 bool TargetInfo::canRelaxTls(uint32_t Type, const SymbolBody *S) const {
-  if (Config->Shared || (S && !S->isTls()))
+  if (Config->Shared || (S && !S->IsTls))
     return false;
 
   // We know we are producing an executable.
@@ -485,7 +485,7 @@ bool X86TargetInfo::needsCopyRelImpl(uint32_t Type) const {
 }
 
 bool X86TargetInfo::needsGot(uint32_t Type, SymbolBody &S) const {
-  if (S.isTls() && Type == R_386_TLS_GD)
+  if (S.IsTls && Type == R_386_TLS_GD)
     return Target->canRelaxTls(Type, &S) && canBePreempted(&S);
   if (Type == R_386_TLS_GOTIE || Type == R_386_TLS_IE)
     return !canRelaxTls(Type, &S);
index bd24dcfe8648d04e8a676224ed1dc183c41feb86..cf22b10f0265e54efcd1a21d9bda4dda05f4c431 100644 (file)
@@ -268,7 +268,7 @@ static bool handleTlsRelocation(uint32_t Type, SymbolBody *Body,
     return true;
   }
 
-  if (!Body || !Body->isTls())
+  if (!Body || !Body->IsTls)
     return false;
 
   if (Target->isTlsGlobalDynamicRel(Type)) {
@@ -424,7 +424,7 @@ void Writer<ELFT>::scanRelocs(
       if (CBP || Dynrel) {
         uint32_t DynType;
         if (CBP)
-          DynType = Body->isTls() ? Target->TlsGotRel : Target->GotRel;
+          DynType = Body->IsTls ? Target->TlsGotRel : Target->GotRel;
         else
           DynType = Target->RelativeRel;
         Out<ELFT>::RelaDyn->addReloc(