@@ -624,7 +624,7 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
624
624
CGF.EmitBlock (FnVirtual);
625
625
626
626
// Cast the adjusted this to a pointer to vtable pointer and load.
627
- llvm::Type *VTableTy = Builder. getInt8PtrTy () ;
627
+ llvm::Type *VTableTy = CGF. CGM . GlobalsInt8PtrTy ;
628
628
CharUnits VTablePtrAlign =
629
629
CGF.CGM .getDynamicOffsetAlignment (ThisAddr.getAlignment (), RD,
630
630
CGF.getPointerAlign ());
@@ -1821,11 +1821,11 @@ llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1821
1821
// / Load the VTT.
1822
1822
llvm::Value *VTT = CGF.LoadCXXVTT ();
1823
1823
if (VirtualPointerIndex)
1824
- VTT = CGF.Builder .CreateConstInBoundsGEP1_64 (
1825
- CGF. VoidPtrTy , VTT, VirtualPointerIndex);
1824
+ VTT = CGF.Builder .CreateConstInBoundsGEP1_64 (CGF. GlobalsVoidPtrTy , VTT,
1825
+ VirtualPointerIndex);
1826
1826
1827
1827
// And load the address point from the VTT.
1828
- return CGF.Builder .CreateAlignedLoad (CGF.VoidPtrTy , VTT,
1828
+ return CGF.Builder .CreateAlignedLoad (CGF.GlobalsVoidPtrTy , VTT,
1829
1829
CGF.getPointerAlign ());
1830
1830
}
1831
1831
@@ -1853,12 +1853,13 @@ llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1853
1853
CGM.getItaniumVTableContext ().getVTableLayout (RD);
1854
1854
llvm::Type *VTableType = CGM.getVTables ().getVTableType (VTLayout);
1855
1855
1856
- // Use pointer alignment for the vtable. Otherwise we would align them based
1857
- // on the size of the initializer which doesn't make sense as only single
1858
- // values are read.
1856
+ // Use pointer to global alignment for the vtable. Otherwise we would align
1857
+ // them based on the size of the initializer which doesn't make sense as only
1858
+ // single values are read.
1859
+ LangAS AS = CGM.GetGlobalVarAddressSpace (nullptr );
1859
1860
unsigned PAlign = CGM.getItaniumVTableContext ().isRelativeLayout ()
1860
1861
? 32
1861
- : CGM.getTarget ().getPointerAlign (LangAS::Default );
1862
+ : CGM.getTarget ().getPointerAlign (AS );
1862
1863
1863
1864
VTable = CGM.CreateOrReplaceCXXRuntimeVariable (
1864
1865
Name, VTableType, llvm::GlobalValue::ExternalLinkage,
@@ -1893,7 +1894,7 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1893
1894
Address This,
1894
1895
llvm::Type *Ty,
1895
1896
SourceLocation Loc) {
1896
- llvm::Type *PtrTy = llvm::PointerType::getUnqual (CGF. getLLVMContext ()) ;
1897
+ llvm::Type *PtrTy = CGM. GlobalsInt8PtrTy ;
1897
1898
auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl ());
1898
1899
llvm::Value *VTable = CGF.GetVTablePtr (This, PtrTy, MethodDecl->getParent ());
1899
1900
@@ -3157,10 +3158,9 @@ ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
3157
3158
// Note for the future: If we would ever like to do deferred emission of
3158
3159
// RTTI, check if emitting vtables opportunistically need any adjustment.
3159
3160
3160
- GV = new llvm::GlobalVariable (CGM.getModule (), CGM.Int8PtrTy ,
3161
- /* isConstant=*/ true ,
3162
- llvm::GlobalValue::ExternalLinkage, nullptr ,
3163
- Name);
3161
+ GV = new llvm::GlobalVariable (
3162
+ CGM.getModule (), CGM.GlobalsInt8PtrTy ,
3163
+ /* isConstant=*/ true , llvm::GlobalValue::ExternalLinkage, nullptr , Name);
3164
3164
const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl ();
3165
3165
CGM.setGVProperties (GV, RD);
3166
3166
// Import the typeinfo symbol when all non-inline virtual methods are
@@ -3173,7 +3173,7 @@ ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
3173
3173
}
3174
3174
}
3175
3175
3176
- return llvm::ConstantExpr::getBitCast (GV, CGM. Int8PtrTy ) ;
3176
+ return GV ;
3177
3177
}
3178
3178
3179
3179
// / TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
@@ -3551,7 +3551,8 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
3551
3551
if (CGM.getItaniumVTableContext ().isRelativeLayout ())
3552
3552
VTable = CGM.getModule ().getNamedAlias (VTableName);
3553
3553
if (!VTable)
3554
- VTable = CGM.getModule ().getOrInsertGlobal (VTableName, CGM.Int8PtrTy );
3554
+ VTable =
3555
+ CGM.getModule ().getOrInsertGlobal (VTableName, CGM.GlobalsInt8PtrTy );
3555
3556
3556
3557
CGM.setDSOLocal (cast<llvm::GlobalValue>(VTable->stripPointerCasts ()));
3557
3558
@@ -3563,15 +3564,13 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
3563
3564
// The vtable address point is 8 bytes after its start:
3564
3565
// 4 for the offset to top + 4 for the relative offset to rtti.
3565
3566
llvm::Constant *Eight = llvm::ConstantInt::get (CGM.Int32Ty , 8 );
3566
- VTable = llvm::ConstantExpr::getBitCast (VTable, CGM.Int8PtrTy );
3567
3567
VTable =
3568
3568
llvm::ConstantExpr::getInBoundsGetElementPtr (CGM.Int8Ty , VTable, Eight);
3569
3569
} else {
3570
3570
llvm::Constant *Two = llvm::ConstantInt::get (PtrDiffTy, 2 );
3571
- VTable = llvm::ConstantExpr::getInBoundsGetElementPtr (CGM.Int8PtrTy , VTable ,
3572
- Two);
3571
+ VTable = llvm::ConstantExpr::getInBoundsGetElementPtr (CGM.GlobalsInt8PtrTy ,
3572
+ VTable, Two);
3573
3573
}
3574
- VTable = llvm::ConstantExpr::getBitCast (VTable, CGM.Int8PtrTy );
3575
3574
3576
3575
Fields.push_back (VTable);
3577
3576
}
@@ -3643,7 +3642,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) {
3643
3642
assert (!OldGV->hasAvailableExternallyLinkage () &&
3644
3643
" available_externally typeinfos not yet implemented" );
3645
3644
3646
- return llvm::ConstantExpr::getBitCast ( OldGV, CGM. Int8PtrTy ) ;
3645
+ return OldGV;
3647
3646
}
3648
3647
3649
3648
// Check if there is already an external RTTI descriptor for this type.
@@ -3703,9 +3702,9 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
3703
3702
llvm::ConstantInt::get (CGM.Int64Ty , ((uint64_t )1 ) << 63 );
3704
3703
TypeNameField = llvm::ConstantExpr::getAdd (TypeNameField, flag);
3705
3704
TypeNameField =
3706
- llvm::ConstantExpr::getIntToPtr (TypeNameField, CGM.Int8PtrTy );
3705
+ llvm::ConstantExpr::getIntToPtr (TypeNameField, CGM.GlobalsInt8PtrTy );
3707
3706
} else {
3708
- TypeNameField = llvm::ConstantExpr::getBitCast ( TypeName, CGM. Int8PtrTy ) ;
3707
+ TypeNameField = TypeName;
3709
3708
}
3710
3709
Fields.push_back (TypeNameField);
3711
3710
@@ -3835,7 +3834,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
3835
3834
GV->setComdat (M.getOrInsertComdat (GV->getName ()));
3836
3835
3837
3836
CharUnits Align = CGM.getContext ().toCharUnitsFromBits (
3838
- CGM.getTarget ().getPointerAlign (LangAS::Default ));
3837
+ CGM.getTarget ().getPointerAlign (CGM. GetGlobalVarAddressSpace ( nullptr ) ));
3839
3838
GV->setAlignment (Align.getAsAlign ());
3840
3839
3841
3840
// The Itanium ABI specifies that type_info objects must be globally
@@ -3867,7 +3866,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
3867
3866
TypeName->setPartition (CGM.getCodeGenOpts ().SymbolPartition );
3868
3867
GV->setPartition (CGM.getCodeGenOpts ().SymbolPartition );
3869
3868
3870
- return llvm::ConstantExpr::getBitCast (GV, CGM. Int8PtrTy ) ;
3869
+ return GV ;
3871
3870
}
3872
3871
3873
3872
// / BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
0 commit comments