[Lldb-commits] [lldb] r154535 - in /lldb/trunk: include/lldb/Core/Opcode.h source/API/SBInstruction.cpp source/Core/Opcode.cpp source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
Greg Clayton
gclayton at apple.com
Wed Apr 11 14:13:31 PDT 2012
Author: gclayton
Date: Wed Apr 11 16:13:31 2012
New Revision: 154535
URL: http://llvm.org/viewvc/llvm-project?rev=154535&view=rev
Log:
Cleaned up code that was getting SBData for an SBInstruction.
Modified:
lldb/trunk/include/lldb/Core/Opcode.h
lldb/trunk/source/API/SBInstruction.cpp
lldb/trunk/source/Core/Opcode.cpp
lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
Modified: lldb/trunk/include/lldb/Core/Opcode.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Opcode.h?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Opcode.h (original)
+++ lldb/trunk/include/lldb/Core/Opcode.h Wed Apr 11 16:13:31 2012
@@ -204,6 +204,9 @@
}
return 0;
}
+
+ uint32_t
+ GetData (DataExtractor &data) const;
protected:
Modified: lldb/trunk/source/API/SBInstruction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBInstruction.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/API/SBInstruction.cpp (original)
+++ lldb/trunk/source/API/SBInstruction.cpp Wed Apr 11 16:13:31 2012
@@ -139,19 +139,9 @@
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)
+ DataExtractorSP data_extractor_sp (new DataExtractor());
+ if (m_opaque_sp->GetOpcode().GetData (*data_extractor_sp))
{
- ByteOrder data_byte_order = opcode.GetDataByteOrder();
- TargetSP target_sp (target.GetSP());
- if (data_byte_order == eByteOrderInvalid && target_sp)
- data_byte_order = target_sp->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_sp ? target_sp->GetArchitecture().GetAddressByteSize() : sizeof(void*)));
sb_data.SetOpaque (data_extractor_sp);
}
}
Modified: lldb/trunk/source/Core/Opcode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Opcode.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/Core/Opcode.cpp (original)
+++ lldb/trunk/source/Core/Opcode.cpp Wed Apr 11 16:13:31 2012
@@ -13,6 +13,8 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
+#include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Stream.h"
#include "lldb/Host/Endian.h"
@@ -79,3 +81,36 @@
return eByteOrderInvalid;
}
+uint32_t
+Opcode::GetData (DataExtractor &data) const
+{
+ uint32_t byte_size = GetByteSize ();
+ DataBufferSP buffer_sp;
+ if (byte_size > 0)
+ {
+ switch (m_type)
+ {
+ case Opcode::eTypeInvalid:
+ break;
+
+ case Opcode::eType8: buffer_sp.reset (new DataBufferHeap (&m_data.inst8, byte_size)); break;
+ case Opcode::eType16: buffer_sp.reset (new DataBufferHeap (&m_data.inst16, byte_size)); break;
+ case Opcode::eType32: buffer_sp.reset (new DataBufferHeap (&m_data.inst32, byte_size)); break;
+ case Opcode::eType64: buffer_sp.reset (new DataBufferHeap (&m_data.inst64, byte_size)); break;
+ case Opcode::eTypeBytes:buffer_sp.reset (new DataBufferHeap (GetOpcodeBytes(), byte_size)); break;
+ break;
+ }
+ }
+
+ if (buffer_sp)
+ {
+ data.SetByteOrder(GetDataByteOrder());
+ data.SetData (buffer_sp);
+ return byte_size;
+ }
+ data.Clear();
+ return 0;
+}
+
+
+
Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Wed Apr 11 16:13:31 2012
@@ -207,49 +207,64 @@
uint32_t offset,
size_t inst_size)
{
- llvm::Triple::ArchType arch = m_disasm.GetArchitecture().GetMachine();
+ const ArchSpec &arch = m_disasm.GetArchitecture();
+ llvm::Triple::ArchType machine = arch.GetMachine();
- switch (arch)
+ switch (machine)
{
- default:
case llvm::Triple::x86:
case llvm::Triple::x86_64:
m_opcode.SetOpcodeBytes(extractor.PeekData(offset, inst_size), inst_size);
- break;
+ return;
+
case llvm::Triple::arm:
case llvm::Triple::thumb:
switch (inst_size)
{
case 2:
- {
- m_opcode.SetOpcode16 (extractor.GetU16 (&offset));
- break;
- }
+ m_opcode.SetOpcode16 (extractor.GetU16 (&offset));
break;
case 4:
+ if (machine == llvm::Triple::arm && m_address_class == eAddressClassCodeAlternateISA)
+ {
+ // If it is a 32-bit THUMB instruction, we need to swap the upper & lower halves.
+ uint32_t orig_bytes = extractor.GetU32 (&offset);
+ uint16_t upper_bits = (orig_bytes >> 16) & ((1u << 16) - 1);
+ uint16_t lower_bits = orig_bytes & ((1u << 16) - 1);
+ uint32_t swapped = (lower_bits << 16) | upper_bits;
+ m_opcode.SetOpcode32 (swapped);
+ }
+ else
{
- if (arch == llvm::Triple::arm &&
- m_address_class == eAddressClassCodeAlternateISA)
- {
- // If it is a 32-bit THUMB instruction, we need to swap the upper & lower halves.
- uint32_t orig_bytes = extractor.GetU32 (&offset);
- uint16_t upper_bits = (orig_bytes >> 16) & ((1u << 16) - 1);
- uint16_t lower_bits = orig_bytes & ((1u << 16) - 1);
- uint32_t swapped = (lower_bits << 16) | upper_bits;
- m_opcode.SetOpcode32 (swapped);
- }
- else
- {
- m_opcode.SetOpcode32 (extractor.GetU32 (&offset));
- }
+ m_opcode.SetOpcode32 (extractor.GetU32 (&offset));
}
break;
default:
assert (!"Invalid ARM opcode size");
break;
}
+ return;
+
+ default:
break;
}
+ // Handle the default cases here.
+ const uint32_t min_op_byte_size = arch.GetMinimumOpcodeByteSize();
+ const uint32_t max_op_byte_size = arch.GetMaximumOpcodeByteSize();
+ if (min_op_byte_size == max_op_byte_size)
+ {
+ assert (inst_size == min_op_byte_size);
+ switch (inst_size)
+ {
+ case 1: m_opcode.SetOpcode8 (extractor.GetU8 (&offset)); return;
+ case 2: m_opcode.SetOpcode16 (extractor.GetU16 (&offset)); return;
+ case 4: m_opcode.SetOpcode32 (extractor.GetU32 (&offset)); return;
+ case 8: m_opcode.SetOpcode64 (extractor.GetU64 (&offset)); return;
+ default:
+ break;
+ }
+ }
+ m_opcode.SetOpcodeBytes(extractor.PeekData(offset, inst_size), inst_size);
}
bool StringRepresentsBranch (const char *data, size_t size)
More information about the lldb-commits
mailing list