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
1761dfca9e892597db79889addb7a3abf54cd50588Logan Chien#ifndef ELF_SECTION_HEADER_TABLE_H
1861dfca9e892597db79889addb7a3abf54cd50588Logan Chien#define ELF_SECTION_HEADER_TABLE_H
1961dfca9e892597db79889addb7a3abf54cd50588Logan Chien
2058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien#include "ELFTypes.h"
2158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien
221f100419d794fa433336190aa47bb0862f93f978TDYa#include <llvm/ADT/OwningPtr.h>
2332f7d036daa15302abd64e94fcb2dc718b375020TDYa#include <llvm/ADT/StringMap.h>
24921465005aca46a100d137c9608a0aedd846e290Logan Chien
2561dfca9e892597db79889addb7a3abf54cd50588Logan Chien#include <vector>
26541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa#include <string>
2761dfca9e892597db79889addb7a3abf54cd50588Logan Chien
28a9ab5889e842a49ff16d06594efe96b0210fe1f7Logan Chientemplate <unsigned Bitwidth>
298ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chienclass ELFSectionHeaderTable {
3058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chienpublic:
3158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
3258611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien
3361dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate:
3458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  std::vector<ELFSectionHeaderTy *> table;
3532f7d036daa15302abd64e94fcb2dc718b375020TDYa  llvm::StringMap<ELFSectionHeaderTy *> name_map;
3661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
3761dfca9e892597db79889addb7a3abf54cd50588Logan Chienprivate:
3861dfca9e892597db79889addb7a3abf54cd50588Logan Chien  ELFSectionHeaderTable() {
3961dfca9e892597db79889addb7a3abf54cd50588Logan Chien  }
4061dfca9e892597db79889addb7a3abf54cd50588Logan Chien
4161dfca9e892597db79889addb7a3abf54cd50588Logan Chienpublic:
42bafb650811e8bcf6fbc014face6e127502869e68Logan Chien  ~ELFSectionHeaderTable();
43bafb650811e8bcf6fbc014face6e127502869e68Logan Chien
4461dfca9e892597db79889addb7a3abf54cd50588Logan Chien  template <typename Archiver>
4558611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  static ELFSectionHeaderTableTy *read(Archiver &AR, ELFObjectTy *owner);
4661dfca9e892597db79889addb7a3abf54cd50588Logan Chien
4758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELFSectionHeaderTy const *operator[](size_t i) const {
488ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien    return table[i];
498ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien  }
508ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien
5158611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  ELFSectionHeaderTy *operator[](size_t i) {
528ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien    return table[i];
538ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien  }
54af521b05a143c96604dbb7488e155c5248e34462Logan Chien
5532f7d036daa15302abd64e94fcb2dc718b375020TDYa  void buildNameMap();
5632f7d036daa15302abd64e94fcb2dc718b375020TDYa
5732f7d036daa15302abd64e94fcb2dc718b375020TDYa  ELFSectionHeaderTy const *getByName(const std::string &name) const;
5832f7d036daa15302abd64e94fcb2dc718b375020TDYa  ELFSectionHeaderTy *getByName(const std::string &name);
59541763d9f2395cf4170d6f8fad0b58098f35c70cTDYa
608ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien  void print() const;
6161dfca9e892597db79889addb7a3abf54cd50588Logan Chien};
6261dfca9e892597db79889addb7a3abf54cd50588Logan Chien
63bafb650811e8bcf6fbc014face6e127502869e68Logan Chien#include "impl/ELFSectionHeaderTable.hxx"
648ec15a3ebbf0037872574d364881f7c0c8533eacLogan Chien
6561dfca9e892597db79889addb7a3abf54cd50588Logan Chien#endif // ELF_SECTION_HEADER_TABLE_H
66