Author: Shubham Sandeep Rastogi
Date: 2025-08-15T09:17:33-07:00
New Revision: cd0bf2735bcd1e9a21dd10169782060a3702c447

URL: 
https://github.com/llvm/llvm-project/commit/cd0bf2735bcd1e9a21dd10169782060a3702c447
DIFF: 
https://github.com/llvm/llvm-project/commit/cd0bf2735bcd1e9a21dd10169782060a3702c447.diff

LOG: Revert "[LLDB] Update DIL handling of array subscripting. (#151605)"

This reverts commit 6d3ad9d9fd830eef0ac8a9d558e826b8b624e17d.

This was reverted because it broke the LLDB greendragon bot.

Added: 
    

Modified: 
    lldb/source/ValueObject/DILEval.cpp
    
lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/TestFrameVarDILArraySubscript.py
    lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/main.cpp

Removed: 
    
lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/myArraySynthProvider.py


################################################################################
diff  --git a/lldb/source/ValueObject/DILEval.cpp 
b/lldb/source/ValueObject/DILEval.cpp
index 89a117e79da51..6f28434c646cd 100644
--- a/lldb/source/ValueObject/DILEval.cpp
+++ b/lldb/source/ValueObject/DILEval.cpp
@@ -330,83 +330,40 @@ Interpreter::Visit(const ArraySubscriptNode *node) {
     return lhs_or_err;
   lldb::ValueObjectSP base = *lhs_or_err;
 
-  StreamString var_expr_path_strm;
+  // Check to see if 'base' has a synthetic value; if so, try using that.
   uint64_t child_idx = node->GetIndex();
-  lldb::ValueObjectSP child_valobj_sp;
-  bool is_incomplete_array = false;
-  CompilerType base_type = base->GetCompilerType().GetNonReferenceType();
-  base->GetExpressionPath(var_expr_path_strm);
-  if (base_type.IsPointerType()) {
-    child_valobj_sp = base->GetSyntheticArrayMember(child_idx, true);
-    if (!child_valobj_sp) {
-      std::string err_msg = llvm::formatv(
-          "failed to use pointer as array for index {0} for "
-          "\"({1}) {2}\"",
-          child_idx, base->GetTypeName().AsCString("<invalid type>"),
-          var_expr_path_strm.GetData());
-      if (base_type.IsPointerToVoid())
-        err_msg = "subscript of pointer to incomplete type 'void'";
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
-                                                  node->GetLocation());
-    }
-  } else if (base_type.IsArrayType(nullptr, nullptr, &is_incomplete_array)) {
-    child_valobj_sp = base->GetChildAtIndex(child_idx);
-    if (!child_valobj_sp && (is_incomplete_array || m_use_synthetic))
-      child_valobj_sp = base->GetSyntheticArrayMember(child_idx, true);
-    if (!child_valobj_sp) {
-      std::string err_msg = llvm::formatv(
+  if (lldb::ValueObjectSP synthetic = base->GetSyntheticValue()) {
+    llvm::Expected<uint32_t> num_children =
+        synthetic->GetNumChildren(child_idx + 1);
+    if (!num_children)
+      return llvm::make_error<DILDiagnosticError>(
+          m_expr, toString(num_children.takeError()), node->GetLocation());
+    if (child_idx >= *num_children) {
+      std::string message = llvm::formatv(
           "array index {0} is not valid for \"({1}) {2}\"", child_idx,
           base->GetTypeName().AsCString("<invalid type>"),
-          var_expr_path_strm.GetData());
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
+          base->GetName().AsCString());
+      return llvm::make_error<DILDiagnosticError>(m_expr, message,
                                                   node->GetLocation());
     }
-  } else if (base_type.IsScalarType()) {
-    child_valobj_sp =
-        base->GetSyntheticBitFieldChild(child_idx, child_idx, true);
-    if (!child_valobj_sp) {
-      std::string err_msg = llvm::formatv(
-          "bitfield range {0}-{1} is not valid for \"({2}) {3}\"", child_idx,
-          child_idx, base->GetTypeName().AsCString("<invalid type>"),
-          var_expr_path_strm.GetData());
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
-                                                  node->GetLocation(), 1);
-    }
-  } else {
-    lldb::ValueObjectSP synthetic = base->GetSyntheticValue();
-    if (!m_use_synthetic || !synthetic || synthetic == base) {
-      std::string err_msg =
-          llvm::formatv("\"{0}\" is not an array type",
-                        base->GetTypeName().AsCString("<invalid type>"));
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
-                                                  node->GetLocation(), 1);
-    }
-    if (static_cast<uint32_t>(child_idx) >=
-        synthetic->GetNumChildrenIgnoringErrors(child_idx + 1)) {
-      std::string err_msg = llvm::formatv(
-          "array index {0} is not valid for \"({1}) {2}\"", child_idx,
-          base->GetTypeName().AsCString("<invalid type>"),
-          var_expr_path_strm.GetData());
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
-                                                  node->GetLocation(), 1);
-    }
-    child_valobj_sp = synthetic->GetChildAtIndex(child_idx);
-    if (!child_valobj_sp) {
-      std::string err_msg = llvm::formatv(
-          "array index {0} is not valid for \"({1}) {2}\"", child_idx,
-          base->GetTypeName().AsCString("<invalid type>"),
-          var_expr_path_strm.GetData());
-      return llvm::make_error<DILDiagnosticError>(m_expr, std::move(err_msg),
-                                                  node->GetLocation(), 1);
-    }
+    if (lldb::ValueObjectSP child_valobj_sp =
+            synthetic->GetChildAtIndex(child_idx))
+      return child_valobj_sp;
   }
 
