diff options
author | Greg Clayton <gclayton@apple.com> | 2012-02-21 00:09:25 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-02-21 00:09:25 +0000 |
commit | 1ac04c308832f7a9b2e07e360f07c82f7cb2a02c (patch) | |
tree | bb908a56f1d08a946f4f25aa7b4b762066e1ec57 /lldb/source/Target/ThreadPlanTracer.cpp | |
parent | 3508a0054301ef24b8d8619351788698bcd97620 (diff) | |
download | bcm5719-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.cpp | 36 |
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()) |