Coverage Report

Created: 2023-09-30 09:22

/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