@@ -795,6 +795,8 @@ TypeSystemClang::GetBuiltinTypeForEncodingAndBitSize(Encoding encoding,
795795 return GetType (ast.LongDoubleTy );
796796 if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
797797 return GetType (ast.HalfTy );
798+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
799+ return GetType (ast.Float128Ty );
798800 break ;
799801
800802 case eEncodingVector:
@@ -956,6 +958,13 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
956958 if (type_name == " long double" &&
957959 QualTypeMatchesBitSize (bit_size, ast, ast.LongDoubleTy ))
958960 return GetType (ast.LongDoubleTy );
961+ // As Rust currently uses `TypeSystemClang`, match `f128` here as well so it
962+ // doesn't get misinterpreted as `long double` on targets where they are
963+ // the same size but different formats.
964+ if ((type_name == " __float128" || type_name == " _Float128" ||
965+ type_name == " f128" ) &&
966+ QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
967+ return GetType (ast.Float128Ty );
959968 // Fall back to not requiring a name match
960969 if (QualTypeMatchesBitSize (bit_size, ast, ast.FloatTy ))
961970 return GetType (ast.FloatTy );
@@ -965,6 +974,8 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
965974 return GetType (ast.LongDoubleTy );
966975 if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
967976 return GetType (ast.HalfTy );
977+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
978+ return GetType (ast.Float128Ty );
968979 break ;
969980
970981 case DW_ATE_signed:
@@ -2054,6 +2065,8 @@ TypeSystemClang::GetOpaqueCompilerType(clang::ASTContext *ast,
20542065 return ast->DoubleTy .getAsOpaquePtr ();
20552066 case eBasicTypeLongDouble:
20562067 return ast->LongDoubleTy .getAsOpaquePtr ();
2068+ case eBasicTypeFloat128:
2069+ return ast->Float128Ty .getAsOpaquePtr ();
20572070 case eBasicTypeFloatComplex:
20582071 return ast->getComplexType (ast->FloatTy ).getAsOpaquePtr ();
20592072 case eBasicTypeDoubleComplex:
@@ -4742,19 +4755,24 @@ CompilerType TypeSystemClang::CreateGenericFunctionPrototype() {
47424755// Exploring the type
47434756
47444757const llvm::fltSemantics &
4745- TypeSystemClang::GetFloatTypeSemantics (size_t byte_size) {
4758+ TypeSystemClang::GetFloatTypeSemantics (size_t byte_size, lldb::Format format ) {
47464759 clang::ASTContext &ast = getASTContext ();
47474760 const size_t bit_size = byte_size * 8 ;
47484761 if (bit_size == ast.getTypeSize (ast.FloatTy ))
47494762 return ast.getFloatTypeSemantics (ast.FloatTy );
47504763 else if (bit_size == ast.getTypeSize (ast.DoubleTy ))
47514764 return ast.getFloatTypeSemantics (ast.DoubleTy );
4765+ else if (format == eFormatFloat128 &&
4766+ bit_size == ast.getTypeSize (ast.Float128Ty ))
4767+ return ast.getFloatTypeSemantics (ast.Float128Ty );
47524768 else if (bit_size == ast.getTypeSize (ast.LongDoubleTy ) ||
47534769 bit_size == llvm::APFloat::semanticsSizeInBits (
47544770 ast.getFloatTypeSemantics (ast.LongDoubleTy )))
47554771 return ast.getFloatTypeSemantics (ast.LongDoubleTy );
47564772 else if (bit_size == ast.getTypeSize (ast.HalfTy ))
47574773 return ast.getFloatTypeSemantics (ast.HalfTy );
4774+ else if (bit_size == ast.getTypeSize (ast.Float128Ty ))
4775+ return ast.getFloatTypeSemantics (ast.Float128Ty );
47584776 return llvm::APFloatBase::Bogus ();
47594777}
47604778
@@ -5232,6 +5250,8 @@ lldb::Format TypeSystemClang::GetFormat(lldb::opaque_compiler_type_t type) {
52325250 case clang::BuiltinType::Double:
52335251 case clang::BuiltinType::LongDouble:
52345252 return lldb::eFormatFloat;
5253+ case clang::BuiltinType::Float128:
5254+ return lldb::eFormatFloat128;
52355255 default :
52365256 return lldb::eFormatHex;
52375257 }
@@ -5529,6 +5549,8 @@ TypeSystemClang::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
55295549 return eBasicTypeDouble;
55305550 case clang::BuiltinType::LongDouble:
55315551 return eBasicTypeLongDouble;
5552+ case clang::BuiltinType::Float128:
5553+ return eBasicTypeFloat128;
55325554
55335555 case clang::BuiltinType::NullPtr:
55345556 return eBasicTypeNullPtr;
@@ -6090,6 +6112,7 @@ uint32_t TypeSystemClang::GetNumPointeeChildren(clang::QualType type) {
60906112 case clang::BuiltinType::Float:
60916113 case clang::BuiltinType::Double:
60926114 case clang::BuiltinType::LongDouble:
6115+ case clang::BuiltinType::Float128:
60936116 case clang::BuiltinType::Dependent:
60946117 case clang::BuiltinType::Overload:
60956118 case clang::BuiltinType::ObjCId:
@@ -8733,6 +8756,7 @@ bool TypeSystemClang::DumpTypeValue(
87338756 case eFormatHex:
87348757 case eFormatHexUppercase:
87358758 case eFormatFloat:
8759+ case eFormatFloat128:
87368760 case eFormatOctal:
87378761 case eFormatOSType:
87388762 case eFormatUnsigned:
0 commit comments