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