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 ®_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