@@ -4152,21 +4152,31 @@ void IRGenModule::emitAccessibleFunctions() {
4152
4152
llvm::GlobalValue::PrivateLinkage, /* initializer*/ nullptr ,
4153
4153
mangledRecordName);
4154
4154
4155
+ ConstantInitBuilder builder (*this );
4156
+ ConstantStructBuilder fields =
4157
+ builder.beginStruct (AccessibleFunctionRecordTy);
4158
+
4155
4159
std::string mangledFunctionName =
4156
4160
LinkEntity::forSILFunction (func).mangleAsString ();
4157
4161
llvm::Constant *name = getAddrOfGlobalString (
4158
4162
mangledFunctionName, /* willBeRelativelyAddressed*/ true );
4159
- llvm::Constant *relativeName = emitDirectRelativeReference (name, var, {});
4163
+ fields.addRelativeAddress (name);
4164
+
4165
+ llvm::Constant *genericEnvironment = nullptr ;
4160
4166
4161
4167
GenericSignature signature;
4162
4168
if (auto *env = func->getGenericEnvironment ()) {
4163
4169
signature = env->getGenericSignature ();
4170
+ genericEnvironment =
4171
+ getAddrOfGenericEnvironment (signature.getCanonicalSignature ());
4164
4172
}
4165
4173
4174
+ fields.addRelativeAddressOrNull (genericEnvironment);
4175
+
4166
4176
llvm::Constant *type = getTypeRef (func->getLoweredFunctionType (), signature,
4167
4177
MangledTypeRefRole::Metadata)
4168
4178
.first ;
4169
- llvm::Constant *relativeType = emitDirectRelativeReference (type, var, { 1 } );
4179
+ fields. addRelativeAddress (type);
4170
4180
4171
4181
llvm::Constant *funcAddr = nullptr ;
4172
4182
if (func->isDistributed ()) {
@@ -4178,20 +4188,13 @@ void IRGenModule::emitAccessibleFunctions() {
4178
4188
funcAddr = getAddrOfSILFunction (func, NotForDefinition);
4179
4189
}
4180
4190
4181
- llvm::Constant *relativeFuncAddr =
4182
- emitDirectRelativeReference (funcAddr, var, {2 });
4183
-
4184
- AccessibleFunctionFlags flagsVal;
4185
- flagsVal.setDistributed (func->isDistributed ());
4191
+ fields.addRelativeAddress (funcAddr);
4186
4192
4187
- llvm::Constant *flags =
4188
- llvm::ConstantInt::get (Int32Ty, flagsVal.getOpaqueValue ());
4193
+ AccessibleFunctionFlags flags;
4194
+ flags.setDistributed (func->isDistributed ());
4195
+ fields.addInt32 (flags.getOpaqueValue ());
4189
4196
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);
4195
4198
var->setSection (sectionName);
4196
4199
var->setAlignment (llvm::MaybeAlign (4 ));
4197
4200
disableAddressSanitizer (*this , var);
0 commit comments