From c5d37af0e0fac7f1b9923d98d6e25b2a28a7645a Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 25 Apr 2017 11:03:36 +0200 Subject: [PATCH] Debugger: Some support for 'long double' Task-number: QTCREATORBUG-18023 Change-Id: I06783541668b95711cb5a45bf689c43b348ff624 Reviewed-by: hjk --- share/qtcreator/debugger/dumper.py | 42 +++++++++++++++++++++++++++-- tests/auto/debugger/tst_dumpers.cpp | 11 ++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index c03f07d9e9..a4fa0dba3c 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -124,7 +124,7 @@ def isIntegralTypeName(name): 'bool') def isFloatingPointTypeName(name): - return name in ('float', 'double') + return name in ('float', 'double', 'long double') def arrayForms(): @@ -2899,13 +2899,51 @@ class DumperBase: return self.extractInteger(bitsize, unsigned) def floatingPoint(self): + if self.nativeValue is not None and not self.dumper.isCdb: + return str(self.nativeValue) if self.type.code == TypeCodeTypedef: return self.detypedef().floatingPoint() if self.type.size() == 8: return self.extractSomething('d', 64) if self.type.size() == 4: return self.extractSomething('f', 32) - error('BAD FLOAT DATA: %s SIZE: %s' % (self, self.type.size())) + # Fall back in case we don't have a nativeValue at hand. + # FIXME: This assumes Intel's 80bit extended floats. Which might + # be wrong. + l, h = self.split('QQ') + if True: # 80 bit floats + sign = (h >> 15) & 1 + exp = (h & 0x7fff) + fraction = l + bit63 = (l >> 63) & 1 + #warn("SIGN: %s EXP: %s H: 0x%x L: 0x%x" % (sign, exp, h, l)) + if exp == 0: + if bit63 == 0: + if l == 0: + res = '-0' if sign else '0' + else: + res = (-1)**sign * l * 2**(-16382) # subnormal + else: + res = 'pseudodenormal' + elif exp == 0x7fff: + res = 'special' + else: + res = (-1)**sign * l * 2**(exp - 16383 - 63) + else: # 128 bits + sign = h >> 63 + exp = (h >> 48) & 0x7fff + fraction = h & (2**48 - 1) + #warn("SIGN: %s EXP: %s FRAC: %s H: 0x%x L: 0x%x" % (sign, exp, fraction, h, l)) + if exp == 0: + if fraction == 0: + res = -0.0 if sign else 0.0 + else: + res = (-1)**sign * fraction / 2**48 * 2**(-62) # subnormal + elif exp == 0x7fff: + res = ('-inf' if sign else 'inf') if fraction == 0 else 'nan' + else: + res = (-1)**sign * (1 + fraction / 2**48) * 2**(exp - 63) + return res def value(self): if self.type is not None: diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 650109a598..e206a7354f 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -6713,6 +6713,17 @@ void tst_Dumpers::dumper_data() + Check("f.b", "", "") % NoCdbEngine + Check("f.b", "", "") % CdbEngine; + QTest::newRow("LongDouble") + << Data("", + "long double a = 1;\n" + "long double b = -2;\n" + "long double c = 0;\n" + "long double d = 0.5;\n") + + Check("a", FloatValue("1"), TypeDef("double", "long double")) + + Check("b", FloatValue("-2"), TypeDef("double", "long double")) + + Check("c", FloatValue("0"), TypeDef("double", "long double")) + + Check("d", FloatValue("0.5"), TypeDef("double", "long double")); + QTest::newRow("ArrayOfFunctionPointers") << Data("typedef int (*FP)(int *); \n" "int func(int *param) { unused(param); return 0; } \n", -- GitLab