* [PATCH][?/n] TYPE_IS_SIZETYPE fixes
@ 2011-05-02 15:20 Richard Guenther
0 siblings, 0 replies; only message in thread
From: Richard Guenther @ 2011-05-02 15:20 UTC (permalink / raw)
To: gcc-patches
This is another tiny step towards making TYPE_IS_SIZETYPE not special
wrt sign-extension. In output_constructor_regular_field we call
tree_low_cst without first assuring it won't ICE. Instead of
doing that simply compute the zero-based index in double-ints
and assert that that result is representable in a HWI. Being there
I noticed that strange comment and thought it is a good idea
to ICE instead of creating silently wrong code. The cgraph code
compares a sign-extended tree to a unsigned (but atm still
sign-extended) size_int - that's bogus. And we can avoid
creating a tree node by simply using double-int functions.
Bootstrapped and tested on x86_64-unknown-linux-gnu, installed on trunk.
Richard.
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.
Index: trunk/gcc/varasm.c
===================================================================
*** trunk.orig/gcc/varasm.c 2011-05-02 14:50:36.000000000 +0200
--- trunk/gcc/varasm.c 2011-05-02 15:15:59.000000000 +0200
*************** output_constructor_regular_field (oc_loc
*** 4711,4719 ****
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))));
else if (local->field != NULL_TREE)
fieldpos = int_byte_position (local->field);
else
--- 4711,4723 ----
unsigned int align2;
if (local->index != NULL_TREE)
! {
! 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
*************** output_constructor_regular_field (oc_loc
*** 4760,4772 ****
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 = int_size_in_bytes (TREE_TYPE (local->type));
--- 4764,4771 ----
better be last. */
gcc_assert (!fieldsize || !DECL_CHAIN (local->field));
}
! else
! fieldsize = tree_low_cst (DECL_SIZE_UNIT (local->field), 1);
}
else
fieldsize = int_size_in_bytes (TREE_TYPE (local->type));
Index: trunk/gcc/cgraph.c
===================================================================
*** trunk.orig/gcc/cgraph.c 2011-05-02 12:20:22.000000000 +0200
--- trunk/gcc/cgraph.c 2011-05-02 15:42:19.000000000 +0200
*************** cgraph_add_thunk (struct cgraph_node *de
*** 613,620 ****
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)));
node->thunk.fixed_offset = fixed_offset;
node->thunk.this_adjusting = this_adjusting;
node->thunk.virtual_value = virtual_value;
--- 613,621 ----
node = cgraph_same_body_alias_1 (decl_node, alias, decl);
gcc_assert (node);
gcc_checking_assert (!virtual_offset
! || 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;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-05-02 15:20 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-02 15:20 [PATCH][?/n] TYPE_IS_SIZETYPE fixes Richard Guenther
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).