diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp | 92 |
1 files changed, 35 insertions, 57 deletions
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp index dbe375294d17..115b618056a4 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.cpp @@ -31,45 +31,28 @@ void CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, } llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) { - assert(T->isOpenCLSpecificType() && - "Not an OpenCL specific type!"); + assert(T->isOpenCLSpecificType() && "Not an OpenCL specific type!"); - llvm::LLVMContext& Ctx = CGM.getLLVMContext(); + // Check if the target has a specific translation for this type first. + if (llvm::Type *TransTy = CGM.getTargetCodeGenInfo().getOpenCLType(CGM, T)) + return TransTy; + + if (T->isSamplerT()) + return getSamplerType(T); + + return getPointerType(T); +} + +llvm::PointerType *CGOpenCLRuntime::getPointerType(const Type *T) { uint32_t AddrSpc = CGM.getContext().getTargetAddressSpace( CGM.getContext().getOpenCLTypeAddrSpace(T)); - switch (cast<BuiltinType>(T)->getKind()) { - default: - llvm_unreachable("Unexpected opencl builtin type!"); - return nullptr; -#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ - case BuiltinType::Id: \ - return llvm::PointerType::get( \ - llvm::StructType::create(Ctx, "opencl." #ImgType "_" #Suffix "_t"), \ - AddrSpc); -#include "clang/Basic/OpenCLImageTypes.def" - case BuiltinType::OCLSampler: - return getSamplerType(T); - case BuiltinType::OCLEvent: - return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.event_t"), AddrSpc); - case BuiltinType::OCLClkEvent: - return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.clk_event_t"), AddrSpc); - case BuiltinType::OCLQueue: - return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.queue_t"), AddrSpc); - case BuiltinType::OCLReserveID: - return llvm::PointerType::get( - llvm::StructType::create(Ctx, "opencl.reserve_id_t"), AddrSpc); -#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ - case BuiltinType::Id: \ - return llvm::PointerType::get( \ - llvm::StructType::create(Ctx, "opencl." #ExtType), AddrSpc); -#include "clang/Basic/OpenCLExtensionTypes.def" - } + return llvm::PointerType::get(CGM.getLLVMContext(), AddrSpc); } llvm::Type *CGOpenCLRuntime::getPipeType(const PipeType *T) { + if (llvm::Type *PipeTy = CGM.getTargetCodeGenInfo().getOpenCLType(CGM, T)) + return PipeTy; + if (T->isReadOnly()) return getPipeType(T, "opencl.pipe_ro_t", PipeROTy); else @@ -79,19 +62,19 @@ llvm::Type *CGOpenCLRuntime::getPipeType(const PipeType *T) { llvm::Type *CGOpenCLRuntime::getPipeType(const PipeType *T, StringRef Name, llvm::Type *&PipeTy) { if (!PipeTy) - PipeTy = llvm::PointerType::get(llvm::StructType::create( - CGM.getLLVMContext(), Name), - CGM.getContext().getTargetAddressSpace( - CGM.getContext().getOpenCLTypeAddrSpace(T))); + PipeTy = getPointerType(T); return PipeTy; } -llvm::PointerType *CGOpenCLRuntime::getSamplerType(const Type *T) { - if (!SamplerTy) - SamplerTy = llvm::PointerType::get(llvm::StructType::create( - CGM.getLLVMContext(), "opencl.sampler_t"), - CGM.getContext().getTargetAddressSpace( - CGM.getContext().getOpenCLTypeAddrSpace(T))); +llvm::Type *CGOpenCLRuntime::getSamplerType(const Type *T) { + if (SamplerTy) + return SamplerTy; + + if (llvm::Type *TransTy = CGM.getTargetCodeGenInfo().getOpenCLType( + CGM, CGM.getContext().OCLSamplerTy.getTypePtr())) + SamplerTy = TransTy; + else + SamplerTy = getPointerType(T); return SamplerTy; } @@ -117,7 +100,7 @@ llvm::Value *CGOpenCLRuntime::getPipeElemAlign(const Expr *PipeArg) { llvm::PointerType *CGOpenCLRuntime::getGenericVoidPointerType() { assert(CGM.getLangOpts().OpenCL); - return llvm::IntegerType::getInt8PtrTy( + return llvm::PointerType::get( CGM.getLLVMContext(), CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); } @@ -143,14 +126,14 @@ static const BlockExpr *getBlockExpr(const Expr *E) { /// corresponding block expression. void CGOpenCLRuntime::recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF, - llvm::Value *Block) { - assert(EnqueuedBlockMap.find(E) == EnqueuedBlockMap.end() && - "Block expression emitted twice"); + llvm::Value *Block, llvm::Type *BlockTy) { + assert(!EnqueuedBlockMap.contains(E) && "Block expression emitted twice"); assert(isa<llvm::Function>(InvokeF) && "Invalid invoke function"); assert(Block->getType()->isPointerTy() && "Invalid block literal type"); EnqueuedBlockMap[E].InvokeFunc = InvokeF; EnqueuedBlockMap[E].BlockArg = Block; - EnqueuedBlockMap[E].Kernel = nullptr; + EnqueuedBlockMap[E].BlockTy = BlockTy; + EnqueuedBlockMap[E].KernelHandle = nullptr; } llvm::Function *CGOpenCLRuntime::getInvokeFunction(const Expr *E) { @@ -165,22 +148,17 @@ CGOpenCLRuntime::emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E) { // to get the block literal. const BlockExpr *Block = getBlockExpr(E); - assert(EnqueuedBlockMap.find(Block) != EnqueuedBlockMap.end() && - "Block expression not emitted"); + assert(EnqueuedBlockMap.contains(Block) && "Block expression not emitted"); // Do not emit the block wrapper again if it has been emitted. - if (EnqueuedBlockMap[Block].Kernel) { + if (EnqueuedBlockMap[Block].KernelHandle) { return EnqueuedBlockMap[Block]; } auto *F = CGF.getTargetHooks().createEnqueuedBlockKernel( - CGF, EnqueuedBlockMap[Block].InvokeFunc, - EnqueuedBlockMap[Block].BlockArg->stripPointerCasts()); + CGF, EnqueuedBlockMap[Block].InvokeFunc, EnqueuedBlockMap[Block].BlockTy); // The common part of the post-processing of the kernel goes here. - F->addFnAttr(llvm::Attribute::NoUnwind); - F->setCallingConv( - CGF.getTypes().ClangCallConvToLLVMCallConv(CallingConv::CC_OpenCLKernel)); - EnqueuedBlockMap[Block].Kernel = F; + EnqueuedBlockMap[Block].KernelHandle = F; return EnqueuedBlockMap[Block]; } |