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