clang
7.0.0
|
#include "CGBlocks.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/DeclObjC.h"
#include "clang/CodeGen/ConstantInitBuilder.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Module.h"
#include <algorithm>
#include <cstdio>
Go to the source code of this file.
Enumerations | |
enum | BlockCaptureEntityKind |
Represents a type of copy/destroy operation that should be performed for an entity that's captured by a block. More... | |
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 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 void | enterBlockScope (CodeGenFunction &CGF, BlockDecl *block) |
Enter the scope of a block. More... | |
static CGBlockInfo * | findAndRemoveBlockInfo (CGBlockInfo **head, const BlockDecl *block) |
Find the layout for the given block in a linked list and remove it. More... | |
static std::pair< BlockCaptureEntityKind, BlockFieldFlags > | computeCopyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts) |
static void | findBlockCapturedManagedEntities (const CGBlockInfo &BlockInfo, const LangOptions &LangOpts, SmallVectorImpl< BlockCaptureManagedEntity > &ManagedCaptures, llvm::function_ref< std::pair< BlockCaptureEntityKind, BlockFieldFlags >(const BlockDecl::Capture &, QualType, const LangOptions &)> Predicate) |
Find the set of block captures that need to be explicitly copied or destroy. More... | |
static void | pushCaptureCleanup (BlockCaptureEntityKind CaptureKind, Address Field, QualType CaptureType, BlockFieldFlags Flags, bool EHOnly, CodeGenFunction &CGF) |
static BlockFieldFlags | getBlockFieldFlagsForObjCObjectPointer (const BlockDecl::Capture &CI, QualType T) |
static std::pair< BlockCaptureEntityKind, BlockFieldFlags > | computeDestroyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts) |
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... | |
|
strong |
Represents a type of copy/destroy operation that should be performed for an entity that's captured by a block.
Definition at line 1511 of file CGBlocks.cpp.
|
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.
Definition at line 80 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::CGBlockInfo::Captures, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CGBlockInfo::CXXThisIndex, clang::CodeGen::CGBlockInfo::CXXThisOffset, clang::CodeGen::CodeGenModule::GetAddrOfConstantCString(), clang::CodeGen::CodeGenModule::getBlockDescriptorType(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ASTContext::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::ASTContext::getObjCEncodingForBlock(), clang::CodeGen::CodeGenModule::getObjCRuntime(), clang::CodeGen::ConstantAddress::getPointer(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::ASTContext::getTargetAddressSpace(), clang::CodeGen::CodeGenModule::getTypes(), clang::BlockDecl::Capture::getVariable(), clang::InternalLinkage, clang::CodeGen::CGBlockInfo::Capture::makeIndex(), clang::CodeGen::CGBlockInfo::needsCopyDisposeHelpers(), clang::LangOptions::NonGC, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, clang::opencl_constant, clang::operator<(), clang::CodeGen::Type, clang::ASTContext::UnsignedLongTy, and clang::CodeGen::CodeGenTypeCache::VoidPtrTy.
Referenced by buildGlobalBlock(), and clang::CodeGen::CodeGenFunction::EmitBlockLiteral().
|
static |
Build the copy helper for a __block variable.
Definition at line 2184 of file CGBlocks.cpp.
References generateByrefCopyHelper().
Referenced by buildByrefHelpers().
|
static |
Build the dispose helper for a __block variable.
Definition at line 2246 of file CGBlocks.cpp.
References generateByrefDisposeHelper().
Referenced by buildByrefHelpers().
|
static |
Lazily build the copy and dispose helpers for a __block variable with the given information.
Definition at line 2256 of file CGBlocks.cpp.
References clang::CharUnits::alignmentAtOffset(), clang::CodeGen::BLOCK_FIELD_IS_BLOCK, clang::CodeGen::BLOCK_FIELD_IS_OBJECT, clang::CodeGen::BLOCK_FIELD_IS_WEAK, buildByrefCopyHelper(), buildByrefDisposeHelper(), clang::CodeGen::CodeGenModule::ByrefHelpersCache, clang::QualType::DK_nontrivial_c_struct, clang::Type::getAsCXXRecordDecl(), clang::ASTContext::getBlockVarCopyInits(), clang::CodeGen::CodeGenModule::getContext(), clang::Qualifiers::getObjCLifetime(), clang::QualType::getQualifiers(), clang::ValueDecl::getType(), clang::ast_matchers::id(), clang::Type::isBlockPointerType(), clang::QualType::isDestructedType(), clang::QualType::isNonTrivialToPrimitiveDestructiveMove(), clang::QualType::isObjCGCWeak(), clang::ASTContext::isObjCNSObjectType(), clang::Type::isObjCObjectPointerType(), clang::Type::isObjCRetainableType(), clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, and clang::QualType::PCK_Struct.
Referenced by clang::CodeGen::CodeGenFunction::CPUDispatchMultiVersionResolverOption::operator>().
|
static |
Build the helper function to copy a block.
Definition at line 55 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::GenerateCopyHelperFunction().
Referenced by buildBlockDescriptor().
|
static |
Build the helper function to dispose of a block.
Definition at line 61 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::GenerateDestroyHelperFunction().
Referenced by buildBlockDescriptor().
|
static |
Build the given block as a global block.
Definition at line 1201 of file CGBlocks.cpp.
References 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::CodeGenModule::getAddrOfGlobalBlockIfEmitted(), clang::CodeGen::BlockFlags::getBitMask(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getNSConcreteGlobalBlock(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTarget(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::TargetInfo::getTriple(), clang::CodeGen::CodeGenTypeCache::Int8PtrPtrTy, clang::CodeGen::CodeGenTypeCache::IntTy, and clang::CodeGen::CGBlockInfo::UsesStret.
Referenced by clang::CodeGen::CodeGenFunction::GenerateBlockFunction(), and clang::CodeGen::BlockByrefHelpers::~BlockByrefHelpers().
|
static |
Compute the layout of the given block.
Attempts to lay the block out with minimal space requirements.
Definition at line 363 of file CGBlocks.cpp.
References 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::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::ASTContext::getDeclAlign(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ASTContext::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::ASTContext::getTypeSizeInChars(), clang::CodeGen::CGBlockInfo::HasCapturedVariableLayout, clang::BlockDecl::hasCaptures(), clang::CodeGen::CGBlockInfo::HasCXXObject, initializeForBlockHeader(), clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::QualType::isDestructedType(), 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::Type, clang::CodeGen::CodeGenTypeCache::VoidPtrTy, and clang::CharUnits::Zero().
Referenced by clang::CodeGen::CodeGenFunction::EmitBlockLiteral(), enterBlockScope(), and clang::CodeGen::CodeGenModule::GetAddrOfGlobalBlock().
|
static |
Definition at line 1537 of file CGBlocks.cpp.
References clang::CodeGen::BLOCK_FIELD_IS_BLOCK, clang::CodeGen::BLOCK_FIELD_IS_BYREF, clang::CodeGen::BLOCK_FIELD_IS_OBJECT, clang::CodeGen::BLOCK_FIELD_IS_WEAK, clang::BlockDecl::Capture::getCopyExpr(), clang::Qualifiers::getObjCLifetime(), clang::QualType::getQualifiers(), isBlockPointer(), clang::Type::isBlockPointerType(), clang::BlockDecl::Capture::isByRef(), clang::QualType::isNonTrivialToPrimitiveCopy(), clang::QualType::isObjCGCWeak(), clang::Type::isObjCRetainableType(), clang::None, clang::QualType::PCK_ARCStrong, clang::QualType::PCK_ARCWeak, clang::QualType::PCK_Struct, clang::QualType::PCK_Trivial, and clang::QualType::PCK_VolatileTrivial.
|
static |
Definition at line 1825 of file CGBlocks.cpp.
References clang::CodeGen::BLOCK_FIELD_IS_BYREF, clang::CodeGen::BLOCK_FIELD_IS_WEAK, clang::QualType::DK_cxx_destructor, clang::QualType::DK_none, clang::QualType::DK_nontrivial_c_struct, clang::QualType::DK_objc_strong_lifetime, clang::QualType::DK_objc_weak_lifetime, getBlockFieldFlagsForObjCObjectPointer(), clang::QualType::getQualifiers(), clang::Qualifiers::hasObjCLifetime(), clang::BlockDecl::Capture::isByRef(), clang::QualType::isDestructedType(), clang::QualType::isObjCGCWeak(), clang::Type::isObjCRetainableType(), and clang::None.
|
static |
Adjust the declaration of something from the blocks API.
Definition at line 2610 of file CGBlocks.cpp.
References clang::TranslationUnitDecl::castToDeclContext(), clang::ExternalLinkage, clang::IdentifierTable::get(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getTarget(), clang::ASTContext::getTranslationUnitDecl(), clang::TargetInfo::getTriple(), clang::ASTContext::Idents, clang::DeclContext::lookup(), and clang::CodeGen::CodeGenModule::setDSOLocal().
Referenced by clang::CodeGen::CodeGenModule::getBlockObjectAssign(), clang::CodeGen::CodeGenModule::getBlockObjectDispose(), clang::CodeGen::CodeGenModule::getNSConcreteGlobalBlock(), and clang::CodeGen::CodeGenModule::getNSConcreteStackBlock().
|
static |
Enter the scope of a block.
This should be run at the entrance to a full-expression so that the block's cleanups are pushed at the right place in the stack.
Definition at line 617 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::Builder, clang::BlockDecl::captures(), clang::CodeGen::CGBlockInfo::CGBlockInfo(), clang::CodeGen::CodeGenFunction::CGM, computeBlockInfo(), clang::CodeGen::CGBuilderTy::CreateStructGEP(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), clang::CodeGen::CodeGenFunction::CurFn, clang::CodeGen::CodeGenFunction::destroyARCStrongImprecise, clang::QualType::DK_none, clang::QualType::DK_objc_strong_lifetime, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::emitARCIntrinsicUse, clang::CodeGen::CodeGenFunction::FirstBlockInfo, getCaptureFieldType(), clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::CodeGenFunction::getDestroyer(), clang::CodeGen::CGBlockInfo::Capture::getIndex(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::QualType::getObjCLifetime(), clang::CodeGen::CGBlockInfo::Capture::getOffset(), clang::CodeGen::Address::getPointer(), clang::CodeGen::CodeGenFunction::HaveInsertPoint(), clang::CodeGen::InactiveNormalAndEHCleanup, clang::CodeGen::InactiveNormalCleanup, clang::CodeGen::CGBlockInfo::Capture::isConstant(), clang::QualType::isConstQualified(), clang::QualType::isDestructedType(), clang::CodeGen::CodeGenFunction::needsEHCleanup(), clang::Qualifiers::OCL_Strong, clang::CodeGen::CodeGenFunction::pushDestroy(), clang::CodeGen::CGBlockInfo::Capture::setCleanup(), and clang::CodeGen::EHScopeStack::stable_begin().
|
static |
Find the layout for the given block in a linked list and remove it.
Definition at line 709 of file CGBlocks.cpp.
References clang::CodeGen::CGBlockInfo::getBlockDecl(), and clang::CodeGen::CGBlockInfo::NextBlockInfo.
Referenced by clang::CodeGen::CodeGenFunction::EmitBlockLiteral().
|
static |
Find the set of block captures that need to be explicitly copied or destroy.
Definition at line 1594 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::BuildBlockRelease(), clang::CodeGen::CodeGenFunction::Builder, clang::BlockDecl::captures(), clang::CodeGen::CGBuilderTy::CreateBitCast(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CGBlockInfo::getBlockDecl(), clang::CodeGen::CGBlockInfo::getCapture(), clang::CodeGen::Address::getPointer(), clang::ValueDecl::getType(), clang::CodeGen::CGBlockInfo::Capture::isConstant(), clang::None, and clang::CodeGen::CodeGenTypeCache::VoidPtrTy.
|
static |
Definition at line 2116 of file CGBlocks.cpp.
Referenced by buildByrefCopyHelper().
|
static |
Generate code for a __block variable's dispose helper.
Definition at line 2193 of file CGBlocks.cpp.
Referenced by buildByrefDisposeHelper().
|
static |
Definition at line 1816 of file CGBlocks.cpp.
References clang::CodeGen::BLOCK_FIELD_IS_BLOCK, clang::CodeGen::BLOCK_FIELD_IS_OBJECT, and clang::Type::isBlockPointerType().
Referenced by computeDestroyInfoForBlockCapture().
|
static |
Definition at line 348 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::BlockInfo, clang::CodeGen::CGBlockInfo::Capture::fieldType(), clang::CodeGen::CGBlockInfo::getCapture(), clang::ValueDecl::getType(), clang::BlockDecl::Capture::getVariable(), clang::BlockDecl::Capture::isNested(), and clang::CodeGen::CodeGenFunction::LambdaCaptureFields.
Referenced by computeBlockInfo(), and enterBlockScope().
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 302 of file CGBlocks.cpp.
References clang::CharUnits::fromQuantity(), and clang::CharUnits::getQuantity().
Referenced by computeBlockInfo().
|
static |
Definition at line 306 of file CGBlocks.cpp.
References clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CodeGenTypeCache::getIntAlign(), clang::CodeGen::CodeGenTypeCache::getIntSize(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), and clang::CodeGen::CodeGenTypeCache::IntTy.
Referenced by computeBlockInfo().
Determines if the given type is safe for constant capture in C++.
Definition at line 246 of file CGBlocks.cpp.
References clang::Type::getAs(), clang::Type::getBaseElementTypeUnsafe(), clang::RecordType::getDecl(), and clang::ast_matchers::recordType.
Referenced by tryCaptureAsConstant().
|
static |
Definition at line 1636 of file CGBlocks.cpp.
References clang::CodeGen::CodeGenFunction::destroyARCStrongImprecise, clang::CodeGen::EHCleanup, clang::CodeGen::CodeGenFunction::enterByrefCleanup(), clang::CodeGen::CodeGenFunction::getCleanupKind(), clang::CodeGen::CodeGenFunction::getDestroyer(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::QualType::isDestructedType(), clang::CodeGen::CodeGenFunction::needsEHCleanup(), clang::None, clang::CodeGen::NormalAndEHCleanup, and clang::CodeGen::CodeGenFunction::pushDestroy().
|
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 270 of file CGBlocks.cpp.
References clang::VarDecl::getInit(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ValueDecl::getType(), clang::QualType::isConstQualified(), isSafeForCXXConstantCapture(), and clang::CodeGen::ConstantEmitter::tryEmitAbstractForInitializer().
Referenced by computeBlockInfo().