aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPer Bothner <bothner@gcc.gnu.org>1996-06-05 12:55:01 -0700
committerPer Bothner <bothner@gcc.gnu.org>1996-06-05 12:55:01 -0700
commit8311a11f170297cb47767a206b1ba852d9ae7b26 (patch)
tree6d5987e07d71de5a28f47a1b2281562da6892366
parent7d49f59f4fab6f5c5b46c11fe7726f8cd69399e1 (diff)
downloadgcc-8311a11f170297cb47767a206b1ba852d9ae7b26.zip
gcc-8311a11f170297cb47767a206b1ba852d9ae7b26.tar.gz
gcc-8311a11f170297cb47767a206b1ba852d9ae7b26.tar.bz2
* varasm.c (output_constructor): Handle RANGE_EXPR in array index.
From-SVN: r12165
-rw-r--r--gcc/varasm.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 31045fc..08399f2 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -3895,7 +3895,26 @@ output_constructor (exp, size)
if (val != 0)
STRIP_NOPS (val);
- if (field == 0 || !DECL_BIT_FIELD (field))
+ if (index && TREE_CODE (index) == RANGE_EXPR)
+ {
+ register int fieldsize
+ = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
+ HOST_WIDE_INT lo_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 0));
+ HOST_WIDE_INT hi_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 1));
+ HOST_WIDE_INT index;
+ for (index = lo_index; index <= hi_index; index++)
+ {
+ /* Output the element's initial value. */
+ if (val == 0)
+ assemble_zeros (fieldsize);
+ else
+ output_constant (val, fieldsize);
+
+ /* Count its size. */
+ total_bytes += fieldsize;
+ }
+ }
+ else if (field == 0 || !DECL_BIT_FIELD (field))
{
/* An element that is not a bit-field. */