https://github.com/kastiglione updated 
https://github.com/llvm/llvm-project/pull/151374

>From d4b65cbf4f45fd92950e1660087b72ca39369b44 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Wed, 30 Jul 2025 11:33:28 -0700
Subject: [PATCH 1/2] [lldb] Fallback to expression eval when Dump of variable
 fails in dwim-print

---
 .../Commands/CommandObjectDWIMPrint.cpp       | 38 ++++++++++---------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp 
b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index a2c004d0ee97f..5b788d7d0c5a2 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -23,6 +23,7 @@
 #include "lldb/lldb-enumerations.h"
 #include "lldb/lldb-forward.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Error.h"
 
 #include <regex>
 
@@ -132,27 +133,22 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
   };
 
   // Dump `valobj` according to whether `po` was requested or not.
-  auto dump_val_object = [&](ValueObject &valobj) {
+  auto dump_val_object = [&](ValueObject &valobj) -> Error {
     if (is_po) {
       StreamString temp_result_stream;
-      if (llvm::Error error = valobj.Dump(temp_result_stream, dump_options)) {
-        result.AppendError(toString(std::move(error)));
-        return;
-      }
+      if (Error err = valobj.Dump(temp_result_stream, dump_options))
+        return err;
       llvm::StringRef output = temp_result_stream.GetString();
       maybe_add_hint(output);
       result.GetOutputStream() << output;
     } else {
-      llvm::Error error =
-        valobj.Dump(result.GetOutputStream(), dump_options);
-      if (error) {
-        result.AppendError(toString(std::move(error)));
-        return;
-      }
+      if (Error err = valobj.Dump(result.GetOutputStream(), dump_options))
+        return err;
     }
     m_interpreter.PrintWarningsIfNecessary(result.GetOutputStream(),
                                            m_cmd_name);
     result.SetStatus(eReturnStatusSuccessFinishResult);
+    return Error::success();
   };
 
   // First, try `expr` as a _limited_ frame variable expression path: only the
@@ -186,8 +182,11 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
                                      expr);
       }
 
-      dump_val_object(*valobj_sp);
-      return;
+      bool failed = errorToBool(dump_val_object(*valobj_sp));
+      if (!failed)
+        return;
+
+      // Dump failed, continue on to expression evaluation.
     }
   }
 
@@ -196,8 +195,9 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
     if (auto *state = target.GetPersistentExpressionStateForLanguage(language))
       if (auto var_sp = state->GetVariable(expr))
         if (auto valobj_sp = var_sp->GetValueObject()) {
-          dump_val_object(*valobj_sp);
-          return;
+          bool failed = errorToBool(dump_val_object(*valobj_sp));
+          if (!failed)
+            return;
         }
 
   // Third, and lastly, try `expr` as a source expression to evaluate.
@@ -248,10 +248,12 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
       result.AppendNoteWithFormatv("ran `expression {0}{1}`", flags, expr);
     }
 
-    if (valobj_sp->GetError().GetError() != UserExpression::kNoResult)
-      dump_val_object(*valobj_sp);
-    else
+    if (valobj_sp->GetError().GetError() != UserExpression::kNoResult) {
+      if (Error err = dump_val_object(*valobj_sp))
+        result.SetError(std::move(err));
+    } else {
       result.SetStatus(eReturnStatusSuccessFinishNoResult);
+    }
 
     if (suppress_result)
       if (auto result_var_sp =

>From 2fe767179a73e790140d87f3b57682e612ef1457 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Wed, 30 Jul 2025 13:59:42 -0700
Subject: [PATCH 2/2] Log non-fatal errors

---
 lldb/source/Commands/CommandObjectDWIMPrint.cpp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp 
b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index 5b788d7d0c5a2..d7589cc0396f6 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -18,6 +18,8 @@
 #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
 #include "lldb/Target/StackFrame.h"
 #include "lldb/Utility/ConstString.h"
+#include "lldb/Utility/LLDBLog.h"
+#include "lldb/Utility/Log.h"
 #include "lldb/ValueObject/ValueObject.h"
 #include "lldb/lldb-defines.h"
 #include "lldb/lldb-enumerations.h"
@@ -182,11 +184,13 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
                                      expr);
       }
 
-      bool failed = errorToBool(dump_val_object(*valobj_sp));
-      if (!failed)
+      Error err = dump_val_object(*valobj_sp);
+      if (!err)
         return;
 
       // Dump failed, continue on to expression evaluation.
+      LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), std::move(err),
+                     "could not print frame variable '{1}': {0}", expr);
     }
   }
 
@@ -195,9 +199,14 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
     if (auto *state = target.GetPersistentExpressionStateForLanguage(language))
       if (auto var_sp = state->GetVariable(expr))
         if (auto valobj_sp = var_sp->GetValueObject()) {
-          bool failed = errorToBool(dump_val_object(*valobj_sp));
-          if (!failed)
+          Error err = dump_val_object(*valobj_sp);
+          if (!err)
             return;
+
+          // Dump failed, continue on to expression evaluation.
+          LLDB_LOG_ERROR(GetLog(LLDBLog::Expressions), std::move(err),
+                         "could not print persistent variable '{1}': {0}",
+                         expr);
         }
 
   // Third, and lastly, try `expr` as a source expression to evaluate.

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to