<div dir="ltr">This is a good change. Letting the function caling side to handle <span style="font-size:12.8px">SHN_XINDEX was error prone. Thank you for doing this!</span></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 16, 2015 at 8:29 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Fri Oct 16 10:29:48 2015<br>
New Revision: 250519<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=250519&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=250519&view=rev</a><br>
Log:<br>
Add a ObjectFile<ELFT>::getSection helper and simplify. NFC.<br>
<br>
Modified:<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/InputFiles.h<br>
    lld/trunk/ELF/OutputSections.cpp<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250519&r1=250518&r2=250519&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250519&r1=250518&r2=250519&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Fri Oct 16 10:29:48 2015<br>
@@ -173,36 +173,43 @@ template <class ELFT> void elf2::ObjectF<br>
 }<br>
<br>
 template <class ELFT><br>
+InputSection<ELFT> *<br>
+elf2::ObjectFile<ELFT>::getSection(const Elf_Sym &Sym) const {<br>
+  uint32_t Index = Sym.st_shndx;<br>
+  if (Index == ELF::SHN_XINDEX)<br>
+    Index = this->ELFObj.getExtendedSymbolTableIndex(&Sym, this->Symtab,<br>
+                                                     SymtabSHNDX);<br>
+  else if (Index == ELF::SHN_UNDEF || Index >= ELF::SHN_LORESERVE)<br>
+    return nullptr;<br>
+<br>
+  if (Index >= Sections.size() || !Index || !Sections[Index])<br>
+    error("Invalid section index");<br>
+  return Sections[Index];<br>
+}<br>
+<br>
+template <class ELFT><br>
 SymbolBody *elf2::ObjectFile<ELFT>::createSymbolBody(StringRef StringTable,<br>
                                                      const Elf_Sym *Sym) {<br>
   ErrorOr<StringRef> NameOrErr = Sym->getName(StringTable);<br>
   error(NameOrErr.getError());<br>
   StringRef Name = *NameOrErr;<br>
<br>
-  uint32_t SecIndex = Sym->st_shndx;<br>
-  switch (SecIndex) {<br>
+  switch (Sym->st_shndx) {<br>
   case SHN_ABS:<br>
     return new (this->Alloc) DefinedAbsolute<ELFT>(Name, *Sym);<br>
   case SHN_UNDEF:<br>
     return new (this->Alloc) Undefined<ELFT>(Name, *Sym);<br>
   case SHN_COMMON:<br>
     return new (this->Alloc) DefinedCommon<ELFT>(Name, *Sym);<br>
-  case SHN_XINDEX:<br>
-    SecIndex = this->ELFObj.getExtendedSymbolTableIndex(Sym, this->Symtab,<br>
-                                                        SymtabSHNDX);<br>
-    break;<br>
   }<br>
<br>
-  if (SecIndex >= Sections.size() || !SecIndex || !Sections[SecIndex])<br>
-    error("Invalid section index");<br>
-<br>
   switch (Sym->getBinding()) {<br>
   default:<br>
     error("unexpected binding");<br>
   case STB_GLOBAL:<br>
   case STB_WEAK:<br>
   case STB_GNU_UNIQUE: {<br>
-    InputSection<ELFT> *Sec = Sections[SecIndex];<br>
+    InputSection<ELFT> *Sec = getSection(*Sym);<br>
     if (Sec == &InputSection<ELFT>::Discarded)<br>
       return new (this->Alloc) Undefined<ELFT>(Name, *Sym);<br>
     return new (this->Alloc) DefinedRegular<ELFT>(Name, *Sym, *Sec);<br>
<br>
Modified: lld/trunk/ELF/InputFiles.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250519&r1=250518&r2=250519&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250519&r1=250518&r2=250519&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/InputFiles.h (original)<br>
+++ lld/trunk/ELF/InputFiles.h Fri Oct 16 10:29:48 2015<br>
@@ -111,6 +111,7 @@ public:<br>
   void parse(llvm::DenseSet<StringRef> &Comdats);<br>
<br>
   ArrayRef<InputSection<ELFT> *> getSections() const { return Sections; }<br>
+  InputSection<ELFT> *getSection(const Elf_Sym &Sym) const;<br>
<br>
   SymbolBody *getSymbolBody(uint32_t SymbolIndex) const {<br>
     uint32_t FirstNonLocal = this->Symtab->sh_info;<br>
<br>
Modified: lld/trunk/ELF/OutputSections.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=250519&r1=250518&r2=250519&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=250519&r1=250518&r2=250519&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/OutputSections.cpp (original)<br>
+++ lld/trunk/ELF/OutputSections.cpp Fri Oct 16 10:29:48 2015<br>
@@ -434,17 +434,11 @@ lld::elf2::getLocalRelTarget(const Objec<br>
   if (!Sym)<br>
     return 0;<br>
<br>
-  uint32_t SecIndex = Sym->st_shndx;<br>
-  if (SecIndex == SHN_XINDEX)<br>
-    SecIndex = File.getObj().getExtendedSymbolTableIndex(<br>
-        Sym, File.getSymbolTable(), File.getSymbolTableShndx());<br>
-  ArrayRef<InputSection<ELFT> *> Sections = File.getSections();<br>
-  InputSection<ELFT> *Section = Sections[SecIndex];<br>
-<br>
   // According to the ELF spec reference to a local symbol from outside<br>
   // the group are not allowed. Unfortunately .eh_frame breaks that rule<br>
   // and must be treated specially. For now we just replace the symbol with<br>
   // 0.<br>
+  InputSection<ELFT> *Section = File.getSection(*Sym);<br>
   if (Section == &InputSection<ELFT>::Discarded)<br>
     return 0;<br>
<br>
@@ -535,16 +529,8 @@ bool lld::elf2::shouldKeepInSymtab(const<br>
     return false;<br>
<br>
   // If sym references a section in a discarded group, don't keep it.<br>
-  uint32_t SecIndex = Sym.st_shndx;<br>
-  if (SecIndex != SHN_ABS) {<br>
-    if (SecIndex == SHN_XINDEX)<br>
-      SecIndex = File.getObj().getExtendedSymbolTableIndex(<br>
-          &Sym, File.getSymbolTable(), File.getSymbolTableShndx());<br>
-    ArrayRef<InputSection<ELFT> *> Sections = File.getSections();<br>
-    const InputSection<ELFT> *Section = Sections[SecIndex];<br>
-    if (Section == &InputSection<ELFT>::Discarded)<br>
-      return false;<br>
-  }<br>
+  if (File.getSection(Sym) == &InputSection<ELFT>::Discarded)<br>
+    return false;<br>
<br>
   if (Config->DiscardNone)<br>
     return true;<br>
@@ -611,16 +597,11 @@ void SymbolTableSection<ELFT>::writeLoca<br>
       ESym->st_name = StrTabSec.getFileOff(SymName);<br>
       ESym->st_size = Sym.st_size;<br>
       ESym->setBindingAndType(Sym.getBinding(), Sym.getType());<br>
-      uint32_t SecIndex = Sym.st_shndx;<br>
       uintX_t VA = Sym.st_value;<br>
-      if (SecIndex == SHN_ABS) {<br>
+      if (Sym.st_shndx == SHN_ABS) {<br>
         ESym->st_shndx = SHN_ABS;<br>
       } else {<br>
-        if (SecIndex == SHN_XINDEX)<br>
-          SecIndex = File->getObj().getExtendedSymbolTableIndex(<br>
-              &Sym, File->getSymbolTable(), File->getSymbolTableShndx());<br>
-        ArrayRef<InputSection<ELFT> *> Sections = File->getSections();<br>
-        const InputSection<ELFT> *Sec = Sections[SecIndex];<br>
+        const InputSection<ELFT> *Sec = File->getSection(Sym);<br>
         ESym->st_shndx = Sec->OutSec->SectionIndex;<br>
         VA += Sec->OutSec->getVA() + Sec->OutSecOff;<br>
       }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>