xref: /aosp_15_r20/external/llvm/tools/llvm-readobj/ARMWinEHPrinter.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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