]> granicus.if.org Git - clang/commitdiff
Split out getASTObjCImplementationLayout
authorDaniel Dunbar <daniel@zuster.org>
Sun, 3 May 2009 10:38:35 +0000 (10:38 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sun, 3 May 2009 10:38:35 +0000 (10:38 +0000)
 - 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

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp

index fef2ed72311c93e538f59d4074733c76224c8e80..18ea40b1e97480727b3b41b09a704f713ef87eb6 100644 (file)
@@ -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<const RecordDecl*, const ASTRecordLayout*> ASTRecordLayouts;
-  llvm::DenseMap<const ObjCInterfaceDecl*, 
-                 const ASTRecordLayout*> ASTObjCInterfaces;
+  llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*> ObjCLayouts;
 
   llvm::DenseMap<unsigned, FixedWidthIntType*> SignedFixedWidthIntTypes;
   llvm::DenseMap<unsigned, FixedWidthIntType*> 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<FieldDecl*> &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
index 0494de199f9e176185c7673c62144169f907994e..3342ca5bc9d08b513aac05f3e5631d34f1a2b11f 100644 (file)
@@ -63,8 +63,8 @@ ASTContext::~ASTContext() {
   }
 
   {
-    llvm::DenseMap<const ObjCInterfaceDecl*, const ASTRecordLayout*>::iterator
-      I = ASTObjCInterfaces.begin(), E = ASTObjCInterfaces.end();
+    llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*>::iterator
+      I = ObjCLayouts.begin(), E = ObjCLayouts.end();
     while (I != E) {
       ASTRecordLayout *R = const_cast<ASTRecordLayout*>((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.