[Lldb-commits] [lldb] r252665 - Made the ClangASTImporter into a shared pointer, eliminating a race condition.

Sean Callanan via lldb-commits lldb-commits at lists.llvm.org
Tue Nov 10 14:54:43 PST 2015


Author: spyffe
Date: Tue Nov 10 16:54:42 2015
New Revision: 252665

URL: http://llvm.org/viewvc/llvm-project?rev=252665&view=rev
Log:
Made the ClangASTImporter into a shared pointer, eliminating a race condition.

It used to be a unique pointer, and there could be a case where ClangASTSource
held onto a copy of the pointer but Target::Destroy destroyed the unique pointer
in the mean time.

I also ensured that there is a validity check on the target (which confirms that
a ClangASTImporter can be generated) before the target's shared pointer is
copied into ClangASTSource.

This race condition caused a crash if Target::Destroy was called and then later
the target objecct was deleted.

Modified:
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/include/lldb/lldb-forward.h
    lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
    lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
    lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
    lldb/trunk/source/Symbol/ClangASTContext.cpp
    lldb/trunk/source/Target/Target.cpp

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Tue Nov 10 16:54:42 2015
@@ -1287,7 +1287,7 @@ public:
     ClangASTContext *
     GetScratchClangASTContext(bool create_on_demand=true);
     
-    ClangASTImporter *
+    lldb::ClangASTImporterSP
     GetClangASTImporter();
     
     //----------------------------------------------------------------------
@@ -1568,7 +1568,7 @@ protected:
     typedef std::map<lldb::LanguageType, lldb::REPLSP> REPLMap;
     REPLMap m_repl_map;
     
-    lldb::ClangASTImporterUP m_ast_importer_ap;
+    lldb::ClangASTImporterSP m_ast_importer_sp;
     lldb::ClangModulesDeclVendorUP m_clang_modules_decl_vendor_ap;
 
     lldb::SourceManagerUP m_source_manager_ap;

