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