20 #include "llvm/IR/DerivedTypes.h" 21 #include "llvm/IR/GlobalValue.h" 24 using namespace clang;
25 using namespace CodeGen;
36 "Not an OpenCL specific type!");
41 switch (cast<BuiltinType>(T)->getKind()) {
43 llvm_unreachable(
"Unexpected opencl builtin type!");
45 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 46 case BuiltinType::Id: \ 47 return llvm::PointerType::get( \ 48 llvm::StructType::create(Ctx, "opencl." #ImgType "_" #Suffix "_t"), \ 50 #include "clang/Basic/OpenCLImageTypes.def" 51 case BuiltinType::OCLSampler:
53 case BuiltinType::OCLEvent:
54 return llvm::PointerType::get(
56 case BuiltinType::OCLClkEvent:
57 return llvm::PointerType::get(
59 case BuiltinType::OCLQueue:
60 return llvm::PointerType::get(
62 case BuiltinType::OCLReserveID:
63 return llvm::PointerType::get(
101 return llvm::ConstantInt::get(Int32Ty, TypeSize,
false);
111 return llvm::ConstantInt::get(Int32Ty, TypeSize,
false);
116 return llvm::IntegerType::getInt8PtrTy(
127 if (
auto Cast = dyn_cast<CastExpr>(E)) {
128 E = Cast->getSubExpr();
130 if (
auto DR = dyn_cast<DeclRefExpr>(E)) {
131 E = cast<VarDecl>(DR->getDecl())->getInit();
134 if (
auto Cast = dyn_cast<CastExpr>(E)) {
135 E = Cast->getSubExpr();
137 return cast<BlockExpr>(E);
143 llvm::Function *InvokeF,
146 "Block expression emitted twice");
147 assert(isa<llvm::Function>(InvokeF) &&
"Invalid invoke function");
148 assert(Block->getType()->isPointerTy() &&
"Invalid block literal type");
164 "Block expression not emitted");
176 F->addFnAttr(llvm::Attribute::NoUnwind);
void EmitStaticVarDecl(const VarDecl &D, llvm::GlobalValue::LinkageTypes Linkage)
QualType getElementType() const
llvm::LLVMContext & getLLVMContext()
The base class of the type hierarchy.
EnqueuedBlockInfo emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E)
virtual llvm::Value * getPipeElemAlign(const Expr *PipeArg)
Represents a variable declaration or definition.
const T * getAs() const
Member-template getAs<specific type>'.
Expr * IgnoreImplicit() LLVM_READONLY
IgnoreImplicit - Skip past any implicit AST nodes which might surround this expression.
unsigned ClangCallConvToLLVMCallConv(CallingConv CC)
Convert clang calling convention to LLVM callilng convention.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void recordBlockInfo(const BlockExpr *E, llvm::Function *InvokeF, llvm::Value *Block)
Record invoke function and block literal emitted during normal codegen for a block expression...
virtual ~CGOpenCLRuntime()
virtual llvm::Type * getPipeType(const PipeType *T, StringRef Name, llvm::Type *&PipeTy)
llvm::PointerType * getSamplerType(const Type *T)
virtual llvm::Type * convertOpenCLSpecificType(const Type *T)
Expr - This represents one expression.
llvm::DenseMap< const Expr *, EnqueuedBlockInfo > EnqueuedBlockMap
Maps block expression to block information.
virtual void EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF, const VarDecl &D)
Emit the IR required for a work-group-local variable declaration, and add an entry to CGF's LocalDecl...
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
const LangOptions & getLangOpts() const
ASTContext & getContext() const
virtual llvm::Value * getPipeElemSize(const Expr *PipeArg)
llvm::Function * getInvokeFunction(const Expr *E)
llvm::PointerType * SamplerTy
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
static const BlockExpr * getBlockExpr(const Expr *E)
The l-value was considered opaque, so the alignment was determined from a type.
const TargetCodeGenInfo & getTargetHooks() const
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type, returning the result.
Dataflow Directional Tag Classes.
Structure for enqueued block information.
virtual llvm::Function * createEnqueuedBlockKernel(CodeGenFunction &CGF, llvm::Function *BlockInvokeFunc, llvm::Value *BlockLiteral) const
Create an OpenCL kernel for an enqueued block.
std::unique_ptr< DiagnosticConsumer > create(StringRef OutputFile, DiagnosticOptions *Diags, bool MergeChildRecords=false)
Returns a DiagnosticConsumer that serializes diagnostics to a bitcode file.
CodeGenTypes & getTypes() const
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::PointerType * getGenericVoidPointerType()
bool isOpenCLSpecificType() const
unsigned getTargetAddressSpace(QualType T) const