diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/Commands/CommandObjectDWIMPrint.cpp | 80 |
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; + } + } +} |