Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Instruction/LoongArch/EmulateInstructionLoongArch.h
39646 views
1
//===---EmulateInstructionLoongArch.h--------------------------------------===//
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_LOONGARCH_EMULATEINSTRUCTIONLOONGARCH_H
10
#define LLDB_SOURCE_PLUGINS_INSTRUCTION_LOONGARCH_EMULATEINSTRUCTIONLOONGARCH_H
11
12
#include "lldb/Core/EmulateInstruction.h"
13
#include "lldb/Interpreter/OptionValue.h"
14
#include "lldb/Utility/Log.h"
15
#include "lldb/Utility/Status.h"
16
#include <optional>
17
18
namespace lldb_private {
19
20
class EmulateInstructionLoongArch : public EmulateInstruction {
21
public:
22
static llvm::StringRef GetPluginNameStatic() { return "LoongArch"; }
23
24
static llvm::StringRef GetPluginDescriptionStatic() {
25
return "Emulate instructions for the LoongArch architecture.";
26
}
27
28
static bool SupportsThisInstructionType(InstructionType inst_type) {
29
return inst_type == eInstructionTypePCModifying;
30
}
31
32
static bool SupportsThisArch(const ArchSpec &arch);
33
34
static lldb_private::EmulateInstruction *
35
CreateInstance(const lldb_private::ArchSpec &arch, InstructionType inst_type);
36
37
static void Initialize();
38
39
static void Terminate();
40
41
public:
42
EmulateInstructionLoongArch(const ArchSpec &arch) : EmulateInstruction(arch) {
43
m_arch_subtype = arch.GetMachine();
44
}
45
46
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
47
48
bool SupportsEmulatingInstructionsOfType(InstructionType inst_type) override {
49
return SupportsThisInstructionType(inst_type);
50
}
51
52
bool SetTargetTriple(const ArchSpec &arch) override;
53
bool ReadInstruction() override;
54
bool EvaluateInstruction(uint32_t options) override;
55
bool TestEmulation(Stream &out_stream, ArchSpec &arch,
56
OptionValueDictionary *test_data) override;
57
58
std::optional<RegisterInfo> GetRegisterInfo(lldb::RegisterKind reg_kind,
59
uint32_t reg_num) override;
60
lldb::addr_t ReadPC(bool *success);
61
bool WritePC(lldb::addr_t pc);
62
bool IsLoongArch64() { return m_arch_subtype == llvm::Triple::loongarch64; }
63
bool TestExecute(uint32_t inst);
64
65
private:
66
struct Opcode {
67
uint32_t mask;
68
uint32_t value;
69
bool (EmulateInstructionLoongArch::*callback)(uint32_t opcode);
70
const char *name;
71
};
72
73
llvm::Triple::ArchType m_arch_subtype;
74
Opcode *GetOpcodeForInstruction(uint32_t inst);
75
76
bool EmulateBEQZ(uint32_t inst);
77
bool EmulateBNEZ(uint32_t inst);
78
bool EmulateBCEQZ(uint32_t inst);
79
bool EmulateBCNEZ(uint32_t inst);
80
bool EmulateJIRL(uint32_t inst);
81
bool EmulateB(uint32_t inst);
82
bool EmulateBL(uint32_t inst);
83
bool EmulateBEQ(uint32_t inst);
84
bool EmulateBNE(uint32_t inst);
85
bool EmulateBLT(uint32_t inst);
86
bool EmulateBGE(uint32_t inst);
87
bool EmulateBLTU(uint32_t inst);
88
bool EmulateBGEU(uint32_t inst);
89
bool EmulateNonJMP(uint32_t inst);
90
91
bool EmulateBEQZ64(uint32_t inst);
92
bool EmulateBNEZ64(uint32_t inst);
93
bool EmulateBCEQZ64(uint32_t inst);
94
bool EmulateBCNEZ64(uint32_t inst);
95
bool EmulateJIRL64(uint32_t inst);
96
bool EmulateB64(uint32_t inst);
97
bool EmulateBL64(uint32_t inst);
98
bool EmulateBEQ64(uint32_t inst);
99
bool EmulateBNE64(uint32_t inst);
100
bool EmulateBLT64(uint32_t inst);
101
bool EmulateBGE64(uint32_t inst);
102
bool EmulateBLTU64(uint32_t inst);
103
bool EmulateBGEU64(uint32_t inst);
104
};
105
106
} // namespace lldb_private
107
108
#endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_LOONGARCH_EMULATEINSTRUCTIONLOONGARCH_H
109
110