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
This commit is contained in:
parent
bc359d3a5d
commit
bcb38cc180
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
28
gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c
Normal file
28
gcc/testsuite/gcc.c-torture/execute/stdio-opt-1.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user