https://github.com/sedymrak created
https://github.com/llvm/llvm-project/pull/171521
Consider the following program:
```
int main() {
int foo[2][3][4];
int (*bar)[3][4] = foo;
return 0;
}
```
If we:
- compile this program
- launch an LLDB debugging session
- launch the process and let it stop at the `return 0;` statement
then the following LLDB command:
```
(lldb) script lldb.frame.FindVariable("bar").GetChildAtIndex(0).get_expr_path()
```
will produce the following output:
```
bar->[0]
```
What we were expecting:
- a valid expression in the C programming language
- that would allow us (in the scope of the `main` function) access the
appropriate object.
What we've got is a string that does not represent a valid expression in the C
programming language.
This pull-request proposes a fix to this problem.
From 13c06e2b4100ba8999d11ec0d2dc0c0038b6d402 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= <[email protected]>
Date: Tue, 9 Dec 2025 23:12:51 +0100
Subject: [PATCH 1/2] [lldb] add a test that demonstrates the problem with the
"ValueObject::GetExpressionPath" method
---
.../python_api/value/get_expr_path/Makefile | 3 ++
.../TestValueAPIGetExpressionPath.py | 50 +++++++++++++++++++
.../API/python_api/value/get_expr_path/main.c | 5 ++
3 files changed, 58 insertions(+)
create mode 100644 lldb/test/API/python_api/value/get_expr_path/Makefile
create mode 100644
lldb/test/API/python_api/value/get_expr_path/TestValueAPIGetExpressionPath.py
create mode 100644 lldb/test/API/python_api/value/get_expr_path/main.c
diff --git a/lldb/test/API/python_api/value/get_expr_path/Makefile
b/lldb/test/API/python_api/value/get_expr_path/Makefile
new file mode 100644
index 0000000000000..10495940055b6
--- /dev/null
+++ b/lldb/test/API/python_api/value/get_expr_path/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules
diff --git
a/lldb/test/API/python_api/value/get_expr_path/TestValueAPIGetExpressionPath.py
b/lldb/test/API/python_api/value/get_expr_path/TestValueAPIGetExpressionPath.py
new file mode 100644
index 0000000000000..227588c412587
--- /dev/null
+++
b/lldb/test/API/python_api/value/get_expr_path/TestValueAPIGetExpressionPath.py
@@ -0,0 +1,50 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class ValueAPIGetExpressionPath(TestBase):
+ def test(self):
+ self.build()
+
+ _, _, thread, _ = lldbutil.run_to_source_breakpoint(
+ self, "Break at this line", lldb.SBFileSpec("main.c")
+ )
+ frame = thread.GetFrameAtIndex(0)
+
+ self.assertEqual(frame.FindVariable("foo").get_expr_path(), "foo")
+ for i in range(2):
+ self.assertEqual(
+ frame.FindVariable("foo").GetChildAtIndex(i).get_expr_path(),
+ f"foo[{i}]",
+ )
+ for j in range(3):
+ self.assertEqual(
+ frame.FindVariable("foo")
+ .GetChildAtIndex(i)
+ .GetChildAtIndex(j)
+ .get_expr_path(),
+ f"foo[{i}][{j}]",
+ )
+ for k in range(4):
+ self.assertEqual(
+ frame.FindVariable("foo")
+ .GetChildAtIndex(i)
+ .GetChildAtIndex(j)
+ .GetChildAtIndex(k)
+ .get_expr_path(),
+ f"foo[{i}][{j}][{k}]",
+ )
+ self.assertEqual(frame.FindVariable("bar").get_expr_path(), "bar")
+ for j in range(3):
+ self.assertEqual(
+ frame.FindVariable("bar").GetChildAtIndex(j).get_expr_path(),
f"(*bar)[{j}]"
+ )
+ for k in range(4):
+ self.assertEqual(
+ frame.FindVariable("bar")
+ .GetChildAtIndex(j)
+ .GetChildAtIndex(k)
+ .get_expr_path(),
+ f"(*bar)[{j}][{k}]",
+ )
diff --git a/lldb/test/API/python_api/value/get_expr_path/main.c
b/lldb/test/API/python_api/value/get_expr_path/main.c
new file mode 100644
index 0000000000000..f6fcb11e36835
--- /dev/null
+++ b/lldb/test/API/python_api/value/get_expr_path/main.c
@@ -0,0 +1,5 @@
+int main() {
+ int foo[2][3][4];
+ int (*bar)[3][4] = foo;
+ return 0; // Break at this line
+}
From 3b3c3048172d095246efd11bd11ad1b4dc2ce6ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matej=20Ko=C5=A1=C3=ADk?= <[email protected]>
Date: Tue, 9 Dec 2025 16:35:49 +0100
Subject: [PATCH 2/2] [lldb] fix the "ValueObject::GetExpressionPath" method
---
lldb/source/ValueObject/ValueObject.cpp | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lldb/source/ValueObject/ValueObject.cpp
b/lldb/source/ValueObject/ValueObject.cpp
index aeea32f19ee2c..3bbb917e51976 100644
--- a/lldb/source/ValueObject/ValueObject.cpp
+++ b/lldb/source/ValueObject/ValueObject.cpp
@@ -2138,6 +2138,20 @@ void ValueObject::GetExpressionPath(Stream &s,
ValueObject *parent = GetParent();
+ if (parent) {
+ lldb_private::CompilerType parentType = parent->GetCompilerType();
+ const bool parentTypeIsPointer = parentType.IsPointerType();
+ const bool pointeeOfParentTypeIsArray =
+ parentType.GetPointeeType().IsArrayType(nullptr, nullptr, nullptr);
+ if (parentTypeIsPointer && pointeeOfParentTypeIsArray) {
+ s.PutCString("(*");
+ parent->GetExpressionPath(s, epformat);
+ s.PutCString(")");
+ s.PutCString(GetName().GetCString());
+ return;
+ }
+ }
+
if (parent)
parent->GetExpressionPath(s, epformat);
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits