<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>