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

>From 63f3ada705b69c27ca37207c6f7e8098896602b7 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        | 70 +++++++++++++++++++
 1 file changed, 70 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..0bf3336527b0a0 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_$_SuperClass.superClassIvar" = hidden constant i64 20
+// CHECK: @"OBJC_IVAR_$_SuperClass._superClassProperty" = hidden constant i64 
24
+// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar" = global i64 
32
+// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar2" = global i64 
40
+// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden 
global i64 48
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 56
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +26,70 @@ -(void)meth {
 }
 @end
 
+// Ivars declared in the @interface
+@interface SuperClass : NSObject
+@property (nonatomic, assign) int superClassProperty;
+@end
+
+@implementation SuperClass {
+  int superClassIvar; // Declare an ivar
+}
+- (void)superClassMethod {
+    _superClassProperty = 42;
+    superClassIvar = 10;
+    // CHECK: load i64, ptr @"OBJC_IVAR_$_SuperClass
+    // CHECK: getelementptr inbounds i8, ptr %1, i64 20
+}
+@end
+
+// Inheritance and Ivars
+@interface IntermediateClass : SuperClass
+{
+    double intermediateClassIvar;
+
+    @protected
+    int intermediateClassIvar2;
+}
+@property (nonatomic, strong) SuperClass *intermediateProperty;
+@end
+
+@implementation IntermediateClass
+@synthesize intermediateProperty = _intermediateProperty;
+- (void)intermediateClassMethod {
+    intermediateClassIvar = 3.14;
+    // CHECK: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
+    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+}
+
+- (void)intermediateClassPropertyMethod {
+    self.intermediateProperty = 0;
+    // CHECK: getelementptr inbounds i8, ptr %2, i64 24
+}
+@end
+
+@interface SubClass : IntermediateClass
+{
+    double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)subclassVar {
+    
+    subClassIvar = 6.28;
+    // CHECK: load i64, ptr @"OBJC_IVAR_$_SubClass
+    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+}
+
+-(void)intermediateSubclassVar
+{
+    intermediateClassIvar = 3.14;
+    // CHECK: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
+    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+}
+
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From a89a220746836a6ff0931b26fc30f60ca92f0736 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Tue, 13 Feb 2024 14:52:49 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 layout can be statically known

As of now, we only check if a class directly inherits from NSObject to 
determine if said class has fixed offsets and can therefore have its memory 
layout statically known.

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.
---
 clang/lib/CodeGen/CGObjCMac.cpp               | 22 ++++++++++----
 .../constant-non-fragile-ivar-offset.m        | 30 +++++++++----------
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..b3d6c3ba314cc2 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 statically
+      // know the class layout
+      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 0bf3336527b0a0..765ef0bbec37d5 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -3,10 +3,10 @@
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
 // CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = hidden constant i64 20
 // CHECK: @"OBJC_IVAR_$_SuperClass._superClassProperty" = hidden constant i64 
24
-// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar" = global i64 
32
-// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar2" = global i64 
40
-// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden 
global i64 48
-// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 56
+// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar" = constant 
i64 32
+// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar2" = constant 
i64 40
+// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden 
constant i64 48
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = constant i64 56
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -22,7 +22,7 @@ @implementation StaticLayout {
 }
 -(void)meth {
   static_layout_ivar = 0;
-  // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_StaticLayout
+  // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayout
 }
 @end
 
@@ -37,8 +37,8 @@ @implementation SuperClass {
 - (void)superClassMethod {
     _superClassProperty = 42;
     superClassIvar = 10;
-    // CHECK: load i64, ptr @"OBJC_IVAR_$_SuperClass
-    // CHECK: getelementptr inbounds i8, ptr %1, i64 20
+    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SuperClass
+    // CHECK: getelementptr inbounds i8, ptr @"OBJC_IVAR_$_SuperClass
 }
 @end
 
@@ -57,13 +57,13 @@ @implementation IntermediateClass
 @synthesize intermediateProperty = _intermediateProperty;
 - (void)intermediateClassMethod {
     intermediateClassIvar = 3.14;
-    // CHECK: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
-    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
+    // CHECK: getelementptr inbounds i8, ptr @"OBJC_IVAR_$_IntermediateClass
 }
 
 - (void)intermediateClassPropertyMethod {
     self.intermediateProperty = 0;
-    // CHECK: getelementptr inbounds i8, ptr %2, i64 24
+    // CHECK: getelementptr inbounds i8, ptr 
@"OBJC_IVAR_$_IntermediateClass._intermediateProperty"
 }
 @end
 
@@ -77,15 +77,15 @@ @implementation SubClass
 - (void)subclassVar {
     
     subClassIvar = 6.28;
-    // CHECK: load i64, ptr @"OBJC_IVAR_$_SubClass
-    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass
+    // CHECK: getelementptr inbounds i8, ptr @"OBJC_IVAR_$_SubClass
 }
 
 -(void)intermediateSubclassVar
 {
     intermediateClassIvar = 3.14;
-    // CHECK: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
-    // CHECK: getelementptr inbounds i8, ptr %0, i64 %ivar
+    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
+    // CHECK: getelementptr inbounds i8, ptr @"OBJC_IVAR_$_IntermediateClass
 }
 
 @end
@@ -103,6 +103,6 @@ @implementation NotStaticLayout {
 }
 -(void)meth {
   not_static_layout_ivar = 0;
-  // CHECK: load i64, ptr @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar
+  // CHECK-NOT: load i64, ptr 
@"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar
 }
 @end

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

Reply via email to