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

Chris Lattner clattner at apple.com
Thu Dec 1 15:38:19 PST 2011


On Dec 1, 2011, at 1:04 PM, Sean Callanan wrote:

> 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.
> 

FYI, dyn_cast and getAs<> are different: dyn_cast returns a syntactic form, where getAs returns the semantic form.  This matters when you have typedefs of function types, for example: getAs will look through the typedef, but dyn_cast won't.  Is this the right thing for this code?

-Chris

> @@ -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))
>     {
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits




More information about the lldb-commits mailing list