1 | //===-- EmulateInstructionMIPS64.h ------------------------------*- C++ -*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS64_EMULATEINSTRUCTIONMIPS64_H |
10 | #define LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS64_EMULATEINSTRUCTIONMIPS64_H |
11 | |
12 | #include "lldb/Core/EmulateInstruction.h" |
13 | #include "lldb/Interpreter/OptionValue.h" |
14 | #include "lldb/Utility/Status.h" |
15 | #include <optional> |
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 llvm::StringRef GetPluginNameStatic() { return "mips64"; } |
36 | |
37 | static llvm::StringRef 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 | llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } |
58 | |
59 | bool SetTargetTriple(const lldb_private::ArchSpec &arch) override; |
60 | |
61 | bool SupportsEmulatingInstructionsOfType( |
62 | lldb_private::InstructionType inst_type) override { |
63 | return SupportsEmulatingInstructionsOfTypeStatic(inst_type); |
64 | } |
65 | |
66 | bool ReadInstruction() override; |
67 | |
68 | bool EvaluateInstruction(uint32_t evaluate_options) override; |
69 | |
70 | bool TestEmulation(lldb_private::Stream &out_stream, |
71 | lldb_private::ArchSpec &arch, |
72 | lldb_private::OptionValueDictionary *test_data) override { |
73 | return false; |
74 | } |
75 | |
76 | std::optional<lldb_private::RegisterInfo> |
77 | GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num) override; |
78 | |
79 | bool |
80 | CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override; |
81 | |
82 | protected: |
83 | typedef struct { |
84 | const char *op_name; |
85 | bool (EmulateInstructionMIPS64::*callback)(llvm::MCInst &insn); |
86 | const char *insn_name; |
87 | } MipsOpcode; |
88 | |
89 | static MipsOpcode *GetOpcodeForInstruction(llvm::StringRef op_name); |
90 | |
91 | bool Emulate_DADDiu(llvm::MCInst &insn); |
92 | |
93 | bool Emulate_DSUBU_DADDU(llvm::MCInst &insn); |
94 | |
95 | bool Emulate_LUI(llvm::MCInst &insn); |
96 | |
97 | bool Emulate_SD(llvm::MCInst &insn); |
98 | |
99 | bool Emulate_LD(llvm::MCInst &insn); |
100 | |
101 | bool Emulate_LDST_Imm(llvm::MCInst &insn); |
102 | |
103 | bool Emulate_LDST_Reg(llvm::MCInst &insn); |
104 | |
105 | bool Emulate_BXX_3ops(llvm::MCInst &insn); |
106 | |
107 | bool Emulate_BXX_3ops_C(llvm::MCInst &insn); |
108 | |
109 | bool Emulate_BXX_2ops(llvm::MCInst &insn); |
110 | |
111 | bool Emulate_BXX_2ops_C(llvm::MCInst &insn); |
112 | |
113 | bool Emulate_Bcond_Link_C(llvm::MCInst &insn); |
114 | |
115 | bool Emulate_Bcond_Link(llvm::MCInst &insn); |
116 | |
117 | bool Emulate_FP_branch(llvm::MCInst &insn); |
118 | |
119 | bool Emulate_3D_branch(llvm::MCInst &insn); |
120 | |
121 | bool Emulate_BAL(llvm::MCInst &insn); |
122 | |
123 | bool Emulate_BALC(llvm::MCInst &insn); |
124 | |
125 | bool Emulate_BC(llvm::MCInst &insn); |
126 | |
127 | bool Emulate_J(llvm::MCInst &insn); |
128 | |
129 | bool Emulate_JAL(llvm::MCInst &insn); |
130 | |
131 | bool Emulate_JALR(llvm::MCInst &insn); |
132 | |
133 | bool Emulate_JIALC(llvm::MCInst &insn); |
134 | |
135 | bool Emulate_JIC(llvm::MCInst &insn); |
136 | |
137 | bool Emulate_JR(llvm::MCInst &insn); |
138 | |
139 | bool Emulate_BC1EQZ(llvm::MCInst &insn); |
140 | |
141 | bool Emulate_BC1NEZ(llvm::MCInst &insn); |
142 | |
143 | bool Emulate_BNZB(llvm::MCInst &insn); |
144 | |
145 | bool Emulate_BNZH(llvm::MCInst &insn); |
146 | |
147 | bool Emulate_BNZW(llvm::MCInst &insn); |
148 | |
149 | bool Emulate_BNZD(llvm::MCInst &insn); |
150 | |
151 | bool Emulate_BZB(llvm::MCInst &insn); |
152 | |
153 | bool Emulate_BZH(llvm::MCInst &insn); |
154 | |
155 | bool Emulate_BZW(llvm::MCInst &insn); |
156 | |
157 | bool Emulate_BZD(llvm::MCInst &insn); |
158 | |
159 | bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size, |
160 | bool bnz); |
161 | |
162 | bool Emulate_BNZV(llvm::MCInst &insn); |
163 | |
164 | bool Emulate_BZV(llvm::MCInst &insn); |
165 | |
166 | bool Emulate_MSA_Branch_V(llvm::MCInst &insn, bool bnz); |
167 | |
168 | bool nonvolatile_reg_p(uint64_t regnum); |
169 | |
170 | const char *GetRegisterName(unsigned reg_num, bool alternate_name); |
171 | |
172 | private: |
173 | std::unique_ptr<llvm::MCDisassembler> m_disasm; |
174 | std::unique_ptr<llvm::MCSubtargetInfo> m_subtype_info; |
175 | std::unique_ptr<llvm::MCRegisterInfo> m_reg_info; |
176 | std::unique_ptr<llvm::MCAsmInfo> m_asm_info; |
177 | std::unique_ptr<llvm::MCContext> m_context; |
178 | std::unique_ptr<llvm::MCInstrInfo> m_insn_info; |
179 | }; |
180 | |
181 | #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS64_EMULATEINSTRUCTIONMIPS64_H |
182 |