[Lldb-commits] [lldb] [lldb] Add a progress event for executing an expression (PR #119757)

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Thu Dec 12 15:37:13 PST 2024


https://github.com/adrian-prantl updated https://github.com/llvm/llvm-project/pull/119757

>From 084b096f2164042fb0a8a85c2614985c589b1788 Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl at apple.com>
Date: Thu, 12 Dec 2024 12:53:13 -0800
Subject: [PATCH] [lldb] Add a progress event for executing an expression

Expressions can take arbitrary amounts of time to run, so IDEs might
want to be informed about the fact that an expression is currently
being executed.

rdar://141253078
---
 lldb/source/Expression/FunctionCaller.cpp  |  5 +++++
 lldb/source/Expression/UserExpression.cpp  | 13 +++++++++++++
 lldb/test/Shell/Expr/TestExecProgress.test |  8 ++++++++
 3 files changed, 26 insertions(+)
 create mode 100644 lldb/test/Shell/Expr/TestExecProgress.test

diff --git a/lldb/source/Expression/FunctionCaller.cpp b/lldb/source/Expression/FunctionCaller.cpp
index 67f9cd5758be2c..ddf1e1151bdcf9 100644
--- a/lldb/source/Expression/FunctionCaller.cpp
+++ b/lldb/source/Expression/FunctionCaller.cpp
@@ -8,6 +8,7 @@
 
 #include "lldb/Expression/FunctionCaller.h"
 #include "lldb/Core/Module.h"
+#include "lldb/Core/Progress.h"
 #include "lldb/Expression/DiagnosticManager.h"
 #include "lldb/Expression/IRExecutionUnit.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
@@ -338,6 +339,10 @@ lldb::ExpressionResults FunctionCaller::ExecuteFunction(
     DiagnosticManager &diagnostic_manager, Value &results) {
   lldb::ExpressionResults return_value = lldb::eExpressionSetupError;
 
+  Debugger *debugger =
+      exe_ctx.GetTargetPtr() ? &exe_ctx.GetTargetPtr()->GetDebugger() : nullptr;
+  Progress progress("Calling function", FunctionName(), {}, debugger);
+
   // FunctionCaller::ExecuteFunction execution is always just to get the
   // result. Unless explicitly asked for, ignore breakpoints and unwind on
   // error.
diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp
index f1f69ae1c89b85..af4b477660eeb5 100644
--- a/lldb/source/Expression/UserExpression.cpp
+++ b/lldb/source/Expression/UserExpression.cpp
@@ -14,6 +14,7 @@
 #include <string>
 
 #include "lldb/Core/Module.h"
+#include "lldb/Core/Progress.h"
 #include "lldb/Expression/DiagnosticManager.h"
 #include "lldb/Expression/ExpressionVariable.h"
 #include "lldb/Expression/IRExecutionUnit.h"
@@ -424,6 +425,18 @@ UserExpression::Execute(DiagnosticManager &diagnostic_manager,
                         const EvaluateExpressionOptions &options,
                         lldb::UserExpressionSP &shared_ptr_to_me,
                         lldb::ExpressionVariableSP &result_var) {
+  Debugger *debugger =
+      exe_ctx.GetTargetPtr() ? &exe_ctx.GetTargetPtr()->GetDebugger() : nullptr;
+  std::string details;
+  if (m_options.IsForUtilityExpr())
+    details = "LLDB utility";
+  else if (m_expr_text.size() > 15)
+    details = m_expr_text.substr(0, 14) + "…";
+  else
+    details = m_expr_text;
+
+  Progress progress("Running expression", details, {}, debugger);
+
   lldb::ExpressionResults expr_result = DoExecute(
       diagnostic_manager, exe_ctx, options, shared_ptr_to_me, result_var);
   Target *target = exe_ctx.GetTargetPtr();
diff --git a/lldb/test/Shell/Expr/TestExecProgress.test b/lldb/test/Shell/Expr/TestExecProgress.test
new file mode 100644
index 00000000000000..3f0ae9ffe56336
--- /dev/null
+++ b/lldb/test/Shell/Expr/TestExecProgress.test
@@ -0,0 +1,8 @@
+# RUN: %lldb -s %s  | FileCheck %s
+log enable lldb event
+expr 1
+expr 1 // And a very long comment.
+quit
+
+# CHECK: {{title = "Running expression", details = "1"}}
+# CHECK: {{title = "Running expression", details = "1 // And a ver…"}}



More information about the lldb-commits mailing list