clang  3.9.0
Functions
CGCall.cpp File Reference
#include "CGCall.h"
#include "ABIInfo.h"
#include "CGBlocks.h"
#include "CGCXXABI.h"
#include "CGCleanup.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "TargetInfo.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/Basic/TargetBuiltins.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "clang/CodeGen/SwiftCallingConv.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/Transforms/Utils/Local.h"
Include dependency graph for CGCall.cpp:

Go to the source code of this file.

Functions

static CanQualType GetThisType (ASTContext &Context, const CXXRecordDecl *RD)
 Derives the 'this' type for codegen purposes, i.e. More...
 
static CanQual< FunctionProtoTypeGetFormalType (const CXXMethodDecl *MD)
 Returns the canonical formal type of the given C++ method. More...
 
static CanQualType GetReturnType (QualType RetTy)
 Returns the "extra-canonicalized" return type, which discards qualifiers on the return type. More...
 
static void appendParameterTypes (const CodeGenTypes &CGT, SmallVectorImpl< CanQualType > &prefix, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &paramInfos, CanQual< FunctionProtoType > FPT, const FunctionDecl *FD)
 Adds the formal paramaters in FPT to the given prefix. More...
 
static const CGFunctionInfoarrangeLLVMFunctionInfo (CodeGenTypes &CGT, bool instanceMethod, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > FTP, const FunctionDecl *FD)
 Arrange the LLVM function layout for a value of the given function type, on top of any implicit parameters already stored. More...
 
static CallingConv getCallingConventionForDecl (const Decl *D, bool IsWindows)
 
static SmallVector
< CanQualType, 16 > 
getArgTypesForCall (ASTContext &ctx, const CallArgList &args)
 
static SmallVector
< CanQualType, 16 > 
getArgTypesForDeclaration (ASTContext &ctx, const FunctionArgList &args)
 
