clang  8.0.0svn
Enumerations | Functions
CGExprAgg.cpp File Reference
#include "CodeGenFunction.h"
#include "CGCXXABI.h"
#include "CGObjCRuntime.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/StmtVisitor.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicInst.h"
Include dependency graph for CGExprAgg.cpp:

Go to the source code of this file.

Enumerations

enum  CompareKind { CK_Less, CK_Greater, CK_Equal }
 

Functions

static bool isTrivialFiller (Expr *E)
 Determine if E is a trivial array filler, that is, one that is equivalent to zero-initialization. More...
 
static ExprfindPeephole (Expr *op, CastKind kind)
 Attempt to look through various unimportant expressions to find a cast of the given kind. More...
 
static llvm::ValueEmitCompare (CGBuilderTy &Builder, CodeGenFunction &CGF, const BinaryOperator *E, llvm::Value *LHS, llvm::Value *RHS, CompareKind Kind, const char *NameSuffix="")
 
static bool isBlockVarRef (const Expr *E)
 Is the value of the given expression possibly a reference to or into a __block variable? More...
 
static bool isSimpleZero (const Expr *E, CodeGenFunction &CGF)
 isSimpleZero - If emitting this value will obviously just cause a store of zero to memory, return true. More...
 
static CharUnits GetNumNonZeroBytesInInit (const Expr *E, CodeGenFunction &CGF)
 GetNumNonZeroBytesInInit - Get an approximate count of the number of non-zero bytes that will be stored when outputting the initializer for the specified initializer expression. More...
 
static void CheckAggExprForMemSetUse (AggValueSlot &Slot, const Expr *E, CodeGenFunction &CGF)
 CheckAggExprForMemSetUse - If the initializer is large and has a lot of zeros in it, emit a memset and avoid storing the individual zeros. More...
 

Enumeration Type Documentation

◆ CompareKind

Enumerator
CK_Less 
CK_Greater 
CK_Equal 

Definition at line 890 of file CGExprAgg.cpp.

Function Documentation

◆ CheckAggExprForMemSetUse()

static void CheckAggExprForMemSetUse ( AggValueSlot Slot,
const Expr E,
CodeGenFunction CGF 
)
static

◆ EmitCompare()

static llvm::Value* EmitCompare ( CGBuilderTy Builder,
CodeGenFunction CGF,
const BinaryOperator E,
llvm::Value LHS,
llvm::Value RHS,
CompareKind  Kind,
const char *  NameSuffix = "" 
)
static

◆ findPeephole()

static Expr* findPeephole ( Expr op,
CastKind  kind 
)
static

Attempt to look through various unimportant expressions to find a cast of the given kind.

Definition at line 664 of file CGExprAgg.cpp.

