diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 8b28567f72ce..ae0e7376245e 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -227,6 +227,8 @@ class ELFFile { ArchivePointerTypeTraits > Current; }; + typedef iterator_range Elf_Sym_Range; + private: typedef SmallVector Sections_t; typedef DenseMap IndexMap_t; @@ -340,6 +342,9 @@ class ELFFile { Elf_Sym_Iter begin_symbols() const; Elf_Sym_Iter end_symbols() const; + Elf_Sym_Range symbols() const { + return make_range(begin_symbols(), end_symbols()); + } Elf_Dyn_Iter begin_dynamic_table() const; /// \param NULLEnd use one past the first DT_NULL entry as the end instead of @@ -424,6 +429,7 @@ class ELFFile { const Elf_Sym *getSymbol(uint32_t index) const; ErrorOr getSymbolName(Elf_Sym_Iter Sym) const; + ErrorOr getStaticSymbolName(const Elf_Sym *Symb) const; /// \brief Get the name of \p Symb. /// \param SymTab The symbol table section \p Symb is contained in. @@ -961,6 +967,12 @@ ErrorOr ELFFile::getSymbolName(Elf_Sym_Iter Sym) const { return StringRef(getDynamicString(Sym->st_name)); } +template +ErrorOr +ELFFile::getStaticSymbolName(const Elf_Sym *Symb) const { + return getSymbolName(dot_symtab_sec, Symb); +} + template ErrorOr ELFFile::getSymbolName(const Elf_Shdr *Section, const Elf_Sym *Symb) const { diff --git a/include/llvm/Object/ELFTypes.h b/include/llvm/Object/ELFTypes.h index 70f6d8b930b0..ea54cac36d10 100644 --- a/include/llvm/Object/ELFTypes.h +++ b/include/llvm/Object/ELFTypes.h @@ -197,6 +197,9 @@ struct Elf_Sym_Impl : Elf_Sym_Base { return st_shndx >= ELF::SHN_LORESERVE; } bool isUndefined() const { return st_shndx == ELF::SHN_UNDEF; } + bool isExternal() const { + return getBinding() != ELF::STB_LOCAL; + } }; /// Elf_Versym: This is the structure of entries in the SHT_GNU_versym section