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

>From 57857bf2749a2801e9c4fb840a984a483ced6a44 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Mon, 23 Jun 2025 20:36:38 -0700
Subject: [PATCH 1/3] [lldb] Fix AppleObjCDeclVendor for classes which have no
 methods

Fix the rare case where an ObjC class has ivars but no methods. The fix is to 
not early
return when a class has no method list.
---
 .../AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp   |  7 +++----
 .../test/API/lang/objc/class-without-methods/Makefile |  5 +++++
 lldb/test/API/lang/objc/class-without-methods/Point.h |  8 ++++++++
 lldb/test/API/lang/objc/class-without-methods/Point.m |  4 ++++
 .../TestObjCClassWithoutMethods.py                    | 11 +++++++++++
 lldb/test/API/lang/objc/class-without-methods/main.m  |  9 +++++++++
 6 files changed, 40 insertions(+), 4 deletions(-)
 create mode 100644 lldb/test/API/lang/objc/class-without-methods/Makefile
 create mode 100644 lldb/test/API/lang/objc/class-without-methods/Point.h
 create mode 100644 lldb/test/API/lang/objc/class-without-methods/Point.m
 create mode 100644 
lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
 create mode 100644 lldb/test/API/lang/objc/class-without-methods/main.m

diff --git 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
index dac93931bab1b..1c120fcf2c356 100644
--- 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
+++ 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
@@ -552,10 +552,9 @@ bool ClassDescriptorV2::Describe(
     } else {
       std::optional<method_list_t> base_method_list =
           GetMethodList(process, class_ro->m_baseMethods_ptr);
-      if (!base_method_list)
-        return false;
-      if (!ProcessMethodList(instance_method_func, *base_method_list))
-        return false;
+      if (base_method_list)
+        if (!ProcessMethodList(instance_method_func, *base_method_list))
+          return false;
     }
   }
 
diff --git a/lldb/test/API/lang/objc/class-without-methods/Makefile 
b/lldb/test/API/lang/objc/class-without-methods/Makefile
new file mode 100644
index 0000000000000..f6f336c01bbc5
--- /dev/null
+++ b/lldb/test/API/lang/objc/class-without-methods/Makefile
@@ -0,0 +1,5 @@
+OBJC_SOURCES := Point.m main.m
+include Makefile.rules
+
+# Only objc metadata, no debug info, for Point.m
+Point.o: CFLAGS_EXTRAS += -g0
diff --git a/lldb/test/API/lang/objc/class-without-methods/Point.h 
b/lldb/test/API/lang/objc/class-without-methods/Point.h
new file mode 100644
index 0000000000000..85c0cd6c895b3
--- /dev/null
+++ b/lldb/test/API/lang/objc/class-without-methods/Point.h
@@ -0,0 +1,8 @@
+#import <objc/NSObject.h>
+
+@interface Point : NSObject {
+@public
+  float _x;
+  float _y;
+}
+@end
diff --git a/lldb/test/API/lang/objc/class-without-methods/Point.m 
b/lldb/test/API/lang/objc/class-without-methods/Point.m
new file mode 100644
index 0000000000000..eb5888e5b599f
--- /dev/null
+++ b/lldb/test/API/lang/objc/class-without-methods/Point.m
@@ -0,0 +1,4 @@
+#import "Point.h"
+
+@implementation Point
+@end
diff --git 
a/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py 
b/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
new file mode 100644
index 0000000000000..587f22dedadf7
--- /dev/null
+++ 
b/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
@@ -0,0 +1,11 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+    def test(self):
+        self.build()
+        lldbutil.run_to_source_breakpoint(self, "break here", 
lldb.SBFileSpec("main.m"))
+        self.expect("frame var -P1 p", substrs=["_x = 11", "_y = 22"])
diff --git a/lldb/test/API/lang/objc/class-without-methods/main.m 
b/lldb/test/API/lang/objc/class-without-methods/main.m
new file mode 100644
index 0000000000000..f3241f46bbe5f
--- /dev/null
+++ b/lldb/test/API/lang/objc/class-without-methods/main.m
@@ -0,0 +1,9 @@
+#import "Point.h"
+
+int main() {
+  Point *p = [Point new];
+  p->_x = 11;
+  p->_y = 22;
+  // break here
+  return 0;
+}

