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