summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2008-12-13 20:28:25 +0000
committerFariborz Jahanian <fjahanian@apple.com>2008-12-13 20:28:25 +0000
commit0222553d1c061a987e1fb0e63fc457ddb27dee5e (patch)
tree72cd56f1fc71c47dbedae22ac228898623132076 /clang/lib
parent77c76ae3deed9cf2ac8a4f5ce46abc6e2fa1604a (diff)
downloadbcm5719-llvm-0222553d1c061a987e1fb0e63fc457ddb27dee5e.tar.gz
bcm5719-llvm-0222553d1c061a987e1fb0e63fc457ddb27dee5e.zip
Add storage layout to ObjC classes.
llvm-svn: 60993
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/DeclObjC.cpp33
-rw-r--r--clang/lib/Sema/SemaDecl.cpp4
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp1
3 files changed, 37 insertions, 1 deletions
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
index b9226318e39..e3e4548f644 100644
--- a/clang/lib/AST/DeclObjC.cpp
+++ b/clang/lib/AST/DeclObjC.cpp
@@ -338,6 +338,17 @@ ObjCIvarDecl *
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 @@ void ObjCInterfaceDecl::addInstanceVariablesToClass(ObjCIvarDecl **ivars,
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.
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 28904646573..253850a0df0 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -3075,8 +3075,10 @@ void Sema::ActOnFields(Scope* S,
Consumer.HandleTagDeclDefinition(Record);
} else {
ObjCIvarDecl **ClsFields = reinterpret_cast<ObjCIvarDecl**>(&RecFields[0]);
- if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(EnclosingDecl))
+ if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(EnclosingDecl)) {
ID->addInstanceVariablesToClass(ClsFields, RecFields.size(), RBrac);
+ ID->addLayoutToClass(Context);
+ }
else if (ObjCImplementationDecl *IMPDecl =
dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
assert(IMPDecl && "ActOnFields - missing ObjCImplementationDecl");
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
index d1357247709..3545eb0c0a0 100644
--- a/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/clang/lib/Sema/SemaDeclObjC.cpp
@@ -588,6 +588,7 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
/// Add implementations's ivar to the synthesize class's ivar list.
if (IDecl->ImplicitInterfaceDecl()) {
IDecl->addInstanceVariablesToClass(ivars, numIvars, RBrace);
+ IDecl->addLayoutToClass(Context);
return;
}
// If implementation has empty ivar list, just return.
OpenPOWER on IntegriCloud