https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/81335
>From a9626371dfceb87dc563092fa201df9408efcb77 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] --- .../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 +@interface StaticLayoutSubClass : StaticLayout +@end + +@implementation StaticLayoutSubClass { + int static_layout_ivar2; +} +-(void)meth2 { + static_layout_ivar2 = 0; + // CHECK: load i64, ptr @"OBJC_IVAR_$_StaticLayoutSubClass +} +@end + @interface NotNSObject { int these, might, change; } >From 1f55cf14c0ad1501c487fb6e1dcd91493498bacf Mon Sep 17 00:00:00 2001 From: Rose <83477269+ataridre...@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 | 17 ++++++++++++----- .../constant-non-fragile-ivar-offset.m | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 27d77e9a8a5511..ec4d432b8abf2b 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -1593,12 +1593,19 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac { } bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) { + if (!ID) + return false; + + if (ID->getName() == "NSObject") + return true; + // 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"; + // which inherits from NSObject, then we know that all its offsets must + // be fixed. + + // Check recursively for all intermediate superclasses. + return ID->getImplementation() && + isClassLayoutKnownStatically(ID->getSuperClass()); } 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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits