Commit e562bf36 by Richard Guenther Committed by Richard Biener

varasm.c (output_constructor_regular_field): Compute zero-based index with double-ints.

2011-05-02  Richard Guenther  <rguenther@suse.de>

	* 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
parent 6bec6c98
2011-05-02 Richard Guenther <rguenther@suse.de>
* 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 <ubizjak@gmail.com> 2011-05-02 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sse.md (V): New mode iterator. * config/i386/sse.md (V): New mode iterator.
......
...@@ -613,8 +613,9 @@ cgraph_add_thunk (struct cgraph_node *decl_node, tree alias, tree decl, ...@@ -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); node = cgraph_same_body_alias_1 (decl_node, alias, decl);
gcc_assert (node); gcc_assert (node);
gcc_checking_assert (!virtual_offset gcc_checking_assert (!virtual_offset
|| tree_int_cst_equal (virtual_offset, || double_int_equal_p
size_int (virtual_value))); (tree_to_double_int (virtual_offset),
shwi_to_double_int (virtual_value)));
node->thunk.fixed_offset = fixed_offset; node->thunk.fixed_offset = fixed_offset;
node->thunk.this_adjusting = this_adjusting; node->thunk.this_adjusting = this_adjusting;
node->thunk.virtual_value = virtual_value; node->thunk.virtual_value = virtual_value;
......
...@@ -4711,9 +4711,13 @@ output_constructor_regular_field (oc_local_state *local) ...@@ -4711,9 +4711,13 @@ output_constructor_regular_field (oc_local_state *local)
unsigned int align2; unsigned int align2;
if (local->index != NULL_TREE) if (local->index != NULL_TREE)
fieldpos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (local->val)), 1) {
* ((tree_low_cst (local->index, 0) double_int idx = double_int_sub (tree_to_double_int (local->index),
- tree_low_cst (local->min_index, 0)))); 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) else if (local->field != NULL_TREE)
fieldpos = int_byte_position (local->field); fieldpos = int_byte_position (local->field);
else else
...@@ -4760,13 +4764,8 @@ output_constructor_regular_field (oc_local_state *local) ...@@ -4760,13 +4764,8 @@ output_constructor_regular_field (oc_local_state *local)
better be last. */ better be last. */
gcc_assert (!fieldsize || !DECL_CHAIN (local->field)); gcc_assert (!fieldsize || !DECL_CHAIN (local->field));
} }
else if (DECL_SIZE_UNIT (local->field)) else
{ fieldsize = tree_low_cst (DECL_SIZE_UNIT (local->field), 1);
/* ??? 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 else
fieldsize = int_size_in_bytes (TREE_TYPE (local->type)); fieldsize = int_size_in_bytes (TREE_TYPE (local->type));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment