Simplify getOffset for synthetic sections.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 19 Apr 2018 16:54:30 +0000 (16:54 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 19 Apr 2018 16:54:30 +0000 (16:54 +0000)
We had a single symbol using -1 with a synthetic section. It is
simpler to just update its value.

This is not a big will by itself, but will allow having a simple
getOffset for InputSeciton.

llvm-svn: 330340

lld/ELF/InputSection.cpp
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/ELF/Writer.cpp

index f094be5..00cc012 100644 (file)
@@ -142,12 +142,8 @@ uint64_t SectionBase::getOffset(uint64_t Offset) const {
     return Offset == uint64_t(-1) ? OS->Size : Offset;
   }
   case Regular:
+  case Synthetic:
     return cast<InputSection>(this->Repl)->OutSecOff + Offset;
-  case Synthetic: {
-    auto *IS = cast<InputSection>(this->Repl);
-    // For synthetic sections we treat offset -1 as the end of the section.
-    return IS->OutSecOff + (Offset == uint64_t(-1) ? IS->getSize() : Offset);
-  }
   case EHFrame:
     // The file crtbeginT.o has relocations pointing to the start of an empty
     // .eh_frame that is known to be the first in the link. It does that to
index 1996400..5dfc225 100644 (file)
@@ -38,6 +38,7 @@ Defined *ElfSym::GlobalOffsetTable;
 Defined *ElfSym::MipsGp;
 Defined *ElfSym::MipsGpDisp;
 Defined *ElfSym::MipsLocalGp;
+Defined *ElfSym::RelaIpltEnd;
 
 static uint64_t getSymVA(const Symbol &Sym, int64_t &Addend) {
   switch (Sym.kind()) {
index 5f4c792..69e943f 100644 (file)
@@ -315,6 +315,9 @@ struct ElfSym {
   static Defined *MipsGp;
   static Defined *MipsGpDisp;
   static Defined *MipsLocalGp;
+
+  // __rela_iplt_end or __rel_iplt_end
+  static Defined *RelaIpltEnd;
 };
 
 // A buffer class that is large enough to hold any Symbol-derived
index 27669f9..ae5b580 100644 (file)
@@ -853,7 +853,8 @@ template <class ELFT> void Writer<ELFT>::addRelIpltSymbols() {
   addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
 
   S = Config->IsRela ? "__rela_iplt_end" : "__rel_iplt_end";
-  addOptionalRegular(S, InX::RelaIplt, -1, STV_HIDDEN, STB_WEAK);
+  ElfSym::RelaIpltEnd =
+      addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
 }
 
 template <class ELFT>
@@ -886,6 +887,9 @@ template <class ELFT> void Writer<ELFT>::setReservedSymbolSections() {
     ElfSym::GlobalOffsetTable->Section = GotSection;
   }
 
+  if (ElfSym::RelaIpltEnd)
+    ElfSym::RelaIpltEnd->Value = InX::RelaIplt->getSize();
+
   PhdrEntry *Last = nullptr;
   PhdrEntry *LastRO = nullptr;