diff options
3 files changed, 98 insertions, 5 deletions
diff --git a/lldb/source/Plugins/Process/Utility/EmulateInstruction.h b/lldb/source/Plugins/Process/Utility/EmulateInstruction.h index d3f21d43d28..f3ea42f1e72 100644 --- a/lldb/source/Plugins/Process/Utility/EmulateInstruction.h +++ b/lldb/source/Plugins/Process/Utility/EmulateInstruction.h @@ -11,7 +11,7 @@ #define lldb_EmulateInstruction_h_ #include "lldb/lldb-include.h" - +#include "lldb/Core/PluginInterface.h" //---------------------------------------------------------------------- /// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h" @@ -75,9 +75,14 @@ namespace lldb_private { -class EmulateInstruction +class EmulateInstruction : + public PluginInterface { -public: +public: + + static Disassembler* + FindPlugin (const ArchSpec &arch); + enum ContextType { eContextInvalid = 0, @@ -188,6 +193,9 @@ public: { } + virtual bool + SetTargetTriple (const ConstString &triple) = 0; + virtual bool ReadInstruction () = 0; diff --git a/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.cpp b/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.cpp index 2f6f8cdd18c..4495acb95d7 100644 --- a/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.cpp +++ b/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.cpp @@ -10,6 +10,7 @@ #include "EmulateInstructionARM.h" #include "ARMDefines.h" #include "ARMUtils.h" +#include "lldb/Core/ConstString.h" using namespace lldb; using namespace lldb_private; @@ -881,6 +882,44 @@ static ARMOpcode g_thumb_opcodes[] = static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); static const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); +bool +EmulateInstructionARM::SetTargetTriple (const ConstString &triple) +{ + m_arm_isa = 0; + const char *triple_cstr = triple.GetCString(); + if (triple_cstr) + { + const char *dash = ::strchr (triple_cstr, '-'); + if (dash) + { + std::string arch (triple_cstr, dash); + const char *arch_cstr = arch.c_str(); + if (strcasecmp(arch_cstr, "armv4t") == 0) + m_arm_isa = ARMv4T; + else if (strcasecmp(arch_cstr, "armv4") == 0) + m_arm_isa = ARMv4; + else if (strcasecmp(arch_cstr, "armv5tej") == 0) + m_arm_isa = ARMv5TEJ; + else if (strcasecmp(arch_cstr, "armv5te") == 0) + m_arm_isa = ARMv5TE; + else if (strcasecmp(arch_cstr, "armv5t") == 0) + m_arm_isa = ARMv5T; + else if (strcasecmp(arch_cstr, "armv6k") == 0) + m_arm_isa = ARMv6K; + else if (strcasecmp(arch_cstr, "armv6") == 0) + m_arm_isa = ARMv6; + else if (strcasecmp(arch_cstr, "armv6t2") == 0) + m_arm_isa = ARMv6T2; + else if (strcasecmp(arch_cstr, "armv7") == 0) + m_arm_isa = ARMv7; + else if (strcasecmp(arch_cstr, "armv8") == 0) + m_arm_isa = ARMv8; + } + } + return m_arm_isa != 0; +} + + bool EmulateInstructionARM::ReadInstruction () { diff --git a/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.h b/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.h index 5e592aed85a..3ec5b5ebdd0 100644 --- a/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.h +++ b/lldb/source/Plugins/Process/Utility/EmulateInstructionARM.h @@ -13,11 +13,51 @@ #include "EmulateInstruction.h" #include "ARM_DWARF_Registers.h" +#include "lldb/Core/Error.h" + namespace lldb_private { class EmulateInstructionARM : public EmulateInstruction { public: + + virtual const char * + GetPluginName() + { + return "EmulateInstructionARM"; + } + + virtual const char * + GetShortPluginName() + { + return "lldb.emulate-instruction.arm"; + } + + virtual uint32_t + GetPluginVersion() + { + return 1; + } + + virtual void + GetPluginCommandHelp (const char *command, Stream *strm) + { + } + + virtual lldb_private::Error + ExecutePluginCommand (Args &command, Stream *strm) + { + Error error; + error.SetErrorString("no plug-in commands are supported"); + return error; + } + + virtual Log * + EnablePluginLogging (Stream *strm, Args &command) + { + return NULL; + } + enum Mode { eModeInvalid, @@ -37,9 +77,15 @@ public: write_mem_callback, read_reg_callback, write_reg_callback), - m_inst_mode (eModeInvalid) + m_arm_isa (0), + m_inst_mode (eModeInvalid), + m_inst_cpsr (0) { } + + + virtual bool + SetTargetTriple (const ConstString &triple); virtual bool ReadInstruction (); @@ -54,7 +100,7 @@ public: CurrentCond (); protected: - + uint32_t m_arm_isa; Mode m_inst_mode; uint32_t m_inst_cpsr; |