Mercurial > hg > CbC > CbC_llvm
diff clang/lib/CodeGen/CGOpenCLRuntime.cpp @ 252:1f2b6ac9f198 llvm-original
LLVM16-1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Aug 2023 09:04:13 +0900 |
parents | c4bab56944e8 |
children |
line wrap: on
line diff
--- a/clang/lib/CodeGen/CGOpenCLRuntime.cpp Wed Nov 09 17:47:54 2022 +0900 +++ b/clang/lib/CodeGen/CGOpenCLRuntime.cpp Fri Aug 18 09:04:13 2023 +0900 @@ -31,8 +31,11 @@ } llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) { - assert(T->isOpenCLSpecificType() && - "Not an OpenCL specific type!"); + assert(T->isOpenCLSpecificType() && "Not an OpenCL specific type!"); + + // Check if the target has a specific translation for this type first. + if (llvm::Type *TransTy = CGM.getTargetCodeGenInfo().getOpenCLType(CGM, T)) + return TransTy; switch (cast<BuiltinType>(T)->getKind()) { default: @@ -75,6 +78,9 @@ } 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 @@ -91,12 +97,18 @@ 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 = llvm::PointerType::get( + llvm::StructType::create(CGM.getLLVMContext(), "opencl.sampler_t"), + CGM.getContext().getTargetAddressSpace( + CGM.getContext().getOpenCLTypeAddrSpace(T))); return SamplerTy; } @@ -122,7 +134,7 @@ llvm::PointerType *CGOpenCLRuntime::getGenericVoidPointerType() { assert(CGM.getLangOpts().OpenCL); - return llvm::IntegerType::getInt8PtrTy( + return llvm::PointerType::get( CGM.getLLVMContext(), CGM.getContext().getTargetAddressSpace(LangAS::opencl_generic)); } @@ -149,14 +161,13 @@ void CGOpenCLRuntime::recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF, llvm::Value *Block, llvm::Type *BlockTy) { - assert(EnqueuedBlockMap.find(E) == EnqueuedBlockMap.end() && - "Block expression emitted twice"); + 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].BlockTy = BlockTy; - EnqueuedBlockMap[E].Kernel = nullptr; + EnqueuedBlockMap[E].KernelHandle = nullptr; } llvm::Function *CGOpenCLRuntime::getInvokeFunction(const Expr *E) { @@ -171,11 +182,10 @@ // 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]; } @@ -183,9 +193,6 @@ 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]; }