Author: epilk Date: Thu Apr 11 10:55:34 2019 New Revision: 358201 URL: http://llvm.org/viewvc/llvm-project?rev=358201&view=rev Log: Support objc_nonlazy_class attribute on Objective-C implementations
Fixes rdar://49523079 Differential revision: https://reviews.llvm.org/D60544 Modified: cfe/trunk/include/clang/Basic/Attr.td cfe/trunk/include/clang/Basic/AttrDocs.td cfe/trunk/lib/CodeGen/CGObjCMac.cpp cfe/trunk/test/CodeGenObjC/non-lazy-classes.m cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test cfe/trunk/test/SemaObjC/attr-objc-non-lazy.m Modified: cfe/trunk/include/clang/Basic/Attr.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/Attr.td (original) +++ cfe/trunk/include/clang/Basic/Attr.td Thu Apr 11 10:55:34 2019 @@ -1767,7 +1767,7 @@ def ObjCRootClass : InheritableAttr { def ObjCNonLazyClass : Attr { let Spellings = [Clang<"objc_nonlazy_class">]; - let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; + let Subjects = SubjectList<[ObjCInterface, ObjCImpl], ErrorDiag>; let LangOpts = [ObjC]; let Documentation = [ObjCNonLazyClassDocs]; } Modified: cfe/trunk/include/clang/Basic/AttrDocs.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrDocs.td?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/AttrDocs.td (original) +++ cfe/trunk/include/clang/Basic/AttrDocs.td Thu Apr 11 10:55:34 2019 @@ -3711,14 +3711,14 @@ ensure that this class cannot be subclas def ObjCNonLazyClassDocs : Documentation { let Category = DocCatDecl; let Content = [{ -This attribute can be added to an Objective-C ``@interface`` declaration to -add the class to the list of non-lazily initialized classes. A non-lazy class -will be initialized eagerly when the Objective-C runtime is loaded. This is -required for certain system classes which have instances allocated in -non-standard ways, such as the classes for blocks and constant strings. Adding -this attribute is essentially equivalent to providing a trivial `+load` method -but avoids the (fairly small) load-time overheads associated with defining and -calling such a method. +This attribute can be added to an Objective-C ``@interface`` or +``@implementation`` declaration to add the class to the list of non-lazily +initialized classes. A non-lazy class will be initialized eagerly when the +Objective-C runtime is loaded. This is required for certain system classes which +have instances allocated in non-standard ways, such as the classes for blocks +and constant strings. Adding this attribute is essentially equivalent to +providing a trivial `+load` method but avoids the (fairly small) load-time +overheads associated with defining and calling such a method. }]; } Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original) +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Thu Apr 11 10:55:34 2019 @@ -6262,7 +6262,8 @@ CGObjCNonFragileABIMac::BuildClassObject bool CGObjCNonFragileABIMac::ImplementationIsNonLazy( const ObjCImplDecl *OD) const { return OD->getClassMethod(GetNullarySelector("load")) != nullptr || - OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>(); + OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>() || + OD->hasAttr<ObjCNonLazyClassAttr>(); } void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID, Modified: cfe/trunk/test/CodeGenObjC/non-lazy-classes.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/non-lazy-classes.m?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/test/CodeGenObjC/non-lazy-classes.m (original) +++ cfe/trunk/test/CodeGenObjC/non-lazy-classes.m Thu Apr 11 10:55:34 2019 @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -Wno-objc-root-class -emit-llvm -o - %s | \ -// RUN: FileCheck %s -// CHECK: @"OBJC_LABEL_NONLAZY_CLASS_$" = private global [2 x {{.*}}]{{.*}}@"OBJC_CLASS_$_A"{{.*}},{{.*}}@"OBJC_CLASS_$_D"{{.*}} section "__DATA,__objc_nlclslist,regular,no_dead_strip", align 8 -// CHECK: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = private global [1 x {{.*}}] {{.*}}@"\01l_OBJC_$_CATEGORY_A_$_Cat"{{.*}}, section "__DATA,__objc_nlcatlist,regular,no_dead_strip", align 8 +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -Wno-objc-root-class -emit-llvm -o - %s | FileCheck %s + +// CHECK: @"OBJC_LABEL_NONLAZY_CLASS_$" = private global [3 x {{.*}}]{{.*}}@"OBJC_CLASS_$_A"{{.*}},{{.*}}@"OBJC_CLASS_$_D"{{.*}},{{.*}}"OBJC_CLASS_$_E"{{.*}} section "__DATA,__objc_nlclslist,regular,no_dead_strip", align 8 +// CHECK: @"OBJC_LABEL_NONLAZY_CATEGORY_$" = private global [2 x {{.*}}] {{.*}}@"\01l_OBJC_$_CATEGORY_A_$_Cat"{{.*}},{{.*}}@"\01l_OBJC_$_CATEGORY_E_$_MyCat"{{.*}}, section "__DATA,__objc_nlcatlist,regular,no_dead_strip", align 8 @interface A @end @implementation A @@ -35,3 +35,11 @@ __attribute__((objc_nonlazy_class)) @interface D @end @implementation D @end + +@interface E @end + +__attribute__((objc_nonlazy_class)) +@implementation E @end + +__attribute__((objc_nonlazy_class)) +@implementation E (MyCat) @end Modified: cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test (original) +++ cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test Thu Apr 11 10:55:34 2019 @@ -102,7 +102,7 @@ // CHECK-NEXT: ObjCExplicitProtocolImpl (SubjectMatchRule_objc_protocol) // CHECK-NEXT: ObjCExternallyRetained (SubjectMatchRule_variable_not_is_parameter, SubjectMatchRule_function, SubjectMatchRule_block, SubjectMatchRule_objc_method) // CHECK-NEXT: ObjCMethodFamily (SubjectMatchRule_objc_method) -// CHECK-NEXT: ObjCNonLazyClass (SubjectMatchRule_objc_interface) +// CHECK-NEXT: ObjCNonLazyClass (SubjectMatchRule_objc_interface, SubjectMatchRule_objc_implementation) // CHECK-NEXT: ObjCPreciseLifetime (SubjectMatchRule_variable) // CHECK-NEXT: ObjCRequiresPropertyDefs (SubjectMatchRule_objc_interface) // CHECK-NEXT: ObjCRequiresSuper (SubjectMatchRule_objc_method) Modified: cfe/trunk/test/SemaObjC/attr-objc-non-lazy.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-objc-non-lazy.m?rev=358201&r1=358200&r2=358201&view=diff ============================================================================== --- cfe/trunk/test/SemaObjC/attr-objc-non-lazy.m (original) +++ cfe/trunk/test/SemaObjC/attr-objc-non-lazy.m Thu Apr 11 10:55:34 2019 @@ -29,7 +29,11 @@ void foo(); @interface E @end -// expected-error@+1 {{'objc_nonlazy_class' attribute only applies to Objective-C interfaces}} + __attribute__((objc_nonlazy_class)) @implementation E @end + +__attribute__((objc_nonlazy_class)) +@implementation E (MyCat) +@end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits