summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormsebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-03 20:38:30 +0000
committermsebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-03 20:38:30 +0000
commitcb442e5128c9b902986b0097b1b4c01f2d284783 (patch)
tree8e3d75d5168c0b68ab7bdbbb2f7b0e8551b53fd9
parent13da18cc2861989928a29c0dfe500aa42891678e (diff)
downloadgcc-cb442e5128c9b902986b0097b1b4c01f2d284783.tar.gz
gcc/ChangeLog:
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use offset_int::from instead of wide_int::to_shwi. (maybe_diag_overlap): Remove assertion. Use HOST_WIDE_INT_PRINT_DEC instead of %lli. * gimple-ssa-sprintf.c (format_directive): Same. (parse_directive): Same. (sprintf_dom_walker::compute_format_length): Same. (try_substitute_return_value): Same. gcc/testsuite/ChangeLog: * gcc.dg/Wrestrict-3.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256187 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/gimple-ssa-sprintf.c73
-rw-r--r--gcc/gimple-ssa-warn-restrict.c39
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/Wrestrict-3.c17
5 files changed, 96 insertions, 48 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f570eb4e606..10e8d9ee513 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2018-01-03 Martin Sebor <msebor@redhat.com>
+
+ * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use
+ offset_int::from instead of wide_int::to_shwi.
+ (maybe_diag_overlap): Remove assertion.
+ Use HOST_WIDE_INT_PRINT_DEC instead of %lli.
+ * gimple-ssa-sprintf.c (format_directive): Same.
+ (parse_directive): Same.
+ (sprintf_dom_walker::compute_format_length): Same.
+ (try_substitute_return_value): Same.
+
2017-01-03 Jeff Law <law@redhat.com>
PR middle-end/83654
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index b7d7cd55f7a..7d16bbd16f8 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -2995,16 +2995,16 @@ format_directive (const sprintf_dom_walker::call_info &info,
if (dump_file && *dir.beg)
{
- fprintf (dump_file, " Result: %lli, %lli, %lli, %lli "
- "(%lli, %lli, %lli, %lli)\n",
- (long long)fmtres.range.min,
- (long long)fmtres.range.likely,
- (long long)fmtres.range.max,
- (long long)fmtres.range.unlikely,
- (long long)res->range.min,
- (long long)res->range.likely,
- (long long)res->range.max,
- (long long)res->range.unlikely);
+ fprintf (dump_file,
+ " Result: "
+ HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ", "
+ HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC " ("
+ HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ", "
+ HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC ")\n",
+ fmtres.range.min, fmtres.range.likely,
+ fmtres.range.max, fmtres.range.unlikely,
+ res->range.min, res->range.likely,
+ res->range.max, res->range.unlikely);
}
return true;
@@ -3035,11 +3035,12 @@ parse_directive (sprintf_dom_walker::call_info &info,
if (dump_file)
{
- fprintf (dump_file, " Directive %u at offset %llu: \"%.*s\", "
- "length = %llu\n",
+ fprintf (dump_file, " Directive %u at offset "
+ HOST_WIDE_INT_PRINT_UNSIGNED ": \"%.*s\", "
+ "length = " HOST_WIDE_INT_PRINT_UNSIGNED "\n",
dir.dirno,
- (unsigned long long)(size_t)(dir.beg - info.fmtstr),
- (int)dir.len, dir.beg, (unsigned long long)dir.len);
+ (unsigned HOST_WIDE_INT)(size_t)(dir.beg - info.fmtstr),
+ (int)dir.len, dir.beg, dir.len);
}
return len - !*str;
@@ -3411,25 +3412,34 @@ parse_directive (sprintf_dom_walker::call_info &info,
if (dump_file)
{
- fprintf (dump_file, " Directive %u at offset %llu: \"%.*s\"",
- dir.dirno, (unsigned long long)(size_t)(dir.beg - info.fmtstr),
+ fprintf (dump_file,
+ " Directive %u at offset " HOST_WIDE_INT_PRINT_UNSIGNED
+ ": \"%.*s\"",
+ dir.dirno,
+ (unsigned HOST_WIDE_INT)(size_t)(dir.beg - info.fmtstr),
(int)dir.len, dir.beg);
if (star_width)
{
if (dir.width[0] == dir.width[1])
- fprintf (dump_file, ", width = %lli", (long long)dir.width[0]);
+ fprintf (dump_file, ", width = " HOST_WIDE_INT_PRINT_DEC,
+ dir.width[0]);
else
- fprintf (dump_file, ", width in range [%lli, %lli]",
- (long long)dir.width[0], (long long)dir.width[1]);
+ fprintf (dump_file,
+ ", width in range [" HOST_WIDE_INT_PRINT_DEC
+ ", " HOST_WIDE_INT_PRINT_DEC "]",
+ dir.width[0], dir.width[1]);
}
if (star_precision)
{
if (dir.prec[0] == dir.prec[1])
- fprintf (dump_file, ", precision = %lli", (long long)dir.prec[0]);
+ fprintf (dump_file, ", precision = " HOST_WIDE_INT_PRINT_DEC,
+ dir.prec[0]);
else
- fprintf (dump_file, ", precision in range [%lli, %lli]",
- (long long)dir.prec[0], (long long)dir.prec[1]);
+ fprintf (dump_file,
+ ", precision in range [" HOST_WIDE_INT_PRINT_DEC
+ HOST_WIDE_INT_PRINT_DEC "]",
+ dir.prec[0], dir.prec[1]);
}
fputc ('\n', dump_file);
}
@@ -3455,8 +3465,10 @@ sprintf_dom_walker::compute_format_length (call_info &info,
LOCATION_FILE (callloc), LOCATION_LINE (callloc));
print_generic_expr (dump_file, info.func, dump_flags);
- fprintf (dump_file, ": objsize = %llu, fmtstr = \"%s\"\n",
- (unsigned long long)info.objsize, info.fmtstr);
+ fprintf (dump_file,
+ ": objsize = " HOST_WIDE_INT_PRINT_UNSIGNED
+ ", fmtstr = \"%s\"\n",
+ info.objsize, info.fmtstr);
}
/* Reset the minimum and maximum byte counters. */
@@ -3682,13 +3694,14 @@ try_substitute_return_value (gimple_stmt_iterator *gsi,
const char *what = setrange ? "Setting" : "Discarding";
if (retval[0] != retval[1])
fprintf (dump_file,
- " %s %s-bounds return value range [%llu, %llu].\n",
- what, inbounds,
- (unsigned long long)retval[0],
- (unsigned long long)retval[1]);
+ " %s %s-bounds return value range ["
+ HOST_WIDE_INT_PRINT_UNSIGNED ", "
+ HOST_WIDE_INT_PRINT_UNSIGNED "].\n",
+ what, inbounds, retval[0], retval[1]);
else
- fprintf (dump_file, " %s %s-bounds return value %llu.\n",
- what, inbounds, (unsigned long long)retval[0]);
+ fprintf (dump_file, " %s %s-bounds return value "
+ HOST_WIDE_INT_PRINT_UNSIGNED ".\n",
+ what, inbounds, retval[0]);
}
}
diff --git a/gcc/gimple-ssa-warn-restrict.c b/gcc/gimple-ssa-warn-restrict.c
index 9b367979c8b..8bae73dd42b 100644
--- a/gcc/gimple-ssa-warn-restrict.c
+++ b/gcc/gimple-ssa-warn-restrict.c
@@ -276,13 +276,13 @@ builtin_memref::builtin_memref (tree expr, tree size)
value_range_type rng = get_range_info (offset, &min, &max);
if (rng == VR_RANGE)
{
- offrange[0] = min.to_shwi ();
- offrange[1] = max.to_shwi ();
+ offrange[0] = offset_int::from (min, SIGNED);
+ offrange[1] = offset_int::from (max, SIGNED);
}
else if (rng == VR_ANTI_RANGE)
{
- offrange[0] = (max + 1).to_shwi ();
- offrange[1] = (min - 1).to_shwi ();
+ offrange[0] = offset_int::from (max + 1, SIGNED);
+ offrange[1] = offset_int::from (min - 1, SIGNED);
}
else
{
@@ -1233,25 +1233,31 @@ maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
if (dstref.offrange[0] == dstref.offrange[1]
|| dstref.offrange[1] > HOST_WIDE_INT_MAX)
- sprintf (offstr[0], "%lli", (long long) dstref.offrange[0].to_shwi ());
+ sprintf (offstr[0], HOST_WIDE_INT_PRINT_DEC,
+ dstref.offrange[0].to_shwi ());
else
- sprintf (offstr[0], "[%lli, %lli]",
- (long long) dstref.offrange[0].to_shwi (),
- (long long) dstref.offrange[1].to_shwi ());
+ sprintf (offstr[0],
+ "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+ dstref.offrange[0].to_shwi (),
+ dstref.offrange[1].to_shwi ());
if (srcref.offrange[0] == srcref.offrange[1]
|| srcref.offrange[1] > HOST_WIDE_INT_MAX)
- sprintf (offstr[1], "%lli", (long long) srcref.offrange[0].to_shwi ());
+ sprintf (offstr[1],
+ HOST_WIDE_INT_PRINT_DEC,
+ srcref.offrange[0].to_shwi ());
else
- sprintf (offstr[1], "[%lli, %lli]",
- (long long) srcref.offrange[0].to_shwi (),
- (long long) srcref.offrange[1].to_shwi ());
+ sprintf (offstr[1],
+ "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+ srcref.offrange[0].to_shwi (),
+ srcref.offrange[1].to_shwi ());
if (ovloff[0] == ovloff[1] || !ovloff[1])
- sprintf (offstr[2], "%lli", (long long) ovloff[0]);
+ sprintf (offstr[2], HOST_WIDE_INT_PRINT_DEC, ovloff[0]);
else
- sprintf (offstr[2], "[%lli, %lli]",
- (long long) ovloff[0], (long long) ovloff[1]);
+ sprintf (offstr[2],
+ "[" HOST_WIDE_INT_PRINT_DEC ", " HOST_WIDE_INT_PRINT_DEC "]",
+ ovloff[0], ovloff[1]);
const offset_int maxobjsize = tree_to_shwi (max_object_size ());
bool must_overlap = ovlsiz[0] > 0;
@@ -1366,9 +1372,6 @@ maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
}
/* Issue "may overlap" diagnostics below. */
- gcc_assert (ovlsiz[0] == 0
- && ovlsiz[1] > 0
- && ovlsiz[1] <= maxobjsize.to_shwi ());
/* Use more concise wording when one of the offsets is unbounded
to avoid confusing the user with large and mostly meaningless
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7c4e6e9a349..55ed428cae7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-01-03 Martin Sebor <msebor@redhat.com>
+
+ * gcc.dg/Wrestrict-3.c: New test.
+
2018-01-03 Jakub Jelinek <jakub@redhat.com>
PR c++/83555
diff --git a/gcc/testsuite/gcc.dg/Wrestrict-3.c b/gcc/testsuite/gcc.dg/Wrestrict-3.c
new file mode 100644
index 00000000000..1204111ea31
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wrestrict-3.c
@@ -0,0 +1,17 @@
+/* Test to verify that the call below with the out-of-bounds offset
+ doesn't trigger an internal assertion and is diagnosed.
+ { dg-do compile }
+ { dg-options "-O2 -Wrestrict" } */
+
+#define DIFF_MAX __PTRDIFF_MAX__
+
+void test_no_ice (int *d, __PTRDIFF_TYPE__ i, __SIZE_TYPE__ n)
+{
+ if (i < DIFF_MAX / sizeof *d - 1 || DIFF_MAX / sizeof *d + 2 < i)
+ i = DIFF_MAX / sizeof *d - 1;
+
+ if (n < DIFF_MAX)
+ n = DIFF_MAX / sizeof *d;
+
+ __builtin_strncpy ((char*)(d + i), (char*)d, n); /* { dg-warning "\\\[-Wrestrict]" } */
+}