From: Roger Sayle Date: Wed, 10 Mar 2004 18:37:26 +0000 (+0000) Subject: re PR middle-end/14289 (ICE in a register array) X-Git-Tag: releases/gcc-3.3.4~180 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f59f63dd78f6cfecd397827ba2578a2e6e1abc7;p=thirdparty%2Fgcc.git re PR middle-end/14289 (ICE in a register array) PR middle-end/14289 * c-typeck.c (c_mark_addressable): A register variable should be considered global if its not automatic, i.e. TREE_PUBLIC, TREE_STATIC or DECL_EXTERNAL. * function.c (put_var_into_stack): Call abort when placing a hard register into the stack, if x_parm_reg_stack_loc is NULL. * gcc.dg/pr14289-1.c: New test case. * gcc.dg/pr14289-2.c: Likewise. * gcc.dg/pr14289-3.c: Likewise. From-SVN: r79270 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 380113713592..6365abe7c144 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-03-10 Roger Sayle + + PR middle-end/14289 + * c-typeck.c (c_mark_addressable): A register variable should + be considered global if its not automatic, i.e. TREE_PUBLIC, + TREE_STATIC or DECL_EXTERNAL. + * function.c (put_var_into_stack): Call abort when placing a + hard register into the stack, if x_parm_reg_stack_loc is NULL. + 2004-03-10 Andrew Haley PR optimization/14381 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index aaac6f353f6b..25731f716ebe 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3313,7 +3313,7 @@ c_mark_addressable (exp) if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x) && DECL_NONLOCAL (x)) { - if (TREE_PUBLIC (x)) + if (TREE_PUBLIC (x) || TREE_STATIC (x) || DECL_EXTERNAL (x)) { error ("global register variable `%s' used in nested function", IDENTIFIER_POINTER (DECL_NAME (x))); @@ -3324,7 +3324,7 @@ c_mark_addressable (exp) } else if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)) { - if (TREE_PUBLIC (x)) + if (TREE_PUBLIC (x) || TREE_STATIC (x) || DECL_EXTERNAL (x)) { error ("address of global register variable `%s' requested", IDENTIFIER_POINTER (DECL_NAME (x))); diff --git a/gcc/function.c b/gcc/function.c index cbfec0c93718..604655ad9239 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1499,7 +1499,11 @@ put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p, regno = REGNO (reg); if (regno < func->x_max_parm_reg) - new = func->x_parm_reg_stack_loc[regno]; + { + if (!func->x_parm_reg_stack_loc) + abort (); + new = func->x_parm_reg_stack_loc[regno]; + } if (new == 0) new = assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode), 0, func); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a4e5657edbc..5d00860eec29 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2004-03-10 Roger Sayle + + PR middle-end/14289 + * gcc.dg/pr14289-1.c: New test case. + * gcc.dg/pr14289-2.c: Likewise. + * gcc.dg/pr14289-3.c: Likewise. + 2004-03-09 Giovanni Bajo PR c++/14409