aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-04-14 21:41:27 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-06-22 18:20:56 +0000
commitbdd1243df58e60e85101c09001d9812a789b6bc4 (patch)
treea1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp
parent781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff)
parente3b557809604d036af6e00c60f012c2025b59a5e (diff)
Diffstat (limited to 'contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp')
-rw-r--r--contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp b/contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp
new file mode 100644
index 000000000000..e15e723de588
--- /dev/null
+++ b/contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -0,0 +1,80 @@
+//===-- CommandObjectDWIMPrint.cpp ------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CommandObjectDWIMPrint.h"
+
+#include "lldb/Core/ValueObject.h"
+#include "lldb/Interpreter/CommandInterpreter.h"
+#include "lldb/Interpreter/CommandObject.h"
+#include "lldb/Interpreter/CommandReturnObject.h"
+#include "lldb/Target/StackFrame.h"
+#include "lldb/Utility/ConstString.h"
+#include "lldb/lldb-enumerations.h"
+#include "lldb/lldb-forward.h"
+
+using namespace llvm;
+using namespace lldb;
+using namespace lldb_private;
+
+CommandObjectDWIMPrint::CommandObjectDWIMPrint(CommandInterpreter &interpreter)
+ : CommandObjectRaw(interpreter, "dwim-print",
+ "Print a variable or expression.",
+ "dwim-print [<variable-name> | <expression>]",
+ eCommandProcessMustBePaused | eCommandTryTargetAPILock) {
+}
+
+bool CommandObjectDWIMPrint::DoExecute(StringRef expr,
+ CommandReturnObject &result) {
+ // Ignore leading and trailing whitespace.
+ expr = expr.trim();
+
+ if (expr.empty()) {
+ result.AppendErrorWithFormatv("'{0}' takes a variable or expression",
+ m_cmd_name);
+ return false;
+ }
+
+ auto verbosity = GetDebugger().GetDWIMPrintVerbosity();
+
+ // First, try `expr` as the name of a frame variable.
+ if (StackFrame *frame = m_exe_ctx.GetFramePtr()) {
+ auto valobj_sp = frame->FindVariable(ConstString(expr));
+ if (valobj_sp && valobj_sp->GetError().Success()) {
+ if (verbosity == eDWIMPrintVerbosityFull)
+ result.AppendMessageWithFormatv("note: ran `frame variable {0}`", expr);
+ valobj_sp->Dump(result.GetOutputStream());
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ return true;
+ }
+ }
+
+ // Second, also lastly, try `expr` as a source expression to evaluate.
+ {
+ Target *target_ptr = m_exe_ctx.GetTargetPtr();
+ // Fallback to the dummy target, which can allow for expression evaluation.
+ Target &target = target_ptr ? *target_ptr : GetDummyTarget();
+
+ auto *exe_scope = m_exe_ctx.GetBestExecutionContextScope();
+ ValueObjectSP valobj_sp;
+ if (target.EvaluateExpression(expr, exe_scope, valobj_sp) ==
+ eExpressionCompleted) {
+ if (verbosity != eDWIMPrintVerbosityNone)
+ result.AppendMessageWithFormatv("note: ran `expression -- {0}`", expr);
+ valobj_sp->Dump(result.GetOutputStream());
+ result.SetStatus(eReturnStatusSuccessFinishResult);
+ return true;
+ } else {
+ if (valobj_sp)
+ result.SetError(valobj_sp->GetError());
+ else
+ result.AppendErrorWithFormatv(
+ "unknown error evaluating expression `{0}`", expr);
+ return false;
+ }
+ }
+}