xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGOpenCLRuntime.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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;
4106c3fb27SDimitry Andric   llvm::Type *SamplerTy;
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric   /// Structure for enqueued block information.
440b57cec5SDimitry Andric   struct EnqueuedBlockInfo {
450b57cec5SDimitry Andric     llvm::Function *InvokeFunc; /// Block invoke function.
4606c3fb27SDimitry Andric     llvm::Value *KernelHandle;  /// Enqueued block kernel reference.
470b57cec5SDimitry Andric     llvm::Value *BlockArg;      /// The first argument to enqueued block kernel.
4881ad6265SDimitry Andric     llvm::Type *BlockTy;        /// Type of the block argument.
490b57cec5SDimitry Andric   };
500b57cec5SDimitry Andric   /// Maps block expression to block information.
510b57cec5SDimitry Andric   llvm::DenseMap<const Expr *, EnqueuedBlockInfo> EnqueuedBlockMap;
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric   virtual llvm::Type *getPipeType(const PipeType *T, StringRef Name,
540b57cec5SDimitry Andric                                   llvm::Type *&PipeTy);
55*5f757f3fSDimitry Andric   llvm::PointerType *getPointerType(const Type *T);
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric public:
580b57cec5SDimitry Andric   CGOpenCLRuntime(CodeGenModule &CGM) : CGM(CGM),
590b57cec5SDimitry Andric     PipeROTy(nullptr), PipeWOTy(nullptr), SamplerTy(nullptr) {}
600b57cec5SDimitry Andric   virtual ~CGOpenCLRuntime();
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric   /// Emit the IR required for a work-group-local variable declaration, and add
630b57cec5SDimitry Andric   /// an entry to CGF's LocalDeclMap for D.  The base class does this using
640b57cec5SDimitry Andric   /// CodeGenFunction::EmitStaticVarDecl to emit an internal global for D.
650b57cec5SDimitry Andric   virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF,
660b57cec5SDimitry Andric                                          const VarDecl &D);
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   virtual llvm::Type *convertOpenCLSpecificType(const Type *T);
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   virtual llvm::Type *getPipeType(const PipeType *T);
710b57cec5SDimitry Andric 
7206c3fb27SDimitry Andric   llvm::Type *getSamplerType(const Type *T);
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric   // Returns a value which indicates the size in bytes of the pipe
750b57cec5SDimitry Andric   // element.
760b57cec5SDimitry Andric   virtual llvm::Value *getPipeElemSize(const Expr *PipeArg);
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric   // Returns a value which indicates the alignment in bytes of the pipe
790b57cec5SDimitry Andric   // element.
800b57cec5SDimitry Andric   virtual llvm::Value *getPipeElemAlign(const Expr *PipeArg);
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   /// \return __generic void* type.
830b57cec5SDimitry Andric   llvm::PointerType *getGenericVoidPointerType();
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   /// \return enqueued block information for enqueued block.
860b57cec5SDimitry Andric   EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF,
870b57cec5SDimitry Andric                                             const Expr *E);
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric   /// Record invoke function and block literal emitted during normal
900b57cec5SDimitry Andric   /// codegen for a block expression. The information is used by
910b57cec5SDimitry Andric   /// emitOpenCLEnqueuedBlock to emit wrapper kernel.
920b57cec5SDimitry Andric   ///
930b57cec5SDimitry Andric   /// \param InvokeF invoke function emitted for the block expression.
940b57cec5SDimitry Andric   /// \param Block block literal emitted for the block expression.
950b57cec5SDimitry Andric   void recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF,
9681ad6265SDimitry Andric                        llvm::Value *Block, llvm::Type *BlockTy);
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric   /// \return LLVM block invoke function emitted for an expression derived from
990b57cec5SDimitry Andric   /// the block expression.
1000b57cec5SDimitry Andric   llvm::Function *getInvokeFunction(const Expr *E);
1010b57cec5SDimitry Andric };
1020b57cec5SDimitry Andric 
1030b57cec5SDimitry Andric }
1040b57cec5SDimitry Andric }
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric #endif
107