@@ -3437,7 +3437,7 @@ class ItaniumRTTIBuilder {
34373437 llvm::Constant *GetAddrOfExternalRTTIDescriptor (QualType Ty);
34383438
34393439 // / BuildVTablePointer - Build the vtable pointer for the given type.
3440- void BuildVTablePointer (const Type *Ty);
3440+ void BuildVTablePointer (const Type *Ty, llvm::Constant *StorageAddress );
34413441
34423442 // / BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
34433443 // / inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
@@ -3834,7 +3834,8 @@ static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
38343834 return true ;
38353835}
38363836
3837- void ItaniumRTTIBuilder::BuildVTablePointer (const Type *Ty) {
3837+ void ItaniumRTTIBuilder::BuildVTablePointer (const Type *Ty,
3838+ llvm::Constant *StorageAddress) {
38383839 // abi::__class_type_info.
38393840 static const char * const ClassTypeInfo =
38403841 " _ZTVN10__cxxabiv117__class_type_infoE" ;
@@ -3981,9 +3982,12 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
39813982 VTable, Two);
39823983 }
39833984
3984- if (auto &Schema = CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer )
3985- VTable = CGM.getConstantSignedPointer (VTable, Schema, nullptr , GlobalDecl (),
3986- QualType (Ty, 0 ));
3985+ if (const auto &Schema =
3986+ CGM.getCodeGenOpts ().PointerAuth .CXXTypeInfoVTablePointer )
3987+ VTable = CGM.getConstantSignedPointer (
3988+ VTable, Schema,
3989+ Schema.isAddressDiscriminated () ? StorageAddress : nullptr ,
3990+ GlobalDecl (), QualType (Ty, 0 ));
39873991
39883992 Fields.push_back (VTable);
39893993}
@@ -4099,8 +4103,18 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
40994103 llvm::GlobalVariable::LinkageTypes Linkage,
41004104 llvm::GlobalValue::VisibilityTypes Visibility,
41014105 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+
41024116 // Add the vtable pointer.
4103- BuildVTablePointer (cast<Type>(Ty));
4117+ BuildVTablePointer (cast<Type>(Ty), GV );
41044118
41054119 // And the name.
41064120 llvm::GlobalVariable *TypeName = GetAddrOfTypeName (Ty, Linkage);
@@ -4218,16 +4232,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
42184232 llvm_unreachable (" HLSL doesn't support RTTI" );
42194233 }
42204234
4221- llvm::Constant *Init = llvm::ConstantStruct::getAnon (Fields);
4222-
4223- SmallString<256 > Name;
4224- llvm::raw_svector_ostream Out (Name);
4225- CGM.getCXXABI ().getMangleContext ().mangleCXXRTTI (Ty, Out);
4226- llvm::Module &M = CGM.getModule ();
4227- llvm::GlobalVariable *OldGV = M.getNamedGlobal (Name);
4228- llvm::GlobalVariable *GV =
4229- new llvm::GlobalVariable (M, Init->getType (),
4230- /* isConstant=*/ true , Linkage, Init, Name);
4235+ GV->replaceInitializer (llvm::ConstantStruct::getAnon (Fields));
42314236
42324237 // Export the typeinfo in the same circumstances as the vtable is exported.
42334238 auto GVDLLStorageClass = DLLStorageClass;
0 commit comments