From: Ted Kremenek Date: Fri, 5 Sep 2008 01:34:33 +0000 (+0000) Subject: Remove "NextDecl" from RecordDecl. This change touches many files that where RecordD... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df042e6c2bf06b2d9ed53c52469599ac1bd93a3f;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55821 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp index 2f91ea9741..b078db3184 100644 --- a/Driver/RewriteObjC.cpp +++ b/Driver/RewriteObjC.cpp @@ -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 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 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; diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 9688ea3e8c..0e2db965f9 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -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; } diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index a4f522eaf5..614e8ef93c 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -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(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(RecordDecl::getMember(i)); diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 2264bca0f9..5a6aa1ae31 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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); } diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 04cec6f66b..eb9d0efdb4 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -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(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(); 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; -} - diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 2fe69fced5..0cce7db1d6 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -27,8 +27,7 @@ CXXFieldDecl *CXXFieldDecl::Create(ASTContext &C, CXXRecordDecl *RD, } 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 @@ CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, case TK_class: DK = CXXClass; break; } void *Mem = C.getAllocator().Allocate(); - return new (Mem) CXXRecordDecl(DK, DC, L, Id, PrevDecl); + return new (Mem) CXXRecordDecl(DK, DC, L, Id); } CXXMethodDecl * diff --git a/lib/AST/DeclSerialization.cpp b/lib/AST/DeclSerialization.cpp index 82a8fcd0f6..3f36e3ac89 100644 --- a/lib/AST/DeclSerialization.cpp +++ b/lib/AST/DeclSerialization.cpp @@ -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* 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) { diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 9638bc1430..a535ea254e 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -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()); diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index b288c62787..9092f83f0a 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -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) { diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index b45611ca59..53327e497e 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(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(PrevDecl)); + New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name); } // If this has an identifier, add it to the scope stack.