[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