[clang] [ObjC] Expand isClassLayoutKnownStatically to base classes as long as the implementation of it is known (PR #85465)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 15 13:44:44 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: AtariDreams (AtariDreams)
<details>
<summary>Changes</summary>
Only 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:
- (modified) clang/lib/CodeGen/CGObjCMac.cpp (+8-1)
- (modified) clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m (+29-1)
``````````diff
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
- at interface NotNSObject {
+ __attribute((objc_root_class)) @interface RootClass {
+ int these, dont, change;
+}
+ at end
+
+ at implementation RootClass
+ at end
+
+ at interface StillStaticLayout : RootClass
+ at end
+
+ at 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
+}
+ at end
+
+__attribute((objc_root_class)) @interface NotNSObject {
int these, might, change;
}
@end
``````````
</details>
https://github.com/llvm/llvm-project/pull/85465
More information about the cfe-commits
mailing list