forked from OSchip/llvm-project
Class Property: generate metadata for class properties in protocols.
The list of class properties is saved in Old ABI: protocol->ext->class_properties (protocol->ext->size will be updated) New ABI: protocol->class_properties (protocol->size will be updated) rdar://23891898 llvm-svn: 259268
This commit is contained in:
parent
96df0b33f6
commit
ce7bff5e7f
|
@ -2801,6 +2801,7 @@ llvm::Constant *CGObjCMac::GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) {
|
|||
struct objc_method_description_list *optional_class_methods;
|
||||
struct objc_property_list *instance_properties;
|
||||
const char ** extendedMethodTypes;
|
||||
struct objc_property_list *class_properties;
|
||||
};
|
||||
*/
|
||||
llvm::Constant *
|
||||
|
@ -2821,11 +2822,14 @@ CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
|
|||
EmitPropertyList("OBJC_$_PROP_PROTO_LIST_" + PD->getName(), nullptr, PD,
|
||||
ObjCTypes, false),
|
||||
EmitProtocolMethodTypes("OBJC_PROTOCOL_METHOD_TYPES_" + PD->getName(),
|
||||
MethodTypesExt, ObjCTypes)};
|
||||
MethodTypesExt, ObjCTypes),
|
||||
EmitPropertyList("OBJC_$_CLASS_PROP_PROTO_LIST_" + PD->getName(), nullptr,
|
||||
PD, ObjCTypes, true)};
|
||||
|
||||
// Return null if no extension bits are used.
|
||||
if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
|
||||
Values[3]->isNullValue() && Values[4]->isNullValue())
|
||||
Values[3]->isNullValue() && Values[4]->isNullValue() &&
|
||||
Values[5]->isNullValue())
|
||||
return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
|
||||
|
||||
llvm::Constant *Init =
|
||||
|
@ -5290,12 +5294,13 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
|
|||
// struct _objc_method_description_list *optional_class_methods;
|
||||
// struct _objc_property_list *instance_properties;
|
||||
// const char ** extendedMethodTypes;
|
||||
// struct _objc_property_list *class_properties;
|
||||
// }
|
||||
ProtocolExtensionTy =
|
||||
llvm::StructType::create("struct._objc_protocol_extension",
|
||||
IntTy, MethodDescriptionListPtrTy,
|
||||
MethodDescriptionListPtrTy, PropertyListPtrTy,
|
||||
Int8PtrPtrTy, nullptr);
|
||||
Int8PtrPtrTy, PropertyListPtrTy, nullptr);
|
||||
|
||||
// struct _objc_protocol_extension *
|
||||
ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
|
||||
|
@ -5471,6 +5476,7 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
|
|||
// const uint32_t flags; // = 0
|
||||
// const char ** extendedMethodTypes;
|
||||
// const char *demangledName;
|
||||
// const struct _prop_list_t * class_properties;
|
||||
// }
|
||||
|
||||
// Holder for struct _protocol_list_t *
|
||||
|
@ -5483,7 +5489,7 @@ ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModul
|
|||
MethodListnfABIPtrTy, MethodListnfABIPtrTy,
|
||||
MethodListnfABIPtrTy, MethodListnfABIPtrTy,
|
||||
PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy,
|
||||
Int8PtrTy,
|
||||
Int8PtrTy, PropertyListPtrTy,
|
||||
nullptr);
|
||||
|
||||
// struct _protocol_t*
|
||||
|
@ -6437,6 +6443,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
|
|||
/// const uint32_t flags; // = 0
|
||||
/// const char ** extendedMethodTypes;
|
||||
/// const char *demangledName;
|
||||
/// const struct _prop_list_t * class_properties;
|
||||
/// }
|
||||
/// @endcode
|
||||
///
|
||||
|
@ -6488,7 +6495,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
|||
MethodTypesExt.insert(MethodTypesExt.end(),
|
||||
OptMethodTypesExt.begin(), OptMethodTypesExt.end());
|
||||
|
||||
llvm::Constant *Values[12];
|
||||
llvm::Constant *Values[13];
|
||||
// isa is NULL
|
||||
Values[0] = llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy);
|
||||
Values[1] = GetClassName(PD->getObjCRuntimeNameAsString());
|
||||
|
@ -6524,6 +6531,10 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
|||
MethodTypesExt, ObjCTypes);
|
||||
// const char *demangledName;
|
||||
Values[11] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
||||
|
||||
Values[12] = EmitPropertyList(
|
||||
"\01l_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
|
||||
nullptr, PD, ObjCTypes, true);
|
||||
|
||||
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy,
|
||||
Values);
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck -check-prefix=CHECK-FRAGILE %s
|
||||
|
||||
// CHECK: @"\01l_OBJC_$_CLASS_PROP_LIST_Proto" = private global {{.*}} section "__DATA, __objc_const", align 8
|
||||
// CHECK: @"\01l_OBJC_PROTOCOL_$_Proto" = {{.*}} global %struct._protocol_t { {{.*}} i32 96, i32 {{.*}} @"\01l_OBJC_$_CLASS_PROP_LIST_Proto" {{.*}} }
|
||||
// CHECK: @"\01l_OBJC_$_CLASS_PROP_LIST_Foo_$_Category" = private global {{.*}} section "__DATA, __objc_const", align 8
|
||||
// CHECK: @"\01l_OBJC_$_CATEGORY_Foo_$_Category" = private global %struct._category_t { {{.*}} @"\01l_OBJC_$_CLASS_PROP_LIST_Foo_$_Category" {{.*}} }, section "__DATA, __objc_const", align 8
|
||||
|
||||
// CHECK: !{i32 1, !"Objective-C Class Properties", i32 64}
|
||||
|
||||
// CHECK-FRAGILE: @"OBJC_$_CLASS_PROP_PROTO_LIST_Proto" = private global {{.*}} section "__OBJC,__property,regular,no_dead_strip", align 8
|
||||
// CHECK-FRAGILE: @"\01l_OBJC_PROTOCOLEXT_Proto" = private global %struct._objc_protocol_extension { i32 48, {{.*}} @"OBJC_$_CLASS_PROP_PROTO_LIST_Proto" {{.*}} }, align 8
|
||||
// CHECK-FRAGILE: @"\01l_OBJC_$_CLASS_PROP_LIST_Foo_Category" = private global {{.*}} section "__OBJC,__property,regular,no_dead_strip", align 8
|
||||
// CHECK-FRAGILE: @OBJC_CATEGORY_Foo_Category = private global %struct._objc_category { {{.*}}, i32 64, {{.*}} @"\01l_OBJC_$_CLASS_PROP_LIST_Foo_Category" {{.*}} }, section "__OBJC,__category,regular,no_dead_strip", align 8
|
||||
|
||||
|
|
|
@ -14,4 +14,4 @@
|
|||
+ ClsP { return 0; }
|
||||
@end
|
||||
|
||||
// CHECK: %struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8**, i8* }
|
||||
// CHECK: %struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8**, i8*, %struct._prop_list_t* }
|
||||
|
|
Loading…
Reference in New Issue