Don't output ABI size padding twice. By using the store
authorDuncan Sands <baldrick@free.fr>
Mon, 5 Nov 2007 18:03:02 +0000 (18:03 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 5 Nov 2007 18:03:02 +0000 (18:03 +0000)
size for the field we get ABI padding automatically, so
no need to put it in again when we emit the field.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43720 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter.cpp

index eb9375cd13d69604027acea2287e95484beaf2ae..e7c7448f9ba591908e979920fb35d4aaeddbf568 100644 (file)
@@ -831,15 +831,16 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV, bool Packed) {
 
       // Check if padding is needed and insert one or more 0s.
       uint64_t fieldSize = TD->getTypeStoreSize(field->getType());
-      uint64_t padSize = ((i == e-1? cvsLayout->getSizeInBytes()
-                           : cvsLayout->getElementOffset(i+1))
+      uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1))
                           - cvsLayout->getElementOffset(i)) - fieldSize;
       sizeSoFar += fieldSize + padSize;
 
-      // Now print the actual field value
-      EmitGlobalConstant(field, CVS->getType()->isPacked());
+      // Now print the actual field value without ABI size padding.
+      EmitGlobalConstant(field, true);
 
-      // Insert the field padding unless it's zero bytes...
+      // Insert padding - this may include padding to increase the size of the
+      // current field up to the ABI size (if the struct is not packed) as well
+      // as padding to ensure that the next field starts at the right offset.
       EmitZeros(padSize);
     }
     assert(sizeSoFar == cvsLayout->getSizeInBytes() &&