From: jakub Date: Fri, 2 Feb 2007 12:21:13 +0000 (+0000) Subject: PR middle-end/30473 X-Git-Tag: upstream/4.9.2~50657 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=72dfb3f2bdf12e1be6f737c38362ba76f1c93991;p=platform%2Fupstream%2Flinaro-gcc.git PR middle-end/30473 * builtins.c (fold_builtin_sprintf): Do not attempt to optimize sprintf (str, "%s"). Do not optimize sprintf (str, "nopercent", p++). * gcc.dg/pr30473.c: New test. * gcc.c-torture/execute/20070201-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121495 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e1cefa..25b8df0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-02-02 Jakub Jelinek + + PR middle-end/30473 + * builtins.c (fold_builtin_sprintf): Do not attempt to optimize + sprintf (str, "%s"). Do not optimize sprintf (str, "nopercent", p++). + 2007-02-02 Maxim Kuvyrkov * sched-int.h (ds_to_dk, dk_to_ds): Declare functions. diff --git a/gcc/builtins.c b/gcc/builtins.c index 73d0a11..5b9a87f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -10553,6 +10553,7 @@ fold_builtin_sprintf (tree arglist, int ignored) /* Get the destination string and the format specifier. */ dest = TREE_VALUE (arglist); fmt = TREE_VALUE (TREE_CHAIN (arglist)); + arglist = TREE_CHAIN (TREE_CHAIN (arglist)); /* Check whether the format is a literal string constant. */ fmt_str = c_getstr (fmt); @@ -10573,6 +10574,10 @@ fold_builtin_sprintf (tree arglist, int ignored) if (!fn) return NULL_TREE; + /* Don't optimize sprintf (buf, "abc", ptr++). */ + if (arglist) + return NULL_TREE; + /* Convert sprintf (str, fmt) into strcpy (str, fmt) when 'format' is known to contain no % formats. */ arglist = build_tree_list (NULL_TREE, fmt); @@ -10591,8 +10596,12 @@ fold_builtin_sprintf (tree arglist, int ignored) if (!fn) return NULL_TREE; + /* Don't crash on sprintf (str1, "%s"). */ + if (!arglist) + return NULL_TREE; + /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2). */ - orig = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); + orig = TREE_VALUE (arglist); arglist = build_tree_list (NULL_TREE, orig); arglist = tree_cons (NULL_TREE, dest, arglist); if (!ignored) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 31d23b7..e699db6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-02-02 Jakub Jelinek + + PR middle-end/30473 + * gcc.dg/pr30473.c: New test. + * gcc.c-torture/execute/20070201-1.c: New test. + 2007-02-01 Roger Sayle * gfortran.dg/dependency_20.f90: New test case. diff --git a/gcc/testsuite/gcc.c-torture/execute/20070201-1.c b/gcc/testsuite/gcc.c-torture/execute/20070201-1.c new file mode 100644 index 0000000..c676c34 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20070201-1.c @@ -0,0 +1,20 @@ +/* PR middle-end/30473 */ + +extern int sprintf (char *, const char *, ...); +extern void abort (void); + +char * +foo (char *buf, char *p) +{ + sprintf (buf, "abcde", p++); + return p; +} + +int +main (void) +{ + char buf[6]; + if (foo (buf, &buf[2]) != &buf[3]) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr30473.c b/gcc/testsuite/gcc.dg/pr30473.c new file mode 100644 index 0000000..f01c1cc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr30473.c @@ -0,0 +1,13 @@ +/* PR middle-end/30473 */ +/* Make sure this doesn't ICE. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern int sprintf (char *, const char *, ...); + +void +foo (char *buf1, char *buf2) +{ + sprintf (buf1, "%s", "abcde"); + sprintf (buf2, "%s"); +}