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