Commit bcb38cc1 by Kaveh R. Ghazi Committed by Kaveh Ghazi

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
parent bc359d3a
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> 2000-10-31 Jakub Jelinek <jakub@redhat.com>
* expr.c (do_store_flag): Pass operand_mode instead of GET_MODE (op0) * expr.c (do_store_flag): Pass operand_mode instead of GET_MODE (op0)
......
...@@ -2351,7 +2351,13 @@ expand_builtin_fputs (arglist, ignore) ...@@ -2351,7 +2351,13 @@ expand_builtin_fputs (arglist, ignore)
switch (compare_tree_int (len, 1)) switch (compare_tree_int (len, 1))
{ {
case -1: /* length is 0, delete the call entirely . */ 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. */ case 0: /* length is 1, call fputc. */
{ {
tree stripped_string = TREE_VALUE (arglist); tree stripped_string = TREE_VALUE (arglist);
......
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> 2000-10-31 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/inline16.C: New test. * g++.old-deja/g++.other/inline16.C: New test.
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment