Hi Guy, > Modified: cfe/trunk/lib/CodeGen/CGRTTI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRTTI.cpp?rev=170428&r1=170427&r2=170428&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGRTTI.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGRTTI.cpp Tue Dec 18 06:30:03 2012 > @@ -1,1011 +1,1017 @@ [...] > -/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the > type > -/// info for that type is defined in the standard library. > -static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { > - // Itanium C++ ABI 2.9.2: > - // Basic type information (e.g. for "int", "bool", etc.) will be kept in > - // the run-time support library. Specifically, the run-time support > - // library should contain type_info objects for the types X, X* and > - // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char, > - // unsigned char, signed char, short, unsigned short, int, unsigned int, > - // long, unsigned long, long long, unsigned long long, float, double, > - // long double, char16_t, char32_t, and the IEEE 754r decimal and > - // half-precision floating point types. > - switch (Ty->getKind()) { > - case BuiltinType::Void: > - case BuiltinType::NullPtr: > - case BuiltinType::Bool: > - case BuiltinType::WChar_S: > - case BuiltinType::WChar_U: > - case BuiltinType::Char_U: > - case BuiltinType::Char_S: > - case BuiltinType::UChar: > - case BuiltinType::SChar: > - case BuiltinType::Short: > - case BuiltinType::UShort: > - case BuiltinType::Int: > - case BuiltinType::UInt: > - case BuiltinType::Long: > - case BuiltinType::ULong: > - case BuiltinType::LongLong: > - case BuiltinType::ULongLong: > - case BuiltinType::Half: > - case BuiltinType::Float: > - case BuiltinType::Double: > - case BuiltinType::LongDouble: > - case BuiltinType::Char16: > - case BuiltinType::Char32: > - case BuiltinType::Int128: > - case BuiltinType::UInt128: > - return true; > +/// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the > type > +/// info for that type is defined in the standard library. > +static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { > + // Itanium C++ ABI 2.9.2: > + // Basic type information (e.g. for "int", "bool", etc.) will be kept in > + // the run-time support library. Specifically, the run-time support > + // library should contain type_info objects for the types X, X* and > + // X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char, > + // unsigned char, signed char, short, unsigned short, int, unsigned int, > + // long, unsigned long, long long, unsigned long long, float, double, > + // long double, char16_t, char32_t, and the IEEE 754r decimal and > + // half-precision floating point types. > + switch (Ty->getKind()) { > + case BuiltinType::Void: > + case BuiltinType::NullPtr: > + case BuiltinType::Bool: > + case BuiltinType::WChar_S: > + case BuiltinType::WChar_U: > + case BuiltinType::Char_U: > + case BuiltinType::Char_S: > + case BuiltinType::UChar: > + case BuiltinType::SChar: > + case BuiltinType::Short: > + case BuiltinType::UShort: > + case BuiltinType::Int: > + case BuiltinType::UInt: > + case BuiltinType::Long: > + case BuiltinType::ULong: > + case BuiltinType::LongLong: > + case BuiltinType::ULongLong: > + case BuiltinType::Half: > + case BuiltinType::Float: > + case BuiltinType::Double: > + case BuiltinType::LongDouble: > + case BuiltinType::Char16: > + case BuiltinType::Char32: > + case BuiltinType::Int128: > + case BuiltinType::UInt128: > + case BuiltinType::OCLImage1d: > + case BuiltinType::OCLImage1dArray: > + case BuiltinType::OCLImage1dBuffer: > + case BuiltinType::OCLImage2d: > + case BuiltinType::OCLImage2dArray: > + case BuiltinType::OCLImage3d: > + return true;
This change is wrong. If you add types here, you must also add them to EmitFundamentalRTTIDescriptor: [...] > -void CodeGenModule::EmitFundamentalRTTIDescriptor(QualType Type) { > - QualType PointerType = Context.getPointerType(Type); > - QualType PointerTypeConst = Context.getPointerType(Type.withConst()); > - RTTIBuilder(*this).BuildTypeInfo(Type, true); > - RTTIBuilder(*this).BuildTypeInfo(PointerType, true); > - RTTIBuilder(*this).BuildTypeInfo(PointerTypeConst, true); > -} > - > -void CodeGenModule::EmitFundamentalRTTIDescriptors() { > - QualType FundamentalTypes[] = { Context.VoidTy, Context.NullPtrTy, > - Context.BoolTy, Context.WCharTy, > - Context.CharTy, Context.UnsignedCharTy, > - Context.SignedCharTy, Context.ShortTy, > - Context.UnsignedShortTy, Context.IntTy, > - Context.UnsignedIntTy, Context.LongTy, > - Context.UnsignedLongTy, Context.LongLongTy, > - Context.UnsignedLongLongTy, > Context.FloatTy, > - Context.DoubleTy, Context.LongDoubleTy, > - Context.Char16Ty, Context.Char32Ty }; > - for (unsigned i = 0; i < sizeof(FundamentalTypes)/sizeof(QualType); ++i) > - EmitFundamentalRTTIDescriptor(FundamentalTypes[i]); > -} Should these type descriptors be part of the C++ ABI library or not? I would suspect not, as GCC does not do so. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits