@@ -2098,41 +2098,44 @@ static llvm::Function *emitObjCMetadataUpdateFunction(IRGenModule &IGM,
2098
2098
// / We emit Objective-C class stubs for non-generic classes with resilient
2099
2099
// / ancestry. This lets us attach categories to the class even though it
2100
2100
// / does not have statically-emitted metadata.
2101
- bool irgen ::hasObjCResilientClassStub (IRGenModule &IGM, ClassDecl *D) {
2102
- assert (IGM. getClassMetadataStrategy (D) == ClassMetadataStrategy::Resilient);
2103
- return IGM. ObjCInterop && !D->isGenericContext ();
2101
+ bool IRGenModule ::hasObjCResilientClassStub (ClassDecl *D) {
2102
+ assert (getClassMetadataStrategy (D) == ClassMetadataStrategy::Resilient);
2103
+ return ObjCInterop && !D->isGenericContext ();
2104
2104
}
2105
2105
2106
- void irgen ::emitObjCResilientClassStub (IRGenModule &IGM, ClassDecl *D) {
2107
- assert (hasObjCResilientClassStub (IGM, D));
2106
+ void IRGenModule ::emitObjCResilientClassStub (ClassDecl *D) {
2107
+ assert (hasObjCResilientClassStub (D));
2108
2108
2109
- llvm::Constant *fields[] = {
2110
- llvm::ConstantInt::get (IGM.SizeTy , 0 ), // reserved
2111
- llvm::ConstantInt::get (IGM.SizeTy , 1 ), // isa
2112
- IGM.getAddrOfObjCMetadataUpdateFunction (D, NotForDefinition)
2113
- };
2114
- auto init = llvm::ConstantStruct::get (IGM.ObjCFullResilientClassStubTy ,
2115
- makeArrayRef (fields));
2109
+ ConstantInitBuilder builder (*this );
2110
+ auto fields = builder.beginStruct (ObjCFullResilientClassStubTy);
2111
+ fields.addInt (SizeTy, 0 ); // reserved
2112
+ fields.addInt (SizeTy, 1 ); // isa
2113
+ auto *impl = getAddrOfObjCMetadataUpdateFunction (D, NotForDefinition);
2114
+ const auto &schema =
2115
+ getOptions ().PointerAuth .ResilientClassStubInitCallbacks ;
2116
+ fields.addSignedPointer (impl, schema, PointerAuthEntity ()); // callback
2117
+
2118
+ auto init = fields.finishAndCreateFuture ();
2116
2119
2117
2120
// Define the full stub. This is a private symbol.
2121
+ LinkEntity entity = LinkEntity::forObjCResilientClassStub (
2122
+ D, TypeMetadataAddress::FullMetadata);
2118
2123
auto fullObjCStub = cast<llvm::GlobalVariable>(
2119
- IGM.getAddrOfObjCResilientClassStub (D, ForDefinition,
2120
- TypeMetadataAddress::FullMetadata));
2121
- fullObjCStub->setInitializer (init);
2124
+ getAddrOfLLVMVariable (entity, init, DebugTypeInfo ()));
2122
2125
2123
2126
// Emit the metadata update function referenced above.
2124
- emitObjCMetadataUpdateFunction (IGM , D);
2127
+ emitObjCMetadataUpdateFunction (* this , D);
2125
2128
2126
2129
// Apply the offset.
2127
- auto *objcStub = llvm::ConstantExpr::getBitCast (fullObjCStub, IGM. Int8PtrTy );
2130
+ auto *objcStub = llvm::ConstantExpr::getBitCast (fullObjCStub, Int8PtrTy);
2128
2131
objcStub = llvm::ConstantExpr::getInBoundsGetElementPtr (
2129
- IGM. Int8Ty , objcStub, IGM. getSize (IGM. getPointerSize ()));
2132
+ Int8Ty, objcStub, getSize (getPointerSize ()));
2130
2133
objcStub = llvm::ConstantExpr::getPointerCast (objcStub,
2131
- IGM. ObjCResilientClassStubTy ->getPointerTo ());
2134
+ ObjCResilientClassStubTy->getPointerTo ());
2132
2135
2133
- auto entity = LinkEntity::forObjCResilientClassStub (
2136
+ entity = LinkEntity::forObjCResilientClassStub (
2134
2137
D, TypeMetadataAddress::AddressPoint);
2135
- IGM. defineAlias (entity, objcStub);
2138
+ defineAlias (entity, objcStub);
2136
2139
}
2137
2140
2138
2141
// / Emit the private data (RO-data) associated with a class.
0 commit comments