@@ -795,6 +795,8 @@ TypeSystemClang::GetBuiltinTypeForEncodingAndBitSize(Encoding encoding,
795
795
return GetType (ast.LongDoubleTy );
796
796
if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
797
797
return GetType (ast.HalfTy );
798
+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
799
+ return GetType (ast.Float128Ty );
798
800
break ;
799
801
800
802
case eEncodingVector:
@@ -956,6 +958,13 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
956
958
if (type_name == " long double" &&
957
959
QualTypeMatchesBitSize (bit_size, ast, ast.LongDoubleTy ))
958
960
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 );
959
968
// Fall back to not requiring a name match
960
969
if (QualTypeMatchesBitSize (bit_size, ast, ast.FloatTy ))
961
970
return GetType (ast.FloatTy );
@@ -965,6 +974,8 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize(
965
974
return GetType (ast.LongDoubleTy );
966
975
if (QualTypeMatchesBitSize (bit_size, ast, ast.HalfTy ))
967
976
return GetType (ast.HalfTy );
977
+ if (QualTypeMatchesBitSize (bit_size, ast, ast.Float128Ty ))
978
+ return GetType (ast.Float128Ty );
968
979
break ;
969
980
970
981
case DW_ATE_signed:
@@ -2054,6 +2065,8 @@ TypeSystemClang::GetOpaqueCompilerType(clang::ASTContext *ast,
2054
2065
return ast->DoubleTy .getAsOpaquePtr ();
2055
2066
case eBasicTypeLongDouble:
2056
2067
return ast->LongDoubleTy .getAsOpaquePtr ();
2068
+ case eBasicTypeFloat128:
2069
+ return ast->Float128Ty .getAsOpaquePtr ();
2057
2070
case eBasicTypeFloatComplex:
2058
2071
return ast->getComplexType (ast->FloatTy ).getAsOpaquePtr ();
2059
2072
case eBasicTypeDoubleComplex:
@@ -4742,19 +4755,24 @@ CompilerType TypeSystemClang::CreateGenericFunctionPrototype() {
4742
4755
// Exploring the type
4743
4756
4744
4757
const llvm::fltSemantics &
4745
- TypeSystemClang::GetFloatTypeSemantics (size_t byte_size) {
4758
+ TypeSystemClang::GetFloatTypeSemantics (size_t byte_size, lldb::Format format ) {
4746
4759
clang::ASTContext &ast = getASTContext ();
4747
4760
const size_t bit_size = byte_size * 8 ;
4748
4761
if (bit_size == ast.getTypeSize (ast.FloatTy ))
4749
4762
return ast.getFloatTypeSemantics (ast.FloatTy );
4750
4763
else if (bit_size == ast.getTypeSize (ast.DoubleTy ))
4751
4764
return ast.getFloatTypeSemantics (ast.DoubleTy );
4765
+ else if (format == eFormatFloat128 &&
4766
+ bit_size == ast.getTypeSize (ast.Float128Ty ))
4767
+ return ast.getFloatTypeSemantics (ast.Float128Ty );
4752
4768
else if (bit_size == ast.getTypeSize (ast.LongDoubleTy ) ||
4753
4769
bit_size == llvm::APFloat::semanticsSizeInBits (
4754
4770
ast.getFloatTypeSemantics (ast.LongDoubleTy )))
4755
4771
return ast.getFloatTypeSemantics (ast.LongDoubleTy );
4756
4772
else if (bit_size == ast.getTypeSize (ast.HalfTy ))
4757
4773
return ast.getFloatTypeSemantics (ast.HalfTy );
4774
+ else if (bit_size == ast.getTypeSize (ast.Float128Ty ))
4775
+ return ast.getFloatTypeSemantics (ast.Float128Ty );
4758
4776
return llvm::APFloatBase::Bogus ();
4759
4777
}
4760
4778
@@ -5232,6 +5250,8 @@ lldb::Format TypeSystemClang::GetFormat(lldb::opaque_compiler_type_t type) {
5232
5250
case clang::BuiltinType::Double:
5233
5251
case clang::BuiltinType::LongDouble:
5234
5252
return lldb::eFormatFloat;
5253
+ case clang::BuiltinType::Float128:
5254
+ return lldb::eFormatFloat128;
5235
5255
default :
5236
5256
return lldb::eFormatHex;
5237
5257
}
@@ -5529,6 +5549,8 @@ TypeSystemClang::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
5529
5549
return eBasicTypeDouble;
5530
5550
case clang::BuiltinType::LongDouble:
5531
5551
return eBasicTypeLongDouble;
5552
+ case clang::BuiltinType::Float128:
5553
+ return eBasicTypeFloat128;
5532
5554
5533
5555
case clang::BuiltinType::NullPtr:
5534
5556
return eBasicTypeNullPtr;
@@ -6090,6 +6112,7 @@ uint32_t TypeSystemClang::GetNumPointeeChildren(clang::QualType type) {
6090
6112
case clang::BuiltinType::Float:
6091
6113
case clang::BuiltinType::Double:
6092
6114
case clang::BuiltinType::LongDouble:
6115
+ case clang::BuiltinType::Float128:
6093
6116
case clang::BuiltinType::Dependent:
6094
6117
case clang::BuiltinType::Overload:
6095
6118
case clang::BuiltinType::ObjCId:
@@ -8733,6 +8756,7 @@ bool TypeSystemClang::DumpTypeValue(
8733
8756
case eFormatHex:
8734
8757
case eFormatHexUppercase:
8735
8758
case eFormatFloat:
8759
+ case eFormatFloat128:
8736
8760
case eFormatOctal:
8737
8761
case eFormatOSType:
8738
8762
case eFormatUnsigned:
0 commit comments