]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
emit-rtl.c (set_decl_incoming_rtl): New.
authorJosef Zlomek <zlomekj@suse.cz>
Tue, 10 Feb 2004 18:38:19 +0000 (19:38 +0100)
committerJosef Zlomek <zlomek@gcc.gnu.org>
Tue, 10 Feb 2004 18:38:19 +0000 (18:38 +0000)
PR/14058
* emit-rtl.c (set_decl_incoming_rtl): New.
* tree.h (set_decl_incoming_rtl): New.
* function.c (assign_parms): Use set_decl_incoming_rtl for setting
DECL_INCOMING_RTL.
* ada/misc.c (adjust_decl_rtl): Likewise.

From-SVN: r77611

gcc/ChangeLog
gcc/ada/misc.c
gcc/emit-rtl.c
gcc/function.c
gcc/tree.h

index ba6a78534f825285887157677925b5579c01fbf8..a3e050d89904f82f598013077909f00a8fbb85b2 100644 (file)
@@ -1,3 +1,12 @@
+2004-02-10  Josef Zlomek  <zlomekj@suse.cz>
+
+       PR/14058
+       * emit-rtl.c (set_decl_incoming_rtl): New.
+       * tree.h (set_decl_incoming_rtl): New.
+       * function.c (assign_parms): Use set_decl_incoming_rtl for setting
+       DECL_INCOMING_RTL.
+       * ada/misc.c (adjust_decl_rtl): Likewise.
+
 2004-02-10  Per Bothner  <per@bothner.com>
 
        * c-opts.c (c_common_post_options):   Don't emit working directory
index 7e544fb1fda2c92114a44ca2b820b8af32d7b75e..6a40590df9f02a1520726b4af06e84aaf18e6699 100644 (file)
@@ -774,7 +774,7 @@ adjust_decl_rtl (tree decl)
       DECL_SIZE (decl) = TYPE_SIZE (new_type);
 
       if (TREE_CODE (decl) == PARM_DECL)
-       DECL_INCOMING_RTL (decl) = XEXP (DECL_INCOMING_RTL (decl), 0);
+       set_decl_incoming_rtl (decl, XEXP (DECL_INCOMING_RTL (decl), 0));
 
       /* If DECL_INITIAL was set, it should be updated to show that
         the decl is initialized to the address of that thing.
index 6402f43dd5ccdbdbd03164c5f1028924c624abf0..814e2bb5bcb316e235cb0a6ccc308cb086ffcc24 100644 (file)
@@ -828,6 +828,40 @@ set_decl_rtl (tree t, rtx x)
     }
 }
 
+/* Assign the RTX X to parameter declaration T.  */
+void
+set_decl_incoming_rtl (tree t, rtx x)
+{
+  DECL_INCOMING_RTL (t) = x;
+
+  if (!x)
+    return;
+  /* For register, we maintain the reverse information too.  */
+  if (GET_CODE (x) == REG)
+    REG_ATTRS (x) = get_reg_attrs (t, 0);
+  else if (GET_CODE (x) == SUBREG)
+    REG_ATTRS (SUBREG_REG (x))
+      = get_reg_attrs (t, -SUBREG_BYTE (x));
+  if (GET_CODE (x) == CONCAT)
+    {
+      if (REG_P (XEXP (x, 0)))
+        REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
+      if (REG_P (XEXP (x, 1)))
+       REG_ATTRS (XEXP (x, 1))
+         = get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
+    }
+  if (GET_CODE (x) == PARALLEL)
+    {
+      int i;
+      for (i = 0; i < XVECLEN (x, 0); i++)
+       {
+         rtx y = XVECEXP (x, 0, i);
+         if (REG_P (XEXP (y, 0)))
+           REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
+       }
+    }
+}
+
 /* Identify REG (which may be a CONCAT) as a user register.  */
 
 void
index 6596e0e383959f24d1095267ef5ff3ad939f1414..e2024f2b26c1ea3f3c1466769de215466527a02b 100644 (file)
@@ -4645,7 +4645,7 @@ assign_parms (tree fndecl)
        entry_parm = stack_parm;
 
       /* Record permanently how this parm was passed.  */
-      DECL_INCOMING_RTL (parm) = entry_parm;
+      set_decl_incoming_rtl (parm, entry_parm);
 
       /* If there is actually space on the stack for this parm,
         count it in stack_args_size; otherwise set stack_parm to 0
@@ -4714,7 +4714,7 @@ assign_parms (tree fndecl)
                && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
              {
                entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
-               DECL_INCOMING_RTL (parm) = entry_parm;
+               set_decl_incoming_rtl (parm, entry_parm);
                break;
              }
        }
@@ -5225,20 +5225,22 @@ assign_parms (tree fndecl)
        {
          if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE)
            {
+             rtx tmp;
+
              SET_DECL_RTL (parm,
                            gen_rtx_CONCAT (DECL_MODE (parm),
                                            DECL_RTL (fnargs),
                                            DECL_RTL (TREE_CHAIN (fnargs))));
-             DECL_INCOMING_RTL (parm)
-               = gen_rtx_CONCAT (DECL_MODE (parm),
-                                 DECL_INCOMING_RTL (fnargs),
-                                 DECL_INCOMING_RTL (TREE_CHAIN (fnargs)));
+             tmp = gen_rtx_CONCAT (DECL_MODE (parm),
+                                   DECL_INCOMING_RTL (fnargs),
+                                   DECL_INCOMING_RTL (TREE_CHAIN (fnargs)));
+             set_decl_incoming_rtl (parm, tmp);
              fnargs = TREE_CHAIN (fnargs);
            }
          else
            {
              SET_DECL_RTL (parm, DECL_RTL (fnargs));
-             DECL_INCOMING_RTL (parm) = DECL_INCOMING_RTL (fnargs);
+             set_decl_incoming_rtl (parm, DECL_INCOMING_RTL (fnargs));
            }
          fnargs = TREE_CHAIN (fnargs);
        }
index 5b075d9ad4c91259d6e85ee5798ffcb8c1aa453a..6f19cab177a404430115d77b54752bb74ad7df80 100644 (file)
@@ -3080,6 +3080,7 @@ extern const char *dump_flag_name (enum tree_dump_index);
 /* Assign the RTX to declaration.  */
 
 extern void set_decl_rtl (tree, rtx);
+extern void set_decl_incoming_rtl (tree, rtx);
 \f
 /* Redefine abort to report an internal error w/o coredump, and
    reporting the location of the error in the source file.  This logic