[llvm-commits] [127292] Fix PR 1419

dpatel at apple.com dpatel at apple.com
Tue May 15 16:46:37 PDT 2007


Revision: 127292
Author:   dpatel
Date:     2007-05-15 16:46:37 -0700 (Tue, 15 May 2007)

Log Message:
-----------
Fix PR 1419
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070514/049641.html

Modified Paths:
--------------
    apple-local/branches/llvm/gcc/llvm-types.cpp

Modified: apple-local/branches/llvm/gcc/llvm-types.cpp
===================================================================
--- apple-local/branches/llvm/gcc/llvm-types.cpp	2007-05-15 23:37:35 UTC (rev 127291)
+++ apple-local/branches/llvm/gcc/llvm-types.cpp	2007-05-15 23:46:37 UTC (rev 127292)
@@ -1245,6 +1245,29 @@
   return Info->PaddingElement[index];
 }
 
+/// OldTy and NewTy are union members. If they are representing
+/// structs then adjust their PaddingElement bits. Padding
+/// field in one struct may not be a padding field in another
+/// struct.
+void adjustPaddingElement(const Type *OldTy, const Type *NewTy) {
+
+  StructTypeConversionInfo *OldInfo = StructTypeInfoMap[OldTy];
+  StructTypeConversionInfo *NewInfo = StructTypeInfoMap[NewTy];
+
+  if (!OldInfo || !NewInfo)
+    return;
+
+  /// FIXME : Find overlapping padding fields and preserve their
+  /// isPaddingElement bit. For now, clear all isPaddingElement bits.
+  for (unsigned i = 0, size =  NewInfo->PaddingElement.size(); i != size; ++i)
+    NewInfo->PaddingElement[i] = false;
+
+  for (unsigned i = 0, size =  OldInfo->PaddingElement.size(); i != size; ++i)
+    OldInfo->PaddingElement[i] = false;
+
+}
+
+
 /// getFieldOffsetInBits - Return the offset (in bits) of a FIELD_DECL in a
 /// structure.
 static unsigned getFieldOffsetInBits(tree Field) {
@@ -1606,6 +1629,7 @@
     const Type *TheTy = ConvertType(TREE_TYPE(Field));
     unsigned Size     = TD.getTypeSize(TheTy);
     unsigned Align = TD.getABITypeAlignment(TheTy);
+    adjustPaddingElement(UnionTy, TheTy);
     if (UnionTy == 0 || Align > MaxAlign 
         || (MaxAlign == Align && Size > MaxSize)) {
       UnionTy = TheTy;





More information about the llvm-commits mailing list