mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
[AsmWriter/APFloat] FP constant printing: Avoid usage of locale dependent snprinf
This should fix the bug https://bugs.llvm.org/show_bug.cgi?id=12906 To print the FP constant AsmWriter does the following: 1) convert FP value to String (actually using snprintf function which is locale dependent). 2) Convert String back to FP Value 3) Compare original and got FP values. If they are not equal just dump as hex. The problem happens on the 2nd step when APFloat does not expect group delimiter or fraction delimiter other than period symbol and so on, which can be produced on the first step if LLVM library is used in an environment with corresponding locale set. To fix this issue the locale independent APFloat:toString function is used. However it prints FP values slightly differently than snprintf does. Specifically it suppress trailing zeros in significant, use capital E and so on. It results in 117 test failures during make check. To avoid this I've also updated APFloat.toString a bit to pass make check at least. Reviewers: sberg, bogner, majnemer, sanjoy, timshen, rnk Reviewed By: timshen, rnk Subscribers: rnk, llvm-commits Differential Revision: https://reviews.llvm.org/D32276 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300943 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+23
-8
@@ -3393,7 +3393,7 @@ namespace {
|
||||
}
|
||||
|
||||
void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,
|
||||
unsigned FormatMaxPadding) const {
|
||||
unsigned FormatMaxPadding, bool TruncateZero) const {
|
||||
switch (category) {
|
||||
case fcInfinity:
|
||||
if (isNegative())
|
||||
@@ -3407,9 +3407,16 @@ void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,
|
||||
if (isNegative())
|
||||
Str.push_back('-');
|
||||
|
||||
if (!FormatMaxPadding)
|
||||
append(Str, "0.0E+0");
|
||||
else
|
||||
if (!FormatMaxPadding) {
|
||||
if (TruncateZero)
|
||||
append(Str, "0.0E+0");
|
||||
else {
|
||||
append(Str, "0.0");
|
||||
if (FormatPrecision > 1)
|
||||
Str.append(FormatPrecision - 1, '0');
|
||||
append(Str, "e+00");
|
||||
}
|
||||
} else
|
||||
Str.push_back('0');
|
||||
return;
|
||||
|
||||
@@ -3543,12 +3550,16 @@ void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,
|
||||
|
||||
Str.push_back(buffer[NDigits-1]);
|
||||
Str.push_back('.');
|
||||
if (NDigits == 1)
|
||||
if (NDigits == 1 && TruncateZero)
|
||||
Str.push_back('0');
|
||||
else
|
||||
for (unsigned I = 1; I != NDigits; ++I)
|
||||
Str.push_back(buffer[NDigits-1-I]);
|
||||
Str.push_back('E');
|
||||
// Fill with zeros up to FormatPrecision.
|
||||
if (!TruncateZero && FormatPrecision > NDigits - 1)
|
||||
Str.append(FormatPrecision - NDigits + 1, '0');
|
||||
// For !TruncateZero we use lower 'e'.
|
||||
Str.push_back(TruncateZero ? 'E' : 'e');
|
||||
|
||||
Str.push_back(exp >= 0 ? '+' : '-');
|
||||
if (exp < 0) exp = -exp;
|
||||
@@ -3557,6 +3568,9 @@ void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,
|
||||
expbuf.push_back((char) ('0' + (exp % 10)));
|
||||
exp /= 10;
|
||||
} while (exp);
|
||||
// Exponent always at least two digits if we do not truncate zeros.
|
||||
if (!TruncateZero && expbuf.size() < 2)
|
||||
expbuf.push_back('0');
|
||||
for (unsigned I = 0, E = expbuf.size(); I != E; ++I)
|
||||
Str.push_back(expbuf[E-1-I]);
|
||||
return;
|
||||
@@ -4362,10 +4376,11 @@ bool DoubleAPFloat::isInteger() const {
|
||||
|
||||
void DoubleAPFloat::toString(SmallVectorImpl<char> &Str,
|
||||
unsigned FormatPrecision,
|
||||
unsigned FormatMaxPadding) const {
|
||||
unsigned FormatMaxPadding,
|
||||
bool TruncateZero) const {
|
||||
assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics");
|
||||
APFloat(semPPCDoubleDoubleLegacy, bitcastToAPInt())
|
||||
.toString(Str, FormatPrecision, FormatMaxPadding);
|
||||
.toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
|
||||
}
|
||||
|
||||
bool DoubleAPFloat::getExactInverse(APFloat *inv) const {
|
||||
|
||||
Reference in New Issue
Block a user