clang  14.0.0git
Functions
CGBlocks.cpp File Reference
#include "CGBlocks.h"
#include "CGCXXABI.h"
#include "CGDebugInfo.h"
#include "CGObjCRuntime.h"
#include "CGOpenCLRuntime.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "TargetInfo.h"
#include "clang/AST/Attr.h"
#include "clang/AST/DeclObjC.h"
#include "clang/CodeGen/ConstantInitBuilder.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/ScopedPrinter.h"
#include <algorithm>
#include <cstdio>
Include dependency graph for CGBlocks.cpp:

Go to the source code of this file.

Functions

static llvm::Constant * buildGlobalBlock (CodeGenModule &CGM, const CGBlockInfo &blockInfo, llvm::Constant *blockFn)
 Build the given block as a global block. More...
 
static llvm::Constant * buildCopyHelper (CodeGenModule &CGM, const CGBlockInfo &blockInfo)
 Build the helper function to copy a block. More...
 
static llvm::Constant * buildDisposeHelper (CodeGenModule &CGM, const CGBlockInfo &blockInfo)
 Build the helper function to dispose of a block. More...
 
static void findBlockCapturedManagedEntities (const CGBlockInfo &BlockInfo, const LangOptions &LangOpts, SmallVectorImpl< BlockCaptureManagedEntity > &ManagedCaptures)
 Find the set of block captures that need to be explicitly copied or destroy. More...
 
static std::string getBlockCaptureStr (const BlockCaptureManagedEntity &E, CaptureStrKind StrKind, CharUnits BlockAlignment, CodeGenModule &CGM)
 
static std::string getBlockDescriptorName (const CGBlockInfo &BlockInfo, CodeGenModule &CGM)
 
static llvm::Constant * buildBlockDescriptor (CodeGenModule &CGM, const CGBlockInfo &blockInfo)
 buildBlockDescriptor - Build the block descriptor meta-data for a block. More...
 
static bool isSafeForCXXConstantCapture (QualType type)
 Determines if the given type is safe for constant capture in C++. More...
 
static llvm::Constant * tryCaptureAsConstant (CodeGenModule &CGM, CodeGenFunction *CGF, const VarDecl *var)
 It is illegal to modify a const object after initialization. More...
 
static CharUnits getLowBit (CharUnits v)
 Get the low bit of a nonzero character count. More...
 
static void initializeForBlockHeader (CodeGenModule &CGM, CGBlockInfo &info, SmallVectorImpl< llvm::Type * > &elementTypes)
 
static QualType getCaptureFieldType (const CodeGenFunction &CGF, const BlockDecl::Capture &CI)
 
static void computeBlockInfo (CodeGenModule &CGM, CodeGenFunction *CGF, CGBlockInfo &info)
 Compute the layout of the given block. More...
 
static std::pair< BlockCaptureEntityKind, BlockFieldFlagscomputeCopyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts)
 
static std::pair< BlockCaptureEntityKind, BlockFieldFlagscomputeDestroyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts)
 
static std::string getCopyDestroyHelperFuncName (const SmallVectorImpl< BlockCaptureManagedEntity > &Captures, CharUnits BlockAlignment, CaptureStrKind StrKind, CodeGenModule &CGM)
 
static void pushCaptureCleanup (BlockCaptureEntityKind CaptureKind, Address Field, QualType CaptureType, BlockFieldFlags Flags, bool ForCopyHelper, VarDecl *Var, CodeGenFunction &CGF)
 
static void setBlockHelperAttributesVisibility (bool CapturesNonExternalType, llvm::Function *Fn, const CGFunctionInfo &FI, CodeGenModule &CGM)
 
static BlockFieldFlags getBlockFieldFlagsForObjCObjectPointer (const BlockDecl::Capture &CI, QualType T)
 
static llvm::Constant * generateByrefCopyHelper (CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)
 
static llvm::Constant * buildByrefCopyHelper (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)
 Build the copy helper for a __block variable. More...
 
static llvm::Constant * generateByrefDisposeHelper (CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)
 Generate code for a __block variable's dispose helper. More...
 
static llvm::Constant * buildByrefDisposeHelper (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)
 Build the dispose helper for a __block variable. More...
 
template<class T >
static T * buildByrefHelpers (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, T &&generator)
 Lazily build the copy and dispose helpers for a __block variable with the given information. More...
 
static void configureBlocksRuntimeObject (CodeGenModule &CGM, llvm::Constant *C)
 Adjust the declaration of something from the blocks API. More...
 

