summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/ThreadPlanTracer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/ThreadPlanTracer.cpp')
-rw-r--r--lldb/source/Target/ThreadPlanTracer.cpp87
1 files changed, 46 insertions, 41 deletions
diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp
index 177fdab7d1e..1a3f0d4242d 100644
--- a/lldb/source/Target/ThreadPlanTracer.cpp
+++ b/lldb/source/Target/ThreadPlanTracer.cpp
@@ -91,45 +91,47 @@ ThreadPlanTracer::TracerExplainsStop ()
ThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread, lldb::StreamSP &stream_sp) :
ThreadPlanTracer (thread, stream_sp),
- m_process(thread.GetProcess()),
- m_target(thread.GetProcess().GetTarget())
+ m_disassembler_ap (),
+ m_intptr_type (),
+ m_register_values ()
{
- InitializeTracer ();
}
ThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread) :
ThreadPlanTracer (thread),
- m_process(thread.GetProcess()),
- m_target(thread.GetProcess().GetTarget())
+ m_disassembler_ap (),
+ m_intptr_type (),
+ m_register_values ()
{
- InitializeTracer ();
}
-void
-ThreadPlanAssemblyTracer::InitializeTracer()
+Disassembler *
+ThreadPlanAssemblyTracer::GetDisassembler ()
{
- Process &process = m_thread.GetProcess();
- Target &target = process.GetTarget();
-
- ArchSpec arch(target.GetArchitecture());
-
- m_disassembler = Disassembler::FindPlugin(arch, NULL);
-
- m_abi = process.GetABI().get();
-
- Module *exe_module = target.GetExecutableModulePointer();
-
- if (exe_module)
+ if (m_disassembler_ap.get() == NULL)
+ m_disassembler_ap.reset(Disassembler::FindPlugin(m_thread.GetProcess().GetTarget().GetArchitecture(), NULL));
+ return m_disassembler_ap.get();
+}
+
+TypeFromUser
+ThreadPlanAssemblyTracer::GetIntPointerType()
+{
+ if (!m_intptr_type.IsValid ())
{
- m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, arch.GetAddressByteSize() * 8),
- exe_module->GetClangASTContext().getASTContext());
+ Target &target = m_thread.GetProcess().GetTarget();
+ Module *exe_module = target.GetExecutableModulePointer();
+
+ if (exe_module)
+ {
+ m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, m_thread.GetProcess().GetAddressByteSize() * 8),
+ exe_module->GetClangASTContext().getASTContext());
+ }
}
-
- const unsigned int buf_size = 32;
-
- m_buffer_sp.reset(new DataBufferHeap(buf_size, 0));
+ return m_intptr_type;
}
+
+
ThreadPlanAssemblyTracer::~ThreadPlanAssemblyTracer()
{
}
@@ -171,33 +173,33 @@ ThreadPlanAssemblyTracer::Log ()
RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
lldb::addr_t pc = reg_ctx->GetPC();
+ Process &process = m_thread.GetProcess();
Address pc_addr;
bool addr_valid = false;
-
- addr_valid = m_process.GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
+ uint8_t buffer[16] = {0}; // Must be big enough for any single instruction
+ addr_valid = process.GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
pc_addr.Dump(stream, &m_thread, Address::DumpStyleResolvedDescription, Address::DumpStyleModuleWithFileAddress);
stream->PutCString (" ");
- if (m_disassembler)
+ Disassembler *disassembler = GetDisassembler();
+ if (disassembler)
{
- ::memset(m_buffer_sp->GetBytes(), 0, m_buffer_sp->GetByteSize());
-
Error err;
- m_process.ReadMemory(pc, m_buffer_sp->GetBytes(), m_buffer_sp->GetByteSize(), err);
+ process.ReadMemory(pc, buffer, sizeof(buffer), err);
if (err.Success())
{
- DataExtractor extractor(m_buffer_sp,
- m_process.GetByteOrder(),
- m_process.GetAddressByteSize());
+ DataExtractor extractor(buffer, sizeof(buffer),
+ process.GetByteOrder(),
+ process.GetAddressByteSize());
if (addr_valid)
- m_disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false);
+ disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false);
else
- m_disassembler->DecodeInstructions (Address (NULL, pc), extractor, 0, 1, false);
+ disassembler->DecodeInstructions (Address (NULL, pc), extractor, 0, 1, false);
- InstructionList &instruction_list = m_disassembler->GetInstructionList();
+ InstructionList &instruction_list = disassembler->GetInstructionList();
const uint32_t max_opcode_byte_size = instruction_list.GetMaxOpcocdeByteSize();
if (instruction_list.GetSize())
@@ -215,7 +217,10 @@ ThreadPlanAssemblyTracer::Log ()
}
}
- if (m_abi && m_intptr_type.GetOpaqueQualType())
+ const ABI *abi = process.GetABI().get();
+ TypeFromUser intptr_type = GetIntPointerType();
+
+ if (abi && intptr_type.IsValid())
{
ValueList value_list;
const int num_args = 1;
@@ -224,11 +229,11 @@ ThreadPlanAssemblyTracer::Log ()
{
Value value;
value.SetValueType (Value::eValueTypeScalar);
- value.SetContext (Value::eContextTypeClangType, m_intptr_type.GetOpaqueQualType());
+ value.SetContext (Value::eContextTypeClangType, intptr_type.GetOpaqueQualType());
value_list.PushValue (value);
}
- if (m_abi->GetArgumentValues (m_thread, value_list))
+ if (abi->GetArgumentValues (m_thread, value_list))
{
for (int arg_index = 0; arg_index < num_args; ++arg_index)
{
OpenPOWER on IntegriCloud