llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen 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 -@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 `````````` </details> https://github.com/llvm/llvm-project/pull/85465 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits