ELFSectionSymTab.hxx revision ee6cdb95525abc8c7766798148302306a100b774
1ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao/*
2ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Copyright 2011, The Android Open Source Project
3ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
4ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * you may not use this file except in compliance with the License.
6ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * You may obtain a copy of the License at
7ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
8ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
9ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
10ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Unless required by applicable law or agreed to in writing, software
11ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * See the License for the specific language governing permissions and
14ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * limitations under the License.
15ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao */
16ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao
1780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#ifndef ELF_SECTION_SYM_TAB_HXX
1880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#define ELF_SECTION_SYM_TAB_HXX
1980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSectionHeader.h"
2180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "ELFSymbol.h"
22c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa#include "utils/rsl_assert.h"
2380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
2480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
2580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::~ELFSectionSymTab() {
2680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
2780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    delete table[i];
2880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
2980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
3080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
3180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
32e586f183e46f921301281352a87f67dbdc1a43b6Logan Chiensize_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const {
33e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  size_t result = 0;
34e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
35e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    if (table[i] && table[i]->isExternFunc()) {
36e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien      result++;
37e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    }
38e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  }
39e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  return result;
40e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien}
41e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien
42e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth>
4380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver>
4480085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> *
4580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR,
4658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFObjectTy *owner,
4758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFSectionHeaderTy const *sh) {
4880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
4958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy());
5080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Assert that entry size will be the same as standard.
52c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa  rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size);
5380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Seek to the start of symbol table
5580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  AR.seek(sh->getOffset(), true);
5680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
5780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Read all symbol table entry
5880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  size_t size = sh->getSize() / sh->getEntrySize();
5980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < size; ++i) {
6058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien    st->table.push_back(ELFSymbolTy::read(AR, owner, i));
6180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
6280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
6380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  if (!AR) {
6480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    // Unable to read the table.
6580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    return 0;
6680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
6780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
6880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  return st.take();
6980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
7080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
7280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const {
7380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  using namespace llvm;
7480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << '\n' << fillformat('=', 79) << '\n';
7680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().changeColor(raw_ostream::WHITE, true);
7780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << "Symbol Table" << '\n';
7880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().resetColor();
7980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
8080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
8180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    table[i]->print();
8280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
8380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
8480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << fillformat('=', 79) << '\n';
8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX
88