diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2011-05-09 22:03:17 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-05-09 22:03:17 +0000 |
| commit | 7adbed6b4da6cf5e91ceb0fbd0a0a7c78f3e13be (patch) | |
| tree | a6fa6b91c5aeca0858c0e703dcaa0d5030500ddf /clang/lib/AST/RecordLayoutBuilder.cpp | |
| parent | 5d1d9e381e6b1744dc55b047f7c83f078069d2dd (diff) | |
| download | bcm5719-llvm-7adbed6b4da6cf5e91ceb0fbd0a0a7c78f3e13be.tar.gz bcm5719-llvm-7adbed6b4da6cf5e91ceb0fbd0a0a7c78f3e13be.zip | |
'long long' requires special treatment in ms_struct
structs (impacts 32-bit only though).
llvm-svn: 131103
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 4466be6ca23..794ae6fdc59 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1286,9 +1286,15 @@ void RecordLayoutBuilder::LayoutFields(const RecordDecl *D) { Context.getTypeInfo(FD->getType()); uint64_t TypeSize = FieldInfo.first; unsigned FieldAlign = FieldInfo.second; + // This check is needed for 'long long' in -m32 mode. + if (TypeSize > FieldAlign) + 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) + FieldAlignLastFD = TypeSizeLastFD; if (TypeSizeLastFD != TypeSize) { uint64_t UnpaddedFieldOffset = getDataSizeInBits() - UnfilledBitsInLastByte; @@ -1382,6 +1388,10 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) { uint64_t TypeSize = FieldInfo.first; unsigned FieldAlign = FieldInfo.second; + // This check is needed for 'long long' in -m32 mode. + if (IsMsStruct && (TypeSize > FieldAlign)) + FieldAlign = TypeSize; + if (ZeroLengthBitfield) { // If a zero-length bitfield is inserted after a bitfield, // and the alignment of the zero-length bitfield is |

