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 EmulateInstructionPPC64_h_
10 #define 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 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 
71 private:
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 // EmulateInstructionPPC64_h_
93