[clang] [ObjC] Recursively check superclasses to see if any inherit from NSObject (PR #81335)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 10 08:22:59 PST 2024
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+AtariDreams at 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
+ at interface StaticLayoutSubClass : StaticLayout
+ at end
+
+ at implementation StaticLayoutSubClass {
+ int static_layout_ivar2;
+}
+-(void)meth2 {
+ static_layout_ivar2 = 0;
+ // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass
+}
+ at end
+
@interface NotNSObject {
int these, might, change;
}
>From 193bec6224c2a04f486c24a7d262cbcb058cc1c3 Mon Sep 17 00:00:00 2001
From: Rose <83477269+AtariDreams at users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Recursively check superclasses to see if any
inherit from NSObject
If an NSObject subclass has fixed offsets, then so must the subclasses of that subclass!
---
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
More information about the cfe-commits
mailing list