diff options
| author | Reid Kleckner <reid@kleckner.net> | 2014-01-13 19:25:00 +0000 |
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2014-01-13 19:25:00 +0000 |
| commit | 4f017ceedae8245e11ad803f5698ec8afeb8f446 (patch) | |
| tree | b3c8940c30211d90cfefa9f50de506a336d3f42f | |
| parent | 13ac4bd774b0904c0af700470d264e18639ce3cb (diff) | |
| download | bcm5719-llvm-4f017ceedae8245e11ad803f5698ec8afeb8f446.tar.gz bcm5719-llvm-4f017ceedae8245e11ad803f5698ec8afeb8f446.zip | |
[ms-abi] Quick fix layout of an array of records
This fixes llvm::SmallVector, which fixes lots of TUs in the MS ABI self
host.
llvm-svn: 199129
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Layout/ms-x86-basic-layout.cpp | 18 |
2 files changed, 19 insertions, 5 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index ff6b950474d..885d4ff5fb6 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2176,16 +2176,14 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( Info = getAdjustedElementInfo(Layout); // Nomally getAdjustedElementInfo returns the non-virtual size, which is // correct for bases but not for fields. - Info.Size = Layout.getSize(); + Info.Size = Context.getTypeInfoInChars(FD->getType()).first; // Capture required alignment as a side-effect. RequiredAlignment = std::max(RequiredAlignment, Layout.getRequiredAlignment()); } else { - std::pair<CharUnits, CharUnits> FieldInfo = + llvm::tie(Info.Size, Info.Alignment) = Context.getTypeInfoInChars(FD->getType()); - Info.Size = FieldInfo.first; - Info.Alignment = FieldInfo.second; if (FD->isBitField() && FD->getMaxAlignment() != 0) Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment); // Respect pragma pack. diff --git a/clang/test/Layout/ms-x86-basic-layout.cpp b/clang/test/Layout/ms-x86-basic-layout.cpp index f509f2938cb..fc57ec9f33c 100644 --- a/clang/test/Layout/ms-x86-basic-layout.cpp +++ b/clang/test/Layout/ms-x86-basic-layout.cpp @@ -770,6 +770,21 @@ struct F6 : virtual A16f, A4, virtual B { // CHECK-X64-NEXT: | [sizeof=96, align=16 // CHECK-X64-NEXT: | nvsize=32, nvalign=16] +struct ArrayFieldOfRecords { + A4 InlineElts[2]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct ArrayFieldOfRecords +// CHECK-NEXT: 0 | struct A4 [2] InlineElts +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=8, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct ArrayFieldOfRecords +// CHECK-X64-NEXT: 0 | struct A4 [2] InlineElts +// CHECK-X64-NEXT: | [sizeof=8, align=4 +// CHECK-X64-NEXT: | nvsize=8, nvalign=4] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -790,4 +805,5 @@ sizeof(F2)+ sizeof(F3)+ sizeof(F4)+ sizeof(F5)+ -sizeof(F6)]; +sizeof(F6)+ +sizeof(ArrayFieldOfRecords)]; |