>From 039749958a76c2ab687863eee07468ca858c6f74 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Tue, 24 Jun 2025 08:46:33 -0700
Subject: [PATCH 2/3] Flatten nested if

---
 .../ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
index 1c120fcf2c356..cc0c9e728964e 100644
--- 
a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
+++ 
b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCClassDescriptorV2.cpp
@@ -552,9 +552,9 @@ bool ClassDescriptorV2::Describe(
     } else {
       std::optional<method_list_t> base_method_list =
           GetMethodList(process, class_ro->m_baseMethods_ptr);
-      if (base_method_list)
-        if (!ProcessMethodList(instance_method_func, *base_method_list))
-          return false;
+      if (base_method_list &&
+          !ProcessMethodList(instance_method_func, *base_method_list))
+        return false;
     }
   }
 

>From 77eb488e14cae14cd2ac58e26f7e2d12bbe8c5f4 Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee....@gmail.com>
Date: Tue, 24 Jun 2025 09:49:04 -0700
Subject: [PATCH 3/3] Move ivar declaration out of header

This ensures the debug info in main.o does not contain the ivars for Point.
---
 lldb/test/API/lang/objc/class-without-methods/Point.h       | 6 +-----
 lldb/test/API/lang/objc/class-without-methods/Point.m       | 5 ++++-
 .../class-without-methods/TestObjCClassWithoutMethods.py    | 2 +-
 lldb/test/API/lang/objc/class-without-methods/main.m        | 2 --
 4 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/lldb/test/API/lang/objc/class-without-methods/Point.h 
b/lldb/test/API/lang/objc/class-without-methods/Point.h
index 85c0cd6c895b3..a352259954eff 100644
--- a/lldb/test/API/lang/objc/class-without-methods/Point.h
+++ b/lldb/test/API/lang/objc/class-without-methods/Point.h
@@ -1,8 +1,4 @@
 #import <objc/NSObject.h>
 
-@interface Point : NSObject {
-@public
-  float _x;
-  float _y;
-}
+@interface Point : NSObject
 @end
diff --git a/lldb/test/API/lang/objc/class-without-methods/Point.m 
b/lldb/test/API/lang/objc/class-without-methods/Point.m
index eb5888e5b599f..770a857c80dc7 100644
--- a/lldb/test/API/lang/objc/class-without-methods/Point.m
+++ b/lldb/test/API/lang/objc/class-without-methods/Point.m
@@ -1,4 +1,7 @@
 #import "Point.h"
 
-@implementation Point
+@implementation Point {
+  float _x;
+  float _y;
+}
 @end
diff --git 
a/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py 
b/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
index 587f22dedadf7..f83b0352bf1a9 100644
--- 
a/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
+++ 
b/lldb/test/API/lang/objc/class-without-methods/TestObjCClassWithoutMethods.py
@@ -8,4 +8,4 @@ class TestCase(TestBase):
     def test(self):
         self.build()
         lldbutil.run_to_source_breakpoint(self, "break here", 
lldb.SBFileSpec("main.m"))
-        self.expect("frame var -P1 p", substrs=["_x = 11", "_y = 22"])
+        self.expect("frame var -P1 p", substrs=["_x = 0", "_y = 0"])
diff --git a/lldb/test/API/lang/objc/class-without-methods/main.m 
b/lldb/test/API/lang/objc/class-without-methods/main.m
index f3241f46bbe5f..0b6e14371bc59 100644
--- a/lldb/test/API/lang/objc/class-without-methods/main.m
+++ b/lldb/test/API/lang/objc/class-without-methods/main.m
@@ -2,8 +2,6 @@
 
 int main() {
   Point *p = [Point new];
-  p->_x = 11;
-  p->_y = 22;
   // break here
   return 0;
 }

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

Reply via email to