From bcb38cc180d1f56eab538f76c2a608e6dfd61da9 Mon Sep 17 00:00:00 2001 From: "Kaveh R. Ghazi" Date: Tue, 31 Oct 2000 18:27:42 +0000 Subject: [PATCH] builtins.c (expand_builtin_fputs): When deleting NOP calls to builtin fputs... * builtins.c (expand_builtin_fputs): When deleting NOP calls to builtin fputs, ensure we still evaluate the stream in case it has side-effects. testsuite: * gcc.c-torture/execute/stdio-opt-1.c: New test. From-SVN: r37162 --- gcc/ChangeLog | 6 ++++ gcc/builtins.c | 8 +++++- gcc/testsuite/ChangeLog | 4 +++ .../gcc.c-torture/execute/stdio-opt-1.c | 28 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d3e05273e7..fcc65c8b8f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2000-10-31 Kaveh R. Ghazi + + * 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 * expr.c (do_store_flag): Pass operand_mode instead of GET_MODE (op0) diff --git a/gcc/builtins.c b/gcc/builtins.c index e2acada22c7..3304b68a46a 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 33002ac0237..6097ca2cc2e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-10-31 Kaveh R. Ghazi + + * gcc.c-torture/execute/stdio-opt-1.c: New test. + 2000-10-31 Jakub Jelinek * 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 00000000000..aeb7302dc93 --- /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 + +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; +} -- 2.30.2