r201917 - [MS-ABI] Fix MSRecordLayout to handel MultiDimensionalArrays
Warren Hunt
whunt at google.com
Fri Feb 21 16:40:38 PST 2014
Author: whunt
Date: Fri Feb 21 18:40:37 2014
New Revision: 201917
URL: http://llvm.org/viewvc/llvm-project?rev=201917&view=rev
Log:
[MS-ABI] Fix MSRecordLayout to handel MultiDimensionalArrays
A recent change caused multi-dimensional arrays not to be handled
correctly, this patch fixes that. Also, it adds a lit test for
multi-dimensional arrays.
Modified:
cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
cfe/trunk/test/Layout/ms-x86-basic-layout.cpp
Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=201917&r1=201916&r2=201917&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Fri Feb 21 18:40:37 2014
@@ -2271,8 +2271,9 @@ MicrosoftRecordLayoutBuilder::getAdjuste
// Get the element info for a layout, respecting pack.
Info = getAdjustedElementInfo(Layout, false);
// If the field is an array type, scale it's size properly.
- if (const ConstantArrayType *CAT =
- dyn_cast<ConstantArrayType>(FD->getType()))
+ for (const ConstantArrayType *CAT =
+ dyn_cast<ConstantArrayType>(FD->getType()); CAT;
+ CAT = dyn_cast<ConstantArrayType>(CAT->getElementType()))
Info.Size = Info.Size * (int64_t)CAT->getSize().getZExtValue();
// Capture required alignment as a side-effect.
RequiredAlignment = std::max(RequiredAlignment,
Modified: cfe/trunk/test/Layout/ms-x86-basic-layout.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-basic-layout.cpp?rev=201917&r1=201916&r2=201917&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-basic-layout.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-basic-layout.cpp Fri Feb 21 18:40:37 2014
@@ -785,6 +785,21 @@ struct ArrayFieldOfRecords {
// CHECK-X64-NEXT: | [sizeof=8, align=4
// CHECK-X64-NEXT: | nvsize=8, nvalign=4]
+struct ArrayOfArrayFieldOfRecords {
+ A4 InlineElts[2][2];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct ArrayOfArrayFieldOfRecords
+// CHECK-NEXT: 0 | struct A4 [2][2] InlineElts
+// CHECK-NEXT: | [sizeof=16, align=4
+// CHECK-NEXT: | nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct ArrayOfArrayFieldOfRecords
+// CHECK-X64-NEXT: 0 | struct A4 [2][2] InlineElts
+// CHECK-X64-NEXT: | [sizeof=16, align=4
+// CHECK-X64-NEXT: | nvsize=16, nvalign=4]
+
int a[
sizeof(TestF0)+
sizeof(TestF1)+
@@ -806,4 +821,6 @@ sizeof(F3)+
sizeof(F4)+
sizeof(F5)+
sizeof(F6)+
-sizeof(ArrayFieldOfRecords)];
+sizeof(ArrayFieldOfRecords)+
+sizeof(ArrayOfArrayFieldOfRecords)+
+0];
More information about the cfe-commits
mailing list