[cfe-commits] r55821 - in /cfe/trunk: Driver/RewriteObjC.cpp include/clang/AST/Decl.h include/clang/AST/DeclCXX.h lib/AST/ASTContext.cpp lib/AST/Decl.cpp lib/AST/DeclCXX.cpp lib/AST/DeclSerialization.cpp lib/CodeGen/CGObjCMac.cpp lib/Sema/Sema.cpp lib/Sema/SemaDecl.cpp

Ted Kremenek kremenek at apple.com
Thu Sep 4 18:34:33 PDT 2008


Author: kremenek
Date: Thu Sep  4 20:34:33 2008
New Revision: 55821

URL: http://llvm.org/viewvc/llvm-project?rev=55821&view=rev
Log:
Remove "NextDecl" from RecordDecl.  This change touches many files that where RecordDecl or CXXRecordDecl was constructed, always with an argument of 'NULL' for the previous declaration.

The motivation behind this change is that chaining the RecordDecls is simply unnecessary.  Once we create multiple RecordDecls for the same struct/union/class, clients that care about all the declarations of the same struct can build a back map by seeing which Decls refer to the same RecordType.

Modified:
    cfe/trunk/Driver/RewriteObjC.cpp
    cfe/trunk/include/clang/AST/Decl.h
    cfe/trunk/include/clang/AST/DeclCXX.h
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/lib/AST/Decl.cpp
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/lib/AST/DeclSerialization.cpp
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/lib/Sema/Sema.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp

Modified: cfe/trunk/Driver/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteObjC.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteObjC.cpp (original)
+++ cfe/trunk/Driver/RewriteObjC.cpp Thu Sep  4 20:34:33 2008
@@ -880,7 +880,7 @@
       RecName += "_IMPL";
       IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
       RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
-                                          SourceLocation(), II, 0);
+                                          SourceLocation(), II);
       assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
       CastExpr *castExpr = new ExplicitCastExpr(castT, IV->getBase(),
@@ -922,7 +922,7 @@
       RecName += "_IMPL";
       IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
       RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
-                                          SourceLocation(), II, 0);
+                                          SourceLocation(), II);
       assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
       QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
       CastExpr *castExpr = new ExplicitCastExpr(castT, IV->getBase(),
@@ -1795,7 +1795,7 @@
   llvm::SmallVector<QualType, 16> ArgTys;
   RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
                                       SourceLocation(),
-                                      &Context->Idents.get("objc_super"), 0);
+                                      &Context->Idents.get("objc_super"));
   QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
   assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
   ArgTys.push_back(argT);
@@ -1838,7 +1838,7 @@
   llvm::SmallVector<QualType, 16> ArgTys;
   RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
                                       SourceLocation(),
-                                      &Context->Idents.get("objc_super"), 0);
+                                      &Context->Idents.get("objc_super"));
   QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
   assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
   ArgTys.push_back(argT);
@@ -1964,7 +1964,7 @@
   if (!SuperStructDecl) {
     SuperStructDecl = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
                                          SourceLocation(), 
-                                         &Context->Idents.get("objc_super"), 0);
+                                         &Context->Idents.get("objc_super"));
     QualType FieldTypes[2];
   
     // struct objc_object *receiver;
@@ -1987,7 +1987,7 @@
   if (!ConstantStringDecl) {
     ConstantStringDecl = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
                                             SourceLocation(), 
-                         &Context->Idents.get("__NSConstantStringImpl"), 0);
+                         &Context->Idents.get("__NSConstantStringImpl"));
     QualType FieldTypes[4];
   
     // struct objc_object *receiver;

Modified: cfe/trunk/include/clang/AST/Decl.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Decl.h (original)
+++ cfe/trunk/include/clang/AST/Decl.h Thu Sep  4 20:34:33 2008
@@ -795,38 +795,21 @@
   /// array member (e.g. int X[]) or if this union contains a struct that does.
   /// If so, this cannot be contained in arrays or other structs as a member.
   bool HasFlexibleArrayMember : 1;
-
-  /// NextDecl - A pointer to the next RecordDecl in a chain of RecordDecls
-  ///  for the same struct/union.  By construction, the last RecordDecl in
-  ///  the chain is the one that provides the definition of the struct/union
-  ///  (i.e., all forward declarations appear first in the chain).  Note that
-  ///  one should make no other assumption about the order of the RecordDecl's
-  ///  within this chain with respect to the original source.
-  ///  NOTE: This is *not* an owning reference.
-  RecordDecl* NextDecl;
   
   /// Members/NumMembers - This is a new[]'d array of pointers to Decls.
   FieldDecl **Members;   // Null if not defined.
   int NumMembers;   // -1 if not defined.
 
 protected:
