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 
16 namespace llvm {
17 class MCDisassembler;
18 class MCSubtargetInfo;
19 class MCRegisterInfo;
20 class MCAsmInfo;
21 class MCContext;
22 class MCInstrInfo;
23 class MCInst;
24 } // namespace llvm
25 
26 class EmulateInstructionMIPS64 : public lldb_private::EmulateInstruction {
27 public:
28   EmulateInstructionMIPS64(const lldb_private::ArchSpec &arch);
29 
30   static void Initialize();
31 
32   static void Terminate();
33 
34   static lldb_private::ConstString GetPluginNameStatic();
35 
36   static const char *GetPluginDescriptionStatic();
37 
38   static lldb_private::EmulateInstruction *
39   CreateInstance(const lldb_private::ArchSpec &arch,
40                  lldb_private::InstructionType inst_type);
41 
SupportsEmulatingInstructionsOfTypeStatic(lldb_private::InstructionType inst_type)42   static bool SupportsEmulatingInstructionsOfTypeStatic(
43       lldb_private::InstructionType inst_type) {
44     switch (inst_type) {
45     case lldb_private::eInstructionTypeAny:
46     case lldb_private::eInstructionTypePrologueEpilogue:
47     case lldb_private::eInstructionTypePCModifying:
48       return true;
49 
50     case lldb_private::eInstructionTypeAll:
51       return false;
52     }
53     return false;
54   }
55 
56   lldb_private::ConstString GetPluginName() override;
57 
GetPluginVersion()58   uint32_t GetPluginVersion() override { return 1; }
59 
60   bool SetTargetTriple(const lldb_private::ArchSpec &arch) override;
61 
SupportsEmulatingInstructionsOfType(lldb_private::InstructionType inst_type)62   bool SupportsEmulatingInstructionsOfType(
63       lldb_private::InstructionType inst_type) override {
64     return SupportsEmulatingInstructionsOfTypeStatic(inst_type);
65   }
66 
67   bool ReadInstruction() override;
68 
69   bool EvaluateInstruction(uint32_t evaluate_options) override;
70 
TestEmulation(lldb_private::Stream * out_stream,lldb_private::ArchSpec & arch,lldb_private::OptionValueDictionary * test_data)71   bool TestEmulation(lldb_private::Stream *out_stream,
72                      lldb_private::ArchSpec &arch,
73                      lldb_private::OptionValueDictionary *test_data) override {
74     return false;
75   }
76 
77   bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num,
78                        lldb_private::RegisterInfo &reg_info) override;
79 
80   bool
81   CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override;
82 
83 protected:
84   typedef struct {
85     const char *op_name;
86     bool (EmulateInstructionMIPS64::*callback)(llvm::MCInst &insn);
87     const char *insn_name;
88   } MipsOpcode;
89 
90   static MipsOpcode *GetOpcodeForInstruction(const char *op_name);
91 
92   bool Emulate_DADDiu(llvm::MCInst &insn);
93 
94   bool Emulate_DSUBU_DADDU(llvm::MCInst &insn);
95 
96   bool Emulate_LUI(llvm::MCInst &insn);
97 
98   bool Emulate_SD(llvm::MCInst &insn);
99 
100   bool Emulate_LD(llvm::MCInst &insn);
101 
102   bool Emulate_LDST_Imm(llvm::MCInst &insn);
103 
104   bool Emulate_LDST_Reg(llvm::MCInst &insn);
105 
106   bool Emulate_BXX_3ops(llvm::MCInst &insn);
107 
108   bool Emulate_BXX_3ops_C(llvm::MCInst &insn);
109 
110   bool Emulate_BXX_2ops(llvm::MCInst &insn);
111 
112   bool Emulate_BXX_2ops_C(llvm::MCInst &insn);
113 
114   bool Emulate_Bcond_Link_C(llvm::MCInst &insn);
115 
116   bool Emulate_Bcond_Link(llvm::MCInst &insn);
117 
118   bool Emulate_FP_branch(llvm::MCInst &insn);
119 
120   bool Emulate_3D_branch(llvm::MCInst &insn);
121 
122   bool Emulate_BAL(llvm::MCInst &insn);
123 
124   bool Emulate_BALC(llvm::MCInst &insn);
125 
126   bool Emulate_BC(llvm::MCInst &insn);
127 
128   bool Emulate_J(llvm::MCInst &insn);
129 
130   bool Emulate_JAL(llvm::MCInst &insn);
131 
132   bool Emulate_JALR(llvm::MCInst &insn);
133 
134   bool Emulate_JIALC(llvm::MCInst &insn);
135 
136   bool Emulate_JIC(llvm::MCInst &insn);
137 
138   bool Emulate_JR(llvm::MCInst &insn);
139 
140   bool Emulate_BC1EQZ(llvm::MCInst &insn);
141 
142   bool Emulate_BC1NEZ(llvm::MCInst &insn);
143 
144   bool Emulate_BNZB(llvm::MCInst &insn);
145 
146   bool Emulate_BNZH(llvm::MCInst &insn);
147 
148   bool Emulate_BNZW(llvm::MCInst &insn);
149 
150   bool Emulate_BNZD(llvm::MCInst &insn);
151 
152   bool Emulate_BZB(llvm::MCInst &insn);
153 
154   bool Emulate_BZH(llvm::MCInst &insn);
155 
156   bool Emulate_BZW(llvm::MCInst &insn);
157 
158   bool Emulate_BZD(llvm::MCInst &insn);
159 
160   bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size,
161                              bool bnz);
162 
163   bool Emulate_BNZV(llvm::MCInst &insn);
164 
165   bool Emulate_BZV(llvm::MCInst &insn);
166 
167   bool Emulate_MSA_Branch_V(llvm::MCInst &insn, bool bnz);
168 
169   bool nonvolatile_reg_p(uint64_t regnum);
170 
171   const char *GetRegisterName(unsigned reg_num, bool alternate_name);
172 
173 private:
174   std::unique_ptr<llvm::MCDisassembler> m_disasm;
175   std::unique_ptr<llvm::MCSubtargetInfo> m_subtype_info;
176   std::unique_ptr<llvm::MCRegisterInfo> m_reg_info;
177   std::unique_ptr<llvm::MCAsmInfo> m_asm_info;
178   std::unique_ptr<llvm::MCContext> m_context;
179   std::unique_ptr<llvm::MCInstrInfo> m_insn_info;
180 };
181 
182 #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS64_EMULATEINSTRUCTIONMIPS64_H
183