From e562bf36b644ab3403fc28a5e41bee94fcca1deb Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 2 May 2011 15:22:54 +0000 Subject: [PATCH] varasm.c (output_constructor_regular_field): Compute zero-based index with double-ints. 2011-05-02 Richard Guenther * varasm.c (output_constructor_regular_field): Compute zero-based index with double-ints. Make sure to ICE instead of producing wrong code. * cgraph.c (cgraph_add_thunk): Do not create new tree nodes in asserts. Properly use a signed type. From-SVN: r173255 --- gcc/ChangeLog | 8 ++++++++ gcc/cgraph.c | 5 +++-- gcc/varasm.c | 19 +++++++++---------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3279294ab82..26b40acba53 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-05-02 Richard Guenther + + * varasm.c (output_constructor_regular_field): Compute zero-based + index with double-ints. Make sure to ICE instead of producing + wrong code. + * cgraph.c (cgraph_add_thunk): Do not create new tree nodes + in asserts. Properly use a signed type. + 2011-05-02 Uros Bizjak * config/i386/sse.md (V): New mode iterator. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 2086bfe9b0b..91805e30b73 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -613,8 +613,9 @@ cgraph_add_thunk (struct cgraph_node *decl_node, tree alias, tree decl, node = cgraph_same_body_alias_1 (decl_node, alias, decl); gcc_assert (node); gcc_checking_assert (!virtual_offset - || tree_int_cst_equal (virtual_offset, - size_int (virtual_value))); + || double_int_equal_p + (tree_to_double_int (virtual_offset), + shwi_to_double_int (virtual_value))); node->thunk.fixed_offset = fixed_offset; node->thunk.this_adjusting = this_adjusting; node->thunk.virtual_value = virtual_value; diff --git a/gcc/varasm.c b/gcc/varasm.c index 8755dded36e..b4f38058e22 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4711,9 +4711,13 @@ output_constructor_regular_field (oc_local_state *local) unsigned int align2; if (local->index != NULL_TREE) - fieldpos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (local->val)), 1) - * ((tree_low_cst (local->index, 0) - - tree_low_cst (local->min_index, 0)))); + { + double_int idx = double_int_sub (tree_to_double_int (local->index), + tree_to_double_int (local->min_index)); + gcc_assert (double_int_fits_in_shwi_p (idx)); + fieldpos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (local->val)), 1) + * idx.low); + } else if (local->field != NULL_TREE) fieldpos = int_byte_position (local->field); else @@ -4760,13 +4764,8 @@ output_constructor_regular_field (oc_local_state *local) better be last. */ gcc_assert (!fieldsize || !DECL_CHAIN (local->field)); } - else if (DECL_SIZE_UNIT (local->field)) - { - /* ??? This can't be right. If the decl size overflows - a host integer we will silently emit no data. */ - if (host_integerp (DECL_SIZE_UNIT (local->field), 1)) - fieldsize = tree_low_cst (DECL_SIZE_UNIT (local->field), 1); - } + else + fieldsize = tree_low_cst (DECL_SIZE_UNIT (local->field), 1); } else fieldsize = int_size_in_bytes (TREE_TYPE (local->type)); -- 2.30.2