Modified: lldb/trunk/include/lldb/lldb-forward.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Tue Nov 10 16:54:42 2015
@@ -310,7 +310,7 @@ namespace lldb {
     typedef std::shared_ptr<lldb_private::BreakpointResolver> BreakpointResolverSP;
     typedef std::shared_ptr<lldb_private::Broadcaster> BroadcasterSP;
     typedef std::unique_ptr<lldb_private::ClangASTContext> ClangASTContextUP;
-    typedef std::unique_ptr<lldb_private::ClangASTImporter> ClangASTImporterUP;
+    typedef std::shared_ptr<lldb_private::ClangASTImporter> ClangASTImporterSP;
     typedef std::unique_ptr<lldb_private::ClangModulesDeclVendor> ClangModulesDeclVendorUP;
     typedef std::unique_ptr<lldb_private::ClangPersistentVariables> ClangPersistentVariablesUP;
     typedef std::shared_ptr<lldb_private::UserExpression> UserExpressionSP;

Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp (original)
+++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp Tue Nov 10 16:54:42 2015
@@ -57,7 +57,7 @@ namespace {
 
 ClangASTSource::~ClangASTSource()
 {
-    m_ast_importer->ForgetDestination(m_ast_context);
+    m_ast_importer_sp->ForgetDestination(m_ast_context);
 
     // We are in the process of destruction, don't create clang ast context on demand
     // by passing false to Target::GetScratchClangASTContext(create_on_demand).
@@ -72,7 +72,7 @@ ClangASTSource::~ClangASTSource()
         return;
 
     if (m_ast_context != scratch_ast_context)
-        m_ast_importer->ForgetSource(scratch_ast_context, m_ast_context);
+        m_ast_importer_sp->ForgetSource(scratch_ast_context, m_ast_context);
 }
 
 void
@@ -221,7 +221,7 @@ ClangASTSource::CompleteType (TagDecl *t
     m_active_lexical_decls.insert(tag_decl);
     ScopedLexicalDeclEraser eraser(m_active_lexical_decls, tag_decl);
 
-    if (!m_ast_importer->CompleteTagDecl (tag_decl))
+    if (!m_ast_importer_sp->CompleteTagDecl (tag_decl))
     {
         // We couldn't complete the type.  Maybe there's a definition
         // somewhere else that can be completed.
@@ -235,7 +235,7 @@ ClangASTSource::CompleteType (TagDecl *t
 
         if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(decl_ctx))
         {
-            ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
+            ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer_sp->GetNamespaceMap(namespace_context);
 
             if (log && log->GetVerbose())
                 log->Printf("      CTD[%u] Inspecting namespace map %p (%d entries)",
@@ -283,7 +283,7 @@ ClangASTSource::CompleteType (TagDecl *t
 
                     TagDecl *candidate_tag_decl = const_cast<TagDecl*>(tag_type->getDecl());
 
-                    if (m_ast_importer->CompleteTagDeclWithOrigin (tag_decl, candidate_tag_decl))
+                    if (m_ast_importer_sp->CompleteTagDeclWithOrigin (tag_decl, candidate_tag_decl))
                         found = true;
                 }
             }
@@ -322,7 +322,7 @@ ClangASTSource::CompleteType (TagDecl *t
 
                 TagDecl *candidate_tag_decl = const_cast<TagDecl*>(tag_type->getDecl());
 
-                if (m_ast_importer->CompleteTagDeclWithOrigin (tag_decl, candidate_tag_decl))
+                if (m_ast_importer_sp->CompleteTagDeclWithOrigin (tag_decl, candidate_tag_decl))
                     found = true;
             }
         }
@@ -354,7 +354,7 @@ ClangASTSource::CompleteType (clang::Obj
     Decl *original_decl = NULL;
     ASTContext *original_ctx = NULL;
 
-    if (m_ast_importer->ResolveDeclOrigin(interface_decl, &original_decl, &original_ctx))
+    if (m_ast_importer_sp->ResolveDeclOrigin(interface_decl, &original_decl, &original_ctx))
     {
         if (ObjCInterfaceDecl *original_iface_decl = dyn_cast<ObjCInterfaceDecl>(original_decl))
         {
@@ -362,12 +362,12 @@ ClangASTSource::CompleteType (clang::Obj
 
             if (complete_iface_decl && (complete_iface_decl != original_iface_decl))
             {
-                m_ast_importer->SetDeclOrigin(interface_decl, original_iface_decl);
+                m_ast_importer_sp->SetDeclOrigin(interface_decl, original_iface_decl);
             }
         }
     }
 
-    m_ast_importer->CompleteObjCInterfaceDecl (interface_decl);
+    m_ast_importer_sp->CompleteObjCInterfaceDecl (interface_decl);
 
     if (interface_decl->getSuperClass() &&
         interface_decl->getSuperClass() != interface_decl)
@@ -462,7 +462,7 @@ ClangASTSource::FindExternalLexicalDecls
     Decl *original_decl = NULL;
     ASTContext *original_ctx = NULL;
 
-    if (!m_ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
+    if (!m_ast_importer_sp->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
         return;
 
     if (log)
@@ -482,7 +482,7 @@ ClangASTSource::FindExternalLexicalDecls
             original_decl = complete_iface_decl;
             original_ctx = &complete_iface_decl->getASTContext();
 
-            m_ast_importer->SetDeclOrigin(context_decl, original_iface_decl);
+            m_ast_importer_sp->SetDeclOrigin(context_decl, original_iface_decl);
         }
     }
 
@@ -516,7 +516,7 @@ ClangASTSource::FindExternalLexicalDecls
                     log->Printf("  FELD[%d] Adding lexical %sDecl %s", current_id, decl->getDeclKindName(), ast_dumper.GetCString());
             }
             
-            Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, original_ctx, decl);
+            Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, original_ctx, decl);
 
             if (!copied_decl)
                 continue;
@@ -525,7 +525,7 @@ ClangASTSource::FindExternalLexicalDecls
             {
                 QualType copied_field_type = copied_field->getType();
 
-                m_ast_importer->RequireCompleteType(copied_field_type);
+                m_ast_importer_sp->RequireCompleteType(copied_field_type);
             }
 
             DeclContext *decl_context_non_const = const_cast<DeclContext *>(decl_context);
@@ -581,7 +581,7 @@ ClangASTSource::FindExternalVisibleDecls
 
     if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
     {
-        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
+        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer_sp->GetNamespaceMap(namespace_context);
 
         if (log && log->GetVerbose())
             log->Printf("  CAS::FEVD[%u] Inspecting namespace map %p (%d entries)",
@@ -813,7 +813,7 @@ ClangASTSource::FindExternalVisibleDecls
                         llvm::isa<clang::ObjCContainerDecl>(decl_from_modules) ||
                         llvm::isa<clang::EnumConstantDecl>(decl_from_modules))
                     {
-                        clang::Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
+                        clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
                         clang::NamedDecl *copied_named_decl = copied_decl ? dyn_cast<clang::NamedDecl>(copied_decl) : nullptr;
                         
                         if (!copied_named_decl)
@@ -871,7 +871,7 @@ ClangASTSource::FindExternalVisibleDecls
                                 name.GetCString());
                 }
                 
-                clang::Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, &decls[0]->getASTContext(), decls[0]);
+                clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decls[0]->getASTContext(), decls[0]);
                 clang::NamedDecl *copied_named_decl = copied_decl ? dyn_cast<clang::NamedDecl>(copied_decl) : nullptr;
                 
                 if (!copied_named_decl)
@@ -1066,7 +1066,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
         Decl *original_decl = NULL;
         ASTContext *original_ctx = NULL;
 
-        m_ast_importer->ResolveDeclOrigin(interface_decl, &original_decl, &original_ctx);
+        m_ast_importer_sp->ResolveDeclOrigin(interface_decl, &original_decl, &original_ctx);
 
         if (!original_decl)
             break;
@@ -1077,7 +1077,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
                                           context,
                                           original_interface_decl,
                                           m_ast_context,
-                                          m_ast_importer,
+                                          m_ast_importer_sp.get(),
                                           "at origin"))
             return; // found it, no need to look any further
     } while (0);
