1*67e74705SXin Li //===----- CGOpenCLRuntime.cpp - Interface to OpenCL Runtimes -------------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This provides an abstract class for OpenCL code generation. Concrete
11*67e74705SXin Li // subclasses of this implement code generation for specific OpenCL
12*67e74705SXin Li // runtime libraries.
13*67e74705SXin Li //
14*67e74705SXin Li //===----------------------------------------------------------------------===//
15*67e74705SXin Li
16*67e74705SXin Li #include "CGOpenCLRuntime.h"
17*67e74705SXin Li #include "CodeGenFunction.h"
18*67e74705SXin Li #include "llvm/IR/DerivedTypes.h"
19*67e74705SXin Li #include "llvm/IR/GlobalValue.h"
20*67e74705SXin Li #include <assert.h>
21*67e74705SXin Li
22*67e74705SXin Li using namespace clang;
23*67e74705SXin Li using namespace CodeGen;
24*67e74705SXin Li
~CGOpenCLRuntime()25*67e74705SXin Li CGOpenCLRuntime::~CGOpenCLRuntime() {}
26*67e74705SXin Li
EmitWorkGroupLocalVarDecl(CodeGenFunction & CGF,const VarDecl & D)27*67e74705SXin Li void CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF,
28*67e74705SXin Li const VarDecl &D) {
29*67e74705SXin Li return CGF.EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage);
30*67e74705SXin Li }
31*67e74705SXin Li
convertOpenCLSpecificType(const Type * T)32*67e74705SXin Li llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) {
33*67e74705SXin Li assert(T->isOpenCLSpecificType() &&
34*67e74705SXin Li "Not an OpenCL specific type!");
35*67e74705SXin Li
36*67e74705SXin Li llvm::LLVMContext& Ctx = CGM.getLLVMContext();
37*67e74705SXin Li uint32_t ImgAddrSpc =
38*67e74705SXin Li CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
39*67e74705SXin Li switch (cast<BuiltinType>(T)->getKind()) {
40*67e74705SXin Li default:
41*67e74705SXin Li llvm_unreachable("Unexpected opencl builtin type!");
42*67e74705SXin Li return nullptr;
43*67e74705SXin Li #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
44*67e74705SXin Li case BuiltinType::Id: \
45*67e74705SXin Li return llvm::PointerType::get( \
46*67e74705SXin Li llvm::StructType::create(Ctx, "opencl." #ImgType "_" #Suffix "_t"), \
47*67e74705SXin Li ImgAddrSpc);
48*67e74705SXin Li #include "clang/Basic/OpenCLImageTypes.def"
49*67e74705SXin Li case BuiltinType::OCLSampler:
50*67e74705SXin Li return llvm::IntegerType::get(Ctx, 32);
51*67e74705SXin Li case BuiltinType::OCLEvent:
52*67e74705SXin Li return llvm::PointerType::get(llvm::StructType::create(
53*67e74705SXin Li Ctx, "opencl.event_t"), 0);
54*67e74705SXin Li case BuiltinType::OCLClkEvent:
55*67e74705SXin Li return llvm::PointerType::get(
56*67e74705SXin Li llvm::StructType::create(Ctx, "opencl.clk_event_t"), 0);
57*67e74705SXin Li case BuiltinType::OCLQueue:
58*67e74705SXin Li return llvm::PointerType::get(
59*67e74705SXin Li llvm::StructType::create(Ctx, "opencl.queue_t"), 0);
60*67e74705SXin Li case BuiltinType::OCLNDRange:
61*67e74705SXin Li return llvm::PointerType::get(
62*67e74705SXin Li llvm::StructType::create(Ctx, "opencl.ndrange_t"), 0);
63*67e74705SXin Li case BuiltinType::OCLReserveID:
64*67e74705SXin Li return llvm::PointerType::get(
65*67e74705SXin Li llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0);
66*67e74705SXin Li }
67*67e74705SXin Li }
68*67e74705SXin Li
getPipeType()69*67e74705SXin Li llvm::Type *CGOpenCLRuntime::getPipeType() {
70*67e74705SXin Li if (!PipeTy){
71*67e74705SXin Li uint32_t PipeAddrSpc =
72*67e74705SXin Li CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
73*67e74705SXin Li PipeTy = llvm::PointerType::get(llvm::StructType::create(
74*67e74705SXin Li CGM.getLLVMContext(), "opencl.pipe_t"), PipeAddrSpc);
75*67e74705SXin Li }
76*67e74705SXin Li
77*67e74705SXin Li return PipeTy;
78*67e74705SXin Li }
79