1//===-- EmulateInstructionPPC64.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_PPC64_EMULATEINSTRUCTIONPPC64_H
10#define LLDB_SOURCE_PLUGINS_INSTRUCTION_PPC64_EMULATEINSTRUCTIONPPC64_H
11
12#include "lldb/Core/EmulateInstruction.h"
13#include "lldb/Interpreter/OptionValue.h"
14#include "lldb/Utility/Log.h"
15#include <optional>
16
17namespace lldb_private {
18
19class EmulateInstructionPPC64 : public EmulateInstruction {
20public:
21 EmulateInstructionPPC64(const ArchSpec &arch);
22
23 static void Initialize();
24
25 static void Terminate();
26
27 static llvm::StringRef GetPluginNameStatic() { return "ppc64"; }
28
29 static llvm::StringRef GetPluginDescriptionStatic();
30
31 static EmulateInstruction *CreateInstance(const ArchSpec &arch,
32 InstructionType inst_type);
33
34 static bool
35 SupportsEmulatingInstructionsOfTypeStatic(InstructionType inst_type) {
36 switch (inst_type) {
37 case eInstructionTypeAny:
38 case eInstructionTypePrologueEpilogue:
39 return true;
40
41 case eInstructionTypePCModifying:
42 case eInstructionTypeAll:
43 return false;
44 }
45 return false;
46 }
47
48 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
49
50 bool SetTargetTriple(const ArchSpec &arch) override;
51
52 bool SupportsEmulatingInstructionsOfType(InstructionType inst_type) override {
53 return SupportsEmulatingInstructionsOfTypeStatic(inst_type);
54 }
55
56 bool ReadInstruction() override;
57
58 bool EvaluateInstruction(uint32_t evaluate_options) override;
59
60 bool TestEmulation(Stream &out_stream, ArchSpec &arch,
61 OptionValueDictionary *test_data) override {
62 return false;
63 }
64
65 std::optional<RegisterInfo> GetRegisterInfo(lldb::RegisterKind reg_kind,
66 uint32_t reg_num) override;
67
68 bool CreateFunctionEntryUnwind(UnwindPlan &unwind_plan) override;
69
70private:
71 struct Opcode {
72 uint32_t mask;
73 uint32_t value;
74 bool (EmulateInstructionPPC64::*callback)(uint32_t opcode);
75 const char *name;
76 };
77
78 uint32_t m_fp = LLDB_INVALID_REGNUM;
79
80 Opcode *GetOpcodeForInstruction(uint32_t opcode);
81
82 bool EmulateMFSPR(uint32_t opcode);
83 bool EmulateLD(uint32_t opcode);
84 bool EmulateSTD(uint32_t opcode);
85 bool EmulateOR(uint32_t opcode);
86 bool EmulateADDI(uint32_t opcode);
87};
88
89} // namespace lldb_private
90
91#endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_PPC64_EMULATEINSTRUCTIONPPC64_H
92

source code of lldb/source/Plugins/Instruction/PPC64/EmulateInstructionPPC64.h