@@ -1224,7 +1224,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
 
             if (found_interface_decl->getName() == interface_decl->getName())
             {
-                Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, &method_decl->getASTContext(), method_decl);
+                Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &method_decl->getASTContext(), method_decl);
 
                 if (!copied_decl)
                     continue;
@@ -1272,7 +1272,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
                                       context,
                                       complete_interface_decl,
                                       m_ast_context,
-                                      m_ast_importer,
+                                      m_ast_importer_sp.get(),
                                       "in debug info");
 
         return;
@@ -1305,7 +1305,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
                                               context,
                                               interface_decl_from_modules,
                                               m_ast_context,
-                                              m_ast_importer,
+                                              m_ast_importer_sp.get(),
                                               "in modules"))
                 return;
         }
@@ -1351,7 +1351,7 @@ ClangASTSource::FindObjCMethodDecls (Nam
                                       context,
                                       runtime_interface_decl,
                                       m_ast_context,
-                                      m_ast_importer,
+                                      m_ast_importer_sp.get(),
                                       "in runtime");
     }
     while(0);
@@ -1423,7 +1423,7 @@ ClangASTSource::FindObjCPropertyAndIvarD
     unsigned int current_id = invocation_id++;
 
     DeclFromParser<const ObjCInterfaceDecl> parser_iface_decl(cast<ObjCInterfaceDecl>(context.m_decl_context));
-    DeclFromUser<const ObjCInterfaceDecl> origin_iface_decl(parser_iface_decl.GetOrigin(m_ast_importer));
+    DeclFromUser<const ObjCInterfaceDecl> origin_iface_decl(parser_iface_decl.GetOrigin(m_ast_importer_sp.get()));
 
     ConstString class_name(parser_iface_decl->getNameAsString().c_str());
 
@@ -1436,7 +1436,7 @@ ClangASTSource::FindObjCPropertyAndIvarD
     if (FindObjCPropertyAndIvarDeclsWithOrigin(current_id,
                                                context,
                                                *m_ast_context,
-                                               m_ast_importer,
+                                               m_ast_importer_sp.get(),
                                                origin_iface_decl))
         return;
 
@@ -1471,7 +1471,7 @@ ClangASTSource::FindObjCPropertyAndIvarD
         FindObjCPropertyAndIvarDeclsWithOrigin(current_id,
                                                context,
                                                *m_ast_context,
-                                               m_ast_importer,
+                                               m_ast_importer_sp.get(),
                                                complete_iface_decl);
 
         return;
@@ -1511,7 +1511,7 @@ ClangASTSource::FindObjCPropertyAndIvarD
         if (FindObjCPropertyAndIvarDeclsWithOrigin(current_id,
                                                    context,
                                                    *m_ast_context,
-                                                   m_ast_importer,
+                                                   m_ast_importer_sp.get(),
                                                    interface_decl_from_modules))
             return;
     }
@@ -1561,7 +1561,7 @@ ClangASTSource::FindObjCPropertyAndIvarD
         if (FindObjCPropertyAndIvarDeclsWithOrigin(current_id,
                                                    context,
                                                    *m_ast_context,
-                                                   m_ast_importer,
+                                                   m_ast_importer_sp.get(),
                                                    interface_decl_from_runtime))
             return;
     }
@@ -1664,7 +1664,7 @@ ClangASTSource::layoutRecordType(const R
                     record->getNameAsString().c_str());
 
     DeclFromParser <const RecordDecl> parser_record(record);
-    DeclFromUser <const RecordDecl> origin_record(parser_record.GetOrigin(m_ast_importer));
+    DeclFromUser <const RecordDecl> origin_record(parser_record.GetOrigin(m_ast_importer_sp.get()));
 
     if (origin_record.IsInvalid())
         return false;
