]> granicus.if.org Git - clang/commitdiff
Remove "NextDecl" from RecordDecl. This change touches many files that where RecordD...
authorTed Kremenek <kremenek@apple.com>
Fri, 5 Sep 2008 01:34:33 +0000 (01:34 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 5 Sep 2008 01:34:33 +0000 (01:34 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55821 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 2f91ea9741bc0cfd4fe6e1f5c29c6df418c06841..b078db3184459fde2f862c03c430e5340d7f9f2e 100644 (file)
@@ -880,7 +880,7 @@ Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,
       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 @@ Stmt *RewriteObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV,
       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 @@ void RewriteObjC::SynthMsgSendSuperFunctionDecl() {
   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 @@ void RewriteObjC::SynthMsgSendSuperStretFunctionDecl() {
   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 @@ QualType RewriteObjC::getSuperStructType() {
   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 @@ QualType RewriteObjC::getConstantStringStructType() {
   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;
index 9688ea3e8cff813db5d800516547bf8316e8aa3d..0e2db965f99956087dfc9a729826dd977c66bb28 100644 (file)
@@ -795,38 +795,21 @@ class RecordDecl : public TagDecl {
   /// 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; }
   
index a4f522eaf5ed4db333684af7b8669459f863f233..614e8ef93c5b6daf16ebe1d27816ad11213a2fdd 100644 (file)
@@ -43,15 +43,13 @@ public:
 /// 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));
index 2264bca0f9cac26390281348974d83f0482715bd..5a6aa1ae3120514b5bb57eacf9f41ee432708fa5 100644 (file)
@@ -1348,7 +1348,7 @@ QualType ASTContext::getCFConstantStringType() {
   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 @@ QualType ASTContext::getObjCFastEnumerationStateType()
     
     ObjCFastEnumerationStateTypeDecl =
       RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
-                         &Idents.get("__objcFastEnumerationState"), 0);
+                         &Idents.get("__objcFastEnumerationState"));
     
     ObjCFastEnumerationStateTypeDecl->defineBody(FieldDecls, 4);
   }
index 04cec6f66bb3382eac3a5e3ed598f71e73ef8246..eb9d0efdb483078139c6c259457ed709e2f75d88 100644 (file)
@@ -204,36 +204,18 @@ unsigned FunctionDecl::getMinRequiredArguments() const {
 //===----------------------------------------------------------------------===//
 
 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 @@ RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
     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 @@ FieldDecl *RecordDecl::getMember(IdentifierInfo *II) {
       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;
-}
-
index 2fe69fced52bd76e050d63cb29dfb2c0e78a7ba7..0cce7db1d687c6b2575a1477651f93a951e5f2d8 100644 (file)
@@ -27,8 +27,7 @@ CXXFieldDecl *CXXFieldDecl::Create(ASTContext &C, CXXRecordDecl *RD,
 }\r
 \r
 CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,\r
-                                     SourceLocation L, IdentifierInfo *Id,\r
-                                     CXXRecordDecl *PrevDecl) {\r
+                                     SourceLocation L, IdentifierInfo *Id) {\r
   Kind DK;\r
   switch (TK) {\r
     default: assert(0 && "Invalid TagKind!");\r
@@ -38,7 +37,7 @@ CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
     case TK_class:  DK = CXXClass;  break;\r
   }\r
   void *Mem = C.getAllocator().Allocate<CXXRecordDecl>();\r
-  return new (Mem) CXXRecordDecl(DK, DC, L, Id, PrevDecl);\r
+  return new (Mem) CXXRecordDecl(DK, DC, L, Id);\r
 }\r
 \r
 CXXMethodDecl *\r
index 82a8fcd0f6209057d162215fd3aee855da37d98c..3f36e3ac89dbf46155fb3b3fdca54e11c1bc0a8a 100644 (file)
@@ -449,7 +449,6 @@ void RecordDecl::EmitImpl(Serializer& S) const {
   ScopedDecl::EmitInRec(S);
   S.EmitBool(isDefinition());
   S.EmitBool(hasFlexibleArrayMember());
-  S.EmitPtr(NextDecl);
   S.EmitSInt(getNumMembers());
   if (getNumMembers() > 0) {
     assert (Members);
@@ -463,12 +462,11 @@ RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D,
                                    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) {
index 9638bc1430819eeecdfb11004ecc10fd39ad6774..a535ea254ee5deeca73cc0ed085026b455fda248 100644 (file)
@@ -1866,7 +1866,7 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
   // 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());
index b288c62787242ee220352e26146f37fa70bb3524..9092f83f0a45897467dc5b6a551abe0a82e461b5 100644 (file)
@@ -32,11 +32,11 @@ static inline RecordDecl *CreateStructDecl(ASTContext &C, const char *Name)
   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) {
index b45611ca59b5d2622bec23587a5e631d000c3fde..53327e497e5dc6bc1b763602e54bec9b7b97a54b 100644 (file)
@@ -1765,14 +1765,12 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK,
       // 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.