summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-14 00:54:36 +0000
committerWarren Hunt <whunt@google.com>2014-01-14 00:54:36 +0000
commit26b944274e497b131aeab2512c445ae258826d88 (patch)
treec37304e2b9cdc2b08dd3b6327c69e67a941f5baf /clang/lib/AST/RecordLayoutBuilder.cpp
parent5b1b5d51235deb27174eb3ebb2ace32a9c103962 (diff)
downloadbcm5719-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.cpp11
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;
}
OpenPOWER on IntegriCloud