@@ -1706,9 +1706,9 @@ ClangASTSource::layoutRecordType(const R
             return false;
     }
 
-    if (!ImportOffsetMap(field_offsets, origin_field_offsets, m_ast_importer, parser_ast_context) ||
-        !ImportOffsetMap(base_offsets, origin_base_offsets, m_ast_importer, parser_ast_context) ||
-        !ImportOffsetMap(virtual_base_offsets, origin_virtual_base_offsets, m_ast_importer, parser_ast_context))
+    if (!ImportOffsetMap(field_offsets, origin_field_offsets, m_ast_importer_sp.get(), parser_ast_context) ||
+        !ImportOffsetMap(base_offsets, origin_base_offsets, m_ast_importer_sp.get(), parser_ast_context) ||
+        !ImportOffsetMap(virtual_base_offsets, origin_virtual_base_offsets, m_ast_importer_sp.get(), parser_ast_context))
         return false;
 
     size = record_layout.getSize().getQuantity() * m_ast_context->getCharWidth();
@@ -1870,7 +1870,7 @@ ClangASTSource::AddNamespace (NameSearch
     if (!src_namespace_decl)
         return nullptr;
 
-    Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, src_ast, src_namespace_decl);
+    Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, src_ast, src_namespace_decl);
 
     if (!copied_decl)
         return nullptr;
@@ -1882,7 +1882,7 @@ ClangASTSource::AddNamespace (NameSearch
 
     context.m_decls.push_back(copied_namespace_decl);
 
-    m_ast_importer->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
+    m_ast_importer_sp->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
 
     return dyn_cast<NamespaceDecl>(copied_decl);
 }
@@ -1898,7 +1898,7 @@ ClangASTSource::GuardedCopyType (const C
 
     SetImportInProgress(true);
 
-    QualType copied_qual_type = m_ast_importer->CopyType (m_ast_context, src_ast->getASTContext(), ClangASTContext::GetQualType(src_type));
+    QualType copied_qual_type = m_ast_importer_sp->CopyType (m_ast_context, src_ast->getASTContext(), ClangASTContext::GetQualType(src_type));
 
     SetImportInProgress(false);
 

Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.h?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.h (original)
+++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.h Tue Nov 10 16:54:42 2015
@@ -54,7 +54,7 @@ public:
         m_active_lexical_decls (),
         m_active_lookups ()
     {
-        m_ast_importer = m_target->GetClangASTImporter();
+        m_ast_importer_sp = m_target->GetClangASTImporter();
     }
   
     //------------------------------------------------------------------
@@ -77,7 +77,7 @@ public:
     void InstallASTContext (clang::ASTContext *ast_context)
     {
         m_ast_context = ast_context;
-        m_ast_importer->InstallMapCompleter(ast_context, *this);
+        m_ast_importer_sp->InstallMapCompleter(ast_context, *this);
     }
   
     //
@@ -405,7 +405,7 @@ protected:
 
     const lldb::TargetSP                m_target;           ///< The target to use in finding variables and types.
     clang::ASTContext                  *m_ast_context;      ///< The AST context requests are coming in for.
-    ClangASTImporter                   *m_ast_importer;     ///< The target's AST importer.
+    lldb::ClangASTImporterSP            m_ast_importer_sp;  ///< The target's AST importer.
     std::set<const clang::Decl *>       m_active_lexical_decls;
     std::set<const char *>              m_active_lookups;
 };

Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp (original)
+++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp Tue Nov 10 16:54:42 2015
@@ -215,9 +215,9 @@ ClangExpressionDeclMap::AddPersistentVar
 
         ClangASTContext *context(target->GetScratchClangASTContext());
 
