clang API Documentation

Enumerations | Functions
CGExpr.cpp File Reference
#include "CodeGenFunction.h"
#include "CGCXXABI.h"
#include "CGCall.h"
#include "CGDebugInfo.h"
#include "CGObjCRuntime.h"
#include "CGOpenMPRuntime.h"
#include "CGRecordLayout.h"
#include "CodeGenModule.h"
#include "TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Attr.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/Support/ConvertUTF.h"
Include dependency graph for CGExpr.cpp:

Go to the source code of this file.

Enumerations

enum  ConstantEmissionKind { CEK_None, CEK_AsReferenceOnly, CEK_AsValueOrReference, CEK_AsValueOnly }
enum  CheckRecoverableKind
 Specify under what conditions this check can be recovered. More...

Functions

static void pushTemporaryCleanup (CodeGenFunction &CGF, const MaterializeTemporaryExpr *M, const Expr *E, llvm::Value *ReferenceTemporary)
static llvm::ValuecreateReferenceTemporary (CodeGenFunction &CGF, const MaterializeTemporaryExpr *M, const Expr *Inner)
static llvm::ValueemitHash16Bytes (CGBuilderTy &Builder, llvm::Value *Low, llvm::Value *High)
 Emit the hash_16_bytes function from include/llvm/ADT/Hashing.h.
static bool isFlexibleArrayMemberExpr (const Expr *E)
static llvm::ValuegetArrayIndexingBound (CodeGenFunction &CGF, const Expr *Base, QualType &IndexedType)
static bool isConstantEmittableObjectType (QualType type)
static ConstantEmissionKind checkVarTypeForConstantEmission (QualType type)
static bool hasBooleanRepresentation (QualType Ty)
static bool getRangeForType (CodeGenFunction &CGF, QualType Ty, llvm::APInt &Min, llvm::APInt &End, bool StrictEnums)
static void setObjCGCLValueClass (const ASTContext &Ctx, const Expr *E, LValue &LV, bool IsMemberAccess=false)
static llvm::ValueEmitBitCastOfLValueToProperType (CodeGenFunction &CGF, llvm::Value *V, llvm::Type *IRType, StringRef Name=StringRef())
static LValue EmitThreadPrivateVarDeclLValue (CodeGenFunction &CGF, const VarDecl *VD, QualType T, llvm::Value *V, llvm::Type *RealVarTy, CharUnits Alignment, SourceLocation Loc)
static LValue EmitGlobalVarDeclLValue (CodeGenFunction &CGF, const Expr *E, const VarDecl *VD)
static LValue EmitFunctionDeclLValue (CodeGenFunction &CGF, const Expr *E, const FunctionDecl *FD)
static LValue EmitCapturedFieldLValue (CodeGenFunction &CGF, const FieldDecl *FD, llvm::Value *ThisValue)
static LValue EmitGlobalNamedRegister (const VarDecl *VD, CodeGenModule &CGM, CharUnits Alignment)
static CheckRecoverableKind getRecoverableKind (SanitizerKind Kind)
static const ExprisSimpleArrayDecayOperand (const Expr *E)
static llvm::Constant * GenerateConstantVector (CGBuilderTy &Builder, SmallVectorImpl< unsigned > &Elts)
static Optional< LValueEmitLValueOrThrowExpression (CodeGenFunction &CGF, const Expr *Operand)
static LValueOrRValue emitPseudoObjectExpr (CodeGenFunction &CGF, const PseudoObjectExpr *E, bool forLValue, AggValueSlot slot)

Enumeration Type Documentation

Specify under what conditions this check can be recovered.

Definition at line 2203 of file CGExpr.cpp.

