[cfe-commits] r60993 - in /cfe/trunk: include/clang/AST/DeclObjC.h lib/AST/DeclObjC.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp

Douglas Gregor dgregor at apple.com
Mon Dec 15 08:43:21 PST 2008


On Dec 13, 2008, at 12:28 PM, Fariborz Jahanian wrote:

> 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.

Cool.

>
> 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; }
> +

Should setRecordForDecl be private? It looks like addLayoutToClass  
will be the only caller.

> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- 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));
> +  }
> +}
> +

There's a nearly identical routine called CollectIvars in lib/Sema/ 
SemaDecl.cpp, except that it creates ObjCAtDefsFieldDecls rather than  
collecting FieldDecls. Is CollectObjCIvars meant to do the same thing?  
And, is it part of semantic analysis (handling @defs) such that it  
should live in Sema, or is it a core operation on Objective-C AST's  
(and therefore should live in the AST)?

> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- 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");

Will we need to have the RecordDecl layout for most or all Objective-C  
interfaces? If most programs only need the layout for a small number  
of interfaces, it might be beneficial to compute the layouts lazily  
(as we do with the layout of RecordDecls).

	- Doug



More information about the cfe-commits mailing list