Use a bit in SymbolBody to store CanKeepUndefined.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Apr 2016 14:31:03 +0000 (14:31 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Apr 2016 14:31:03 +0000 (14:31 +0000)
UndefinedElf for 64 bits goes from 72 to 64 bytes.

llvm-svn: 265543

lld/ELF/Symbols.cpp
lld/ELF/Symbols.h

index add7546..95f5b9b 100644 (file)
@@ -89,15 +89,14 @@ static typename ELFT::uint getSymVA(const SymbolBody &Body,
 
 SymbolBody::SymbolBody(Kind K, uint32_t NameOffset, uint8_t StOther,
                        uint8_t Type)
-    : SymbolKind(K), MustBeInDynSym(false), NeedsCopyOrPltAddr(false),
-      Type(Type), Binding(STB_LOCAL), StOther(StOther), NameOffset(NameOffset) {
+    : SymbolKind(K), Type(Type), Binding(STB_LOCAL), StOther(StOther),
+      NameOffset(NameOffset) {
   init();
 }
 
 SymbolBody::SymbolBody(Kind K, StringRef Name, uint8_t Binding, uint8_t StOther,
                        uint8_t Type)
-    : SymbolKind(K), MustBeInDynSym(false), NeedsCopyOrPltAddr(false),
-      Type(Type), Binding(Binding), StOther(StOther),
+    : SymbolKind(K), Type(Type), Binding(Binding), StOther(StOther),
       Name({Name.data(), Name.size()}) {
   assert(!isLocal());
   init();
@@ -107,6 +106,9 @@ void SymbolBody::init() {
   Kind K = kind();
   IsUsedInRegularObj = K == DefinedRegularKind || K == DefinedCommonKind ||
                        K == DefinedSyntheticKind || K == UndefinedElfKind;
+  CanKeepUndefined = false;
+  MustBeInDynSym = false;
+  NeedsCopyOrPltAddr = false;
 }
 
 // Returns true if a symbol can be replaced at load-time by a symbol
@@ -267,8 +269,9 @@ template <typename ELFT>
 UndefinedElf<ELFT>::UndefinedElf(StringRef Name, uint8_t Binding,
                                  uint8_t StOther, uint8_t Type,
                                  bool CanKeepUndefined)
-    : SymbolBody(SymbolBody::UndefinedElfKind, Name, Binding, StOther, Type),
-      CanKeepUndefined(CanKeepUndefined) {}
+    : SymbolBody(SymbolBody::UndefinedElfKind, Name, Binding, StOther, Type) {
+  this->CanKeepUndefined = CanKeepUndefined;
+}
 
 template <typename ELFT>
 UndefinedElf<ELFT>::UndefinedElf(const Elf_Sym &Sym)
index afd8743..35f146d 100644 (file)
@@ -147,6 +147,8 @@ public:
   // symbol or if the symbol should point to its plt entry.
   unsigned NeedsCopyOrPltAddr : 1;
 
+  unsigned CanKeepUndefined : 1;
+
   // The following fields have the same meaning as the ELF symbol attributes.
   uint8_t Type;    // symbol type
   uint8_t Binding; // symbol binding
@@ -289,7 +291,6 @@ public:
 template <class ELFT> class UndefinedElf : public SymbolBody {
   typedef typename ELFT::uint uintX_t;
   typedef typename ELFT::Sym Elf_Sym;
-  bool CanKeepUndefined = false;
 
 public:
   UndefinedElf(StringRef N, const Elf_Sym &Sym);