ELFSectionSymTab.hxx revision 32f7d036daa15302abd64e94fcb2dc718b375020
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>
32388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chiensize_t ELFSectionSymTab<Bitwidth>::getFuncCount() const {
33388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  size_t result = 0;
34388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  for (size_t i = 0; i < table.size(); ++i) {
35388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    if (table[i] && table[i]->isConcreteFunc()) {
36388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien      result++;
37388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    }
38388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  }
39388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  return result;
40388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien}
41388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien
42388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth>
4332f7d036daa15302abd64e94fcb2dc718b375020TDYavoid ELFSectionSymTab<Bitwidth>::buildNameMap() {
4432f7d036daa15302abd64e94fcb2dc718b375020TDYa  for (size_t i = 0; i < table.size(); ++i) {
4532f7d036daa15302abd64e94fcb2dc718b375020TDYa    ELFSymbolTy *symbol = table[i];
4632f7d036daa15302abd64e94fcb2dc718b375020TDYa    if ( symbol ) {
4732f7d036daa15302abd64e94fcb2dc718b375020TDYa      name_map[symbol->getName()] = symbol;
4832f7d036daa15302abd64e94fcb2dc718b375020TDYa    }
4932f7d036daa15302abd64e94fcb2dc718b375020TDYa  }
5032f7d036daa15302abd64e94fcb2dc718b375020TDYa}
5132f7d036daa15302abd64e94fcb2dc718b375020TDYa
5232f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth>
5332f7d036daa15302abd64e94fcb2dc718b375020TDYaELFSymbol<Bitwidth> const *
5432f7d036daa15302abd64e94fcb2dc718b375020TDYaELFSectionSymTab<Bitwidth>::getByName(std::string const &name) const {
5532f7d036daa15302abd64e94fcb2dc718b375020TDYa  typename llvm::StringMap<ELFSymbolTy *>::const_iterator symbol =
5632f7d036daa15302abd64e94fcb2dc718b375020TDYa    name_map.find(name);
5732f7d036daa15302abd64e94fcb2dc718b375020TDYa  if (symbol == name_map.end()) {
5832f7d036daa15302abd64e94fcb2dc718b375020TDYa    return NULL;
5932f7d036daa15302abd64e94fcb2dc718b375020TDYa  }
6032f7d036daa15302abd64e94fcb2dc718b375020TDYa  return symbol->getValue();
6132f7d036daa15302abd64e94fcb2dc718b375020TDYa}
6232f7d036daa15302abd64e94fcb2dc718b375020TDYa
6332f7d036daa15302abd64e94fcb2dc718b375020TDYatemplate <unsigned Bitwidth>
64e586f183e46f921301281352a87f67dbdc1a43b6Logan Chiensize_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const {
65e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  size_t result = 0;
66e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
67e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    if (table[i] && table[i]->isExternFunc()) {
68e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien      result++;
69e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    }
70e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  }
71e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  return result;
72e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien}
73e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien
74e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth>
75388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chienvoid ELFSectionSymTab<Bitwidth>::getFuncNameList(size_t size,
76388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien                                                 char const **list) const {
77388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  for (size_t i = 0, j = 0; i < table.size() && j < size; ++i) {
78388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    if (table[i] && table[i]->isConcreteFunc()) {
79388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien      list[j++] = table[i]->getName();
80388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    }
81388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  }
82388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien}
83388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien
84388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth>
8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver>
8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> *
8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR,
8858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFObjectTy *owner,
8958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFSectionHeaderTy const *sh) {
9080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy());
9280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Assert that entry size will be the same as standard.
94c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa  rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size);
9580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Seek to the start of symbol table
9780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  AR.seek(sh->getOffset(), true);
9880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Read all symbol table entry
10080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  size_t size = sh->getSize() / sh->getEntrySize();
10180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < size; ++i) {
10258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien    st->table.push_back(ELFSymbolTy::read(AR, owner, i));
10380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
10480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
10580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  if (!AR) {
10680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    // Unable to read the table.
10780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    return 0;
10880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
10980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
11080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  return st.take();
11180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
11280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
11380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
11480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const {
11580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  using namespace llvm;
11680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
11780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << '\n' << fillformat('=', 79) << '\n';
11880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().changeColor(raw_ostream::WHITE, true);
11980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << "Symbol Table" << '\n';
12080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().resetColor();
12180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
12280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
12380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    table[i]->print();
12480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
12580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
12680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << fillformat('=', 79) << '\n';
12780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
12880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
12980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX
130