-        TypeFromUser user_type(m_ast_importer->DeportType(context->getASTContext(),
-                                                          ast->getASTContext(),
-                                                          parser_type.GetOpaqueQualType()),
+        TypeFromUser user_type(m_ast_importer_sp->DeportType(context->getASTContext(),
+                                                             ast->getASTContext(),
+                                                             parser_type.GetOpaqueQualType()),
                                context);
         
         uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type,
@@ -258,9 +258,9 @@ ClangExpressionDeclMap::AddPersistentVar
 
     ClangASTContext *context(target->GetScratchClangASTContext());
 
-    TypeFromUser user_type(m_ast_importer->DeportType(context->getASTContext(),
-                                                      ast->getASTContext(),
-                                                      parser_type.GetOpaqueQualType()),
+    TypeFromUser user_type(m_ast_importer_sp->DeportType(context->getASTContext(),
+                                                         ast->getASTContext(),
+                                                         parser_type.GetOpaqueQualType()),
                            context);
 
     if (!user_type.GetOpaqueQualType())
@@ -971,7 +971,7 @@ ClangExpressionDeclMap::FindExternalVisi
 
     if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
     {
-        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
+        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer_sp->GetNamespaceMap(namespace_context);
 
         if (log && log->GetVerbose())
             log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
@@ -1291,7 +1291,7 @@ ClangExpressionDeclMap::FindExternalVisi
             if (!ptype_type_decl)
                 break;
 
-            Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
+            Decl *parser_ptype_decl = m_ast_importer_sp->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
 
             if (!parser_ptype_decl)
                 break;
@@ -1473,7 +1473,7 @@ ClangExpressionDeclMap::FindExternalVisi
                     {
                         if (llvm::isa<clang::FunctionDecl>(decl))
                         {
-                            clang::NamedDecl *copied_decl = llvm::cast<FunctionDecl>(m_ast_importer->CopyDecl(m_ast_context, &decl->getASTContext(), decl));
+                            clang::NamedDecl *copied_decl = llvm::cast<FunctionDecl>(m_ast_importer_sp->CopyDecl(m_ast_context, &decl->getASTContext(), decl));
                             context.AddNamedDecl(copied_decl);
                             context.m_found.function_with_type_info = true;
                         }
@@ -1524,7 +1524,7 @@ ClangExpressionDeclMap::FindExternalVisi
                                             name.GetCString());
                             }
                             
-                            clang::Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
+                            clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
                             clang::FunctionDecl *copied_function_decl = copied_decl ? dyn_cast<clang::FunctionDecl>(copied_decl) : nullptr;
                             
                             if (!copied_function_decl)
@@ -1556,7 +1556,7 @@ ClangExpressionDeclMap::FindExternalVisi
                                             name.GetCString());
                             }
                             
-                            clang::Decl *copied_decl = m_ast_importer->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
+                            clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
                             clang::VarDecl *copied_var_decl = copied_decl ? dyn_cast_or_null<clang::VarDecl>(copied_decl) : nullptr;
                             
                             if (!copied_var_decl)
@@ -1929,7 +1929,7 @@ ClangExpressionDeclMap::ResolveUnknownTy
             QualType var_type = var_decl->getType();
             TypeFromParser parser_type(var_type.getAsOpaquePtr(), ClangASTContext::GetASTContext(&var_decl->getASTContext()));
 
-            lldb::opaque_compiler_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context->getASTContext(), &var_decl->getASTContext(), var_type.getAsOpaquePtr());
+            lldb::opaque_compiler_type_t copied_type = m_ast_importer_sp->CopyType(scratch_ast_context->getASTContext(), &var_decl->getASTContext(), var_type.getAsOpaquePtr());
 
             if (!copied_type)
             {

Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Nov 10 16:54:42 2015
@@ -410,7 +410,7 @@ ClangASTContext::CreateInstance (lldb::L
                 }
                 return ast_sp;
             }
-            else if (target)
+            else if (target && target->IsValid())
             {
                 std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
                 if (ast_sp)

Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=252665&r1=252664&r2=252665&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Tue Nov 10 16:54:42 2015
@@ -83,7 +83,7 @@ Target::Target(Debugger &debugger, const
     m_process_sp (),
     m_search_filter_sp (),
     m_image_search_paths (ImageSearchPathsChanged, this),
-    m_ast_importer_ap (),
+    m_ast_importer_sp (),
     m_source_manager_ap(),
     m_stop_hooks (),
     m_stop_hook_next_id (0),
@@ -1178,7 +1178,7 @@ Target::ClearModules(bool delete_locatio
     m_section_load_history.Clear();
     m_images.Clear();
     m_scratch_type_system_map.Clear();
-    m_ast_importer_ap.reset();
+    m_ast_importer_sp.reset();
 }
 
 void
@@ -2107,21 +2107,18 @@ Target::GetScratchClangASTContext(bool c
     return nullptr;
 }
 
-ClangASTImporter *
+ClangASTImporterSP
 Target::GetClangASTImporter()
 {
     if (m_valid)
     {
-        ClangASTImporter *ast_importer = m_ast_importer_ap.get();
-        
-        if (!ast_importer)
+        if (!m_ast_importer_sp)
         {
-            ast_importer = new ClangASTImporter();
-            m_ast_importer_ap.reset(ast_importer);
+            m_ast_importer_sp.reset(new ClangASTImporter());
         }
-        return ast_importer;
+        return m_ast_importer_sp;
     }
-    return nullptr;
+    return ClangASTImporterSP();
 }
 
 void




More information about the lldb-commits mailing list