LLDB  mainline
EmulateInstructionMIPS.h
Go to the documentation of this file.
1 //===-- EmulateInstructionMIPS.h ------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS_EMULATEINSTRUCTIONMIPS_H
11 #define LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS_EMULATEINSTRUCTIONMIPS_H
12 
13 namespace llvm {
14 class MCDisassembler;
15 class MCSubtargetInfo;
16 class MCRegisterInfo;
17 class MCAsmInfo;
18 class MCContext;
19 class MCInstrInfo;
20 class MCInst;
21 }
22 
23 namespace lldb_private {
24  class OptionValueDictionary;
25 }
26 
28 #include "lldb/Utility/Status.h"
29 
31 public:
32  static void Initialize();
33 
34  static void Terminate();
35 
36  static llvm::StringRef GetPluginNameStatic() { return "mips32"; }
37 
38  static llvm::StringRef GetPluginDescriptionStatic();
39 
43 
46  switch (inst_type) {
50  return true;
51 
53  return false;
54  }
55  return false;
56  }
57 
58  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
59 
60  bool SetTargetTriple(const lldb_private::ArchSpec &arch) override;
61 
63 
65  lldb_private::InstructionType inst_type) override {
67  }
68 
69  bool ReadInstruction() override;
70 
71  bool EvaluateInstruction(uint32_t evaluate_options) override;
72 
73  bool SetInstruction(const lldb_private::Opcode &insn_opcode,
74  const lldb_private::Address &inst_addr,
75  lldb_private::Target *target) override;
76 
79  lldb_private::OptionValueDictionary *test_data) override {
80  return false;
81  }
82 
83  bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num,
84  lldb_private::RegisterInfo &reg_info) override;
85 
86  bool
88 
89 protected:
90  typedef struct {
91  const char *op_name;
92  bool (EmulateInstructionMIPS::*callback)(llvm::MCInst &insn);
93  const char *insn_name;
94  } MipsOpcode;
95 
96  static MipsOpcode *GetOpcodeForInstruction(const char *op_name);
97 
99  uint64_t inst_addr);
100 
101  bool Emulate_ADDiu(llvm::MCInst &insn);
102 
103  bool Emulate_SUBU_ADDU(llvm::MCInst &insn);
104 
105  bool Emulate_LUI(llvm::MCInst &insn);
106 
107  bool Emulate_SW(llvm::MCInst &insn);
108 
109  bool Emulate_LW(llvm::MCInst &insn);
110 
111  bool Emulate_ADDIUSP(llvm::MCInst &insn);
112 
113  bool Emulate_ADDIUS5(llvm::MCInst &insn);
114 
115  bool Emulate_SWSP(llvm::MCInst &insn);
116 
117  bool Emulate_SWM16_32(llvm::MCInst &insn);
118 
119  bool Emulate_LWSP(llvm::MCInst &insn);
120 
121  bool Emulate_LWM16_32(llvm::MCInst &insn);
122 
123  bool Emulate_JRADDIUSP(llvm::MCInst &insn);
124 
125  bool Emulate_LDST_Imm(llvm::MCInst &insn);
126 
127  bool Emulate_LDST_Reg(llvm::MCInst &insn);
128 
129  bool Emulate_BXX_3ops(llvm::MCInst &insn);
130 
131  bool Emulate_BXX_3ops_C(llvm::MCInst &insn);
132 
133  bool Emulate_BXX_2ops(llvm::MCInst &insn);
134 
135  bool Emulate_BXX_2ops_C(llvm::MCInst &insn);
136 
137  bool Emulate_Bcond_Link_C(llvm::MCInst &insn);
138 
139  bool Emulate_Bcond_Link(llvm::MCInst &insn);
140 
141  bool Emulate_FP_branch(llvm::MCInst &insn);
142 
143  bool Emulate_3D_branch(llvm::MCInst &insn);
144 
145  bool Emulate_BAL(llvm::MCInst &insn);
146 
147  bool Emulate_BALC(llvm::MCInst &insn);
148 
149  bool Emulate_BC(llvm::MCInst &insn);
150 
151  bool Emulate_J(llvm::MCInst &insn);
152 
153  bool Emulate_JAL(llvm::MCInst &insn);
154 
155  bool Emulate_JALR(llvm::MCInst &insn);
156 
157  bool Emulate_JIALC(llvm::MCInst &insn);
158 
159  bool Emulate_JIC(llvm::MCInst &insn);
160 
161  bool Emulate_JR(llvm::MCInst &insn);
162 
163  bool Emulate_BC1EQZ(llvm::MCInst &insn);
164 
165  bool Emulate_BC1NEZ(llvm::MCInst &insn);
166 
167  bool Emulate_BNZB(llvm::MCInst &insn);
168 
169  bool Emulate_BNZH(llvm::MCInst &insn);
170 
171  bool Emulate_BNZW(llvm::MCInst &insn);
172 
173  bool Emulate_BNZD(llvm::MCInst &insn);
174 
175  bool Emulate_BZB(llvm::MCInst &insn);
176 
177  bool Emulate_BZH(llvm::MCInst &insn);
178 
179  bool Emulate_BZW(llvm::MCInst &insn);
180 
181  bool Emulate_BZD(llvm::MCInst &insn);
182 
183  bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size,
184  bool bnz);
185 
186  bool Emulate_BNZV(llvm::MCInst &insn);
187 
188  bool Emulate_BZV(llvm::MCInst &insn);
189 
190  bool Emulate_MSA_Branch_V(llvm::MCInst &insn, bool bnz);
191 
192  bool Emulate_B16_MM(llvm::MCInst &insn);
193 
194  bool Emulate_Branch_MM(llvm::MCInst &insn);
195 
196  bool Emulate_JALRx16_MM(llvm::MCInst &insn);
197 
198  bool Emulate_JALx(llvm::MCInst &insn);
199 
200  bool Emulate_JALRS(llvm::MCInst &insn);
201 
202  bool nonvolatile_reg_p(uint32_t regnum);
203 
204  const char *GetRegisterName(unsigned reg_num, bool alternate_name);
205 
206 private:
207  std::unique_ptr<llvm::MCDisassembler> m_disasm;
208  std::unique_ptr<llvm::MCDisassembler> m_alt_disasm;
209  std::unique_ptr<llvm::MCSubtargetInfo> m_subtype_info;
210  std::unique_ptr<llvm::MCSubtargetInfo> m_alt_subtype_info;
211  std::unique_ptr<llvm::MCRegisterInfo> m_reg_info;
212  std::unique_ptr<llvm::MCAsmInfo> m_asm_info;
213  std::unique_ptr<llvm::MCContext> m_context;
214  std::unique_ptr<llvm::MCInstrInfo> m_insn_info;
217 };
218 
219 #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_MIPS_EMULATEINSTRUCTIONMIPS_H
EmulateInstructionMIPS::Emulate_ADDiu
bool Emulate_ADDiu(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1174
EmulateInstructionMIPS::Emulate_BZV
bool Emulate_BZV(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2931
EmulateInstructionMIPS::Emulate_JR
bool Emulate_JR(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2640
EmulateInstructionMIPS::nonvolatile_reg_p
bool nonvolatile_reg_p(uint32_t regnum)
Definition: EmulateInstructionMIPS.cpp:1153
lldb_private::eInstructionTypePCModifying
@ eInstructionTypePCModifying
Definition: lldb-private-enumerations.h:123
llvm
Definition: Debugger.h:49
EmulateInstructionMIPS::Emulate_BALC
bool Emulate_BALC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2433
EmulateInstructionMIPS::Emulate_J
bool Emulate_J(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2487
EmulateInstructionMIPS::GetRegisterInfo
bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num, lldb_private::RegisterInfo &reg_info) override
Definition: EmulateInstructionMIPS.cpp:588
lldb_private::ArchSpec
Definition: ArchSpec.h:33
EmulateInstructionMIPS::m_insn_info
std::unique_ptr< llvm::MCInstrInfo > m_insn_info
Definition: EmulateInstructionMIPS.h:214
EmulateInstructionMIPS::SetTargetTriple
bool SetTargetTriple(const lldb_private::ArchSpec &arch) override
Definition: EmulateInstructionMIPS.cpp:214
lldb_private::Opcode
Definition: Opcode.h:29
EmulateInstructionMIPS::Emulate_BC1EQZ
bool Emulate_BC1EQZ(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2704
EmulateInstructionMIPS::GetPluginName
llvm::StringRef GetPluginName() override
Definition: EmulateInstructionMIPS.h:58
EmulateInstructionMIPS::EvaluateInstruction
bool EvaluateInstruction(uint32_t evaluate_options) override
Definition: EmulateInstructionMIPS.cpp:1052
EmulateInstructionMIPS::GetSizeOfInstruction
uint32_t GetSizeOfInstruction(lldb_private::DataExtractor &data, uint64_t inst_addr)
Definition: EmulateInstructionMIPS.cpp:968
EmulateInstructionMIPS::EmulateInstructionMIPS
EmulateInstructionMIPS(const lldb_private::ArchSpec &arch)
Definition: EmulateInstructionMIPS.cpp:62
EmulateInstructionMIPS::m_next_inst_size
uint32_t m_next_inst_size
Definition: EmulateInstructionMIPS.h:215
EmulateInstructionMIPS::Initialize
static void Initialize()
Definition: EmulateInstructionMIPS.cpp:187
EmulateInstructionMIPS::Emulate_MSA_Branch_V
bool Emulate_MSA_Branch_V(llvm::MCInst &insn, bool bnz)
Definition: EmulateInstructionMIPS.cpp:2935
EmulateInstructionMIPS::SupportsEmulatingInstructionsOfTypeStatic
static bool SupportsEmulatingInstructionsOfTypeStatic(lldb_private::InstructionType inst_type)
Definition: EmulateInstructionMIPS.h:44
EmulateInstructionMIPS::Emulate_LDST_Imm
bool Emulate_LDST_Imm(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2970
EmulateInstructionMIPS::Emulate_ADDIUS5
bool Emulate_ADDIUS5(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1458
EmulateInstructionMIPS::ReadInstruction
bool ReadInstruction() override
Definition: EmulateInstructionMIPS.cpp:1035
EmulateInstructionMIPS::Emulate_BZD
bool Emulate_BZD(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2863
lldb_private::Stream
Definition: Stream.h:28
lldb_private::Target
Definition: Target.h:451
EmulateInstructionMIPS::Emulate_FP_branch
bool Emulate_FP_branch(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2667
EmulateInstructionMIPS::GetOpcodeForInstruction
static MipsOpcode * GetOpcodeForInstruction(const char *op_name)
Definition: EmulateInstructionMIPS.cpp:671
EmulateInstructionMIPS::Emulate_JALRx16_MM
bool Emulate_JALRx16_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2281
lldb_private::eInstructionTypeAll
@ eInstructionTypeAll
Definition: lldb-private-enumerations.h:125
EmulateInstructionMIPS::Emulate_B16_MM
bool Emulate_B16_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2153
EmulateInstructionMIPS::m_context
std::unique_ptr< llvm::MCContext > m_context
Definition: EmulateInstructionMIPS.h:213
EmulateInstructionMIPS::m_disasm
std::unique_ptr< llvm::MCDisassembler > m_disasm
Definition: EmulateInstructionMIPS.h:207
EmulateInstructionMIPS::Emulate_BNZH
bool Emulate_BNZH(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2839
EmulateInstructionMIPS::Emulate_SUBU_ADDU
bool Emulate_SUBU_ADDU(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1337
EmulateInstructionMIPS::Emulate_LDST_Reg
bool Emulate_LDST_Reg(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:3003
EmulateInstructionMIPS::Emulate_BXX_3ops
bool Emulate_BXX_3ops(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1793
EmulateInstruction.h
EmulateInstructionMIPS::Emulate_BXX_3ops_C
bool Emulate_BXX_3ops_C(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1842
lldb_private::DataExtractor
Definition: DataExtractor.h:48
EmulateInstructionMIPS::Emulate_LUI
bool Emulate_LUI(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1415
EmulateInstructionMIPS::m_alt_subtype_info
std::unique_ptr< llvm::MCSubtargetInfo > m_alt_subtype_info
Definition: EmulateInstructionMIPS.h:210
EmulateInstructionMIPS::Emulate_Bcond_Link_C
bool Emulate_Bcond_Link_C(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1921
EmulateInstructionMIPS::CreateFunctionEntryUnwind
bool CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override
Definition: EmulateInstructionMIPS.cpp:1127
EmulateInstructionMIPS::Emulate_BZW
bool Emulate_BZW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2859
EmulateInstructionMIPS::m_subtype_info
std::unique_ptr< llvm::MCSubtargetInfo > m_subtype_info
Definition: EmulateInstructionMIPS.h:209
EmulateInstructionMIPS::Emulate_BZB
bool Emulate_BZB(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2851
EmulateInstructionMIPS::Emulate_JIALC
bool Emulate_JIALC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2576
EmulateInstructionMIPS::MipsOpcode::insn_name
const char * insn_name
Definition: EmulateInstructionMIPS.h:93
EmulateInstructionMIPS::Emulate_JAL
bool Emulate_JAL(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2510
EmulateInstructionMIPS::Emulate_LWM16_32
bool Emulate_LWM16_32(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1684
EmulateInstructionMIPS::Emulate_JRADDIUSP
bool Emulate_JRADDIUSP(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1741
EmulateInstructionMIPS::Emulate_MSA_Branch_DF
bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size, bool bnz)
Definition: EmulateInstructionMIPS.cpp:2867
EmulateInstructionMIPS::MipsOpcode
Definition: EmulateInstructionMIPS.h:90
EmulateInstructionMIPS::Emulate_BXX_2ops_C
bool Emulate_BXX_2ops_C(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2093
EmulateInstructionMIPS::Emulate_SWM16_32
bool Emulate_SWM16_32(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1556
EmulateInstructionMIPS::MipsOpcode::op_name
const char * op_name
Definition: EmulateInstructionMIPS.h:91
EmulateInstructionMIPS::Emulate_BC
bool Emulate_BC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2464
EmulateInstructionMIPS::Emulate_Branch_MM
bool Emulate_Branch_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2180
lldb::RegisterKind
RegisterKind
Register numbering types.
Definition: lldb-enumerations.h:227
EmulateInstructionMIPS::Emulate_BZH
bool Emulate_BZH(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2855
EmulateInstructionMIPS::Emulate_BXX_2ops
bool Emulate_BXX_2ops(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2040
EmulateInstructionMIPS::Emulate_JALx
bool Emulate_JALx(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2320
EmulateInstructionMIPS::Terminate
static void Terminate()
Definition: EmulateInstructionMIPS.cpp:192
EmulateInstructionMIPS::m_alt_disasm
std::unique_ptr< llvm::MCDisassembler > m_alt_disasm
Definition: EmulateInstructionMIPS.h:208
EmulateInstructionMIPS::Emulate_BNZV
bool Emulate_BNZV(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2927
EmulateInstructionMIPS::Emulate_BNZB
bool Emulate_BNZB(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2835
EmulateInstructionMIPS::Emulate_LW
bool Emulate_LW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1290
EmulateInstructionMIPS::Emulate_3D_branch
bool Emulate_3D_branch(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2783
uint32_t
EmulateInstructionMIPS::Emulate_BAL
bool Emulate_BAL(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2402
lldb_private::EmulateInstruction
Definition: EmulateInstruction.h:93
EmulateInstructionMIPS::GetPluginDescriptionStatic
static llvm::StringRef GetPluginDescriptionStatic()
Definition: EmulateInstructionMIPS.cpp:196
lldb_private::Address
Definition: Address.h:59
EmulateInstructionMIPS::TestEmulation
bool TestEmulation(lldb_private::Stream *out_stream, lldb_private::ArchSpec &arch, lldb_private::OptionValueDictionary *test_data) override
Definition: EmulateInstructionMIPS.h:77
EmulateInstructionMIPS::Emulate_BNZW
bool Emulate_BNZW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2843
EmulateInstructionMIPS::SetInstruction
bool SetInstruction(const lldb_private::Opcode &insn_opcode, const lldb_private::Address &inst_addr, lldb_private::Target *target) override
Definition: EmulateInstructionMIPS.cpp:988
EmulateInstructionMIPS::Emulate_BC1NEZ
bool Emulate_BC1NEZ(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2740
EmulateInstructionMIPS::Emulate_JIC
bool Emulate_JIC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2614
EmulateInstructionMIPS::Emulate_BNZD
bool Emulate_BNZD(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2847
EmulateInstructionMIPS::SupportsEmulatingInstructionsOfType
bool SupportsEmulatingInstructionsOfType(lldb_private::InstructionType inst_type) override
Definition: EmulateInstructionMIPS.h:64
lldb_private::eInstructionTypePrologueEpilogue
@ eInstructionTypePrologueEpilogue
Definition: lldb-private-enumerations.h:120
EmulateInstructionMIPS::Emulate_SWSP
bool Emulate_SWSP(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1491
lldb_private::InstructionType
InstructionType
Instruction types.
Definition: lldb-private-enumerations.h:118
EmulateInstructionMIPS::Emulate_JALRS
bool Emulate_JALRS(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2365
Status.h
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
EmulateInstructionMIPS::Emulate_Bcond_Link
bool Emulate_Bcond_Link(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1990
lldb_private::OptionValueDictionary
Definition: OptionValueDictionary.h:18
EmulateInstructionMIPS::m_asm_info
std::unique_ptr< llvm::MCAsmInfo > m_asm_info
Definition: EmulateInstructionMIPS.h:212
EmulateInstructionMIPS::Emulate_JALR
bool Emulate_JALR(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2541
EmulateInstructionMIPS::GetRegisterName
const char * GetRegisterName(unsigned reg_num, bool alternate_name)
Definition: EmulateInstructionMIPS.cpp:219
EmulateInstructionMIPS::CreateInstance
static lldb_private::EmulateInstruction * CreateInstance(const lldb_private::ArchSpec &arch, lldb_private::InstructionType inst_type)
Definition: EmulateInstructionMIPS.cpp:201
EmulateInstructionMIPS::Emulate_LWSP
bool Emulate_LWSP(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1633
EmulateInstructionMIPS::m_use_alt_disaasm
bool m_use_alt_disaasm
Definition: EmulateInstructionMIPS.h:216
lldb_private::UnwindPlan
Definition: UnwindPlan.h:53
EmulateInstructionMIPS::Emulate_SW
bool Emulate_SW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1226
EmulateInstructionMIPS::GetPluginNameStatic
static llvm::StringRef GetPluginNameStatic()
Definition: EmulateInstructionMIPS.h:36
lldb_private::eInstructionTypeAny
@ eInstructionTypeAny
Definition: lldb-private-enumerations.h:119
EmulateInstructionMIPS::m_reg_info
std::unique_ptr< llvm::MCRegisterInfo > m_reg_info
Definition: EmulateInstructionMIPS.h:211
EmulateInstructionMIPS
Definition: EmulateInstructionMIPS.h:30
EmulateInstructionMIPS::Emulate_ADDIUSP
bool Emulate_ADDIUSP(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1432