1e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao/*
2e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Copyright 2011, The Android Open Source Project
3e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao *
4e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * you may not use this file except in compliance with the License.
6e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * You may obtain a copy of the License at
7e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao *
8e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
9e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao *
10e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Unless required by applicable law or agreed to in writing, software
11e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * See the License for the specific language governing permissions and
14e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * limitations under the License.
15e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao */
16e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao
171e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#ifndef ELF_SECTION_SYMTAB_H
181e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#define ELF_SECTION_SYMTAB_H
191e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
2058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien#include "ELFTypes.h"
2158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien
2232f7d036daa15302abd64e94fcb2dc718b375020TDYa#include <llvm/ADT/StringMap.h>
2332f7d036daa15302abd64e94fcb2dc718b375020TDYa
241e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#include <vector>
253bab0cc4c1115bc4430aa97453bca914e1174858TDYa#include <string>
261e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
27a9ab5889e842a49ff16d06594efe96b0210fe1f7Logan Chientemplate <unsigned Bitwidth>
284cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chienclass ELFSectionSymTab : public ELFSection<Bitwidth> {
2958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chienpublic:
3058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
3158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien
321e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprivate:
3358611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  std::vector<ELFSymbolTy *> table;
3432f7d036daa15302abd64e94fcb2dc718b375020TDYa  llvm::StringMap<ELFSymbolTy *> name_map;
351e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
361e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYaprivate:
371e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa  ELFSectionSymTab() { }
381e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
391e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYapublic:
404cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  ~ELFSectionSymTab();
411e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
424cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  template <typename Archiver>
434cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  static ELFSectionSymTab *
4458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  read(Archiver &AR, ELFObjectTy *owner, ELFSectionHeaderTy const *sh);
451e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
464cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  virtual void print() const;
471e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
484cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  size_t size() const {
494cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien    return table.size();
504cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  }
514cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien
5258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELFSymbolTy const *operator[](size_t index) const {
534cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien    return table[index];
544cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  }
553bab0cc4c1115bc4430aa97453bca914e1174858TDYa
5658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELFSymbolTy *operator[](size_t index) {
574cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien    return table[index];
584cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  }
594cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien
6032f7d036daa15302abd64e94fcb2dc718b375020TDYa  void buildNameMap();
6132f7d036daa15302abd64e94fcb2dc718b375020TDYa
6232f7d036daa15302abd64e94fcb2dc718b375020TDYa  ELFSymbolTy const *getByName(std::string const &name) const;
634cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien
6458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELFSymbolTy *getByName(std::string const &name) {
6558611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien    return const_cast<ELFSymbolTy *>(
6658611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien           const_cast<ELFSectionSymTabTy const *>(this)->getByName(name));
674cf36b0a42865bb8e1e95b910d3452bea23a8318Logan Chien  }
681e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
69388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  size_t getFuncCount() const;
70388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien
71388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien  void getFuncNameList(size_t size, char const **list) const;
72388f443ba0c474ffcc2e06f8d2a668c4488c3c1bLogan Chien
73e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien  size_t getExternFuncCount() const;
74e586f183e46f921301281352a87f67dbdc1a43b6Logan Chien
751e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa};
761e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
7780085915e5918ad921b30e3fd4efe2154ee4ae49Logan Chien#include "impl/ELFSectionSymTab.hxx"
781e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa
791e278e29f1ce0a00a4626cb3c839ad37e46abcdfTDYa#endif // ELF_SECTION_SYMTAB_H
80