This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PRs 52080, 52097 and 48124, rewrite bitfield expansion, enable the C++ memory model wrt bitfields everywhere
> Yes, I have noticed that from what you can see in the code. So the
> issue is that get_bit_range tells us that it's ok to touch bits
> outside of the field - but that's obviously required. We may not
> change bits that are not covered by the FIELD_DECL which now
> somehow happens? That sounds like a latent bug in the bitfield
> expander to me - it should never _change_ bits outside of bitpos/bitsize
> as returned by get_inner_reference.
It's the new C++0x memory model stuff:
void
store_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
unsigned HOST_WIDE_INT bitnum,
unsigned HOST_WIDE_INT bitregion_start,
unsigned HOST_WIDE_INT bitregion_end,
enum machine_mode fieldmode,
rtx value)
{
/* Under the C++0x memory model, we must not touch bits outside the
bit region. Adjust the address to start at the beginning of the
bit region. */
if (MEM_P (str_rtx)
&& bitregion_start > 0)
{
enum machine_mode bestmode;
enum machine_mode op_mode;
unsigned HOST_WIDE_INT offset;
op_mode = mode_for_extraction (EP_insv, 3);
if (op_mode == MAX_MACHINE_MODE)
op_mode = VOIDmode;
offset = bitregion_start / BITS_PER_UNIT;
bitnum -= bitregion_start;
bitregion_end -= bitregion_start;
bitregion_start = 0;
which assumes that a bitfield group starts on a byte boundary. So this is
probably indeed latent in GCC 4.7 as well.
--
Eric Botcazou