-  RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, 
-             RecordDecl *PrevDecl);
-
+  RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id);
   virtual ~RecordDecl();
 
 public:
   static RecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
-                            SourceLocation L, IdentifierInfo *Id,
-                            RecordDecl *PrevDecl);
+                            SourceLocation L, IdentifierInfo *Id);
 
   virtual void Destroy(ASTContext& C);
-    
-  /// getDefinitionDecl - Returns the RecordDecl for the struct/union that
-  ///  represents the actual definition (i.e., not a forward declaration).
-  ///  This method returns NULL if no such RecordDecl exists.
-  const RecordDecl* getDefinitionDecl() const;  
-  
+      
   bool hasFlexibleArrayMember() const { return HasFlexibleArrayMember; }
   void setHasFlexibleArrayMember(bool V) { HasFlexibleArrayMember = V; }
   

Modified: cfe/trunk/include/clang/AST/DeclCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)
+++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Sep  4 20:34:33 2008
@@ -43,15 +43,13 @@
 /// The only difference with RecordDecl is that CXXRecordDecl is a DeclContext.
 class CXXRecordDecl : public RecordDecl, public DeclContext {
 protected:
-  CXXRecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
-             CXXRecordDecl *PrevDecl) : RecordDecl(DK, DC, L, Id, PrevDecl),
-                                     DeclContext(DK) {
+  CXXRecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) 
+    : RecordDecl(DK, DC, L, Id), DeclContext(DK) {
     assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
   }
 public:
   static CXXRecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
-                               SourceLocation L, IdentifierInfo *Id,
-                               CXXRecordDecl *PrevDecl);
+                               SourceLocation L, IdentifierInfo *Id);
   
   const CXXFieldDecl *getMember(unsigned i) const {
     return cast<const CXXFieldDecl>(RecordDecl::getMember(i));

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Thu Sep  4 20:34:33 2008
@@ -1348,7 +1348,7 @@
   if (!CFConstantStringTypeDecl) {
     CFConstantStringTypeDecl = 
       RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(), 
-                         &Idents.get("NSConstantString"), 0);
+                         &Idents.get("NSConstantString"));
     QualType FieldTypes[4];
   
     // const int *isa;
@@ -1390,7 +1390,7 @@
     
     ObjCFastEnumerationStateTypeDecl =
       RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
-                         &Idents.get("__objcFastEnumerationState"), 0);
+                         &Idents.get("__objcFastEnumerationState"));
     
     ObjCFastEnumerationStateTypeDecl->defineBody(FieldDecls, 4);
   }

Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Thu Sep  4 20:34:33 2008
@@ -204,36 +204,18 @@
 //===----------------------------------------------------------------------===//
 
 RecordDecl::RecordDecl(Kind DK, DeclContext *DC, SourceLocation L,
-                       IdentifierInfo *Id, RecordDecl *PrevDecl)
-: TagDecl(DK, DC, L, Id, 0), NextDecl(0) {
+                       IdentifierInfo *Id)
+: TagDecl(DK, DC, L, Id, 0) {
   
   HasFlexibleArrayMember = false;
   assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
   Members = 0;
-  NumMembers = -1;
-  
-  // Hook up the RecordDecl chain.
-  if (PrevDecl) {
-    RecordDecl* Tmp = PrevDecl->NextDecl;    
-    // 'Tmp' might be non-NULL if it is the RecordDecl that provides the
-    // definition of the struct/union. By construction, the last RecordDecl
-    // in the chain is the 'defining' RecordDecl.
-    if (Tmp) { 
-      assert (Tmp->NextDecl == 0);
-      assert (Tmp->isDefinition()
-              && "Previous RecordDecl has a NextDecl that is "
-              "not the 'defining' RecordDecl");
-      
-      NextDecl = Tmp;
-    }
-    
-    PrevDecl->NextDecl = this;
-  }
+  NumMembers = -1;  
 }
 
 RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
-                               SourceLocation L, IdentifierInfo *Id,
-                               RecordDecl *PrevDecl) {
+                               SourceLocation L, IdentifierInfo *Id) {
+  
   void *Mem = C.getAllocator().Allocate<RecordDecl>();
   Kind DK;
   switch (TK) {
@@ -243,7 +225,7 @@
     case TK_union:  DK = Union;  break;
     case TK_class:  DK = Class;  break;
   }
-  return new (Mem) RecordDecl(DK, DC, L, Id, PrevDecl);
+  return new (Mem) RecordDecl(DK, DC, L, Id);
 }
 
 RecordDecl::~RecordDecl() {
@@ -281,16 +263,3 @@
       return Members[i];
   return 0;
 }
