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 
16 namespace lldb_private {
17 
18 class EmulateInstructionPPC64 : public EmulateInstruction {
19 public:
20   EmulateInstructionPPC64(const ArchSpec &arch);
21 
22   static void Initialize();
23 
24   static void Terminate();
25 
26   static llvm::StringRef GetPluginNameStatic() { return "ppc64"; }
27 
28   static llvm::StringRef 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   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
48 
49   bool SetTargetTriple(const ArchSpec &arch) override;
50 
51   bool SupportsEmulatingInstructionsOfType(InstructionType inst_type) override {
52     return SupportsEmulatingInstructionsOfTypeStatic(inst_type);
53   }
54 
55   bool ReadInstruction() override;
56 
57   bool EvaluateInstruction(uint32_t evaluate_options) override;
58 
59   bool TestEmulation(Stream *out_stream, ArchSpec &arch,
60                      OptionValueDictionary *test_data) override {
61     return false;
62   }
63 
64   bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num,
65                        RegisterInfo &reg_info) override;
66 
67   bool CreateFunctionEntryUnwind(UnwindPlan &unwind_plan) override;
68 
69 private:
70   struct Opcode {
71     uint32_t mask;
72     uint32_t value;
73     bool (EmulateInstructionPPC64::*callback)(uint32_t opcode);
74     const char *name;
75   };
76 
77   uint32_t m_fp = LLDB_INVALID_REGNUM;
78 
79   Opcode *GetOpcodeForInstruction(uint32_t opcode);
80 
81   bool EmulateMFSPR(uint32_t opcode);
82   bool EmulateLD(uint32_t opcode);
83   bool EmulateSTD(uint32_t opcode);
84   bool EmulateOR(uint32_t opcode);
85   bool EmulateADDI(uint32_t opcode);
86 };
87 
88 } // namespace lldb_private
89 
90 #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_PPC64_EMULATEINSTRUCTIONPPC64_H
91