From: Richard Stallman Date: Mon, 13 Sep 1993 20:16:51 +0000 (+0000) Subject: (store_constructor): Handle TREE_PURPOSE of array constructor. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=03dc44a6145f85805d12f902da4b1c2efb0a44cc;p=gcc.git (store_constructor): Handle TREE_PURPOSE of array constructor. (expand_expr, ARRAY_REF case): Likewise. From-SVN: r5315 --- diff --git a/gcc/expr.c b/gcc/expr.c index 85b2555eec1..c1bd3c0ab44 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2720,19 +2720,41 @@ store_constructor (exp, target) int bitsize; int bitpos; int unsignedp; + tree index = TREE_PURPOSE (elt); + rtx xtarget = target; mode = TYPE_MODE (elttype); bitsize = GET_MODE_BITSIZE (mode); unsignedp = TREE_UNSIGNED (elttype); - bitpos = (i * TREE_INT_CST_LOW (TYPE_SIZE (elttype))); - - store_field (target, bitsize, bitpos, mode, TREE_VALUE (elt), - /* The alignment of TARGET is - at least what its type requires. */ - VOIDmode, 0, - TYPE_ALIGN (type) / BITS_PER_UNIT, - int_size_in_bytes (type)); + if (index != 0 && TREE_CODE (index) != INTEGER_CST) + { + /* We don't currently allow variable indices in a + C initializer, but let's try here to support them. */ + rtx pos_rtx, addr, xtarget; + tree position; + + position = size_binop (MULT_EXPR, index, TYPE_SIZE (elttype)); + pos_rtx = expand_expr (position, 0, VOIDmode, 0); + addr = gen_rtx (PLUS, Pmode, XEXP (target, 0), pos_rtx); + xtarget = change_address (target, mode, addr); + store_expr (TREE_VALUE (elt), xtarget, 0); + } + else + { + if (index != 0) + bitpos = (TREE_INT_CST_LOW (index) + * TREE_INT_CST_LOW (TYPE_SIZE (elttype))); + else + bitpos = (i * TREE_INT_CST_LOW (TYPE_SIZE (elttype))); + + store_field (xtarget, bitsize, bitpos, mode, TREE_VALUE (elt), + /* The alignment of TARGET is + at least what its type requires. */ + VOIDmode, 0, + TYPE_ALIGN (type) / BITS_PER_UNIT, + int_size_in_bytes (type)); + } } } @@ -4013,7 +4035,8 @@ expand_expr (exp, target, tmode, modifier) { tree elem = CONSTRUCTOR_ELTS (init); - while (elem && i--) + while (elem + && !tree_int_cst_equal (TREE_PURPOSE (elem), index)) elem = TREE_CHAIN (elem); if (elem) return expand_expr (fold (TREE_VALUE (elem)), target,