aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/builtins.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c28
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6d3e052..fcc65c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2000-10-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * builtins.c (expand_builtin_fputs): When deleting NOP calls to
+ builtin fputs, ensure we still evaluate the stream in case it
+ has side-effects.
+
2000-10-31 Jakub Jelinek <jakub@redhat.com>
* expr.c (do_store_flag): Pass operand_mode instead of GET_MODE (op0)
diff --git a/gcc/builtins.c b/gcc/builtins.c
index e2acada..3304b68 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2351,7 +2351,13 @@ expand_builtin_fputs (arglist, ignore)
switch (compare_tree_int (len, 1))
{
case -1: /* length is 0, delete the call entirely . */
- return const0_rtx;
+ {
+ /* Evaluate and ignore the argument in case it has
+ side-effects. */
+ expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
+ VOIDmode, EXPAND_NORMAL);
+ return const0_rtx;
+ }
case 0: /* length is 1, call fputc. */
{
tree stripped_string = TREE_VALUE (arglist);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 33002ac..6097ca2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2000-10-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/execute/stdio-opt-1.c: New test.
+
2000-10-31 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/inline16.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c b/gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c
new file mode 100644
index 0000000..aeb7302
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2000 Free Software Foundation.
+
+ When eliminating NOP calls to builtin fputs, ensure that we still
+ evaluate the stream argument in case it has side effects.
+ Written by Kaveh R. Ghazi, 10/30/2000. */
+
+#include <stdio.h>
+
+int main()
+{
+ FILE *s_array[3] = {stdout, NULL, stdout}, **s_ptr = s_array;
+
+ /* Increment the stream pointer once. */
+ fputs ("", *s_ptr++);
+
+ /* Increment the stream pointer a second time. */
+ s_ptr++;
+
+ /* If we failed to increment the stream pointer twice, then the
+ stream passed in here will be NULL and we should crash. */
+ fputs ("hello world\n", *s_ptr);
+
+ /* Just in case, If *s_ptr is NULL abort anyway. */
+ if (*s_ptr == 0)
+ abort();
+
+ return 0;
+}