Made expressions that are just casts of pointer 
variables be evaluated statically.

Also fixed a bug that caused the results of
statically-evaluated expressions to be materialized
improperly.

This bug also removes some duplicate code.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@131042 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index 678c175..9e0f67c 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -139,7 +139,7 @@
                                                      type.GetASTContext(),
                                                      type.GetOpaqueQualType()),
                            context);
-    
+        
     if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
                                                                      name, 
                                                                      user_type, 
@@ -194,10 +194,81 @@
     }
     
     pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
+    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
+    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
 
     return pvar_sp;
 }
 
+lldb::ClangExpressionVariableSP
+ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
+                                           clang::VarDecl *decl,
+                                           lldb_private::TypeFromParser type)
+{
+    assert (m_parser_vars.get());
+    
+    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
+    
+    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
+    clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
+    
+    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
+    
+    if (!var_sp)
+        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
+    
+    if (!var_sp)
+        return ClangExpressionVariableSP();
+    
+    TypeFromUser user_type(ClangASTContext::CopyType(context, 
+                                                     type.GetASTContext(),
+                                                     type.GetOpaqueQualType()),
+                           context);
+    
+    TypeFromUser var_type = var_sp->GetTypeFromUser();
+    
+    VariableSP var = FindVariableInScope (*exe_ctx->frame, var_sp->GetName(), &var_type);
+    
+    if (!var)
+        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
+    
+    ValueObjectSP var_valobj = exe_ctx->frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
+
+    if (!var_valobj)
+        return lldb::ClangExpressionVariableSP();
+    
+    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
+    
+    if (!var_casted_valobj)
+        return lldb::ClangExpressionVariableSP();
+    
+    if (log)
+    {
+        StreamString my_stream_string;
+        
+        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
+                                           var_type.GetOpaqueQualType(),
+                                           &my_stream_string);
+        
+        
+        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
+    }
+    
+    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
+    
+    if (!pvar_sp)
+        return lldb::ClangExpressionVariableSP();
+    
+    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
+        return lldb::ClangExpressionVariableSP();
+    
+    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
+    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
+    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
+            
+    return pvar_sp;
+}
+
 bool 
 ClangExpressionDeclMap::AddPersistentVariable 
 (
@@ -535,9 +606,9 @@
         return false;
     }
     
-    Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
-                                                    object_name, 
-                                                    (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
+    VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame,
+                                                     object_name, 
+                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
     
     if (!object_ptr_var)
     {
@@ -1122,7 +1193,7 @@
             if (log)
                 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
         }
-        else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)
+        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
         {
             err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
             return false;
@@ -1153,7 +1224,7 @@
     const ConstString &name(expr_var->GetName());
     TypeFromUser type(expr_var->GetTypeFromUser());
     
-    Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
+    VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type);
     
     if (!var)
     {
@@ -1495,7 +1566,7 @@
     return true;
 }
 
-Variable *
+lldb::VariableSP
 ClangExpressionDeclMap::FindVariableInScope
 (
     StackFrame &frame,
@@ -1508,7 +1579,7 @@
     VariableList *var_list = frame.GetVariableList(true);
     
     if (!var_list)
-        return NULL;
+        return lldb::VariableSP();
     
     lldb::VariableSP var_sp (var_list->FindVariable(name));
         
@@ -1543,17 +1614,17 @@
         if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
         {
             if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
-                return NULL;
+                return lldb::VariableSP();
         }
         else
         {
             if (log)
                 log->PutCString("Skipping a candidate variable because of different AST contexts");
-            return NULL;
+            return lldb::VariableSP();
         }
     }
 
-    return var_sp.get();
+    return var_sp;
 }
 
 // Interface for ClangASTSource
@@ -1590,7 +1661,7 @@
     // doesn't start with our phony prefix of '$'
     if (name_unique_cstr[0] != '$')
     {
-        Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
+        VariableSP var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
         
         // If we found a variable in scope, no need to pull up function names
         if (var != NULL)
@@ -1797,7 +1868,7 @@
 ClangExpressionDeclMap::GetVariableValue
 (
     ExecutionContext &exe_ctx,
-    Variable *var,
+    VariableSP var,
     clang::ASTContext *parser_ast_context,
     TypeFromUser *user_type,
     TypeFromParser *parser_type
@@ -1904,7 +1975,7 @@
 }
 
 void
-ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, Variable* var)
+ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
 {
     assert (m_parser_vars.get());
     
@@ -1936,6 +2007,7 @@
     entity->m_parser_vars->m_named_decl  = var_decl;
     entity->m_parser_vars->m_llvm_value  = NULL;
     entity->m_parser_vars->m_lldb_value  = var_location;
+    entity->m_parser_vars->m_lldb_var    = var;
     
     if (log)
     {