@@ -3437,7 +3437,7 @@ class ItaniumRTTIBuilder {
3437
3437
llvm::Constant *GetAddrOfExternalRTTIDescriptor (QualType Ty);
3438
3438
3439
3439
// / BuildVTablePointer - Build the vtable pointer for the given type.
3440
- void BuildVTablePointer (const Type *Ty);
3440
+ void BuildVTablePointer (const Type *Ty, llvm::Constant *StorageAddress );
3441
3441
3442
3442
// / BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3443
3443
// / inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
@@ -3834,7 +3834,8 @@ static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
3834
3834
return true ;
3835
3835
}
3836
3836
3837
- void ItaniumRTTIBuilder::BuildVTablePointer (const Type *Ty) {
3837
+ void ItaniumRTTIBuilder::BuildVTablePointer (const Type *Ty,
3838
+ llvm::Constant *StorageAddress) {
3838
3839
// abi::__class_type_info.
3839
3840
static const char * const ClassTypeInfo =
3840
3841
" _ZTVN10__cxxabiv117__class_type_infoE" ;
@@ -3982,13 +3983,11 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
3982
3983
}
3983
3984
3984
3985
if (const auto &Schema =
3985
- CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer ) {
3986
- // If address discrimination is enabled, we'll re-write that to actual
3987
- // storage address later in ItaniumRTTIBuilder::BuildTypeInfo.
3988
- llvm::Constant *StorageAddress = nullptr ;
3989
- VTable = CGM.getConstantSignedPointer (VTable, Schema, StorageAddress,
3990
- GlobalDecl (), QualType (Ty, 0 ));
3991
- }
3986
+ CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer )
3987
+ VTable = CGM.getConstantSignedPointer (
3988
+ VTable, Schema,
3989
+ Schema.isAddressDiscriminated () ? StorageAddress : nullptr ,
3990
+ GlobalDecl (), QualType (Ty, 0 ));
3992
3991
3993
3992
Fields.push_back (VTable);
3994
3993
}
@@ -4104,10 +4103,18 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
4104
4103
llvm::GlobalVariable::LinkageTypes Linkage,
4105
4104
llvm::GlobalValue::VisibilityTypes Visibility,
4106
4105
llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
4106
+ SmallString<256 > Name;
4107
+ llvm::raw_svector_ostream Out (Name);
4108
+ CGM.getCXXABI ().getMangleContext ().mangleCXXRTTI (Ty, Out);
4109
+ llvm::Module &M = CGM.getModule ();
4110
+ llvm::GlobalVariable *OldGV = M.getNamedGlobal (Name);
4111
+ // int8 is an arbitrary type to be replaced later with replaceInitializer.
4112
+ llvm::GlobalVariable *GV =
4113
+ new llvm::GlobalVariable (M, CGM.Int8Ty , /* isConstant=*/ true , Linkage,
4114
+ /* Initializer=*/ nullptr , Name);
4115
+
4107
4116
// Add the vtable pointer.
4108
- BuildVTablePointer (cast<Type>(Ty));
4109
- assert (Fields.size () == 1 );
4110
- size_t VTablePointerIdx = 0 ;
4117
+ BuildVTablePointer (cast<Type>(Ty), GV);
4111
4118
4112
4119
// And the name.
4113
4120
llvm::GlobalVariable *TypeName = GetAddrOfTypeName (Ty, Linkage);
@@ -4225,30 +4232,6 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
4225
4232
llvm_unreachable (" HLSL doesn't support RTTI" );
4226
4233
}
4227
4234
4228
- SmallString<256 > Name;
4229
- llvm::raw_svector_ostream Out (Name);
4230
- CGM.getCXXABI ().getMangleContext ().mangleCXXRTTI (Ty, Out);
4231
- llvm::Module &M = CGM.getModule ();
4232
- llvm::GlobalVariable *OldGV = M.getNamedGlobal (Name);
4233
- llvm::GlobalVariable *GV = new llvm::GlobalVariable (
4234
- M, llvm::ConstantStruct::getTypeForElements (Fields),
4235
- /* isConstant=*/ true , Linkage, /* Initializer=*/ nullptr , Name);
4236
- if (const auto &Schema =
4237
- CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer ) {
4238
- if (Schema.isAddressDiscriminated ()) {
4239
- // If type info vtable pointer is signed with address discrimination
4240
- // enabled, we need to place actual storage address (which was unknown
4241
- // during construction in ItaniumRTTIBuilder::BuildVTablePointer) in the
4242
- // corresponding field.
4243
- llvm::Constant *UnsignedVtablePointer =
4244
- cast<llvm::ConstantPtrAuth>(Fields[VTablePointerIdx])->getPointer ();
4245
- assert (VTablePointerIdx == 0 && " Expected 0 offset for StorageAddress" );
4246
- llvm::Constant *StorageAddress = GV;
4247
- Fields[VTablePointerIdx] = CGM.getConstantSignedPointer (
4248
- UnsignedVtablePointer, Schema, StorageAddress, GlobalDecl (),
4249
- QualType (cast<Type>(Ty), 0 ));
4250
- }
4251
- }
4252
4235
GV->replaceInitializer (llvm::ConstantStruct::getAnon (Fields));
4253
4236
4254
4237
// Export the typeinfo in the same circumstances as the vtable is exported.
0 commit comments