]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/14289 (ICE in a register array)
authorRoger Sayle <roger@eyesopen.com>
Wed, 10 Mar 2004 18:37:26 +0000 (18:37 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 10 Mar 2004 18:37:26 +0000 (18:37 +0000)
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

gcc/ChangeLog
gcc/c-typeck.c
gcc/function.c
gcc/testsuite/ChangeLog

index 380113713592c554446225b6117d98749346fa21..6365abe7c14423386788e306abc24414b3d7450d 100644 (file)
@@ -1,3 +1,12 @@
+2004-03-10  Roger Sayle  <roger@eyesopen.com>
+
+       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  <aph@redhat.com>
 
        PR optimization/14381
index aaac6f353f6bd650d0724dbdc03f82ecc1b1bf8c..25731f716ebe5f65bed94a15c6ab64595b653ce8 100644 (file)
@@ -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)));
index cbfec0c937183bc24fe05f550267a760e65f5688..604655ad9239ff70af86991b51eaba2ff4aab040 100644 (file)
@@ -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);
index 2a4e5657edbc063e8d67b5c2316c1b946880eb1d..5d00860eec298c234525ee58da4d0356083026b5 100644 (file)
@@ -1,3 +1,10 @@
+2004-03-10  Roger Sayle  <roger@eyesopen.com>
+
+       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  <giovannibajo@gcc.gnu.org>
 
        PR c++/14409