This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]