[cfe-commits] r60993 - in /cfe/trunk: include/clang/AST/DeclObjC.h lib/AST/DeclObjC.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp
Fariborz Jahanian
fjahanian at apple.com
Sat Dec 13 12:28:25 PST 2008
Author: fjahanian
Date: Sat Dec 13 14:28:25 2008
New Revision: 60993
URL: http://llvm.org/viewvc/llvm-project?rev=60993&view=rev
Log:
Add storage layout to ObjC classes.
Modified:
cfe/trunk/include/clang/AST/DeclObjC.h
cfe/trunk/lib/AST/DeclObjC.cpp
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaDeclObjC.cpp
Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=60993&r1=60992&r2=60993&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Sat Dec 13 14:28:25 2008
@@ -23,6 +23,7 @@
class Stmt;
class FunctionDecl;
class AttributeList;
+class RecordDecl;
class ObjCIvarDecl;
class ObjCMethodDecl;
class ObjCProtocolDecl;
@@ -276,6 +277,8 @@
Type *TypeForDecl;
friend class ASTContext;
+ RecordDecl *RecordForDecl;
+
/// Class's super class.
ObjCInterfaceDecl *SuperClass;
@@ -312,7 +315,7 @@
ObjCInterfaceDecl(SourceLocation atLoc, IdentifierInfo *Id,
SourceLocation CLoc, bool FD, bool isInternal)
: NamedDecl(ObjCInterface, atLoc, Id), DeclContext(ObjCInterface),
- TypeForDecl(0), SuperClass(0),
+ TypeForDecl(0), RecordForDecl(0), SuperClass(0),
Ivars(0), NumIvars(0),
InstanceMethods(0), NumInstanceMethods(0),
ClassMethods(0), NumClassMethods(0),
@@ -347,6 +350,10 @@
protocol_iterator protocol_begin() const {return ReferencedProtocols.begin();}
protocol_iterator protocol_end() const { return ReferencedProtocols.end(); }
+ void CollectObjCIvars(std::vector<FieldDecl*> &Fields);
+ void setRecordForDecl(RecordDecl *Decl) { RecordForDecl = Decl; }
+ RecordDecl *getRecordForDecl() const { return RecordForDecl; }
+
typedef ObjCIvarDecl * const *ivar_iterator;
ivar_iterator ivar_begin() const { return Ivars; }
ivar_iterator ivar_end() const { return Ivars + ivar_size();}
@@ -376,6 +383,8 @@
void addInstanceVariablesToClass(ObjCIvarDecl **ivars, unsigned numIvars,
SourceLocation RBracLoc);
+
+ void addLayoutToClass(ASTContext &Context);
void addMethods(ObjCMethodDecl **insMethods, unsigned numInsMembers,
ObjCMethodDecl **clsMethods, unsigned numClsMembers,
Modified: cfe/trunk/lib/AST/DeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=60993&r1=60992&r2=60993&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp (original)
+++ cfe/trunk/lib/AST/DeclObjC.cpp Sat Dec 13 14:28:25 2008
@@ -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.
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=60993&r1=60992&r2=60993&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat Dec 13 14:28:25 2008
@@ -3075,8 +3075,10 @@
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");
Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=60993&r1=60992&r2=60993&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Sat Dec 13 14:28:25 2008
@@ -588,6 +588,7 @@
/// 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.
More information about the cfe-commits
mailing list