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