clang  3.7.0
Macros | Enumerations | Functions
CodeGen/ItaniumCXXABI.cpp File Reference
#include "CGCXXABI.h"
#include "CGCleanup.h"
#include "CGRecordLayout.h"
#include "CGVTables.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "TargetInfo.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/Type.h"
#include "clang/AST/StmtCXX.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Value.h"
#include "clang/AST/BuiltinTypes.def"
#include "clang/AST/TypeNodes.def"
Include dependency graph for CodeGen/ItaniumCXXABI.cpp:

Go to the source code of this file.

Macros

#define BUILTIN_TYPE(Id, SingletonId)
 
#define PLACEHOLDER_TYPE(Id, SingletonId)   case BuiltinType::Id:
 
#define TYPE(Class, Base)
 
#define ABSTRACT_TYPE(Class, Base)
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_TYPE(Class, Base)   case Type::Class:
 
#define DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define TYPE(Class, Base)
 
#define ABSTRACT_TYPE(Class, Base)
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_TYPE(Class, Base)   case Type::Class:
 
#define DEPENDENT_TYPE(Class, Base)   case Type::Class:
 

Enumerations

enum  StructorCodegen
 

Functions

static llvm::Constant * getAllocateExceptionFn (CodeGenModule &CGM)
 
static llvm::Constant * getThrowFn (CodeGenModule &CGM)
 
static llvm::Constant * getItaniumDynamicCastFn (CodeGenFunction &CGF)
 
static llvm::Constant * getBadCastFn (CodeGenFunction &CGF)
 
static CharUnits computeOffsetHint (ASTContext &Context, const CXXRecordDecl *Src, const CXXRecordDecl *Dst)
 Compute the src2dst_offset hint as described in the Itanium C++ ABI [2.9.7]. More...
 
static llvm::Constant * getBadTypeidFn (CodeGenFunction &CGF)
 
static llvm::ValueperformTypeAdjustment (CodeGenFunction &CGF, llvm::Value *Ptr, int64_t NonVirtualAdjustment, int64_t VirtualAdjustment, bool IsReturnAdjustment)
 
static llvm::Constant * getGuardAcquireFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
 
static llvm::Constant * getGuardReleaseFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
 
static llvm::Constant * getGuardAbortFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
 
static void emitGlobalDtorWithCXAAtExit (CodeGenFunction &CGF, llvm::Constant *dtor, llvm::Constant *addr, bool TLS)
 Register a global destructor using __cxa_atexit. More...
 
static bool isThreadWrapperReplaceable (const VarDecl *VD, CodeGen::CodeGenModule &CGM)
 
static
llvm::GlobalValue::LinkageTypes 
getThreadLocalWrapperLinkage (const VarDecl *VD, CodeGen::CodeGenModule &CGM)
 
static bool TypeInfoIsInStandardLibrary (const BuiltinType *Ty)
 
static bool TypeInfoIsInStandardLibrary (const PointerType *PointerTy)
 
static bool IsStandardLibraryRTTIDescriptor (QualType Ty)
 
static bool ShouldUseExternalRTTIDescriptor (CodeGenModule &CGM, QualType Ty)
 
static bool IsIncompleteClassType (const RecordType *RecordTy)
 IsIncompleteClassType - Returns whether the given record type is incomplete. More...
 
static bool ContainsIncompleteClassType (QualType Ty)
 
static bool CanUseSingleInheritance (const CXXRecordDecl *RD)
 
static
llvm::GlobalVariable::LinkageTypes 
getTypeInfoLinkage (CodeGenModule &CGM, QualType Ty)
 Return the linkage that the type info and type info name constants should have for the given type. More...
 
static unsigned ComputeQualifierFlags (Qualifiers Quals)
 
static unsigned ComputeVMIClassTypeInfoFlags (const CXXBaseSpecifier *Base, SeenBases &Bases)
 
static unsigned ComputeVMIClassTypeInfoFlags (const CXXRecordDecl *RD)
 
static StructorCodegen getCodegenToUse (CodeGenModule &CGM, const CXXMethodDecl *MD)
 
static void emitConstructorDestructorAlias (CodeGenModule &CGM, GlobalDecl AliasDecl, GlobalDecl TargetDecl)
 
static llvm::Constant * getBeginCatchFn (CodeGenModule &CGM)
 
static llvm::Constant * getEndCatchFn (CodeGenModule &CGM)
 
static llvm::Constant * getGetExceptionPtrFn (CodeGenModule &CGM)
 
static llvm::ValueCallBeginCatch (CodeGenFunction &CGF, llvm::Value *Exn, bool EndMightThrow)
 
static void InitCatchParam (CodeGenFunction &CGF, const VarDecl &CatchParam, llvm::Value *ParamAddr, SourceLocation Loc)
 
static llvm::Constant * getClangCallTerminateFn (CodeGenModule &CGM)
 

Macro Definition Documentation

