[lld] r263224 - Remember the input section of locals.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 11 04:14:04 PST 2016


Author: rafael
Date: Fri Mar 11 06:14:02 2016
New Revision: 263224

URL: http://llvm.org/viewvc/llvm-project?rev=263224&view=rev
Log:
Remember the input section of locals.

This is already a simplification, but will allow much more.

Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/OutputSections.cpp
    lld/trunk/ELF/OutputSections.h
    lld/trunk/ELF/Symbols.h
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=263224&r1=263223&r2=263224&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Fri Mar 11 06:14:02 2016
@@ -292,7 +292,7 @@ template <class ELFT>
 SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
   unsigned char Binding = Sym->getBinding();
   if (Binding == STB_LOCAL)
-    return new (Alloc) LocalSymbol<ELFT>(*Sym);
+    return new (Alloc) LocalSymbol<ELFT>(*Sym, getSection(*Sym));
 
   StringRef Name = check(Sym->getName(this->StringTable));
 

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=263224&r1=263223&r2=263224&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Fri Mar 11 06:14:02 2016
@@ -267,12 +267,20 @@ template <class ELFT> void RelocationSec
 
     if (IsRela) {
       uintX_t VA = 0;
-      if (Rel.UseSymVA)
-        VA = Sym->getVA<ELFT>();
-      else if (Rel.TargetSec)
-        VA = Rel.TargetSec->getOffset(Rel.OffsetInTargetSec) +
-             Rel.TargetSec->OutSec->getVA();
-      reinterpret_cast<Elf_Rela *>(P)->r_addend = Rel.Addend + VA;
+      uintX_t Addend = Rel.Addend;
+      if (Rel.UseSymVA) {
+        if (auto *L = dyn_cast<LocalSymbol<ELFT>>(Sym)) {
+          uintX_t Pos = L->Sym.st_value;
+          if (L->Sym.getType() == STT_SECTION) {
+            Pos += Addend;
+            Addend = 0;
+          }
+          VA = L->Section->OutSec->getVA() + L->Section->getOffset(Pos);
+        } else {
+          VA = Sym->getVA<ELFT>();
+        }
+      }
+      reinterpret_cast<Elf_Rela *>(P)->r_addend = Addend + VA;
     }
 
     P->r_offset = Rel.getOffset();

Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=263224&r1=263223&r2=263224&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Fri Mar 11 06:14:02 2016
@@ -186,8 +186,6 @@ template <class ELFT> struct DynamicRelo
   InputSectionBase<ELFT> *OffsetSec = nullptr;
   uintX_t OffsetInSec = 0;
   bool UseSymVA = false;
-  InputSectionBase<ELFT> *TargetSec = nullptr;
-  uintX_t OffsetInTargetSec = 0;
   uintX_t Addend = 0;
 
   DynamicReloc(uint32_t Type, OffsetKind OKind, SymbolBody *Sym)
@@ -202,13 +200,6 @@ template <class ELFT> struct DynamicRelo
       : Type(Type), OKind(Off_Sec), Sym(Sym), OffsetSec(OffsetSec),
         OffsetInSec(OffsetInSec), UseSymVA(UseSymVA), Addend(Addend) {}
 
-  DynamicReloc(uint32_t Type, InputSectionBase<ELFT> *OffsetSec,
-               uintX_t OffsetInSec, InputSectionBase<ELFT> *TargetSec,
-               uintX_t OffsetInTargetSec, uintX_t Addend)
-      : Type(Type), OKind(Off_Sec), OffsetSec(OffsetSec),
-        OffsetInSec(OffsetInSec), TargetSec(TargetSec),
-        OffsetInTargetSec(OffsetInTargetSec), Addend(Addend) {}
-
   uintX_t getOffset() const;
 };
 

Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=263224&r1=263223&r2=263224&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Fri Mar 11 06:14:02 2016
@@ -310,12 +310,15 @@ template <class ELFT> class LocalSymbol
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
 
 public:
-  LocalSymbol(const Elf_Sym &Sym)
-      : DefinedElf<ELFT>(SymbolBody::DefinedLocalKind, "", Sym) {}
+  LocalSymbol(const Elf_Sym &Sym, InputSectionBase<ELFT> *Section)
+      : DefinedElf<ELFT>(SymbolBody::DefinedLocalKind, "", Sym),
+        Section(Section) {}
 
   static bool classof(const SymbolBody *S) {
     return S->kind() == SymbolBody::DefinedLocalKind;
   }
+
+  InputSectionBase<ELFT> *Section;
 };
 
 // This class represents a symbol defined in an archive file. It is

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=263224&r1=263223&r2=263224&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Mar 11 06:14:02 2016
@@ -474,20 +474,8 @@ void Writer<ELFT>::scanRelocs(
                                     (uintX_t)getPPC64TocBase() + Addend});
       continue;
     }
-    if (!Body.isLocal()) {
-      Out<ELFT>::RelaDyn->addReloc(
-          {Target->RelativeRel, &C, RI.r_offset, true, &Body, Addend});
-      continue;
-    }
-    const Elf_Sym &Sym = cast<LocalSymbol<ELFT>>(Body).Sym;
-    InputSectionBase<ELFT> *Section = File.getSection(Sym);
-    uintX_t Offset = Sym.st_value;
-    if (Sym.getType() == STT_SECTION) {
-      Offset += Addend;
-      Addend = 0;
-    }
     Out<ELFT>::RelaDyn->addReloc(
-        {Target->RelativeRel, &C, RI.r_offset, Section, Offset, Addend});
+        {Target->RelativeRel, &C, RI.r_offset, true, &Body, Addend});
   }
 }
 




More information about the llvm-commits mailing list