Can we constant-emit a load of a reference to a variable of the given type? This is different from predicates like Decl::isUsableInConstantExpressions because we do want it to apply in situations that don't necessarily satisfy the language's rules for this (e.g. C++'s ODR-use rules). For example, we want to able to do this with const float variables even if those variables aren't marked 'constexpr'.

Enumerator:
CEK_None 
CEK_AsReferenceOnly 
CEK_AsValueOrReference 
CEK_AsValueOnly 

Definition at line 943 of file CGExpr.cpp.


Function Documentation

static llvm::Value* createReferenceTemporary ( CodeGenFunction CGF,
const MaterializeTemporaryExpr M,
const Expr Inner 
) [static]
static llvm::Value* EmitBitCastOfLValueToProperType ( CodeGenFunction CGF,
llvm::Value V,
llvm::Type *  IRType,
StringRef  Name = StringRef() 
) [static]
static LValue EmitCapturedFieldLValue ( CodeGenFunction CGF,
const FieldDecl FD,
llvm::Value ThisValue 
) [static]
static LValue EmitFunctionDeclLValue ( CodeGenFunction CGF,
const Expr E,
const FunctionDecl FD 
) [static]
static LValue EmitGlobalNamedRegister ( const VarDecl VD,
CodeGenModule CGM,
CharUnits  Alignment 
) [static]

Named Registers are named metadata pointing to the register name which will be read from/written to as an argument to the intrinsic .read/write_register. So far, only the name is being passed down, but other options such as register type, allocation type or even optimization options could be passed down via the metadata node.

Definition at line 1875 of file CGExpr.cpp.

References clang::Decl::getAttr(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenModule::getModule(), clang::ValueDecl::getType(), and clang::CodeGen::LValue::MakeGlobalReg().

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

static LValue EmitGlobalVarDeclLValue ( CodeGenFunction CGF,
const Expr E,
const VarDecl VD 
) [static]
static llvm::Value* emitHash16Bytes ( CGBuilderTy Builder,
llvm::Value Low,
llvm::Value High 
) [static]

Emit the hash_16_bytes function from include/llvm/ADT/Hashing.h.

Definition at line 449 of file CGExpr.cpp.

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

static Optional<LValue> EmitLValueOrThrowExpression ( CodeGenFunction CGF,
const Expr Operand 
) [static]

Emit the operand of a glvalue conditional operator. This is either a glvalue or a (possibly-parenthesized) throw-expression. If this is a throw, no LValue is returned and the current block has been terminated.

Definition at line 2764 of file CGExpr.cpp.

References clang::CodeGen::CodeGenFunction::EmitCXXThrowExpr(), clang::CodeGen::CodeGenFunction::EmitLValue(), and clang::Expr::IgnoreParens().

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

static LValueOrRValue emitPseudoObjectExpr ( CodeGenFunction CGF,
const PseudoObjectExpr E,
bool  forLValue,
AggValueSlot  slot 
) [static]
static LValue EmitThreadPrivateVarDeclLValue ( CodeGenFunction CGF,
const VarDecl VD,
QualType  T,
llvm::Value V,
llvm::Type *  RealVarTy,
CharUnits  Alignment,
SourceLocation  Loc 
) [static]
static llvm::Constant* GenerateConstantVector ( CGBuilderTy Builder,
SmallVectorImpl< unsigned > &  Elts 
) [static]
static llvm::Value* getArrayIndexingBound ( CodeGenFunction CGF,
const Expr Base,
QualType IndexedType 
) [static]

If Base is known to point to the start of an array, return the length of that array. Return 0 if the length cannot be determined.

Definition at line 653 of file CGExpr.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::Type::castAsArrayTypeUnsafe(), clang::CK_ArrayToPointerDecay, clang::Type::getAs(), clang::Expr::getType(), clang::CodeGen::CodeGenFunction::getVLASize(), clang::Expr::IgnoreParens(), and isFlexibleArrayMemberExpr().

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

static bool getRangeForType ( CodeGenFunction CGF,
QualType  Ty,
llvm::APInt &  Min,
llvm::APInt &  End,
bool  StrictEnums 
) [static]

Definition at line 2213 of file CGExpr.cpp.

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

static bool hasBooleanRepresentation ( QualType  Ty) [static]
static bool isConstantEmittableObjectType ( QualType  type) [static]

Given an object of the given canonical type, can we safely copy a value out of it based on its initializer?

Definition at line 918 of file CGExpr.cpp.

References clang::QualType::getLocalQualifiers(), clang::QualType::isCanonical(), and clang::Type::isReferenceType().

Referenced by checkVarTypeForConstantEmission().

static bool isFlexibleArrayMemberExpr ( const Expr E) [static]

Determine whether this expression refers to a flexible array member in a struct. We disable array bounds checks for such members.

Definition at line 625 of file CGExpr.cpp.

References clang::Type::castAsArrayTypeUnsafe(), clang::Expr::getType(), and clang::Expr::IgnoreParens().

Referenced by getArrayIndexingBound().

static const Expr* isSimpleArrayDecayOperand ( const Expr E) [static]

isSimpleArrayDecayOperand - If the specified expr is a simple decay from an array to pointer, return the array subexpression.

Definition at line 2339 of file CGExpr.cpp.

References clang::CK_ArrayToPointerDecay, clang::Expr::getType(), and clang::Type::isVariableArrayType().

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

static void pushTemporaryCleanup ( CodeGenFunction CGF,
const MaterializeTemporaryExpr M,
const Expr E,
llvm::Value ReferenceTemporary 
) [static]

Definition at line 179 of file CGExpr.cpp.

References clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::Complete, clang::CodeGen::CodeGenFunction::destroyARCStrongImprecise, clang::CodeGen::CodeGenFunction::destroyARCStrongPrecise, clang::CodeGen::CodeGenFunction::destroyARCWeak, clang::CodeGen::CodeGenFunction::destroyCXXObject, clang::CodeGen::EHCleanup, clang::CodeGen::CodeGenFunction::generateDestroyHelper(), clang::CodeGen::CodeGenModule::getAddrOfCXXStructor(), clang::CodeGen::CodeGenFunction::getARCCleanupKind(), clang::Type::getAs(), clang::Type::getBaseElementTypeUnsafe(), clang::CodeGen::CodeGenModule::getCXXABI(), clang::MaterializeTemporaryExpr::getExtendingDecl(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::QualType::getObjCLifetime(), clang::MaterializeTemporaryExpr::getStorageDuration(), clang::Expr::getType(), clang::Decl::hasAttr(), clang::CodeGen::CodeGenTypeCache::Int8PtrTy, clang::Type::isArrayType(), clang::Type::isObjCLifetimeType(), clang::CodeGen::NormalAndEHCleanup, clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, clang::CodeGen::CodeGenFunction::pushDestroy(), clang::CodeGen::CodeGenFunction::pushLifetimeExtendedDestroy(), clang::CodeGen::CGCXXABI::registerGlobalDtor(), clang::SD_Automatic, clang::SD_Dynamic, clang::SD_FullExpression, clang::SD_Static, and clang::SD_Thread.

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

static void setObjCGCLValueClass ( const ASTContext Ctx,
const Expr E,
LValue LV,
bool  IsMemberAccess = false 
) [static]