-  if (child_valobj_sp) {
-    if (m_use_dynamic != lldb::eNoDynamicValues) {
-      if (auto dynamic_sp = child_valobj_sp->GetDynamicValue(m_use_dynamic))
-        child_valobj_sp = std::move(dynamic_sp);
-    }
-    return child_valobj_sp;
+  auto base_type = base->GetCompilerType().GetNonReferenceType();
+  if (!base_type.IsPointerType() && !base_type.IsArrayType())
+    return llvm::make_error<DILDiagnosticError>(
+        m_expr, "subscripted value is not an array or pointer",
+        node->GetLocation());
+  if (base_type.IsPointerToVoid())
+    return llvm::make_error<DILDiagnosticError>(
+        m_expr, "subscript of pointer to incomplete type 'void'",
+        node->GetLocation());
+
+  if (base_type.IsArrayType()) {
+    if (lldb::ValueObjectSP child_valobj_sp = base->GetChildAtIndex(child_idx))
+      return child_valobj_sp;
   }
 
   int64_t signed_child_idx = node->GetIndex();

diff  --git 
a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/TestFrameVarDILArraySubscript.py
 
b/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/TestFrameVarDILArraySubscript.py
index e3cfb878dd415..0f56057189395 100644
--- 
a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/TestFrameVarDILArraySubscript.py
+++ 
b/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/TestFrameVarDILArraySubscript.py
@@ -69,18 +69,17 @@ def test_subscript(self):
             substrs=["expected 'r_square', got: <'.'"],
         )
 
-        # Test accessing bits in scalar types.
-        self.expect_var_path("idx_1[0]", value="1")
-        self.expect_var_path("idx_1[1]", value="0")
-
-        # Bit adcess not valid for a reference.
+        # Base should be a "pointer to T" and index should be of an integral 
type.
+        self.expect(
+            "frame var 'idx_1[0]'",
+            error=True,
+            substrs=["subscripted value is not an array or pointer"],
+        )
         self.expect(
             "frame var 'idx_1_ref[0]'",
             error=True,
-            substrs=["bitfield range 0-0 is not valid"],
+            substrs=["subscripted value is not an array or pointer"],
         )
-
-        # Base should be a "pointer to T" and index should be of an integral 
type.
         self.expect(
             "frame var 'int_arr[int_ptr]'",
             error=True,
@@ -106,8 +105,6 @@ def test_subscript_synthetic(self):
         )
 
         self.runCmd("settings set target.experimental.use-DIL true")
-        self.runCmd("script from myArraySynthProvider import *")
-        self.runCmd("type synth add -l myArraySynthProvider myArray")
 
         # Test synthetic value subscription
         self.expect_var_path("vector[1]", value="2")
@@ -116,7 +113,3 @@ def test_subscript_synthetic(self):
             error=True,
             substrs=["array index 100 is not valid"],
         )
-        self.expect(
-            "frame var 'ma_ptr[0]'",
-            substrs=["(myArray) ma_ptr[0] = ([0] = 7, [1] = 8, [2] = 9, [3] = 
10)"],
-        )

diff  --git 
a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/main.cpp 
b/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/main.cpp
index 03ad3e872ca76..a9a3612dfae5a 100644
--- a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/main.cpp
+++ b/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/main.cpp
@@ -1,11 +1,5 @@
 #include <vector>
 
-class myArray {
-public:
-  int m_array[4] = {7, 8, 9, 10};
-  int m_arr_size = 4;
-};
-
 int main(int argc, char **argv) {
   int int_arr[] = {1, 2, 3};
   int *int_ptr = int_arr;
@@ -35,8 +29,5 @@ int main(int argc, char **argv) {
 
   std::vector<int> vector = {1, 2, 3};
 
-  myArray ma;
-  myArray *ma_ptr = &ma;
-
   return 0; // Set a breakpoint here
 }

diff  --git 
a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/myArraySynthProvider.py
 
b/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/myArraySynthProvider.py
deleted file mode 100644
index 167899bd3907c..0000000000000
--- 
a/lldb/test/API/commands/frame/var-dil/basics/ArraySubscript/myArraySynthProvider.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import lldb
-
-
-class myArraySynthProvider:
-    def __init__(self, valobj, dict):
-        self.valobj = valobj
-
-    def num_children(self):
-        size_valobj = self.valobj.GetChildMemberWithName("m_arr_size")
-        if size_valobj:
-            return size_valobj.GetValueAsUnsigned(0)
-        return 0
-
-    def get_child_at_index(self, index):
-        size_valobj = self.valobj.GetChildMemberWithName("m_arr_size")
-        arr = self.valobj.GetChildMemberWithName("m_array")
-        if not size_valobj or not arr:
-            return None
-        max_idx = size_valobj.GetValueAsUnsigned(0)
-        if index >= max_idx:
-            return None
-        return arr.GetChildAtIndex(index)
-
-    def get_child_index(self, name):
-        if name == "[0]":
-            return 0
-        if name == "[1]":
-            return
-        if name == "[2]":
-            return 2
-        if name == "[3]":
-            return 3
-        return -1


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

Reply via email to