r196861 - [ms-abi] 64-bit fixes for r196549

Warren Hunt whunt at google.com
Mon Dec 9 17:44:39 PST 2013


Author: whunt
Date: Mon Dec  9 19:44:39 2013
New Revision: 196861

URL: http://llvm.org/viewvc/llvm-project?rev=196861&view=rev
Log:
[ms-abi] 64-bit fixes for r196549

In order to address latent bugs that were easier to expose in 64-bit 
mode, we move the application of __declspec(align) to before the layout 
of vbases rather than after.


Modified:
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
    cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp
    cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp

Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Mon Dec  9 19:44:39 2013
@@ -2060,12 +2060,13 @@ public:
   /// \brief Lays out a single zero-width bit-field in the record and handles
   /// special cases associated with zero-width bit-fields.
   void layoutZeroWidthBitField(const FieldDecl *FD);
+  void fixSizeAndAlignment(const RecordDecl *FD);
   void layoutVirtualBases(const CXXRecordDecl *RD);
   void layoutVirtualBase(const CXXRecordDecl *RD, bool HasVtordisp);
   /// \brief Flushes the lazy virtual base and conditionally rounds up to
   /// alignment.
   void finalizeCXXLayout(const CXXRecordDecl *RD);
-  void honorDeclspecAlign(const RecordDecl *RD);
+  void finalizeLayout(const RecordDecl *RD);
 
   /// \brief Updates the alignment of the type.  This function doesn't take any
   /// properties (such as packedness) into account.  getAdjustedFieldInfo()
@@ -2233,7 +2234,8 @@ void MicrosoftRecordLayoutBuilder::initi
 void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
   initializeLayout(RD);
   layoutFields(RD);
-  honorDeclspecAlign(RD);
+  fixSizeAndAlignment(RD);
+  finalizeLayout(RD);
 }
 
 void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
@@ -2243,11 +2245,10 @@ void MicrosoftRecordLayoutBuilder::cxxLa
   layoutNonVirtualBases(RD);
   layoutVBPtr(RD);
   layoutFields(RD);
-  DataSize = Size;
-  NonVirtualAlignment = Alignment;
+  fixSizeAndAlignment(RD);
   layoutVirtualBases(RD);
   finalizeCXXLayout(RD);
-  honorDeclspecAlign(RD);
+  finalizeLayout(RD);
 }
 
 void
@@ -2543,6 +2544,13 @@ MicrosoftRecordLayoutBuilder::layoutZero
   }
 }
 
+void MicrosoftRecordLayoutBuilder::fixSizeAndAlignment(const RecordDecl *RD) {
+  DataSize = Size;
+  NonVirtualAlignment = Alignment;
+  RequiredAlignment = std::max(RequiredAlignment,
+      Context.toCharUnitsFromBits(RD->getMaxAlignment()));
+}
+
 void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
   if (!HasVBPtr)
     return;
@@ -2581,8 +2589,9 @@ void MicrosoftRecordLayoutBuilder::layou
   // bytes (in both 32 and 64 bits modes), we don't know why.
   if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
       Layout.leadsWithZeroSizedBase())
-    Size = Size.RoundUpToAlignment(Alignment) +
-        std::max(CharUnits::fromQuantity(4), Layout.getAlignment());
+    Size = Size.RoundUpToAlignment(std::max(CharUnits::fromQuantity(4),
+                                            RequiredAlignment)) +
+        CharUnits::fromQuantity(4);
 
   CharUnits BaseNVSize = Layout.getNonVirtualSize();
   CharUnits BaseAlign = getBaseAlignment(Layout);
@@ -2612,9 +2621,7 @@ void MicrosoftRecordLayoutBuilder::final
   }
 }
 
-void MicrosoftRecordLayoutBuilder::honorDeclspecAlign(const RecordDecl *RD) {
-  RequiredAlignment = std::max(RequiredAlignment,
-      Context.toCharUnitsFromBits(RD->getMaxAlignment()));
+void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
   if (!RequiredAlignment.isZero()) {
     updateAlignment(RequiredAlignment);
     Size = Size.RoundUpToAlignment(Alignment);

Modified: cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp Mon Dec  9 19:44:39 2013
@@ -166,9 +166,9 @@ struct __declspec(align(1)) T3 : virtual
 // CHECK-X64:    8 |     struct T0 (base) (empty)
 // CHECK-X64:    8 |       struct AT (base) (empty)
 // CHECK-X64:    8 |     char a
-// CHECK-X64:   20 |   struct T2 (virtual base)
-// CHECK-X64:   20 |     struct AT (base) (empty)
-// CHECK-X64:   20 |     char a
+// CHECK-X64:   16 |   struct T2 (virtual base)
+// CHECK-X64:   16 |     struct AT (base) (empty)
+// CHECK-X64:   16 |     char a
 // CHECK-X64:      | [sizeof=24, align=8
 // CHECK-X64:      |  nvsize=8, nvalign=8]
 

Modified: cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp Mon Dec  9 19:44:39 2013
@@ -679,6 +679,31 @@ struct __declspec(align(32)) V : virtual
 // CHECK-X64:      | [sizeof=32, align=32
 // CHECK-X64:      |  nvsize=16, nvalign=8]
 
+struct T0 {};
+struct T1 : T0 { char a; };
+struct T3 : virtual T1, virtual T0 { long long a; };
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK:    0 | struct T3
+// CHECK:    0 |   (T3 vbtable pointer)
+// CHECK:    8 |   long long a
+// CHECK:   16 |   struct T1 (virtual base)
+// CHECK:   16 |     struct T0 (base) (empty)
+// CHECK:   16 |     char a
+// CHECK:   24 |   struct T0 (virtual base) (empty)
+// CHECK:      | [sizeof=24, align=8
+// CHECK:      |  nvsize=16, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64:    0 | struct T3
+// CHECK-X64:    0 |   (T3 vbtable pointer)
+// CHECK-X64:    8 |   long long a
+// CHECK-X64:   16 |   struct T1 (virtual base)
+// CHECK-X64:   16 |     struct T0 (base) (empty)
+// CHECK-X64:   16 |     char a
+// CHECK-X64:   24 |   struct T0 (virtual base) (empty)
+// CHECK-X64:      | [sizeof=24, align=8
+// CHECK-X64:      |  nvsize=16, nvalign=8]
+
 int a[
 sizeof(A)+
 sizeof(B)+
@@ -701,4 +726,5 @@ sizeof(R)+
 sizeof(S)+
 sizeof(T)+
 sizeof(U)+
-sizeof(V)];
\ No newline at end of file
+sizeof(V)+
+sizeof(T3)];
\ No newline at end of file





More information about the cfe-commits mailing list