@@ -2205,8 +2205,17 @@ void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
2205
2205
llvm::PointerType *PtrTy = llvm::PointerType::get (
2206
2206
getLLVMContext (), TheModule.getDataLayout ().getProgramAddressSpace ());
2207
2207
2208
+ llvm::PointerType *TargetType = PtrTy;
2209
+ // Get target type when templated global variables are used,
2210
+ // to emit them correctly in the target (default) address space and avoid
2211
+ // emitting them in a private address space.
2212
+ if (getLangOpts ().SYCLIsDevice )
2213
+ TargetType = llvm::PointerType::get (
2214
+ getLLVMContext (), getContext ().getTargetAddressSpace (LangAS::Default));
2215
+
2216
+
2208
2217
// Get the type of a ctor entry, { i32, ptr, ptr }.
2209
- llvm::StructType *CtorStructTy = llvm::StructType::get (Int32Ty, PtrTy, PtrTy );
2218
+ llvm::StructType *CtorStructTy = llvm::StructType::get (Int32Ty, PtrTy, TargetType );
2210
2219
2211
2220
// Construct the constructor and destructor arrays.
2212
2221
ConstantInitBuilder Builder (*this );
@@ -2232,9 +2241,10 @@ void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
2232
2241
Ctor.add (I.Initializer );
2233
2242
}
2234
2243
if (I.AssociatedData )
2235
- Ctor.add (I.AssociatedData );
2244
+ Ctor.add (llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast (
2245
+ I.AssociatedData , TargetType));
2236
2246
else
2237
- Ctor.addNullPointer (PtrTy );
2247
+ Ctor.addNullPointer (TargetType );
2238
2248
Ctor.finishAndAddTo (Ctors);
2239
2249
}
2240
2250
0 commit comments