diff options
Diffstat (limited to 'lib/AST')
-rw-r--r-- | lib/AST/ASTContext.cpp | 9 | ||||
-rw-r--r-- | lib/AST/Decl.cpp | 97 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 42 | ||||
-rw-r--r-- | lib/AST/DeclSerialization.cpp | 24 |
4 files changed, 99 insertions, 73 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ce75122b3d..9e51b292fb 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1115,7 +1115,7 @@ QualType ASTContext::maxIntegerType(QualType lhs, QualType rhs) { QualType ASTContext::getCFConstantStringType() { if (!CFConstantStringTypeDecl) { CFConstantStringTypeDecl = - RecordDecl::Create(*this, Decl::Struct, SourceLocation(), + RecordDecl::Create(*this, Decl::Struct, NULL, SourceLocation(), &Idents.get("NSConstantString"), 0); QualType FieldTypes[4]; @@ -1131,7 +1131,8 @@ QualType ASTContext::getCFConstantStringType() { FieldDecl *FieldDecls[4]; for (unsigned i = 0; i < 4; ++i) - FieldDecls[i] = FieldDecl::Create(*this, SourceLocation(), 0, + FieldDecls[i] = FieldDecl::Create(*this, CFConstantStringTypeDecl, + SourceLocation(), 0, FieldTypes[i]); CFConstantStringTypeDecl->defineBody(FieldDecls, 4); @@ -1907,14 +1908,14 @@ ASTContext* ASTContext::Create(llvm::Deserializer& D) { TargetInfo &t = D.ReadRef<TargetInfo>(); IdentifierTable &idents = D.ReadRef<IdentifierTable>(); SelectorTable &sels = D.ReadRef<SelectorTable>(); - + unsigned size_reserve = D.ReadInt(); ASTContext* A = new ASTContext(SM,t,idents,sels,size_reserve); for (unsigned i = 0; i < size_reserve; ++i) Type::Create(*A,i,D); - + // FIXME: A->CFConstantStringTypeDecl = D.ReadOwnedPtr<RecordDecl>(); return A; diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 3e7d83826e..38a20c1c01 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -204,77 +204,87 @@ void Decl::addDeclKind(Kind k) { // Decl Allocation/Deallocation Method Implementations //===----------------------------------------------------------------------===// -BlockVarDecl *BlockVarDecl::Create(ASTContext &C, SourceLocation L, +BlockVarDecl *BlockVarDecl::Create(ASTContext &C, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<BlockVarDecl>(); - return new (Mem) BlockVarDecl(L, Id, T, S, PrevDecl); + return new (Mem) BlockVarDecl(CD, L, Id, T, S, PrevDecl); } -FileVarDecl *FileVarDecl::Create(ASTContext &C, SourceLocation L, - IdentifierInfo *Id, QualType T, StorageClass S, +FileVarDecl *FileVarDecl::Create(ASTContext &C, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, + QualType T, StorageClass S, ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<FileVarDecl>(); - return new (Mem) FileVarDecl(L, Id, T, S, PrevDecl); + return new (Mem) FileVarDecl(CD, L, Id, T, S, PrevDecl); } -ParmVarDecl *ParmVarDecl::Create(ASTContext &C, SourceLocation L, - IdentifierInfo *Id, QualType T, StorageClass S, +ParmVarDecl *ParmVarDecl::Create(ASTContext &C, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, + QualType T, StorageClass S, ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<ParmVarDecl>(); - return new (Mem) ParmVarDecl(L, Id, T, S, PrevDecl); + return new (Mem) ParmVarDecl(CD, L, Id, T, S, PrevDecl); } -FunctionDecl *FunctionDecl::Create(ASTContext &C, SourceLocation L, +FunctionDecl *FunctionDecl::Create(ASTContext &C, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, bool isInline, ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<FunctionDecl>(); - return new (Mem) FunctionDecl(L, Id, T, S, isInline, PrevDecl); + return new (Mem) FunctionDecl(CD, L, Id, T, S, isInline, PrevDecl); } -FieldDecl *FieldDecl::Create(ASTContext &C, SourceLocation L, +FieldDecl *FieldDecl::Create(ASTContext &C, RecordDecl *CD, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *BW) { void *Mem = C.getAllocator().Allocate<FieldDecl>(); - return new (Mem) FieldDecl(L, Id, T, BW); + return new (Mem) FieldDecl(CD, L, Id, T, BW); } -EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, SourceLocation L, +EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, + SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V, ScopedDecl *PrevDecl){ void *Mem = C.getAllocator().Allocate<EnumConstantDecl>(); - return new (Mem) EnumConstantDecl(L, Id, T, E, V, PrevDecl); + return new (Mem) EnumConstantDecl(CD, L, Id, T, E, V, PrevDecl); } -TypedefDecl *TypedefDecl::Create(ASTContext &C, SourceLocation L, +TypedefDecl *TypedefDecl::Create(ASTContext &C, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, QualType T, ScopedDecl *PD) { void *Mem = C.getAllocator().Allocate<TypedefDecl>(); - return new (Mem) TypedefDecl(L, Id, T, PD); + return new (Mem) TypedefDecl(CD, L, Id, T, PD); } -EnumDecl *EnumDecl::Create(ASTContext &C, SourceLocation L, IdentifierInfo *Id, +EnumDecl *EnumDecl::Create(ASTContext &C, ContextDecl *CD, SourceLocation L, + IdentifierInfo *Id, ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<EnumDecl>(); - return new (Mem) EnumDecl(L, Id, PrevDecl); + return new (Mem) EnumDecl(CD, L, Id, PrevDecl); } -RecordDecl *RecordDecl::Create(ASTContext &C, Kind DK, SourceLocation L, - IdentifierInfo *Id, ScopedDecl *PrevDecl) { +RecordDecl *RecordDecl::Create(ASTContext &C, Kind DK, ContextDecl *CD, + SourceLocation L, IdentifierInfo *Id, + ScopedDecl *PrevDecl) { void *Mem = C.getAllocator().Allocate<RecordDecl>(); - return new (Mem) RecordDecl(DK, L, Id, PrevDecl); + return new (Mem) RecordDecl(DK, CD, L, Id, PrevDecl); } -FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, SourceLocation L, +FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, + SourceLocation L, StringLiteral *Str) { void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>(); return new (Mem) FileScopeAsmDecl(L, Str); } -LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, SourceLocation L, +LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, + SourceLocation L, LanguageIDs Lang, Decl *D) { void *Mem = C.getAllocator().Allocate<LinkageSpecDecl>(); return new (Mem) LinkageSpecDecl(L, Lang, D); @@ -320,35 +330,32 @@ const Attr *Decl::getAttrs() const { } //===----------------------------------------------------------------------===// -// NamedDecl Implementation +// ContextDecl Implementation //===----------------------------------------------------------------------===// -const char *NamedDecl::getName() const { - if (const IdentifierInfo *II = getIdentifier()) - return II->getName(); - return ""; +ContextDecl *ContextDecl::getParent() const { + if (ScopedDecl *SD = dyn_cast<ScopedDecl>(this)) + return SD->getContext(); + else + return NULL; +} + +Decl *ContextDecl::ToDecl (const ContextDecl *D) { + return CastTo<Decl>(D); +} + +ContextDecl *ContextDecl::FromDecl (const Decl *D) { + return CastTo<ContextDecl>(D); } //===----------------------------------------------------------------------===// -// ScopedDecl Implementation +// NamedDecl Implementation //===----------------------------------------------------------------------===// -// isDefinedOutsideFunctionOrMethod - This predicate returns true if this -// scoped decl is defined outside the current function or method. This is -// roughly global variables and functions, but also handles enums (which could -// be defined inside or outside a function etc). -bool ScopedDecl::isDefinedOutsideFunctionOrMethod() const { - if (const VarDecl *VD = dyn_cast<VarDecl>(this)) - return VD->hasGlobalStorage(); - if (isa<FunctionDecl>(this)) - return true; - - // FIXME: This needs to check the context the decl was defined in! - if (isa<TypeDecl>(this) || isa<EnumConstantDecl>(this)) - return true; - - assert(0 && "Unknown ScopedDecl!"); - return false; +const char *NamedDecl::getName() const { + if (const IdentifierInfo *II = getIdentifier()) + return II->getName(); + return ""; } //===----------------------------------------------------------------------===// diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 2e3a06a956..a01c3042d3 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -19,7 +19,8 @@ using namespace clang; // ObjC Decl Allocation/Deallocation Method Implementations //===----------------------------------------------------------------------===// -ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, +ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, + SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, Decl *contextDecl, @@ -27,61 +28,71 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation beginLoc, bool isVariadic, ImplementationControl impControl) { void *Mem = C.getAllocator().Allocate<ObjCMethodDecl>(); - return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, + return new (Mem) ObjCMethodDecl(beginLoc, endLoc, + SelInfo, T, contextDecl, M, isInstance, isVariadic, impControl); } -ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,SourceLocation atLoc, +ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, + SourceLocation atLoc, unsigned numRefProtos, IdentifierInfo *Id, bool ForwardDecl, bool isInternal){ void *Mem = C.getAllocator().Allocate<ObjCInterfaceDecl>(); - return new (Mem) ObjCInterfaceDecl(atLoc, numRefProtos, Id, ForwardDecl, + return new (Mem) ObjCInterfaceDecl(atLoc, numRefProtos, + Id, ForwardDecl, isInternal); } -ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, SourceLocation L, +ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCInterfaceDecl *CD, + SourceLocation L, IdentifierInfo *Id, QualType T) { void *Mem = C.getAllocator().Allocate<ObjCIvarDecl>(); - return new (Mem) ObjCIvarDecl(L, Id, T); + return new (Mem) ObjCIvarDecl(CD, L, Id, T); } -ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, SourceLocation L, +ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, + SourceLocation L, unsigned numRefProtos, IdentifierInfo *Id) { void *Mem = C.getAllocator().Allocate<ObjCProtocolDecl>(); return new (Mem) ObjCProtocolDecl(L, numRefProtos, Id); } -ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, SourceLocation L, +ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, + SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts) { void *Mem = C.getAllocator().Allocate<ObjCClassDecl>(); return new (Mem) ObjCClassDecl(L, Elts, nElts); } ObjCForwardProtocolDecl * -ObjCForwardProtocolDecl::Create(ASTContext &C, SourceLocation L, +ObjCForwardProtocolDecl::Create(ASTContext &C, + SourceLocation L, ObjCProtocolDecl **Elts, unsigned NumElts) { void *Mem = C.getAllocator().Allocate<ObjCForwardProtocolDecl>(); return new (Mem) ObjCForwardProtocolDecl(L, Elts, NumElts); } -ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, SourceLocation L, +ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, + SourceLocation L, IdentifierInfo *Id) { void *Mem = C.getAllocator().Allocate<ObjCCategoryDecl>(); return new (Mem) ObjCCategoryDecl(L, Id); } ObjCCategoryImplDecl * -ObjCCategoryImplDecl::Create(ASTContext &C, SourceLocation L,IdentifierInfo *Id, +ObjCCategoryImplDecl::Create(ASTContext &C, + SourceLocation L,IdentifierInfo *Id, ObjCInterfaceDecl *ClassInterface) { void *Mem = C.getAllocator().Allocate<ObjCCategoryImplDecl>(); return new (Mem) ObjCCategoryImplDecl(L, Id, ClassInterface); } ObjCImplementationDecl * -ObjCImplementationDecl::Create(ASTContext &C, SourceLocation L, +ObjCImplementationDecl::Create(ASTContext &C, + SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl *ClassInterface, ObjCInterfaceDecl *SuperDecl) { @@ -90,14 +101,16 @@ ObjCImplementationDecl::Create(ASTContext &C, SourceLocation L, } ObjCCompatibleAliasDecl * -ObjCCompatibleAliasDecl::Create(ASTContext &C, SourceLocation L, +ObjCCompatibleAliasDecl::Create(ASTContext &C, + SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl* AliasedClass) { void *Mem = C.getAllocator().Allocate<ObjCCompatibleAliasDecl>(); return new (Mem) ObjCCompatibleAliasDecl(L, Id, AliasedClass); } -ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, SourceLocation L) { +ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, + SourceLocation L) { void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>(); return new (Mem) ObjCPropertyDecl(L); } @@ -431,3 +444,4 @@ void ObjCPropertyDecl::setPropertyDeclLists(ObjCIvarDecl **Properties, } + diff --git a/lib/AST/DeclSerialization.cpp b/lib/AST/DeclSerialization.cpp index fe2ccefdce..3a79b9e0e2 100644 --- a/lib/AST/DeclSerialization.cpp +++ b/lib/AST/DeclSerialization.cpp @@ -39,7 +39,7 @@ Decl* Decl::Create(Deserializer& D) { default: assert (false && "Not implemented."); break; - + case BlockVar: return BlockVarDecl::CreateImpl(D); @@ -106,11 +106,15 @@ void NamedDecl::ReadInRec(Deserializer& D) { void ScopedDecl::EmitInRec(Serializer& S) const { NamedDecl::EmitInRec(S); S.EmitPtr(getNext()); // From ScopedDecl. + S.EmitPtr(cast_or_null<Decl>(getContext())); // From ScopedDecl. } void ScopedDecl::ReadInRec(Deserializer& D) { NamedDecl::ReadInRec(D); D.ReadPtr(Next); // From ScopedDecl. + Decl *TmpD; + D.ReadPtr(TmpD); // From ScopedDecl. + CtxDecl = cast_or_null<ContextDecl>(TmpD); } //===------------------------------------------------------------===// @@ -194,7 +198,7 @@ void VarDecl::ReadImpl(Deserializer& D) { BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) { BlockVarDecl* decl = - new BlockVarDecl(SourceLocation(),NULL,QualType(),None,NULL); + new BlockVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL); decl->VarDecl::ReadImpl(D); @@ -207,7 +211,7 @@ BlockVarDecl* BlockVarDecl::CreateImpl(Deserializer& D) { FileVarDecl* FileVarDecl::CreateImpl(Deserializer& D) { FileVarDecl* decl = - new FileVarDecl(SourceLocation(),NULL,QualType(),None,NULL); + new FileVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL); decl->VarDecl::ReadImpl(D); @@ -225,7 +229,7 @@ void ParmVarDecl::EmitImpl(llvm::Serializer& S) const { ParmVarDecl* ParmVarDecl::CreateImpl(Deserializer& D) { ParmVarDecl* decl = - new ParmVarDecl(SourceLocation(),NULL,QualType(),None,NULL); + new ParmVarDecl(0, SourceLocation(),NULL,QualType(),None,NULL); decl->VarDecl::ReadImpl(D); decl->objcDeclQualifier = static_cast<ObjCDeclQualifier>(D.ReadInt()); @@ -245,7 +249,7 @@ void EnumDecl::EmitImpl(Serializer& S) const { } EnumDecl* EnumDecl::CreateImpl(Deserializer& D) { - EnumDecl* decl = new EnumDecl(SourceLocation(),NULL,NULL); + EnumDecl* decl = new EnumDecl(0, SourceLocation(),NULL,NULL); decl->ScopedDecl::ReadInRec(D); decl->setDefinition(D.ReadBool()); @@ -277,7 +281,7 @@ EnumConstantDecl* EnumConstantDecl::CreateImpl(Deserializer& D) { D.Read(val); EnumConstantDecl* decl = - new EnumConstantDecl(SourceLocation(),NULL,QualType(),NULL, + new EnumConstantDecl(0, SourceLocation(),NULL,QualType(),NULL, val,NULL); decl->ValueDecl::ReadInRec(D); @@ -302,7 +306,7 @@ void FieldDecl::EmitImpl(Serializer& S) const { } FieldDecl* FieldDecl::CreateImpl(Deserializer& D) { - FieldDecl* decl = new FieldDecl(SourceLocation(), NULL, QualType(), 0); + FieldDecl* decl = new FieldDecl(0, SourceLocation(), NULL, QualType(), 0); decl->DeclType.ReadBackpatch(D); decl->ReadInRec(D); decl->BitWidth = D.ReadOwnedPtr<Expr>(); @@ -338,7 +342,7 @@ FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) { bool IsInline = D.ReadBool(); FunctionDecl* decl = - new FunctionDecl(SourceLocation(),NULL,QualType(),SClass, IsInline, 0); + new FunctionDecl(0, SourceLocation(),NULL,QualType(),SClass, IsInline, 0); decl->ValueDecl::ReadInRec(D); D.ReadPtr(decl->DeclChain); @@ -382,7 +386,7 @@ void RecordDecl::EmitImpl(Serializer& S) const { } RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) { - RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL); + RecordDecl* decl = new RecordDecl(DK,0,SourceLocation(),NULL,NULL); decl->ScopedDecl::ReadInRec(D); decl->setDefinition(D.ReadBool()); @@ -418,7 +422,7 @@ void TypedefDecl::EmitImpl(Serializer& S) const { TypedefDecl* TypedefDecl::CreateImpl(Deserializer& D) { QualType T = QualType::ReadVal(D); - TypedefDecl* decl = new TypedefDecl(SourceLocation(),NULL,T,NULL); + TypedefDecl* decl = new TypedefDecl(0, SourceLocation(),NULL,T,NULL); decl->ScopedDecl::ReadInRec(D); decl->ScopedDecl::ReadOutRec(D); |