#define ABSTRACT_TYPE (   Class,
  Base 
)
#define ABSTRACT_TYPE (   Class,
  Base 
)
#define BUILTIN_TYPE (   Id,
  SingletonId 
)
#define DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:
#define DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:
#define NON_CANONICAL_TYPE (   Class,
  Base 
)    case Type::Class:
#define NON_CANONICAL_TYPE (   Class,
  Base 
)    case Type::Class:
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:
#define PLACEHOLDER_TYPE (   Id,
  SingletonId 
)    case BuiltinType::Id:
#define TYPE (   Class,
  Base 
)
#define TYPE (   Class,
  Base 
)

Enumeration Type Documentation

enum StructorCodegen
strong

Definition at line 3186 of file CodeGen/ItaniumCXXABI.cpp.

Function Documentation

static llvm::Value* CallBeginCatch ( CodeGenFunction CGF,
llvm::Value Exn,
bool  EndMightThrow 
)
static

Emits a call to __cxa_begin_catch and enters a cleanup to call __cxa_end_catch.

Parameters
EndMightThrow- true if __cxa_end_catch might throw

Definition at line 3367 of file CodeGen/ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitNounwindRuntimeCall(), getBeginCatchFn(), and clang::CodeGen::NormalAndEHCleanup.

Referenced by InitCatchParam().

static bool CanUseSingleInheritance ( const CXXRecordDecl RD)
static
static CharUnits computeOffsetHint ( ASTContext Context,
const CXXRecordDecl Src,
const CXXRecordDecl Dst 
)
static
static unsigned ComputeQualifierFlags ( Qualifiers  Quals)
static

ComputeQualifierFlags - Compute the pointer type info flags from the given qualifier.

Definition at line 2866 of file CodeGen/ItaniumCXXABI.cpp.

References clang::Qualifiers::hasConst(), clang::Qualifiers::hasRestrict(), and clang::Qualifiers::hasVolatile().

static unsigned ComputeVMIClassTypeInfoFlags ( const CXXBaseSpecifier Base,
SeenBases &  Bases 
)
static

ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in abi::__vmi_class_type_info.

Definition at line 2927 of file CodeGen/ItaniumCXXABI.cpp.

References clang::CXXRecordDecl::bases(), clang::Type::getAs(), clang::CXXBaseSpecifier::getType(), and clang::CXXBaseSpecifier::isVirtual().

Referenced by ComputeVMIClassTypeInfoFlags().

static unsigned ComputeVMIClassTypeInfoFlags ( const CXXRecordDecl RD)
static
static bool ContainsIncompleteClassType ( QualType  Ty)
static

ContainsIncompleteClassType - Returns whether the given type contains an incomplete class type. This is true if

  • The given type is an incomplete class type.
  • The given type is a pointer type whose pointee type contains an incomplete class type.
  • The given type is a member pointer type whose class is an incomplete class type.
  • The given type is a member pointer type whoise pointee type contains an incomplete class type. is an indirect or direct pointer to an incomplete class type.

Definition at line 2452 of file CodeGen/ItaniumCXXABI.cpp.

References IsIncompleteClassType().

Referenced by getTypeInfoLinkage().

static void emitConstructorDestructorAlias ( CodeGenModule CGM,
GlobalDecl  AliasDecl,
GlobalDecl  TargetDecl 
)
static
static void emitGlobalDtorWithCXAAtExit ( CodeGenFunction CGF,
llvm::Constant *  dtor,
llvm::Constant *  addr,
bool  TLS 
)
static
static llvm::Constant* getAllocateExceptionFn ( CodeGenModule CGM)
static
static llvm::Constant* getBadCastFn ( CodeGenFunction CGF)
static
static llvm::Constant* getBadTypeidFn ( CodeGenFunction CGF)
static
static llvm::Constant* getBeginCatchFn ( CodeGenModule CGM)
static
static llvm::Constant* getClangCallTerminateFn ( CodeGenModule CGM)
static
static StructorCodegen getCodegenToUse ( CodeGenModule CGM,
const CXXMethodDecl MD 
)
static
static llvm::Constant* getEndCatchFn ( CodeGenModule CGM)
static
static llvm::Constant* getGetExceptionPtrFn ( CodeGenModule CGM)
static
static llvm::Constant* getGuardAbortFn ( CodeGenModule CGM,
llvm::PointerType *  GuardPtrTy 
)
static
static llvm::Constant* getGuardAcquireFn ( CodeGenModule CGM,
llvm::PointerType *  GuardPtrTy 
)
static
static llvm::Constant* getGuardReleaseFn ( CodeGenModule CGM,
llvm::PointerType *  GuardPtrTy 
)
static
static llvm::Constant* getItaniumDynamicCastFn ( CodeGenFunction CGF)
static
static llvm::GlobalValue::LinkageTypes getThreadLocalWrapperLinkage ( const VarDecl VD,
CodeGen::CodeGenModule CGM 
)
static

Get the appropriate linkage for the wrapper function. This is essentially the weak form of the variable's linkage; every translation unit which needs the wrapper emits a copy, and we want the linker to merge them.

Definition at line 1983 of file CodeGen/ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenModule::getLLVMLinkageVarDefinition(), and isThreadWrapperReplaceable().

static llvm::Constant* getThrowFn ( CodeGenModule CGM)
static
static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage ( CodeGenModule CGM,
QualType  Ty 
)
static
static void InitCatchParam ( CodeGenFunction CGF,
const VarDecl CatchParam,
llvm::Value ParamAddr,
SourceLocation  Loc 
)
static

A "special initializer" callback for initializing a catch parameter during catch initialization.

Definition at line 3380 of file CodeGen/ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenFunction::Builder, CallBeginCatch(), clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertTypeForMem(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), clang::CodeGen::AggValueSlot::DoesNotNeedGCBarriers, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitAggregateCopy(), clang::CodeGen::CodeGenFunction::EmitARCInitWeak(), clang::CodeGen::CodeGenFunction::EmitARCRetainNonBlock(), clang::CodeGen::CodeGenFunction::EmitLoadOfComplex(), clang::CodeGen::CodeGenFunction::EmitLoadOfScalar(), clang::CodeGen::CodeGenFunction::EmitNounwindRuntimeCall(), clang::CodeGen::CodeGenFunction::EmitStoreOfComplex(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::OpaqueValueExpr::findInCopyConstruct(), clang::CodeGen::AggValueSlot::forAddr(), clang::ASTContext::getCanonicalType(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenFunction::getContext(), clang::ASTContext::getDeclAlign(), getElementType(), clang::CodeGen::CodeGenFunction::getEvaluationKind(), clang::CodeGen::CodeGenFunction::getExceptionFromSlot(), getGetExceptionPtrFn(), clang::VarDecl::getInit(), clang::Qualifiers::getObjCLifetime(), clang::Type::getPointeeType(), clang::CanQual< T >::getQualifiers(), clang::TargetCodeGenInfo::getSizeOfUnwindException(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::ValueDecl::getType(), clang::CodeGen::AggValueSlot::IsNotAliased, clang::CodeGen::AggValueSlot::IsNotDestructed, clang::Type::isRecordType(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::CodeGenFunction::MakeNaturalAlignAddrLValue(), clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, clang::CodeGen::CodeGenFunction::OpaqueValueMapping::pop(), clang::CodeGen::EHScopeStack::popTerminate(), clang::CodeGen::EHScopeStack::pushTerminate(), clang::CodeGen::TEK_Aggregate, clang::CodeGen::TEK_Complex, and clang::CodeGen::TEK_Scalar.

static bool IsIncompleteClassType ( const RecordType RecordTy)
static

IsIncompleteClassType - Returns whether the given record type is incomplete.

Definition at line 2437 of file CodeGen/ItaniumCXXABI.cpp.

References clang::RecordType::getDecl(), and clang::TagDecl::isCompleteDefinition().

Referenced by ContainsIncompleteClassType().

static bool IsStandardLibraryRTTIDescriptor ( QualType  Ty)
static

IsStandardLibraryRTTIDescriptor - Returns whether the type information for the given type exists in the standard library.

Definition at line 2388 of file CodeGen/ItaniumCXXABI.cpp.

References TypeInfoIsInStandardLibrary().

static bool isThreadWrapperReplaceable ( const VarDecl VD,
CodeGen::CodeGenModule CGM 
)
static
static llvm::Value* performTypeAdjustment ( CodeGenFunction CGF,
llvm::Value Ptr,
int64_t  NonVirtualAdjustment,
int64_t  VirtualAdjustment,
bool  IsReturnAdjustment 
)
static
static bool ShouldUseExternalRTTIDescriptor ( CodeGenModule CGM,
QualType  Ty 
)
static

ShouldUseExternalRTTIDescriptor - Returns whether the type information for the given type exists somewhere else, and that we should not emit the type information in this translation unit. Assumes that it is not a standard-library type.

Definition at line 2405 of file CodeGen/ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenModule::getContext(), clang::ASTContext::getLangOpts(), clang::CodeGen::CodeGenModule::getVTables(), clang::Decl::hasAttr(), clang::CXXRecordDecl::hasDefinition(), clang::CXXRecordDecl::isDynamicClass(), and clang::CodeGen::CodeGenVTables::isVTableExternal().

static bool TypeInfoIsInStandardLibrary ( const BuiltinType Ty)
static

TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type info for that type is defined in the standard library.

Definition at line 2308 of file CodeGen/ItaniumCXXABI.cpp.

References clang::BuiltinType::getKind().

Referenced by IsStandardLibraryRTTIDescriptor(), and TypeInfoIsInStandardLibrary().

static bool TypeInfoIsInStandardLibrary ( const PointerType PointerTy)
static