@@ -3572,8 +3572,33 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
35723572 // Check if the alias exists. If it doesn't, then get or create the global.
35733573 if (CGM.getItaniumVTableContext ().isRelativeLayout ())
35743574 VTable = CGM.getModule ().getNamedAlias (VTableName);
3575- if (!VTable)
3576- VTable = CGM.getModule ().getOrInsertGlobal (VTableName, CGM.Int8PtrTy );
3575+
3576+ // To generate valid device code global pointers should have global address
3577+ // space in SYCL.
3578+ bool GenTyInfoGVWithGlobalAS =
3579+ CGM.getLangOpts ().SYCLIsDevice &&
3580+ CGM.getLangOpts ().SYCLAllowVirtualFunctions &&
3581+ (VTableName == ClassTypeInfo || VTableName == SIClassTypeInfo);
3582+ auto VTableTy =
3583+ GenTyInfoGVWithGlobalAS
3584+ ? CGM.Int8Ty ->getPointerTo (
3585+ CGM.getContext ().getTargetAddressSpace (LangAS::sycl_global))
3586+ : CGM.Int8PtrTy ;
3587+ if (!VTable) {
3588+ if (GenTyInfoGVWithGlobalAS) {
3589+ VTable = CGM.getModule ().getOrInsertGlobal (VTableName, VTableTy, [&] {
3590+ return new llvm::GlobalVariable (
3591+ CGM.getModule (), VTableTy, /* isConstant=*/ false ,
3592+ llvm::GlobalVariable::ExternalLinkage, /* Initializer=*/ nullptr ,
3593+ VTableName, /* InsertBefore=*/ nullptr ,
3594+ llvm::GlobalValue::ThreadLocalMode::NotThreadLocal,
3595+ llvm::Optional<unsigned >(
3596+ CGM.getContext ().getTargetAddressSpace (LangAS::sycl_global)));
3597+ });
3598+ } else {
3599+ VTable = CGM.getModule ().getOrInsertGlobal (VTableName, VTableTy);
3600+ }
3601+ }
35773602
35783603 CGM.setDSOLocal (cast<llvm::GlobalValue>(VTable->stripPointerCasts ()));
35793604
@@ -3585,15 +3610,15 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
35853610 // The vtable address point is 8 bytes after its start:
35863611 // 4 for the offset to top + 4 for the relative offset to rtti.
35873612 llvm::Constant *Eight = llvm::ConstantInt::get (CGM.Int32Ty , 8 );
3588- VTable = llvm::ConstantExpr::getBitCast (VTable, CGM. Int8PtrTy );
3613+ VTable = llvm::ConstantExpr::getBitCast (VTable, VTableTy );
35893614 VTable =
35903615 llvm::ConstantExpr::getInBoundsGetElementPtr (CGM.Int8Ty , VTable, Eight);
35913616 } else {
35923617 llvm::Constant *Two = llvm::ConstantInt::get (PtrDiffTy, 2 );
3593- VTable = llvm::ConstantExpr::getInBoundsGetElementPtr (CGM. Int8PtrTy , VTable,
3594- Two);
3618+ VTable =
3619+ llvm::ConstantExpr::getInBoundsGetElementPtr (VTableTy, VTable, Two);
35953620 }
3596- VTable = llvm::ConstantExpr::getBitCast (VTable, CGM. Int8PtrTy );
3621+ VTable = llvm::ConstantExpr::getBitCast (VTable, VTableTy );
35973622
35983623 Fields.push_back (VTable);
35993624}
0 commit comments