Fixes the case where we created a dummy target, deleted it, and then tried to evaluat...
authorFilipe Cabecinhas <me@filcab.net>
Sat, 19 May 2012 09:59:08 +0000 (09:59 +0000)
committerFilipe Cabecinhas <me@filcab.net>
Sat, 19 May 2012 09:59:08 +0000 (09:59 +0000)
llvm-svn: 157110

lldb/include/lldb/Target/Target.h
lldb/source/API/SBTarget.cpp
lldb/source/Host/common/Host.cpp
lldb/source/Target/Target.cpp

index 00aedfe..ab5205b 100644 (file)
@@ -414,6 +414,12 @@ public:
     const lldb::ProcessSP &
     GetProcessSP () const;
 
+    bool
+    IsValid()
+    {
+        return m_valid;
+    }
+
     void
     Destroy();
 
@@ -1156,6 +1162,7 @@ protected:
     // we can correctly tear down everything that we need to, so the only
     // class that knows about the process lifespan is this target class.
     lldb::ProcessSP m_process_sp;
+    bool m_valid;
     lldb::SearchFilterSP  m_search_filter_sp;
     PathMappingList m_image_search_paths;
     std::auto_ptr<ClangASTContext> m_scratch_ast_context_ap;
index 1ec6397..d1275e6 100644 (file)
@@ -502,7 +502,7 @@ SBTarget::GetBroadcasterClassName ()
 bool
 SBTarget::IsValid () const
 {
-    return m_opaque_sp.get() != NULL;
+    return m_opaque_sp.get() != NULL && m_opaque_sp->IsValid();
 }
 
 SBProcess
index 1e3cb0a..7fda1b7 100644 (file)
@@ -1227,19 +1227,23 @@ Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
 lldb::TargetSP
 Host::GetDummyTarget (lldb_private::Debugger &debugger)
 {
-    lldb::TargetSP dummy_target_sp;
-
-    ArchSpec arch(Target::GetDefaultArchitecture());
-    if (!arch.IsValid())
-        arch = Host::GetArchitecture ();
-    Error err = debugger.GetTargetList().CreateTarget(debugger, 
-                                                      FileSpec(), 
-                                                      arch.GetTriple().getTriple().c_str(),
-                                                      false, 
-                                                      NULL, 
-                                                      dummy_target_sp);
-
-    return dummy_target_sp;
+    static TargetSP g_dummy_target_sp;
+
+    // FIXME: Maybe the dummy target should be per-Debugger
+    if (!g_dummy_target_sp || !g_dummy_target_sp->IsValid())
+    {
+        ArchSpec arch(Target::GetDefaultArchitecture());
+        if (!arch.IsValid())
+            arch = Host::GetArchitecture ();
+        Error err = debugger.GetTargetList().CreateTarget(debugger, 
+                                                          FileSpec(), 
+                                                          arch.GetTriple().getTriple().c_str(),
+                                                          false, 
+                                                          NULL, 
+                                                          g_dummy_target_sp);
+    }
+
+    return g_dummy_target_sp;
 }
 
 struct ShellInfo
index a1caed4..5fe1f5e 100644 (file)
@@ -64,6 +64,7 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat
     m_internal_breakpoint_list (true),
     m_watchpoint_list (),
     m_process_sp (),
+    m_valid (true),
     m_search_filter_sp (),
     m_image_search_paths (ImageSearchPathsChanged, this),
     m_scratch_ast_context_ap (NULL),
@@ -165,6 +166,7 @@ void
 Target::Destroy()
 {
     Mutex::Locker locker (m_mutex);
+    m_valid = false;
     DeleteCurrentProcess ();
     m_platform_sp.reset();
     m_arch.Clear();