expr.c (get_inner_reference): Do computation of bitoffset from offset in a way we can detect overflow reliably.
2007-08-23 Richard Guenther <rguenther@suse.de> * expr.c (get_inner_reference): Do computation of bitoffset from offset in a way we can detect overflow reliably. From-SVN: r127762
This commit is contained in:
parent
1651030c42
commit
9c219b9bb3
@ -1,3 +1,8 @@
|
||||
2007-08-24 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* expr.c (get_inner_reference): Do computation of bitoffset
|
||||
from offset in a way we can detect overflow reliably.
|
||||
|
||||
2007-08-24 Jie Zhang <jie.zhang@analog.com>
|
||||
|
||||
* crtstuff.c (USE_PT_GNU_EH_FRAME): Don't define for uClibc.
|
||||
|
32
gcc/expr.c
32
gcc/expr.c
@ -5782,7 +5782,6 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
|
||||
enum machine_mode mode = VOIDmode;
|
||||
tree offset = size_zero_node;
|
||||
tree bit_offset = bitsize_zero_node;
|
||||
tree tem;
|
||||
|
||||
/* First get the mode, signedness, and size. We do this from just the
|
||||
outermost expression. */
|
||||
@ -5825,6 +5824,8 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
|
||||
*pbitsize = tree_low_cst (size_tree, 1);
|
||||
}
|
||||
|
||||
*pmode = mode;
|
||||
|
||||
/* Compute cumulative bit-offset for nested component-refs and array-refs,
|
||||
and find the ultimate containing object. */
|
||||
while (1)
|
||||
@ -5909,18 +5910,25 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
|
||||
done:
|
||||
|
||||
/* If OFFSET is constant, see if we can return the whole thing as a
|
||||
constant bit position. Otherwise, split it up. */
|
||||
if (host_integerp (offset, 0)
|
||||
&& 0 != (tem = size_binop (MULT_EXPR,
|
||||
fold_convert (bitsizetype, offset),
|
||||
bitsize_unit_node))
|
||||
&& 0 != (tem = size_binop (PLUS_EXPR, tem, bit_offset))
|
||||
&& host_integerp (tem, 0))
|
||||
*pbitpos = tree_low_cst (tem, 0), *poffset = 0;
|
||||
else
|
||||
*pbitpos = tree_low_cst (bit_offset, 0), *poffset = offset;
|
||||
constant bit position. Make sure to handle overflow during
|
||||
this conversion. */
|
||||
if (host_integerp (offset, 0))
|
||||
{
|
||||
double_int tem = double_int_mul (tree_to_double_int (offset),
|
||||
uhwi_to_double_int (BITS_PER_UNIT));
|
||||
tem = double_int_add (tem, tree_to_double_int (bit_offset));
|
||||
if (double_int_fits_in_shwi_p (tem))
|
||||
{
|
||||
*pbitpos = double_int_to_shwi (tem);
|
||||
*poffset = NULL_TREE;
|
||||
return exp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise, split it up. */
|
||||
*pbitpos = tree_low_cst (bit_offset, 0);
|
||||
*poffset = offset;
|
||||
|
||||
*pmode = mode;
|
||||
return exp;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user