Function Documentation

◆ buildBlockDescriptor()

static llvm::Constant* buildBlockDescriptor ( CodeGenModule CGM,
const CGBlockInfo blockInfo 
)
static

buildBlockDescriptor - Build the block descriptor meta-data for a block.

buildBlockDescriptor is accessed from 5th field of the Block_literal meta-data and contains stationary information about the block literal. Its definition will have 4 (or optionally 6) words.

struct Block_descriptor {
unsigned long reserved;
unsigned long size; // size of Block_literal metadata in bytes.
void *copy_func_helper_decl; // optional copy helper.
void *destroy_func_decl; // optional destructor helper.
void *block_method_encoding_address; // @encode for block literal signature.
void *block_layout_info; // encoding of captured block variables.
};

Definition at line 185 of file CGBlocks.cpp.

References clang::CodeGen::ConstantInitBuilderTemplateBase< Traits >::beginStruct(), clang::CodeGen::CGBlockInfo::BlockSize, buildCopyHelper(), buildDisposeHelper(), clang::CodeGen::CGObjCRuntime::BuildGCBlockLayout(), clang::CodeGen::CGObjCRuntime::BuildRCBlockLayout(), clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenModule::GetAddrOfConstantCString(), getBlockDescriptorName(), clang::CodeGen::CodeGenModule::getBlockDescriptorType(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenModule::getModule(), clang::ASTContext::getObjCEncodingForBlock(), clang::CodeGen::CodeGenModule::getObjCRuntime(), clang::CodeGen::ConstantAddress::getPointer(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTypes(), clang::HiddenVisibility, clang::InternalLinkage, clang::CodeGen::CGBlockInfo::needsCopyDisposeHelpers(), clang::LangOptions::NonGC, clang::opencl_constant, string(), clang::CodeGen::CodeGenModule::supportsCOMDAT(), and clang::CodeGen::CodeGenTypeCache::VoidPtrTy.

Referenced by buildGlobalBlock().

◆ buildByrefCopyHelper()

static llvm::Constant* buildByrefCopyHelper ( CodeGenModule CGM,
const BlockByrefInfo byrefInfo,
BlockByrefHelpers generator 
)
static

Build the copy helper for a __block variable.

Definition at line 2419 of file CGBlocks.cpp.

References generateByrefCopyHelper().

Referenced by buildByrefHelpers().

◆ buildByrefDisposeHelper()

static llvm::Constant* buildByrefDisposeHelper ( CodeGenModule CGM,
const BlockByrefInfo byrefInfo,
BlockByrefHelpers generator 
)
static

Build the dispose helper for a __block variable.

Definition at line 2476 of file CGBlocks.cpp.

References generateByrefDisposeHelper().

Referenced by buildByrefHelpers().

◆ buildByrefHelpers()

template<class T >
static T* buildByrefHelpers ( CodeGenModule CGM,
const BlockByrefInfo byrefInfo,
T &&  generator 
)
static

Lazily build the copy and dispose helpers for a __block variable with the given information.

Definition at line 2486 of file CGBlocks.cpp.

References buildByrefCopyHelper(), buildByrefDisposeHelper(), clang::CodeGen::CodeGenModule::ByrefHelpersCache, clang::CodeGen::CodeGenModule::getContext(), and clang::transformer::node().

◆ buildCopyHelper()

static llvm::Constant* buildCopyHelper ( CodeGenModule CGM,
const CGBlockInfo blockInfo 
)
static

Build the helper function to copy a block.

Definition at line 56 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenFunction::GenerateCopyHelperFunction().

Referenced by buildBlockDescriptor().

◆ buildDisposeHelper()

static llvm::Constant* buildDisposeHelper ( CodeGenModule CGM,
const CGBlockInfo blockInfo 
)
static

Build the helper function to dispose of a block.

Definition at line 62 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenFunction::GenerateDestroyHelperFunction().

Referenced by buildBlockDescriptor().

◆ buildGlobalBlock()

static llvm::Constant * buildGlobalBlock ( CodeGenModule CGM,
const CGBlockInfo blockInfo,
llvm::Constant *  blockFn 
)
static

Build the given block as a global block.

Definition at line 1309 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenModule::addUsedGlobal(), b, clang::CodeGen::ConstantInitBuilderTemplateBase< Traits >::beginStruct(), clang::CodeGen::BLOCK_HAS_SIGNATURE, clang::CodeGen::BLOCK_IS_GLOBAL, clang::CodeGen::BLOCK_USE_STRET, clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockExpression, clang::CodeGen::CGBlockInfo::BlockSize, buildBlockDescriptor(), clang::CodeGen::CGBlockInfo::CanBeGlobal, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenModule::getAddrOfGlobalBlockIfEmitted(), clang::CharUnits::getAsAlign(), clang::CodeGen::BlockFlags::getBitMask(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ASTContext::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenModule::getModule(), clang::CodeGen::CodeGenModule::getNSConcreteGlobalBlock(), clang::CodeGen::CodeGenModule::getOpenCLRuntime(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTarget(), clang::ASTContext::getTargetAddressSpace(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::TargetInfo::getTriple(), clang::Expr::getType(), clang::CodeGen::CodeGenModule::getTypes(), clang::CodeGen::CodeGenTypeCache::Int8PtrPtrTy, clang::InternalLinkage, clang::CodeGen::CodeGenTypeCache::IntTy, clang::opencl_global, clang::CodeGen::CGOpenCLRuntime::recordBlockInfo(), clang::CodeGen::CodeGenModule::setAddrOfGlobalBlock(), clang::CodeGen::CGBlockInfo::UsesStret, and clang::CodeGen::CodeGenTypeCache::VoidTy.

Referenced by clang::CodeGen::CodeGenFunction::GenerateBlockFunction().

◆ computeBlockInfo()

static void computeBlockInfo ( CodeGenModule CGM,
CodeGenFunction CGF,
CGBlockInfo info 
)
static

Compute the layout of the given block.

Attempts to lay the block out with minimal space requirements.

Definition at line 522 of file CGBlocks.cpp.

References clang::interp::align(), clang::CharUnits::alignTo(), clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockHeaderForcedGapOffset, clang::CodeGen::CGBlockInfo::BlockHeaderForcedGapSize, clang::CodeGen::CGBlockInfo::BlockSize, clang::CodeGen::CGBlockInfo::CanBeGlobal, clang::BlockDecl::capture_begin(), clang::BlockDecl::capture_end(), clang::CodeGen::CGBlockInfo::Captures, clang::BlockDecl::captures(), clang::BlockDecl::capturesCXXThis(), clang::CodeGen::CGBlockInfo::CapturesNonExternalType, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenTypes::ConvertTypeForMem(), clang::CodeGen::CodeGenFunction::CurFuncDecl, clang::QualType::DK_nontrivial_c_struct, clang::Type::getAsCXXRecordDecl(), clang::CodeGen::CGBlockInfo::getBlockDecl(), getCaptureFieldType(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), getLowBit(), clang::QualType::getObjCLifetime(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CodeGen::CodeGenTypeCache::getPointerSize(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::ValueDecl::getType(), clang::ASTContext::getTypeInfoInChars(), clang::CodeGen::CodeGenModule::getTypes(), clang::BlockDecl::Capture::getVariable(), clang::CodeGen::CGBlockInfo::HasCapturedVariableLayout, clang::BlockDecl::hasCaptures(), clang::BlockDecl::Capture::hasCopyExpr(), clang::CodeGen::CGBlockInfo::HasCXXObject, initializeForBlockHeader(), clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::QualType::isDestructedType(), clang::BlockDecl::Capture::isEscapingByref(), clang::NamedDecl::isExternallyVisible(), clang::QualType::isNonTrivialToPrimitiveCopy(), clang::Type::isObjCInertUnsafeUnretainedType(), clang::Type::isObjCRetainableType(), clang::CodeGen::CGBlockInfo::Capture::makeConstant(), max(), clang::CodeGen::CGBlockInfo::NeedsCopyDispose, clang::LangOptions::NonGC, clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, clang::QualType::PCK_Struct, clang::CodeGen::CGBlockInfo::StructureType, tryCaptureAsConstant(), clang::CodeGen::CodeGenTypeCache::VoidPtrTy, and clang::CharUnits::Zero().

Referenced by clang::CodeGen::CodeGenFunction::EmitBlockLiteral().

◆ computeCopyInfoForBlockCapture()

static std::pair<BlockCaptureEntityKind, BlockFieldFlags> computeCopyInfoForBlockCapture ( const BlockDecl::Capture CI,
QualType  T,
const LangOptions LangOpts 
)
static

◆ computeDestroyInfoForBlockCapture()

static std::pair< BlockCaptureEntityKind, BlockFieldFlags > computeDestroyInfoForBlockCapture ( const BlockDecl::Capture CI,
QualType  T,
const LangOptions LangOpts 
)
static

◆ configureBlocksRuntimeObject()

static void configureBlocksRuntimeObject ( CodeGenModule CGM,
llvm::Constant *  C 
)
static

◆ findBlockCapturedManagedEntities()

static void findBlockCapturedManagedEntities ( const CGBlockInfo BlockInfo,
const LangOptions LangOpts,
SmallVectorImpl< BlockCaptureManagedEntity > &  ManagedCaptures 
)
static

◆ generateByrefCopyHelper()

static llvm::Constant* generateByrefCopyHelper ( CodeGenFunction CGF,
const BlockByrefInfo byrefInfo,
BlockByrefHelpers generator 
)
static

◆ generateByrefDisposeHelper()

static llvm::Constant* generateByrefDisposeHelper ( CodeGenFunction CGF,
const BlockByrefInfo byrefInfo,
BlockByrefHelpers generator 
)
static

◆ getBlockCaptureStr()

static std::string getBlockCaptureStr ( const BlockCaptureManagedEntity &  E,
CaptureStrKind  StrKind,
CharUnits  BlockAlignment,
CodeGenModule CGM 
)
static

◆ getBlockDescriptorName()

static std::string getBlockDescriptorName ( const CGBlockInfo BlockInfo,
CodeGenModule CGM 
)
static

Replace occurrences of '@' with '\1'. '@' is reserved on ELF platforms as a separator between symbol name and symbol version.

Definition at line 122 of file CGBlocks.cpp.

References string().

Referenced by buildBlockDescriptor().

◆ getBlockFieldFlagsForObjCObjectPointer()

static BlockFieldFlags getBlockFieldFlagsForObjCObjectPointer ( const BlockDecl::Capture CI,
QualType  T 
)
static

◆ getCaptureFieldType()

static QualType getCaptureFieldType ( const CodeGenFunction CGF,
const BlockDecl::Capture CI 
)
static

◆ getCopyDestroyHelperFuncName()

static std::string getCopyDestroyHelperFuncName ( const SmallVectorImpl< BlockCaptureManagedEntity > &  Captures,
CharUnits  BlockAlignment,
CaptureStrKind  StrKind,
CodeGenModule CGM 
)
static

◆ getLowBit()

static CharUnits getLowBit ( CharUnits  v)
static

Get the low bit of a nonzero character count.

This is the alignment of the nth byte if the 0th byte is universally aligned.

Definition at line 444 of file CGBlocks.cpp.

References clang::CharUnits::fromQuantity(), and v.

Referenced by computeBlockInfo().

◆ initializeForBlockHeader()

static void initializeForBlockHeader ( CodeGenModule CGM,
CGBlockInfo info,
SmallVectorImpl< llvm::Type * > &  elementTypes 
)
static

◆ isSafeForCXXConstantCapture()

static bool isSafeForCXXConstantCapture ( QualType  type)
static

Determines if the given type is safe for constant capture in C++.

Definition at line 388 of file CGBlocks.cpp.

References clang::ast_matchers::recordType.

Referenced by tryCaptureAsConstant().

◆ pushCaptureCleanup()

static void pushCaptureCleanup ( BlockCaptureEntityKind  CaptureKind,
Address  Field,
QualType  CaptureType,
BlockFieldFlags  Flags,
bool  ForCopyHelper,
VarDecl Var,
CodeGenFunction CGF 
)
static

◆ setBlockHelperAttributesVisibility()

static void setBlockHelperAttributesVisibility ( bool  CapturesNonExternalType,
llvm::Function *  Fn,
const CGFunctionInfo FI,
CodeGenModule CGM 
)
static

◆ tryCaptureAsConstant()

static llvm::Constant* tryCaptureAsConstant ( CodeGenModule CGM,
CodeGenFunction CGF,
const VarDecl var 
)
static

It is illegal to modify a const object after initialization.

Therefore, if a const object has a constant initializer, we don't actually need to keep storage for it in the block; we'll just rematerialize it at the start of the block function. This is acceptable because we make no promises about address stability of captured variables.

Definition at line 412 of file CGBlocks.cpp.

References clang::VarDecl::getInit(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ValueDecl::getType(), isSafeForCXXConstantCapture(), and clang::CodeGen::ConstantEmitter::tryEmitAbstractForInitializer().

Referenced by computeBlockInfo().