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