diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2002-06-22 14:26:53 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2002-06-22 14:26:53 +0000 |
commit | faa964e5dda34710242358b008fef50b4b8c23a9 (patch) | |
tree | c2fdc1b8aa713e2ea10864992b871f7eafaf874f | |
parent | 7ae3e57c3a18499f14adc49ea8cb65890c254010 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/function.c | 24 |
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 |