diff options
Diffstat (limited to 'lldb/source/API/SBInstruction.cpp')
-rw-r--r-- | lldb/source/API/SBInstruction.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lldb/source/API/SBInstruction.cpp b/lldb/source/API/SBInstruction.cpp index 0be59af2f98..d708aa035d9 100644 --- a/lldb/source/API/SBInstruction.cpp +++ b/lldb/source/API/SBInstruction.cpp @@ -16,6 +16,7 @@ #include "lldb/API/SBTarget.h" #include "lldb/Core/ArchSpec.h" +#include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/EmulateInstruction.h" #include "lldb/Core/StreamFile.h" @@ -67,6 +68,60 @@ SBInstruction::GetAddress() return sb_addr; } +const char * +SBInstruction::GetOpcodeName(SBTarget target) +{ + if (m_opaque_sp) + { + Mutex::Locker api_locker; + ExecutionContext exe_ctx; + if (target.IsValid()) + { + api_locker.Reset (target->GetAPIMutex().GetMutex()); + target->CalculateExecutionContext (exe_ctx); + exe_ctx.SetProcessSP(target->GetProcessSP()); + } + return m_opaque_sp->GetOpcodeName(exe_ctx.GetBestExecutionContextScope()); + } + return NULL; +} + +const char * +SBInstruction::GetMnemonics(SBTarget target) +{ + if (m_opaque_sp) + { + Mutex::Locker api_locker; + ExecutionContext exe_ctx; + if (target.IsValid()) + { + api_locker.Reset (target->GetAPIMutex().GetMutex()); + target->CalculateExecutionContext (exe_ctx); + exe_ctx.SetProcessSP(target->GetProcessSP()); + } + return m_opaque_sp->GetMnemonics(exe_ctx.GetBestExecutionContextScope()); + } + return NULL; +} + +const char * +SBInstruction::GetComment(SBTarget target) +{ + if (m_opaque_sp) + { + Mutex::Locker api_locker; + ExecutionContext exe_ctx; + if (target.IsValid()) + { + api_locker.Reset (target->GetAPIMutex().GetMutex()); + target->CalculateExecutionContext (exe_ctx); + exe_ctx.SetProcessSP(target->GetProcessSP()); + } + return m_opaque_sp->GetComment(exe_ctx.GetBestExecutionContextScope()); + } + return NULL; +} + size_t SBInstruction::GetByteSize () { @@ -75,6 +130,32 @@ SBInstruction::GetByteSize () return 0; } +SBData +SBInstruction::GetData (SBTarget target) +{ + lldb::SBData sb_data; + if (m_opaque_sp) + { + const Opcode &opcode = m_opaque_sp->GetOpcode(); + const void *opcode_data = opcode.GetOpcodeBytes(); + const uint32_t opcode_data_size = opcode.GetByteSize(); + if (opcode_data && opcode_data_size > 0) + { + ByteOrder data_byte_order = opcode.GetDataByteOrder(); + if (data_byte_order == eByteOrderInvalid) + data_byte_order = target->GetArchitecture().GetByteOrder(); + DataBufferSP data_buffer_sp (new DataBufferHeap (opcode_data, opcode_data_size)); + DataExtractorSP data_extractor_sp (new DataExtractor (data_buffer_sp, + data_byte_order, + target.IsValid() ? target->GetArchitecture().GetAddressByteSize() : sizeof(void*))); + sb_data.SetOpaque (data_extractor_sp); + } + } + return sb_data; +} + + + bool SBInstruction::DoesBranch () { |