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 
17 namespace lldb_private {
18 
19 class EmulateInstructionPPC64 : public EmulateInstruction {
20 public:
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 
70 private:
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