xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===----- CGOpenCLRuntime.h - Interface to OpenCL Runtimes -----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This provides an abstract class for OpenCL code generation.  Concrete
100b57cec5SDimitry Andric // subclasses of this implement code generation for specific OpenCL
110b57cec5SDimitry Andric // runtime libraries.
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_CODEGEN_CGOPENCLRUNTIME_H
160b57cec5SDimitry Andric #define LLVM_CLANG_LIB_CODEGEN_CGOPENCLRUNTIME_H
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric #include "clang/AST/Expr.h"
190b57cec5SDimitry Andric #include "clang/AST/Type.h"
200b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
2181ad6265SDimitry Andric #include "llvm/ADT/StringMap.h"
220b57cec5SDimitry Andric #include "llvm/IR/Type.h"
230b57cec5SDimitry Andric #include "llvm/IR/Value.h"
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric namespace clang {
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric class BlockExpr;
280b57cec5SDimitry Andric class Expr;
290b57cec5SDimitry Andric class VarDecl;
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric namespace CodeGen {
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric class CodeGenFunction;
340b57cec5SDimitry Andric class CodeGenModule;
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric class CGOpenCLRuntime {
370b57cec5SDimitry Andric protected:
380b57cec5SDimitry Andric   CodeGenModule &CGM;
390b57cec5SDimitry Andric   llvm::Type *PipeROTy;
400b57cec5SDimitry Andric   llvm::Type *PipeWOTy;
41*06c3fb27SDimitry Andric   llvm::Type *SamplerTy;
4281ad6265SDimitry Andric   llvm::StringMap<llvm::PointerType *> CachedTys;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   /// Structure for enqueued block information.
450b57cec5SDimitry Andric   struct EnqueuedBlockInfo {
460b57cec5SDimitry Andric     llvm::Function *InvokeFunc; /// Block invoke function.
47*06c3fb27SDimitry Andric     llvm::Value *KernelHandle;  /// Enqueued block kernel reference.
480b57cec5SDimitry Andric     llvm::Value *BlockArg;      /// The first argument to enqueued block kernel.
4981ad6265SDimitry Andric     llvm::Type *BlockTy;        /// Type of the block argument.
500b57cec5SDimitry Andric   };
510b57cec5SDimitry Andric   /// Maps block expression to block information.
520b57cec5SDimitry Andric   llvm::DenseMap<const Expr *, EnqueuedBlockInfo> EnqueuedBlockMap;
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   virtual llvm::Type *getPipeType(const PipeType *T, StringRef Name,
550b57cec5SDimitry Andric                                   llvm::Type *&PipeTy);
5681ad6265SDimitry Andric   llvm::PointerType *getPointerType(const Type *T, StringRef Name);
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric public:
590b57cec5SDimitry Andric   CGOpenCLRuntime(CodeGenModule &CGM) : CGM(CGM),
600b57cec5SDimitry Andric     PipeROTy(nullptr), PipeWOTy(nullptr), SamplerTy(nullptr) {}
610b57cec5SDimitry Andric   virtual ~CGOpenCLRuntime();
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   /// Emit the IR required for a work-group-local variable declaration, and add
640b57cec5SDimitry Andric   /// an entry to CGF's LocalDeclMap for D.  The base class does this using
650b57cec5SDimitry Andric   /// CodeGenFunction::EmitStaticVarDecl to emit an internal global for D.
660b57cec5SDimitry Andric   virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF,
670b57cec5SDimitry Andric                                          const VarDecl &D);
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric   virtual llvm::Type *convertOpenCLSpecificType(const Type *T);
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   virtual llvm::Type *getPipeType(const PipeType *T);
720b57cec5SDimitry Andric 
73*06c3fb27SDimitry Andric   llvm::Type *getSamplerType(const Type *T);
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric   // Returns a value which indicates the size in bytes of the pipe
760b57cec5SDimitry Andric   // element.
770b57cec5SDimitry Andric   virtual llvm::Value *getPipeElemSize(const Expr *PipeArg);
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   // Returns a value which indicates the alignment in bytes of the pipe
800b57cec5SDimitry Andric   // element.
810b57cec5SDimitry Andric   virtual llvm::Value *getPipeElemAlign(const Expr *PipeArg);
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   /// \return __generic void* type.
840b57cec5SDimitry Andric   llvm::PointerType *getGenericVoidPointerType();
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric   /// \return enqueued block information for enqueued block.
870b57cec5SDimitry Andric   EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF,
880b57cec5SDimitry Andric                                             const Expr *E);
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric   /// Record invoke function and block literal emitted during normal
910b57cec5SDimitry Andric   /// codegen for a block expression. The information is used by
920b57cec5SDimitry Andric   /// emitOpenCLEnqueuedBlock to emit wrapper kernel.
930b57cec5SDimitry Andric   ///
940b57cec5SDimitry Andric   /// \param InvokeF invoke function emitted for the block expression.
950b57cec5SDimitry Andric   /// \param Block block literal emitted for the block expression.
960b57cec5SDimitry Andric   void recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF,
9781ad6265SDimitry Andric                        llvm::Value *Block, llvm::Type *BlockTy);
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric   /// \return LLVM block invoke function emitted for an expression derived from
1000b57cec5SDimitry Andric   /// the block expression.
1010b57cec5SDimitry Andric   llvm::Function *getInvokeFunction(const Expr *E);
1020b57cec5SDimitry Andric };
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric }
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric #endif
108