aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-ssa-sprintf.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2016-09-22 21:28:07 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2016-09-22 15:28:07 -0600
commited30d2a6f4939523e55f54ccca7d640d3b5707bd (patch)
tree4ed5dab957b3ce288e136d5bfa86e0669b402963 /gcc/gimple-ssa-sprintf.c
parent0cb904afbe28927d4efb343558e641e35580d72c (diff)
downloadgcc-ed30d2a6f4939523e55f54ccca7d640d3b5707bd.zip
gcc-ed30d2a6f4939523e55f54ccca7d640d3b5707bd.tar.gz
gcc-ed30d2a6f4939523e55f54ccca7d640d3b5707bd.tar.bz2
PR target/77676 - powerpc64 and powerpc64le stage2 bootstrap fail
gcc/testsuite/ChangeLog: PR target/77676 * gcc.dg/tree-ssa/builtin-sprintf-1.c: Define and use wint_t. * gcc.dg/tree-ssa/builtin-sprintf-2.c: Fix typo. * gcc.dg/tree-ssa/builtin-sprintf-3.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-5.c: New test. gcc/ChangeLog: PR target/77676 * gimple-ssa-sprintf.c (target_int_min, target_int_max): Use HOST_BITS_PER_WIDE_INT, make a static local variable auto. (target_int_min): Correct computation. (format_integer): Use long long as the argument for the ll length modifier. (format_floating): Use target_int_max(). (get_string_length): Same. (format_string): Avoid setting the bounded flag for strings of unknown length. (try_substitute_return_value): Avoid setting range info when the result isn't bounded. * varasm.c (assemble_name): Increase buffer size. From-SVN: r240383
Diffstat (limited to 'gcc/gimple-ssa-sprintf.c')
-rw-r--r--gcc/gimple-ssa-sprintf.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index 5ababe2..2e15149 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -210,9 +210,9 @@ struct format_result
static HOST_WIDE_INT
target_int_min ()
{
- static const unsigned HOST_WIDE_INT int_min
- = 1LLU << (sizeof int_min * CHAR_BIT
- - TYPE_PRECISION (integer_type_node) + 1);
+ const unsigned HOST_WIDE_INT int_min
+ = HOST_WIDE_INT_M1U << (TYPE_PRECISION (integer_type_node) - 1);
+
return int_min;
}
@@ -221,8 +221,8 @@ target_int_min ()
static unsigned HOST_WIDE_INT
target_int_max ()
{
- static const unsigned HOST_WIDE_INT int_max
- = HOST_WIDE_INT_M1U >> (sizeof int_max * CHAR_BIT
+ const unsigned HOST_WIDE_INT int_max
+ = HOST_WIDE_INT_M1U >> (HOST_BITS_PER_WIDE_INT
- TYPE_PRECISION (integer_type_node) + 1);
return int_max;
}
@@ -851,7 +851,9 @@ format_integer (const conversion_spec &spec, tree arg)
case FMT_LEN_L:
case FMT_LEN_ll:
- dirtype = sign ? long_integer_type_node : long_unsigned_type_node;
+ dirtype = (sign
+ ? long_long_integer_type_node
+ : long_long_unsigned_type_node);
break;
case FMT_LEN_z:
@@ -1366,7 +1368,7 @@ format_floating (const conversion_spec &spec, tree arg)
*minmax[i] = mpfr_snprintf (NULL, 0, fmtstr, mpfrval);
}
- res.bounded = res.range.min < HOST_WIDE_INT_MAX;
+ res.bounded = res.range.min < target_int_max ();
return res;
}
@@ -1420,7 +1422,7 @@ get_string_length (tree str)
/* Set RES.BOUNDED to true if and only if all strings referenced
by STR are known to be bounded (though not necessarily by their
actual length but perhaps by their maximum possible length). */
- res.bounded = res.range.max < HOST_WIDE_INT_MAX;
+ res.bounded = res.range.max < target_int_max ();
/* Set RES.CONSTANT to false even though that may be overly
conservative in rare cases like: 'x ? a : b' where a and
@@ -1471,6 +1473,10 @@ format_string (const conversion_spec &spec, tree arg)
: 2 == warn_format_length ? 0 <= prec ? prec : 1
: HOST_WIDE_INT_MAX);
+ /* The result is bounded unless overriddden for a non-constant string
+ of an unknown length. */
+ bool bounded = true;
+
if (spec.specifier == 'c')
{
if (spec.modifier == FMT_LEN_l)
@@ -1550,16 +1556,17 @@ format_string (const conversion_spec &spec, tree arg)
if (0 <= prec)
{
if ((unsigned)prec < slen.range.min
- || slen.range.min >= HOST_WIDE_INT_MAX)
+ || slen.range.min >= target_int_max ())
slen.range.min = prec;
if ((unsigned)prec < slen.range.max
- || slen.range.max >= HOST_WIDE_INT_MAX)
+ || slen.range.max >= target_int_max ())
slen.range.max = prec;
}
- else if (slen.range.min >= HOST_WIDE_INT_MAX)
+ else if (slen.range.min >= target_int_max ())
{
slen.range.min = max_bytes_for_unknown_str;
slen.range.max = max_bytes_for_unknown_str;
+ bounded = false;
}
res.range = slen.range;
@@ -1580,7 +1587,8 @@ format_string (const conversion_spec &spec, tree arg)
res.range.max = width;
/* Adjust BOUNDED if width happens to make them equal. */
- if (res.range.min == res.range.max && res.range.min < HOST_WIDE_INT_MAX)
+ if (res.range.min == res.range.max && res.range.min < target_int_max ()
+ && bounded)
res.bounded = true;
return res;
@@ -2389,6 +2397,7 @@ try_substitute_return_value (gimple_stmt_iterator gsi,
unsigned HOST_WIDE_INT maxbytes;
if (lhs
+ && res.bounded
&& ((maxbytes = res.number_chars - 1) <= target_int_max ()
|| (res.number_chars_min - 1 <= target_int_max ()
&& (maxbytes = res.number_chars_max - 1) <= target_int_max ()))