[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

AtariDreams wrote:

Sorry, that was codegen, I meant 
![image](https://github.com/llvm/llvm-project/assets/83477269/cd59af73-2f4a-48b6-b847-0994c8191ab2)


https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

AtariDreams wrote:

Layout before and after my change:
https://github.com/llvm/llvm-project/assets/83477269/6e45ad11-16e8-4dcc-8d7b-f8e29a1a9cc0";>


https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 3287e1ddb572f73ca774e50323b037d50b600e34 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 82 +++
 1 file changed, 82 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..6806fbf8f435aa 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,12 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +26,82 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 698bb848e711093fddae88b780f86e67be0306e9 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

To determine this, we need to find that the compiler can see the implementation 
of each intermediate class, as that means it is statically linked.

Perhaps there is another way to figure this out at link time as well, but that 
is for another time and another PR.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checking its superclasses up to its base class if it has
+// one
+while (ID) {
+  // Th

[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 4bdf6f78a595e7e33387a1b4f1f80286b0163d47 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 83 +++
 1 file changed, 83 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..e9096f2449a859 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,13 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +27,82 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 3679a6b4b575e00433e6e2d2bff7df96df201d1c Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

To determine this, we need to find that the compiler can see the implementation 
of each intermediate class, as that means it is statically linked.

Perhaps there is another way to figure this out at link time as well, but that 
is for another time and another PR.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checki

[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 4bdf6f78a595e7e33387a1b4f1f80286b0163d47 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 83 +++
 1 file changed, 83 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..e9096f2449a859 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,13 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +27,82 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 1b8bbd58639e7519d74336e9a28c2f58e6aa3696 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

To determine this, we need to find that the compiler can see the implementation 
of each intermediate class, as that means it is statically linked.

Perhaps there is another way to figure this out at link time as well, but that 
is for another time and another PR.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  6 ++---
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by check

[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 527e24ae4d6f662c2bee1a281914df028bcd01e1 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 84 +++
 1 file changed, 84 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..bed6497f8827ae 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,13 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +27,83 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+// Custom setter logic
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 467244d2c2fe6e0c526344360326e704616295d2 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

To determine this, we need to find that the compiler can see the implementation 
of each intermediate class, as that means it is statically linked.

Perhaps there is another way to figure this out at link time as well, but that 
is for another time and another PR.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  6 ++---
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+

[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams edited 
https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 527e24ae4d6f662c2bee1a281914df028bcd01e1 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 84 +++
 1 file changed, 84 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..bed6497f8827ae 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,13 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +27,83 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+// Custom setter logic
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From f22d935cb80d79ea5354317bcd34049579ccf3ee Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  6 ++---
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checking its superclasses up to its base class if it has
+// one
+while (ID) {
+  // The base class NSObject is a fixed size
+  if (ID->getName() == "NSObject")
+return true;
+
+  // If we cannot see the @implementa

[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

AtariDreams wrote:

> test seems completely inadequate — you need to test that we're doing the 
> static layout properly, and you need to test with ivars coming from a variety 
> of different places, including:
> 
> * ivars declared in the `@interface`
> * ivars declared in the `@implementation`
> * ivars synthesized explicitly in the `@implementation`
> * vars synthesized implicitly in the `@implementation`

I think it is the only way, otherwise it would have to be done at link time. 
Can we do it at link time? probably another PR would have to deal with that.

https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

AtariDreams wrote:

> Okay, your description of the change here is very misleading; it doesn't even 
> mention that this is specific to having an `@implementation` for every 
> intermediate class.
> 
> Your test seems completely inadequate — you need to test that we're doing the 
> static layout properly, and you need to test with ivars coming from a variety 
> of different places, including:
> 
> * ivars declared in the `@interface`
> * ivars declared in the `@implementation`
> * ivars synthesized explicitly in the `@implementation`
> * vars synthesized implicitly in the `@implementation`

So this is a way to check for static linked; if the compiler can see the 
@implementation, right?

Only then can we "opt-out" of the non-fragile ABI like NSObject and its 
subclasses do, right? 



https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread John McCall via cfe-commits

https://github.com/rjmccall requested changes to this pull request.

Okay, your description of the change here is very misleading; it doesn't even 
mention that this is specific to having an `@implementation` for every 
intermediate class.

Your test seems completely inadequate — you need to test that we're doing the 
static layout properly, and you need to test with ivars coming from a variety 
of different places, including:
- ivars declared in the `@interface`
- ivars declared in the `@implementation`
- ivars synthesized explicitly in the `@implementation`
- vars synthesized implicitly in the `@implementation`

https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams edited 
https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 70c646a54852f33306ff567b5cb125558e2b9529 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../CodeGenObjC/constant-non-fragile-ivar-offset.m  | 13 +
 1 file changed, 13 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..40a97ba62ec6cf 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +21,18 @@ -(void)meth {
 }
 @end
 
+@interface StaticLayoutSubClass : StaticLayout
+@end
+
+@implementation StaticLayoutSubClass {
+  int static_layout_ivar2;
+}
+-(void)meth2 {
+  static_layout_ivar2 = 0;
+  // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From f196660a9cebcfefed3a0ba68b8024e30698ea15 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checking its superclasses up to its base class if it has
+// one
+while (ID) {
+  // The base class NSObject is a fixed size
+  if (ID->getName() == "NSObject")
+return true;
+
+  // If we cannot see the @implementation of a class, we cannot assume 
fixed
+  // offsets
+  if (!ID->getImplementation())
+return false;
+
+  // Test superclass
+  ID = ID->getSuperClass();
+}
+return false;
   }
 
 public:
diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 40a97ba62ec6cf..c5bc2be0dfdb84 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,7 +1,7 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
-// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
global i64 24
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -29,7 +29,7 @@ @implementation StaticLayoutSubClass {
 }
 -(void)meth2 {
   static_layout_ivar2 = 0;
-  // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
+  // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
 }
 @end
 

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


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

AtariDreams wrote:

@rjmccall Do you think this is acceptable? 

https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 18987af24d2f53d00e2ac42998a8f1580e35afdf Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../CodeGenObjC/constant-non-fragile-ivar-offset.m  | 13 +
 1 file changed, 13 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..40a97ba62ec6cf 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +21,18 @@ -(void)meth {
 }
 @end
 
+@interface StaticLayoutSubClass : StaticLayout
+@end
+
+@implementation StaticLayoutSubClass {
+  int static_layout_ivar2;
+}
+-(void)meth2 {
+  static_layout_ivar2 = 0;
+  // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 6f5944a577b45d6a9fb65e72c78cb55766c4f753 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 has fixed offsets

As of now, we only check if a class directly inherits from NSObject to 
determine if said lass has fixed offsets and can therefore "opt-out" from the 
non-fragile ABI for ivars.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checking its superclasses up to its base class if it has
+// one
+while (ID) {
+  // The base class NSObject is a fixed size
+  if (ID->getName() == "NSObject")
+return true;
+
+  // If we cannot see the @implementation of a class, we cannot assume 
fixed
+  // offsets
+  if (!ID->getImplementation())
+return false;
+
+  // Test superclass
+  ID = ID->getSuperClass();
+}
+return false;
   }
 
 public:
diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 40a97ba62ec6cf..c5bc2be0dfdb84 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,7 +1,7 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
-// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
global i64 24
+// CHECK: @"OBJC_IVAR_$_StaticLayoutSubClass.static_layout_ivar2" = hidden 
constant i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -29,7 +29,7 @@ @implementation StaticLayoutSubClass {
 }
 -(void)meth2 {
   static_layout_ivar2 = 0;
-  // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
+  // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
 }
 @end
 

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


[clang] [ObjC] Check entire chain of superclasses to see if class has fixed offsets (PR #81335)

2024-02-10 Thread via cfe-commits

https://github.com/AtariDreams edited 
https://github.com/llvm/llvm-project/pull/81335
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits