clang  13.0.0git
Enumerations | Functions
CGDecl.cpp File Reference
#include "CGBlocks.h"
#include "CGCXXABI.h"
#include "CGCleanup.h"
#include "CGDebugInfo.h"
#include "CGOpenCLRuntime.h"
#include "CGOpenMPRuntime.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "PatternInit.h"
#include "TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "clang/Sema/Sema.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Type.h"
Include dependency graph for CGDecl.cpp:

Go to the source code of this file.

Enumerations

enum  IsPattern { IsPattern::No, IsPattern::Yes }
 

Functions

static std::string getStaticDeclName (CodeGenModule &CGM, const VarDecl &D)
 
static void EmitAutoVarWithLifetime (CodeGenFunction &CGF, const VarDecl &var, Address addr, Qualifiers::ObjCLifetime lifetime)
 EmitAutoVarWithLifetime - Does the setup required for an automatic variable with lifetime. More...
 
static bool isAccessedBy (const VarDecl &var, const Stmt *s)
 
static bool isAccessedBy (const ValueDecl *decl, const Expr *e)
 
static bool tryEmitARCCopyWeakInit (CodeGenFunction &CGF, const LValue &destLV, const Expr *init)
 
static void drillIntoBlockVariable (CodeGenFunction &CGF, LValue &lvalue, const VarDecl *var)
 
static bool canEmitInitWithFewStoresAfterBZero (llvm::Constant *Init, unsigned &NumStores)
 Decide whether we can emit the non-zero parts of the specified initializer with equal or fewer than NumStores scalar stores. More...
 
static void emitStoresForInitAfterBZero (CodeGenModule &CGM, llvm::Constant *Init, Address Loc, bool isVolatile, CGBuilderTy &Builder, bool IsAutoInit)
 For inits that canEmitInitWithFewStoresAfterBZero returned true for, emit the scalar stores that would be required. More...
 
static bool shouldUseBZeroPlusStoresToInitialize (llvm::Constant *Init, uint64_t GlobalSize)
 Decide whether we should use bzero plus some stores to initialize a local variable instead of using a memcpy from a constant global. More...
 
static llvm::ValueshouldUseMemSetToInitialize (llvm::Constant *Init, uint64_t GlobalSize, const llvm::DataLayout &DL)
 Decide whether we should use memset to initialize a local variable instead of using a memcpy from a constant global. More...
 
static bool shouldSplitConstantStore (CodeGenModule &CGM, uint64_t GlobalByteSize)
 Decide whether we want to split a constant structure or array store into a sequence of its fields' stores. More...
 
static llvm::Constant * patternOrZeroFor (CodeGenModule &CGM, IsPattern isPattern, llvm::Type *Ty)
 Generate a constant filled with either a pattern or zeroes. More...
 
static llvm::Constant * constWithPadding (CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)
 Replace all padding bytes in a given constant with either a pattern byte or 0x00. More...
 
static llvm::Constant * constStructWithPadding (CodeGenModule &CGM, IsPattern isPattern, llvm::StructType *STy, llvm::Constant *constant)
 Helper function for constWithPadding() to deal with padding in structures. More...
 
static Address createUnnamedGlobalForMemcpyFrom (CodeGenModule &CGM, const VarDecl &D, CGBuilderTy &Builder, llvm::Constant *Constant, CharUnits Align)
 
static void emitStoresForConstant (CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder, llvm::Constant *constant, bool IsAutoInit)
 
static void emitStoresForZeroInit (CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder)
 
static void emitStoresForPatternInit (CodeGenModule &CGM, const VarDecl &D, Address Loc, bool isVolatile, CGBuilderTy &Builder)
 
static bool containsUndef (llvm::Constant *constant)
 
static llvm::Constant * replaceUndef (CodeGenModule &CGM, IsPattern isPattern, llvm::Constant *constant)
 
static bool isCapturedBy (const VarDecl &Var, const Expr *E)
 Determines whether the given __block variable is potentially captured by the given expression. More...
 
static bool isCapturedBy (const VarDecl &Var, const Stmt *S)
 Determines whether the given __block variable is potentially captured by the given statement. More...
 
static void emitPartialArrayDestroy (CodeGenFunction &CGF, llvm::Value *begin, llvm::Value *end, QualType type, CharUnits elementAlign, CodeGenFunction::Destroyer *destroyer)
 Perform partial array destruction as if in an EH cleanup. More...
 

Enumeration Type Documentation

◆ IsPattern

enum IsPattern
strong
Enumerator
No 
Yes 

Definition at line 1004 of file CGDecl.cpp.

Function Documentation

◆ canEmitInitWithFewStoresAfterBZero()

static bool canEmitInitWithFewStoresAfterBZero ( llvm::Constant *  Init,
unsigned NumStores 
)
static

Decide whether we can emit the non-zero parts of the specified initializer with equal or fewer than NumStores scalar stores.

Definition at line 875 of file CGDecl.cpp.

References clang::NumStores.

Referenced by shouldUseBZeroPlusStoresToInitialize().

◆ constStructWithPadding()

static llvm::Constant* constStructWithPadding ( CodeGenModule CGM,
IsPattern  isPattern,
llvm::StructType *  STy,
llvm::Constant *  constant 
)
static

Helper function for constWithPadding() to deal with padding in structures.

Definition at line 1019 of file CGDecl.cpp.

References constWithPadding(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::CodeGenModule::getLLVMContext(), and patternOrZeroFor().

Referenced by constWithPadding().

◆ constWithPadding()

static llvm::Constant * constWithPadding ( CodeGenModule CGM,
IsPattern  isPattern,
llvm::Constant *  constant 
)
static

Replace all padding bytes in a given constant with either a pattern byte or 0x00.

Definition at line 1059 of file CGDecl.cpp.

References constStructWithPadding().

Referenced by constStructWithPadding(), and clang::CodeGen::CodeGenFunction::EmitAutoVarInit().

◆ containsUndef()

static bool containsUndef ( llvm::Constant *  constant)
static

Definition at line 1273 of file CGDecl.cpp.

Referenced by replaceUndef().

◆ createUnnamedGlobalForMemcpyFrom()

static Address createUnnamedGlobalForMemcpyFrom ( CodeGenModule CGM,
const VarDecl D,
CGBuilderTy Builder,
llvm::Constant *  Constant,
CharUnits  Align 
)
static

Definition at line 1145 of file CGDecl.cpp.

◆ drillIntoBlockVariable()

static void drillIntoBlockVariable ( CodeGenFunction CGF,
LValue lvalue,
const VarDecl var 
)
static

◆ EmitAutoVarWithLifetime()

static void EmitAutoVarWithLifetime ( CodeGenFunction CGF,
const VarDecl var,
Address  addr,
Qualifiers::ObjCLifetime  lifetime 
)
static

◆ emitPartialArrayDestroy()

static void emitPartialArrayDestroy ( CodeGenFunction CGF,
llvm::Value begin,
llvm::Value end,
QualType  type,
CharUnits  elementAlign,
CodeGenFunction::Destroyer *  destroyer 
)
static

Perform partial array destruction as if in an EH cleanup.

Unlike emitArrayDestroy, the element type here may still be an array type.

Definition at line 2268 of file CGDecl.cpp.

References clang::ast_matchers::arrayType, clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::emitArrayDestroy(), clang::ASTContext::getAsArrayType(), clang::CodeGen::CodeGenFunction::getContext(), and clang::CodeGen::CodeGenTypeCache::SizeTy.

◆ emitStoresForConstant()

static void emitStoresForConstant ( CodeGenModule CGM,
const VarDecl D,
Address  Loc,
bool  isVolatile,
CGBuilderTy Builder,
llvm::Constant *  constant,
bool  IsAutoInit 
)
static

Definition at line 1158 of file CGDecl.cpp.

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

◆ emitStoresForInitAfterBZero()

static void emitStoresForInitAfterBZero ( CodeGenModule CGM,
llvm::Constant *  Init,
Address  Loc,
bool  isVolatile,
CGBuilderTy Builder,
bool  IsAutoInit 
)
static

For inits that canEmitInitWithFewStoresAfterBZero returned true for, emit the scalar stores that would be required.

Definition at line 913 of file CGDecl.cpp.

◆ emitStoresForPatternInit()

static void emitStoresForPatternInit ( CodeGenModule CGM,
const VarDecl D,
Address  Loc,
bool  isVolatile,
CGBuilderTy Builder 
)
static

Definition at line 1262 of file CGDecl.cpp.

◆ emitStoresForZeroInit()

static void emitStoresForZeroInit ( CodeGenModule CGM,
const VarDecl D,
Address  Loc,
bool  isVolatile,
CGBuilderTy Builder 
)
static

Definition at line 1252 of file CGDecl.cpp.

◆ getStaticDeclName()

static std::string getStaticDeclName ( CodeGenModule CGM,
const VarDecl D 
)
static

◆ isAccessedBy() [1/2]

static bool isAccessedBy ( const ValueDecl decl,
const Expr e 
)
static

Definition at line 673 of file CGDecl.cpp.

References clang::ast_matchers::decl, and isAccessedBy().

◆ isAccessedBy() [2/2]

static bool isAccessedBy ( const VarDecl var,
const Stmt s 
)
static

Definition at line 648 of file CGDecl.cpp.

References clang::BlockDecl::captures(), and s.

Referenced by clang::CodeGen::CodeGenFunction::EmitScalarInit(), and isAccessedBy().

◆ isCapturedBy() [1/2]

static bool isCapturedBy ( const VarDecl Var,
const Expr E 
)
static

Determines whether the given __block variable is potentially captured by the given expression.

Definition at line 1637 of file CGDecl.cpp.

References clang::Block, clang::CompoundStmt::body(), clang::Stmt::children(), and clang::Expr::IgnoreParenCasts().

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

◆ isCapturedBy() [2/2]

static bool isCapturedBy ( const VarDecl Var,
const Stmt S 
)
static

Determines whether the given __block variable is potentially captured by the given statement.

Definition at line 1626 of file CGDecl.cpp.

◆ patternOrZeroFor()

static llvm::Constant* patternOrZeroFor ( CodeGenModule CGM,
IsPattern  isPattern,
llvm::Type *  Ty 
)
static

Generate a constant filled with either a pattern or zeroes.

Definition at line 1007 of file CGDecl.cpp.

References clang::CodeGen::initializationPatternFor(), and Yes.

Referenced by constStructWithPadding(), and replaceUndef().

◆ replaceUndef()

static llvm::Constant* replaceUndef ( CodeGenModule CGM,
IsPattern  isPattern,
llvm::Constant *  constant 
)
static

Definition at line 1284 of file CGDecl.cpp.

References containsUndef(), and patternOrZeroFor().

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

◆ shouldSplitConstantStore()

static bool shouldSplitConstantStore ( CodeGenModule CGM,
uint64_t  GlobalByteSize 
)
static

Decide whether we want to split a constant structure or array store into a sequence of its fields' stores.

This may cost us code size and compilation speed, but plays better with store optimizations.

Definition at line 993 of file CGDecl.cpp.

References clang::CodeGen::CodeGenModule::getCodeGenOpts().

◆ shouldUseBZeroPlusStoresToInitialize()

static bool shouldUseBZeroPlusStoresToInitialize ( llvm::Constant *  Init,
uint64_t  GlobalSize 
)
static

Decide whether we should use bzero plus some stores to initialize a local variable instead of using a memcpy from a constant global.

It is beneficial to use bzero if the global is all zeros, or mostly zeros and large.

Definition at line 960 of file CGDecl.cpp.

References canEmitInitWithFewStoresAfterBZero().

◆ shouldUseMemSetToInitialize()

static llvm::Value* shouldUseMemSetToInitialize ( llvm::Constant *  Init,
uint64_t  GlobalSize,
const llvm::DataLayout &  DL 
)
static

Decide whether we should use memset to initialize a local variable instead of using a memcpy from a constant global.

Assumes we've already decided to not user bzero. FIXME We could be more clever, as we are for bzero above, and generate memset followed by stores. It's unclear that's worth the effort.

Definition at line 981 of file CGDecl.cpp.

◆ tryEmitARCCopyWeakInit()

static bool tryEmitARCCopyWeakInit ( CodeGenFunction CGF,
const LValue destLV,
const Expr init 
)
static