[ELF2] Initial support for local symbols.
Symbol table is now populated correctly, but some fields are missing,
they'll be added in the future. This patch also adds --discard-all
flag, which was the default behavior until now.
Differential Revision: http://reviews.llvm.org/D12874
llvm-svn: 247849
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index fc13501..5d9e92d 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -55,21 +55,36 @@
}
template <class ELFT>
-typename ELFData<ELFT>::Elf_Sym_Range ELFData<ELFT>::getNonLocalSymbols() {
+typename ELFData<ELFT>::Elf_Sym_Range
+ELFData<ELFT>::getSymbolsHelper(bool Local) {
if (!Symtab)
return Elf_Sym_Range(nullptr, nullptr);
-
- ErrorOr<StringRef> StringTableOrErr =
- ELFObj->getStringTableForSymtab(*Symtab);
- error(StringTableOrErr.getError());
- StringTable = *StringTableOrErr;
-
Elf_Sym_Range Syms = ELFObj->symbols(Symtab);
uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
uint32_t FirstNonLocal = Symtab->sh_info;
if (FirstNonLocal > NumSymbols)
error("Invalid sh_info in symbol table");
- return llvm::make_range(Syms.begin() + FirstNonLocal, Syms.end());
+ if (!Local)
+ return llvm::make_range(Syms.begin() + FirstNonLocal, Syms.end());
+ else
+ // Skip over dummy symbol.
+ return llvm::make_range(Syms.begin() + 1, Syms.begin() + FirstNonLocal);
+}
+
+template <class ELFT>
+typename ELFData<ELFT>::Elf_Sym_Range ELFData<ELFT>::getNonLocalSymbols() {
+ if (!Symtab)
+ return Elf_Sym_Range(nullptr, nullptr);
+ ErrorOr<StringRef> StringTableOrErr =
+ ELFObj->getStringTableForSymtab(*Symtab);
+ error(StringTableOrErr.getError());
+ StringTable = *StringTableOrErr;
+ return getSymbolsHelper(false);
+}
+
+template <class ELFT>
+typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() {
+ return this->getSymbolsHelper(true);
}
template <class ELFT> void elf2::ObjectFile<ELFT>::parse() {
@@ -217,6 +232,7 @@
namespace lld {
namespace elf2 {
+
template class elf2::ObjectFile<llvm::object::ELF32LE>;
template class elf2::ObjectFile<llvm::object::ELF32BE>;
template class elf2::ObjectFile<llvm::object::ELF64LE>;