ELFReloc.hxx revision 58611fc8193e7386698178f167a2e0cbdd6a4f6f
1355c46527467526e566944fa393896009bdd0136Logan Chien#ifndef ELF_RELOC_HXX
2355c46527467526e566944fa393896009bdd0136Logan Chien#define ELF_RELOC_HXX
3355c46527467526e566944fa393896009bdd0136Logan Chien
4355c46527467526e566944fa393896009bdd0136Logan Chien#include "utils/raw_ostream.h"
5355c46527467526e566944fa393896009bdd0136Logan Chien
6355c46527467526e566944fa393896009bdd0136Logan Chien#include <llvm/Support/Format.h>
7355c46527467526e566944fa393896009bdd0136Logan Chien#include <llvm/Support/raw_ostream.h>
8355c46527467526e566944fa393896009bdd0136Logan Chien
9355c46527467526e566944fa393896009bdd0136Logan Chientemplate <unsigned Bitwidth>
10355c46527467526e566944fa393896009bdd0136Logan Chientemplate <typename Archiver>
11355c46527467526e566944fa393896009bdd0136Logan Chieninline ELFReloc<Bitwidth> *
12355c46527467526e566944fa393896009bdd0136Logan ChienELFReloc_CRTP<Bitwidth>::readRela(Archiver &AR, size_t index) {
13355c46527467526e566944fa393896009bdd0136Logan Chien  if (!AR) {
14355c46527467526e566944fa393896009bdd0136Logan Chien    // Archiver is in bad state before calling read function.
15355c46527467526e566944fa393896009bdd0136Logan Chien    // Return NULL and do nothing.
16355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
17355c46527467526e566944fa393896009bdd0136Logan Chien  }
18355c46527467526e566944fa393896009bdd0136Logan Chien
1958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFRelocTy> sh(new ELFRelocTy());
20355c46527467526e566944fa393896009bdd0136Logan Chien
21355c46527467526e566944fa393896009bdd0136Logan Chien  if (!sh->serializeRela(AR)) {
22355c46527467526e566944fa393896009bdd0136Logan Chien    // Unable to read the structure.  Return NULL.
23355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
24355c46527467526e566944fa393896009bdd0136Logan Chien  }
25355c46527467526e566944fa393896009bdd0136Logan Chien
26355c46527467526e566944fa393896009bdd0136Logan Chien  if (!sh->isValid()) {
27355c46527467526e566944fa393896009bdd0136Logan Chien    // Rel read from archiver is not valid.  Return NULL.
28355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
29355c46527467526e566944fa393896009bdd0136Logan Chien  }
30355c46527467526e566944fa393896009bdd0136Logan Chien
31355c46527467526e566944fa393896009bdd0136Logan Chien  // Set the section header index
32355c46527467526e566944fa393896009bdd0136Logan Chien  sh->index = index;
33355c46527467526e566944fa393896009bdd0136Logan Chien
34355c46527467526e566944fa393896009bdd0136Logan Chien  return sh.take();
35355c46527467526e566944fa393896009bdd0136Logan Chien}
36355c46527467526e566944fa393896009bdd0136Logan Chien
37355c46527467526e566944fa393896009bdd0136Logan Chientemplate <unsigned Bitwidth>
38355c46527467526e566944fa393896009bdd0136Logan Chientemplate <typename Archiver>
39355c46527467526e566944fa393896009bdd0136Logan Chieninline ELFReloc<Bitwidth> *
40355c46527467526e566944fa393896009bdd0136Logan ChienELFReloc_CRTP<Bitwidth>::readRel(Archiver &AR, size_t index) {
41355c46527467526e566944fa393896009bdd0136Logan Chien  if (!AR) {
42355c46527467526e566944fa393896009bdd0136Logan Chien    // Archiver is in bad state before calling read function.
43355c46527467526e566944fa393896009bdd0136Logan Chien    // Return NULL and do nothing.
44355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
45355c46527467526e566944fa393896009bdd0136Logan Chien  }
46355c46527467526e566944fa393896009bdd0136Logan Chien
4758611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien  llvm::OwningPtr<ELFRelocTy> sh(new ELFRelocTy());
48355c46527467526e566944fa393896009bdd0136Logan Chien
49355c46527467526e566944fa393896009bdd0136Logan Chien  sh->r_addend = 0;
50355c46527467526e566944fa393896009bdd0136Logan Chien  if (!sh->serializeRel(AR)) {
51355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
52355c46527467526e566944fa393896009bdd0136Logan Chien  }
53355c46527467526e566944fa393896009bdd0136Logan Chien
54355c46527467526e566944fa393896009bdd0136Logan Chien  if (!sh->isValid()) {
55355c46527467526e566944fa393896009bdd0136Logan Chien    // Rel read from archiver is not valid.  Return NULL.
56355c46527467526e566944fa393896009bdd0136Logan Chien    return 0;
57355c46527467526e566944fa393896009bdd0136Logan Chien  }
58355c46527467526e566944fa393896009bdd0136Logan Chien
59355c46527467526e566944fa393896009bdd0136Logan Chien  // Set the section header index
60355c46527467526e566944fa393896009bdd0136Logan Chien  sh->index = index;
61355c46527467526e566944fa393896009bdd0136Logan Chien
62355c46527467526e566944fa393896009bdd0136Logan Chien  return sh.take();
63355c46527467526e566944fa393896009bdd0136Logan Chien}
64355c46527467526e566944fa393896009bdd0136Logan Chien
65355c46527467526e566944fa393896009bdd0136Logan Chientemplate <unsigned Bitwidth>
66355c46527467526e566944fa393896009bdd0136Logan Chieninline void ELFReloc_CRTP<Bitwidth>::print(bool shouldPrintHeader) const {
67355c46527467526e566944fa393896009bdd0136Logan Chien  using namespace llvm;
68355c46527467526e566944fa393896009bdd0136Logan Chien  if (shouldPrintHeader) {
69355c46527467526e566944fa393896009bdd0136Logan Chien    out() << '\n' << fillformat('=', 79) << '\n';
70355c46527467526e566944fa393896009bdd0136Logan Chien    out().changeColor(raw_ostream::WHITE, true);
71355c46527467526e566944fa393896009bdd0136Logan Chien    out() << "ELF Relaocation Table Entry "
72355c46527467526e566944fa393896009bdd0136Logan Chien          << this->getIndex() << '\n';
73355c46527467526e566944fa393896009bdd0136Logan Chien    out().resetColor();
74355c46527467526e566944fa393896009bdd0136Logan Chien    out() << fillformat('-', 79) << '\n';
75355c46527467526e566944fa393896009bdd0136Logan Chien  } else {
76355c46527467526e566944fa393896009bdd0136Logan Chien    out() << fillformat('-', 79) << '\n';
77355c46527467526e566944fa393896009bdd0136Logan Chien    out().changeColor(raw_ostream::YELLOW, true);
78355c46527467526e566944fa393896009bdd0136Logan Chien    out() << "ELF Relaocation Table Entry "
79355c46527467526e566944fa393896009bdd0136Logan Chien          << this->getIndex() << " : " << '\n';
80355c46527467526e566944fa393896009bdd0136Logan Chien    out().resetColor();
81355c46527467526e566944fa393896009bdd0136Logan Chien  }
82355c46527467526e566944fa393896009bdd0136Logan Chien
83355c46527467526e566944fa393896009bdd0136Logan Chien#define PRINT_LINT(title, value) \
84355c46527467526e566944fa393896009bdd0136Logan Chien  out() << format("  %-13s : ", (char const *)(title)) << (value) << '\n'
85355c46527467526e566944fa393896009bdd0136Logan Chien  PRINT_LINT("Offset",       concrete()->getOffset()       );
86355c46527467526e566944fa393896009bdd0136Logan Chien  PRINT_LINT("SymTab Index", concrete()->getSymTabIndex()  );
87355c46527467526e566944fa393896009bdd0136Logan Chien  PRINT_LINT("Type",         concrete()->getType()         );
88355c46527467526e566944fa393896009bdd0136Logan Chien  PRINT_LINT("Addend",       concrete()->getAddend()       );
89355c46527467526e566944fa393896009bdd0136Logan Chien#undef PRINT_LINT
90355c46527467526e566944fa393896009bdd0136Logan Chien}
91355c46527467526e566944fa393896009bdd0136Logan Chien
92355c46527467526e566944fa393896009bdd0136Logan Chien#endif // ELF_RELOC_HXX
93