clang  3.7.0
Classes | Functions
CGCall.cpp File Reference
#include "CGCall.h"
#include "ABIInfo.h"
#include "CGCXXABI.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/TargetInfo.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/IR/Attributes.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.

Classes

struct  DisableDebugLocationUpdates
 

Functions

static unsigned ClangCallConvToLLVMCallConv (CallingConv CC)
 
static CanQualType GetThisType (ASTContext &Context, const CXXRecordDecl *RD)
 
static CanQual< FunctionProtoTypeGetFormalType (const CXXMethodDecl *MD)
 Returns the canonical formal type of the given C++ method. More...
 
static CanQualType GetReturnType (QualType RetTy)
 
static const CGFunctionInfoarrangeLLVMFunctionInfo (CodeGenTypes &CGT, bool instanceMethod, SmallVectorImpl< CanQualType > &prefix, CanQual< FunctionProtoType > FTP)
 
static CallingConv getCallingConventionForDecl (const Decl *D, bool IsWindows)
 
static const CGFunctionInfoarrangeFreeFunctionLikeCall (CodeGenTypes &CGT, CodeGenModule &CGM, const CallArgList &args, const FunctionType *fnType, unsigned numExtraRequiredArgs, bool chainCall)
 
static std::unique_ptr
< TypeExpansion > 
getTypeExpansion (QualType Ty, const ASTContext &Context)
 
static int getExpansionSize (QualType Ty, const ASTContext &Context)
 
static llvm::ValueEnterStructPointerForCoercedAccess (llvm::Value *SrcPtr, llvm::StructType *SrcSTy, uint64_t DstSize, CodeGenFunction &CGF)
 
static llvm::ValueCoerceIntOrPtrToIntOrPtr (llvm::Value *Val, llvm::Type *Ty, CodeGenFunction &CGF)
 
static llvm::ValueCreateCoercedLoad (llvm::Value *SrcPtr, llvm::Type *Ty, CharUnits SrcAlign, CodeGenFunction &CGF)
 
static void BuildAggStore (CodeGenFunction &CGF, llvm::Value *Val, llvm::Value *DestPtr, bool DestIsVolatile, CharUnits DestAlign)
 
static void CreateCoercedStore (llvm::Value *Src, llvm::Value *DstPtr, bool DstIsVolatile, CharUnits DstAlign, CodeGenFunction &CGF)
 
static llvm::ValueemitArgumentDemotion (CodeGenFunction &CGF, const VarDecl *var, llvm::Value *value)
 
static const NonNullAttr * getNonNullAttr (const Decl *FD, const ParmVarDecl *PVD, QualType ArgType, unsigned ArgNo)
 
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)
 
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)
 
static void EmitInitStoreOfNonAggregate (CodeGenFunction &CGF, RValue Src, LValue Dst)
 Store a non-aggregate value to an address to initialize it. For initialization, a non-atomic store will be used. More...
 

Function Documentation

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 
)
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 97 of file CGCall.cpp.

References 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,
llvm::Value DestPtr,
bool  DestIsVolatile,
CharUnits  DestAlign 
)
static
static unsigned ClangCallConvToLLVMCallConv ( CallingConv  CC)
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 867 of file CGCall.cpp.

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

Referenced by CreateCoercedLoad(), and CreateCoercedStore().

static llvm::Value* CreateCoercedLoad ( llvm::Value SrcPtr,
llvm::Type *  Ty,
CharUnits  SrcAlign,
CodeGenFunction CGF 
)
static

CreateCoercedLoad - Create a load from

  • SrcPtr interpreted as a pointer to an object of type
  • Ty, known to be aligned to
  • SrcAlign bytes.

This safely handles the case when the src type is smaller than the destination type; in this situation the values of bits which not present in the src are undefined.

Definition at line 921 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, CoerceIntOrPtrToIntOrPtr(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), EnterStructPointerForCoercedAccess(), clang::CodeGen::CodeGenModule::getDataLayout(), getElementType(), clang::CharUnits::getQuantity(), and clang::CodeGen::CodeGenTypeCache::IntPtrTy.

Referenced by clang::CodeGen::CodeGenFunction::EmitCall(), and clang::CodeGen::CodeGenFunction::EmitFunctionEpilog().

static void CreateCoercedStore ( llvm::Value Src,
llvm::Value DstPtr,
bool  DstIsVolatile,
CharUnits  DstAlign,
CodeGenFunction CGF 
)
static

CreateCoercedStore - Create a store to

  • DstPtr from
  • Src, where the source and destination may have different types. The destination is known to be aligned to
  • DstAlign bytes.

This safely handles the case when the src type is larger than the destination type; the upper bits of the src will be lost.

Definition at line 1009 of file CGCall.cpp.

References BuildAggStore(), clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, CoerceIntOrPtrToIntOrPtr(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), EnterStructPointerForCoercedAccess(), clang::CodeGen::CodeGenModule::getDataLayout(), getElementType(), clang::CharUnits::getQuantity(), and clang::CodeGen::CodeGenTypeCache::IntPtrTy.

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

static AggValueSlot createPlaceholderSlot ( CodeGenFunction CGF,
QualType  Ty 
)
static
static void deactivateArgCleanupsBeforeCall ( CodeGenFunction CGF,
const CallArgList CallArgs 
)
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 1716 of file CGCall.cpp.

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

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 2257 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 3093 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
static void emitWritebacks ( CodeGenFunction CGF,
const CallArgList args 
)
static
static llvm::Value* EnterStructPointerForCoercedAccess ( llvm::Value 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 830 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::getDataLayout(), and getElementType().

Referenced by CreateCoercedLoad(), and CreateCoercedStore().

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

Definition at line 2117 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 2275 of file CGCall.cpp.

References clang::CodeGen::CodeGenFunction::Builder, and clang::CodeGen::CodeGenFunction::ReturnValue.

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

static CallingConv getCallingConventionForDecl ( const Decl D,
bool  IsWindows 
)
static
static int getExpansionSize ( QualType  Ty,
const ASTContext Context 
)
static

Definition at line 687 of file CGCall.cpp.

References getTypeExpansion().

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 1736 of file CGCall.cpp.

References clang::Decl::getAttr(), clang::Type::isAnyPointerType(), clang::Type::isBlockPointerType(), and clang::Decl::specific_attrs().

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 78 of file CGCall.cpp.

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

Referenced by clang::CodeGen::CodeGenTypes::arrangeCXXMethodCall(), clang::CodeGen::CodeGenTypes::arrangeFreeFunctionCall(), clang::CodeGen::CodeGenTypes::arrangeFreeFunctionDeclaration(), arrangeFreeFunctionLikeCall(), and clang::CodeGen::CodeGenTypes::arrangeObjCMessageSendSignature().

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 2532 of file CGCall.cpp.

Referenced by emitWriteback(), and emitWritebackArg().

static bool isProvablyNull ( llvm::Value addr)
static

Definition at line 2528 of file CGCall.cpp.

Referenced by emitWriteback(), and emitWritebackArg().

static const Expr* maybeGetUnaryAddrOfOperand ( const Expr E)
static

Definition at line 2621 of file CGCall.cpp.

References clang::Expr::IgnoreParens(), and clang::UO_AddrOf.

Referenced by emitWritebackArg().

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