-
-/// getDefinitionDecl - Returns the RecordDecl for the struct/union that
-///  represents the actual definition (i.e., not a forward declaration).
-///  This method returns NULL if no such RecordDecl exists.
-const RecordDecl* RecordDecl::getDefinitionDecl() const {
-  const RecordDecl* R = this;
-  
-  for (RecordDecl* N = R->NextDecl; N; N = R->NextDecl)
-    R = N;
-  
-  return R->Members ? R : 0;
-}
-

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Sep  4 20:34:33 2008
@@ -27,8 +27,7 @@
 }
 
 CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
-                                     SourceLocation L, IdentifierInfo *Id,
-                                     CXXRecordDecl *PrevDecl) {
+                                     SourceLocation L, IdentifierInfo *Id) {
   Kind DK;
   switch (TK) {
     default: assert(0 && "Invalid TagKind!");
@@ -38,7 +37,7 @@
     case TK_class:  DK = CXXClass;  break;
   }
   void *Mem = C.getAllocator().Allocate<CXXRecordDecl>();
-  return new (Mem) CXXRecordDecl(DK, DC, L, Id, PrevDecl);
+  return new (Mem) CXXRecordDecl(DK, DC, L, Id);
 }
 
 CXXMethodDecl *

Modified: cfe/trunk/lib/AST/DeclSerialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclSerialization.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclSerialization.cpp (original)
+++ cfe/trunk/lib/AST/DeclSerialization.cpp Thu Sep  4 20:34:33 2008
@@ -449,7 +449,6 @@
   ScopedDecl::EmitInRec(S);
   S.EmitBool(isDefinition());
   S.EmitBool(hasFlexibleArrayMember());
-  S.EmitPtr(NextDecl);
   S.EmitSInt(getNumMembers());
   if (getNumMembers() > 0) {
     assert (Members);
@@ -463,12 +462,11 @@
                                    ASTContext& C) {
 
   void *Mem = C.getAllocator().Allocate<RecordDecl>();
-  RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
+  RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL);
     
   decl->ScopedDecl::ReadInRec(D, C);
   decl->setDefinition(D.ReadBool());
   decl->setHasFlexibleArrayMember(D.ReadBool());
-  D.ReadPtr(decl->NextDecl); // Allow backpatching.
   decl->NumMembers = D.ReadSInt();
   
   if (decl->getNumMembers() > 0) {

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Thu Sep  4 20:34:33 2008
@@ -1866,7 +1866,7 @@
   // FIXME: Merge with rewriter code?
   RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
                                       SourceLocation(),
-                                      &Ctx.Idents.get("_objc_super"), 0);  
+                                      &Ctx.Idents.get("_objc_super"));  
   FieldDecl *FieldDecls[2];
   FieldDecls[0] = FieldDecl::Create(Ctx, SourceLocation(), 0, 
                                     Ctx.getObjCIdType());

Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Thu Sep  4 20:34:33 2008
@@ -32,11 +32,11 @@
   if (C.getLangOptions().CPlusPlus)
     return CXXRecordDecl::Create(C, TagDecl::TK_struct, 
                                  C.getTranslationUnitDecl(),
-                                 SourceLocation(), &C.Idents.get(Name), 0);
+                                 SourceLocation(), &C.Idents.get(Name));
   else
     return RecordDecl::Create(C, TagDecl::TK_struct, 
                               C.getTranslationUnitDecl(),
-                              SourceLocation(), &C.Idents.get(Name), 0);
+                              SourceLocation(), &C.Idents.get(Name));
 }
 
 void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=55821&r1=55820&r2=55821&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Sep  4 20:34:33 2008
@@ -1765,14 +1765,12 @@
       // We use 'dyn_cast' instead of 'cast' because PrevDecl might not
       // be a CXXRecordDecl* if we had a redefinition error.  In this case,
       // the dyn_cast will return a NULL pointer.
-      New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name,
-                                  dyn_cast_or_null<CXXRecordDecl>(PrevDecl));
+      New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name);
     else
       // We use 'dyn_cast' instead of 'cast' because PrevDecl might not
       // be a RecordDecl* if we had a redefinition error.  In this case,
       // the dyn_cast will return a NULL pointer.      
-      New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name,
-                               dyn_cast_or_null<RecordDecl>(PrevDecl));
+      New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name);
   }
   
   // If this has an identifier, add it to the scope stack.





More information about the cfe-commits mailing list