Previoously the expression parser had to rely on the
JIT when printing the values of registers (e.g.,
"expr $pc").  Now the expression parser can do this
in the IR interpreter without running code in the
inferior process.


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@150554 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index ad23b8a..7f2d9fc 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -992,7 +992,7 @@
 }
 
 lldb_private::Value
-ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
+ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
 {
     assert (m_parser_vars.get());
             
@@ -1001,6 +1001,8 @@
     
     if (expr_var_sp)
     {
+        flags = expr_var_sp->m_flags;
+
         if (!expr_var_sp->m_parser_vars.get())
             return Value();
         
@@ -1048,6 +1050,28 @@
             
             return ret;
         }
+        else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
+        {
+            StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
+            
+            if (!frame)
+                return Value();
+            
+            RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
+            
+            RegisterValue reg_value;
+            
+            if (!reg_context_sp->ReadRegister(reg_info, reg_value))
+                return Value();
+            
+            Value ret;
+            
+            ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
+            if (!reg_value.GetScalarValue(ret.GetScalar()))
+                return Value();
+            
+            return ret;
+        }
         else
         {
             return Value();
@@ -1055,6 +1079,8 @@
     }
     else if (persistent_var_sp)
     {
+        flags = persistent_var_sp->m_flags;
+        
         if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
              persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
             persistent_var_sp->m_live_sp &&
@@ -3024,8 +3050,9 @@
     entity->m_parser_vars->m_named_decl  = var_decl;
     entity->m_parser_vars->m_llvm_value  = NULL;
     entity->m_parser_vars->m_lldb_value  = NULL;
+    entity->m_flags |= ClangExpressionVariable::EVBareRegister;
     
-    if (log && log->GetVerbose())
+    if (log)
     {
         ASTDumper ast_dumper(var_decl);
         log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());