aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2002-06-22 14:26:53 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2002-06-22 14:26:53 +0000
commitfaa964e5dda34710242358b008fef50b4b8c23a9 (patch)
treec2fdc1b8aa713e2ea10864992b871f7eafaf874f
parent7ae3e57c3a18499f14adc49ea8cb65890c254010 (diff)
downloadgcc-faa964e5dda34710242358b008fef50b4b8c23a9.zip
gcc-faa964e5dda34710242358b008fef50b4b8c23a9.tar.gz
gcc-faa964e5dda34710242358b008fef50b4b8c23a9.tar.bz2
re PR middle-end/6963 (Linux kernel miscompile due to clobbered MEM_SIZE)
PR middle-end/6963 * function.c (assign_stack_temp_for_type): Do not return the same MEM rtx for multiple uses of a stack slot. From-SVN: r54912
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/function.c24
2 files changed, 17 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f4c29d9..261874d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-06-22 Ulrich Weigand <uweigand@de.ibm.com>
+
+ PR middle-end/6963
+ * function.c (assign_stack_temp_for_type): Do not return
+ the same MEM rtx for multiple uses of a stack slot.
+
2002-06-22 David S. Miller <davem@redhat.com>
PR target/6841 target/6770 target/6719
diff --git a/gcc/function.c b/gcc/function.c
index 4a963dc..b2008b1 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -642,6 +642,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
{
unsigned int align;
struct temp_slot *p, *best_p = 0;
+ rtx slot;
/* If SIZE is -1 it means that somebody tried to allocate a temporary
of a variable size. */
@@ -787,29 +788,26 @@ assign_stack_temp_for_type (mode, size, keep, type)
p->keep = keep;
}
- /* We may be reusing an old slot, so clear any MEM flags that may have been
- set from before. */
- RTX_UNCHANGING_P (p->slot) = 0;
- MEM_IN_STRUCT_P (p->slot) = 0;
- MEM_SCALAR_P (p->slot) = 0;
- MEM_VOLATILE_P (p->slot) = 0;
- set_mem_alias_set (p->slot, 0);
+
+ /* Create a new MEM rtx to avoid clobbering MEM flags of old slots. */
+ slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
+ stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
/* If we know the alias set for the memory that will be used, use
it. If there's no TYPE, then we don't know anything about the
alias set for the memory. */
- set_mem_alias_set (p->slot, type ? get_alias_set (type) : 0);
- set_mem_align (p->slot, align);
+ set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
+ set_mem_align (slot, align);
/* If a type is specified, set the relevant flags. */
if (type != 0)
{
- RTX_UNCHANGING_P (p->slot) = TYPE_READONLY (type);
- MEM_VOLATILE_P (p->slot) = TYPE_VOLATILE (type);
- MEM_SET_IN_STRUCT_P (p->slot, AGGREGATE_TYPE_P (type));
+ RTX_UNCHANGING_P (slot) = TYPE_READONLY (type);
+ MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
+ MEM_SET_IN_STRUCT_P (slot, AGGREGATE_TYPE_P (type));
}
- return p->slot;
+ return slot;
}
/* Allocate a temporary stack slot and record it for possible later