mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-23 10:39:40 +08:00
[Patch] Warn and truncate bitsize when partial overflow happen
PR rtl-optimization/64011 gcc/ * expmed.c (store_bit_field_using_insv): Warn and truncate bitsize when there is partial overflow. From-SVN: r219717
This commit is contained in:
parent
de37b21e3d
commit
4ae9783ec3
@ -1,3 +1,9 @@
|
||||
2015-01-15 Jiong Wang <jiong.wang@arm.com>
|
||||
|
||||
PR rtl-optimization/64011
|
||||
* expmed.c (store_bit_field_using_insv): Warn and truncate bitsize when
|
||||
there is partial overflow.
|
||||
|
||||
2015-01-16 Chung-Ju Wu <jasonwucj@gmail.com>
|
||||
|
||||
* config/nds32/nds32-protos.h (nds32_expand_epilogue): Change
|
||||
|
15
gcc/expmed.c
15
gcc/expmed.c
@ -557,6 +557,21 @@ store_bit_field_using_insv (const extraction_insn *insv, rtx op0,
|
||||
copy_back = true;
|
||||
}
|
||||
|
||||
/* There are similar overflow check at the start of store_bit_field_1,
|
||||
but that only check the situation where the field lies completely
|
||||
outside the register, while there do have situation where the field
|
||||
lies partialy in the register, we need to adjust bitsize for this
|
||||
partial overflow situation. Without this fix, pr48335-2.c on big-endian
|
||||
will broken on those arch support bit insert instruction, like arm, aarch64
|
||||
etc. */
|
||||
if (bitsize + bitnum > unit && bitnum < unit)
|
||||
{
|
||||
warning (OPT_Wextra, "write of "HOST_WIDE_INT_PRINT_UNSIGNED"bit data "
|
||||
"outside the bound of destination object, data truncated into "
|
||||
HOST_WIDE_INT_PRINT_UNSIGNED"bit", bitsize, unit - bitnum);
|
||||
bitsize = unit - bitnum;
|
||||
}
|
||||
|
||||
/* If BITS_BIG_ENDIAN is zero on a BYTES_BIG_ENDIAN machine, we count
|
||||
"backwards" from the size of the unit we are inserting into.
|
||||
Otherwise, we count bits from the most significant on a
|
||||
|
Loading…
Reference in New Issue
Block a user