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
17efae30af6a2d9deedf961942e4834163f686871cLogan Chien#ifndef ELF_SECTION_HEADER_HXX
18efae30af6a2d9deedf961942e4834163f686871cLogan Chien#define ELF_SECTION_HEADER_HXX
19efae30af6a2d9deedf961942e4834163f686871cLogan Chien
20efae30af6a2d9deedf961942e4834163f686871cLogan Chien#include "utils/raw_ostream.h"
21efae30af6a2d9deedf961942e4834163f686871cLogan Chien#include <llvm/Support/Format.h>
22efae30af6a2d9deedf961942e4834163f686871cLogan Chien#include <llvm/Support/raw_ostream.h>
23efae30af6a2d9deedf961942e4834163f686871cLogan Chien
24efae30af6a2d9deedf961942e4834163f686871cLogan Chien#include "ELFObject.h"
25efae30af6a2d9deedf961942e4834163f686871cLogan Chien
26efae30af6a2d9deedf961942e4834163f686871cLogan Chientemplate <unsigned Bitwidth>
27efae30af6a2d9deedf961942e4834163f686871cLogan Chienchar const *ELFSectionHeader_CRTP<Bitwidth>::getName() const {
28efae30af6a2d9deedf961942e4834163f686871cLogan Chien  return owner->getSectionName(getNameIndex());
29efae30af6a2d9deedf961942e4834163f686871cLogan Chien}
30efae30af6a2d9deedf961942e4834163f686871cLogan Chien
31efae30af6a2d9deedf961942e4834163f686871cLogan Chientemplate <unsigned Bitwidth>
32efae30af6a2d9deedf961942e4834163f686871cLogan Chientemplate <typename Archiver>
3358611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chientypename ELFSectionHeader_CRTP<Bitwidth>::ELFSectionHeaderTy *
34efae30af6a2d9deedf961942e4834163f686871cLogan ChienELFSectionHeader_CRTP<Bitwidth>::read(Archiver &AR,
3558611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien                                      ELFObjectTy const *owner,
36efae30af6a2d9deedf961942e4834163f686871cLogan Chien                                      size_t index) {
37efae30af6a2d9deedf961942e4834163f686871cLogan Chien
38efae30af6a2d9deedf961942e4834163f686871cLogan Chien  if (!AR) {
39efae30af6a2d9deedf961942e4834163f686871cLogan Chien    // Archiver is in bad state before calling read function.
40efae30af6a2d9deedf961942e4834163f686871cLogan Chien    // Return NULL and do nothing.
41efae30af6a2d9deedf961942e4834163f686871cLogan Chien    return 0;
42efae30af6a2d9deedf961942e4834163f686871cLogan Chien  }
43efae30af6a2d9deedf961942e4834163f686871cLogan Chien
4458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFSectionHeaderTy> sh(new ELFSectionHeaderTy());
45efae30af6a2d9deedf961942e4834163f686871cLogan Chien
46efae30af6a2d9deedf961942e4834163f686871cLogan Chien  if (!sh->serialize(AR)) {
47efae30af6a2d9deedf961942e4834163f686871cLogan Chien    // Unable to read the structure.  Return NULL.
48efae30af6a2d9deedf961942e4834163f686871cLogan Chien    return 0;
49efae30af6a2d9deedf961942e4834163f686871cLogan Chien  }
50efae30af6a2d9deedf961942e4834163f686871cLogan Chien
51efae30af6a2d9deedf961942e4834163f686871cLogan Chien  if (!sh->isValid()) {
52efae30af6a2d9deedf961942e4834163f686871cLogan Chien    // Header read from archiver is not valid.  Return NULL.
53efae30af6a2d9deedf961942e4834163f686871cLogan Chien    return 0;
54efae30af6a2d9deedf961942e4834163f686871cLogan Chien  }
55efae30af6a2d9deedf961942e4834163f686871cLogan Chien
56efae30af6a2d9deedf961942e4834163f686871cLogan Chien  // Set the section header index
57efae30af6a2d9deedf961942e4834163f686871cLogan Chien  sh->index = index;
58efae30af6a2d9deedf961942e4834163f686871cLogan Chien
59efae30af6a2d9deedf961942e4834163f686871cLogan Chien  // Set the owner elf object
60efae30af6a2d9deedf961942e4834163f686871cLogan Chien  sh->owner = owner;
61efae30af6a2d9deedf961942e4834163f686871cLogan Chien
62efae30af6a2d9deedf961942e4834163f686871cLogan Chien  return sh.take();
63efae30af6a2d9deedf961942e4834163f686871cLogan Chien}
64efae30af6a2d9deedf961942e4834163f686871cLogan Chien
65efae30af6a2d9deedf961942e4834163f686871cLogan Chientemplate <unsigned Bitwidth>
66efae30af6a2d9deedf961942e4834163f686871cLogan Chienvoid ELFSectionHeader_CRTP<Bitwidth>::print(bool shouldPrintHeader) const {
67efae30af6a2d9deedf961942e4834163f686871cLogan Chien  using namespace llvm;
68efae30af6a2d9deedf961942e4834163f686871cLogan Chien
69efae30af6a2d9deedf961942e4834163f686871cLogan Chien  if (shouldPrintHeader) {
70efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << '\n' << fillformat('=', 79) << '\n';
71efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out().changeColor(raw_ostream::WHITE, true);
72efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << "ELF Section Header "
73efae30af6a2d9deedf961942e4834163f686871cLogan Chien      << this->getIndex() << '\n';
74efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out().resetColor();
75efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << fillformat('-', 79) << '\n';
76efae30af6a2d9deedf961942e4834163f686871cLogan Chien  } else {
77efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << fillformat('-', 79) << '\n';
78efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out().changeColor(raw_ostream::YELLOW, true);
79efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << "ELF Section Header "
80efae30af6a2d9deedf961942e4834163f686871cLogan Chien      << this->getIndex() << " : " << '\n';
81efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out().resetColor();
82efae30af6a2d9deedf961942e4834163f686871cLogan Chien  }
83efae30af6a2d9deedf961942e4834163f686871cLogan Chien
84efae30af6a2d9deedf961942e4834163f686871cLogan Chien#define PRINT_LINT(title, value) \
85efae30af6a2d9deedf961942e4834163f686871cLogan Chien  out() << format("  %-13s : ", (char const *)(title)) << (value) << '\n'
86efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Name",          getName() );
87efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Type",          getSectionTypeStr(getType()));
88efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Flags",         concrete()->getFlags());
89efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Address",       getAddress());
90efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Offset",        getOffset());
91efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Size",          concrete()->getSize());
92efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Link",          getLink());
93efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Extra Info",    getExtraInfo());
94efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Address Align", concrete()->getAddressAlign());
95efae30af6a2d9deedf961942e4834163f686871cLogan Chien  PRINT_LINT("Entry Size",    concrete()->getEntrySize());
96efae30af6a2d9deedf961942e4834163f686871cLogan Chien#undef PRINT_LINT
97efae30af6a2d9deedf961942e4834163f686871cLogan Chien
98efae30af6a2d9deedf961942e4834163f686871cLogan Chien  if (shouldPrintHeader) {
99efae30af6a2d9deedf961942e4834163f686871cLogan Chien    out() << fillformat('=', 79) << '\n';
100efae30af6a2d9deedf961942e4834163f686871cLogan Chien  }
101efae30af6a2d9deedf961942e4834163f686871cLogan Chien}
102efae30af6a2d9deedf961942e4834163f686871cLogan Chien
103efae30af6a2d9deedf961942e4834163f686871cLogan Chien#endif // ELF_SECTION_HEADER_HXX
104