17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----- CGOpenCLRuntime.cpp - Interface to OpenCL Runtimes -------------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This provides an abstract class for OpenCL code generation. Concrete 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// subclasses of this implement code generation for specific OpenCL 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// runtime libraries. 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGOpenCLRuntime.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenFunction.h" 183b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DerivedTypes.h" 193b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/GlobalValue.h" 20b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei#include <assert.h> 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace CodeGen; 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCGOpenCLRuntime::~CGOpenCLRuntime() {} 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const VarDecl &D) { 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGF.EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage); 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 32b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyeillvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) { 33b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei assert(T->isOpenCLSpecificType() && 34b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei "Not an OpenCL specific type!"); 35b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::LLVMContext& Ctx = CGM.getLLVMContext(); 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t ImgAddrSpc = 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CGM.getContext().getTargetAddressSpace(LangAS::opencl_global); 39b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei switch (cast<BuiltinType>(T)->getKind()) { 40b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei default: 41b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei llvm_unreachable("Unexpected opencl builtin type!"); 426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 43b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 44b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image1d_t"), ImgAddrSpc); 46b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 47b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image1d_array_t"), ImgAddrSpc); 49b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 50b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image1d_buffer_t"), ImgAddrSpc); 52b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 53b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image2d_t"), ImgAddrSpc); 55b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 56b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image2d_array_t"), ImgAddrSpc); 58b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 59b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei return llvm::PointerType::get(llvm::StructType::create( 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.image3d_t"), ImgAddrSpc); 6121f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::IntegerType::get(Ctx, 32); 63e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 64e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei return llvm::PointerType::get(llvm::StructType::create( 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx, "opencl.event_t"), 0); 66b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei } 67b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei} 68