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());