static void addExtParameterInfosForCall (llvm::SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &paramInfos, const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
 
static llvm::SmallVector
< FunctionProtoType::ExtParameterInfo, 16 > 
getExtParameterInfosForCall (const FunctionProtoType *proto, unsigned prefixArgs, unsigned totalArgs)
 
static const CGFunctionInfoarrangeFreeFunctionLikeCall (CodeGenTypes &CGT, CodeGenModule &CGM, const CallArgList &args, const FunctionType *fnType, unsigned numExtraRequiredArgs, bool chainCall)
 Arrange a call as unto a free function, except possibly with an additional number of formal parameters considered required. More...
 
static std::unique_ptr
< TypeExpansion > 
getTypeExpansion (QualType Ty, const ASTContext &Context)
 
static int getExpansionSize (QualType Ty, const ASTContext &Context)
 
static void forConstantArrayExpansion (CodeGenFunction &CGF, ConstantArrayExpansion *CAE, Address BaseAddr, llvm::function_ref< void(Address)> Fn)
 
static Address CreateTempAllocaForCoercion (CodeGenFunction &CGF, llvm::Type *Ty, CharUnits MinAlign)
 Create a temporary allocation for the purposes of coercion. More...
 
static Address EnterStructPointerForCoercedAccess (Address SrcPtr, llvm::StructType *SrcSTy, uint64_t DstSize, CodeGenFunction &CGF)
 EnterStructPointerForCoercedAccess - Given a struct pointer that we are accessing some number of bytes out of it, try to gep into the struct to get at its inner goodness. More...
 
static llvm::ValueCoerceIntOrPtrToIntOrPtr (llvm::Value *Val, llvm::Type *Ty, CodeGenFunction &CGF)
 CoerceIntOrPtrToIntOrPtr - Convert a value Val to the specific Ty where both are either integers or pointers. More...
 
static llvm::ValueCreateCoercedLoad (Address Src, llvm::Type *Ty, CodeGenFunction &CGF)
 CreateCoercedLoad - Create a load from. More...
 
static void BuildAggStore (CodeGenFunction &CGF, llvm::Value *Val, Address Dest, bool DestIsVolatile)
 
static void CreateCoercedStore (llvm::Value *Src, Address Dst, bool DstIsVolatile, CodeGenFunction &CGF)
 CreateCoercedStore - Create a store to. More...
 
static Address emitAddressAtOffset (CodeGenFunction &CGF, Address addr, const ABIArgInfo &info)
 
static void AddAttributesFromFunctionProtoType (ASTContext &Ctx, llvm::AttrBuilder &FuncAttrs, const FunctionProtoType *FPT)
 
static llvm::ValueemitArgumentDemotion (CodeGenFunction &CGF, const VarDecl *var, llvm::Value *value)
 An argument came in as a promoted argument; demote it back to its declared type. More...
 
static const NonNullAttr * getNonNullAttr (const Decl *FD, const ParmVarDecl *PVD, QualType ArgType, unsigned ArgNo)
 Returns the attribute (either parameter attribute, or function attribute), which declares argument ArgNo to be non-null. More...
 
static void eraseUnusedBitCasts (llvm::Instruction *insn)
 
static llvm::ValuetryEmitFusedAutoreleaseOfResult (CodeGenFunction &CGF, llvm::Value *result)
 Try to emit a fused autorelease of a return result. More...
 
static llvm::ValuetryRemoveRetainOfSelf (CodeGenFunction &CGF, llvm::Value *result)
 If this is a +1 of the value of an immutable 'self', remove it. More...
 
static llvm::ValueemitAutoreleaseOfResult (CodeGenFunction &CGF, llvm::Value *result)
 Emit an ARC autorelease of the result of a function. More...
 
static llvm::StoreInst * findDominatingStoreToReturnValue (CodeGenFunction &CGF)
 Heuristically search for a dominating store to the return-value slot. More...
 
static bool isInAllocaArgument (CGCXXABI &ABI, QualType type)
 
static AggValueSlot createPlaceholderSlot (CodeGenFunction &CGF, QualType Ty)
 
static bool isProvablyNull (llvm::Value *addr)
 
static bool isProvablyNonNull (llvm::Value *addr)
 
static void emitWriteback (CodeGenFunction &CGF, const CallArgList::Writeback &writeback)
 Emit the actual writing-back of a writeback. More...
 
static void emitWritebacks (CodeGenFunction &CGF, const CallArgList &args)
 
static void deactivateArgCleanupsBeforeCall (CodeGenFunction &CGF, const CallArgList &CallArgs)
 
static const ExprmaybeGetUnaryAddrOfOperand (const Expr *E)
 
static void emitWritebackArg (CodeGenFunction &CGF, CallArgList &args, const ObjCIndirectCopyRestoreExpr *CRE)
 Emit an argument that's being passed call-by-writeback. More...
 
static void getBundlesForFunclet (llvm::Value *Callee, llvm::Instruction *CurrentFuncletPad, SmallVectorImpl< llvm::OperandBundleDef > &BundleList)
 
static void EmitInitStoreOfNonAggregate (CodeGenFunction &CGF, RValue Src, LValue Dst)
 Store a non-aggregate value to an address to initialize it. More...
 

Function Documentation

static void AddAttributesFromFunctionProtoType ( ASTContext Ctx,
llvm::AttrBuilder &  FuncAttrs,
const FunctionProtoType FPT 
)
static
static void addExtParameterInfosForCall ( llvm::SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &  paramInfos,
const FunctionProtoType proto,
unsigned  prefixArgs,
unsigned  totalArgs 
)
static
static void appendParameterTypes ( const CodeGenTypes CGT,
SmallVectorImpl< CanQualType > &  prefix,
SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &  paramInfos,
CanQual< FunctionProtoType FPT,
const FunctionDecl FD 
)
static

Adds the formal paramaters in FPT to the given prefix.

If any parameter in FPT has pass_object_size attrs, then we'll add parameters for those, too.

Definition at line 104 of file CGCall.cpp.

References E, clang::CodeGen::CodeGenTypes::getContext(), clang::FunctionDecl::getNumParams(), clang::FunctionDecl::getParamDecl(), clang::ASTContext::getSizeType(), and I.

Referenced by clang::CodeGen::CodeGenTypes::arrangeCXXStructorDeclaration(), and arrangeLLVMFunctionInfo().

static const CGFunctionInfo& arrangeFreeFunctionLikeCall ( CodeGenTypes CGT,
CodeGenModule CGM,
const CallArgList args,
const FunctionType fnType,
unsigned  numExtraRequiredArgs,
bool  chainCall 
)
static
static const CGFunctionInfo& arrangeLLVMFunctionInfo ( CodeGenTypes CGT,
bool  instanceMethod,
SmallVectorImpl< CanQualType > &  prefix,
CanQual< FunctionProtoType FTP,
const FunctionDecl FD 
)
static

Arrange the LLVM function layout for a value of the given function type, on top of any implicit parameters already stored.

Definition at line 140 of file CGCall.cpp.

References appendParameterTypes(), clang::CodeGen::CodeGenTypes::arrangeLLVMFunctionInfo(), clang::CodeGen::RequiredArgs::forPrototypePlus(), and clang::CanQual< T >::getUnqualifiedType().

Referenced by clang::CodeGen::CodeGenTypes::arrangeCXXMethodType(), and clang::CodeGen::CodeGenTypes::arrangeFreeFunctionType().

static void BuildAggStore ( CodeGenFunction CGF,
llvm::Value Val,
Address  Dest,
bool  DestIsVolatile 
)
static
static llvm::Value* CoerceIntOrPtrToIntOrPtr ( llvm::Value Val,
llvm::Type *  Ty,
CodeGenFunction CGF 
)
static

CoerceIntOrPtrToIntOrPtr - Convert a value Val to the specific Ty where both are either integers or pointers.

This does a truncation of the value if it is too large or a zero extension if it is too small.

This behaves as if the value were coerced through memory, so on big-endian targets the high bits are preserved in a truncation, while little-endian targets preserve the low bits.

Definition at line 1086 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CGBuilderTy::CreateBitCast(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::CodeGenTypeCache::IntPtrTy, and clang::CodeGen::Type.

Referenced by CreateCoercedLoad(), and CreateCoercedStore().

static llvm::Value* CreateCoercedLoad ( Address  Src,
llvm::Type *  Ty,
CodeGenFunction CGF 
)
static
static void CreateCoercedStore ( llvm::Value Src,
Address  Dst,
bool  DstIsVolatile,
CodeGenFunction CGF 
)
static
static AggValueSlot createPlaceholderSlot ( CodeGenFunction CGF,
QualType  Ty 
)
static
static Address CreateTempAllocaForCoercion ( CodeGenFunction CGF,
llvm::Type *  Ty,
CharUnits  MinAlign 
)
static
static void deactivateArgCleanupsBeforeCall ( CodeGenFunction CGF,
const CallArgList CallArgs 
)
static
static Address emitAddressAtOffset ( CodeGenFunction CGF,
Address  addr,
const ABIArgInfo info 
)
static
static llvm::Value* emitArgumentDemotion ( CodeGenFunction CGF,
const VarDecl var,
llvm::Value value 
)
static

An argument came in as a promoted argument; demote it back to its declared type.

Definition at line 2014 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::ConvertType(), clang::ValueDecl::getType(), and clang::CodeGen::Type.

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

static llvm::Value* emitAutoreleaseOfResult ( CodeGenFunction CGF,
llvm::Value result 
)
static

Emit an ARC autorelease of the result of a function.

Returns
the value to actually return from the function

Definition at line 2584 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::EmitARCAutoreleaseReturnValue(), clang::CodeGen::CodeGenFunction::shouldUseFusedARCCalls(), tryEmitFusedAutoreleaseOfResult(), and tryRemoveRetainOfSelf().

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

static void EmitInitStoreOfNonAggregate ( CodeGenFunction CGF,
RValue  Src,
LValue  Dst 
)
static

Store a non-aggregate value to an address to initialize it.

For initialization, a non-atomic store will be used.

Definition at line 3494 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::EmitStoreOfComplex(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::CodeGen::RValue::getComplexVal(), clang::CodeGen::RValue::getScalarVal(), and clang::CodeGen::RValue::isScalar().

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

static void emitWriteback ( CodeGenFunction CGF,
const CallArgList::Writeback writeback 
)
static
static void emitWritebackArg ( CodeGenFunction CGF,
CallArgList args,
const ObjCIndirectCopyRestoreExpr CRE 
)
static

Emit an argument that's being passed call-by-writeback.

That is, we are passing the address of an __autoreleased temporary; it might be copy-initialized with the current value of the given address, but it will definitely be copied out of after the call.

Definition at line 3005 of file CGCall.cpp.

References clang::CodeGen::CallArgList::add(), clang::CodeGen::CallArgList::addWriteback(), clang::CodeGen::CodeGenFunction::ConditionalEvaluation::begin(), clang::CodeGen::CodeGenFunction::Builder, clang::Type::castAs(), clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertType(), clang::CodeGen::CodeGenFunction::createBasicBlock(), clang::CodeGen::CGBuilderTy::CreateBitCast(), clang::CodeGen::CGBuilderTy::CreateStore(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), clang::CodeGen::CodeGenFunction::EmitBlock(), clang::CodeGen::CodeGenFunction::EmitLoadOfLValue(), clang::CodeGen::CodeGenFunction::EmitLValue(), clang::CodeGen::CodeGenFunction::EmitPointerWithAlignment(), clang::CodeGen::CodeGenFunction::ConditionalEvaluation::end(), clang::CodeGen::RValue::get(), clang::CodeGen::LValue::getAddress(), clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::LValue::getObjCLifetime(), clang::CodeGen::Address::getPointer(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CodeGen::RValue::getScalarVal(), clang::ObjCIndirectCopyRestoreExpr::getSubExpr(), clang::Expr::getType(), isProvablyNonNull(), isProvablyNull(), clang::CodeGen::RValue::isScalar(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), maybeGetUnaryAddrOfOperand(), clang::Qualifiers::OCL_Strong, and clang::ObjCIndirectCopyRestoreExpr::shouldCopy().

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

static void emitWritebacks ( CodeGenFunction CGF,
const CallArgList args 
)
static
static Address EnterStructPointerForCoercedAccess ( Address  SrcPtr,
llvm::StructType *  SrcSTy,
uint64_t  DstSize,
CodeGenFunction CGF 
)
static

EnterStructPointerForCoercedAccess - Given a struct pointer that we are accessing some number of bytes out of it, try to gep into the struct to get at its inner goodness.

Dive as deep as possible without entering an element with an in-memory size smaller than DstSize.

Definition at line 1050 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CGBuilderTy::CreateStructGEP(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::Address::getElementType(), and clang::CodeGen::Type.

Referenced by CreateCoercedLoad(), and CreateCoercedStore().

static void eraseUnusedBitCasts ( llvm::Instruction *  insn)
static

Definition at line 2444 of file CGCall.cpp.

Referenced by tryRemoveRetainOfSelf().

static llvm::StoreInst* findDominatingStoreToReturnValue ( CodeGenFunction CGF)
static

Heuristically search for a dominating store to the return-value slot.

Definition at line 2602 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::Address::getPointer(), I, and clang::CodeGen::CodeGenFunction::ReturnValue.

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

static void forConstantArrayExpansion ( CodeGenFunction CGF,
ConstantArrayExpansion *  CAE,
Address  BaseAddr,
llvm::function_ref< void(Address)>  Fn 
)
static
static SmallVector<CanQualType, 16> getArgTypesForCall ( ASTContext ctx,
const CallArgList args 
)
static
static SmallVector<CanQualType, 16> getArgTypesForDeclaration ( ASTContext ctx,
const FunctionArgList args 
)
static
static void getBundlesForFunclet ( llvm::Value Callee,
llvm::Instruction *  CurrentFuncletPad,
SmallVectorImpl< llvm::OperandBundleDef > &  BundleList 
)
static
static CallingConv getCallingConventionForDecl ( const Decl D,
bool  IsWindows 
)
static
static int getExpansionSize ( QualType  Ty,
const ASTContext Context 
)
static

Definition at line 889 of file CGCall.cpp.

References Context, and getTypeExpansion().

static llvm::SmallVector<FunctionProtoType::ExtParameterInfo, 16> getExtParameterInfosForCall ( const FunctionProtoType proto,
unsigned  prefixArgs,
unsigned  totalArgs 
)
static
static CanQual<FunctionProtoType> GetFormalType ( const CXXMethodDecl MD)
static
static const NonNullAttr* getNonNullAttr ( const Decl FD,
const ParmVarDecl PVD,
QualType  ArgType,
unsigned  ArgNo 
)
static

Returns the attribute (either parameter attribute, or function attribute), which declares argument ArgNo to be non-null.

Definition at line 2034 of file CGCall.cpp.

References clang::Type::isAnyPointerType(), and clang::Type::isBlockPointerType().

Referenced by clang::CodeGen::CodeGenFunction::EmitFunctionProlog(), and clang::CodeGen::CodeGenFunction::EmitNonNullArgCheck().

static CanQualType GetReturnType ( QualType  RetTy)
static

Returns the "extra-canonicalized" return type, which discards qualifiers on the return type.

Codegen doesn't care about them, and it makes ABI code a little easier to be able to assume that all parameter and return types are top-level unqualified.

Definition at line 86 of file CGCall.cpp.

References clang::Type::getCanonicalTypeUnqualified(), and clang::CanQual< T >::getUnqualifiedType().

Referenced by clang::CodeGen::CodeGenTypes::arrangeBlockFunctionDeclaration(), clang::CodeGen::CodeGenTypes::arrangeBuiltinFunctionCall(), clang::CodeGen::CodeGenTypes::arrangeBuiltinFunctionDeclaration(), clang::CodeGen::CodeGenTypes::arrangeCXXMethodCall(), arrangeFreeFunctionLikeCall(), clang::CodeGen::CodeGenTypes::arrangeObjCMessageSendSignature(), and clang::CodeGen::CodeGenTypes::arrangeUnprototypedObjCMessageSend().

static CanQualType GetThisType ( ASTContext Context,
const CXXRecordDecl RD 
)
static
static std::unique_ptr<TypeExpansion> getTypeExpansion ( QualType  Ty,
const ASTContext Context 
)
static
static bool isInAllocaArgument ( CGCXXABI ABI,
QualType  type 
)
static
static bool isProvablyNonNull ( llvm::Value addr)
static

Definition at line 2906 of file CGCall.cpp.

Referenced by emitWriteback(), and emitWritebackArg().

static bool isProvablyNull ( llvm::Value addr)
static

Definition at line 2902 of file CGCall.cpp.

Referenced by emitWriteback(), and emitWritebackArg().

static const Expr* maybeGetUnaryAddrOfOperand ( const Expr E)
static

Definition at line 2994 of file CGCall.cpp.

References clang::Expr::IgnoreParens().

Referenced by emitWritebackArg().

static llvm::Value* tryEmitFusedAutoreleaseOfResult ( CodeGenFunction CGF,
llvm::Value result 
)
static
static llvm::Value* tryRemoveRetainOfSelf ( CodeGenFunction CGF,
llvm::Value result 
)
static