summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/ThreadPlanTracer.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2012-02-21 00:09:25 +0000
committerGreg Clayton <gclayton@apple.com>2012-02-21 00:09:25 +0000
commit1ac04c308832f7a9b2e07e360f07c82f7cb2a02c (patch)
treebb908a56f1d08a946f4f25aa7b4b762066e1ec57 /lldb/source/Target/ThreadPlanTracer.cpp
parent3508a0054301ef24b8d8619351788698bcd97620 (diff)
downloadbcm5719-llvm-1ac04c308832f7a9b2e07e360f07c82f7cb2a02c.tar.gz
bcm5719-llvm-1ac04c308832f7a9b2e07e360f07c82f7cb2a02c.zip
Thread hardening part 3. Now lldb_private::Thread objects have std::weak_ptr
objects for the backlink to the lldb_private::Process. The issues we were running into before was someone was holding onto a shared pointer to a lldb_private::Thread for too long, and the lldb_private::Process parent object would get destroyed and the lldb_private::Thread had a "Process &m_process" member which would just treat whatever memory that used to be a Process as a valid Process. This was mostly happening for lldb_private::StackFrame objects that had a member like "Thread &m_thread". So this completes the internal strong/weak changes. Documented the ExecutionContext and ExecutionContextRef classes so that our LLDB developers can understand when and where to use ExecutionContext and ExecutionContextRef objects. llvm-svn: 151009
Diffstat (limited to 'lldb/source/Target/ThreadPlanTracer.cpp')
-rw-r--r--lldb/source/Target/ThreadPlanTracer.cpp36
1 files changed, 22 insertions, 14 deletions
diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp
index 1a3f0d4242d..ee5b8019067 100644
--- a/lldb/source/Target/ThreadPlanTracer.cpp
+++ b/lldb/source/Target/ThreadPlanTracer.cpp
@@ -55,7 +55,12 @@ ThreadPlanTracer::GetLogStream ()
if (m_stream_sp.get())
return m_stream_sp.get();
else
- return &m_thread.GetProcess().GetTarget().GetDebugger().GetOutputStream();
+ {
+ TargetSP target_sp (m_thread.CalculateTarget());
+ if (target_sp)
+ return &target_sp->GetDebugger().GetOutputStream();
+ }
+ return NULL;
}
void
@@ -109,7 +114,7 @@ Disassembler *
ThreadPlanAssemblyTracer::GetDisassembler ()
{
if (m_disassembler_ap.get() == NULL)
- m_disassembler_ap.reset(Disassembler::FindPlugin(m_thread.GetProcess().GetTarget().GetArchitecture(), NULL));
+ m_disassembler_ap.reset(Disassembler::FindPlugin(m_thread.GetProcess()->GetTarget().GetArchitecture(), NULL));
return m_disassembler_ap.get();
}
@@ -118,13 +123,16 @@ ThreadPlanAssemblyTracer::GetIntPointerType()
{
if (!m_intptr_type.IsValid ())
{
- Target &target = m_thread.GetProcess().GetTarget();
- Module *exe_module = target.GetExecutableModulePointer();
-
- if (exe_module)
+ TargetSP target_sp (m_thread.CalculateTarget());
+ if (target_sp)
{
- m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, m_thread.GetProcess().GetAddressByteSize() * 8),
- exe_module->GetClangASTContext().getASTContext());
+ Module *exe_module = target_sp->GetExecutableModulePointer();
+
+ if (exe_module)
+ {
+ m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, target_sp->GetArchitecture().GetAddressByteSize() * 8),
+ exe_module->GetClangASTContext().getASTContext());
+ }
}
}
return m_intptr_type;
@@ -173,11 +181,11 @@ ThreadPlanAssemblyTracer::Log ()
RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
lldb::addr_t pc = reg_ctx->GetPC();
- Process &process = m_thread.GetProcess();
+ ProcessSP process_sp (m_thread.GetProcess());
Address pc_addr;
bool addr_valid = false;
uint8_t buffer[16] = {0}; // Must be big enough for any single instruction
- addr_valid = process.GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
+ addr_valid = process_sp->GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
pc_addr.Dump(stream, &m_thread, Address::DumpStyleResolvedDescription, Address::DumpStyleModuleWithFileAddress);
stream->PutCString (" ");
@@ -186,13 +194,13 @@ ThreadPlanAssemblyTracer::Log ()
if (disassembler)
{
Error err;
- process.ReadMemory(pc, buffer, sizeof(buffer), err);
+ process_sp->ReadMemory(pc, buffer, sizeof(buffer), err);
if (err.Success())
{
DataExtractor extractor(buffer, sizeof(buffer),
- process.GetByteOrder(),
- process.GetAddressByteSize());
+ process_sp->GetByteOrder(),
+ process_sp->GetAddressByteSize());
if (addr_valid)
disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false);
@@ -217,7 +225,7 @@ ThreadPlanAssemblyTracer::Log ()
}
}
- const ABI *abi = process.GetABI().get();
+ const ABI *abi = process_sp->GetABI().get();
TypeFromUser intptr_type = GetIntPointerType();
if (abi && intptr_type.IsValid())
OpenPOWER on IntegriCloud