]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Instruction / MIPS64 / EmulateInstructionMIPS64.h
1 //===-- EmulateInstructionMIPS64.h ------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef EmulateInstructionMIPS64_h_
11 #define EmulateInstructionMIPS64_h_
12
13 #include "lldb/Core/EmulateInstruction.h"
14 #include "lldb/Interpreter/OptionValue.h"
15 #include "lldb/Utility/Status.h"
16
17 namespace llvm {
18 class MCDisassembler;
19 class MCSubtargetInfo;
20 class MCRegisterInfo;
21 class MCAsmInfo;
22 class MCContext;
23 class MCInstrInfo;
24 class MCInst;
25 } // namespace llvm
26
27 class EmulateInstructionMIPS64 : public lldb_private::EmulateInstruction {
28 public:
29   EmulateInstructionMIPS64(const lldb_private::ArchSpec &arch);
30
31   static void Initialize();
32
33   static void Terminate();
34
35   static lldb_private::ConstString GetPluginNameStatic();
36
37   static const char *GetPluginDescriptionStatic();
38
39   static lldb_private::EmulateInstruction *
40   CreateInstance(const lldb_private::ArchSpec &arch,
41                  lldb_private::InstructionType inst_type);
42
43   static bool SupportsEmulatingInstructionsOfTypeStatic(
44       lldb_private::InstructionType inst_type) {
45     switch (inst_type) {
46     case lldb_private::eInstructionTypeAny:
47     case lldb_private::eInstructionTypePrologueEpilogue:
48     case lldb_private::eInstructionTypePCModifying:
49       return true;
50
51     case lldb_private::eInstructionTypeAll:
52       return false;
53     }
54     return false;
55   }
56
57   lldb_private::ConstString GetPluginName() override;
58
59   uint32_t GetPluginVersion() override { return 1; }
60
61   bool SetTargetTriple(const lldb_private::ArchSpec &arch) override;
62
63   bool SupportsEmulatingInstructionsOfType(
64       lldb_private::InstructionType inst_type) override {
65     return SupportsEmulatingInstructionsOfTypeStatic(inst_type);
66   }
67
68   bool ReadInstruction() override;
69
70   bool EvaluateInstruction(uint32_t evaluate_options) override;
71
72   bool TestEmulation(lldb_private::Stream *out_stream,
73                      lldb_private::ArchSpec &arch,
74                      lldb_private::OptionValueDictionary *test_data) override {
75     return false;
76   }
77
78   bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num,
79                        lldb_private::RegisterInfo &reg_info) override;
80
81   bool
82   CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override;
83
84 protected:
85   typedef struct {
86     const char *op_name;
87     bool (EmulateInstructionMIPS64::*callback)(llvm::MCInst &insn);
88     const char *insn_name;
89   } MipsOpcode;
90
91   static MipsOpcode *GetOpcodeForInstruction(const char *op_name);
92
93   bool Emulate_DADDiu(llvm::MCInst &insn);
94
95   bool Emulate_DSUBU_DADDU(llvm::MCInst &insn);
96
97   bool Emulate_LUI(llvm::MCInst &insn);
98
99   bool Emulate_SD(llvm::MCInst &insn);
100
101   bool Emulate_LD(llvm::MCInst &insn);
102
103   bool Emulate_LDST_Imm(llvm::MCInst &insn);
104
105   bool Emulate_LDST_Reg(llvm::MCInst &insn);
106
107   bool Emulate_BXX_3ops(llvm::MCInst &insn);
108
109   bool Emulate_BXX_3ops_C(llvm::MCInst &insn);
110
111   bool Emulate_BXX_2ops(llvm::MCInst &insn);
112
113   bool Emulate_BXX_2ops_C(llvm::MCInst &insn);
114
115   bool Emulate_Bcond_Link_C(llvm::MCInst &insn);
116
117   bool Emulate_Bcond_Link(llvm::MCInst &insn);
118
119   bool Emulate_FP_branch(llvm::MCInst &insn);
120
121   bool Emulate_3D_branch(llvm::MCInst &insn);
122
123   bool Emulate_BAL(llvm::MCInst &insn);
124
125   bool Emulate_BALC(llvm::MCInst &insn);
126
127   bool Emulate_BC(llvm::MCInst &insn);
128
129   bool Emulate_J(llvm::MCInst &insn);
130
131   bool Emulate_JAL(llvm::MCInst &insn);
132
133   bool Emulate_JALR(llvm::MCInst &insn);
134
135   bool Emulate_JIALC(llvm::MCInst &insn);
136
137   bool Emulate_JIC(llvm::MCInst &insn);
138
139   bool Emulate_JR(llvm::MCInst &insn);
140
141   bool Emulate_BC1EQZ(llvm::MCInst &insn);
142
143   bool Emulate_BC1NEZ(llvm::MCInst &insn);
144
145   bool Emulate_BNZB(llvm::MCInst &insn);
146
147   bool Emulate_BNZH(llvm::MCInst &insn);
148
149   bool Emulate_BNZW(llvm::MCInst &insn);
150
151   bool Emulate_BNZD(llvm::MCInst &insn);
152
153   bool Emulate_BZB(llvm::MCInst &insn);
154
155   bool Emulate_BZH(llvm::MCInst &insn);
156
157   bool Emulate_BZW(llvm::MCInst &insn);
158
159   bool Emulate_BZD(llvm::MCInst &insn);
160
161   bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size,
162                              bool bnz);
163
164   bool Emulate_BNZV(llvm::MCInst &insn);
165
166   bool Emulate_BZV(llvm::MCInst &insn);
167
168   bool Emulate_MSA_Branch_V(llvm::MCInst &insn, bool bnz);
169
170   bool nonvolatile_reg_p(uint64_t regnum);
171
172   const char *GetRegisterName(unsigned reg_num, bool altnernate_name);
173
174 private:
175   std::unique_ptr<llvm::MCDisassembler> m_disasm;
176   std::unique_ptr<llvm::MCSubtargetInfo> m_subtype_info;
177   std::unique_ptr<llvm::MCRegisterInfo> m_reg_info;
178   std::unique_ptr<llvm::MCAsmInfo> m_asm_info;
179   std::unique_ptr<llvm::MCContext> m_context;
180   std::unique_ptr<llvm::MCInstrInfo> m_insn_info;
181 };
182
183 #endif // EmulateInstructionMIPS64_h_