ASTReaderDecl.cpp revision 7b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8
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 157b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "ASTCommon.h" 166ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h" 17698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTConsumer.h" 18698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTContext.h" 19698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclVisitor.h" 20698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclGroup.h" 216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclCXX.h" 226ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclTemplate.h" 23698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/Expr.h" 24698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerusing namespace clang; 258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization; 26698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 27698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 28698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// Declaration deserialization 29698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 30698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 316764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidisnamespace clang { 32d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> { 33c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader &Reader; 34c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTReader::PerFileData &F; 35577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl llvm::BitstreamCursor &Cursor; 368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl const DeclID ThisDeclID; 37c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis typedef ASTReader::RecordData RecordData; 38c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis const RecordData &Record; 39698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned &Idx; 408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl TypeID TypeIDForTypeDecl; 41698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 42577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl uint64_t GetCurrentCursorOffset(); 43c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { 44c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.ReadSourceLocation(F, R, I); 45c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 46c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { 47c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.ReadSourceRange(F, R, I); 48c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 49c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { 50c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return Reader.GetTypeSourceInfo(F, R, I); 51c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl } 524045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadQualifierInfo(QualifierInfo &Info, 53c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis const RecordData &R, unsigned &I) { 544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadQualifierInfo(F, Info, R, I); 554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 57c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis const RecordData &R, unsigned &I) { 584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 61c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis const RecordData &R, unsigned &I) { 624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } 64577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl 65c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data); 66698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner public: 67c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F, 68c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl llvm::BitstreamCursor &Cursor, DeclID thisDeclID, 69c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis const RecordData &Record, unsigned &Idx) 70c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID), 71c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { } 72698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 73d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis void Visit(Decl *D); 74d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 757b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis void UpdateDecl(Decl *D, const RecordData &Record); 767b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 77698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitDecl(Decl *D); 78698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTranslationUnitDecl(TranslationUnitDecl *TU); 79698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitNamedDecl(NamedDecl *ND); 800cef483f3b9d6a7f9fdbc5910d0a3ed64130e8e1Douglas Gregor void VisitNamespaceDecl(NamespaceDecl *D); 816ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 83698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTypeDecl(TypeDecl *TD); 84698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTypedefDecl(TypedefDecl *TD); 858f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 86698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitTagDecl(TagDecl *TD); 87698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitEnumDecl(EnumDecl *ED); 88698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitRecordDecl(RecordDecl *RD); 896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXRecordDecl(CXXRecordDecl *D); 906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplateSpecializationDecl( 916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplateSpecializationDecl *D); 926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplatePartialSpecializationDecl( 936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplatePartialSpecializationDecl *D); 946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 95698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitValueDecl(ValueDecl *VD); 96698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitEnumConstantDecl(EnumConstantDecl *ECD); 978f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 98d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis void VisitDeclaratorDecl(DeclaratorDecl *DD); 99698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFunctionDecl(FunctionDecl *FD); 1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXMethodDecl(CXXMethodDecl *D); 1016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXConstructorDecl(CXXConstructorDecl *D); 1026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXDestructorDecl(CXXDestructorDecl *D); 1036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitCXXConversionDecl(CXXConversionDecl *D); 104698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFieldDecl(FieldDecl *FD); 105698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitVarDecl(VarDecl *VD); 106698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitImplicitParamDecl(ImplicitParamDecl *PD); 107698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitParmVarDecl(ParmVarDecl *PD); 1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 1096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateDecl(TemplateDecl *D); 1109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D); 1116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitClassTemplateDecl(ClassTemplateDecl *D); 112f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 1136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 114b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis void VisitUsingDecl(UsingDecl *D); 115b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis void VisitUsingShadowDecl(UsingShadowDecl *D); 1166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitLinkageSpecDecl(LinkageSpecDecl *D); 117698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD); 1186206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara void VisitAccessSpecDecl(AccessSpecDecl *D); 1196764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis void VisitFriendDecl(FriendDecl *D); 1206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitFriendTemplateDecl(FriendTemplateDecl *D); 1216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner void VisitStaticAssertDecl(StaticAssertDecl *D); 122698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitBlockDecl(BlockDecl *BD); 1236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 124698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC); 125a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis template <typename T> void VisitRedeclarable(Redeclarable<T> *D); 1266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1279a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt // FIXME: Reorder according to DeclNodes.td? 128698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCMethodDecl(ObjCMethodDecl *D); 129698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCContainerDecl(ObjCContainerDecl *D); 130698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 131698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCIvarDecl(ObjCIvarDecl *D); 132698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCProtocolDecl(ObjCProtocolDecl *D); 133698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); 134698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCClassDecl(ObjCClassDecl *D); 135698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 136698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCategoryDecl(ObjCCategoryDecl *D); 137698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCImplDecl(ObjCImplDecl *D); 138698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 139698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCImplementationDecl(ObjCImplementationDecl *D); 140698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D); 141698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCPropertyDecl(ObjCPropertyDecl *D); 142698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 143698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner }; 144698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 145698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 146d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redluint64_t ASTDeclReader::GetCurrentCursorOffset() { 147577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl uint64_t Off = 0; 148577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) { 149c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::PerFileData &F = *Reader.Chain[N - I - 1]; 150577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl if (&Cursor == &F.DeclsCursor) { 151577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl Off += F.DeclsCursor.GetCurrentBitNo(); 152577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl break; 153577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl } 154577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl Off += F.SizeInBits; 155577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl } 156577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl return Off; 157577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl} 158577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl 159d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::Visit(Decl *D) { 160d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl DeclVisitor<ASTDeclReader, void>::Visit(D); 161d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 16291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) { 163deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor // if we have a fully initialized TypeDecl, we can safely read its type now. 164deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr()); 16591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 16691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis // FunctionDecl's body was written last after all other Stmts/Exprs. 16791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis if (Record[Idx++]) 168577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl FD->setLazyBody(GetCurrentCursorOffset()); 16991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis } 170d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis} 171d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis 172d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDecl(Decl *D) { 173698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 174698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setLexicalDeclContext( 175698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 176c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setLocation(ReadSourceLocation(Record, Idx)); 177698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setInvalidDecl(Record[Idx++]); 1784eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis if (Record[Idx++]) { // hasAttrs 179cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AttrVec Attrs; 1804eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis Reader.ReadAttributes(F, Attrs, Record, Idx); 181cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt D->setAttrs(Attrs); 182cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 183698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setImplicit(Record[Idx++]); 184e0762c92110dfdcdd207db461a4ea17afd168f1eDouglas Gregor D->setUsed(Record[Idx++]); 185698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setAccess((AccessSpecifier)Record[Idx++]); 1861d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl D->setPCHLevel(Record[Idx++] + (F.Type <= ASTReader::PCH)); 187698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 188698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 189d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) { 190698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(TU); 1916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner TU->setAnonymousNamespace( 1926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 193698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 194698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 195d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamedDecl(NamedDecl *ND) { 196698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(ND); 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ND->setDeclName(Reader.ReadDeclarationName(Record, Idx)); 198698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 199698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 200d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypeDecl(TypeDecl *TD) { 201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(TD); 202d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis // Delay type reading until after we have fully initialized the decl. 203deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor TypeIDForTypeDecl = Record[Idx++]; 204698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 205698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 206d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) { 207d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis VisitTypeDecl(TD); 208c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 210698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 211d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTagDecl(TagDecl *TD) { 212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTypeDecl(TD); 213a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis VisitRedeclarable(TD); 2146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis TD->IdentifierNamespace = Record[Idx++]; 215698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner TD->setTagKind((TagDecl::TagKind)Record[Idx++]); 216698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner TD->setDefinition(Record[Idx++]); 217b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor TD->setEmbeddedInDeclarator(Record[Idx++]); 218c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setRBraceLoc(ReadSourceLocation(Record, Idx)); 219c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TD->setTagKeywordLoc(ReadSourceLocation(Record, Idx)); 2204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis if (Record[Idx++]) { // hasExtInfo 2214045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TagDecl::ExtInfo *Info = new (*Reader.getContext()) TagDecl::ExtInfo(); 2224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadQualifierInfo(*Info, Record, Idx); 2234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TD->TypedefDeclOrQualifier = Info; 2244045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } else 2254045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis TD->setTypedefForAnonDecl( 2264045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++]))); 227698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 228698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 229d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumDecl(EnumDecl *ED) { 230698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTagDecl(ED); 2311274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx)) 2321274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->setIntegerTypeSourceInfo(TI); 2331274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor else 2341274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->setIntegerType(Reader.GetType(Record[Idx++])); 235842aef8d942a880eeb9535d40de31a86838264cbJohn McCall ED->setPromotionType(Reader.GetType(Record[Idx++])); 2361b5a618c59025898806160ed5e7f0ff5bb79e482John McCall ED->setNumPositiveBits(Record[Idx++]); 2371b5a618c59025898806160ed5e7f0ff5bb79e482John McCall ED->setNumNegativeBits(Record[Idx++]); 2381274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->IsScoped = Record[Idx++]; 2391274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor ED->IsFixed = Record[Idx++]; 24074228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis ED->setInstantiationOfMemberEnum( 24174228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++]))); 242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 244d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRecordDecl(RecordDecl *RD) { 245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitTagDecl(RD); 246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RD->setHasFlexibleArrayMember(Record[Idx++]); 247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RD->setAnonymousStructOrUnion(Record[Idx++]); 248643b7dfb7803003d62e18da65cbe81ad001851b7Fariborz Jahanian RD->setHasObjectMember(Record[Idx++]); 249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 251d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitValueDecl(ValueDecl *VD) { 252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(VD); 253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setType(Reader.GetType(Record[Idx++])); 254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 256d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) { 257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitValueDecl(ECD); 258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 259c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ECD->setInitExpr(Reader.ReadExpr(F)); 260698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ECD->setInitVal(Reader.ReadAPSInt(Record, Idx)); 261698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 263d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) { 264d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitValueDecl(DD); 2654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis if (Record[Idx++]) { // hasExtInfo 2664045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DeclaratorDecl::ExtInfo *Info 2674045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis = new (*Reader.getContext()) DeclaratorDecl::ExtInfo(); 2684045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadQualifierInfo(*Info, Record, Idx); 2694045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis Info->TInfo = GetTypeSourceInfo(Record, Idx); 2704045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DD->DeclInfo = Info; 2714045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis } else 2724045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis DD->DeclInfo = GetTypeSourceInfo(Record, Idx); 273d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis} 274d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis 275d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { 276d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(FD); 2776b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitRedeclarable(FD); 2786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 2794045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(FD->DNLoc, FD->getDeclName(), Record, Idx); 280c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis FD->IdentifierNamespace = Record[Idx++]; 281f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis switch ((FunctionDecl::TemplatedKind)Record[Idx++]) { 282dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis default: assert(false && "Unhandled TemplatedKind!"); 283dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 284f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_NonTemplate: 285f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 286f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_FunctionTemplate: 287f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->setDescribedFunctionTemplate( 288f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]))); 289f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 290f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_MemberSpecialization: { 291f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 292f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 293c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 2946b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK); 295f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI); 296f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis break; 297f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 298f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_FunctionTemplateSpecialization: { 299f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FunctionTemplateDecl *Template 300f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 301f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 302f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 303f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Template arguments. 304f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 305c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 306f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 307f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Template args as written. 308f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs; 309f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis SourceLocation LAngleLoc, RAngleLoc; 3105efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis if (Record[Idx++]) { // TemplateArgumentsAsWritten != 0 3115efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis unsigned NumTemplateArgLocs = Record[Idx++]; 3125efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis TemplArgLocs.reserve(NumTemplateArgLocs); 3135efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis for (unsigned i=0; i != NumTemplateArgLocs; ++i) 314577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl TemplArgLocs.push_back( 315c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 3165efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 317c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl LAngleLoc = ReadSourceLocation(Record, Idx); 318c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl RAngleLoc = ReadSourceLocation(Record, Idx); 319f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 3207b081c8604efd33bc7f7e5c1e9427a031eedb2b4Argyrios Kyrtzidis 321c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 322f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 323a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 324a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplateArgumentList *TemplArgList 325a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); 326a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplateArgumentListInfo *TemplArgsInfo 327a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc); 328a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i) 329a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgsInfo->addArgument(TemplArgLocs[i]); 330a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis FunctionTemplateSpecializationInfo *FTInfo 331a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK, 332a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgList, 333a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis TemplArgsInfo, POI); 334a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis FD->TemplateOrSpecialization = FTInfo; 3356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis 336a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis if (FD->isCanonicalDecl()) { // if canonical add to template's set. 33799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // The template that contains the specializations set. It's not safe to 33899a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // use getCanonicalDecl on Template since it may still be initializing. 33999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis FunctionTemplateDecl *CanonTemplate 34099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 341a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // Get the InsertPos by FindNodeOrInsertPos() instead of calling 342a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // InsertNode(FTInfo) directly to avoid the getASTContext() call in 343a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // FunctionTemplateSpecializationInfo's Profile(). 344a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // We avoid getASTContext because a decl in the parent hierarchy may 345a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis // be initializing. 3466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 3476b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(), 3486b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis TemplArgs.size(), C); 3496b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis void *InsertPos = 0; 35099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); 351a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis assert(InsertPos && "Another specialization already inserted!"); 35299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos); 3536b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis } 354dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 355f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 356f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { 357f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Templates. 358f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis UnresolvedSet<8> TemplDecls; 359f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis unsigned NumTemplates = Record[Idx++]; 360f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis while (NumTemplates--) 361f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 362f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 363f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // Templates args. 364f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplateArgumentListInfo TemplArgs; 365f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis unsigned NumArgs = Record[Idx++]; 366f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis while (NumArgs--) 367c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 368c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx)); 369c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx)); 370f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 371f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis FD->setDependentTemplateSpecialization(*Reader.getContext(), 372f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis TemplDecls, TemplArgs); 373dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis break; 374f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 375f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 3765efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 377d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl // FunctionDecl's body is handled last at ASTDeclReader::Visit, 37891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis // after everything else is read. 37991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 380d931b086984257de68868a64a235c2b4b34003fbJohn McCall FD->setStorageClass((StorageClass)Record[Idx++]); 381d931b086984257de68868a64a235c2b4b34003fbJohn McCall FD->setStorageClassAsWritten((StorageClass)Record[Idx++]); 3825efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setInlineSpecified(Record[Idx++]); 3835efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setVirtualAsWritten(Record[Idx++]); 3845efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setPure(Record[Idx++]); 3855efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasInheritedPrototype(Record[Idx++]); 3865efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasWrittenPrototype(Record[Idx++]); 3875efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setDeleted(Record[Idx++]); 3885efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setTrivial(Record[Idx++]); 3895efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis FD->setHasImplicitReturnZero(Record[Idx++]); 390c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl FD->setLocEnd(ReadSourceLocation(Record, Idx)); 3915efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis 3926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // Read in the parameters. 393698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 394698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 395698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 396698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 397698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 3986b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis FD->setParams(*Reader.getContext(), Params.data(), NumParams); 399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 400698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 401d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { 402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(MD); 403698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) { 404698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // In practice, this won't be executed (since method definitions 405698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // don't occur in header files). 406c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setBody(Reader.ReadStmt(F)); 407698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 408698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 410698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setInstanceMethod(Record[Idx++]); 411698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setVariadic(Record[Idx++]); 412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setSynthesized(Record[Idx++]); 4133fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian MD->setDefined(Record[Idx++]); 414698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]); 415698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]); 4167732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian MD->setNumSelectorArgs(unsigned(Record[Idx++])); 417698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner MD->setResultType(Reader.GetType(Record[Idx++])); 418c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 419c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl MD->setEndLoc(ReadSourceLocation(Record, Idx)); 420698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 421698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 422698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 423698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 424698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 4254ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams, 4264ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian NumParams); 427698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 429d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) { 430698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(CD); 431c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation A = ReadSourceLocation(Record, Idx); 432c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation B = ReadSourceLocation(Record, Idx); 433782f2f52b78d8ca785110398a7f7b56b830b9ac7Ted Kremenek CD->setAtEndRange(SourceRange(A, B)); 434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 436d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { 437698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(ID); 438deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr()); 439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ID->setSuperClass(cast_or_null<ObjCInterfaceDecl> 440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (Reader.GetDecl(Record[Idx++]))); 44153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 44253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the directly referenced protocols and their SourceLocations. 443698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtocols = Record[Idx++]; 444698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols; 445698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Protocols.reserve(NumProtocols); 446698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtocols; ++I) 447698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 44818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 44918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtocols); 45018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtocols; ++I) 451c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 45218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(), 45318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 45453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 45553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the transitive closure of protocols referenced by this class. 45653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek NumProtocols = Record[Idx++]; 45753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.clear(); 45853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.reserve(NumProtocols); 45953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek for (unsigned I = 0; I != NumProtocols; ++I) 46053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 46153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols, 46253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek *Reader.getContext()); 46353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek 46453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek // Read the ivars. 465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumIvars = Record[Idx++]; 466698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCIvarDecl *, 16> IVars; 467698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVars.reserve(NumIvars); 468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumIvars; ++I) 469698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 470698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ID->setCategoryList( 471698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 4722c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian // We will rebuild this list lazily. 4732c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian ID->setIvarList(0); 474deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setForwardDecl(Record[Idx++]); 475deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor ID->setImplicitInterfaceDecl(Record[Idx++]); 476c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setClassLoc(ReadSourceLocation(Record, Idx)); 477c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setSuperClassLoc(ReadSourceLocation(Record, Idx)); 478c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ID->setLocEnd(ReadSourceLocation(Record, Idx)); 479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 480698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 481d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) { 482698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitFieldDecl(IVD); 483698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]); 4842c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian // This field will be built lazily. 4852c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian IVD->setNextIvar(0); 486ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian bool synth = Record[Idx++]; 487ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian IVD->setSynthesize(synth); 488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 490d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { 491698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(PD); 492698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner PD->setForwardDecl(Record[Idx++]); 493c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl PD->setLocEnd(ReadSourceLocation(Record, Idx)); 494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 496698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 497698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 498698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 49918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 50018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 50118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 502c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 50318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 50418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 507d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) { 508698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitFieldDecl(FD); 509698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 510698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 511d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { 512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(CD); 513698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumClassRefs = Record[Idx++]; 514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs; 515698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ClassRefs.reserve(NumClassRefs); 516698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumClassRefs; ++I) 517698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 518321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek llvm::SmallVector<SourceLocation, 16> SLocs; 519321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek SLocs.reserve(NumClassRefs); 520321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek for (unsigned I = 0; I != NumClassRefs; ++I) 521c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SLocs.push_back(ReadSourceLocation(Record, Idx)); 522321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(), 523321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek NumClassRefs); 524698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 526d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { 527698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(FPD); 528698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 529698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 530698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 531698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 532698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 53318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 53418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 53518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 536c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 53718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 53818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 539698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 540698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 541d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) { 542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCContainerDecl(CD); 543698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 544698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumProtoRefs = Record[Idx++]; 545698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 546698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.reserve(NumProtoRefs); 547698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumProtoRefs; ++I) 548698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 54918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor llvm::SmallVector<SourceLocation, 16> ProtoLocs; 55018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor ProtoLocs.reserve(NumProtoRefs); 55118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor for (unsigned I = 0; I != NumProtoRefs; ++I) 552c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 55318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 55418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor *Reader.getContext()); 555698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 556000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian CD->setHasSynthBitfield(Record[Idx++]); 557c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl CD->setAtLoc(ReadSourceLocation(Record, Idx)); 558c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx)); 559698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 560698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 561d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) { 562698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(CAD); 563698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 564698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 565698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 566d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 567698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitNamedDecl(D); 568c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setAtLoc(ReadSourceLocation(Record, Idx)); 569c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setType(GetTypeSourceInfo(Record, Idx)); 570698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // FIXME: stable encoding 571698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyAttributes( 572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 57380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian D->setPropertyAttributesAsWritten( 57480aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 575698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // FIXME: stable encoding 576698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyImplementation( 577698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner (ObjCPropertyDecl::PropertyControl)Record[Idx++]); 578698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 579698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 580698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setGetterMethodDecl( 581698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 582698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSetterMethodDecl( 583698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 584698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyIvarDecl( 585698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 586698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 587698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 588d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) { 589aecae629269fae3bf484baf1d109e9a89d14eeadArgyrios Kyrtzidis VisitObjCContainerDecl(D); 590698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setClassInterface( 591698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 592698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 593698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 594d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 595698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCImplDecl(D); 596698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx)); 597698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 598698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 599d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 600698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitObjCImplDecl(D); 601698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setSuperClass( 602698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 6039d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis llvm::tie(D->IvarInitializers, D->NumIvarInitializers) 604c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx); 605000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian D->setHasSynthBitfield(Record[Idx++]); 606698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 607698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 608698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 609d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 610698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(D); 611c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setAtLoc(ReadSourceLocation(Record, Idx)); 612698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyDecl( 613698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++]))); 614698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner D->setPropertyIvarDecl( 615698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 616c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setGetterCXXConstructor(Reader.ReadExpr(F)); 617c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setSetterCXXAssignment(Reader.ReadExpr(F)); 618698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 619698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 620d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFieldDecl(FieldDecl *FD) { 621d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(FD); 622698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner FD->setMutable(Record[Idx++]); 623698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 624c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl FD->setBitWidth(Reader.ReadExpr(F)); 625c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (!FD->getDeclName()) { 626c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])); 627c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Tmpl) 628c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl); 629c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis } 630698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 631698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 632d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitVarDecl(VarDecl *VD) { 633d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis VisitDeclaratorDecl(VD); 6346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitRedeclarable(VD); 635d931b086984257de68868a64a235c2b4b34003fbJohn McCall VD->setStorageClass((StorageClass)Record[Idx++]); 636d931b086984257de68868a64a235c2b4b34003fbJohn McCall VD->setStorageClassAsWritten((StorageClass)Record[Idx++]); 637698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setThreadSpecified(Record[Idx++]); 638698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VD->setCXXDirectInitializer(Record[Idx++]); 639324b54d3f60d92a82815512119791ce1c285b63eDouglas Gregor VD->setExceptionVariable(Record[Idx++]); 6405077c3876beeaed32280af88244e8050078619a8Douglas Gregor VD->setNRVOVariable(Record[Idx++]); 641698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Record[Idx++]) 642c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl VD->setInit(Reader.ReadExpr(F)); 6439421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis 6449421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis if (Record[Idx++]) { // HasMemberSpecializationInfo. 6459421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++])); 6469421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 647c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 6489421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI); 6499421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis } 650698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 651698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 652d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) { 653698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitVarDecl(PD); 654698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 655698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 656d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) { 657698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitVarDecl(PD); 658698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]); 659bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall PD->setHasInheritedDefaultArg(Record[Idx++]); 660691d77f20763915fc7c9b34e29939d225fd0b4d2Argyrios Kyrtzidis if (Record[Idx++]) // hasUninstantiatedDefaultArg. 661c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F)); 662698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 663698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 664d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) { 665698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(AD); 666c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F))); 667698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 668698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 669d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { 670698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner VisitDecl(BD); 671c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F))); 672c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx)); 673698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned NumParams = Record[Idx++]; 674698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner llvm::SmallVector<ParmVarDecl *, 16> Params; 675698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.reserve(NumParams); 676698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner for (unsigned I = 0; I != NumParams; ++I) 677698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 678838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor BD->setParams(Params.data(), NumParams); 679698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 680698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 681d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 6826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitDecl(D); 6836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]); 6846ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setHasBraces(Record[Idx++]); 6856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 6866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 687d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) { 6886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 6890a0c3e72ce42f84f361c285e6963d44213ab6beaDouglas Gregor D->IsInline = Record[Idx++]; 690c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setLBracLoc(ReadSourceLocation(Record, Idx)); 691c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setRBracLoc(ReadSourceLocation(Record, Idx)); 6926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setNextNamespace( 6936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 6946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 6956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner bool IsOriginal = Record[Idx++]; 696a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis D->OrigOrAnonNamespace.setInt(IsOriginal); 697a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis D->OrigOrAnonNamespace.setPointer( 6986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 6996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 701d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 7026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 703c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->NamespaceLoc = ReadSourceLocation(Record, Idx); 704c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setQualifierRange(ReadSourceRange(Record, Idx)); 7056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 706c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->IdentLoc = ReadSourceLocation(Record, Idx); 7078ea5b9d832455247a15925398fb663d299d33238Douglas Gregor D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 7086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 710d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDecl(UsingDecl *D) { 7116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 712c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setUsingLocation(ReadSourceLocation(Record, Idx)); 713c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setNestedNameRange(ReadSourceRange(Record, Idx)); 7146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx)); 7154045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 7166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 7176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // FIXME: It would probably be more efficient to read these into a vector 7186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // and then re-cosntruct the shadow decl set over that vector since it 7196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner // would avoid existence checks. 7206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner unsigned NumShadows = Record[Idx++]; 7216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner for(unsigned I = 0; I != NumShadows; ++I) { 72282f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still 72382f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis // be initializing. 72482f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]))); 7256ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner } 7266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTypeName(Record[Idx++]); 727c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 728c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pattern) 729c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern); 7306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 732d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) { 7336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 7346ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 7356ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++]))); 736c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis UsingShadowDecl *Pattern 737c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])); 738c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis if (Pattern) 739c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern); 7406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 742d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 7436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitNamedDecl(D); 744c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->UsingLoc = ReadSourceLocation(Record, Idx); 745c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->NamespaceLoc = ReadSourceLocation(Record, Idx); 746c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->QualifierRange = ReadSourceRange(Record, Idx); 7470a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->Qualifier = Reader.ReadNestedNameSpecifier(Record, Idx); 7480a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 7490a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])); 7506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 752d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 7536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitValueDecl(D); 754c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setTargetNestedNameRange(ReadSourceRange(Record, Idx)); 755c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setUsingLoc(ReadSourceLocation(Record, Idx)); 7566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 7574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 7586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 760d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingTypenameDecl( 7616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner UnresolvedUsingTypenameDecl *D) { 7626ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitTypeDecl(D); 763c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TargetNestedNameRange = ReadSourceRange(Record, Idx); 764c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->UsingLocation = ReadSourceLocation(Record, Idx); 765c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TypenameLocation = ReadSourceLocation(Record, Idx); 7667e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor D->TargetNestedNameSpecifier = Reader.ReadNestedNameSpecifier(Record, Idx); 7676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 7686ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 769c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidisvoid ASTDeclReader::ReadCXXDefinitionData( 770c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis struct CXXRecordDecl::DefinitionData &Data) { 771c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 772c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis 773c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.UserDeclaredConstructor = Record[Idx++]; 774c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.UserDeclaredCopyConstructor = Record[Idx++]; 775c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.UserDeclaredCopyAssignment = Record[Idx++]; 776c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.UserDeclaredDestructor = Record[Idx++]; 777c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Aggregate = Record[Idx++]; 778c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.PlainOldData = Record[Idx++]; 779c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Empty = Record[Idx++]; 780c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Polymorphic = Record[Idx++]; 781c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Abstract = Record[Idx++]; 782c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.HasTrivialConstructor = Record[Idx++]; 783c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.HasTrivialCopyConstructor = Record[Idx++]; 784c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.HasTrivialCopyAssignment = Record[Idx++]; 785c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.HasTrivialDestructor = Record[Idx++]; 786c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.ComputedVisibleConversions = Record[Idx++]; 787c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.DeclaredDefaultConstructor = Record[Idx++]; 788c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.DeclaredCopyConstructor = Record[Idx++]; 789c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.DeclaredCopyAssignment = Record[Idx++]; 790c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.DeclaredDestructor = Record[Idx++]; 791c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis 792c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis // setBases() is unsuitable since it may try to iterate the bases of an 793c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis // uninitialized base. 794c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.NumBases = Record[Idx++]; 795c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases]; 796c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis for (unsigned i = 0; i != Data.NumBases; ++i) 797c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.Bases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 798c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis 799c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis // FIXME: Make VBases lazily computed when needed to avoid storing them. 800c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.NumVBases = Record[Idx++]; 801c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases]; 802c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis for (unsigned i = 0; i != Data.NumVBases; ++i) 803c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.VBases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 804c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis 805c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx); 806c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx); 807c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis assert(Data.Definition && "Data.Definition should be already set!"); 808c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis Data.FirstFriend 809c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++])); 810c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis} 811c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis 812d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { 8130f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis VisitRecordDecl(D); 8140f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis 815134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 8169703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis 817134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis CXXRecordDecl *DefinitionDecl 818134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis = cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 819134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis if (D == DefinitionDecl) { 820134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D); 821c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis ReadCXXDefinitionData(*D->DefinitionData); 822134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis // We read the definition info. Check if there are pending forward 823134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis // references that need to point to this DefinitionData pointer. 824134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis ASTReader::PendingForwardRefsMap::iterator 825134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis FindI = Reader.PendingForwardRefs.find(D); 826134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis if (FindI != Reader.PendingForwardRefs.end()) { 827134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis ASTReader::ForwardRefs &Refs = FindI->second; 828134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis for (ASTReader::ForwardRefs::iterator 829134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis I = Refs.begin(), E = Refs.end(); I != E; ++I) 830134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis (*I)->DefinitionData = D->DefinitionData; 831134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis#ifndef NDEBUG 832134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis // We later check whether PendingForwardRefs is empty to make sure all 833134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis // pending references were linked. 834134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis Reader.PendingForwardRefs.erase(D); 835134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis#endif 836134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis } 837134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis } else if (DefinitionDecl) { 838134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis if (DefinitionDecl->DefinitionData) { 839134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis D->DefinitionData = DefinitionDecl->DefinitionData; 840134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis } else { 841134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis // The definition is still initializing. 842134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis Reader.PendingForwardRefs[DefinitionDecl].push_back(D); 843134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis } 84437ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis } 84537ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis 8468731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis enum CXXRecKind { 8478731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization 8488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis }; 8498731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis switch ((CXXRecKind)Record[Idx++]) { 8508731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis default: 851d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?"); 8528731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecNotTemplate: 8538731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecTemplate: 8558b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis D->TemplateOrInstantiation 8568b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 8578731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8588731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis case CXXRecMemberSpecialization: { 8598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 8608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 861c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation POI = ReadSourceLocation(Record, Idx); 8628b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK); 8638b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis MSI->setPointOfInstantiation(POI); 8648b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis D->TemplateOrInstantiation = MSI; 8658731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis break; 8668731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 8678731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 86836d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis 86936d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis // Load the key function to avoid deserializing every method so we can 87036d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis // compute it. 87136d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis if (D->IsDefinition) { 87236d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis CXXMethodDecl *Key 87336d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis = cast_or_null<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 87436d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis if (Key) 87536d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis C.KeyFunctions[D] = Key; 87636d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis } 8776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 8786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 879d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { 8806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitFunctionDecl(D); 881c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis unsigned NumOverridenMethods = Record[Idx++]; 882c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis while (NumOverridenMethods--) { 883c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 884c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod, 885c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis // MD may be initializing. 886c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis Reader.getContext()->addOverriddenMethod(D, MD); 887c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis } 8886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 8896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 890d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 8916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 89291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 89391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->IsExplicitSpecified = Record[Idx++]; 89491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->ImplicitlyDefined = Record[Idx++]; 8958e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers) 896c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx); 8976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 8986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 899d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 9006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 90191468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis 90291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->ImplicitlyDefined = Record[Idx++]; 90391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 9046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 906d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) { 9076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner VisitCXXMethodDecl(D); 90891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis D->IsExplicitSpecified = Record[Idx++]; 9096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 911d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) { 9126206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara VisitDecl(D); 913c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->setColonLoc(ReadSourceLocation(Record, Idx)); 9146206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara} 9156206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara 916d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendDecl(FriendDecl *D) { 917c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis VisitDecl(D); 9186764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis if (Record[Idx++]) 919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Friend = GetTypeSourceInfo(Record, Idx); 9206764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis else 9216764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 9226764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++])); 9236102ca1d490836096678d7d934f0b2b78f9293ecJohn McCall D->UnsupportedFriend = (Record[Idx++] != 0); 924c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->FriendLoc = ReadSourceLocation(Record, Idx); 9256764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis} 9266764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis 927d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) { 928554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis VisitDecl(D); 929554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis unsigned NumParams = Record[Idx++]; 930554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->NumParams = NumParams; 931554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->Params = new TemplateParameterList*[NumParams]; 932554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis for (unsigned i = 0; i != NumParams; ++i) 933c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx); 934554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis if (Record[Idx++]) // HasFriendDecl 935554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 936554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis else 937c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Friend = GetTypeSourceInfo(Record, Idx); 938c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->FriendLoc = ReadSourceLocation(Record, Idx); 9396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 941d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) { 9428731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis VisitNamedDecl(D); 9438731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 944bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis NamedDecl *TemplatedDecl 945bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 946dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis TemplateParameterList* TemplateParams 947c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl = Reader.ReadTemplateParameterList(F, Record, Idx); 9488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->init(TemplatedDecl, TemplateParams); 9496ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 9506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 951d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { 9526b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr() 9536b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis // can be used while this is still initializing. 9548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 9556b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this"); 9569eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *PrevDecl = 9579eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++])); 9589eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne assert((PrevDecl == 0 || PrevDecl->getKind() == D->getKind()) && 9599eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne "PrevDecl kind mismatch"); 9609eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (PrevDecl) 9619eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->CommonOrPrev = PrevDecl; 9628731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis if (PrevDecl == 0) { 9636b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis D->CommonOrPrev = D->newCommon(*Reader.getContext()); 9649eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (RedeclarableTemplateDecl *RTD 9659eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) { 9669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne assert(RTD->getKind() == D->getKind() && 9679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne "InstantiatedFromMemberTemplate kind mismatch"); 9689eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->setInstantiatedFromMemberTemplateImpl(RTD); 9699eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (Record[Idx++]) 9709eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne D->setMemberSpecialization(); 9719eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 9728a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 9738a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *LatestDecl = 9748a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++])); 975a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 976a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // This decl is a first one and the latest declaration that it points to is 9773c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // in the same AST file. However, if this actually needs to point to a 9783c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // redeclaration in another AST file, we need to update it by checking 979a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // the FirstLatestDeclIDs map which tracks this kind of decls. 980a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?"); 981c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::FirstLatestDeclIDMap::iterator I 982a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = Reader.FirstLatestDeclIDs.find(ThisDeclID); 983a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (I != Reader.FirstLatestDeclIDs.end()) { 984a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Decl *NewLatest = Reader.GetDecl(I->second); 985a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert((LatestDecl->getLocation().isInvalid() || 986a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation().isInvalid() || 987441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis !Reader.SourceMgr.isBeforeInTranslationUnit( 988441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis NewLatest->getLocation(), 989441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis LatestDecl->getLocation())) && 990a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "The new latest is supposed to come after the previous latest"); 991a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest); 992a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 993a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 9948a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch"); 9958a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne D->getCommonPtr()->Latest = LatestDecl; 9969eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 9976b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis 9986b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis VisitTemplateDecl(D); 9996b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis D->IdentifierNamespace = Record[Idx++]; 10009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 10019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1002d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { 10039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne VisitRedeclarableTemplateDecl(D); 10049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 10059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (D->getPreviousDeclaration() == 0) { 10068731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis // This ClassTemplateDecl owns a CommonPtr; read it. 10078731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 1008ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis // FoldingSets are filled in VisitClassTemplateSpecializationDecl. 10098731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis unsigned size = Record[Idx++]; 1010ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis while (size--) 1011ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++])); 10128731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 10138731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis size = Record[Idx++]; 1014ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis while (size--) 1015ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis cast<ClassTemplatePartialSpecializationDecl>( 10168731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis Reader.GetDecl(Record[Idx++])); 10178731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 10188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis // InjectedClassNameType is computed. 10198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis } 10206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 10216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1022d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateSpecializationDecl( 10236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplateSpecializationDecl *D) { 1024dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis VisitCXXRecordDecl(D); 1025586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis 1026586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 1027dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (Decl *InstD = Reader.GetDecl(Record[Idx++])) { 1028dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) { 1029586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializedTemplate = CTD; 1030dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } else { 1031dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1032c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1033586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis TemplateArgumentList *ArgList 1034586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); 1035586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS 1036586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) ClassTemplateSpecializationDecl:: 1037586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis SpecializedPartialSpecialization(); 1038586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis PS->PartialSpecialization 1039586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = cast<ClassTemplatePartialSpecializationDecl>(InstD); 1040586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis PS->TemplateArgs = ArgList; 1041586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializedTemplate = PS; 1042dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1043dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1044dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1045dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis // Explicit info. 1046c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) { 1047586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo 1048586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo; 1049586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis ExplicitInfo->TypeAsWritten = TyInfo; 1050c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx); 1051c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx); 1052586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->ExplicitInfo = ExplicitInfo; 1053dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 1054dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1055dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1056c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1057586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size()); 1058c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->PointOfInstantiation = ReadSourceLocation(Record, Idx); 1059586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++]; 1060ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis 1061bc5ab7c9e307fea5ecb979b30815da7a370e1c05Argyrios Kyrtzidis if (D->isCanonicalDecl()) { // It's kept in the folding set. 1062ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis ClassTemplateDecl *CanonPattern 1063ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 1064ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis if (ClassTemplatePartialSpecializationDecl *Partial 1065ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) { 10660a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis CanonPattern->getPartialSpecializations().InsertNode(Partial); 1067ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } else { 10680a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis CanonPattern->getSpecializations().InsertNode(D); 1069ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } 1070ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis } 10716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 10726ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1073d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplatePartialSpecializationDecl( 10746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner ClassTemplatePartialSpecializationDecl *D) { 1075dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis VisitClassTemplateSpecializationDecl(D); 1076dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 10778fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis ASTContext &C = *Reader.getContext(); 1078c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx); 10798fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis 1080dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis unsigned NumArgs = Record[Idx++]; 10818fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis if (NumArgs) { 10828fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->NumArgsAsWritten = NumArgs; 10838fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs]; 10848fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis for (unsigned i=0; i != NumArgs; ++i) 1085c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 10868fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis } 10878fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis 10888fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->SequenceNumber = Record[Idx++]; 1089dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 1090dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis // These are read/set from/to the first declaration. 1091dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis if (D->getPreviousDeclaration() == 0) { 10928fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->InstantiatedFromMember.setPointer( 1093dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis cast_or_null<ClassTemplatePartialSpecializationDecl>( 1094dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis Reader.GetDecl(Record[Idx++]))); 10958fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis D->InstantiatedFromMember.setInt(Record[Idx++]); 1096dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis } 10976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 10986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1099d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 11009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne VisitRedeclarableTemplateDecl(D); 1101f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 11029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (D->getPreviousDeclaration() == 0) { 1103f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis // This FunctionTemplateDecl owns a CommonPtr; read it. 1104f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 1105057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis // Read the function specialization declarations. 1106057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled 110799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis // when reading the specialized FunctionDecl. 1108057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis unsigned NumSpecs = Record[Idx++]; 1109057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis while (NumSpecs--) 1110057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis Reader.GetDecl(Record[Idx++]); 1111f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis } 11126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1114d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 11158731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis VisitTypeDecl(D); 11168731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 11178731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setDeclaredWithTypename(Record[Idx++]); 11188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setParameterPack(Record[Idx++]); 11198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis 11208731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis bool Inherited = Record[Idx++]; 1121c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx); 11228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis D->setDefaultArgument(DefArg, Inherited); 11236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1125d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 1126b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis VisitVarDecl(D); 1127b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis // TemplateParmPosition. 1128b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setDepth(Record[Idx++]); 1129b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setPosition(Record[Idx++]); 1130b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis // Rest of NonTypeTemplateParmDecl. 1131b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis if (Record[Idx++]) { 1132c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl Expr *DefArg = Reader.ReadExpr(F); 1133b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis bool Inherited = Record[Idx++]; 1134b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D->setDefaultArgument(DefArg, Inherited); 1135b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis } 11366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1138d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 1139bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis VisitTemplateDecl(D); 1140bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis // TemplateParmPosition. 1141bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setDepth(Record[Idx++]); 1142bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setPosition(Record[Idx++]); 1143bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis // Rest of TemplateTemplateParmDecl. 1144c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 1145bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis bool IsInherited = Record[Idx++]; 1146bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D->setDefaultArgument(Arg, IsInherited); 11476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 1149d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) { 11500d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis VisitDecl(D); 1151c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->AssertExpr = Reader.ReadExpr(F); 1152c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl D->Message = cast<StringLiteral>(Reader.ReadExpr(F)); 11536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner} 11546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstd::pair<uint64_t, uint64_t> 1156d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian RedlASTDeclReader::VisitDeclContext(DeclContext *DC) { 1157698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner uint64_t LexicalOffset = Record[Idx++]; 1158698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner uint64_t VisibleOffset = Record[Idx++]; 1159698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return std::make_pair(LexicalOffset, VisibleOffset); 1160698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1161698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1162a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T> 1163d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) { 1164a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest }; 1165a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis RedeclKind Kind = (RedeclKind)Record[Idx++]; 1166a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis switch (Kind) { 1167a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis default: 1168d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up" 1169a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis " reading"); 1170a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case NoRedeclaration: 1171a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1172a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case PointsToPrevious: 1173a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink( 1174a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis cast_or_null<T>(Reader.GetDecl(Record[Idx++]))); 1175a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1176a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis case PointsToLatest: 1177a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink = typename Redeclarable<T>::LatestDeclLink( 1178a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis cast_or_null<T>(Reader.GetDecl(Record[Idx++]))); 1179a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis break; 1180a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 1181a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1182a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(!(Kind == PointsToPrevious && 1183a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.FirstLatestDeclIDs.find(ThisDeclID) != 1184a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Reader.FirstLatestDeclIDs.end()) && 1185a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "This decl is not first, it should not be in the map"); 1186a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (Kind == PointsToPrevious) 1187a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis return; 1188a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1189a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // This decl is a first one and the latest declaration that it points to is in 11903c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // the same AST file. However, if this actually needs to point to a 11913c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // redeclaration in another AST file, we need to update it by checking the 1192a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis // FirstLatestDeclIDs map which tracks this kind of decls. 1193a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) && 1194a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "Invalid ThisDeclID ?"); 1195c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader::FirstLatestDeclIDMap::iterator I 1196a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = Reader.FirstLatestDeclIDs.find(ThisDeclID); 1197a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis if (I != Reader.FirstLatestDeclIDs.end()) { 1198a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis Decl *NewLatest = Reader.GetDecl(I->second); 1199a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis assert((D->getMostRecentDeclaration()->getLocation().isInvalid() || 1200a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis NewLatest->getLocation().isInvalid() || 1201441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis !Reader.SourceMgr.isBeforeInTranslationUnit( 1202441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis NewLatest->getLocation(), 1203441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis D->getMostRecentDeclaration()->getLocation())) && 1204a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis "The new latest is supposed to come after the previous latest"); 1205a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis D->RedeclLink 1206a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest)); 1207a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 1208a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis} 1209a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 1210698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 12114e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner// Attribute Reading 1212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===// 1213698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 12144e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner/// \brief Reads attributes from the current stream position. 12154eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidisvoid ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs, 12164eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis const RecordData &Record, unsigned &Idx) { 12174eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) { 12184e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner Attr *New = 0; 1219387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt attr::Kind Kind = (attr::Kind)Record[Idx++]; 1220c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl SourceLocation Loc = ReadSourceLocation(F, Record, Idx); 1221cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt bool isInherited = Record[Idx++]; 12224e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 1223cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHRead.inc" 12244e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 12254e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner assert(New && "Unable to decode attribute?"); 1226cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt New->setInherited(isInherited); 1227cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt Attrs.push_back(New); 12284e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner } 12294e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner} 12304e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner 12314e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===// 1232c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader Implementation 12334e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===// 1234698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1235698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Note that we have loaded the declaration with the given 1236698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// Index. 12371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 1238698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine notes that this declaration has already been loaded, 1239698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// so that future GetDecl calls will return this declaration rather 1240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// than trying to load a new declaration. 1241c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlinline void ASTReader::LoadedDecl(unsigned Index, Decl *D) { 1242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(!DeclsLoaded[Index] && "Decl loaded twice?"); 1243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DeclsLoaded[Index] = D; 1244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Determine whether the consumer will be interested in seeing 1248698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// this declaration (via HandleTopLevelDecl). 1249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// 1250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine should return true for anything that might affect 1251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// code generation, e.g., inline function definitions, Objective-C 1252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// declarations with metadata, etc. 1253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerstatic bool isConsumerInterestedIn(Decl *D) { 125404a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar if (isa<FileScopeAsmDecl>(D)) 125504a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar return true; 1256698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (VarDecl *Var = dyn_cast<VarDecl>(D)) 12573f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis return Var->isFileVarDecl() && 12583f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis Var->isThisDeclarationADefinition() == VarDecl::Definition; 1259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D)) 1260698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return Func->isThisDeclarationADefinition(); 12619d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D); 1262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 1263698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1264cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl/// \brief Get the correct cursor and offset for loading a type. 1265c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation 12668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) { 12670b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl // See if there's an override. 12680b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl DeclReplacementMap::iterator It = ReplacedDecls.find(ID); 12690b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl if (It != ReplacedDecls.end()) 1270c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return RecordLocation(It->second.first, It->second.second); 12710b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl 1272cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl PerFileData *F = 0; 1273cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl for (unsigned I = 0, N = Chain.size(); I != N; ++I) { 1274cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl F = Chain[N - I - 1]; 1275cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl if (Index < F->LocalNumDecls) 1276cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl break; 1277cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl Index -= F->LocalNumDecls; 1278cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl } 1279cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl assert(F && F->LocalNumDecls > Index && "Broken chain"); 1280c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl return RecordLocation(F, F->DeclOffsets[Index]); 1281cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl} 1282cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl 1283d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl/// \brief Read the declaration at the given offset from the AST file. 12848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) { 12850b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl RecordLocation Loc = DeclCursorForIndex(Index, ID); 1286c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 1287698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // Keep track of where we are in the stream, then jump back there 1288698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // after reading this declaration. 1289da93061f56d5820725b01a140879d047554e7d32Chris Lattner SavedStreamPosition SavedPosition(DeclsCursor); 1290698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1291919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis ReadingKindTracker ReadingKind(Read_Decl, *this); 1292919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis 1293d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor // Note that we are loading a declaration record. 129429ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis Deserializing ADecl(this); 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1296c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl DeclsCursor.JumpToBit(Loc.Offset); 1297698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner RecordData Record; 1298da93061f56d5820725b01a140879d047554e7d32Chris Lattner unsigned Code = DeclsCursor.ReadCode(); 1299698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner unsigned Idx = 0; 1300c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx); 1301698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1302da93061f56d5820725b01a140879d047554e7d32Chris Lattner Decl *D = 0; 13038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) { 13048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CONTEXT_LEXICAL: 13058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CONTEXT_VISIBLE: 1306698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(false && "Record cannot be de-serialized with ReadDeclRecord"); 1307698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TRANSLATION_UNIT: 1309698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(Index == 0 && "Translation unit must be at index 0"); 1310d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = Context->getTranslationUnitDecl(); 1311698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TYPEDEF: 1313ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1314698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ENUM: 1316b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = EnumDecl::Create(*Context, Decl::EmptyShell()); 1317698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_RECORD: 1319b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = RecordDecl::Create(*Context, Decl::EmptyShell()); 1320698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ENUM_CONSTANT: 1322d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 1323698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 0, llvm::APSInt()); 1324698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FUNCTION: 13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(), 1327a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType(), 0); 1328698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 13298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_LINKAGE_SPEC: 13306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(), 13316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner (LinkageSpecDecl::LanguageIDs)0, 13326ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner false); 13336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NAMESPACE: 13356ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0); 13366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NAMESPACE_ALIAS: 13386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(), 13396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0, SourceRange(), 0, 13406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0); 13416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING: 1343ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D = UsingDecl::Create(*Context, 0, SourceRange(), SourceLocation(), 1344ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara 0, DeclarationNameInfo(), false); 13456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING_SHADOW: 13476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0); 13486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_USING_DIRECTIVE: 13506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(), 13516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), SourceRange(), 0, 13526ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), 0, 0); 13536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_UNRESOLVED_USING_VALUE: 13556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(), 1356ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara SourceRange(), 0, 1357ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo()); 13586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_UNRESOLVED_USING_TYPENAME: 13606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(), 13616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner SourceLocation(), SourceRange(), 13626ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 0, SourceLocation(), 13636ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner DeclarationName()); 13646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_RECORD: 1366b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = CXXRecordDecl::Create(*Context, Decl::EmptyShell()); 13676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_METHOD: 13692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara D = CXXMethodDecl::Create(*Context, 0, DeclarationNameInfo(), 13706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner QualType(), 0); 13716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_CONSTRUCTOR: 13736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell()); 13746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_DESTRUCTOR: 13766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell()); 13776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CXX_CONVERSION: 13796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner D = CXXConversionDecl::Create(*Context, Decl::EmptyShell()); 13806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_ACCESS_SPEC: 138265b63ec1410f09e1f3cdb847018d678b8f8fc3f7Argyrios Kyrtzidis D = AccessSpecDecl::Create(*Context, Decl::EmptyShell()); 13836206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara break; 13848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FRIEND: 13856764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis D = FriendDecl::Create(*Context, Decl::EmptyShell()); 13866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FRIEND_TEMPLATE: 1388554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell()); 13896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE: 13915bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(), 13925bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis DeclarationName(), 0, 0, 0); 13936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE_SPECIALIZATION: 1395b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell()); 13966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 13978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION: 1398b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = ClassTemplatePartialSpecializationDecl::Create(*Context, 1399b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis Decl::EmptyShell()); 14006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FUNCTION_TEMPLATE: 1402f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(), 1403f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis DeclarationName(), 0, 0); 14046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TEMPLATE_TYPE_PARM: 1406b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell()); 14076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_NON_TYPE_TEMPLATE_PARM: 1409b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0, 1410b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis QualType(),0); 14116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_TEMPLATE_TEMPLATE_PARM: 1413bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0); 14146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_STATIC_ASSERT: 14160d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0); 14176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner break; 14186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner 14198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_METHOD: 14201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(), 14214bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor Selector(), QualType(), 0, 0); 1422698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_INTERFACE: 1424deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0); 1425698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_IVAR: 1427a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ObjCIvarDecl::None); 1429698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROTOCOL: 1431d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0); 1432698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_AT_DEFS_FIELD: 14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0, 1435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner QualType(), 0); 1436698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CLASS: 1438d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCClassDecl::Create(*Context, 0, SourceLocation()); 1439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_FORWARD_PROTOCOL: 1441d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation()); 1442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CATEGORY: 14443db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(), 14453db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor SourceLocation(), SourceLocation(), 0); 1446698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_CATEGORY_IMPL: 1448d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1449698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_IMPLEMENTATION: 1451d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_COMPATIBLE_ALIAS: 1454d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1455698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROPERTY: 1457d0502407c1b41b2ace326f355d7b7a6876246223Fariborz Jahanian D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(), 145883a230c83a54190366138c1a4f4310ef838b88fcJohn McCall 0); 1459698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_OBJC_PROPERTY_IMPL: 1461d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(), 14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation(), 0, 1463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner ObjCPropertyImplDecl::Dynamic, 0); 1464698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FIELD: 14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0, 1467a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis false); 1468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_VAR: 1470a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1471d931b086984257de68868a64a235c2b4b34003fbJohn McCall SC_None, SC_None); 1472698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1473698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 14748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_IMPLICIT_PARAM: 1475d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType()); 1476698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1477698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 14788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_PARM_VAR: 14791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 1480d931b086984257de68868a64a235c2b4b34003fbJohn McCall SC_None, SC_None, 0); 1481698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_FILE_SCOPE_ASM: 1483d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0); 1484698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 14858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case DECL_BLOCK: 1486d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner D = BlockDecl::Create(*Context, 0, SourceLocation()); 1487698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner break; 1488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 1489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1490d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl assert(D && "Unknown declaration reading AST file"); 14914e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner LoadedDecl(Index, D); 14924e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner Reader.Visit(D); 1493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // If this declaration is also a declaration context, get the 1495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // offsets for its tables of lexical and visible declarations. 1496698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (DeclContext *DC = dyn_cast<DeclContext>(D)) { 1497698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC); 1498698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner if (Offsets.first || Offsets.second) { 1499698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DC->setHasExternalLexicalStorage(Offsets.first != 0); 1500698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner DC->setHasExternalVisibleStorage(Offsets.second != 0); 1501681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl DeclContextInfo Info; 1502681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (ReadDeclContextStorage(DeclsCursor, Offsets, Info)) 1503681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return 0; 1504d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl DeclContextInfos &Infos = DeclContextOffsets[DC]; 1505e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // Reading the TU will happen after reading its lexical update blocks, 1506e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // so we need to make sure we insert in front. For all other contexts, 1507e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // the vector is empty here anyway, so there's no loss in efficiency. 1508d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl Infos.insert(Infos.begin(), Info); 1509e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl 1510e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // Now add the pending visible updates for this decl context, if it has 1511e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl // any. 1512e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl DeclContextVisibleUpdatesPending::iterator I = 1513e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl PendingVisibleUpdates.find(ID); 1514e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl if (I != PendingVisibleUpdates.end()) { 1515e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl DeclContextVisibleUpdates &U = I->second; 1516e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.LexicalDecls = 0; 1517e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.NumLexicalDecls = 0; 1518e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); 1519e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl UI != UE; ++UI) { 1520e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Info.NameLookupTableData = *UI; 1521e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl Infos.push_back(Info); 1522e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl } 1523e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl PendingVisibleUpdates.erase(I); 1524e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl } 1525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 1526698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner } 15276e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl 15286e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl // If this is a template, read additional specializations that may be in a 15296e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl // different part of the chain. 15306e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl if (isa<RedeclarableTemplateDecl>(D)) { 15316e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsMap::iterator F = 15326e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsPending.find(ID); 15336e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl if (F != AdditionalTemplateSpecializationsPending.end()) { 15346e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl for (AdditionalTemplateSpecializations::iterator I = F->second.begin(), 15356e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl E = F->second.end(); 15366e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl I != E; ++I) 15376e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl GetDecl(*I); 15386e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl AdditionalTemplateSpecializationsPending.erase(F); 15396e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl } 15406e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl } 1541698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner assert(Idx == Record.size()); 1542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 15437b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis // The declaration may have been modified by files later in the chain. 15447b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis // If this is the case, read the record containing the updates from each file 15457b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis // and pass it to ASTDeclReader to make the modifications. 15467b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID); 15477b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis if (UpdI != DeclUpdateOffsets.end()) { 15487b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis FileOffsetsTy &UpdateOffsets = UpdI->second; 15497b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis for (FileOffsetsTy::iterator 15507b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis I = UpdateOffsets.begin(), E = UpdateOffsets.end(); I != E; ++I) { 15517b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis PerFileData *F = I->first; 15527b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis uint64_t Offset = I->second; 15537b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis llvm::BitstreamCursor &Cursor = F->DeclsCursor; 15547b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis SavedStreamPosition SavedPosition(Cursor); 15557b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis Cursor.JumpToBit(Offset); 15567b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis RecordData Record; 15577b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis unsigned Code = Cursor.ReadCode(); 15587b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis unsigned RecCode = Cursor.ReadRecord(Code, Record); 15597b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis (void)RecCode; 15607b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis assert(RecCode == DECL_UPDATES && "Expected DECL_UPDATES record!"); 15617b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis Reader.UpdateDecl(D, Record); 15627b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis } 15637b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis } 15647b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 1565698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner // If we have deserialized a declaration that has a definition the 1566bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // AST consumer might need to know about, queue it. 1567bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // We don't pass it to the consumer immediately because we may be in recursive 1568bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis // loading, and some declarations may still be initializing. 1569bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis if (isConsumerInterestedIn(D)) 1570bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis InterestingDecls.push_back(D); 1571698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner 1572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner return D; 1573698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner} 15747b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis 15757b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidisvoid ASTDeclReader::UpdateDecl(Decl *D, const RecordData &Record) { 15767b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis // No update is tracked yet. 15777b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis} 1578