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