diff options
author | Jim Wilson <wilson@cygnus.com> | 1998-11-18 17:52:45 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1998-11-18 09:52:45 -0800 |
commit | ef18065c0ad435acad2bb2562d53a3d5db6c731f (patch) | |
tree | f539ac17b4d4edc798e64ba1abc5ce4cbdee69f4 | |
parent | 10352226d401ad4958b61bb3124309b387320711 (diff) | |
download | gcc-ef18065c0ad435acad2bb2562d53a3d5db6c731f.zip gcc-ef18065c0ad435acad2bb2562d53a3d5db6c731f.tar.gz gcc-ef18065c0ad435acad2bb2562d53a3d5db6c731f.tar.bz2 |
Fix memory corruption probelem in reload.
* 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
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/reload.c | 23 |
2 files changed, 24 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9336c23..bcc3614 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/reload.c b/gcc/reload.c index 0be683e..9e59eba 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -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), |