Add storage layout to ObjC classes.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60993 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index b922631..e3e4548 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -338,6 +338,17 @@
   return 0;
 }
 
+void ObjCInterfaceDecl::CollectObjCIvars(std::vector<FieldDecl*> &Fields) {
+  ObjCInterfaceDecl *SuperClass = getSuperClass();
+  if (SuperClass)
+    SuperClass->CollectObjCIvars(Fields);
+  for (ObjCInterfaceDecl::ivar_iterator I = ivar_begin(),
+       E = ivar_end(); I != E; ++I) {
+    ObjCIvarDecl *IVDecl = (*I);
+    Fields.push_back(cast<FieldDecl>(IVDecl));
+  }
+}
+  
 /// ObjCAddInstanceVariablesToClass - Inserts instance variables
 /// into ObjCInterfaceDecl's fields.
 ///
@@ -352,6 +363,28 @@
   setLocEnd(RBrac);
 }
 
+/// addInstanceVariablesToClass - produces layout info. for the class for its
+/// ivars and all those inherited.
+///
+void ObjCInterfaceDecl::addLayoutToClass(ASTContext &Context)
+{
+  std::vector<FieldDecl*> RecFields;
+  CollectObjCIvars(RecFields);
+  RecordDecl *RD = RecordDecl::Create(Context, TagDecl::TK_struct, 0,
+                                      getLocation(),
+                                      getIdentifier());
+  /// FIXME! Can do collection of ivars and adding to the record while
+  /// doing it.
+  for (unsigned int i = 0; i != RecFields.size(); i++) {
+    FieldDecl *Field =  FieldDecl::Create(Context, RD, SourceLocation(), 
+                                          RecFields[i]->getIdentifier(),
+                                          RecFields[i]->getType(), 0, false, 0);
+    RD->addDecl(Context, Field);
+  }
+  RD->completeDefinition(Context);
+  setRecordForDecl(RD);  
+}
+
 /// ObjCAddInstanceVariablesToClassImpl - Checks for correctness of Instance 
 /// Variables (Ivars) relative to what declared in @implementation;s class. 
 /// Ivars into ObjCImplementationDecl's fields.