aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-05-02 15:22:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-05-02 15:22:54 +0000
commite562bf36b644ab3403fc28a5e41bee94fcca1deb (patch)
treeaba2d31b13dea7131e7eb941ca9a452f462c9085 /gcc
parent6bec6c98971cd984623fcdab094ded3912fb69af (diff)
downloadgcc-e562bf36b644ab3403fc28a5e41bee94fcca1deb.zip
gcc-e562bf36b644ab3403fc28a5e41bee94fcca1deb.tar.gz
gcc-e562bf36b644ab3403fc28a5e41bee94fcca1deb.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cgraph.c5
-rw-r--r--gcc/varasm.c19
3 files changed, 20 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3279294..26b40ac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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>
* config/i386/sse.md (V): New mode iterator.
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 2086bfe..91805e3 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 8755dde..b4f3805 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));