[Lldb-commits] [lldb] r145628 - in /lldb/trunk/source/Expression: ClangASTSource.cpp ClangExpressionDeclMap.cpp

Sean Callanan scallanan at apple.com
Thu Dec 1 15:04:37 CST 2011


Author: spyffe
Date: Thu Dec  1 15:04:37 2011
New Revision: 145628

URL: http://llvm.org/viewvc/llvm-project?rev=145628&view=rev
Log:
Modified clients of ClangASTImporter to be more robust
in the face of failures to import types, since blithely
passing on NULL types can sometimes lead to trouble.

Also eliminated a use of getAs and replaced it with
dyn_cast, which is more robust.

Modified:
    lldb/trunk/source/Expression/ClangASTSource.cpp
    lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp

Modified: lldb/trunk/source/Expression/ClangASTSource.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangASTSource.cpp?rev=145628&r1=145627&r2=145628&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangASTSource.cpp (original)
+++ lldb/trunk/source/Expression/ClangASTSource.cpp Thu Dec  1 15:04:37 2011
@@ -503,6 +503,14 @@
             
             void *copied_type = GuardedCopyType(m_ast_context, type_sp->GetClangAST(), type_sp->GetClangFullType());
             
+            if (!copied_type)
+            {                
+                if (log)
+                    log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
+                
+                break;
+            }
+                
             context.AddTypeDecl(copied_type);
         }
         
@@ -845,7 +853,7 @@
     // this, we raid the function's FunctionProtoType for types.
     
     QualType qual_type (QualType::getFromOpaquePtr(type));
-    const FunctionProtoType *func_proto_type = qual_type->getAs<FunctionProtoType>();
+    const FunctionProtoType *func_proto_type = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
     
     if (func_proto_type)
     {        
@@ -872,6 +880,12 @@
         
         func_decl->setParams(ArrayRef<ParmVarDecl*>(parm_var_decls));
     }
+    else
+    {
+        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+
+        log->Printf("Function type wasn't a FunctionProtoType");
+    }
     
     m_decls.push_back(func_decl);
     

Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=145628&r1=145627&r2=145628&view=diff
==============================================================================
--- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original)
+++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Thu Dec  1 15:04:37 2011
@@ -201,6 +201,16 @@
                                                     type.GetOpaqueQualType()),
                            context);
     
+    if (!user_type.GetOpaqueQualType())
+    {
+        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+
+        if (log)
+            log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
+        
+        return lldb::ClangExpressionVariableSP();
+    }
+    
     if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
                                                                      name, 
                                                                      user_type, 
@@ -290,6 +300,16 @@
                                                     type.GetOpaqueQualType()),
                            context);
     
+    if (!user_type.GetOpaqueQualType())
+    {
+        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+        
+        if (log)
+            log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
+        
+        return lldb::ClangExpressionVariableSP();
+    }
+    
     TypeFromUser var_type = var_sp->GetTypeFromUser();
     
     StackFrame *frame = exe_ctx->GetFramePtr();
@@ -2793,6 +2813,13 @@
                                                 user_type.GetOpaqueQualType()),
                                 m_ast_context);
     
+    if (!parser_type.GetOpaqueQualType())
+    {
+        if (log)
+            log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
+        return;
+    }
+    
     NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
     
     pvar_sp->EnableParserVars();
@@ -2903,6 +2930,14 @@
             
             lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
             
+            if (!copied_type)
+            {                
+                if (log)
+                    log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
+                
+                return lldb::ClangExpressionVariableSP();
+            }
+            
             TypeFromUser user_type(copied_type, scratch_ast_context);
                         
             entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
@@ -3075,6 +3110,16 @@
     ASTContext *user_ast_context = ut.GetASTContext();
     
     void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
+    
+    if (!copied_type)
+    {
+        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+
+        if (log)
+            log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
+        
+        return;
+    }
      
     if (add_method && ClangASTContext::IsAggregateType(copied_type))
     {




More information about the lldb-commits mailing list