llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Igor Kudrin (igorkudrin)

<details>
<summary>Changes</summary>

The 'ValueObject::AddressOf()' method assumes that the address of a value 
object cannot change, so when it is calculated once, it does not need to be 
updated afterwards. However, this is not the case if the 'ValueObject' is a 
dependent object obtained by calling 'Dereference()' of another 'ValueObject'. 
If the latter object is changed, the dependent value object should return a new 
address from the 'AddressOf()' method to reflect the change.

---
Full diff: https://github.com/llvm/llvm-project/pull/212915.diff


4 Files Affected:

- (modified) lldb/source/ValueObject/ValueObject.cpp (+4-3) 
- (added) lldb/test/API/python_api/value/change_ptr/Makefile (+3) 
- (added) lldb/test/API/python_api/value/change_ptr/TestChangePtr.py (+22) 
- (added) lldb/test/API/python_api/value/change_ptr/main.c (+7) 


``````````diff
diff --git a/lldb/source/ValueObject/ValueObject.cpp 
b/lldb/source/ValueObject/ValueObject.cpp
index e2bfa02500f2c..b36a020d262c4 100644
--- a/lldb/source/ValueObject/ValueObject.cpp
+++ b/lldb/source/ValueObject/ValueObject.cpp
@@ -2913,9 +2913,6 @@ ValueObjectSP ValueObject::Dereference(Status &error) {
 }
 
 ValueObjectSP ValueObject::AddressOf(Status &error) {
-  if (m_addr_of_valobj_sp)
-    return m_addr_of_valobj_sp;
-
   auto [addr, address_type] = GetAddressOf(/*scalar_is_load_address=*/false);
   error.Clear();
   if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost) {
@@ -2929,6 +2926,10 @@ ValueObjectSP ValueObject::AddressOf(Status &error) {
 
     case eAddressTypeFile:
     case eAddressTypeLoad: {
+      if (m_addr_of_valobj_sp &&
+          m_addr_of_valobj_sp->GetValueAsUnsigned(LLDB_INVALID_ADDRESS) == 
addr)
+        return m_addr_of_valobj_sp;
+      m_addr_of_valobj_sp.reset();
       CompilerType compiler_type = GetCompilerType();
       if (compiler_type) {
         std::string name(1, '&');
diff --git a/lldb/test/API/python_api/value/change_ptr/Makefile 
b/lldb/test/API/python_api/value/change_ptr/Makefile
new file mode 100644
index 0000000000000..10495940055b6
--- /dev/null
+++ b/lldb/test/API/python_api/value/change_ptr/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules
diff --git a/lldb/test/API/python_api/value/change_ptr/TestChangePtr.py 
b/lldb/test/API/python_api/value/change_ptr/TestChangePtr.py
new file mode 100644
index 0000000000000..378332568e097
--- /dev/null
+++ b/lldb/test/API/python_api/value/change_ptr/TestChangePtr.py
@@ -0,0 +1,22 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class ChangePtrTest(TestBase):
+
+    def test(self):
+        self.build()
+
+        _, _, thread, _ = lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.c")
+        )
+        frame = thread.GetFrameAtIndex(0)
+        p = frame.FindVariable("p")
+        deref = p.Dereference()
+        self.assertEqual(deref.GetValueAsUnsigned(), 5)
+        self.assertEqual(deref.AddressOf().GetValueAsUnsigned(), 
p.GetValueAsUnsigned())
+        thread.StepOver()
+        self.assertEqual(deref.GetValueAsUnsigned(), 7)
+        self.assertEqual(deref.AddressOf().GetValueAsUnsigned(), 
p.GetValueAsUnsigned())
diff --git a/lldb/test/API/python_api/value/change_ptr/main.c 
b/lldb/test/API/python_api/value/change_ptr/main.c
new file mode 100644
index 0000000000000..15f223ae2577a
--- /dev/null
+++ b/lldb/test/API/python_api/value/change_ptr/main.c
@@ -0,0 +1,7 @@
+int main() {
+  int a = 5;
+  int b = 7;
+  int *p = &a;
+  p = &b; // break here
+  return 0;
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/212915
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to