1*9880d681SAndroid Build Coastguard Worker //===--- ARMWinEHPrinter.h - Windows on ARM Unwind Information Printer ----===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_TOOLS_LLVM_READOBJ_ARMWINEHPRINTER_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_TOOLS_LLVM_READOBJ_ARMWINEHPRINTER_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/COFF.h" 14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorOr.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ScopedPrinter.h" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker namespace llvm { 18*9880d681SAndroid Build Coastguard Worker namespace ARM { 19*9880d681SAndroid Build Coastguard Worker namespace WinEH { 20*9880d681SAndroid Build Coastguard Worker class RuntimeFunction; 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker class Decoder { 23*9880d681SAndroid Build Coastguard Worker static const size_t PDataEntrySize; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker ScopedPrinter &SW; 26*9880d681SAndroid Build Coastguard Worker raw_ostream &OS; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker struct RingEntry { 29*9880d681SAndroid Build Coastguard Worker uint8_t Mask; 30*9880d681SAndroid Build Coastguard Worker uint8_t Value; 31*9880d681SAndroid Build Coastguard Worker bool (Decoder::*Routine)(const uint8_t *, unsigned &, unsigned, bool); 32*9880d681SAndroid Build Coastguard Worker }; 33*9880d681SAndroid Build Coastguard Worker static const RingEntry Ring[]; 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker bool opcode_0xxxxxxx(const uint8_t *Opcodes, unsigned &Offset, 36*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 37*9880d681SAndroid Build Coastguard Worker bool opcode_10Lxxxxx(const uint8_t *Opcodes, unsigned &Offset, 38*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 39*9880d681SAndroid Build Coastguard Worker bool opcode_1100xxxx(const uint8_t *Opcodes, unsigned &Offset, 40*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 41*9880d681SAndroid Build Coastguard Worker bool opcode_11010Lxx(const uint8_t *Opcodes, unsigned &Offset, 42*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 43*9880d681SAndroid Build Coastguard Worker bool opcode_11011Lxx(const uint8_t *Opcodes, unsigned &Offset, 44*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 45*9880d681SAndroid Build Coastguard Worker bool opcode_11100xxx(const uint8_t *Opcodes, unsigned &Offset, 46*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 47*9880d681SAndroid Build Coastguard Worker bool opcode_111010xx(const uint8_t *Opcodes, unsigned &Offset, 48*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 49*9880d681SAndroid Build Coastguard Worker bool opcode_1110110L(const uint8_t *Opcodes, unsigned &Offset, 50*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 51*9880d681SAndroid Build Coastguard Worker bool opcode_11101110(const uint8_t *Opcodes, unsigned &Offset, 52*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 53*9880d681SAndroid Build Coastguard Worker bool opcode_11101111(const uint8_t *Opcodes, unsigned &Offset, 54*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 55*9880d681SAndroid Build Coastguard Worker bool opcode_11110101(const uint8_t *Opcodes, unsigned &Offset, 56*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 57*9880d681SAndroid Build Coastguard Worker bool opcode_11110110(const uint8_t *Opcodes, unsigned &Offset, 58*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 59*9880d681SAndroid Build Coastguard Worker bool opcode_11110111(const uint8_t *Opcodes, unsigned &Offset, 60*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 61*9880d681SAndroid Build Coastguard Worker bool opcode_11111000(const uint8_t *Opcodes, unsigned &Offset, 62*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 63*9880d681SAndroid Build Coastguard Worker bool opcode_11111001(const uint8_t *Opcodes, unsigned &Offset, 64*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 65*9880d681SAndroid Build Coastguard Worker bool opcode_11111010(const uint8_t *Opcodes, unsigned &Offset, 66*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 67*9880d681SAndroid Build Coastguard Worker bool opcode_11111011(const uint8_t *Opcodes, unsigned &Offset, 68*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 69*9880d681SAndroid Build Coastguard Worker bool opcode_11111100(const uint8_t *Opcodes, unsigned &Offset, 70*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 71*9880d681SAndroid Build Coastguard Worker bool opcode_11111101(const uint8_t *Opcodes, unsigned &Offset, 72*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 73*9880d681SAndroid Build Coastguard Worker bool opcode_11111110(const uint8_t *Opcodes, unsigned &Offset, 74*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 75*9880d681SAndroid Build Coastguard Worker bool opcode_11111111(const uint8_t *Opcodes, unsigned &Offset, 76*9880d681SAndroid Build Coastguard Worker unsigned Length, bool Prologue); 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker void decodeOpcodes(ArrayRef<uint8_t> Opcodes, unsigned Offset, 79*9880d681SAndroid Build Coastguard Worker bool Prologue); 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker void printRegisters(const std::pair<uint16_t, uint32_t> &RegisterMask); 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker ErrorOr<object::SectionRef> 84*9880d681SAndroid Build Coastguard Worker getSectionContaining(const object::COFFObjectFile &COFF, uint64_t Address); 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker ErrorOr<object::SymbolRef> 87*9880d681SAndroid Build Coastguard Worker getSymbol(const object::COFFObjectFile &COFF, uint64_t Address, 88*9880d681SAndroid Build Coastguard Worker bool FunctionOnly = false); 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker ErrorOr<object::SymbolRef> 91*9880d681SAndroid Build Coastguard Worker getRelocatedSymbol(const object::COFFObjectFile &COFF, 92*9880d681SAndroid Build Coastguard Worker const object::SectionRef &Section, uint64_t Offset); 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker bool dumpXDataRecord(const object::COFFObjectFile &COFF, 95*9880d681SAndroid Build Coastguard Worker const object::SectionRef &Section, 96*9880d681SAndroid Build Coastguard Worker uint64_t FunctionAddress, uint64_t VA); 97*9880d681SAndroid Build Coastguard Worker bool dumpUnpackedEntry(const object::COFFObjectFile &COFF, 98*9880d681SAndroid Build Coastguard Worker const object::SectionRef Section, uint64_t Offset, 99*9880d681SAndroid Build Coastguard Worker unsigned Index, const RuntimeFunction &Entry); 100*9880d681SAndroid Build Coastguard Worker bool dumpPackedEntry(const object::COFFObjectFile &COFF, 101*9880d681SAndroid Build Coastguard Worker const object::SectionRef Section, uint64_t Offset, 102*9880d681SAndroid Build Coastguard Worker unsigned Index, const RuntimeFunction &Entry); 103*9880d681SAndroid Build Coastguard Worker bool dumpProcedureDataEntry(const object::COFFObjectFile &COFF, 104*9880d681SAndroid Build Coastguard Worker const object::SectionRef Section, unsigned Entry, 105*9880d681SAndroid Build Coastguard Worker ArrayRef<uint8_t> Contents); 106*9880d681SAndroid Build Coastguard Worker void dumpProcedureData(const object::COFFObjectFile &COFF, 107*9880d681SAndroid Build Coastguard Worker const object::SectionRef Section); 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker public: Decoder(ScopedPrinter & SW)110*9880d681SAndroid Build Coastguard Worker Decoder(ScopedPrinter &SW) : SW(SW), OS(SW.getOStream()) {} 111*9880d681SAndroid Build Coastguard Worker std::error_code dumpProcedureData(const object::COFFObjectFile &COFF); 112*9880d681SAndroid Build Coastguard Worker }; 113*9880d681SAndroid Build Coastguard Worker } 114*9880d681SAndroid Build Coastguard Worker } 115*9880d681SAndroid Build Coastguard Worker } 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker #endif 118