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/Expr.h" 20 #include "clang/AST/Type.h" 21 #include "llvm/ADT/DenseMap.h" 22 #include "llvm/IR/Type.h" 23 #include "llvm/IR/Value.h" 24 25 namespace clang { 26 27 class BlockExpr; 28 class Expr; 29 class VarDecl; 30 31 namespace CodeGen { 32 33 class CodeGenFunction; 34 class CodeGenModule; 35 36 class CGOpenCLRuntime { 37 protected: 38 CodeGenModule &CGM; 39 llvm::Type *PipeROTy; 40 llvm::Type *PipeWOTy; 41 llvm::PointerType *SamplerTy; 42 43 /// Structure for enqueued block information. 44 struct EnqueuedBlockInfo { 45 llvm::Function *InvokeFunc; /// Block invoke function. 46 llvm::Function *Kernel; /// Enqueued block kernel. 47 llvm::Value *BlockArg; /// The first argument to enqueued block kernel. 48 }; 49 /// Maps block expression to block information. 50 llvm::DenseMap<const Expr *, EnqueuedBlockInfo> EnqueuedBlockMap; 51 52 virtual llvm::Type *getPipeType(const PipeType *T, StringRef Name, 53 llvm::Type *&PipeTy); 54 55 public: CGOpenCLRuntime(CodeGenModule & CGM)56 CGOpenCLRuntime(CodeGenModule &CGM) : CGM(CGM), 57 PipeROTy(nullptr), PipeWOTy(nullptr), SamplerTy(nullptr) {} 58 virtual ~CGOpenCLRuntime(); 59 60 /// Emit the IR required for a work-group-local variable declaration, and add 61 /// an entry to CGF's LocalDeclMap for D. The base class does this using 62 /// CodeGenFunction::EmitStaticVarDecl to emit an internal global for D. 63 virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, 64 const VarDecl &D); 65 66 virtual llvm::Type *convertOpenCLSpecificType(const Type *T); 67 68 virtual llvm::Type *getPipeType(const PipeType *T); 69 70 llvm::PointerType *getSamplerType(const Type *T); 71 72 // Returns a value which indicates the size in bytes of the pipe 73 // element. 74 virtual llvm::Value *getPipeElemSize(const Expr *PipeArg); 75 76 // Returns a value which indicates the alignment in bytes of the pipe 77 // element. 78 virtual llvm::Value *getPipeElemAlign(const Expr *PipeArg); 79 80 /// \return __generic void* type. 81 llvm::PointerType *getGenericVoidPointerType(); 82 83 /// \return enqueued block information for enqueued block. 84 EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, 85 const Expr *E); 86 87 /// Record invoke function and block literal emitted during normal 88 /// codegen for a block expression. The information is used by 89 /// emitOpenCLEnqueuedBlock to emit wrapper kernel. 90 /// 91 /// \param InvokeF invoke function emitted for the block expression. 92 /// \param Block block literal emitted for the block expression. 93 void recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF, 94 llvm::Value *Block); 95 }; 96 97 } 98 } 99 100 #endif 101