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