-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[ObjC] Expand isClassLayoutKnownStatically to base classes as long as the implementation of it is known #85465
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang-codegen Author: AtariDreams (AtariDreams) ChangesOnly NSObject we can trust the layout of won't change even though we cannot directly see its @implementation Full diff: https://github.com/llvm/llvm-project/pull/85465.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index e815e097e1fb48..da47ef786cf816 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1595,6 +1595,11 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
// Test a class by checking its superclasses up to
// its base class if it has one.
+
+ // Cannot check a null class
+ if (!ID)
+ return false;
+
for (; ID; ID = ID->getSuperClass()) {
// The layout of base class NSObject
// is guaranteed to be statically known
@@ -1606,7 +1611,9 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
if (!ID->getImplementation())
return false;
}
- return false;
+
+ // We know the layout of all the intermediate classes and superclasses.
+ return true;
}
public:
diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 8d55e6c7d23081..ee4034e4b7f205 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -8,6 +8,12 @@
// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden constant i64 48
// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = constant i64 56
// CHECK: @"OBJC_IVAR_$_SubClass._subClassProperty" = hidden constant i64 64
+
+// CHECK: @"OBJC_IVAR_$_RootClass.these" = constant i64 0
+// CHECK: @"OBJC_IVAR_$_RootClass.dont" = constant i64 4
+// CHECK: @"OBJC_IVAR_$_RootClass.change" = constant i64 4
+// CHECK: @"OBJC_IVAR_$_StillStaticLayout.static_layout_ivar" = hidden global i32 12
+
// CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden global i64 12
@interface NSObject {
@@ -120,7 +126,29 @@ -(void)intermediateSubclassVar {
// CHECK: getelementptr inbounds i8, ptr %1, i64 64
@end
-@interface NotNSObject {
+ __attribute((objc_root_class)) @interface RootClass {
+ int these, dont, change;
+}
+@end
+
+@implementation RootClass
+@end
+
+@interface StillStaticLayout : RootClass
+@end
+
+@implementation StillStaticLayout {
+ int static_layout_ivar;
+}
+
+// CHECK-LABEL: define internal void @"\01-[StillStaticLayout meth]"
+-(void)meth {
+ static_layout_ivar = 0;
+ // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$StillStaticLayout.static_layout_ivar
+}
+@end
+
+__attribute((objc_root_class)) @interface NotNSObject {
int these, might, change;
}
@end
|
@llvm/pr-subscribers-clang Author: AtariDreams (AtariDreams) ChangesOnly NSObject we can trust the layout of won't change even though we cannot directly see its @implementation Full diff: https://github.com/llvm/llvm-project/pull/85465.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index e815e097e1fb48..da47ef786cf816 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1595,6 +1595,11 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
// Test a class by checking its superclasses up to
// its base class if it has one.
+
+ // Cannot check a null class
+ if (!ID)
+ return false;
+
for (; ID; ID = ID->getSuperClass()) {
// The layout of base class NSObject
// is guaranteed to be statically known
@@ -1606,7 +1611,9 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
if (!ID->getImplementation())
return false;
}
- return false;
+
+ // We know the layout of all the intermediate classes and superclasses.
+ return true;
}
public:
diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 8d55e6c7d23081..ee4034e4b7f205 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -8,6 +8,12 @@
// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden constant i64 48
// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = constant i64 56
// CHECK: @"OBJC_IVAR_$_SubClass._subClassProperty" = hidden constant i64 64
+
+// CHECK: @"OBJC_IVAR_$_RootClass.these" = constant i64 0
+// CHECK: @"OBJC_IVAR_$_RootClass.dont" = constant i64 4
+// CHECK: @"OBJC_IVAR_$_RootClass.change" = constant i64 4
+// CHECK: @"OBJC_IVAR_$_StillStaticLayout.static_layout_ivar" = hidden global i32 12
+
// CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden global i64 12
@interface NSObject {
@@ -120,7 +126,29 @@ -(void)intermediateSubclassVar {
// CHECK: getelementptr inbounds i8, ptr %1, i64 64
@end
-@interface NotNSObject {
+ __attribute((objc_root_class)) @interface RootClass {
+ int these, dont, change;
+}
+@end
+
+@implementation RootClass
+@end
+
+@interface StillStaticLayout : RootClass
+@end
+
+@implementation StillStaticLayout {
+ int static_layout_ivar;
+}
+
+// CHECK-LABEL: define internal void @"\01-[StillStaticLayout meth]"
+-(void)meth {
+ static_layout_ivar = 0;
+ // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$StillStaticLayout.static_layout_ivar
+}
+@end
+
+__attribute((objc_root_class)) @interface NotNSObject {
int these, might, change;
}
@end
|
d778404
to
3e11da6
Compare
357b8ca
to
ffbc1da
Compare
Going to ping @rjmccall |
@adrian-prantl thoughts on this? |
@davidchisnall thoughts? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can remove the null check when we prove ID
is never null.
@ahatanak Okay I removed the null check. |
0572dd0
to
9cb7c41
Compare
@ahatanak Can we please merge this? |
Can we assert that |
… the implementation of it is known Only NSObject we can trust the layout of won't change even though we cannot directly see its @implementation.
Done! @ahatanak! |
… the implementation of it is known (llvm#85465) Only NSObject we can trust the layout of won't change even though we cannot directly see its @implementation
Only NSObject we can trust the layout of won't change even though we cannot directly see its @implementation