@@ -4152,21 +4152,31 @@ void IRGenModule::emitAccessibleFunctions() {
41524152 llvm::GlobalValue::PrivateLinkage, /* initializer*/ nullptr ,
41534153 mangledRecordName);
41544154
4155+ ConstantInitBuilder builder (*this );
4156+ ConstantStructBuilder fields =
4157+ builder.beginStruct (AccessibleFunctionRecordTy);
4158+
41554159 std::string mangledFunctionName =
41564160 LinkEntity::forSILFunction (func).mangleAsString ();
41574161 llvm::Constant *name = getAddrOfGlobalString (
41584162 mangledFunctionName, /* willBeRelativelyAddressed*/ true );
4159- llvm::Constant *relativeName = emitDirectRelativeReference (name, var, {});
4163+ fields.addRelativeAddress (name);
4164+
4165+ llvm::Constant *genericEnvironment = nullptr ;
41604166
41614167 GenericSignature signature;
41624168 if (auto *env = func->getGenericEnvironment ()) {
41634169 signature = env->getGenericSignature ();
4170+ genericEnvironment =
4171+ getAddrOfGenericEnvironment (signature.getCanonicalSignature ());
41644172 }
41654173
4174+ fields.addRelativeAddressOrNull (genericEnvironment);
4175+
41664176 llvm::Constant *type = getTypeRef (func->getLoweredFunctionType (), signature,
41674177 MangledTypeRefRole::Metadata)
41684178 .first ;
4169- llvm::Constant *relativeType = emitDirectRelativeReference (type, var, { 1 } );
4179+ fields. addRelativeAddress (type);
41704180
41714181 llvm::Constant *funcAddr = nullptr ;
41724182 if (func->isDistributed ()) {
@@ -4178,20 +4188,13 @@ void IRGenModule::emitAccessibleFunctions() {
41784188 funcAddr = getAddrOfSILFunction (func, NotForDefinition);
41794189 }
41804190
4181- llvm::Constant *relativeFuncAddr =
4182- emitDirectRelativeReference (funcAddr, var, {2 });
4183-
4184- AccessibleFunctionFlags flagsVal;
4185- flagsVal.setDistributed (func->isDistributed ());
4191+ fields.addRelativeAddress (funcAddr);
41864192
4187- llvm::Constant *flags =
4188- llvm::ConstantInt::get (Int32Ty, flagsVal.getOpaqueValue ());
4193+ AccessibleFunctionFlags flags;
4194+ flags.setDistributed (func->isDistributed ());
4195+ fields.addInt32 (flags.getOpaqueValue ());
41894196
4190- llvm::Constant *recordFields[] = {relativeName, relativeType,
4191- relativeFuncAddr, flags};
4192- auto record =
4193- llvm::ConstantStruct::get (AccessibleFunctionRecordTy, recordFields);
4194- var->setInitializer (record);
4197+ fields.finishAndSetAsInitializer (var);
41954198 var->setSection (sectionName);
41964199 var->setAlignment (llvm::MaybeAlign (4 ));
41974200 disableAddressSanitizer (*this , var);
0 commit comments