From: Daniel Dunbar Date: Sun, 3 May 2009 10:38:35 +0000 (+0000) Subject: Split out getASTObjCImplementationLayout X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b2dbbb99e12806eaaf53b7ccabc32f42b5719443;p=clang Split out getASTObjCImplementationLayout - The difference from getASTObjCInterfaceLayout is that the computes the layout including synthesized ivars. - No functionality change, they currently both compute the same thing -- whether that includes synthesized ivars or not depends on when they get called!!! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70690 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index fef2ed7231..18ea40b1e9 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -93,8 +93,7 @@ class ASTContext { /// ASTRecordLayouts - A cache mapping from RecordDecls to ASTRecordLayouts. /// This is lazily created. This is intentionally not serialized. llvm::DenseMap ASTRecordLayouts; - llvm::DenseMap ASTObjCInterfaces; + llvm::DenseMap ObjCLayouts; llvm::DenseMap SignedFixedWidthIntTypes; llvm::DenseMap UnsignedFixedWidthIntTypes; @@ -530,7 +529,16 @@ public: /// position information. const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D); + /// getASTObjCInterfaceLayout - Get or compute information about the + /// layout of the specified Objective-C interface. const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D); + + /// getASTObjCImplementationLayout - Get or compute information about + /// the layout of the specified Objective-C implementation. This may + /// differ from the interface if synthesized ivars are present. + const ASTRecordLayout & + getASTObjCImplementationLayout(const ObjCImplementationDecl *D); + const RecordDecl *addRecordToClass(const ObjCInterfaceDecl *D); void CollectObjCIvars(const ObjCInterfaceDecl *OI, llvm::SmallVectorImpl &Fields); @@ -741,7 +749,9 @@ private: const FieldDecl *Field, bool OutermostType = false, bool EncodingProperty = false); - + + const ASTRecordLayout &getObjCLayout(const ObjCInterfaceDecl *D, + const ObjCImplementationDecl *Impl); }; } // end namespace clang diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 0494de199f..3342ca5bc9 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -63,8 +63,8 @@ ASTContext::~ASTContext() { } { - llvm::DenseMap::iterator - I = ASTObjCInterfaces.begin(), E = ASTObjCInterfaces.end(); + llvm::DenseMap::iterator + I = ObjCLayouts.begin(), E = ObjCLayouts.end(); while (I != E) { ASTRecordLayout *R = const_cast((I++)->second); delete R; @@ -736,13 +736,16 @@ const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D) { return RD; } -/// getASTObjcInterfaceLayout - Get or compute information about the layout of -/// the specified Objective C, which indicates its size and ivar -/// position information. +/// getInterfaceLayoutImpl - Get or compute information about the +/// layout of the given interface. +/// +/// \param Impl - If given, also include the layout of the interface's +/// implementation. This may differ by including synthesized ivars. const ASTRecordLayout & -ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) { +ASTContext::getObjCLayout(const ObjCInterfaceDecl *D, + const ObjCImplementationDecl *Impl) { // Look up this layout, if already laid out, return what we have. - const ASTRecordLayout *&Entry = ASTObjCInterfaces[D]; + const ASTRecordLayout *&Entry = ObjCLayouts[D]; if (Entry) return *Entry; // Allocate and assign into ASTRecordLayouts here. The "Entry" reference can @@ -795,6 +798,16 @@ ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) { return *NewEntry; } +const ASTRecordLayout & +ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) { + return getObjCLayout(D, 0); +} + +const ASTRecordLayout & +ASTContext::getASTObjCImplementationLayout(const ObjCImplementationDecl *D) { + return getObjCLayout(D->getClassInterface(), D); +} + /// getASTRecordLayout - Get or compute information about the layout of the /// specified record (struct/union/class), which indicates its size and field /// position information.