From: Richard Kenner Date: Thu, 4 Mar 2004 22:00:59 +0000 (+0000) Subject: expr.c (expand_expr_real, [...]): Get proper type of stack slot for temp used for... X-Git-Tag: releases/gcc-4.0.0~9621 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=daae8185c813fc4970409ccb50231607494ca0f2;p=thirdparty%2Fgcc.git expr.c (expand_expr_real, [...]): Get proper type of stack slot for temp used for result of BLKmode but in... * expr.c (expand_expr_real, case COMPONENT_REF): Get proper type of stack slot for temp used for result of BLKmode but in integral mode. From-SVN: r78937 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f126b1c591b9..a141cc97684c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-03-04 Richard Kenner + + * expr.c (expand_expr_real, case COMPONENT_REF): Get proper type of + stack slot for temp used for result of BLKmode but in integral mode. + 2004-03-04 Jan Hubicka * reload.c (find_reloads): Reorganize if seqeunce to switch. diff --git a/gcc/expr.c b/gcc/expr.c index 14809498a937..9bd27402768d 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7240,12 +7240,19 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode, - bitsize), op0, 1); + /* If the result type is BLKmode, store the data into a temporary + of the appropriate type, but with the mode corresponding to the + mode for the data we have (op0's mode). It's tempting to make + this a constant type, since we know it's only being stored once, + but that can cause problems if we are taking the address of this + COMPONENT_REF because the MEM of any reference via that address + will have flags corresponding to the type, which will not + necessarily be constant. */ if (mode == BLKmode) { - rtx new = assign_temp (build_qualified_type - ((*lang_hooks.types.type_for_mode) - (ext_mode, 0), - TYPE_QUAL_CONST), 0, 1, 1); + rtx new + = assign_stack_temp_for_type + (ext_mode, GET_MODE_BITSIZE (ext_mode), 0, type); emit_move_insn (new, op0); op0 = copy_rtx (new);