diff options
author | Warren Hunt <whunt@google.com> | 2014-01-14 00:54:36 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2014-01-14 00:54:36 +0000 |
commit | 26b944274e497b131aeab2512c445ae258826d88 (patch) | |
tree | c37304e2b9cdc2b08dd3b6327c69e67a941f5baf /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | 5b1b5d51235deb27174eb3ebb2ace32a9c103962 (diff) | |
download | bcm5719-llvm-26b944274e497b131aeab2512c445ae258826d88.tar.gz bcm5719-llvm-26b944274e497b131aeab2512c445ae258826d88.zip |
[ms-abi] Small Change to pack+alignment interaction.
This patch makes a small behavioral change to the interaction between
pack and alignment. Specifically it makes __declspec(align()) on a
field change that field's alignment without respect to pack but the
alignment change to the record alignment as a whole still obeys pack.
llvm-svn: 199172
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 6b3a431da21..9183e5c66f2 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2186,6 +2186,9 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( Context.getTypeInfoInChars(FD->getType()); if (FD->isBitField() && FD->getMaxAlignment() != 0) Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment); + // Respect pragma pack. + if (!MaxFieldAlignment.isZero()) + Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment); } // Respect packed field attribute. if (FD->hasAttr<PackedAttr>()) @@ -2197,12 +2200,12 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( // Capture required alignment as a side-effect. RequiredAlignment = std::max(RequiredAlignment, FieldRequiredAlignment); } - // Respect pragma pack. - if (!MaxFieldAlignment.isZero()) - Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment); // TODO: Add a Sema warning that MS ignores bitfield alignment in unions. - if (!(FD->isBitField() && IsUnion)) + if (!(FD->isBitField() && IsUnion)) { Alignment = std::max(Alignment, Info.Alignment); + if (!MaxFieldAlignment.isZero()) + Alignment = std::min(Alignment, MaxFieldAlignment); + } return Info; } |