ELFSectionSymTab.hxx revision 80085915e5918ad921b30e3fd4efe2154ee4ae49
180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#ifndef ELF_SECTION_SYM_TAB_HXX 280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#define ELF_SECTION_SYM_TAB_HXX 380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSectionHeader.h" 580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSymbol.h" 680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 880085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::~ELFSectionSymTab() { 980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 1080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien delete table[i]; 1180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 1280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 1380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 1480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 1580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver> 1680085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> * 1780085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR, 1880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien ELFObject<Bitwidth> *owner, 1980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien ELFSectionHeader<Bitwidth> const *sh) { 2080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 2180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien llvm::OwningPtr<ELFSectionSymTab<Bitwidth> > st( 2280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien new ELFSectionSymTab<Bitwidth>()); 2380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 2480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Assert that entry size will be the same as standard. 2580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien assert(sh->getEntrySize() == TypeTraits<ELFSymbol<Bitwidth> >::size); 2680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 2780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Seek to the start of symbol table 2880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien AR.seek(sh->getOffset(), true); 2980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 3080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Read all symbol table entry 3180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien size_t size = sh->getSize() / sh->getEntrySize(); 3280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < size; ++i) { 3380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien st->table.push_back(ELFSymbol<Bitwidth>::read(AR, owner, i)); 3480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 3580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 3680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien if (!AR) { 3780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien // Unable to read the table. 3880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return 0; 3980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 4080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 4180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien return st.take(); 4280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 4380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 4480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth> 4580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const { 4680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien using namespace llvm; 4780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 4880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << '\n' << fillformat('=', 79) << '\n'; 4980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().changeColor(raw_ostream::WHITE, true); 5080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << "Symbol Table" << '\n'; 5180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out().resetColor(); 5280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 5380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien for (size_t i = 0; i < table.size(); ++i) { 5480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien table[i]->print(); 5580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien } 5680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 5780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien out() << fillformat('=', 79) << '\n'; 5880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien} 5980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien 6080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX 61