> 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:

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

Reply via email to