[ELF] Add some accessors for lld.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 25 Jun 2015 23:40:41 +0000 (23:40 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Thu, 25 Jun 2015 23:40:41 +0000 (23:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240730 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h
include/llvm/Object/ELFTypes.h

index 8b28567f72ce4102a0aa21a11a6b895ce8a6b792..ae0e7376245e078bae96fc429a6523e3f9b2973c 100644 (file)
@@ -227,6 +227,8 @@ public:
                    ArchivePointerTypeTraits<const char> > Current;
   };
 
+  typedef iterator_range<Elf_Sym_Iter> Elf_Sym_Range;
+
 private:
   typedef SmallVector<const Elf_Shdr *, 2> Sections_t;
   typedef DenseMap<unsigned, unsigned> IndexMap_t;
@@ -340,6 +342,9 @@ public:
 
   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 @@ public:
   const Elf_Sym *getSymbol(uint32_t index) const;
 
   ErrorOr<StringRef> getSymbolName(Elf_Sym_Iter Sym) const;
+  ErrorOr<StringRef> 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<StringRef> ELFFile<ELFT>::getSymbolName(Elf_Sym_Iter Sym) const {
   return StringRef(getDynamicString(Sym->st_name));
 }
 
+template <class ELFT>
+ErrorOr<StringRef>
+ELFFile<ELFT>::getStaticSymbolName(const Elf_Sym *Symb) const {
+  return getSymbolName(dot_symtab_sec, Symb);
+}
+
 template <class ELFT>
 ErrorOr<StringRef> ELFFile<ELFT>::getSymbolName(const Elf_Shdr *Section,
                                                 const Elf_Sym *Symb) const {
index 70f6d8b930b089461326e0ee48469b066fb9806e..ea54cac36d101ddbbe11901df6039382a517010d 100644 (file)
@@ -197,6 +197,9 @@ struct Elf_Sym_Impl : Elf_Sym_Base<ELFT> {
     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