summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2011-12-12 21:16:36 +0000
committerFariborz Jahanian <fjahanian@apple.com>2011-12-12 21:16:36 +0000
commit0586df4a00fd45780b935e236fb023836c2d5579 (patch)
tree2eeaa38ec5c39e7cfa4f030b411078a5e0087680 /clang/lib/AST/RecordLayoutBuilder.cpp
parent76329bf83f1ffe97a25ed1726cac709a9ae66d71 (diff)
downloadbcm5719-llvm-0586df4a00fd45780b935e236fb023836c2d5579.tar.gz
bcm5719-llvm-0586df4a00fd45780b935e236fb023836c2d5579.zip
Fixes a bug in calculation of field offsets of ms_struct
fields by just following what comment says. // rdar://10513599 llvm-svn: 146414
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index c92116ac6c4..3e413befd83 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -1483,13 +1483,21 @@ void RecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
uint64_t TypeSize = FieldInfo.first;
unsigned FieldAlign = FieldInfo.second;
// This check is needed for 'long long' in -m32 mode.
- if (TypeSize > FieldAlign)
+ if (TypeSize > FieldAlign &&
+ (Context.hasSameType(FD->getType(),
+ Context.UnsignedLongLongTy)
+ ||Context.hasSameType(FD->getType(),
+ Context.LongLongTy)))
FieldAlign = TypeSize;
FieldInfo = Context.getTypeInfo(LastFD->getType());
uint64_t TypeSizeLastFD = FieldInfo.first;
unsigned FieldAlignLastFD = FieldInfo.second;
// This check is needed for 'long long' in -m32 mode.
- if (TypeSizeLastFD > FieldAlignLastFD)
+ if (TypeSizeLastFD > FieldAlignLastFD &&
+ (Context.hasSameType(LastFD->getType(),
+ Context.UnsignedLongLongTy)
+ || Context.hasSameType(LastFD->getType(),
+ Context.LongLongTy)))
FieldAlignLastFD = TypeSizeLastFD;
if (TypeSizeLastFD != TypeSize) {
@@ -1640,7 +1648,10 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
unsigned FieldAlign = FieldInfo.second;
// This check is needed for 'long long' in -m32 mode.
- if (IsMsStruct && (TypeSize > FieldAlign))
+ if (IsMsStruct && (TypeSize > FieldAlign) &&
+ (Context.hasSameType(D->getType(),
+ Context.UnsignedLongLongTy)
+ || Context.hasSameType(D->getType(), Context.LongLongTy)))
FieldAlign = TypeSize;
if (ZeroLengthBitfield) {
OpenPOWER on IntegriCloud