From: Ulrich Weigand Date: Sat, 22 Jun 2002 14:29:26 +0000 (+0000) Subject: re PR middle-end/6963 (Linux kernel miscompile due to clobbered MEM_SIZE) X-Git-Tag: releases/gcc-3.1.1~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4f7bef51960b417651739863b0ef6a62f51f195;p=thirdparty%2Fgcc.git 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: r54913 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bf92a1b14640..32d5119fe5fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-06-22 Ulrich Weigand + + 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 PR target/6841 target/6770 target/6719 diff --git a/gcc/function.c b/gcc/function.c index 72c64a059257..9ddf676b5aba 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -666,6 +666,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. */ @@ -811,29 +812,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