//===----- CGOpenCLRuntime.cpp - Interface to OpenCL Runtimes -------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This provides an abstract class for OpenCL code generation. Concrete // subclasses of this implement code generation for specific OpenCL // runtime libraries. // //===----------------------------------------------------------------------===// #include "CGOpenCLRuntime.h" #include "CodeGenFunction.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GlobalValue.h" #include <assert.h> using namespace clang; using namespace CodeGen; CGOpenCLRuntime::~CGOpenCLRuntime() {} void CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, const VarDecl &D) { return CGF.EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage); } llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) { assert(T->isOpenCLSpecificType() && "Not an OpenCL specific type!"); llvm::LLVMContext& Ctx = CGM.getLLVMContext(); uint32_t ImgAddrSpc = CGM.getContext().getTargetAddressSpace(LangAS::opencl_global); switch (cast<BuiltinType>(T)->getKind()) { default: llvm_unreachable("Unexpected opencl builtin type!"); return nullptr; case BuiltinType::OCLImage1d: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image1d_t"), ImgAddrSpc); case BuiltinType::OCLImage1dArray: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image1d_array_t"), ImgAddrSpc); case BuiltinType::OCLImage1dBuffer: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image1d_buffer_t"), ImgAddrSpc); case BuiltinType::OCLImage2d: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image2d_t"), ImgAddrSpc); case BuiltinType::OCLImage2dArray: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image2d_array_t"), ImgAddrSpc); case BuiltinType::OCLImage2dDepth: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_depth_t"), ImgAddrSpc); case BuiltinType::OCLImage2dArrayDepth: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_array_depth_t"), ImgAddrSpc); case BuiltinType::OCLImage2dMSAA: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_msaa_t"), ImgAddrSpc); case BuiltinType::OCLImage2dArrayMSAA: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_t"), ImgAddrSpc); case BuiltinType::OCLImage2dMSAADepth: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_msaa_depth_t"), ImgAddrSpc); case BuiltinType::OCLImage2dArrayMSAADepth: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_depth_t"), ImgAddrSpc); case BuiltinType::OCLImage3d: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.image3d_t"), ImgAddrSpc); case BuiltinType::OCLSampler: return llvm::IntegerType::get(Ctx, 32); case BuiltinType::OCLEvent: return llvm::PointerType::get(llvm::StructType::create( Ctx, "opencl.event_t"), 0); case BuiltinType::OCLClkEvent: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.clk_event_t"), 0); case BuiltinType::OCLQueue: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.queue_t"), 0); case BuiltinType::OCLNDRange: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.ndrange_t"), 0); case BuiltinType::OCLReserveID: return llvm::PointerType::get( llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0); } }