CGOpenCLRuntime.cpp revision 302408
1110453Sdes//===----- CGOpenCLRuntime.cpp - Interface to OpenCL Runtimes -------------===// 2110453Sdes// 3219563Sdes// The LLVM Compiler Infrastructure 4110453Sdes// 5110453Sdes// This file is distributed under the University of Illinois Open Source 6110453Sdes// License. See LICENSE.TXT for details. 7110453Sdes// 8110453Sdes//===----------------------------------------------------------------------===// 9110453Sdes// 10110453Sdes// This provides an abstract class for OpenCL code generation. Concrete 11110453Sdes// subclasses of this implement code generation for specific OpenCL 12110453Sdes// runtime libraries. 13110453Sdes// 14110453Sdes//===----------------------------------------------------------------------===// 15110453Sdes 16110453Sdes#include "CGOpenCLRuntime.h" 17110453Sdes#include "CodeGenFunction.h" 18110453Sdes#include "llvm/IR/DerivedTypes.h" 19110453Sdes#include "llvm/IR/GlobalValue.h" 20110453Sdes#include <assert.h> 21110453Sdes 22110453Sdesusing namespace clang; 23110453Sdesusing namespace CodeGen; 24110453Sdes 25110453SdesCGOpenCLRuntime::~CGOpenCLRuntime() {} 26110453Sdes 27110453Sdesvoid CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, 28110453Sdes const VarDecl &D) { 29110453Sdes return CGF.EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage); 30110453Sdes} 31110453Sdes 32110453Sdesllvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) { 33110453Sdes assert(T->isOpenCLSpecificType() && 34110453Sdes "Not an OpenCL specific type!"); 35110453Sdes 36110453Sdes llvm::LLVMContext& Ctx = CGM.getLLVMContext(); 37110453Sdes uint32_t ImgAddrSpc = 38110453Sdes CGM.getContext().getTargetAddressSpace(LangAS::opencl_global); 39110453Sdes switch (cast<BuiltinType>(T)->getKind()) { 40110453Sdes default: 41110453Sdes llvm_unreachable("Unexpected opencl builtin type!"); 42110453Sdes return nullptr; 43110453Sdes case BuiltinType::OCLImage1d: 44110453Sdes return llvm::PointerType::get(llvm::StructType::create( 45110453Sdes Ctx, "opencl.image1d_t"), ImgAddrSpc); 46110453Sdes case BuiltinType::OCLImage1dArray: 47110453Sdes return llvm::PointerType::get(llvm::StructType::create( 48110453Sdes Ctx, "opencl.image1d_array_t"), ImgAddrSpc); 49110453Sdes case BuiltinType::OCLImage1dBuffer: 50110453Sdes return llvm::PointerType::get(llvm::StructType::create( 51110453Sdes Ctx, "opencl.image1d_buffer_t"), ImgAddrSpc); 52110453Sdes case BuiltinType::OCLImage2d: 53110453Sdes return llvm::PointerType::get(llvm::StructType::create( 54110453Sdes Ctx, "opencl.image2d_t"), ImgAddrSpc); 55110453Sdes case BuiltinType::OCLImage2dArray: 56110453Sdes return llvm::PointerType::get(llvm::StructType::create( 57110453Sdes Ctx, "opencl.image2d_array_t"), ImgAddrSpc); 58110453Sdes case BuiltinType::OCLImage2dDepth: 59110453Sdes return llvm::PointerType::get( 60219563Sdes llvm::StructType::create(Ctx, "opencl.image2d_depth_t"), ImgAddrSpc); 61123448Sdes case BuiltinType::OCLImage2dArrayDepth: 62123448Sdes return llvm::PointerType::get( 63110453Sdes llvm::StructType::create(Ctx, "opencl.image2d_array_depth_t"), 64110453Sdes ImgAddrSpc); 65110453Sdes case BuiltinType::OCLImage2dMSAA: 66110453Sdes return llvm::PointerType::get( 67110453Sdes llvm::StructType::create(Ctx, "opencl.image2d_msaa_t"), ImgAddrSpc); 68110653Sdes case BuiltinType::OCLImage2dArrayMSAA: 69110653Sdes return llvm::PointerType::get( 70110453Sdes llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_t"), 71110453Sdes ImgAddrSpc); 72110453Sdes case BuiltinType::OCLImage2dMSAADepth: 73110453Sdes return llvm::PointerType::get( 74219563Sdes llvm::StructType::create(Ctx, "opencl.image2d_msaa_depth_t"), 75219563Sdes ImgAddrSpc); 76219563Sdes case BuiltinType::OCLImage2dArrayMSAADepth: 77219563Sdes return llvm::PointerType::get( 78219563Sdes llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_depth_t"), 79219563Sdes ImgAddrSpc); 80219563Sdes case BuiltinType::OCLImage3d: 81219563Sdes return llvm::PointerType::get(llvm::StructType::create( 82219563Sdes Ctx, "opencl.image3d_t"), ImgAddrSpc); 83219563Sdes case BuiltinType::OCLSampler: 84219563Sdes return llvm::IntegerType::get(Ctx, 32); 85219563Sdes case BuiltinType::OCLEvent: 86219563Sdes return llvm::PointerType::get(llvm::StructType::create( 87219563Sdes Ctx, "opencl.event_t"), 0); 88219563Sdes case BuiltinType::OCLClkEvent: 89219563Sdes return llvm::PointerType::get( 90219563Sdes llvm::StructType::create(Ctx, "opencl.clk_event_t"), 0); 91219563Sdes case BuiltinType::OCLQueue: 92110453Sdes return llvm::PointerType::get( 93110453Sdes llvm::StructType::create(Ctx, "opencl.queue_t"), 0); 94110453Sdes case BuiltinType::OCLNDRange: 95110453Sdes return llvm::PointerType::get( 96110453Sdes llvm::StructType::create(Ctx, "opencl.ndrange_t"), 0); 97110453Sdes case BuiltinType::OCLReserveID: 98110453Sdes return llvm::PointerType::get( 99110453Sdes llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0); 100110453Sdes } 101110453Sdes} 102110453Sdes 103110453Sdesllvm::Type *CGOpenCLRuntime::getPipeType() { 104110453Sdes if (!PipeTy){ 105110453Sdes uint32_t PipeAddrSpc = 106110453Sdes CGM.getContext().getTargetAddressSpace(LangAS::opencl_global); 107110453Sdes PipeTy = llvm::PointerType::get(llvm::StructType::create( 108110453Sdes CGM.getLLVMContext(), "opencl.pipe_t"), PipeAddrSpc); 109110453Sdes } 110110453Sdes 111110453Sdes return PipeTy; 112110453Sdes} 113110453Sdes