clang  9.0.0svn
CGCUDARuntime.cpp
Go to the documentation of this file.
1 //===----- CGCUDARuntime.cpp - Interface to CUDA Runtimes -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This provides an abstract class for CUDA code generation. Concrete
10 // subclasses of this implement code generation for specific CUDA
11 // runtime libraries.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "CGCUDARuntime.h"
16 #include "CGCall.h"
17 #include "CodeGenFunction.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/ExprCXX.h"
20 
21 using namespace clang;
22 using namespace CodeGen;
23 
25 
27  const CUDAKernelCallExpr *E,
28  ReturnValueSlot ReturnValue) {
29  llvm::BasicBlock *ConfigOKBlock = CGF.createBasicBlock("kcall.configok");
30  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("kcall.end");
31 
33  CGF.EmitBranchOnBoolExpr(E->getConfig(), ContBlock, ConfigOKBlock,
34  /*TrueCount=*/0);
35 
36  eval.begin(CGF);
37  CGF.EmitBlock(ConfigOKBlock);
38  CGF.EmitSimpleCallExpr(E, ReturnValue);
39  CGF.EmitBranch(ContBlock);
40 
41  CGF.EmitBlock(ContBlock);
42  eval.end(CGF);
43 
44  return RValue::get(nullptr);
45 }
ReturnValueSlot - Contains the address where the return value of a function can be stored...
Definition: CGCall.h:363
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
Defines the clang::Expr interface and subclasses for C++ expressions.
An object to manage conditionally-evaluated expressions.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
virtual RValue EmitCUDAKernelCallExpr(CodeGenFunction &CGF, const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue)
const CallExpr * getConfig() const
Definition: ExprCXX.h:239
RValue EmitSimpleCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue)
Emit a CallExpr without considering whether it might be a subclass.
Definition: CGExpr.cpp:4373
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
RValue - This trivial value class is used to represent the result of an expression that is evaluated...
Definition: CGValue.h:38
Dataflow Directional Tag Classes.
Represents a call to a CUDA kernel function.
Definition: ExprCXX.h:218
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition: CGStmt.cpp:450
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block, taking care to avoid creation of branches from dummy blocks.
Definition: CGStmt.cpp:470
static RValue get(llvm::Value *V)
Definition: CGValue.h:85