@@ -4098,7 +4098,8 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
4098
4098
llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
4099
4099
// Add the vtable pointer.
4100
4100
BuildVTablePointer (cast<Type>(Ty));
4101
- size_t VTablePointerIdx = Fields.size () - 1 ;
4101
+ assert (Fields.size () == 1 );
4102
+ size_t VTablePointerIdx = 0 ;
4102
4103
4103
4104
// And the name.
4104
4105
llvm::GlobalVariable *TypeName = GetAddrOfTypeName (Ty, Linkage);
@@ -4213,41 +4214,31 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
4213
4214
break ;
4214
4215
}
4215
4216
4216
- llvm::Constant *Init = llvm::ConstantStruct::getAnon (Fields);
4217
4217
SmallString<256 > Name;
4218
4218
llvm::raw_svector_ostream Out (Name);
4219
4219
CGM.getCXXABI ().getMangleContext ().mangleCXXRTTI (Ty, Out);
4220
4220
llvm::Module &M = CGM.getModule ();
4221
4221
llvm::GlobalVariable *OldGV = M.getNamedGlobal (Name);
4222
- llvm::GlobalVariable *GV =
4223
- new llvm::GlobalVariable (M, Init-> getType ( ),
4224
- /* isConstant=*/ true , Linkage, Init , Name);
4222
+ llvm::GlobalVariable *GV = new llvm::GlobalVariable (
4223
+ M, llvm::ConstantStruct::getTypeForElements (Fields ),
4224
+ /* isConstant=*/ true , Linkage, /* Initializer= */ nullptr , Name);
4225
4225
if (const auto &Schema =
4226
4226
CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer ) {
4227
4227
if (Schema.isAddressDiscriminated ()) {
4228
4228
// If type info vtable pointer is signed with address discrimination
4229
4229
// enabled, we need to place actual storage address (which was unknown
4230
4230
// during construction in ItaniumRTTIBuilder::BuildVTablePointer) in the
4231
4231
// corresponding field.
4232
- ConstantInitBuilder Builder (CGM);
4233
- auto InitBuilder = Builder.beginStruct ();
4234
- for (size_t I = 0 ; I < Fields.size (); ++I) {
4235
- if (I != VTablePointerIdx) {
4236
- InitBuilder.add (Fields[I]);
4237
- continue ;
4238
- }
4239
- auto *SignedVTablePointer = cast<llvm::ConstantPtrAuth>(Fields[I]);
4240
- llvm::Constant *UnsignedVtablePointer =
4241
- SignedVTablePointer->getPointer ();
4242
- llvm::Constant *StorageAddress =
4243
- InitBuilder.getAddrOfCurrentPosition (CGM.UnqualPtrTy );
4244
- InitBuilder.add (CGM.getConstantSignedPointer (
4245
- UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl (),
4246
- QualType (cast<Type>(Ty), 0 )));
4247
- }
4248
- InitBuilder.finishAndSetAsInitializer (GV);
4232
+ llvm::Constant *UnsignedVtablePointer =
4233
+ cast<llvm::ConstantPtrAuth>(Fields[VTablePointerIdx])->getPointer ();
4234
+ assert (VTablePointerIdx == 0 && " Expected 0 offset for StorageAddress" );
4235
+ llvm::Constant *StorageAddress = GV;
4236
+ Fields[VTablePointerIdx] = CGM.getConstantSignedPointer (
4237
+ UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl (),
4238
+ QualType (cast<Type>(Ty), 0 ));
4249
4239
}
4250
4240
}
4241
+ GV->replaceInitializer (llvm::ConstantStruct::getAnon (Fields));
4251
4242
4252
4243
// Export the typeinfo in the same circumstances as the vtable is exported.
4253
4244
auto GVDLLStorageClass = DLLStorageClass;
0 commit comments