]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Instruction/PPC64/EmulateInstructionPPC64.h
Fix a memory leak in if_delgroups() introduced in r334118.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Instruction / PPC64 / EmulateInstructionPPC64.h
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_