diff options
author | Shankar Easwaran <shankare@codeaurora.org> | 2012-11-13 18:26:22 +0000 |
---|---|---|
committer | Shankar Easwaran <shankare@codeaurora.org> | 2012-11-13 18:26:22 +0000 |
commit | f7414823871c7707a6af61c19e5f9ce3a4fa861c (patch) | |
tree | ad05e125591e0cb49d0de984a19ca0ae1b95caab | |
parent | 2344abc939b29ab80bbd247995a0ceb2efa5938b (diff) | |
download | external_llvm-f7414823871c7707a6af61c19e5f9ce3a4fa861c.zip external_llvm-f7414823871c7707a6af61c19e5f9ce3a4fa861c.tar.gz external_llvm-f7414823871c7707a6af61c19e5f9ce3a4fa861c.tar.bz2 |
Adding convenience function to ELF Header
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167852 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Object/ELF.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 466de93..a2723c7 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -609,6 +609,7 @@ public: const Elf_Dyn *getDyn(DataRefImpl DynData) const; error_code getSymbolVersion(SymbolRef Symb, StringRef &Version, bool &IsDefault) const; + uint64_t getSymbolIndex(const Elf_Sym *sym) const; protected: virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; @@ -2094,6 +2095,21 @@ ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object } } +// Get the symbol table index in the symtab section given a symbol +template<support::endianness target_endianness, bool is64Bits> +uint64_t ELFObjectFile<target_endianness, is64Bits> + ::getSymbolIndex(const Elf_Sym *Sym) const { + assert(SymbolTableSections.size() == 1 && "Only one symbol table supported!"); + const Elf_Shdr *SymTab = *SymbolTableSections.begin(); + uintptr_t SymLoc = uintptr_t(Sym); + uintptr_t SymTabLoc = uintptr_t(base() + SymTab->sh_offset); + assert(SymLoc > SymTabLoc && "Symbol not in symbol table!"); + uint64_t SymOffset = SymLoc - SymTabLoc; + assert(SymOffset % SymTab->sh_entsize == 0 && + "Symbol not multiple of symbol size!"); + return SymOffset / SymTab->sh_entsize; +} + template<support::endianness target_endianness, bool is64Bits> symbol_iterator ELFObjectFile<target_endianness, is64Bits> ::begin_symbols() const { |