@@ -809,6 +809,8 @@ TypeSystemClang::GetBuiltinTypeForEncodingAndBitSize(Encoding encoding,
809809 return GetType (ast.LongDoubleTy );
810810 if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
811811 return GetType (ast.HalfTy );
812+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
813+ return GetType (ast.Float128Ty );
812814 break ;
813815
814816 case eEncodingVector:
@@ -970,6 +972,13 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
970972 if (type_name == " long double" &&
971973 QualTypeMatchesBitSize (bit_size, ast, ast.LongDoubleTy ))
972974 return GetType (ast.LongDoubleTy );
975+ // As Rust currently uses `TypeSystemClang`, match `f128` here as well so it
976+ // doesn't get misinterpreted as `long double` on targets where they are
977+ // the same size but different formats.
978+ if ((type_name == " __float128" || type_name == " _Float128" ||
979+ type_name == " f128" ) &&
980+ QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
981+ return GetType (ast.Float128Ty );
973982 // Fall back to not requiring a name match
974983 if (QualTypeMatchesBitSize (bit_size, ast, ast.FloatTy ))
975984 return GetType (ast.FloatTy );
@@ -979,6 +988,8 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
979988 return GetType (ast.LongDoubleTy );
980989 if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
981990 return GetType (ast.HalfTy );
991+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
992+ return GetType (ast.Float128Ty );
982993 break ;
983994
984995 case DW_ATE_signed:
@@ -2068,6 +2079,8 @@ TypeSystemClang::GetOpaqueCompilerType(clang::ASTContext *ast,
20682079 return ast->DoubleTy .getAsOpaquePtr ();
20692080 case eBasicTypeLongDouble:
20702081 return ast->LongDoubleTy .getAsOpaquePtr ();
2082+ case eBasicTypeFloat128:
2083+ return ast->Float128Ty .getAsOpaquePtr ();
20712084 case eBasicTypeFloatComplex:
20722085 return ast->getComplexType (ast->FloatTy ).getAsOpaquePtr ();
20732086 case eBasicTypeDoubleComplex:
@@ -4737,19 +4750,23 @@ CompilerType TypeSystemClang::CreateGenericFunctionPrototype() {
47374750// Exploring the type
47384751
47394752const llvm::fltSemantics &
4740- TypeSystemClang::GetFloatTypeSemantics (size_t byte_size) {
4753+ TypeSystemClang::GetFloatTypeSemantics (size_t byte_size, bool prefer_float128 ) {
47414754 clang::ASTContext &ast = getASTContext ();
47424755 const size_t bit_size = byte_size * 8 ;
47434756 if (bit_size == ast.getTypeSize (ast.FloatTy ))
47444757 return ast.getFloatTypeSemantics (ast.FloatTy );
47454758 else if (bit_size == ast.getTypeSize (ast.DoubleTy ))
47464759 return ast.getFloatTypeSemantics (ast.DoubleTy );
4760+ else if (prefer_float128 && bit_size == ast.getTypeSize (ast.Float128Ty ))
4761+ return ast.getFloatTypeSemantics (ast.Float128Ty );
47474762 else if (bit_size == ast.getTypeSize (ast.LongDoubleTy ) ||
47484763 bit_size == llvm::APFloat::semanticsSizeInBits (
47494764 ast.getFloatTypeSemantics (ast.LongDoubleTy )))
47504765 return ast.getFloatTypeSemantics (ast.LongDoubleTy );
47514766 else if (bit_size == ast.getTypeSize (ast.HalfTy ))
47524767 return ast.getFloatTypeSemantics (ast.HalfTy );
4768+ else if (bit_size == ast.getTypeSize (ast.Float128Ty ))
4769+ return ast.getFloatTypeSemantics (ast.Float128Ty );
47534770 return llvm::APFloatBase::Bogus ();
47544771}
47554772
@@ -5222,6 +5239,8 @@ lldb::Format TypeSystemClang::GetFormat(lldb::opaque_compiler_type_t type) {
52225239 case clang::BuiltinType::Double:
52235240 case clang::BuiltinType::LongDouble:
52245241 return lldb::eFormatFloat;
5242+ case clang::BuiltinType::Float128:
5243+ return lldb::eFormatFloat128;
52255244 default :
52265245 return lldb::eFormatHex;
52275246 }
@@ -5545,6 +5564,8 @@ TypeSystemClang::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
55455564 return eBasicTypeDouble;
55465565 case clang::BuiltinType::LongDouble:
55475566 return eBasicTypeLongDouble;
5567+ case clang::BuiltinType::Float128:
5568+ return eBasicTypeFloat128;
55485569
55495570 case clang::BuiltinType::NullPtr:
55505571 return eBasicTypeNullPtr;
@@ -6106,6 +6127,7 @@ uint32_t TypeSystemClang::GetNumPointeeChildren(clang::QualType type) {
61066127 case clang::BuiltinType::Float:
61076128 case clang::BuiltinType::Double:
61086129 case clang::BuiltinType::LongDouble:
6130+ case clang::BuiltinType::Float128:
61096131 case clang::BuiltinType::Dependent:
61106132 case clang::BuiltinType::Overload:
61116133 case clang::BuiltinType::ObjCId:
@@ -8837,6 +8859,7 @@ bool TypeSystemClang::DumpTypeValue(
88378859 case eFormatHex:
88388860 case eFormatHexUppercase:
88398861 case eFormatFloat:
8862+ case eFormatFloat128:
88408863 case eFormatOctal:
88418864 case eFormatOSType:
88428865 case eFormatUnsigned:
0 commit comments