Fix memory corruption probelem in reload.
authorJim Wilson <wilson@cygnus.com>
Wed, 18 Nov 1998 17:52:45 +0000 (17:52 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 18 Nov 1998 17:52:45 +0000 (09:52 -0800)
* reload.c (find_reloads_address_part): If have a CONST_INT, create
a new one before passing it to force_const_mem.

From-SVN: r23698

gcc/ChangeLog
gcc/reload.c

index 9336c23b19423ea5dd30444dbdf287865a248f99..bcc3614c81bf183260c1d2acb27f6405b02195a6 100644 (file)
@@ -1,5 +1,8 @@
 Wed Nov 18 16:31:28 1998  Jim Wilson  <wilson@cygnus.com>
 
+       * reload.c (find_reloads_address_part): If have a CONST_INT, create
+       a new one before passing it to force_const_mem.
+
        * reload.c (find_reloads_toplev): Pass &x instead of NULL_PTR in
        find_reloads_address call.
 
index 0be683e353702d81045a7e97e21c462fbc222a76..9e59eba19834bf2c15be8df732ac3141299b7337 100644 (file)
@@ -5517,7 +5517,20 @@ find_reloads_address_part (x, loc, class, mode, opnum, type, ind_levels)
       && (! LEGITIMATE_CONSTANT_P (x)
          || PREFERRED_RELOAD_CLASS (x, class) == NO_REGS))
     {
-      rtx tem = x = force_const_mem (mode, x);
+      rtx tem;
+
+      /* If this is a CONST_INT, it could have been created by a
+        plus_constant call in eliminate_regs, which means it may be
+        on the reload_obstack.  reload_obstack will be freed later, so
+        we can't allow such RTL to be put in the constant pool.  There
+        is code in force_const_mem to check for this case, but it doesn't
+        work because we have already popped off the reload_obstack, so
+        rtl_obstack == saveable_obstack is true at this point.  */
+      if (GET_CODE (x) == CONST_INT)
+       tem = x = force_const_mem (mode, GEN_INT (INTVAL (x)));
+      else
+       tem = x = force_const_mem (mode, x);
+
       find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
                            opnum, type, ind_levels, 0);
     }
@@ -5527,7 +5540,13 @@ find_reloads_address_part (x, loc, class, mode, opnum, type, ind_levels)
           && (! LEGITIMATE_CONSTANT_P (XEXP (x, 1))
               || PREFERRED_RELOAD_CLASS (XEXP (x, 1), class) == NO_REGS))
     {
-      rtx tem = force_const_mem (GET_MODE (x), XEXP (x, 1));
+      rtx tem;
+
+      /* See comment above.  */
+      if (GET_CODE (XEXP (x, 1)) == CONST_INT)
+       tem = force_const_mem (GET_MODE (x), GEN_INT (INTVAL (XEXP (x, 1))));
+      else
+       tem = force_const_mem (GET_MODE (x), XEXP (x, 1));
 
       x = gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0), tem);
       find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),