References clang::ast_matchers::atomicType, clang::CodeGen::CodeGenFunction::Builder, clang::Type::castAs(), clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertType(), clang::CodeGen::CodeGenFunction::CreateAggTemp(), clang::CodeGen::CGBuilderTy::CreateElementBitCast(), clang::CodeGen::CGBuilderTy::CreateStructGEP(), clang::CodeGen::AggValueSlot::DoesNotOverlap, clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitAnyExpr(), clang::CodeGen::CodeGenFunction::EmitCallExpr(), clang::CodeGen::CodeGenFunction::EmitCheckedLValue(), clang::CodeGen::CodeGenFunction::EmitCompoundStmt(), clang::CodeGen::CodeGenFunction::EmitDynamicCast(), clang::CodeGen::CodeGenModule::EmitExplicitCastExprType(), clang::CodeGen::CodeGenFunction::EmitIgnoredExpr(), clang::CodeGen::CodeGenFunction::EmitNullInitialization(), clang::CodeGen::CodeGenFunction::EmitObjCMessageExpr(), clang::CodeGen::CodeGenModule::ErrorUnsupported(), clang::CodeGen::AggValueSlot::forAddr(), clang::CodeGen::LValue::getAddress(), clang::CodeGen::AggValueSlot::getAddress(), clang::CodeGen::RValue::getAggregate(), clang::CallExpr::getCallReturnType(), clang::CastExpr::getCastKind(), clang::CodeGen::CodeGenFunction::getContext(), clang::BinaryOperator::getLHS(), clang::CodeGen::AggValueSlot::getQualifiers(), clang::BinaryOperator::getRHS(), clang::CastExpr::getSubExpr(), clang::StmtExpr::getSubStmt(), clang::Expr::getType(), clang::AtomicType::getValueType(), clang::ASTContext::hasSameUnqualifiedType(), clang::CodeGen::AggValueSlot::ignored(), clang::Expr::IgnoreParens(), clang::Type::isAtomicType(), clang::CodeGen::AggValueSlot::isExternallyDestructed(), clang::CodeGen::AggValueSlot::isIgnored(), clang::CodeGen::CodeGenModule::isPaddedAtomicType(), clang::CodeGen::AggValueSlot::isPotentiallyAliased(), clang::CodeGen::LValue::isSimple(), clang::CodeGen::AggValueSlot::isVolatile(), clang::QualType::isVolatileQualified(), clang::CodeGen::AggValueSlot::IsZeroed, clang::CodeGen::AggValueSlot::isZeroed(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::AggValueSlot::requiresGCollection(), and clang::CodeGen::CodeGenFunction::TCK_Load.

◆ GetNumNonZeroBytesInInit()

static CharUnits GetNumNonZeroBytesInInit ( const Expr E,
CodeGenFunction CGF 
)
static

◆ isBlockVarRef()

static bool isBlockVarRef ( const Expr E)
static

Is the value of the given expression possibly a reference to or into a __block variable?

Definition at line 1049 of file CGExprAgg.cpp.

References clang::CodeGen::AggValueSlot::asRValue(), clang::CodeGen::CodeGenFunction::ConditionalEvaluation::begin(), clang::CodeGen::CodeGenFunction::Builder, clang::cast(), clang::CXXInheritedCtorInitExpr::constructsVBase(), clang::CodeGen::CodeGenFunction::createBasicBlock(), clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitAtomicStore(), clang::CodeGen::CodeGenFunction::EmitBlock(), clang::CodeGen::CodeGenFunction::EmitBranchOnBoolExpr(), clang::CodeGen::CodeGenFunction::EmitCheckedLValue(), clang::CodeGen::CodeGenFunction::EmitCXXConstructExpr(), clang::CodeGen::CodeGenFunction::EmitCXXTemporary(), clang::CodeGen::CodeGenFunction::EmitInheritedCXXConstructorCall(), clang::CodeGen::CodeGenFunction::EmitLambdaExpr(), clang::CodeGen::CodeGenFunction::EmitLValue(), clang::CodeGen::CodeGenFunction::EmitVAArg(), clang::CodeGen::CodeGenFunction::ConditionalEvaluation::end(), clang::CodeGen::CodeGenFunction::enterFullExpression(), clang::CodeGen::CodeGenFunction::ErrorUnsupported(), clang::CodeGen::AggValueSlot::forLValue(), clang::CodeGen::AggValueSlot::getAddress(), clang::ChooseExpr::getChosenSubExpr(), clang::AbstractConditionalOperator::getCond(), clang::CXXInheritedCtorInitExpr::getConstructor(), clang::CodeGen::CodeGenFunction::getContext(), clang::AbstractConditionalOperator::getFalseExpr(), clang::BinaryOperator::getLHS(), clang::CodeGen::CodeGenFunction::getProfileCount(), clang::BinaryOperator::getRHS(), clang::FullExpr::getSubExpr(), clang::CXXBindTemporaryExpr::getSubExpr(), clang::CXXBindTemporaryExpr::getTemporary(), clang::AbstractConditionalOperator::getTrueExpr(), clang::Expr::getType(), clang::CodeGen::LValue::getType(), clang::Decl::hasAttr(), clang::ASTContext::hasSameUnqualifiedType(), clang::Expr::HasSideEffects(), clang::CodeGen::CodeGenFunction::hasVolatileMember(), clang::CodeGen::CodeGenFunction::HaveInsertPoint(), clang::Expr::IgnoreParens(), clang::CodeGen::CodeGenFunction::incrementProfileCounter(), clang::CXXInheritedCtorInitExpr::inheritedFromVBase(), clang::CodeGen::Address::invalid(), clang::CodeGen::AggValueSlot::IsAliased, clang::Type::isAtomicType(), clang::CodeGen::AggValueSlot::IsDestructed, clang::CodeGen::AggValueSlot::isExternallyDestructed(), clang::CodeGen::Address::isValid(), clang::CodeGen::AggValueSlot::isVolatile(), clang::CodeGen::CodeGenFunction::LValueIsSuitableForInlineAtomic(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::AggValueSlot::MayOverlap, clang::CodeGen::AggValueSlot::setExternallyDestructed(), clang::CodeGen::AggValueSlot::setVolatile(), and clang::CodeGen::CodeGenFunction::TCK_Store.

◆ isSimpleZero()

static bool isSimpleZero ( const Expr E,
CodeGenFunction CGF 
)
static

isSimpleZero - If emitting this value will obviously just cause a store of zero to memory, return true.

This can return false if uncertain, so it just handles simple cases.

Definition at line 1291 of file CGExprAgg.cpp.

References clang::CharUnits::alignmentOfArrayElement(), clang::CodeGen::CodeGenFunction::Builder, clang::Type::castAs(), clang::CodeGen::CodeGenFunction::CGM, clang::format::cleanup(), clang::CodeGen::CGBuilderTy::CreateAlignedLoad(), clang::CodeGen::CodeGenFunction::createBasicBlock(), clang::CodeGen::CGBuilderTy::CreateBitCast(), clang::CodeGen::CodeGenFunction::DeactivateCleanupBlock(), clang::QualType::DK_none, clang::CodeGen::AggValueSlot::DoesNotNeedGCBarriers, clang::CodeGen::AggValueSlot::DoesNotOverlap, clang::CodeGen::EHCleanup, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitBlock(), clang::CodeGen::CodeGenFunction::EmitComplexExprIntoLValue(), clang::CodeGen::CodeGenFunction::EmitLValueForFieldInitialization(), clang::CodeGen::CodeGenModule::EmitNullConstant(), clang::CodeGen::CodeGenFunction::EmitNullInitialization(), clang::CodeGen::CodeGenFunction::EmitReferenceBindingToExpr(), clang::CodeGen::CodeGenFunction::EmitScalarExpr(), clang::CodeGen::CodeGenFunction::EmitScalarInit(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::CodeGen::CodeGenFunction::EmitStoreThroughBitfieldLValue(), clang::CodeGen::CodeGenFunction::EmitStoreThroughLValue(), clang::CodeGen::CodeGenFunction::ErrorUnsupported(), clang::RecordDecl::fields(), clang::CodeGen::AggValueSlot::forAddr(), clang::CodeGen::AggValueSlot::forLValue(), clang::CodeGen::RValue::get(), clang::CodeGen::LValue::getAddress(), clang::CodeGen::AggValueSlot::getAddress(), clang::CodeGen::CodeGenFunction::GetAddressOfDirectBaseInCompleteClass(), clang::ArrayInitLoopExpr::getArraySize(), clang::ASTContext::getAsArrayType(), clang::DesignatedInitUpdateExpr::getBase(), clang::ArrayInitLoopExpr::getCommonExpr(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getDestroyer(), clang::CodeGen::Address::getElementType(), clang::CodeGen::CodeGenFunction::getEvaluationKind(), clang::InitListExpr::getInit(), clang::InitListExpr::getInitializedFieldInUnion(), clang::CodeGen::CodeGenModule::getModule(), clang::InitListExpr::getNumInits(), clang::CodeGen::LValue::getPointer(), clang::ArrayInitLoopExpr::getSubExpr(), clang::CodeGen::Address::getType(), clang::Expr::getType(), clang::CodeGen::LValue::getType(), clang::CodeGen::CodeGenFunction::getTypes(), clang::ASTContext::getTypeSizeInChars(), clang::DesignatedInitUpdateExpr::getUpdater(), clang::InitListExpr::hadArrayRangeDesignator(), clang::CodeGen::CodeGenFunction::hasScalarEvaluationKind(), clang::Expr::IgnoreParens(), clang::CodeGen::CodeGenTypeCache::Int8PtrTy, clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::InternalLinkage, clang::Type::isArrayType(), clang::CodeGen::LValue::isBitField(), clang::CodeGen::AggValueSlot::IsDestructed, clang::CodeGen::AggValueSlot::IsNotAliased, clang::CodeGen::CodeGenTypes::isPointerZeroInitializable(), clang::Type::isRecordType(), clang::Type::isReferenceType(), clang::CodeGen::LValue::isSimple(), clang::InitListExpr::isTransparent(), clang::TagDecl::isUnion(), clang::CodeGen::AggValueSlot::isZeroed(), clang::CodeGen::CodeGenTypes::isZeroInitializable(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::AggValueSlot::MayOverlap, clang::CodeGen::CodeGenFunction::needsEHCleanup(), clang::CharUnits::One(), clang::CodeGen::CodeGenFunction::overlapForBaseInit(), clang::CodeGen::CodeGenFunction::pushDestroy(), clang::CodeGen::CodeGenFunction::pushRegularPartialArrayCleanup(), clang::CodeGen::LValue::setNonGC(), clang::CodeGen::CodeGenTypeCache::SizeTy, clang::CodeGen::EHScopeStack::stable_begin(), clang::CodeGen::TEK_Aggregate, clang::CodeGen::TEK_Complex, and clang::CodeGen::TEK_Scalar.

Referenced by GetNumNonZeroBytesInInit().

◆ isTrivialFiller()

static bool isTrivialFiller ( Expr E)
static

Determine if E is a trivial array filler, that is, one that is equivalent to zero-initialization.

Definition at line 444 of file CGExprAgg.cpp.

References clang::CharUnits::alignmentOfArrayElement(), clang::CodeGen::CodeGenFunction::CGM, clang::format::cleanup(), clang::CodeGen::CodeGenFunction::createBasicBlock(), clang::CodeGen::CGBuilderTy::CreateStore(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), clang::CodeGen::CodeGenFunction::DeactivateCleanupBlock(), clang::QualType::DK_none, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitBlock(), clang::CodeGen::ConstantEmitter::finalize(), clang::QualType::getAddressSpace(), clang::CodeGen::Address::getAlignment(), clang::InitListExpr::getArrayFiller(), clang::ASTContext::getAsArrayType(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenFunction::getDestroyer(), clang::ArrayType::getElementType(), clang::InitListExpr::getInit(), clang::CompoundLiteralExpr::getInitializer(), clang::CodeGen::CodeGenModule::getModule(), clang::InitListExpr::getNumInits(), clang::CodeGen::CodeGenFunction::getOrCreateOpaqueLValueMapping(), clang::CodeGen::Address::getPointer(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::OpaqueValueExpr::getSourceExpr(), clang::ASTContext::getTargetAddressSpace(), clang::MaterializeTemporaryExpr::GetTemporaryExpr(), clang::Expr::getType(), clang::ASTContext::getTypeAlignInChars(), clang::CodeGen::CodeGenFunction::getTypes(), clang::ASTContext::getTypeSizeInChars(), clang::CodeGen::Address::invalid(), clang::QualType::isDestructedType(), clang::QualType::isPODType(), clang::CodeGen::AggValueSlot::isPotentiallyAliased(), clang::QualType::isTriviallyCopyableType(), clang::CodeGen::CodeGenModule::isTypeConstant(), clang::OpaqueValueExpr::isUnique(), clang::CodeGen::Address::isValid(), clang::CodeGen::AggValueSlot::isZeroed(), clang::CodeGen::CodeGenTypes::isZeroInitializable(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::CodeGenFunction::needsEHCleanup(), clang::CodeGen::CodeGenFunction::pushIrregularPartialArrayCleanup(), clang::CodeGen::CodeGenTypeCache::SizeTy, clang::CodeGen::EHScopeStack::stable_begin(), and clang::CodeGen::ConstantEmitter::tryEmitForInitializer().