summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/Target.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/Target.cpp')
-rw-r--r--lldb/source/Target/Target.cpp84
1 files changed, 81 insertions, 3 deletions
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index c5dd46b6b68..8546537b9a1 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -18,15 +18,17 @@
#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
#include "lldb/Breakpoint/BreakpointResolverName.h"
#include "lldb/Core/DataBufferMemoryMap.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/Core/Event.h"
#include "lldb/Core/Log.h"
-#include "lldb/Core/Timer.h"
#include "lldb/Core/StreamString.h"
+#include "lldb/Core/Timer.h"
+#include "lldb/Core/ValueObject.h"
#include "lldb/Host/Host.h"
#include "lldb/lldb-private-log.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Target/Process.h"
-#include "lldb/Core/Debugger.h"
+#include "lldb/Target/StackFrame.h"
using namespace lldb;
using namespace lldb_private;
@@ -46,7 +48,8 @@ Target::Target(Debugger &debugger) :
m_triple(),
m_search_filter_sp(),
m_image_search_paths (ImageSearchPathsChanged, this),
- m_scratch_ast_context_ap(NULL)
+ m_scratch_ast_context_ap (NULL),
+ m_persistent_variables ()
{
SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
@@ -866,6 +869,81 @@ Target::GetExpressionPrefixContentsAsCString ()
return m_expr_prefix_contents.c_str();
}
+ExecutionResults
+Target::EvaluateExpression
+(
+ const char *expr_cstr,
+ StackFrame *frame,
+ bool unwind_on_error,
+ lldb::ValueObjectSP &result_valobj_sp
+)
+{
+ ExecutionResults execution_results = eExecutionSetupError;
+
+ result_valobj_sp.reset();
+
+ ExecutionContext exe_ctx;
+ if (frame)
+ {
+ frame->CalculateExecutionContext(exe_ctx);
+ result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr);
+ }
+ else if (m_process_sp)
+ {
+ m_process_sp->CalculateExecutionContext(exe_ctx);
+ }
+ else
+ {
+ CalculateExecutionContext(exe_ctx);
+ }
+
+ if (result_valobj_sp)
+ {
+ execution_results = eExecutionCompleted;
+ // We got a result from the frame variable expression path above...
+ ConstString persistent_variable_name (m_persistent_variables.GetNextPersistentVariableName());
+
+ lldb::ValueObjectSP const_valobj_sp;
+
+ // Check in case our value is already a constant value
+ if (result_valobj_sp->GetIsConstant())
+ {
+ const_valobj_sp = result_valobj_sp;
+ const_valobj_sp->SetName (persistent_variable_name);
+ }
+ else
+ const_valobj_sp = result_valobj_sp->CreateConstantValue (exe_ctx.GetBestExecutionContextScope(),
+ persistent_variable_name);
+
+ result_valobj_sp = const_valobj_sp;
+
+ ClangExpressionVariableSP clang_expr_variable_sp(m_persistent_variables.CreatePersistentVariable(result_valobj_sp));
+ assert (clang_expr_variable_sp.get());
+ }
+ else
+ {
+ // Make sure we aren't just trying to see the value of a persistent
+ // variable (something like "$0")
+ lldb::ClangExpressionVariableSP persistent_var_sp (m_persistent_variables.GetVariable (expr_cstr));
+ if (persistent_var_sp)
+ {
+ result_valobj_sp = persistent_var_sp->GetValueObject ();
+ execution_results = eExecutionCompleted;
+ }
+ else
+ {
+ const char *prefix = GetExpressionPrefixContentsAsCString();
+
+ execution_results = ClangUserExpression::Evaluate (exe_ctx,
+ unwind_on_error,
+ expr_cstr,
+ prefix,
+ result_valobj_sp);
+ }
+ }
+ return execution_results;
+}
+
//--------------------------------------------------------------
// class Target::SettingsController
//--------------------------------------------------------------
OpenPOWER on IntegriCloud