ASTReaderDecl.cpp revision 9703b0dd353b928b2312076f13e30950e05d5fa1
1904c9c8389b65ee93a706ede911accd11e0b9d8eSebastian Redl//===--- ASTReaderDecl.cpp - Decl Deserialization ---------------*- C++ -*-===// 2698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// 3698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// The LLVM Compiler Infrastructure 4698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// 5698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// This file is distributed under the University of Illinois Open Source 6698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// License. See LICENSE.TXT for details. 7698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// 8698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 9698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// 10c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// This file implements the ASTReader::ReadDeclRecord method, which is the 11698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// entrypoint for loading a decl. 12698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// 13698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 14698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 156ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h" 16698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTConsumer.h" 17698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTContext.h" 18698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclVisitor.h" 19698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclGroup.h" 206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclCXX.h" 216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclTemplate.h" 22698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/Expr.h" 23698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerusing namespace clang; 248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization; 25698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 26698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 27698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// Declaration deserialization 28698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 29698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 306764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidisnamespace clang { 31d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> { 32c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader &Reader; 33c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTReader::PerFileData &F; 34577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl llvm::BitstreamCursor &Cursor; 358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl const DeclID ThisDeclID; 36c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl const ASTReader::RecordData &Record; 37698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned &Idx; 388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl TypeID TypeIDForTypeDecl; 39698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 40577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl uint64_t GetCurrentCursorOffset(); 41c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 42c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl unsigned &I) { 43c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.ReadSourceLocation(F, R, I); 44c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 45c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceRange ReadSourceRange(const ASTReader::RecordData &R, unsigned &I) { 46c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.ReadSourceRange(F, R, I); 47c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 48c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TypeSourceInfo *GetTypeSourceInfo(const ASTReader::RecordData &R, 49c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl unsigned &I) { 50c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.GetTypeSourceInfo(F, R, I); 51c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 524045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadQualifierInfo(QualifierInfo &Info, 534045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis const ASTReader::RecordData &R, unsigned &I) { 544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadQualifierInfo(F, Info, R, I); 554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis const ASTReader::RecordData &R, unsigned &I) { 584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 614045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis const ASTReader::RecordData &R, unsigned &I) { 624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 64577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl 65698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner public: 66c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F, 67c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl llvm::BitstreamCursor &Cursor, DeclID thisDeclID, 68c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl const ASTReader::RecordData &Record, unsigned &Idx) 69c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID), 70c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { } 71698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 72d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis void Visit(Decl *D); 73d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 74698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitDecl(Decl *D); 75698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTranslationUnitDecl(TranslationUnitDecl *TU); 76698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitNamedDecl(NamedDecl *ND); 770cef483f3b9d6a7f9fdbc5910d0a3ed64130e8e1Douglas Gregor void VisitNamespaceDecl(NamespaceDecl *D); 786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 80698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTypeDecl(TypeDecl *TD); 81698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTypedefDecl(TypedefDecl *TD); 828f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 83698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTagDecl(TagDecl *TD); 84698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitEnumDecl(EnumDecl *ED); 85698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitRecordDecl(RecordDecl *RD); 866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXRecordDecl(CXXRecordDecl *D); 876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplateSpecializationDecl( 886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplateSpecializationDecl *D); 896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplatePartialSpecializationDecl( 906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplatePartialSpecializationDecl *D); 916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 92698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitValueDecl(ValueDecl *VD); 93698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitEnumConstantDecl(EnumConstantDecl *ECD); 948f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 95d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis void VisitDeclaratorDecl(DeclaratorDecl *DD); 96698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFunctionDecl(FunctionDecl *FD); 976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXMethodDecl(CXXMethodDecl *D); 986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXConstructorDecl(CXXConstructorDecl *D); 996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXDestructorDecl(CXXDestructorDecl *D); 1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXConversionDecl(CXXConversionDecl *D); 101698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFieldDecl(FieldDecl *FD); 102698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitVarDecl(VarDecl *VD); 103698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitImplicitParamDecl(ImplicitParamDecl *PD); 104698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitParmVarDecl(ParmVarDecl *PD); 1056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 1066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateDecl(TemplateDecl *D); 1079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D); 1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplateDecl(ClassTemplateDecl *D); 109f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 1106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 111b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis void VisitUsingDecl(UsingDecl *D); 112b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis void VisitUsingShadowDecl(UsingShadowDecl *D); 1136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitLinkageSpecDecl(LinkageSpecDecl *D); 114698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD); 1156206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara void VisitAccessSpecDecl(AccessSpecDecl *D); 1166764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis void VisitFriendDecl(FriendDecl *D); 1176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitFriendTemplateDecl(FriendTemplateDecl *D); 1186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitStaticAssertDecl(StaticAssertDecl *D); 119698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitBlockDecl(BlockDecl *BD); 1206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 121698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC); 122a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis template <typename T> void VisitRedeclarable(Redeclarable<T> *D); 1236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1249a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt // FIXME: Reorder according to DeclNodes.td? 125698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCMethodDecl(ObjCMethodDecl *D); 126698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCContainerDecl(ObjCContainerDecl *D); 127698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 128698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCIvarDecl(ObjCIvarDecl *D); 129698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCProtocolDecl(ObjCProtocolDecl *D); 130698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); 131698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCClassDecl(ObjCClassDecl *D); 132698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 133698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCategoryDecl(ObjCCategoryDecl *D); 134698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCImplDecl(ObjCImplDecl *D); 135698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 136698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCImplementationDecl(ObjCImplementationDecl *D); 137698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D); 138698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCPropertyDecl(ObjCPropertyDecl *D); 139698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 140698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner }; 141698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 142698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 143d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redluint64_t ASTDeclReader::GetCurrentCursorOffset() { 144577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl uint64_t Off = 0; 145577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) { 146c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::PerFileData &F = *Reader.Chain[N - I - 1]; 147577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl if (&Cursor == &F.DeclsCursor) { 148577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl Off += F.DeclsCursor.GetCurrentBitNo(); 149577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl break; 150577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl } 151577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl Off += F.SizeInBits; 152577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl } 153577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl return Off; 154577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl} 155577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl 156d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::Visit(Decl *D) { 157d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl DeclVisitor<ASTDeclReader, void>::Visit(D); 158d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 15991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) { 160deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // if we have a fully initialized TypeDecl, we can safely read its type now. 161deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr()); 16291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 16391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis // FunctionDecl's body was written last after all other Stmts/Exprs. 16491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis if (Record[Idx++]) 165577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl FD->setLazyBody(GetCurrentCursorOffset()); 16691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis } 167d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis} 168d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 169d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDecl(Decl *D) { 170698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 171698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setLexicalDeclContext( 172698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 173c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setLocation(ReadSourceLocation(Record, Idx)); 174698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setInvalidDecl(Record[Idx++]); 1754eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis if (Record[Idx++]) { // hasAttrs 176cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AttrVec Attrs; 1774eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis Reader.ReadAttributes(F, Attrs, Record, Idx); 178cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt D->setAttrs(Attrs); 179cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 180698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setImplicit(Record[Idx++]); 181e0762c92110dfdcdd207db461a4ea17afd168f1eDouglas Gregor D->setUsed(Record[Idx++]); 182698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setAccess((AccessSpecifier)Record[Idx++]); 1831d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl D->setPCHLevel(Record[Idx++] + (F.Type <= ASTReader::PCH)); 184698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 185698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 186d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) { 187698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(TU); 1886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner TU->setAnonymousNamespace( 1896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 190698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 191698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 192d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamedDecl(NamedDecl *ND) { 193698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(ND); 1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ND->setDeclName(Reader.ReadDeclarationName(Record, Idx)); 195698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 196698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 197d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypeDecl(TypeDecl *TD) { 198698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(TD); 199d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis // Delay type reading until after we have fully initialized the decl. 200deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor TypeIDForTypeDecl = Record[Idx++]; 201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 202698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 203d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) { 204d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis VisitTypeDecl(TD); 205c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 206698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 207698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 208d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTagDecl(TagDecl *TD) { 209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTypeDecl(TD); 210a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis VisitRedeclarable(TD); 2116b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis TD->IdentifierNamespace = Record[Idx++]; 212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner TD->setTagKind((TagDecl::TagKind)Record[Idx++]); 213698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner TD->setDefinition(Record[Idx++]); 214b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor TD->setEmbeddedInDeclarator(Record[Idx++]); 215c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setRBraceLoc(ReadSourceLocation(Record, Idx)); 216c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setTagKeywordLoc(ReadSourceLocation(Record, Idx)); 2174045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis if (Record[Idx++]) { // hasExtInfo 2184045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TagDecl::ExtInfo *Info = new (*Reader.getContext()) TagDecl::ExtInfo(); 2194045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadQualifierInfo(*Info, Record, Idx); 2204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TD->TypedefDeclOrQualifier = Info; 2214045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } else 2224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TD->setTypedefForAnonDecl( 2234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++]))); 224698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 225698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 226d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumDecl(EnumDecl *ED) { 227698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTagDecl(ED); 2281274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx)) 2291274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->setIntegerTypeSourceInfo(TI); 2301274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor else 2311274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->setIntegerType(Reader.GetType(Record[Idx++])); 232842aef8d942a880eeb9535d40de31a86838264cbJohn McCall ED->setPromotionType(Reader.GetType(Record[Idx++])); 2331b5a618c59025898806160ed5e7f0ff5bb79e482John McCall ED->setNumPositiveBits(Record[Idx++]); 2341b5a618c59025898806160ed5e7f0ff5bb79e482John McCall ED->setNumNegativeBits(Record[Idx++]); 2351274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->IsScoped = Record[Idx++]; 2361274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->IsFixed = Record[Idx++]; 23774228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis ED->setInstantiationOfMemberEnum( 23874228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++]))); 239698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 241d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRecordDecl(RecordDecl *RD) { 242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTagDecl(RD); 243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RD->setHasFlexibleArrayMember(Record[Idx++]); 244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RD->setAnonymousStructOrUnion(Record[Idx++]); 245643b7dfb7803003d62e18da65cbe81ad001851b7Fariborz Jahanian RD->setHasObjectMember(Record[Idx++]); 246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 248d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitValueDecl(ValueDecl *VD) { 249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(VD); 250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setType(Reader.GetType(Record[Idx++])); 251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 253d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) { 254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitValueDecl(ECD); 255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 256c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ECD->setInitExpr(Reader.ReadExpr(F)); 257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ECD->setInitVal(Reader.ReadAPSInt(Record, Idx)); 258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 260d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) { 261d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitValueDecl(DD); 2624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis if (Record[Idx++]) { // hasExtInfo 2634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DeclaratorDecl::ExtInfo *Info 2644045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis = new (*Reader.getContext()) DeclaratorDecl::ExtInfo(); 2654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadQualifierInfo(*Info, Record, Idx); 2664045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Info->TInfo = GetTypeSourceInfo(Record, Idx); 2674045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DD->DeclInfo = Info; 2684045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } else 2694045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DD->DeclInfo = GetTypeSourceInfo(Record, Idx); 270d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis} 271d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis 272d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { 273d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(FD); 2746b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitRedeclarable(FD); 2756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 2764045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(FD->DNLoc, FD->getDeclName(), Record, Idx); 277c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis FD->IdentifierNamespace = Record[Idx++]; 278f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis switch ((FunctionDecl::TemplatedKind)Record[Idx++]) { 279dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis default: assert(false && "Unhandled TemplatedKind!"); 280dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 281f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_NonTemplate: 282f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 283f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_FunctionTemplate: 284f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->setDescribedFunctionTemplate( 285f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]))); 286f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 287f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_MemberSpecialization: { 288f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 289f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 290c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 2916b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK); 292f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI); 293f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 294f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 295f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_FunctionTemplateSpecialization: { 296f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FunctionTemplateDecl *Template 297f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 298f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 299f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 300f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Template arguments. 301f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 302c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 303f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 304f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Template args as written. 305f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs; 306f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis SourceLocation LAngleLoc, RAngleLoc; 3075efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis if (Record[Idx++]) { // TemplateArgumentsAsWritten != 0 3085efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis unsigned NumTemplateArgLocs = Record[Idx++]; 3095efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis TemplArgLocs.reserve(NumTemplateArgLocs); 3105efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis for (unsigned i=0; i != NumTemplateArgLocs; ++i) 311577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl TemplArgLocs.push_back( 312c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 3135efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 314c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl LAngleLoc = ReadSourceLocation(Record, Idx); 315c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl RAngleLoc = ReadSourceLocation(Record, Idx); 316f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 3177b081c8604efd33bc7f7e5c1e9427a031eedb2b4Argyrios Kyrtzidis 318c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 319f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 320a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 321a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplateArgumentList *TemplArgList 322a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); 323a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplateArgumentListInfo *TemplArgsInfo 324a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc); 325a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i) 326a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgsInfo->addArgument(TemplArgLocs[i]); 327a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis FunctionTemplateSpecializationInfo *FTInfo 328a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK, 329a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgList, 330a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgsInfo, POI); 331a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis FD->TemplateOrSpecialization = FTInfo; 3326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis 333a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis if (FD->isCanonicalDecl()) { // if canonical add to template's set. 33499a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // The template that contains the specializations set. It's not safe to 33599a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // use getCanonicalDecl on Template since it may still be initializing. 33699a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis FunctionTemplateDecl *CanonTemplate 33799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 338a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // Get the InsertPos by FindNodeOrInsertPos() instead of calling 339a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // InsertNode(FTInfo) directly to avoid the getASTContext() call in 340a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // FunctionTemplateSpecializationInfo's Profile(). 341a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // We avoid getASTContext because a decl in the parent hierarchy may 342a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // be initializing. 3436b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 3446b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(), 3456b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis TemplArgs.size(), C); 3466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis void *InsertPos = 0; 34799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); 348a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis assert(InsertPos && "Another specialization already inserted!"); 34999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos); 3506b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis } 351dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 352f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 353f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { 354f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Templates. 355f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis UnresolvedSet<8> TemplDecls; 356f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis unsigned NumTemplates = Record[Idx++]; 357f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis while (NumTemplates--) 358f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 359f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 360f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Templates args. 361f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateArgumentListInfo TemplArgs; 362f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis unsigned NumArgs = Record[Idx++]; 363f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis while (NumArgs--) 364c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 365c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx)); 366c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx)); 367f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 368f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->setDependentTemplateSpecialization(*Reader.getContext(), 369f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplDecls, TemplArgs); 370dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 371f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 372f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 3735efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 374d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl // FunctionDecl's body is handled last at ASTDeclReader::Visit, 37591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis // after everything else is read. 37691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 377d931b086984257de68868a64a235c2b4b34003fbJohn McCall FD->setStorageClass((StorageClass)Record[Idx++]); 378d931b086984257de68868a64a235c2b4b34003fbJohn McCall FD->setStorageClassAsWritten((StorageClass)Record[Idx++]); 3795efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setInlineSpecified(Record[Idx++]); 3805efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setVirtualAsWritten(Record[Idx++]); 3815efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setPure(Record[Idx++]); 3825efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasInheritedPrototype(Record[Idx++]); 3835efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasWrittenPrototype(Record[Idx++]); 3845efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setDeleted(Record[Idx++]); 3855efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setTrivial(Record[Idx++]); 3865efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasImplicitReturnZero(Record[Idx++]); 387c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl FD->setLocEnd(ReadSourceLocation(Record, Idx)); 3885efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 3896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // Read in the parameters. 390698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 391698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 392698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 393698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 394698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 3956b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FD->setParams(*Reader.getContext(), Params.data(), NumParams); 396698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 397698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 398d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { 399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(MD); 400698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) { 401698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // In practice, this won't be executed (since method definitions 402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // don't occur in header files). 403c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setBody(Reader.ReadStmt(F)); 404698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 405698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 406698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 407698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setInstanceMethod(Record[Idx++]); 408698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setVariadic(Record[Idx++]); 409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setSynthesized(Record[Idx++]); 4103fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian MD->setDefined(Record[Idx++]); 411698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]); 412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]); 4137732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian MD->setNumSelectorArgs(unsigned(Record[Idx++])); 414698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setResultType(Reader.GetType(Record[Idx++])); 415c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 416c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setEndLoc(ReadSourceLocation(Record, Idx)); 417698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 418698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 419698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 420698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 421698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 4224ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams, 4234ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian NumParams); 424698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 425698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 426d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) { 427698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(CD); 428c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation A = ReadSourceLocation(Record, Idx); 429c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation B = ReadSourceLocation(Record, Idx); 430782f2f52b78d8ca785110398a7f7b56b830b9ac7Ted Kremenek CD->setAtEndRange(SourceRange(A, B)); 431698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 432698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 433d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { 434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(ID); 435deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr()); 436698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ID->setSuperClass(cast_or_null<ObjCInterfaceDecl> 437698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (Reader.GetDecl(Record[Idx++]))); 43853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 43953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the directly referenced protocols and their SourceLocations. 440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtocols = Record[Idx++]; 441698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols; 442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Protocols.reserve(NumProtocols); 443698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtocols; ++I) 444698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 44518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 44618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtocols); 44718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 448c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 44918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(), 45018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 45153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 45253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the transitive closure of protocols referenced by this class. 45353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek NumProtocols = Record[Idx++]; 45453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.clear(); 45553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.reserve(NumProtocols); 45653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (unsigned I = 0; I != NumProtocols; ++I) 45753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 45853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols, 45953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek *Reader.getContext()); 46053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 46153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the ivars. 462698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumIvars = Record[Idx++]; 463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCIvarDecl *, 16> IVars; 464698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVars.reserve(NumIvars); 465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumIvars; ++I) 466698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 467698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ID->setCategoryList( 468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 4692c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian // We will rebuild this list lazily. 4702c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian ID->setIvarList(0); 471deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setForwardDecl(Record[Idx++]); 472deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setImplicitInterfaceDecl(Record[Idx++]); 473c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setClassLoc(ReadSourceLocation(Record, Idx)); 474c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setSuperClassLoc(ReadSourceLocation(Record, Idx)); 475c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setLocEnd(ReadSourceLocation(Record, Idx)); 476698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 477698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 478d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) { 479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitFieldDecl(IVD); 480698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]); 4812c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian // This field will be built lazily. 4822c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian IVD->setNextIvar(0); 483ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian bool synth = Record[Idx++]; 484ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian IVD->setSynthesize(synth); 485698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 486698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 487d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { 488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(PD); 489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner PD->setForwardDecl(Record[Idx++]); 490c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl PD->setLocEnd(ReadSourceLocation(Record, Idx)); 491698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 492698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 49618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 49718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 49818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 499c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 50018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 50118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 502698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 503698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 504d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) { 505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitFieldDecl(FD); 506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 507698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 508d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { 509698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(CD); 510698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumClassRefs = Record[Idx++]; 511698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs; 512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ClassRefs.reserve(NumClassRefs); 513698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumClassRefs; ++I) 514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 515321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek llvm::SmallVector<SourceLocation, 16> SLocs; 516321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek SLocs.reserve(NumClassRefs); 517321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek for (unsigned I = 0; I != NumClassRefs; ++I) 518c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SLocs.push_back(ReadSourceLocation(Record, Idx)); 519321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(), 520321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek NumClassRefs); 521698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 522698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 523d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { 524698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(FPD); 525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 526698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 527698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 528698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 529698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 53018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 53118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 53218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 533c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 53418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 53518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 536698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 537698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 538d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) { 539698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(CD); 540698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 541698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 543698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 544698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 545698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 54618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 54718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 54818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 549c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 55018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 55118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 552698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 553000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian CD->setHasSynthBitfield(Record[Idx++]); 554c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl CD->setAtLoc(ReadSourceLocation(Record, Idx)); 555c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx)); 556698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 557698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 558d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) { 559698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(CAD); 560698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 561698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 562698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 563d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 564698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(D); 565c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setAtLoc(ReadSourceLocation(Record, Idx)); 566c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setType(GetTypeSourceInfo(Record, Idx)); 567698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // FIXME: stable encoding 568698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyAttributes( 569698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 57080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian D->setPropertyAttributesAsWritten( 57180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // FIXME: stable encoding 573698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyImplementation( 574698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (ObjCPropertyDecl::PropertyControl)Record[Idx++]); 575698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 576698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 577698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setGetterMethodDecl( 578698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 579698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSetterMethodDecl( 580698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 581698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyIvarDecl( 582698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 583698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 584698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 585d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) { 586aecae629269fae3bf484baf1d109e9a89d14eeadArgyrios Kyrtzidis VisitObjCContainerDecl(D); 587698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setClassInterface( 588698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 589698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 590698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 591d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 592698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCImplDecl(D); 593698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx)); 594698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 595698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 596d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 597698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCImplDecl(D); 598698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSuperClass( 599698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 6009d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis llvm::tie(D->IvarInitializers, D->NumIvarInitializers) 601c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx); 602000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian D->setHasSynthBitfield(Record[Idx++]); 603698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 604698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 605698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 606d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 607698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(D); 608c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setAtLoc(ReadSourceLocation(Record, Idx)); 609698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyDecl( 610698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++]))); 611698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyIvarDecl( 612698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 613c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setGetterCXXConstructor(Reader.ReadExpr(F)); 614c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setSetterCXXAssignment(Reader.ReadExpr(F)); 615698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 616698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 617d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFieldDecl(FieldDecl *FD) { 618d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(FD); 619698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner FD->setMutable(Record[Idx++]); 620698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 621c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl FD->setBitWidth(Reader.ReadExpr(F)); 622c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (!FD->getDeclName()) { 623c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])); 624c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Tmpl) 625c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl); 626c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis } 627698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 628698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 629d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitVarDecl(VarDecl *VD) { 630d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(VD); 6316b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitRedeclarable(VD); 632d931b086984257de68868a64a235c2b4b34003fbJohn McCall VD->setStorageClass((StorageClass)Record[Idx++]); 633d931b086984257de68868a64a235c2b4b34003fbJohn McCall VD->setStorageClassAsWritten((StorageClass)Record[Idx++]); 634698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setThreadSpecified(Record[Idx++]); 635698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setCXXDirectInitializer(Record[Idx++]); 636324b54d3f60d92a82815512119791ce1c285b63eDouglas Gregor VD->setExceptionVariable(Record[Idx++]); 6375077c3876beeaed32280af88244e8050078619a8Douglas Gregor VD->setNRVOVariable(Record[Idx++]); 638698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 639c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl VD->setInit(Reader.ReadExpr(F)); 6409421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis 6419421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis if (Record[Idx++]) { // HasMemberSpecializationInfo. 6429421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++])); 6439421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 644c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 6459421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI); 6469421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis } 647698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 648698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 649d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) { 650698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitVarDecl(PD); 651698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 652698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 653d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) { 654698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitVarDecl(PD); 655698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]); 656bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall PD->setHasInheritedDefaultArg(Record[Idx++]); 657691d77f20763915fc7c9b34e29939d225fd0b4d2Argyrios Kyrtzidis if (Record[Idx++]) // hasUninstantiatedDefaultArg. 658c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F)); 659698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 660698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 661d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) { 662698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(AD); 663c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F))); 664698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 665698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 666d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { 667698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(BD); 668c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F))); 669c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx)); 670698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 671698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 672698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 673698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 674698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 675838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor BD->setParams(Params.data(), NumParams); 676698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 677698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 678d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 6796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitDecl(D); 6806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]); 6816ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setHasBraces(Record[Idx++]); 6826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 6836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 684d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) { 6856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 6860a0c3e72ce42f84f361c285e6963d44213ab6beaDouglas Gregor D->IsInline = Record[Idx++]; 687c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setLBracLoc(ReadSourceLocation(Record, Idx)); 688c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setRBracLoc(ReadSourceLocation(Record, Idx)); 6896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setNextNamespace( 6906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 6916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 6926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner bool IsOriginal = Record[Idx++]; 693a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis D->OrigOrAnonNamespace.setInt(IsOriginal); 694a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis D->OrigOrAnonNamespace.setPointer( 6956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 6966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 6976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 698d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 6996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 700c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->NamespaceLoc = ReadSourceLocation(Record, Idx); 701c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setQualifierRange(ReadSourceRange(Record, Idx)); 7026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 703c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->IdentLoc = ReadSourceLocation(Record, Idx); 7048ea5b9d832455247a15925398fb663d299d33238Douglas Gregor D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 7056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 707d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDecl(UsingDecl *D) { 7086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 709c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setUsingLocation(ReadSourceLocation(Record, Idx)); 710c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setNestedNameRange(ReadSourceRange(Record, Idx)); 7116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx)); 7124045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 7136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 7146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // FIXME: It would probably be more efficient to read these into a vector 7156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // and then re-cosntruct the shadow decl set over that vector since it 7166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // would avoid existence checks. 7176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner unsigned NumShadows = Record[Idx++]; 7186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner for(unsigned I = 0; I != NumShadows; ++I) { 71982f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still 72082f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis // be initializing. 72182f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]))); 7226ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner } 7236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTypeName(Record[Idx++]); 724c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 725c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pattern) 726c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern); 7276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7286ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 729d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) { 7306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 7316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 7326ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++]))); 733c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis UsingShadowDecl *Pattern 734c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])); 735c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pattern) 736c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern); 7376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 739d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 7406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 741c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->UsingLoc = ReadSourceLocation(Record, Idx); 742c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->NamespaceLoc = ReadSourceLocation(Record, Idx); 743c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->QualifierRange = ReadSourceRange(Record, Idx); 7440a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->Qualifier = Reader.ReadNestedNameSpecifier(Record, Idx); 7450a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 7460a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])); 7476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 749d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 7506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitValueDecl(D); 751c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setTargetNestedNameRange(ReadSourceRange(Record, Idx)); 752c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setUsingLoc(ReadSourceLocation(Record, Idx)); 7536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 7544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 7556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 757d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingTypenameDecl( 7586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner UnresolvedUsingTypenameDecl *D) { 7596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitTypeDecl(D); 760c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TargetNestedNameRange = ReadSourceRange(Record, Idx); 761c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->UsingLocation = ReadSourceLocation(Record, Idx); 762c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TypenameLocation = ReadSourceLocation(Record, Idx); 7637e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor D->TargetNestedNameSpecifier = Reader.ReadNestedNameSpecifier(Record, Idx); 7646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7656ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 766d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { 76737ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 76837ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis 7690f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis // We need to allocate the DefinitionData struct ahead of VisitRecordDecl 7700f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis // so that the other CXXRecordDecls can get a pointer even when the owner 7710f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis // is still initializing. 7720f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis bool OwnsDefinitionData = false; 7730f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis enum DataOwnership { Data_NoDefData, Data_Owner, Data_NotOwner }; 7740f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis switch ((DataOwnership)Record[Idx++]) { 7750f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis default: 776d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(0 && "Out of sync with ASTDeclWriter or messed up reading"); 7770f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis case Data_NoDefData: 7780f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis break; 7790f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis case Data_Owner: 7800f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis OwnsDefinitionData = true; 7810f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D); 7820f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis break; 7830f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis case Data_NotOwner: 7840f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis D->DefinitionData 7850f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]))->DefinitionData; 7860f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis break; 7870f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis } 7880f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 7890f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis VisitRecordDecl(D); 7900f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 7919703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis if (D->DefinitionData) { 7929703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis // Synchronize the DefinitionData pointer among all redeclarations. 7939703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis // This synchronization ends up being done multiple times but it's necessary 7949703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis // because a chained PCH may introduce a definition that earlier 7959703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis // redeclarations in another PCH have no information about. 7969703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis llvm::SmallPtrSet<CXXRecordDecl *, 16> PrevRedecls; 7979703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis PrevRedecls.insert(D); 7989703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis CXXRecordDecl *Redecl = cast<CXXRecordDecl>(D->RedeclLink.getNext()); 7999703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis while (!PrevRedecls.count(Redecl)) { 8009703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis PrevRedecls.insert(Redecl); 8019703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis assert((!Redecl->DefinitionData || 8029703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis Redecl->DefinitionData == D->DefinitionData) && 8039703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis "Multiple definitions in the redeclaration chain ?"); 8049703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis Redecl->DefinitionData = D->DefinitionData; 8059703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis Redecl = cast<CXXRecordDecl>(Redecl->RedeclLink.getNext()); 8069703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis } 8079703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis } 8089703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis 8090f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis if (OwnsDefinitionData) { 8100f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis assert(D->DefinitionData); 8110f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData; 8120f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 8130f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.UserDeclaredConstructor = Record[Idx++]; 8140f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.UserDeclaredCopyConstructor = Record[Idx++]; 8150f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.UserDeclaredCopyAssignment = Record[Idx++]; 8160f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.UserDeclaredDestructor = Record[Idx++]; 8170f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.Aggregate = Record[Idx++]; 8180f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.PlainOldData = Record[Idx++]; 8190f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.Empty = Record[Idx++]; 8200f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.Polymorphic = Record[Idx++]; 8210f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.Abstract = Record[Idx++]; 8220f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.HasTrivialConstructor = Record[Idx++]; 8230f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.HasTrivialCopyConstructor = Record[Idx++]; 8240f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.HasTrivialCopyAssignment = Record[Idx++]; 8250f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.HasTrivialDestructor = Record[Idx++]; 8260f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.ComputedVisibleConversions = Record[Idx++]; 8270f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.DeclaredDefaultConstructor = Record[Idx++]; 8280f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.DeclaredCopyConstructor = Record[Idx++]; 8290f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.DeclaredCopyAssignment = Record[Idx++]; 8300f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.DeclaredDestructor = Record[Idx++]; 8310f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 8320f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis // setBases() is unsuitable since it may try to iterate the bases of an 8335606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky // uninitialized base. 8340f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.NumBases = Record[Idx++]; 8350f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases]; 8360f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis for (unsigned i = 0; i != Data.NumBases; ++i) 837c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Data.Bases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 8380f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 8390f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis // FIXME: Make VBases lazily computed when needed to avoid storing them. 8400f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.NumVBases = Record[Idx++]; 8410f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases]; 8420f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis for (unsigned i = 0; i != Data.NumVBases; ++i) 843c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Data.VBases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 8440f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 8450f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx); 8460f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx); 8470f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis assert(Data.Definition && "Data.Definition should be already set!"); 8480f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis Data.FirstFriend 8490f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++])); 85037ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis } 85137ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis 8528731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis enum CXXRecKind { 8538731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization 8548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis }; 8558731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis switch ((CXXRecKind)Record[Idx++]) { 8568731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis default: 857d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?"); 8588731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecNotTemplate: 8598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecTemplate: 8618b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis D->TemplateOrInstantiation 8628b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 8638731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8648731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecMemberSpecialization: { 8658731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 8668731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 867c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 8688b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK); 8698b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis MSI->setPointOfInstantiation(POI); 8708b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis D->TemplateOrInstantiation = MSI; 8718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 8738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 87436d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis 87536d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis // Load the key function to avoid deserializing every method so we can 87636d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis // compute it. 87736d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis if (D->IsDefinition) { 87836d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis CXXMethodDecl *Key 87936d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis = cast_or_null<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 88036d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis if (Key) 88136d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis C.KeyFunctions[D] = Key; 88236d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis } 8836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 8846ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 885d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { 8866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitFunctionDecl(D); 887c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis unsigned NumOverridenMethods = Record[Idx++]; 888c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis while (NumOverridenMethods--) { 889c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 890c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod, 891c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis // MD may be initializing. 892c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->addOverriddenMethod(D, MD); 893c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis } 8946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 8956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 896d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 8976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 89891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 89991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->IsExplicitSpecified = Record[Idx++]; 90091468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->ImplicitlyDefined = Record[Idx++]; 9018e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers) 902c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx); 9036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 905d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 9066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 90791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 90891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->ImplicitlyDefined = Record[Idx++]; 90991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 9106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 912d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) { 9136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 91491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->IsExplicitSpecified = Record[Idx++]; 9156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 917d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) { 9186206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara VisitDecl(D); 919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setColonLoc(ReadSourceLocation(Record, Idx)); 9206206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara} 9216206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara 922d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendDecl(FriendDecl *D) { 923c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis VisitDecl(D); 9246764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis if (Record[Idx++]) 925c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Friend = GetTypeSourceInfo(Record, Idx); 9266764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis else 9276764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 9286764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++])); 9296102ca1d490836096678d7d934f0b2b78f9293ecJohn McCall D->UnsupportedFriend = (Record[Idx++] != 0); 930c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->FriendLoc = ReadSourceLocation(Record, Idx); 9316764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis} 9326764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis 933d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) { 934554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis VisitDecl(D); 935554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis unsigned NumParams = Record[Idx++]; 936554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->NumParams = NumParams; 937554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->Params = new TemplateParameterList*[NumParams]; 938554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis for (unsigned i = 0; i != NumParams; ++i) 939c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx); 940554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis if (Record[Idx++]) // HasFriendDecl 941554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 942554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis else 943c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Friend = GetTypeSourceInfo(Record, Idx); 944c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->FriendLoc = ReadSourceLocation(Record, Idx); 9456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9466ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 947d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) { 9488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis VisitNamedDecl(D); 9498731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 950bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis NamedDecl *TemplatedDecl 951bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 952dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis TemplateParameterList* TemplateParams 953c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadTemplateParameterList(F, Record, Idx); 9548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->init(TemplatedDecl, TemplateParams); 9556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 957d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { 9586b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr() 9596b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis // can be used while this is still initializing. 9608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 9616b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this"); 9629eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *PrevDecl = 9639eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++])); 9649eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne assert((PrevDecl == 0 || PrevDecl->getKind() == D->getKind()) && 9659eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne "PrevDecl kind mismatch"); 9669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (PrevDecl) 9679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->CommonOrPrev = PrevDecl; 9688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis if (PrevDecl == 0) { 9696b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis D->CommonOrPrev = D->newCommon(*Reader.getContext()); 9709eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (RedeclarableTemplateDecl *RTD 9719eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) { 9729eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne assert(RTD->getKind() == D->getKind() && 9739eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne "InstantiatedFromMemberTemplate kind mismatch"); 9749eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->setInstantiatedFromMemberTemplateImpl(RTD); 9759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (Record[Idx++]) 9769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->setMemberSpecialization(); 9779eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 9788a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 9798a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *LatestDecl = 9808a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++])); 981a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 982a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // This decl is a first one and the latest declaration that it points to is 9833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // in the same AST file. However, if this actually needs to point to a 9843c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // redeclaration in another AST file, we need to update it by checking 985a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // the FirstLatestDeclIDs map which tracks this kind of decls. 986a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?"); 987c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::FirstLatestDeclIDMap::iterator I 988a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = Reader.FirstLatestDeclIDs.find(ThisDeclID); 989a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (I != Reader.FirstLatestDeclIDs.end()) { 990a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Decl *NewLatest = Reader.GetDecl(I->second); 991a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert((LatestDecl->getLocation().isInvalid() || 992a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation().isInvalid() || 993a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.SourceMgr.isBeforeInTranslationUnit( 994a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis LatestDecl->getLocation(), 995a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation())) && 996a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "The new latest is supposed to come after the previous latest"); 997a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest); 998a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 999a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 10008a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch"); 10018a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne D->getCommonPtr()->Latest = LatestDecl; 10029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 10036b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis 10046b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitTemplateDecl(D); 10056b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis D->IdentifierNamespace = Record[Idx++]; 10069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 10079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1008d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { 10099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne VisitRedeclarableTemplateDecl(D); 10109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 10119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (D->getPreviousDeclaration() == 0) { 10128731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis // This ClassTemplateDecl owns a CommonPtr; read it. 10138731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 1014ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis // FoldingSets are filled in VisitClassTemplateSpecializationDecl. 10158731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis unsigned size = Record[Idx++]; 1016ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis while (size--) 1017ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++])); 10188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 10198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis size = Record[Idx++]; 1020ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis while (size--) 1021ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis cast<ClassTemplatePartialSpecializationDecl>( 10228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis Reader.GetDecl(Record[Idx++])); 10238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 10248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis // InjectedClassNameType is computed. 10258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 10266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 10276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1028d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateSpecializationDecl( 10296ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplateSpecializationDecl *D) { 1030dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis VisitCXXRecordDecl(D); 1031586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis 1032586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 1033dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (Decl *InstD = Reader.GetDecl(Record[Idx++])) { 1034dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) { 1035586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializedTemplate = CTD; 1036dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } else { 1037dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1038c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1039586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis TemplateArgumentList *ArgList 1040586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); 1041586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS 1042586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) ClassTemplateSpecializationDecl:: 1043586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis SpecializedPartialSpecialization(); 1044586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis PS->PartialSpecialization 1045586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = cast<ClassTemplatePartialSpecializationDecl>(InstD); 1046586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis PS->TemplateArgs = ArgList; 1047586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializedTemplate = PS; 1048dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1049dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1050dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1051dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis // Explicit info. 1052c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) { 1053586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo 1054586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo; 1055586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ExplicitInfo->TypeAsWritten = TyInfo; 1056c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx); 1057c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx); 1058586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->ExplicitInfo = ExplicitInfo; 1059dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1060dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1061dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1062c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1063586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size()); 1064c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->PointOfInstantiation = ReadSourceLocation(Record, Idx); 1065586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++]; 1066ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis 1067bc5ab7c9e307fea5ecb979b30815da7a370e1c05Argyrios Kyrtzidis if (D->isCanonicalDecl()) { // It's kept in the folding set. 1068ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis ClassTemplateDecl *CanonPattern 1069ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 1070ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis if (ClassTemplatePartialSpecializationDecl *Partial 1071ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) { 10720a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis CanonPattern->getPartialSpecializations().InsertNode(Partial); 1073ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } else { 10740a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis CanonPattern->getSpecializations().InsertNode(D); 1075ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } 1076ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } 10776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 10786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1079d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplatePartialSpecializationDecl( 10806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplatePartialSpecializationDecl *D) { 1081dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis VisitClassTemplateSpecializationDecl(D); 1082dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 10838fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 1084c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx); 10858fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis 1086dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis unsigned NumArgs = Record[Idx++]; 10878fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis if (NumArgs) { 10888fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->NumArgsAsWritten = NumArgs; 10898fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs]; 10908fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis for (unsigned i=0; i != NumArgs; ++i) 1091c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 10928fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis } 10938fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis 10948fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->SequenceNumber = Record[Idx++]; 1095dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1096dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis // These are read/set from/to the first declaration. 1097dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (D->getPreviousDeclaration() == 0) { 10988fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->InstantiatedFromMember.setPointer( 1099dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis cast_or_null<ClassTemplatePartialSpecializationDecl>( 1100dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis Reader.GetDecl(Record[Idx++]))); 11018fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->InstantiatedFromMember.setInt(Record[Idx++]); 1102dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 11036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1105d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 11069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne VisitRedeclarableTemplateDecl(D); 1107f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 11089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (D->getPreviousDeclaration() == 0) { 1109f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // This FunctionTemplateDecl owns a CommonPtr; read it. 1110f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 1111057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis // Read the function specialization declarations. 1112057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled 111399a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // when reading the specialized FunctionDecl. 1114057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis unsigned NumSpecs = Record[Idx++]; 1115057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis while (NumSpecs--) 1116057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis Reader.GetDecl(Record[Idx++]); 1117f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 11186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1120d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 11218731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis VisitTypeDecl(D); 11228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 11238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setDeclaredWithTypename(Record[Idx++]); 11248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setParameterPack(Record[Idx++]); 11258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 11268731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis bool Inherited = Record[Idx++]; 1127c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx); 11288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setDefaultArgument(DefArg, Inherited); 11296ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1131d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 1132b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis VisitVarDecl(D); 1133b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis // TemplateParmPosition. 1134b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setDepth(Record[Idx++]); 1135b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setPosition(Record[Idx++]); 1136b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis // Rest of NonTypeTemplateParmDecl. 1137b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis if (Record[Idx++]) { 1138c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Expr *DefArg = Reader.ReadExpr(F); 1139b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis bool Inherited = Record[Idx++]; 1140b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setDefaultArgument(DefArg, Inherited); 1141b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis } 11426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1144d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 1145bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis VisitTemplateDecl(D); 1146bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis // TemplateParmPosition. 1147bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setDepth(Record[Idx++]); 1148bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setPosition(Record[Idx++]); 1149bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis // Rest of TemplateTemplateParmDecl. 1150c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 1151bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis bool IsInherited = Record[Idx++]; 1152bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setDefaultArgument(Arg, IsInherited); 11536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1155d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) { 11560d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis VisitDecl(D); 1157c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->AssertExpr = Reader.ReadExpr(F); 1158c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Message = cast<StringLiteral>(Reader.ReadExpr(F)); 11596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstd::pair<uint64_t, uint64_t> 1162d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian RedlASTDeclReader::VisitDeclContext(DeclContext *DC) { 1163698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner uint64_t LexicalOffset = Record[Idx++]; 1164698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner uint64_t VisibleOffset = Record[Idx++]; 1165698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return std::make_pair(LexicalOffset, VisibleOffset); 1166698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1167698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1168a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T> 1169d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) { 1170a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest }; 1171a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis RedeclKind Kind = (RedeclKind)Record[Idx++]; 1172a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis switch (Kind) { 1173a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis default: 1174d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up" 1175a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis " reading"); 1176a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case NoRedeclaration: 1177a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1178a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case PointsToPrevious: 1179a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink( 1180a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis cast_or_null<T>(Reader.GetDecl(Record[Idx++]))); 1181a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1182a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case PointsToLatest: 1183a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink = typename Redeclarable<T>::LatestDeclLink( 1184a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis cast_or_null<T>(Reader.GetDecl(Record[Idx++]))); 1185a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1186a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 1187a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1188a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(!(Kind == PointsToPrevious && 1189a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.FirstLatestDeclIDs.find(ThisDeclID) != 1190a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.FirstLatestDeclIDs.end()) && 1191a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "This decl is not first, it should not be in the map"); 1192a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (Kind == PointsToPrevious) 1193a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis return; 1194a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1195a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // This decl is a first one and the latest declaration that it points to is in 11963c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // the same AST file. However, if this actually needs to point to a 11973c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // redeclaration in another AST file, we need to update it by checking the 1198a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // FirstLatestDeclIDs map which tracks this kind of decls. 1199a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) && 1200a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "Invalid ThisDeclID ?"); 1201c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::FirstLatestDeclIDMap::iterator I 1202a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = Reader.FirstLatestDeclIDs.find(ThisDeclID); 1203a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (I != Reader.FirstLatestDeclIDs.end()) { 1204a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Decl *NewLatest = Reader.GetDecl(I->second); 1205a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert((D->getMostRecentDeclaration()->getLocation().isInvalid() || 1206a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation().isInvalid() || 1207a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.SourceMgr.isBeforeInTranslationUnit( 1208a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->getMostRecentDeclaration()->getLocation(), 1209a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation())) && 1210a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "The new latest is supposed to come after the previous latest"); 1211a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink 1212a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest)); 1213a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 1214a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis} 1215a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1216698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 12174e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner// Attribute Reading 1218698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 1219698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 12204e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner/// \brief Reads attributes from the current stream position. 12214eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidisvoid ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs, 12224eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis const RecordData &Record, unsigned &Idx) { 12234eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) { 12244e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner Attr *New = 0; 1225387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt attr::Kind Kind = (attr::Kind)Record[Idx++]; 1226c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation Loc = ReadSourceLocation(F, Record, Idx); 1227cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt bool isInherited = Record[Idx++]; 12284e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 1229cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHRead.inc" 12304e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 12314e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner assert(New && "Unable to decode attribute?"); 1232cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt New->setInherited(isInherited); 1233cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt Attrs.push_back(New); 12344e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner } 12354e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner} 12364e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 12374e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===// 1238c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader Implementation 12394e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===// 1240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1241698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Note that we have loaded the declaration with the given 1242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// Index. 12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 1244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine notes that this declaration has already been loaded, 1245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// so that future GetDecl calls will return this declaration rather 1246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// than trying to load a new declaration. 1247c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlinline void ASTReader::LoadedDecl(unsigned Index, Decl *D) { 1248698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(!DeclsLoaded[Index] && "Decl loaded twice?"); 1249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DeclsLoaded[Index] = D; 1250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Determine whether the consumer will be interested in seeing 1254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// this declaration (via HandleTopLevelDecl). 1255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// 1256698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine should return true for anything that might affect 1257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// code generation, e.g., inline function definitions, Objective-C 1258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// declarations with metadata, etc. 1259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerstatic bool isConsumerInterestedIn(Decl *D) { 126004a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar if (isa<FileScopeAsmDecl>(D)) 126104a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar return true; 1262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (VarDecl *Var = dyn_cast<VarDecl>(D)) 12633f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis return Var->isFileVarDecl() && 12643f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis Var->isThisDeclarationADefinition() == VarDecl::Definition; 1265698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D)) 1266698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return Func->isThisDeclarationADefinition(); 12679d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D); 1268698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1269698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1270cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl/// \brief Get the correct cursor and offset for loading a type. 1271c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation 12728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) { 12730b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl // See if there's an override. 12740b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl DeclReplacementMap::iterator It = ReplacedDecls.find(ID); 12750b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl if (It != ReplacedDecls.end()) 1276c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return RecordLocation(It->second.first, It->second.second); 12770b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl 1278cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl PerFileData *F = 0; 1279cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl for (unsigned I = 0, N = Chain.size(); I != N; ++I) { 1280cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl F = Chain[N - I - 1]; 1281cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl if (Index < F->LocalNumDecls) 1282cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl break; 1283cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl Index -= F->LocalNumDecls; 1284cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl } 1285cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl assert(F && F->LocalNumDecls > Index && "Broken chain"); 1286c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return RecordLocation(F, F->DeclOffsets[Index]); 1287cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl} 1288cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl 1289d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl/// \brief Read the declaration at the given offset from the AST file. 12908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) { 12910b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl RecordLocation Loc = DeclCursorForIndex(Index, ID); 1292c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 1293698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // Keep track of where we are in the stream, then jump back there 1294698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // after reading this declaration. 1295da93061f56d5820725b01a140879d047554e7d32Chris Lattner SavedStreamPosition SavedPosition(DeclsCursor); 1296698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1297919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis ReadingKindTracker ReadingKind(Read_Decl, *this); 1298919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis 1299d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor // Note that we are loading a declaration record. 130029ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis Deserializing ADecl(this); 13011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1302c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl DeclsCursor.JumpToBit(Loc.Offset); 1303698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RecordData Record; 1304da93061f56d5820725b01a140879d047554e7d32Chris Lattner unsigned Code = DeclsCursor.ReadCode(); 1305698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned Idx = 0; 1306c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx); 1307698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1308da93061f56d5820725b01a140879d047554e7d32Chris Lattner Decl *D = 0; 13098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) { 13108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CONTEXT_LEXICAL: 13118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CONTEXT_VISIBLE: 1312698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(false && "Record cannot be de-serialized with ReadDeclRecord"); 1313698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TRANSLATION_UNIT: 1315698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(Index == 0 && "Translation unit must be at index 0"); 1316d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = Context->getTranslationUnitDecl(); 1317698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TYPEDEF: 1319ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1320698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ENUM: 1322b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = EnumDecl::Create(*Context, Decl::EmptyShell()); 1323698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_RECORD: 1325b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = RecordDecl::Create(*Context, Decl::EmptyShell()); 1326698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ENUM_CONSTANT: 1328d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 1329698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 0, llvm::APSInt()); 1330698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FUNCTION: 13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(), 1333a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType(), 0); 1334698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_LINKAGE_SPEC: 13366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(), 13376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner (LinkageSpecDecl::LanguageIDs)0, 13386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner false); 13396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NAMESPACE: 13416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0); 13426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NAMESPACE_ALIAS: 13446ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(), 13456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0, SourceRange(), 0, 13466ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0); 13476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING: 1349ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D = UsingDecl::Create(*Context, 0, SourceRange(), SourceLocation(), 1350ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara 0, DeclarationNameInfo(), false); 13516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING_SHADOW: 13536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0); 13546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING_DIRECTIVE: 13566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(), 13576ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), SourceRange(), 0, 13586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0, 0); 13596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_UNRESOLVED_USING_VALUE: 13616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(), 1362ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara SourceRange(), 0, 1363ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo()); 13646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_UNRESOLVED_USING_TYPENAME: 13666ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(), 13676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), SourceRange(), 13686ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 0, SourceLocation(), 13696ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner DeclarationName()); 13706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_RECORD: 1372b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = CXXRecordDecl::Create(*Context, Decl::EmptyShell()); 13736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_METHOD: 13752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara D = CXXMethodDecl::Create(*Context, 0, DeclarationNameInfo(), 13766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner QualType(), 0); 13776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_CONSTRUCTOR: 13796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell()); 13806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_DESTRUCTOR: 13826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell()); 13836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_CONVERSION: 13856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXConversionDecl::Create(*Context, Decl::EmptyShell()); 13866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ACCESS_SPEC: 138865b63ec1410f09e1f3cdb847018d678b8f8fc3f7Argyrios Kyrtzidis D = AccessSpecDecl::Create(*Context, Decl::EmptyShell()); 13896206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara break; 13908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FRIEND: 13916764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D = FriendDecl::Create(*Context, Decl::EmptyShell()); 13926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FRIEND_TEMPLATE: 1394554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell()); 13956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE: 13975bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(), 13985bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis DeclarationName(), 0, 0, 0); 13996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE_SPECIALIZATION: 1401b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell()); 14026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION: 1404b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = ClassTemplatePartialSpecializationDecl::Create(*Context, 1405b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis Decl::EmptyShell()); 14066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FUNCTION_TEMPLATE: 1408f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(), 1409f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis DeclarationName(), 0, 0); 14106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TEMPLATE_TYPE_PARM: 1412b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell()); 14136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NON_TYPE_TEMPLATE_PARM: 1415b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0, 1416b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis QualType(),0); 14176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TEMPLATE_TEMPLATE_PARM: 1419bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0); 14206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_STATIC_ASSERT: 14220d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0); 14236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 14258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_METHOD: 14261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(), 14274bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor Selector(), QualType(), 0, 0); 1428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_INTERFACE: 1430deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0); 1431698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_IVAR: 1433a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ObjCIvarDecl::None); 1435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROTOCOL: 1437d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0); 1438698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_AT_DEFS_FIELD: 14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0, 1441698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner QualType(), 0); 1442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CLASS: 1444d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCClassDecl::Create(*Context, 0, SourceLocation()); 1445698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_FORWARD_PROTOCOL: 1447d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation()); 1448698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CATEGORY: 14503db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(), 14513db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor SourceLocation(), SourceLocation(), 0); 1452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CATEGORY_IMPL: 1454d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1455698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_IMPLEMENTATION: 1457d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1458698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_COMPATIBLE_ALIAS: 1460d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1461698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROPERTY: 1463d0502407c1b41b2ace326f355d7b7a6876246223Fariborz Jahanian D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(), 146483a230c83a54190366138c1a4f4310ef838b88fcJohn McCall 0); 1465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROPERTY_IMPL: 1467d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(), 14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation(), 0, 1469698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ObjCPropertyImplDecl::Dynamic, 0); 1470698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FIELD: 14721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0, 1473a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis false); 1474698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_VAR: 1476a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1477d931b086984257de68868a64a235c2b4b34003fbJohn McCall SC_None, SC_None); 1478698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 14808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_IMPLICIT_PARAM: 1481d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType()); 1482698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1483698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 14848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_PARM_VAR: 14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1486d931b086984257de68868a64a235c2b4b34003fbJohn McCall SC_None, SC_None, 0); 1487698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FILE_SCOPE_ASM: 1489d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0); 1490698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_BLOCK: 1492d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = BlockDecl::Create(*Context, 0, SourceLocation()); 1493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 1495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1496d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(D && "Unknown declaration reading AST file"); 14974e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner LoadedDecl(Index, D); 14984e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner Reader.Visit(D); 1499698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1500698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // If this declaration is also a declaration context, get the 1501698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // offsets for its tables of lexical and visible declarations. 1502698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (DeclContext *DC = dyn_cast<DeclContext>(D)) { 1503698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC); 1504698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Offsets.first || Offsets.second) { 1505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DC->setHasExternalLexicalStorage(Offsets.first != 0); 1506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DC->setHasExternalVisibleStorage(Offsets.second != 0); 1507681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl DeclContextInfo Info; 1508681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (ReadDeclContextStorage(DeclsCursor, Offsets, Info)) 1509681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return 0; 1510d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl DeclContextInfos &Infos = DeclContextOffsets[DC]; 1511e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // Reading the TU will happen after reading its lexical update blocks, 1512e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // so we need to make sure we insert in front. For all other contexts, 1513e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // the vector is empty here anyway, so there's no loss in efficiency. 1514d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl Infos.insert(Infos.begin(), Info); 1515e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl 1516e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // Now add the pending visible updates for this decl context, if it has 1517e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // any. 1518e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl DeclContextVisibleUpdatesPending::iterator I = 1519e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl PendingVisibleUpdates.find(ID); 1520e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl if (I != PendingVisibleUpdates.end()) { 1521e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl DeclContextVisibleUpdates &U = I->second; 1522e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.LexicalDecls = 0; 1523e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.NumLexicalDecls = 0; 1524e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); 1525e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl UI != UE; ++UI) { 1526e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.NameLookupTableData = *UI; 1527e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Infos.push_back(Info); 1528e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl } 1529e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl PendingVisibleUpdates.erase(I); 1530e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl } 1531698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 1532698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 15336e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl 15346e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl // If this is a template, read additional specializations that may be in a 15356e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl // different part of the chain. 15366e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl if (isa<RedeclarableTemplateDecl>(D)) { 15376e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsMap::iterator F = 15386e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsPending.find(ID); 15396e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl if (F != AdditionalTemplateSpecializationsPending.end()) { 15406e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl for (AdditionalTemplateSpecializations::iterator I = F->second.begin(), 15416e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl E = F->second.end(); 15426e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl I != E; ++I) 15436e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl GetDecl(*I); 15446e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsPending.erase(F); 15456e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl } 15466e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl } 1547698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(Idx == Record.size()); 1548698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1549698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // If we have deserialized a declaration that has a definition the 1550bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // AST consumer might need to know about, queue it. 1551bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // We don't pass it to the consumer immediately because we may be in recursive 1552bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // loading, and some declarations may still be initializing. 1553bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis if (isConsumerInterestedIn(D)) 1554bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis InterestingDecls.push_back(D); 1555698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1556698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return D; 1557698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1558