[cfe-commits] r70777 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Daniel Dunbar daniel at zuster.org
Sun May 3 07:10:59 PDT 2009


Author: ddunbar
Date: Sun May  3 09:10:34 2009
New Revision: 70777

URL: http://llvm.org/viewvc/llvm-project?rev=70777&view=rev
Log:
Factor out BuildAggrIvarRecordLayout routine.

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=70777&r1=70776&r2=70777&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sun May  3 09:10:34 2009
@@ -826,6 +826,9 @@
   llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
                                   bool ForStrongLayout);
   
+  void BuildAggrIvarRecordLayout(const RecordType *RT,
+                           unsigned int BytePos, bool ForStrongLayout,
+                           bool &HasUnion);
   void BuildAggrIvarLayout(const ObjCInterfaceDecl *OI,
                            const llvm::StructLayout *Layout,
                            const RecordDecl *RD,
@@ -2907,22 +2910,39 @@
   return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
 }
 
-static QualType::GCAttrTypes GetGCAttrTypeForType(QualType FQT) {
+static QualType::GCAttrTypes GetGCAttrTypeForType(ASTContext &Ctx, 
+                                                  QualType FQT) {
   if (FQT.isObjCGCStrong())
     return QualType::Strong;
 
   if (FQT.isObjCGCWeak())
     return QualType::Weak;
 
-  if (CGM.getContext().isObjCObjectPointerType(FQT))
+  if (Ctx.isObjCObjectPointerType(FQT))
     return QualType::Strong;
 
   if (const PointerType *PT = FQT->getAsPointerType())
-    return GetGCAttrTypeForType(PT->getPointeeType());
+    return GetGCAttrTypeForType(Ctx, PT->getPointeeType());
 
   return QualType::GCNone;
 }
 
+void CGObjCCommonMac::BuildAggrIvarRecordLayout(const RecordType *RT,
+                                                unsigned int BytePos, 
+                                                bool ForStrongLayout,
+                                                bool &HasUnion) {
+  const RecordDecl *RD = RT->getDecl();
+  // FIXME - Use iterator.
+  llvm::SmallVector<FieldDecl*, 16> Fields(RD->field_begin(CGM.getContext()),
+                                           RD->field_end(CGM.getContext()));
+  const llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
+  const llvm::StructLayout *RecLayout = 
+    CGM.getTargetData().getStructLayout(cast<llvm::StructType>(Ty));
+  
+  BuildAggrIvarLayout(0, RecLayout, RD, Fields, BytePos,
+                      ForStrongLayout, HasUnion);
+}
+
 void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCInterfaceDecl *OI,
                               const llvm::StructLayout *Layout,
                               const RecordDecl *RD,
@@ -2944,8 +2964,6 @@
   unsigned WordSizeInBits = CGM.getContext().Target.getPointerWidth(0);
   unsigned ByteSizeInBits = CGM.getContext().Target.getCharWidth();
 
-  llvm::SmallVector<FieldDecl*, 16> TmpRecFields;
-
   for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
     FieldDecl *Field = RecFields[i];
     // Skip over unnamed or bitfields
@@ -2959,19 +2977,9 @@
       if (FQT->isUnionType())
         HasUnion = true;
 
-      const RecordType *RT = FQT->getAsRecordType();
-      const RecordDecl *RD = RT->getDecl();
-      // FIXME - Find a more efficient way of passing records down.
-      TmpRecFields.append(RD->field_begin(CGM.getContext()),
-                          RD->field_end(CGM.getContext()));
-      const llvm::Type *Ty = CGM.getTypes().ConvertType(FQT);
-      const llvm::StructLayout *RecLayout = 
-        CGM.getTargetData().getStructLayout(cast<llvm::StructType>(Ty));
-      
-      BuildAggrIvarLayout(0, RecLayout, RD, TmpRecFields,
-                          BytePos + GetFieldBaseOffset(OI, Layout, Field),
-                          ForStrongLayout, HasUnion);
-      TmpRecFields.clear();
+      BuildAggrIvarRecordLayout(FQT->getAsRecordType(), 
+                                BytePos + GetFieldBaseOffset(OI, Layout, Field),
+                                ForStrongLayout, HasUnion);
       continue;
     }
     
@@ -2994,22 +3002,12 @@
         int OldIndex = IvarsInfo.size() - 1;
         int OldSkIndex = SkipIvars.size() -1;
         
-        // FIXME - Use a common routine with the above!
         const RecordType *RT = FQT->getAsRecordType();
-        const RecordDecl *RD = RT->getDecl();
-        // FIXME - Find a more efficient way of passing records down.
-        TmpRecFields.append(RD->field_begin(CGM.getContext()),
-                            RD->field_end(CGM.getContext()));
-        const llvm::Type *Ty = CGM.getTypes().ConvertType(FQT);
-        const llvm::StructLayout *RecLayout = 
-          CGM.getTargetData().getStructLayout(cast<llvm::StructType>(Ty));
-        
-        BuildAggrIvarLayout(0, RecLayout, RD,
-                            TmpRecFields,
-                            BytePos + GetFieldBaseOffset(OI, Layout, Field),
-                            ForStrongLayout, HasUnion);
-        TmpRecFields.clear();
-
+        BuildAggrIvarRecordLayout(RT, 
+                                  BytePos + GetFieldBaseOffset(OI, Layout, 
+                                                               Field),
+                                  ForStrongLayout, HasUnion);
+                                  
         // Replicate layout information for each array element. Note that
         // one element is already done.
         uint64_t ElIx = 1;
@@ -3028,7 +3026,7 @@
     }
     // At this point, we are done with Record/Union and array there of.
     // For other arrays we are down to its element type.
-    QualType::GCAttrTypes GCAttr = GetGCAttrTypeForType(FQT):
+    QualType::GCAttrTypes GCAttr = GetGCAttrTypeForType(CGM.getContext(), FQT);
 
     unsigned FieldSize = CGM.getContext().getTypeSize(Field->getType());
     if ((ForStrongLayout && GCAttr == QualType::Strong)
@@ -3063,6 +3061,7 @@
       }
     }
   }
+
   if (LastFieldBitfield) {
     // Last field was a bitfield. Must update skip info.
     Expr *BitWidth = LastFieldBitfield->getBitWidth();





More information about the cfe-commits mailing list