summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2013-03-19 00:20:55 +0000
committerGreg Clayton <gclayton@apple.com>2013-03-19 00:20:55 +0000
commit9585fbfc67a8de61a87e98e6a1b989a1ed98e48d (patch)
treec343bd265584d82e6e354722d328758e14f541f9 /lldb/source/Target
parent8dfb68e0398ef48d41dc8ea058e9aa750b5fc85f (diff)
downloadbcm5719-llvm-9585fbfc67a8de61a87e98e6a1b989a1ed98e48d.tar.gz
bcm5719-llvm-9585fbfc67a8de61a87e98e6a1b989a1ed98e48d.zip
<rdar://problem/13443931>
Fixed a crasher in the SourceManager where it wasn't checking the m_target member variable for NULL. In doing this fix, I hardened this class to have weak pointers to the debugger and target in case they do go away. I also changed SBSourceManager to hold onto weak pointers to the debugger and target so they don't keep objects alive by holding a strong reference to them. llvm-svn: 177365
Diffstat (limited to 'lldb/source/Target')
-rw-r--r--lldb/source/Target/Target.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 9e9aa563f7d..b8b6c0c3216 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -27,6 +27,7 @@
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/Section.h"
+#include "lldb/Core/SourceManager.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Core/Timer.h"
#include "lldb/Core/ValueObject.h"
@@ -79,7 +80,7 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat
m_scratch_ast_source_ap (NULL),
m_ast_importer_ap (NULL),
m_persistent_variables (),
- m_source_manager(*this),
+ m_source_manager_ap(),
m_stop_hooks (),
m_stop_hook_next_id (0),
m_suppress_stop_hooks (false),
@@ -1908,6 +1909,15 @@ Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) c
return opcode_addr;
}
+SourceManager &
+Target::GetSourceManager ()
+{
+ if (m_source_manager_ap.get() == NULL)
+ m_source_manager_ap.reset (new SourceManager(shared_from_this()));
+ return *m_source_manager_ap;
+}
+
+
lldb::user_id_t
Target::AddStopHook (Target::StopHookSP &new_hook_sp)
{
OpenPOWER on IntegriCloud