diff options
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 13 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/rtti-fundamental.cpp | 10 |
2 files changed, 21 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 753bf561e9b..9d7b4da2c53 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2508,6 +2508,11 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { // 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. + // + // GCC also emits RTTI for __int128. + // FIXME: We do not emit RTTI information for decimal types here. + + // Types added here must also be added to EmitFundamentalRTTIDescriptors. switch (Ty->getKind()) { case BuiltinType::Void: case BuiltinType::NullPtr: @@ -2534,6 +2539,8 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { case BuiltinType::Char32: case BuiltinType::Int128: case BuiltinType::UInt128: + return true; + case BuiltinType::OCLImage1d: case BuiltinType::OCLImage1dArray: case BuiltinType::OCLImage1dBuffer: @@ -2552,7 +2559,7 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) { case BuiltinType::OCLQueue: case BuiltinType::OCLNDRange: case BuiltinType::OCLReserveID: - return true; + return false; case BuiltinType::Dependent: #define BUILTIN_TYPE(Id, SingletonId) @@ -3344,6 +3351,7 @@ void ItaniumCXXABI::EmitFundamentalRTTIDescriptor(QualType Type) { } void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() { + // Types added here must also be added to TypeInfoIsInStandardLibrary. QualType FundamentalTypes[] = { getContext().VoidTy, getContext().NullPtrTy, getContext().BoolTy, getContext().WCharTy, @@ -3352,7 +3360,8 @@ void ItaniumCXXABI::EmitFundamentalRTTIDescriptors() { getContext().UnsignedShortTy, getContext().IntTy, getContext().UnsignedIntTy, getContext().LongTy, getContext().UnsignedLongTy, getContext().LongLongTy, - getContext().UnsignedLongLongTy, getContext().HalfTy, + getContext().UnsignedLongLongTy, getContext().Int128Ty, + getContext().UnsignedInt128Ty, getContext().HalfTy, getContext().FloatTy, getContext().DoubleTy, getContext().LongDoubleTy, getContext().Char16Ty, getContext().Char32Ty, diff --git a/clang/test/CodeGenCXX/rtti-fundamental.cpp b/clang/test/CodeGenCXX/rtti-fundamental.cpp index e70c3aa3659..a0ad80d7c98 100644 --- a/clang/test/CodeGenCXX/rtti-fundamental.cpp +++ b/clang/test/CodeGenCXX/rtti-fundamental.cpp @@ -89,6 +89,16 @@ namespace __cxxabiv1 { // CHECK: @_ZTIPy = constant // CHECK: @_ZTIPKy = constant +// __int128 +// CHECK: @_ZTIn = constant +// CHECK: @_ZTIPn = constant +// CHECK: @_ZTIPKn = constant + +// unsigned __int128 +// CHECK: @_ZTIo = constant +// CHECK: @_ZTIPo = constant +// CHECK: @_ZTIPKo = constant + // half // CHECK: @_ZTIDh = constant // CHECK: @_ZTIPDh = constant |