17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- CGCXXRTTI.cpp - Emit LLVM Code for C++ RTTI descriptors ----------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This contains code dealing with C++ code generation of RTTI descriptors. 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CodeGenModule.h" 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGCXXABI.h" 167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "CGObjCRuntime.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/RecordLayout.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Type.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Frontend/CodeGenOptions.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace CodeGen; 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass RTTIBuilder { 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CodeGenModule &CGM; // Per-module state. 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::LLVMContext &VMContext; 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// Fields - The fields of the RTTI descriptor currently being built. 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<llvm::Constant *, 16> Fields; 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// GetAddrOfTypeName - Returns the mangled type name of the given type. 337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable * 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage); 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI 377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// descriptor of the given type. 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty); 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildVTablePointer - Build the vtable pointer for the given type. 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildVTablePointer(const Type *Ty); 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b. 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildSIClassTypeInfo(const CXXRecordDecl *RD); 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// classes with bases that do not satisfy the abi::__si_class_type_info 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildVMIClassTypeInfo(const CXXRecordDecl *RD); 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// for pointer types. 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildPointerTypeInfo(QualType PointeeTy); 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildObjCObjectTypeInfo - Build the appropriate kind of 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// type_info for an object type. 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty); 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// struct, used for member pointer types. 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty); 637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(CodeGenModule &CGM) : CGM(CGM), 667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VMContext(CGM.getModule().getContext()) { } 677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pointer type info flags. 697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei enum { 707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// PTI_Const - Type has const qualifier. 717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PTI_Const = 0x1, 727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// PTI_Volatile - Type has volatile qualifier. 747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PTI_Volatile = 0x2, 757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// PTI_Restrict - Type has restrict qualifier. 777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PTI_Restrict = 0x4, 787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// PTI_Incomplete - Type is incomplete. 807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PTI_Incomplete = 0x8, 817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// PTI_ContainingClassIncomplete - Containing class is incomplete. 837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// (in pointer to member). 847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PTI_ContainingClassIncomplete = 0x10 857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // VMI type info flags. 887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei enum { 897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance. 907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VMI_NonDiamondRepeat = 0x1, 917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// VMI_DiamondShaped - Class is diamond shaped. 937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VMI_DiamondShaped = 0x2 947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Base class type info flags. 977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei enum { 987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BCTI_Virtual - Base class is virtual. 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BCTI_Virtual = 0x1, 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BCTI_Public - Base class is public. 1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BCTI_Public = 0x2 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// BuildTypeInfo - Build the RTTI type info struct for the given type. 1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// 1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \param Force - true to force the creation of this RTTI value 1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *BuildTypeInfo(QualType Ty, bool Force = false); 1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::GlobalVariable * 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiRTTIBuilder::GetAddrOfTypeName(QualType Ty, 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable::LinkageTypes Linkage) { 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> OutName; 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream Out(OutName); 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out); 1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out.flush(); 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = OutName.str(); 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We know that the mangled name of the type starts at index 4 of the 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mangled name of the typename, so we can just index into it in order to 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // get the mangled name of the type. 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext, 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name.substr(4)); 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable *GV = 1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.CreateOrReplaceCXXRuntimeVariable(Name, Init->getType(), Linkage); 1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GV->setInitializer(Init); 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GV; 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::Constant *RTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) { 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the RTTI name. 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> OutName; 1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream Out(OutName); 1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out.flush(); 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = OutName.str(); 1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Look for an existing global. 1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name); 1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!GV) { 1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Create a new global variable. 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy, 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*Constant=*/true, 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalValue::ExternalLinkage, 0, Name); 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// info for that type is defined in the standard library. 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.2: 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Basic type information (e.g. for "int", "bool", etc.) will be kept in 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the run-time support library. Specifically, the run-time support 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // library should contain type_info objects for the types X, X* and 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char, 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unsigned char, signed char, short, unsigned short, int, unsigned int, 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // long, unsigned long, long long, unsigned long long, float, double, 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // long double, char16_t, char32_t, and the IEEE 754r decimal and 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // half-precision floating point types. 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getKind()) { 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_S: 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: 1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: 1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: 194b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: 195b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: 196b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: 197b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: 198b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: 199b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: 20021f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: 201e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: 2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("asking for RRTI for a placeholder type!"); 2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: 2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("FIXME: Objective-C types are unsupported!"); 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid BuiltinType Kind!"); 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) { 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy = PointerTy->getPointeeType(); 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy); 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!BuiltinTy) 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check the qualifiers. 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Quals = PointeeTy.getQualifiers(); 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Quals.removeConst(); 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Quals.empty()) 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypeInfoIsInStandardLibrary(BuiltinTy); 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// IsStandardLibraryRTTIDescriptor - Returns whether the type 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// information for the given type exists in the standard library. 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool IsStandardLibraryRTTIDescriptor(QualType Ty) { 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Type info for builtin types is defined in the standard library. 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty)) 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypeInfoIsInStandardLibrary(BuiltinTy); 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Type info for some pointer types to builtin types is defined in the 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // standard library. 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypeInfoIsInStandardLibrary(PointerTy); 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ShouldUseExternalRTTIDescriptor - Returns whether the type information for 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the given type exists somewhere else, and that we should not emit the type 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// information in this translation unit. Assumes that it is not a 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// standard-library type. 255d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCallstatic bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM, 256d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall QualType Ty) { 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &Context = CGM.getContext(); 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 259d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall // If RTTI is disabled, assume it might be disabled in the 260d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall // translation unit that defines any potential key function, too. 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.getLangOpts().RTTI) return false; 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl()); 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->hasDefinition()) 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->isDynamicClass()) 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 271d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall // FIXME: this may need to be reconsidered if the key function 272d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall // changes. 273d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall return CGM.getVTables().isVTableExternal(RD); 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// IsIncompleteClassType - Returns whether the given record type is incomplete. 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool IsIncompleteClassType(const RecordType *RecordTy) { 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return !RecordTy->getDecl()->isCompleteDefinition(); 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ContainsIncompleteClassType - Returns whether the given type contains an 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// incomplete class type. This is true if 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// * The given type is an incomplete class type. 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// * The given type is a pointer type whose pointee type contains an 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// incomplete class type. 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// * The given type is a member pointer type whose class is an incomplete 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// class type. 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// * The given type is a member pointer type whoise pointee type contains an 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// incomplete class type. 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// is an indirect or direct pointer to an incomplete class type. 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool ContainsIncompleteClassType(QualType Ty) { 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsIncompleteClassType(RecordTy)) 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty)) 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ContainsIncompleteClassType(PointerTy->getPointeeType()); 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const MemberPointerType *MemberPointerTy = 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<MemberPointerType>(Ty)) { 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if the class type is incomplete. 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass()); 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsIncompleteClassType(ClassType)) 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ContainsIncompleteClassType(MemberPointerTy->getPointeeType()); 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// getTypeInfoLinkage - Return the linkage that the type info and type info 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name constants should have for the given type. 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic llvm::GlobalVariable::LinkageTypes 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeigetTypeInfoLinkage(CodeGenModule &CGM, QualType Ty) { 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // In addition, it and all of the intermediate abi::__pointer_type_info 3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // structs in the chain down to the abi::__class_type_info for the 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // incomplete class type must be prevented from resolving to the 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // corresponding type_info structs for the complete class type, possibly 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // by making them local static objects. Finally, a dummy class RTTI is 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // generated for the incomplete type that will not resolve to the final 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // complete class RTTI (because the latter need not exist), possibly by 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // making it a local static object. 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ContainsIncompleteClassType(Ty)) 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::GlobalValue::InternalLinkage; 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getLinkage()) { 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NoLinkage: 335a99ecbcc4c431d52df0b01539035ab5281d54656Rafael Espindola case VisibleNoLinkage: 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case InternalLinkage: 3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UniqueExternalLinkage: 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::GlobalValue::InternalLinkage; 3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ExternalLinkage: 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CGM.getLangOpts().RTTI) { 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // RTTI is not enabled, which means that this type info struct is going 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // to be used for exception handling. Give it linkonce_odr linkage. 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::GlobalValue::LinkOnceODRLinkage; 3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *Record = dyn_cast<RecordType>(Ty)) { 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); 3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->hasAttr<WeakAttr>()) 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::GlobalValue::WeakODRLinkage; 3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isDynamicClass()) 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CGM.getVTableLinkage(RD); 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::GlobalValue::LinkOnceODRLinkage; 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid linkage!"); 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// CanUseSingleInheritance - Return whether the given record decl has a "single, 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// public, non-virtual base at offset zero (i.e. the derived class is dynamic 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// iff the base is)", according to Itanium C++ ABI, 2.95p6b. 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool CanUseSingleInheritance(const CXXRecordDecl *RD) { 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check the number of bases. 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->getNumBases() != 1) 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the base. 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(); 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check that the base is not virtual. 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->isVirtual()) 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check that the base is public. 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->getAccessSpecifier() != AS_public) 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check that the class is dynamic iff the base is. 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *BaseDecl = 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!BaseDecl->isEmpty() && 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseDecl->isDynamicClass() != RD->isDynamicClass()) 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildVTablePointer(const Type *Ty) { 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__class_type_info. 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static const char * const ClassTypeInfo = 3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "_ZTVN10__cxxabiv117__class_type_infoE"; 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__si_class_type_info. 3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static const char * const SIClassTypeInfo = 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "_ZTVN10__cxxabiv120__si_class_type_infoE"; 3977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__vmi_class_type_info. 3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static const char * const VMIClassTypeInfo = 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "_ZTVN10__cxxabiv121__vmi_class_type_infoE"; 4007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *VTableName = 0; 4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 4097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("References shouldn't get here"); 4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 416dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith case Type::Auto: 417dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith llvm_unreachable("Undeduced auto type shouldn't get here"); 418dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith 4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // GCC treats vector and complex types as fundamental types. 4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: GCC treats block pointers as fundamental types?! 4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__fundamental_type_info. 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE"; 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__array_type_info. 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv117__array_type_infoE"; 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__function_type_info. 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv120__function_type_infoE"; 4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__enum_type_info. 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE"; 4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: { 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *RD = 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->hasDefinition() || !RD->getNumBases()) { 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = ClassTypeInfo; 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (CanUseSingleInheritance(RD)) { 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = SIClassTypeInfo; 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = VMIClassTypeInfo; 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Ignore protocol qualifiers. 4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr(); 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Handle id and Class. 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<BuiltinType>(Ty)) { 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = ClassTypeInfo; 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<ObjCInterfaceType>(Ty)); 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Fall through. 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) { 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = SIClassTypeInfo; 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = ClassTypeInfo; 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__pointer_type_info. 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE"; 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__pointer_to_member_type_info. 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE"; 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *VTable = 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy); 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *PtrDiffTy = 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The vtable address point is 2. 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2); 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two); 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy); 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(VTable); 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want to operate on the canonical type. 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Ty = CGM.getContext().getCanonicalType(Ty); 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we've already emitted an RTTI descriptor for this type. 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<256> OutName; 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::raw_svector_ostream Out(OutName); 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out.flush(); 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = OutName.str(); 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name); 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (OldGV && !OldGV->isDeclaration()) { 5242e430153afacf9e406d0a6024ccc578fa5d3439fEli Friedman assert(!OldGV->hasAvailableExternallyLinkage() && 5252e430153afacf9e406d0a6024ccc578fa5d3439fEli Friedman "available_externally typeinfos not yet implemented"); 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy); 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if there is already an external RTTI descriptor for this type. 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsStdLib = IsStandardLibraryRTTIDescriptor(Ty); 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Force && (IsStdLib || ShouldUseExternalRTTIDescriptor(CGM, Ty))) 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetAddrOfExternalRTTIDescriptor(Ty); 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Emit the standard library with external linkage. 5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable::LinkageTypes Linkage; 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsStdLib) 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Linkage = llvm::GlobalValue::ExternalLinkage; 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Linkage = getTypeInfoLinkage(CGM, Ty); 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the vtable pointer. 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildVTablePointer(cast<Type>(Ty)); 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // And the name. 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage); 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy)); 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Ty->getTypeClass()) { 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(Class, Base) 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(Class, Base) 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DEPENDENT_TYPE(Class, Base) case Type::Class: 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Non-canonical and dependent types shouldn't get here"); 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // GCC treats vector types as fundamental types. 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p4: 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__fundamental_type_info adds no data members to std::type_info. 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("References shouldn't get here"); 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 573dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith case Type::Auto: 574dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith llvm_unreachable("Undeduced auto type shouldn't get here"); 575dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p5: 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__array_type_info adds no data members to std::type_info. 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p5: 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__function_type_info adds no data members to std::type_info. 5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p5: 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // abi::__enum_type_info adds no data members to std::type_info. 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: { 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *RD = 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl()); 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->hasDefinition() || !RD->getNumBases()) { 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We don't need to emit any fields. 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CanUseSingleInheritance(RD)) 6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildSIClassTypeInfo(RD); 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildVMIClassTypeInfo(RD); 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty)); 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType()); 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType()); 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty)); 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No fields, at least for the moment. 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields); 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::GlobalVariable *GV = 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei new llvm::GlobalVariable(CGM.getModule(), Init->getType(), 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*Constant=*/true, Linkage, Init, Name); 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there's already an old global variable, replace it with the new one. 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (OldGV) { 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GV->takeName(OldGV); 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *NewPtr = 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OldGV->replaceAllUsesWith(NewPtr); 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OldGV->eraseFromParent(); 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // GCC only relies on the uniqueness of the type names, not the 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // type_infos themselves, so we can emit these as hidden symbols. 6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // But don't do this if we're worried about strict visibility 6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // compatibility. 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RT = dyn_cast<RecordType>(Ty)) { 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.setTypeVisibility(GV, RD, CodeGenModule::TVK_ForRTTI); 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.setTypeVisibility(TypeName, RD, CodeGenModule::TVK_ForRTTIName); 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Visibility TypeInfoVisibility = DefaultVisibility; 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CGM.getCodeGenOpts().HiddenWeakVTables && 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Linkage == llvm::GlobalValue::LinkOnceODRLinkage) 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeInfoVisibility = HiddenVisibility; 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The type name should have the same visibility as the type itself. 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Visibility ExplicitVisibility = Ty->getVisibility(); 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeName->setVisibility(CodeGenModule:: 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetLLVMVisibility(ExplicitVisibility)); 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeInfoVisibility = minVisibility(TypeInfoVisibility, Ty->getVisibility()); 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GV->setVisibility(CodeGenModule::GetLLVMVisibility(TypeInfoVisibility)); 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GV->setUnnamedAddr(true); 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ComputeQualifierFlags - Compute the pointer type info flags from the 6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// given qualifier. 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic unsigned ComputeQualifierFlags(Qualifiers Quals) { 6797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasConst()) 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::PTI_Const; 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasVolatile()) 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::PTI_Volatile; 6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasRestrict()) 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::PTI_Restrict; 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Flags; 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// for the given Objective-C object type. 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) { 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Drop qualifiers. 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = OT->getBaseType().getTypePtr(); 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T)); 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The builtin types are abi::__class_type_infos and don't require 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // extra fields. 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<BuiltinType>(T)) return; 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl(); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *Super = Class->getSuperClass(); 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Root classes are also __class_type_info. 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Super) return; 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super); 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Everything else is single inheritance. 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *BaseTypeInfo = RTTIBuilder(CGM).BuildTypeInfo(SuperTy); 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(BaseTypeInfo); 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// inheritance, according to the Itanium C++ ABI, 2.95p6b. 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) { 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p6b: 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It adds to abi::__class_type_info a single member pointing to the 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // type_info structure for the base type, 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *BaseTypeInfo = 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(CGM).BuildTypeInfo(RD->bases_begin()->getType()); 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(BaseTypeInfo); 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// SeenBases - Contains virtual and non-virtual bases seen when traversing 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// a class hierarchy. 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei struct SeenBases { 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases; 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases; 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// abi::__vmi_class_type_info. 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SeenBases &Bases) { 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *BaseDecl = 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->isVirtual()) { 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mark the virtual base as seen. 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Bases.VirtualBases.insert(BaseDecl)) { 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this virtual base has been seen before, then the class is diamond 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // shaped. 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::VMI_DiamondShaped; 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Bases.NonVirtualBases.count(BaseDecl)) 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::VMI_NonDiamondRepeat; 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mark the non-virtual base as seen. 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Bases.NonVirtualBases.insert(BaseDecl)) { 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this non-virtual base has been seen before, then the class has non- 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // diamond shaped repeated inheritance. 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::VMI_NonDiamondRepeat; 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Bases.VirtualBases.count(BaseDecl)) 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= RTTIBuilder::VMI_NonDiamondRepeat; 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Walk all bases. 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator I = BaseDecl->bases_begin(), 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = BaseDecl->bases_end(); I != E; ++I) 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Flags; 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) { 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = 0; 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SeenBases Bases; 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Walk all bases. 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->bases_end(); I != E; ++I) 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Flags; 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// classes with bases that do not satisfy the abi::__si_class_type_info 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// constraints, according ti the Itanium C++ ABI, 2.9.5p5c. 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *UnsignedIntLTy = 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p6c: 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __flags is a word with flags describing details about the class 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // structure, which may be referenced by using the __flags_masks 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // enumeration. These flags refer to both direct and indirect bases. 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = ComputeVMIClassTypeInfoFlags(RD); 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p6c: 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __base_count is a word with the number of direct proper base class 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // descriptions that follow. 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases())); 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RD->getNumBases()) 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *LongLTy = 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getTypes().ConvertType(CGM.getContext().LongTy); 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Now add the base class descriptions. 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p6c: 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __base_info[] is an array of base class descriptions -- one for every 8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // direct proper base. Each description is of the type: 8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // struct abi::__base_class_type_info { 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // public: 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // const __class_type_info *__base_type; 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // long __offset_flags; 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // enum __offset_flags_masks { 8257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __virtual_mask = 0x1, 8267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __public_mask = 0x2, 8277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __offset_shift = 8 8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 8297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = RD->bases_end(); I != E; ++I) { 8327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXBaseSpecifier *Base = I; 8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The __base_type member points to the RTTI for the base type. 8357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(Base->getType())); 8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXRecordDecl *BaseDecl = 8387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int64_t OffsetFlags = 0; 8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // All but the lower 8 bits of __offset_flags are a signed offset. 8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For a non-virtual base, this is the offset in the object of the base 8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // subobject. For a virtual base, this is the offset in the virtual table of 8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the virtual base offset for the virtual base referenced (negative). 8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CharUnits Offset; 8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->isVirtual()) 8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Offset = 8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl); 8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); 8527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Offset = Layout.getBaseClassOffset(BaseDecl); 8537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OffsetFlags = uint64_t(Offset.getQuantity()) << 8; 8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The low-order byte of __offset_flags contains flags, as given by the 8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // masks from the enumeration __offset_flags_masks. 8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->isVirtual()) 8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OffsetFlags |= BCTI_Virtual; 8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Base->getAccessSpecifier() == AS_public) 8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OffsetFlags |= BCTI_Public; 8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags)); 8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, 8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// used for pointer types. 8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) { 8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Quals; 8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnqualifiedPointeeTy = 8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals); 8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __flags is a flag word describing the cv-qualification and other 8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // attributes of the type pointed to 8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = ComputeQualifierFlags(Quals); 8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // When the abi::__pbase_type_info is for a direct or indirect pointer to an 8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // incomplete class type, the incomplete target type flag is set. 8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ContainsIncompleteClassType(UnqualifiedPointeeTy)) 8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= PTI_Incomplete; 8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *UnsignedIntLTy = 8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __pointee is a pointer to the std::type_info derivation for the 8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unqualified type being pointed to. 8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *PointeeTypeInfo = 8947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(CGM).BuildTypeInfo(UnqualifiedPointeeTy); 8957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(PointeeTypeInfo); 8967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info 8997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// struct, used for member pointer types. 9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid RTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) { 9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeTy = Ty->getPointeeType(); 9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Quals; 9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnqualifiedPointeeTy = 9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals); 9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __flags is a flag word describing the cv-qualification and other 9097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // attributes of the type pointed to. 9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = ComputeQualifierFlags(Quals); 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordType *ClassType = cast<RecordType>(Ty->getClass()); 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // When the abi::__pbase_type_info is for a direct or indirect pointer to an 9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // incomplete class type, the incomplete target type flag is set. 9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ContainsIncompleteClassType(UnqualifiedPointeeTy)) 9187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= PTI_Incomplete; 9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsIncompleteClassType(ClassType)) 9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Flags |= PTI_ContainingClassIncomplete; 9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Type *UnsignedIntLTy = 9247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy); 9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags)); 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p7: 9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __pointee is a pointer to the std::type_info derivation for the 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unqualified type being pointed to. 9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Constant *PointeeTypeInfo = 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(CGM).BuildTypeInfo(UnqualifiedPointeeTy); 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(PointeeTypeInfo); 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 2.9.5p9: 9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __context is a pointer to an abi::__class_type_info corresponding to the 9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // class type containing the member pointed to 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // (e.g., the "A" in "int A::*"). 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(QualType(ClassType, 0))); 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, 9427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool ForEH) { 9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Return a bogus pointer if RTTI is disabled, unless it's for EH. 9447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: should we even be calling this method if RTTI is disabled 9457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and it's not for EH? 9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ForEH && !getLangOpts().RTTI) 9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::Constant::getNullValue(Int8PtrTy); 9487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ForEH && Ty->isObjCObjectPointerType() && 9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.ObjCRuntime.isGNUFamily()) 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ObjCRuntime->GetEHType(Ty); 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RTTIBuilder(*this).BuildTypeInfo(Ty); 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CodeGenModule::EmitFundamentalRTTIDescriptor(QualType Type) { 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointerType = Context.getPointerType(Type); 9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointerTypeConst = Context.getPointerType(Type.withConst()); 9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(*this).BuildTypeInfo(Type, true); 9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(*this).BuildTypeInfo(PointerType, true); 9617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true); 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CodeGenModule::EmitFundamentalRTTIDescriptors() { 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FundamentalTypes[] = { Context.VoidTy, Context.NullPtrTy, 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.BoolTy, Context.WCharTy, 9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.CharTy, Context.UnsignedCharTy, 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.SignedCharTy, Context.ShortTy, 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.UnsignedShortTy, Context.IntTy, 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.UnsignedIntTy, Context.LongTy, 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.UnsignedLongTy, Context.LongLongTy, 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.UnsignedLongLongTy, Context.FloatTy, 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.DoubleTy, Context.LongDoubleTy, 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.Char16Ty, Context.Char32Ty }; 975b960232518a1cd79c5f64ab5ef54c88e34660191Craig Topper for (unsigned i = 0; i < llvm::array_lengthof(FundamentalTypes); ++i) 9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EmitFundamentalRTTIDescriptor(FundamentalTypes[i]); 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 978