ELFSectionSymTab.hxx revision 58611fc8193e7386698178f167a2e0cbdd6a4f6f
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,
1858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFObjectTy *owner,
1958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFSectionHeaderTy const *sh) {
2080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy());
2280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Assert that entry size will be the same as standard.
2458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size);
2580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Seek to the start of symbol table
2780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  AR.seek(sh->getOffset(), true);
2880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Read all symbol table entry
3080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  size_t size = sh->getSize() / sh->getEntrySize();
3180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < size; ++i) {
3258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien    st->table.push_back(ELFSymbolTy::read(AR, owner, i));
3380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
3480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
3580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  if (!AR) {
3680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    // Unable to read the table.
3780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    return 0;
3880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
3980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
4080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  return st.take();
4180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
4280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
4380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
4480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const {
4580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  using namespace llvm;
4680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
4780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << '\n' << fillformat('=', 79) << '\n';
4880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().changeColor(raw_ostream::WHITE, true);
4980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << "Symbol Table" << '\n';
5080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().resetColor();
5180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
5380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    table[i]->print();
5480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
5580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << fillformat('=', 79) << '\n';
5780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
5880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX
60