Index: include/clang/Basic/TargetInfo.h =================================================================== --- include/clang/Basic/TargetInfo.h +++ include/clang/Basic/TargetInfo.h @@ -15,6 +15,7 @@ #ifndef LLVM_CLANG_BASIC_TARGETINFO_H #define LLVM_CLANG_BASIC_TARGETINFO_H +#include "clang/AST/Type.h" #include "clang/Basic/AddressSpaces.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/Specifiers.h" @@ -1028,9 +1029,17 @@ return getTargetOpts().SupportedOpenCLOptions; } - /// \brief Get OpenCL image type address space. - virtual LangAS::ID getOpenCLImageAddrSpace() const { + /// \brief Get address space for OpenCL type. + virtual LangAS::ID getOpenCLTypeAddrSpace(BuiltinType::Kind K) const { + switch (K) { +#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ + case BuiltinType::Id: \ return LangAS::opencl_global; +#include "clang/Basic/OpenCLImageTypes.def" + + default: + return LangAS::Default; + } } /// \returns Target specific vtbl ptr address space. Index: lib/AST/ASTContext.cpp =================================================================== --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -1624,6 +1624,7 @@ uint64_t Width = 0; unsigned Align = 8; bool AlignIsRequired = false; + unsigned AS = 0; switch (T->getTypeClass()) { #define TYPE(Class, Base) #define ABSTRACT_TYPE(Class, Base) @@ -1771,7 +1772,7 @@ Align = Target->getPointerAlign(0); break; case BuiltinType::OCLSampler: { - auto AS = getTargetAddressSpace(LangAS::opencl_constant); + AS = getTargetAddressSpace(LangAS::opencl_constant); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); break; @@ -1785,10 +1786,10 @@ Align = Target->getPointerAlign(0); break; #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ - case BuiltinType::Id: + case BuiltinType::Id: \ + AS = getTargetAddressSpace(Target->getOpenCLTypeAddrSpace(BuiltinType::Id)); #include "clang/Basic/OpenCLImageTypes.def" { - auto AS = getTargetAddressSpace(Target->getOpenCLImageAddrSpace()); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); } @@ -1799,8 +1800,7 @@ Align = Target->getPointerAlign(0); break; case Type::BlockPointer: { - unsigned AS = getTargetAddressSpace( - cast(T)->getPointeeType()); + AS = getTargetAddressSpace(cast(T)->getPointeeType()); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); break; @@ -1809,14 +1809,13 @@ case Type::RValueReference: { // alignof and sizeof should never enter this code path here, so we go // the pointer route. - unsigned AS = getTargetAddressSpace( - cast(T)->getPointeeType()); + AS = getTargetAddressSpace(cast(T)->getPointeeType()); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); break; } case Type::Pointer: { - unsigned AS = getTargetAddressSpace(cast(T)->getPointeeType()); + AS = getTargetAddressSpace(cast(T)->getPointeeType()); Width = Target->getPointerWidth(AS); Align = Target->getPointerAlign(AS); break; Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -2364,8 +2364,17 @@ } } - LangAS::ID getOpenCLImageAddrSpace() const override { + virtual LangAS::ID + getOpenCLTypeAddrSpace(BuiltinType::Kind K) const override { + switch (K) { +#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ + case BuiltinType::Id: \ return LangAS::opencl_constant; +#include "clang/Basic/OpenCLImageTypes.def" + + default: + return LangAS::Default; + } } /// \returns Target specific vtbl ptr address space. Index: lib/CodeGen/CGOpenCLRuntime.cpp =================================================================== --- lib/CodeGen/CGOpenCLRuntime.cpp +++ lib/CodeGen/CGOpenCLRuntime.cpp @@ -35,8 +35,6 @@ "Not an OpenCL specific type!"); llvm::LLVMContext& Ctx = CGM.getLLVMContext(); - uint32_t ImgAddrSpc = CGM.getContext().getTargetAddressSpace( - CGM.getTarget().getOpenCLImageAddrSpace()); switch (cast(T)->getKind()) { default: llvm_unreachable("Unexpected opencl builtin type!"); @@ -45,22 +43,31 @@ case BuiltinType::Id: \ return llvm::PointerType::get( \ llvm::StructType::create(Ctx, "opencl." #ImgType "_" #Suffix "_t"), \ - ImgAddrSpc); + CGM.getContext().getTargetAddressSpace( \ + CGM.getTarget().getOpenCLTypeAddrSpace(BuiltinType::Id))); #include "clang/Basic/OpenCLImageTypes.def" case BuiltinType::OCLSampler: return getSamplerType(); case BuiltinType::OCLEvent: - return llvm::PointerType::get(llvm::StructType::create( - Ctx, "opencl.event_t"), 0); + return llvm::PointerType::get( + llvm::StructType::create(Ctx, "opencl.event_t"), + CGM.getContext().getTargetAddressSpace( + CGM.getTarget().getOpenCLTypeAddrSpace(BuiltinType::OCLEvent))); case BuiltinType::OCLClkEvent: return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.clk_event_t"), 0); + llvm::StructType::create(Ctx, "opencl.clk_event_t"), + CGM.getContext().getTargetAddressSpace( + CGM.getTarget().getOpenCLTypeAddrSpace(BuiltinType::OCLClkEvent))); case BuiltinType::OCLQueue: return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.queue_t"), 0); + llvm::StructType::create(Ctx, "opencl.queue_t"), + CGM.getContext().getTargetAddressSpace( + CGM.getTarget().getOpenCLTypeAddrSpace(BuiltinType::OCLQueue))); case BuiltinType::OCLReserveID: return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0); + llvm::StructType::create(Ctx, "opencl.reserve_id_t"), + CGM.getContext().getTargetAddressSpace( + CGM.getTarget().getOpenCLTypeAddrSpace(BuiltinType::OCLReserveID))); } }