ELFSectionSymTab.hxx revision 80085915e5918ad921b30e3fd4efe2154ee4ae49
18626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#ifndef ELF_SECTION_SYM_TAB_HXX 28626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#define ELF_SECTION_SYM_TAB_HXX 38626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 48626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include "ELFSectionHeader.h" 58626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include "ELFSymbol.h" 68626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 78626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharmatemplate <unsigned Bitwidth> 88626cce5f381899f47e3a82e2ef4c98f183391b0Ashish SharmaELFSectionSymTab<Bitwidth>::~ELFSectionSymTab() { 98626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma for (size_t i = 0; i < table.size(); ++i) { 108626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma delete table[i]; 118626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma } 128626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma} 138626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 148626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharmatemplate <unsigned Bitwidth> 158626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharmatemplate <typename Archiver> 168626cce5f381899f47e3a82e2ef4c98f183391b0Ashish SharmaELFSectionSymTab<Bitwidth> * 178626cce5f381899f47e3a82e2ef4c98f183391b0Ashish SharmaELFSectionSymTab<Bitwidth>::read(Archiver &AR, 188626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma ELFObject<Bitwidth> *owner, 198626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma ELFSectionHeader<Bitwidth> const *sh) { 208626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 218626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma llvm::OwningPtr<ELFSectionSymTab<Bitwidth> > st( 226dce8322d66361e40d1feb5a6c3de15244de5949Ashish Sharma new ELFSectionSymTab<Bitwidth>()); 238626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 248626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma // Assert that entry size will be the same as standard. 258626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma assert(sh->getEntrySize() == TypeTraits<ELFSymbol<Bitwidth> >::size); 268626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 278626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma // Seek to the start of symbol table 288626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma AR.seek(sh->getOffset(), true); 298626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 308626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma // Read all symbol table entry 318626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma size_t size = sh->getSize() / sh->getEntrySize(); 328626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma for (size_t i = 0; i < size; ++i) { 338626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma st->table.push_back(ELFSymbol<Bitwidth>::read(AR, owner, i)); 348626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma } 358626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma 368626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma if (!AR) { 378626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma // Unable to read the table. 38 return 0; 39 } 40 41 return st.take(); 42} 43 44template <unsigned Bitwidth> 45void ELFSectionSymTab<Bitwidth>::print() const { 46 using namespace llvm; 47 48 out() << '\n' << fillformat('=', 79) << '\n'; 49 out().changeColor(raw_ostream::WHITE, true); 50 out() << "Symbol Table" << '\n'; 51 out().resetColor(); 52 53 for (size_t i = 0; i < table.size(); ++i) { 54 table[i]->print(); 55 } 56 57 out() << fillformat('=', 79) << '\n'; 58} 59 60#endif // ELF_SECTION_SYM_TAB_HXX 61