1 //===----- CGOpenCLRuntime.h - Interface to OpenCL Runtimes -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This provides an abstract class for OpenCL code generation. Concrete 11 // subclasses of this implement code generation for specific OpenCL 12 // runtime libraries. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENCLRUNTIME_H 17 #define LLVM_CLANG_LIB_CODEGEN_CGOPENCLRUNTIME_H 18 19 #include "clang/AST/Type.h" 20 #include "llvm/ADT/DenseMap.h" 21 #include "llvm/IR/Type.h" 22 #include "llvm/IR/Value.h" 23 24 namespace clang { 25 26 class Expr; 27 class VarDecl; 28 29 namespace CodeGen { 30 31 class CodeGenFunction; 32 class CodeGenModule; 33 34 class CGOpenCLRuntime { 35 protected: 36 CodeGenModule &CGM; 37 llvm::Type *PipeTy; 38 llvm::PointerType *SamplerTy; 39 40 /// Structure for enqueued block information. 41 struct EnqueuedBlockInfo { 42 llvm::Function *Kernel; /// Enqueued block kernel. 43 llvm::Value *BlockArg; /// The first argument to enqueued block kernel. 44 }; 45 /// Maps block expression to block information. 46 llvm::DenseMap<const Expr *, EnqueuedBlockInfo> EnqueuedBlockMap; 47 48 public: 49 CGOpenCLRuntime(CodeGenModule &CGM) : CGM(CGM), PipeTy(nullptr), 50 SamplerTy(nullptr) {} 51 virtual ~CGOpenCLRuntime(); 52 53 /// Emit the IR required for a work-group-local variable declaration, and add 54 /// an entry to CGF's LocalDeclMap for D. The base class does this using 55 /// CodeGenFunction::EmitStaticVarDecl to emit an internal global for D. 56 virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, 57 const VarDecl &D); 58 59 virtual llvm::Type *convertOpenCLSpecificType(const Type *T); 60 61 virtual llvm::Type *getPipeType(const PipeType *T); 62 63 llvm::PointerType *getSamplerType(const Type *T); 64 65 // \brief Returnes a value which indicates the size in bytes of the pipe 66 // element. 67 virtual llvm::Value *getPipeElemSize(const Expr *PipeArg); 68 69 // \brief Returnes a value which indicates the alignment in bytes of the pipe 70 // element. 71 virtual llvm::Value *getPipeElemAlign(const Expr *PipeArg); 72 73 /// \return __generic void* type. 74 llvm::PointerType *getGenericVoidPointerType(); 75 76 /// \return enqueued block information for enqueued block. 77 EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, 78 const Expr *E); 79 }; 80 81 } 82 } 83 84 #endif 85