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  llvm::Optional<lldb_private::RegisterInfo>
84  GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num) 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(llvm::StringRef 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:1172
EmulateInstructionMIPS::Emulate_BZV
bool Emulate_BZV(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2932
EmulateInstructionMIPS::Emulate_JR
bool Emulate_JR(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2639
EmulateInstructionMIPS::nonvolatile_reg_p
bool nonvolatile_reg_p(uint32_t regnum)
Definition: EmulateInstructionMIPS.cpp:1151
lldb_private::eInstructionTypePCModifying
@ eInstructionTypePCModifying
Definition: lldb-private-enumerations.h:123
llvm
Definition: Debugger.h:50
EmulateInstructionMIPS::Emulate_BALC
bool Emulate_BALC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2432
EmulateInstructionMIPS::Emulate_J
bool Emulate_J(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2486
lldb_private::ArchSpec
Definition: ArchSpec.h:32
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:2705
EmulateInstructionMIPS::GetPluginName
llvm::StringRef GetPluginName() override
Definition: EmulateInstructionMIPS.h:58
EmulateInstructionMIPS::EvaluateInstruction
bool EvaluateInstruction(uint32_t evaluate_options) override
Definition: EmulateInstructionMIPS.cpp:1050
EmulateInstructionMIPS::GetSizeOfInstruction
uint32_t GetSizeOfInstruction(lldb_private::DataExtractor &data, uint64_t inst_addr)
Definition: EmulateInstructionMIPS.cpp:966
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:2936
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:2971
EmulateInstructionMIPS::Emulate_ADDIUS5
bool Emulate_ADDIUS5(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1453
EmulateInstructionMIPS::ReadInstruction
bool ReadInstruction() override
Definition: EmulateInstructionMIPS.cpp:1033
EmulateInstructionMIPS::Emulate_BZD
bool Emulate_BZD(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2864
lldb_private::Stream
Definition: Stream.h:28
lldb_private::Target
Definition: Target.h:469
EmulateInstructionMIPS::Emulate_FP_branch
bool Emulate_FP_branch(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2666
EmulateInstructionMIPS::Emulate_JALRx16_MM
bool Emulate_JALRx16_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2280
lldb_private::eInstructionTypeAll
@ eInstructionTypeAll
Definition: lldb-private-enumerations.h:125
EmulateInstructionMIPS::Emulate_B16_MM
bool Emulate_B16_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2152
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:2840
EmulateInstructionMIPS::Emulate_SUBU_ADDU
bool Emulate_SUBU_ADDU(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1330
EmulateInstructionMIPS::Emulate_LDST_Reg
bool Emulate_LDST_Reg(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:3002
EmulateInstructionMIPS::Emulate_BXX_3ops
bool Emulate_BXX_3ops(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1786
EmulateInstruction.h
EmulateInstructionMIPS::Emulate_BXX_3ops_C
bool Emulate_BXX_3ops_C(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1836
lldb_private::DataExtractor
Definition: DataExtractor.h:48
EmulateInstructionMIPS::Emulate_LUI
bool Emulate_LUI(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1409
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:1915
EmulateInstructionMIPS::CreateFunctionEntryUnwind
bool CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override
Definition: EmulateInstructionMIPS.cpp:1125
EmulateInstructionMIPS::GetRegisterInfo
llvm::Optional< lldb_private::RegisterInfo > GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num) override
Definition: EmulateInstructionMIPS.cpp:589
EmulateInstructionMIPS::Emulate_BZW
bool Emulate_BZW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2860
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:2852
EmulateInstructionMIPS::Emulate_JIALC
bool Emulate_JIALC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2575
EmulateInstructionMIPS::MipsOpcode::insn_name
const char * insn_name
Definition: EmulateInstructionMIPS.h:93
EmulateInstructionMIPS::Emulate_JAL
bool Emulate_JAL(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2509
EmulateInstructionMIPS::Emulate_LWM16_32
bool Emulate_LWM16_32(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1676
EmulateInstructionMIPS::GetOpcodeForInstruction
static MipsOpcode * GetOpcodeForInstruction(llvm::StringRef name)
Definition: EmulateInstructionMIPS.cpp:672
EmulateInstructionMIPS::Emulate_JRADDIUSP
bool Emulate_JRADDIUSP(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1733
EmulateInstructionMIPS::Emulate_MSA_Branch_DF
bool Emulate_MSA_Branch_DF(llvm::MCInst &insn, int element_byte_size, bool bnz)
Definition: EmulateInstructionMIPS.cpp:2868
EmulateInstructionMIPS::MipsOpcode
Definition: EmulateInstructionMIPS.h:90
EmulateInstructionMIPS::Emulate_BXX_2ops_C
bool Emulate_BXX_2ops_C(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2092
EmulateInstructionMIPS::Emulate_SWM16_32
bool Emulate_SWM16_32(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1551
EmulateInstructionMIPS::MipsOpcode::op_name
const char * op_name
Definition: EmulateInstructionMIPS.h:91
EmulateInstructionMIPS::Emulate_BC
bool Emulate_BC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2463
EmulateInstructionMIPS::Emulate_Branch_MM
bool Emulate_Branch_MM(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2179
lldb::RegisterKind
RegisterKind
Register numbering types.
Definition: lldb-enumerations.h:228
EmulateInstructionMIPS::Emulate_BZH
bool Emulate_BZH(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2856
EmulateInstructionMIPS::Emulate_BXX_2ops
bool Emulate_BXX_2ops(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2035
EmulateInstructionMIPS::Emulate_JALx
bool Emulate_JALx(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2319
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:2928
EmulateInstructionMIPS::Emulate_BNZB
bool Emulate_BNZB(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2836
EmulateInstructionMIPS::Emulate_LW
bool Emulate_LW(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:1286
EmulateInstructionMIPS::Emulate_3D_branch
bool Emulate_3D_branch(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2784
uint32_t
EmulateInstructionMIPS::Emulate_BAL
bool Emulate_BAL(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2401
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:2844
EmulateInstructionMIPS::SetInstruction
bool SetInstruction(const lldb_private::Opcode &insn_opcode, const lldb_private::Address &inst_addr, lldb_private::Target *target) override
Definition: EmulateInstructionMIPS.cpp:986
EmulateInstructionMIPS::Emulate_BC1NEZ
bool Emulate_BC1NEZ(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2741
EmulateInstructionMIPS::Emulate_JIC
bool Emulate_JIC(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2613
EmulateInstructionMIPS::Emulate_BNZD
bool Emulate_BNZD(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2848
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:1487
lldb_private::InstructionType
InstructionType
Instruction types.
Definition: lldb-private-enumerations.h:118
EmulateInstructionMIPS::Emulate_JALRS
bool Emulate_JALRS(llvm::MCInst &insn)
Definition: EmulateInstructionMIPS.cpp:2364
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:1984
lldb_private::OptionValueDictionary
Definition: OptionValueDictionary.h:19
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:2540
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:1628
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:1224
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:1426