[cfe-dev] default alignment?

Chris Lattner clattner at apple.com
Mon Jan 17 10:32:29 PST 2011


On Jan 17, 2011, at 9:38 AM, Eric Niebler wrote:

> On 1/18/2011 12:20 AM, Chris Lattner wrote:
>> On Jan 17, 2011, at 1:28 AM, Eric Niebler wrote:
>>> In Sema::ActOnPragmaPack, I see this:
>>> 
>>> // FIXME: This should come from the target.
>>> if (AlignmentVal == 0)
>>>   AlignmentVal = 8;
>>> 
>>> So, what's the right fix? Should this be
>>> (Context.Target.getDoubleAlign() / Context.Target.getCharWidth())? (And
>>> why 8? Where does that come from?)
>> 
>> Hi Eric,
>> 
>> I'm not familiar with #pragma pack show, but the 8 here is in bits.  The right fix is probably to call Context.Target.getCharWidth().
> 
> Hi Chris,
> 
> That's just can't be right. A default alignment of 1 byte would lead to
> alignment faults all over the place. And consider the following:
> 
> #pragma pack(show)
> #pragma pack(1)
> #pragma pack(show)
> 
> Compiled with MSVC, I get:
> 
> foo.c(1) : warning C4810: value of pragma pack(show) == 8
> foo.c(3) : warning C4810: value of pragma pack(show) == 1
> 
> Clearly, the "1" in the last line doesn't refer to a 1 *bit* alignment.
> We're talking bytes here.

As I said, I don't know anything about pack(show).  The context of the code is:

  case Sema::PPK_Show: // pack(show)
    // Show the current alignment, making sure to show the right value
    // for the default.
    AlignmentVal = Context->getAlignment();
    // FIXME: This should come from the target.
    if (AlignmentVal == 0)
      AlignmentVal = 8;
    if (AlignmentVal == PackStackEntry::kMac68kAlignmentSentinel)
      Diag(PragmaLoc, diag::warn_pragma_pack_show) << "mac68k";
    else
      Diag(PragmaLoc, diag::warn_pragma_pack_show) << AlignmentVal;
    break;


Since "Context->getAlignment()" returns alignment in bits, it looks like show is just broken.  It should be something like:

...
      Diag(PragmaLoc, diag::warn_pragma_pack_show) << AlignmentVal/8;
    break;

-Chris



More information about the cfe-dev mailing list