ELFSectionSymTab.hxx revision 388f443ba0c474ffcc2e06f8d2a668c4488c3c1b
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>
43e586f183e46f921301281352a87f67dbdc1a43b6Logan Chiensize_t ELFSectionSymTab<Bitwidth>::getExternFuncCount() const {
44e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  size_t result = 0;
45e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
46e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    if (table[i] && table[i]->isExternFunc()) {
47e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien      result++;
48e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien    }
49e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  }
50e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  return result;
51e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien}
52e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien
53e586f183e46f921301281352a87f67dbdc1a43b6Logan Chientemplate <unsigned Bitwidth>
54388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chienvoid ELFSectionSymTab<Bitwidth>::getFuncNameList(size_t size,
55388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien                                                 char const **list) const {
56388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  for (size_t i = 0, j = 0; i < table.size() && j < size; ++i) {
57388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    if (table[i] && table[i]->isConcreteFunc()) {
58388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien      list[j++] = table[i]->getName();
59388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien    }
60388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  }
61388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien}
62388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien
63388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chientemplate <unsigned Bitwidth>
6480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <typename Archiver>
6580085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth> *
6680085915e5918ad921b30e3fd4efe2154ee4ae49Logan ChienELFSectionSymTab<Bitwidth>::read(Archiver &AR,
6758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFObjectTy *owner,
6858611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                 ELFSectionHeaderTy const *sh) {
6980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFSectionSymTabTy> st(new ELFSectionSymTabTy());
7180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Assert that entry size will be the same as standard.
73c40d8a8b26547ab9c51792d9d9b3aca13fb5cdf9TDYa  rsl_assert(sh->getEntrySize() == TypeTraits<ELFSymbolTy>::size);
7480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Seek to the start of symbol table
7680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  AR.seek(sh->getOffset(), true);
7780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
7880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  // Read all symbol table entry
7980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  size_t size = sh->getSize() / sh->getEntrySize();
8080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < size; ++i) {
8158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien    st->table.push_back(ELFSymbolTy::read(AR, owner, i));
8280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
8380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
8480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  if (!AR) {
8580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    // Unable to read the table.
8680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    return 0;
8780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
8880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
8980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  return st.take();
9080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
9180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chientemplate <unsigned Bitwidth>
9380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chienvoid ELFSectionSymTab<Bitwidth>::print() const {
9480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  using namespace llvm;
9580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
9680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << '\n' << fillformat('=', 79) << '\n';
9780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().changeColor(raw_ostream::WHITE, true);
9880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << "Symbol Table" << '\n';
9980085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out().resetColor();
10080085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
10180085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  for (size_t i = 0; i < table.size(); ++i) {
10280085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien    table[i]->print();
10380085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  }
10480085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
10580085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien  out() << fillformat('=', 79) << '\n';
10680085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien}
10780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien
10880085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#endif // ELF_SECTION_SYM_TAB_HXX
109