diff options
| author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-21 12:35:55 +0000 |
|---|---|---|
| committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-21 12:35:55 +0000 |
| commit | 8b151587bb45dfb8930ea5dc03beadffacf1a7e5 (patch) | |
| tree | 073f9964a4c1cad83a1b9ebcba599d787632e79d | |
| parent | 50f0ca0a0d7f9b6a4e94b4c42f59f4cee2c1a7f1 (diff) | |
| download | ppe42-gcc-8b151587bb45dfb8930ea5dc03beadffacf1a7e5.tar.gz ppe42-gcc-8b151587bb45dfb8930ea5dc03beadffacf1a7e5.zip | |
2005-05-21 Richard Guenther <rguenth@gcc.gnu.org>
* tree-stdarg.c (execute_optimize_stdarg): Handle references
to va_list of the form &va[0].
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100043 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/tree-stdarg.c | 24 |
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f503efb986f..e7e90f051f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-05-21 Richard Guenther <rguenth@gcc.gnu.org> + + * tree-stdarg.c (execute_optimize_stdarg): Handle references + to va_list of the form &va[0]. + 2005-05-20 Jan Hubicka <jh@suse.cz> * Makefile.in (insn-emit.o): Add basic-block.h dependency. diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index 5c3b81b724a..c0d16b1b31e 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -660,16 +660,30 @@ execute_optimize_stdarg (void) si.va_start_count++; ap = TREE_VALUE (TREE_OPERAND (call, 1)); - if (TREE_CODE (ap) != ADDR_EXPR - || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (ap, 0))) - != TYPE_MAIN_VARIANT (va_list_type_node) - || TREE_CODE (TREE_OPERAND (ap, 0)) != VAR_DECL) + + if (TREE_CODE (ap) != ADDR_EXPR) { va_list_escapes = true; break; } - ap = TREE_OPERAND (ap, 0); + if (TREE_CODE (ap) == ARRAY_REF) + { + if (! integer_zerop (TREE_OPERAND (ap, 1))) + { + va_list_escapes = true; + break; + } + ap = TREE_OPERAND (ap, 0); + } + if (TYPE_MAIN_VARIANT (TREE_TYPE (ap)) + != TYPE_MAIN_VARIANT (va_list_type_node) + || TREE_CODE (ap) != VAR_DECL) + { + va_list_escapes = true; + break; + } + if (is_global_var (ap)) { va_list_escapes = true; |

