当前位置: 首页>>代码示例>>C++>>正文


C++ CodeGenFunction::EmitBlockLiteral方法代码示例

本文整理汇总了C++中CodeGenFunction::EmitBlockLiteral方法的典型用法代码示例。如果您正苦于以下问题:C++ CodeGenFunction::EmitBlockLiteral方法的具体用法?C++ CodeGenFunction::EmitBlockLiteral怎么用?C++ CodeGenFunction::EmitBlockLiteral使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在CodeGenFunction的用法示例。


在下文中一共展示了CodeGenFunction::EmitBlockLiteral方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1:

CGOpenCLRuntime::EnqueuedBlockInfo
CGOpenCLRuntime::emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E) {
  // The block literal may be assigned to a const variable. Chasing down
  // to get the block literal.
  if (auto DR = dyn_cast<DeclRefExpr>(E)) {
    E = cast<VarDecl>(DR->getDecl())->getInit();
  }
  if (auto Cast = dyn_cast<CastExpr>(E)) {
    E = Cast->getSubExpr();
  }
  auto *Block = cast<BlockExpr>(E);

  // The same block literal may be enqueued multiple times. Cache it if
  // possible.
  auto Loc = EnqueuedBlockMap.find(Block);
  if (Loc != EnqueuedBlockMap.end()) {
    return Loc->second;
  }

  // Emit block literal as a common block expression and get the block invoke
  // function.
  llvm::Function *Invoke;
  auto *V = CGF.EmitBlockLiteral(cast<BlockExpr>(Block), &Invoke);
  auto *F = CGF.getTargetHooks().createEnqueuedBlockKernel(
      CGF, Invoke, V->stripPointerCasts());

  // The common part of the post-processing of the kernel goes here.
  F->addFnAttr(llvm::Attribute::NoUnwind);
  F->setCallingConv(
      CGF.getTypes().ClangCallConvToLLVMCallConv(CallingConv::CC_OpenCLKernel));
  EnqueuedBlockInfo Info{F, V};
  EnqueuedBlockMap[Block] = Info;
  return Info;
}
开发者ID:PolyJIT,项目名称:clang,代码行数:34,代码来源:CGOpenCLRuntime.cpp


注:本文中的CodeGenFunction::EmitBlockLiteral方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。