/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.h
Line | Count | Source (jump to first uncovered line) |
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 | 3.92k | 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 | 16.7k | lldb_private::InstructionType inst_type) { |
45 | 16.7k | switch (inst_type) { |
46 | 0 | case lldb_private::eInstructionTypeAny: |
47 | 16.7k | case lldb_private::eInstructionTypePrologueEpilogue: |
48 | 16.7k | case lldb_private::eInstructionTypePCModifying: |
49 | 16.7k | return true; |
50 | | |
51 | 0 | case lldb_private::eInstructionTypeAll: |
52 | 0 | return false; |
53 | 16.7k | } |
54 | 0 | return false; |
55 | 16.7k | } |
56 | | |
57 | 0 | llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } |
58 | | |
59 | | bool SetTargetTriple(const lldb_private::ArchSpec &arch) override; |
60 | | |
61 | | bool SupportsEmulatingInstructionsOfType( |
62 | 0 | lldb_private::InstructionType inst_type) override { |
63 | 0 | return SupportsEmulatingInstructionsOfTypeStatic(inst_type); |
64 | 0 | } |
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 | 0 | lldb_private::OptionValueDictionary *test_data) override { |
73 | 0 | return false; |
74 | 0 | } |
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 |