1 //===--- ASTReaderDecl.cpp - Decl Deserialization ---------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the ASTReader::ReadDeclRecord method, which is the 11 // entrypoint for loading a decl. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "ASTCommon.h" 16 #include "clang/Serialization/ASTReader.h" 17 #include "clang/AST/ASTConsumer.h" 18 #include "clang/AST/ASTContext.h" 19 #include "clang/AST/DeclVisitor.h" 20 #include "clang/AST/DeclGroup.h" 21 #include "clang/AST/DeclCXX.h" 22 #include "clang/AST/DeclTemplate.h" 23 #include "clang/AST/Expr.h" 24 using namespace clang; 25 using namespace clang::serialization; 26 27 //===----------------------------------------------------------------------===// 28 // Declaration deserialization 29 //===----------------------------------------------------------------------===// 30 31 namespace clang { 32 class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> { 33 ASTReader &Reader; 34 ASTReader::PerFileData &F; 35 llvm::BitstreamCursor &Cursor; 36 const DeclID ThisDeclID; 37 typedef ASTReader::RecordData RecordData; 38 const RecordData &Record; 39 unsigned &Idx; 40 TypeID TypeIDForTypeDecl; 41 42 DeclID DeclContextIDForTemplateParmDecl; 43 DeclID LexicalDeclContextIDForTemplateParmDecl; 44 45 uint64_t GetCurrentCursorOffset(); 46 SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { 47 return Reader.ReadSourceLocation(F, R, I); 48 } 49 SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { 50 return Reader.ReadSourceRange(F, R, I); 51 } 52 TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { 53 return Reader.GetTypeSourceInfo(F, R, I); 54 } 55 void ReadQualifierInfo(QualifierInfo &Info, 56 const RecordData &R, unsigned &I) { 57 Reader.ReadQualifierInfo(F, Info, R, I); 58 } 59 void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 60 const RecordData &R, unsigned &I) { 61 Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 62 } 63 void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 64 const RecordData &R, unsigned &I) { 65 Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 66 } 67 68 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data, 69 const RecordData &R, unsigned &I); 70 71 void InitializeCXXDefinitionData(CXXRecordDecl *D, 72 CXXRecordDecl *DefinitionDecl, 73 const RecordData &Record, unsigned &Idx); 74 public: 75 ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F, 76 llvm::BitstreamCursor &Cursor, DeclID thisDeclID, 77 const RecordData &Record, unsigned &Idx) 78 : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID), 79 Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { } 80 81 static void attachPreviousDecl(Decl *D, Decl *previous); 82 83 void Visit(Decl *D); 84 85 void UpdateDecl(Decl *D, ASTReader::PerFileData &Module, 86 const RecordData &Record); 87 88 void VisitDecl(Decl *D); 89 void VisitTranslationUnitDecl(TranslationUnitDecl *TU); 90 void VisitNamedDecl(NamedDecl *ND); 91 void VisitLabelDecl(LabelDecl *LD); 92 void VisitNamespaceDecl(NamespaceDecl *D); 93 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D); 94 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D); 95 void VisitTypeDecl(TypeDecl *TD); 96 void VisitTypedefDecl(TypedefDecl *TD); 97 void VisitTypeAliasDecl(TypeAliasDecl *TD); 98 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D); 99 void VisitTagDecl(TagDecl *TD); 100 void VisitEnumDecl(EnumDecl *ED); 101 void VisitRecordDecl(RecordDecl *RD); 102 void VisitCXXRecordDecl(CXXRecordDecl *D); 103 void VisitClassTemplateSpecializationDecl( 104 ClassTemplateSpecializationDecl *D); 105 void VisitClassTemplatePartialSpecializationDecl( 106 ClassTemplatePartialSpecializationDecl *D); 107 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 108 void VisitValueDecl(ValueDecl *VD); 109 void VisitEnumConstantDecl(EnumConstantDecl *ECD); 110 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D); 111 void VisitDeclaratorDecl(DeclaratorDecl *DD); 112 void VisitFunctionDecl(FunctionDecl *FD); 113 void VisitCXXMethodDecl(CXXMethodDecl *D); 114 void VisitCXXConstructorDecl(CXXConstructorDecl *D); 115 void VisitCXXDestructorDecl(CXXDestructorDecl *D); 116 void VisitCXXConversionDecl(CXXConversionDecl *D); 117 void VisitFieldDecl(FieldDecl *FD); 118 void VisitIndirectFieldDecl(IndirectFieldDecl *FD); 119 void VisitVarDecl(VarDecl *VD); 120 void VisitImplicitParamDecl(ImplicitParamDecl *PD); 121 void VisitParmVarDecl(ParmVarDecl *PD); 122 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 123 void VisitTemplateDecl(TemplateDecl *D); 124 void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D); 125 void VisitClassTemplateDecl(ClassTemplateDecl *D); 126 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D); 127 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 128 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D); 129 void VisitUsingDecl(UsingDecl *D); 130 void VisitUsingShadowDecl(UsingShadowDecl *D); 131 void VisitLinkageSpecDecl(LinkageSpecDecl *D); 132 void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD); 133 void VisitAccessSpecDecl(AccessSpecDecl *D); 134 void VisitFriendDecl(FriendDecl *D); 135 void VisitFriendTemplateDecl(FriendTemplateDecl *D); 136 void VisitStaticAssertDecl(StaticAssertDecl *D); 137 void VisitBlockDecl(BlockDecl *BD); 138 139 std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC); 140 template <typename T> void VisitRedeclarable(Redeclarable<T> *D); 141 142 // FIXME: Reorder according to DeclNodes.td? 143 void VisitObjCMethodDecl(ObjCMethodDecl *D); 144 void VisitObjCContainerDecl(ObjCContainerDecl *D); 145 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 146 void VisitObjCIvarDecl(ObjCIvarDecl *D); 147 void VisitObjCProtocolDecl(ObjCProtocolDecl *D); 148 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D); 149 void VisitObjCClassDecl(ObjCClassDecl *D); 150 void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D); 151 void VisitObjCCategoryDecl(ObjCCategoryDecl *D); 152 void VisitObjCImplDecl(ObjCImplDecl *D); 153 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 154 void VisitObjCImplementationDecl(ObjCImplementationDecl *D); 155 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D); 156 void VisitObjCPropertyDecl(ObjCPropertyDecl *D); 157 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 158 }; 159 } 160 161 uint64_t ASTDeclReader::GetCurrentCursorOffset() { 162 uint64_t Off = 0; 163 for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) { 164 ASTReader::PerFileData &F = *Reader.Chain[N - I - 1]; 165 if (&Cursor == &F.DeclsCursor) { 166 Off += F.DeclsCursor.GetCurrentBitNo(); 167 break; 168 } 169 Off += F.SizeInBits; 170 } 171 return Off; 172 } 173 174 void ASTDeclReader::Visit(Decl *D) { 175 DeclVisitor<ASTDeclReader, void>::Visit(D); 176 177 if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 178 if (DD->DeclInfo) { 179 DeclaratorDecl::ExtInfo *Info = 180 DD->DeclInfo.get<DeclaratorDecl::ExtInfo *>(); 181 Info->TInfo = 182 GetTypeSourceInfo(Record, Idx); 183 } 184 else { 185 DD->DeclInfo = GetTypeSourceInfo(Record, Idx); 186 } 187 } 188 189 if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) { 190 // if we have a fully initialized TypeDecl, we can safely read its type now. 191 TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtrOrNull()); 192 } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 193 // FunctionDecl's body was written last after all other Stmts/Exprs. 194 if (Record[Idx++]) 195 FD->setLazyBody(GetCurrentCursorOffset()); 196 } else if (D->isTemplateParameter()) { 197 // If we have a fully initialized template parameter, we can now 198 // set its DeclContext. 199 D->setDeclContext( 200 cast_or_null<DeclContext>( 201 Reader.GetDecl(DeclContextIDForTemplateParmDecl))); 202 D->setLexicalDeclContext( 203 cast_or_null<DeclContext>( 204 Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl))); 205 } 206 } 207 208 void ASTDeclReader::VisitDecl(Decl *D) { 209 if (D->isTemplateParameter()) { 210 // We don't want to deserialize the DeclContext of a template 211 // parameter immediately, because the template parameter might be 212 // used in the formulation of its DeclContext. Use the translation 213 // unit DeclContext as a placeholder. 214 DeclContextIDForTemplateParmDecl = Record[Idx++]; 215 LexicalDeclContextIDForTemplateParmDecl = Record[Idx++]; 216 D->setDeclContext(Reader.getContext()->getTranslationUnitDecl()); 217 } else { 218 D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 219 D->setLexicalDeclContext( 220 cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]))); 221 } 222 D->setLocation(ReadSourceLocation(Record, Idx)); 223 D->setInvalidDecl(Record[Idx++]); 224 if (Record[Idx++]) { // hasAttrs 225 AttrVec Attrs; 226 Reader.ReadAttributes(F, Attrs, Record, Idx); 227 D->setAttrs(Attrs); 228 } 229 D->setImplicit(Record[Idx++]); 230 D->setUsed(Record[Idx++]); 231 D->setReferenced(Record[Idx++]); 232 D->setAccess((AccessSpecifier)Record[Idx++]); 233 D->setPCHLevel(Record[Idx++] + (F.Type <= ASTReader::PCH)); 234 } 235 236 void ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) { 237 VisitDecl(TU); 238 TU->setAnonymousNamespace( 239 cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 240 } 241 242 void ASTDeclReader::VisitNamedDecl(NamedDecl *ND) { 243 VisitDecl(ND); 244 ND->setDeclName(Reader.ReadDeclarationName(Record, Idx)); 245 } 246 247 void ASTDeclReader::VisitTypeDecl(TypeDecl *TD) { 248 VisitNamedDecl(TD); 249 TD->setLocStart(ReadSourceLocation(Record, Idx)); 250 // Delay type reading until after we have fully initialized the decl. 251 TypeIDForTypeDecl = Record[Idx++]; 252 } 253 254 void ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) { 255 VisitTypeDecl(TD); 256 TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 257 } 258 259 void ASTDeclReader::VisitTypeAliasDecl(TypeAliasDecl *TD) { 260 VisitTypeDecl(TD); 261 TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 262 } 263 264 void ASTDeclReader::VisitTagDecl(TagDecl *TD) { 265 VisitTypeDecl(TD); 266 VisitRedeclarable(TD); 267 TD->IdentifierNamespace = Record[Idx++]; 268 TD->setTagKind((TagDecl::TagKind)Record[Idx++]); 269 TD->setDefinition(Record[Idx++]); 270 TD->setEmbeddedInDeclarator(Record[Idx++]); 271 TD->setRBraceLoc(ReadSourceLocation(Record, Idx)); 272 if (Record[Idx++]) { // hasExtInfo 273 TagDecl::ExtInfo *Info = new (*Reader.getContext()) TagDecl::ExtInfo(); 274 ReadQualifierInfo(*Info, Record, Idx); 275 TD->TypedefNameDeclOrQualifier = Info; 276 } else 277 TD->setTypedefNameForAnonDecl( 278 cast_or_null<TypedefNameDecl>(Reader.GetDecl(Record[Idx++]))); 279 } 280 281 void ASTDeclReader::VisitEnumDecl(EnumDecl *ED) { 282 VisitTagDecl(ED); 283 if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx)) 284 ED->setIntegerTypeSourceInfo(TI); 285 else 286 ED->setIntegerType(Reader.GetType(Record[Idx++])); 287 ED->setPromotionType(Reader.GetType(Record[Idx++])); 288 ED->setNumPositiveBits(Record[Idx++]); 289 ED->setNumNegativeBits(Record[Idx++]); 290 ED->IsScoped = Record[Idx++]; 291 ED->IsScopedUsingClassTag = Record[Idx++]; 292 ED->IsFixed = Record[Idx++]; 293 ED->setInstantiationOfMemberEnum( 294 cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++]))); 295 } 296 297 void ASTDeclReader::VisitRecordDecl(RecordDecl *RD) { 298 VisitTagDecl(RD); 299 RD->setHasFlexibleArrayMember(Record[Idx++]); 300 RD->setAnonymousStructOrUnion(Record[Idx++]); 301 RD->setHasObjectMember(Record[Idx++]); 302 } 303 304 void ASTDeclReader::VisitValueDecl(ValueDecl *VD) { 305 VisitNamedDecl(VD); 306 VD->setType(Reader.GetType(Record[Idx++])); 307 } 308 309 void ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) { 310 VisitValueDecl(ECD); 311 if (Record[Idx++]) 312 ECD->setInitExpr(Reader.ReadExpr(F)); 313 ECD->setInitVal(Reader.ReadAPSInt(Record, Idx)); 314 } 315 316 void ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) { 317 VisitValueDecl(DD); 318 DD->setInnerLocStart(ReadSourceLocation(Record, Idx)); 319 if (Record[Idx++]) { // hasExtInfo 320 DeclaratorDecl::ExtInfo *Info 321 = new (*Reader.getContext()) DeclaratorDecl::ExtInfo(); 322 ReadQualifierInfo(*Info, Record, Idx); 323 DD->DeclInfo = Info; 324 } 325 } 326 327 void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { 328 VisitDeclaratorDecl(FD); 329 VisitRedeclarable(FD); 330 331 ReadDeclarationNameLoc(FD->DNLoc, FD->getDeclName(), Record, Idx); 332 FD->IdentifierNamespace = Record[Idx++]; 333 switch ((FunctionDecl::TemplatedKind)Record[Idx++]) { 334 default: assert(false && "Unhandled TemplatedKind!"); 335 break; 336 case FunctionDecl::TK_NonTemplate: 337 break; 338 case FunctionDecl::TK_FunctionTemplate: 339 FD->setDescribedFunctionTemplate( 340 cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]))); 341 break; 342 case FunctionDecl::TK_MemberSpecialization: { 343 FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 344 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 345 SourceLocation POI = ReadSourceLocation(Record, Idx); 346 FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK); 347 FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI); 348 break; 349 } 350 case FunctionDecl::TK_FunctionTemplateSpecialization: { 351 FunctionTemplateDecl *Template 352 = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 353 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 354 355 // Template arguments. 356 llvm::SmallVector<TemplateArgument, 8> TemplArgs; 357 Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 358 359 // Template args as written. 360 llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs; 361 SourceLocation LAngleLoc, RAngleLoc; 362 if (Record[Idx++]) { // TemplateArgumentsAsWritten != 0 363 unsigned NumTemplateArgLocs = Record[Idx++]; 364 TemplArgLocs.reserve(NumTemplateArgLocs); 365 for (unsigned i=0; i != NumTemplateArgLocs; ++i) 366 TemplArgLocs.push_back( 367 Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 368 369 LAngleLoc = ReadSourceLocation(Record, Idx); 370 RAngleLoc = ReadSourceLocation(Record, Idx); 371 } 372 373 SourceLocation POI = ReadSourceLocation(Record, Idx); 374 375 ASTContext &C = *Reader.getContext(); 376 TemplateArgumentList *TemplArgList 377 = TemplateArgumentList::CreateCopy(C, TemplArgs.data(), TemplArgs.size()); 378 TemplateArgumentListInfo *TemplArgsInfo 379 = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc); 380 for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i) 381 TemplArgsInfo->addArgument(TemplArgLocs[i]); 382 FunctionTemplateSpecializationInfo *FTInfo 383 = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK, 384 TemplArgList, 385 TemplArgsInfo, POI); 386 FD->TemplateOrSpecialization = FTInfo; 387 388 if (FD->isCanonicalDecl()) { // if canonical add to template's set. 389 // The template that contains the specializations set. It's not safe to 390 // use getCanonicalDecl on Template since it may still be initializing. 391 FunctionTemplateDecl *CanonTemplate 392 = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])); 393 // Get the InsertPos by FindNodeOrInsertPos() instead of calling 394 // InsertNode(FTInfo) directly to avoid the getASTContext() call in 395 // FunctionTemplateSpecializationInfo's Profile(). 396 // We avoid getASTContext because a decl in the parent hierarchy may 397 // be initializing. 398 llvm::FoldingSetNodeID ID; 399 FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(), 400 TemplArgs.size(), C); 401 void *InsertPos = 0; 402 CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); 403 assert(InsertPos && "Another specialization already inserted!"); 404 CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos); 405 } 406 break; 407 } 408 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { 409 // Templates. 410 UnresolvedSet<8> TemplDecls; 411 unsigned NumTemplates = Record[Idx++]; 412 while (NumTemplates--) 413 TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 414 415 // Templates args. 416 TemplateArgumentListInfo TemplArgs; 417 unsigned NumArgs = Record[Idx++]; 418 while (NumArgs--) 419 TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 420 TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx)); 421 TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx)); 422 423 FD->setDependentTemplateSpecialization(*Reader.getContext(), 424 TemplDecls, TemplArgs); 425 break; 426 } 427 } 428 429 // FunctionDecl's body is handled last at ASTDeclReader::Visit, 430 // after everything else is read. 431 432 FD->SClass = (StorageClass)Record[Idx++]; 433 FD->SClassAsWritten = (StorageClass)Record[Idx++]; 434 FD->IsInline = Record[Idx++]; 435 FD->IsInlineSpecified = Record[Idx++]; 436 FD->IsVirtualAsWritten = Record[Idx++]; 437 FD->IsPure = Record[Idx++]; 438 FD->HasInheritedPrototype = Record[Idx++]; 439 FD->HasWrittenPrototype = Record[Idx++]; 440 FD->IsDeleted = Record[Idx++]; 441 FD->IsTrivial = Record[Idx++]; 442 FD->IsDefaulted = Record[Idx++]; 443 FD->IsExplicitlyDefaulted = Record[Idx++]; 444 FD->HasImplicitReturnZero = Record[Idx++]; 445 FD->EndRangeLoc = ReadSourceLocation(Record, Idx); 446 447 // Read in the parameters. 448 unsigned NumParams = Record[Idx++]; 449 llvm::SmallVector<ParmVarDecl *, 16> Params; 450 Params.reserve(NumParams); 451 for (unsigned I = 0; I != NumParams; ++I) 452 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 453 FD->setParams(*Reader.getContext(), Params.data(), NumParams); 454 } 455 456 void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { 457 VisitNamedDecl(MD); 458 if (Record[Idx++]) { 459 // In practice, this won't be executed (since method definitions 460 // don't occur in header files). 461 MD->setBody(Reader.ReadStmt(F)); 462 MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 463 MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++]))); 464 } 465 MD->setInstanceMethod(Record[Idx++]); 466 MD->setVariadic(Record[Idx++]); 467 MD->setSynthesized(Record[Idx++]); 468 MD->setDefined(Record[Idx++]); 469 MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]); 470 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]); 471 MD->SetRelatedResultType(Record[Idx++]); 472 MD->setNumSelectorArgs(unsigned(Record[Idx++])); 473 MD->setResultType(Reader.GetType(Record[Idx++])); 474 MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 475 MD->setEndLoc(ReadSourceLocation(Record, Idx)); 476 unsigned NumParams = Record[Idx++]; 477 llvm::SmallVector<ParmVarDecl *, 16> Params; 478 Params.reserve(NumParams); 479 for (unsigned I = 0; I != NumParams; ++I) 480 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 481 MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams, 482 NumParams); 483 } 484 485 void ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) { 486 VisitNamedDecl(CD); 487 SourceLocation A = ReadSourceLocation(Record, Idx); 488 SourceLocation B = ReadSourceLocation(Record, Idx); 489 CD->setAtEndRange(SourceRange(A, B)); 490 } 491 492 void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { 493 VisitObjCContainerDecl(ID); 494 ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtrOrNull()); 495 ID->setSuperClass(cast_or_null<ObjCInterfaceDecl> 496 (Reader.GetDecl(Record[Idx++]))); 497 498 // Read the directly referenced protocols and their SourceLocations. 499 unsigned NumProtocols = Record[Idx++]; 500 llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols; 501 Protocols.reserve(NumProtocols); 502 for (unsigned I = 0; I != NumProtocols; ++I) 503 Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 504 llvm::SmallVector<SourceLocation, 16> ProtoLocs; 505 ProtoLocs.reserve(NumProtocols); 506 for (unsigned I = 0; I != NumProtocols; ++I) 507 ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 508 ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(), 509 *Reader.getContext()); 510 511 // Read the transitive closure of protocols referenced by this class. 512 NumProtocols = Record[Idx++]; 513 Protocols.clear(); 514 Protocols.reserve(NumProtocols); 515 for (unsigned I = 0; I != NumProtocols; ++I) 516 Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 517 ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols, 518 *Reader.getContext()); 519 520 // Read the ivars. 521 unsigned NumIvars = Record[Idx++]; 522 llvm::SmallVector<ObjCIvarDecl *, 16> IVars; 523 IVars.reserve(NumIvars); 524 for (unsigned I = 0; I != NumIvars; ++I) 525 IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 526 ID->setCategoryList( 527 cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 528 // We will rebuild this list lazily. 529 ID->setIvarList(0); 530 ID->setForwardDecl(Record[Idx++]); 531 ID->setImplicitInterfaceDecl(Record[Idx++]); 532 ID->setClassLoc(ReadSourceLocation(Record, Idx)); 533 ID->setSuperClassLoc(ReadSourceLocation(Record, Idx)); 534 ID->setLocEnd(ReadSourceLocation(Record, Idx)); 535 } 536 537 void ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) { 538 VisitFieldDecl(IVD); 539 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]); 540 // This field will be built lazily. 541 IVD->setNextIvar(0); 542 bool synth = Record[Idx++]; 543 IVD->setSynthesize(synth); 544 } 545 546 void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { 547 VisitObjCContainerDecl(PD); 548 PD->setForwardDecl(Record[Idx++]); 549 PD->setLocEnd(ReadSourceLocation(Record, Idx)); 550 unsigned NumProtoRefs = Record[Idx++]; 551 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 552 ProtoRefs.reserve(NumProtoRefs); 553 for (unsigned I = 0; I != NumProtoRefs; ++I) 554 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 555 llvm::SmallVector<SourceLocation, 16> ProtoLocs; 556 ProtoLocs.reserve(NumProtoRefs); 557 for (unsigned I = 0; I != NumProtoRefs; ++I) 558 ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 559 PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 560 *Reader.getContext()); 561 } 562 563 void ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) { 564 VisitFieldDecl(FD); 565 } 566 567 void ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) { 568 VisitDecl(CD); 569 unsigned NumClassRefs = Record[Idx++]; 570 llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs; 571 ClassRefs.reserve(NumClassRefs); 572 for (unsigned I = 0; I != NumClassRefs; ++I) 573 ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 574 llvm::SmallVector<SourceLocation, 16> SLocs; 575 SLocs.reserve(NumClassRefs); 576 for (unsigned I = 0; I != NumClassRefs; ++I) 577 SLocs.push_back(ReadSourceLocation(Record, Idx)); 578 CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(), 579 NumClassRefs); 580 } 581 582 void ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) { 583 VisitDecl(FPD); 584 unsigned NumProtoRefs = Record[Idx++]; 585 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 586 ProtoRefs.reserve(NumProtoRefs); 587 for (unsigned I = 0; I != NumProtoRefs; ++I) 588 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 589 llvm::SmallVector<SourceLocation, 16> ProtoLocs; 590 ProtoLocs.reserve(NumProtoRefs); 591 for (unsigned I = 0; I != NumProtoRefs; ++I) 592 ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 593 FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 594 *Reader.getContext()); 595 } 596 597 void ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) { 598 VisitObjCContainerDecl(CD); 599 CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 600 unsigned NumProtoRefs = Record[Idx++]; 601 llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs; 602 ProtoRefs.reserve(NumProtoRefs); 603 for (unsigned I = 0; I != NumProtoRefs; ++I) 604 ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 605 llvm::SmallVector<SourceLocation, 16> ProtoLocs; 606 ProtoLocs.reserve(NumProtoRefs); 607 for (unsigned I = 0; I != NumProtoRefs; ++I) 608 ProtoLocs.push_back(ReadSourceLocation(Record, Idx)); 609 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), 610 *Reader.getContext()); 611 CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++]))); 612 CD->setHasSynthBitfield(Record[Idx++]); 613 CD->setAtLoc(ReadSourceLocation(Record, Idx)); 614 CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx)); 615 } 616 617 void ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) { 618 VisitNamedDecl(CAD); 619 CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 620 } 621 622 void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 623 VisitNamedDecl(D); 624 D->setAtLoc(ReadSourceLocation(Record, Idx)); 625 D->setType(GetTypeSourceInfo(Record, Idx)); 626 // FIXME: stable encoding 627 D->setPropertyAttributes( 628 (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 629 D->setPropertyAttributesAsWritten( 630 (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]); 631 // FIXME: stable encoding 632 D->setPropertyImplementation( 633 (ObjCPropertyDecl::PropertyControl)Record[Idx++]); 634 D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 635 D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector()); 636 D->setGetterMethodDecl( 637 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 638 D->setSetterMethodDecl( 639 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 640 D->setPropertyIvarDecl( 641 cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 642 } 643 644 void ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) { 645 VisitObjCContainerDecl(D); 646 D->setClassInterface( 647 cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 648 } 649 650 void ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 651 VisitObjCImplDecl(D); 652 D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx)); 653 } 654 655 void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 656 VisitObjCImplDecl(D); 657 D->setSuperClass( 658 cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 659 llvm::tie(D->IvarInitializers, D->NumIvarInitializers) 660 = Reader.ReadCXXCtorInitializers(F, Record, Idx); 661 D->setHasSynthBitfield(Record[Idx++]); 662 } 663 664 665 void ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 666 VisitDecl(D); 667 D->setAtLoc(ReadSourceLocation(Record, Idx)); 668 D->setPropertyDecl( 669 cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++]))); 670 D->PropertyIvarDecl = 671 cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])); 672 D->IvarLoc = ReadSourceLocation(Record, Idx); 673 D->setGetterCXXConstructor(Reader.ReadExpr(F)); 674 D->setSetterCXXAssignment(Reader.ReadExpr(F)); 675 } 676 677 void ASTDeclReader::VisitFieldDecl(FieldDecl *FD) { 678 VisitDeclaratorDecl(FD); 679 FD->setMutable(Record[Idx++]); 680 int BitWidthOrInitializer = Record[Idx++]; 681 if (BitWidthOrInitializer == 1) 682 FD->setBitWidth(Reader.ReadExpr(F)); 683 else if (BitWidthOrInitializer == 2) 684 FD->setInClassInitializer(Reader.ReadExpr(F)); 685 if (!FD->getDeclName()) { 686 FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])); 687 if (Tmpl) 688 Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl); 689 } 690 } 691 692 void ASTDeclReader::VisitIndirectFieldDecl(IndirectFieldDecl *FD) { 693 VisitValueDecl(FD); 694 695 FD->ChainingSize = Record[Idx++]; 696 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2"); 697 FD->Chaining = new (*Reader.getContext())NamedDecl*[FD->ChainingSize]; 698 699 for (unsigned I = 0; I != FD->ChainingSize; ++I) 700 FD->Chaining[I] = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 701 } 702 703 void ASTDeclReader::VisitVarDecl(VarDecl *VD) { 704 VisitDeclaratorDecl(VD); 705 VisitRedeclarable(VD); 706 VD->VarDeclBits.SClass = (StorageClass)Record[Idx++]; 707 VD->VarDeclBits.SClassAsWritten = (StorageClass)Record[Idx++]; 708 VD->VarDeclBits.ThreadSpecified = Record[Idx++]; 709 VD->VarDeclBits.HasCXXDirectInit = Record[Idx++]; 710 VD->VarDeclBits.ExceptionVar = Record[Idx++]; 711 VD->VarDeclBits.NRVOVariable = Record[Idx++]; 712 VD->VarDeclBits.CXXForRangeDecl = Record[Idx++]; 713 VD->VarDeclBits.ARCPseudoStrong = Record[Idx++]; 714 if (Record[Idx++]) 715 VD->setInit(Reader.ReadExpr(F)); 716 717 if (Record[Idx++]) { // HasMemberSpecializationInfo. 718 VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++])); 719 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 720 SourceLocation POI = ReadSourceLocation(Record, Idx); 721 Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI); 722 } 723 } 724 725 void ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) { 726 VisitVarDecl(PD); 727 } 728 729 void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) { 730 VisitVarDecl(PD); 731 unsigned isObjCMethodParam = Record[Idx++]; 732 unsigned scopeDepth = Record[Idx++]; 733 unsigned scopeIndex = Record[Idx++]; 734 unsigned declQualifier = Record[Idx++]; 735 if (isObjCMethodParam) { 736 assert(scopeDepth == 0); 737 PD->setObjCMethodScopeInfo(scopeIndex); 738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier; 739 } else { 740 PD->setScopeInfo(scopeDepth, scopeIndex); 741 } 742 PD->ParmVarDeclBits.IsKNRPromoted = Record[Idx++]; 743 PD->ParmVarDeclBits.HasInheritedDefaultArg = Record[Idx++]; 744 if (Record[Idx++]) // hasUninstantiatedDefaultArg. 745 PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F)); 746 } 747 748 void ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) { 749 VisitDecl(AD); 750 AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F))); 751 AD->setRParenLoc(ReadSourceLocation(Record, Idx)); 752 } 753 754 void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) { 755 VisitDecl(BD); 756 BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F))); 757 BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx)); 758 unsigned NumParams = Record[Idx++]; 759 llvm::SmallVector<ParmVarDecl *, 16> Params; 760 Params.reserve(NumParams); 761 for (unsigned I = 0; I != NumParams; ++I) 762 Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 763 BD->setParams(Params.data(), NumParams); 764 765 bool capturesCXXThis = Record[Idx++]; 766 unsigned numCaptures = Record[Idx++]; 767 llvm::SmallVector<BlockDecl::Capture, 16> captures; 768 captures.reserve(numCaptures); 769 for (unsigned i = 0; i != numCaptures; ++i) { 770 VarDecl *decl = cast<VarDecl>(Reader.GetDecl(Record[Idx++])); 771 unsigned flags = Record[Idx++]; 772 bool byRef = (flags & 1); 773 bool nested = (flags & 2); 774 Expr *copyExpr = ((flags & 4) ? Reader.ReadExpr(F) : 0); 775 776 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr)); 777 } 778 BD->setCaptures(*Reader.getContext(), captures.begin(), 779 captures.end(), capturesCXXThis); 780 } 781 782 void ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 783 VisitDecl(D); 784 D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]); 785 D->setExternLoc(ReadSourceLocation(Record, Idx)); 786 D->setRBraceLoc(ReadSourceLocation(Record, Idx)); 787 } 788 789 void ASTDeclReader::VisitLabelDecl(LabelDecl *D) { 790 VisitNamedDecl(D); 791 D->setLocStart(ReadSourceLocation(Record, Idx)); 792 } 793 794 795 void ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) { 796 VisitNamedDecl(D); 797 D->IsInline = Record[Idx++]; 798 D->LocStart = ReadSourceLocation(Record, Idx); 799 D->RBraceLoc = ReadSourceLocation(Record, Idx); 800 D->NextNamespace = Record[Idx++]; 801 802 bool IsOriginal = Record[Idx++]; 803 D->OrigOrAnonNamespace.setInt(IsOriginal); 804 D->OrigOrAnonNamespace.setPointer( 805 cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++]))); 806 } 807 808 void ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 809 VisitNamedDecl(D); 810 D->NamespaceLoc = ReadSourceLocation(Record, Idx); 811 D->IdentLoc = ReadSourceLocation(Record, Idx); 812 D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 813 D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 814 } 815 816 void ASTDeclReader::VisitUsingDecl(UsingDecl *D) { 817 VisitNamedDecl(D); 818 D->setUsingLocation(ReadSourceLocation(Record, Idx)); 819 D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 820 ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 821 D->FirstUsingShadow = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])); 822 D->setTypeName(Record[Idx++]); 823 NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 824 if (Pattern) 825 Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern); 826 } 827 828 void ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) { 829 VisitNamedDecl(D); 830 D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 831 D->UsingOrNextShadow = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 832 UsingShadowDecl *Pattern 833 = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])); 834 if (Pattern) 835 Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern); 836 } 837 838 void ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 839 VisitNamedDecl(D); 840 D->UsingLoc = ReadSourceLocation(Record, Idx); 841 D->NamespaceLoc = ReadSourceLocation(Record, Idx); 842 D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 843 D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 844 D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])); 845 } 846 847 void ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 848 VisitValueDecl(D); 849 D->setUsingLoc(ReadSourceLocation(Record, Idx)); 850 D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 851 ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx); 852 } 853 854 void ASTDeclReader::VisitUnresolvedUsingTypenameDecl( 855 UnresolvedUsingTypenameDecl *D) { 856 VisitTypeDecl(D); 857 D->TypenameLocation = ReadSourceLocation(Record, Idx); 858 D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 859 } 860 861 void ASTDeclReader::ReadCXXDefinitionData( 862 struct CXXRecordDecl::DefinitionData &Data, 863 const RecordData &Record, unsigned &Idx) { 864 Data.UserDeclaredConstructor = Record[Idx++]; 865 Data.UserDeclaredCopyConstructor = Record[Idx++]; 866 Data.UserDeclaredCopyAssignment = Record[Idx++]; 867 Data.UserDeclaredDestructor = Record[Idx++]; 868 Data.Aggregate = Record[Idx++]; 869 Data.PlainOldData = Record[Idx++]; 870 Data.Empty = Record[Idx++]; 871 Data.Polymorphic = Record[Idx++]; 872 Data.Abstract = Record[Idx++]; 873 Data.IsStandardLayout = Record[Idx++]; 874 Data.HasNoNonEmptyBases = Record[Idx++]; 875 Data.HasPrivateFields = Record[Idx++]; 876 Data.HasProtectedFields = Record[Idx++]; 877 Data.HasPublicFields = Record[Idx++]; 878 Data.HasMutableFields = Record[Idx++]; 879 Data.HasTrivialDefaultConstructor = Record[Idx++]; 880 Data.HasConstExprNonCopyMoveConstructor = Record[Idx++]; 881 Data.HasTrivialCopyConstructor = Record[Idx++]; 882 Data.HasTrivialMoveConstructor = Record[Idx++]; 883 Data.HasTrivialCopyAssignment = Record[Idx++]; 884 Data.HasTrivialMoveAssignment = Record[Idx++]; 885 Data.HasTrivialDestructor = Record[Idx++]; 886 Data.HasNonLiteralTypeFieldsOrBases = Record[Idx++]; 887 Data.ComputedVisibleConversions = Record[Idx++]; 888 Data.UserProvidedDefaultConstructor = Record[Idx++]; 889 Data.DeclaredDefaultConstructor = Record[Idx++]; 890 Data.DeclaredCopyConstructor = Record[Idx++]; 891 Data.DeclaredCopyAssignment = Record[Idx++]; 892 Data.DeclaredDestructor = Record[Idx++]; 893 894 Data.NumBases = Record[Idx++]; 895 if (Data.NumBases) 896 Data.Bases = Reader.GetCXXBaseSpecifiersOffset(Record[Idx++]); 897 Data.NumVBases = Record[Idx++]; 898 if (Data.NumVBases) 899 Data.VBases = Reader.GetCXXBaseSpecifiersOffset(Record[Idx++]); 900 901 Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx); 902 Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx); 903 assert(Data.Definition && "Data.Definition should be already set!"); 904 Data.FirstFriend 905 = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++])); 906 } 907 908 void ASTDeclReader::InitializeCXXDefinitionData(CXXRecordDecl *D, 909 CXXRecordDecl *DefinitionDecl, 910 const RecordData &Record, 911 unsigned &Idx) { 912 ASTContext &C = *Reader.getContext(); 913 914 if (D == DefinitionDecl) { 915 D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D); 916 ReadCXXDefinitionData(*D->DefinitionData, Record, Idx); 917 // We read the definition info. Check if there are pending forward 918 // references that need to point to this DefinitionData pointer. 919 ASTReader::PendingForwardRefsMap::iterator 920 FindI = Reader.PendingForwardRefs.find(D); 921 if (FindI != Reader.PendingForwardRefs.end()) { 922 ASTReader::ForwardRefs &Refs = FindI->second; 923 for (ASTReader::ForwardRefs::iterator 924 I = Refs.begin(), E = Refs.end(); I != E; ++I) 925 (*I)->DefinitionData = D->DefinitionData; 926 #ifndef NDEBUG 927 // We later check whether PendingForwardRefs is empty to make sure all 928 // pending references were linked. 929 Reader.PendingForwardRefs.erase(D); 930 #endif 931 } 932 } else if (DefinitionDecl) { 933 if (DefinitionDecl->DefinitionData) { 934 D->DefinitionData = DefinitionDecl->DefinitionData; 935 } else { 936 // The definition is still initializing. 937 Reader.PendingForwardRefs[DefinitionDecl].push_back(D); 938 } 939 } 940 } 941 942 void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { 943 VisitRecordDecl(D); 944 945 CXXRecordDecl *DefinitionDecl 946 = cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 947 InitializeCXXDefinitionData(D, DefinitionDecl, Record, Idx); 948 949 ASTContext &C = *Reader.getContext(); 950 951 enum CXXRecKind { 952 CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization 953 }; 954 switch ((CXXRecKind)Record[Idx++]) { 955 default: 956 assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?"); 957 case CXXRecNotTemplate: 958 break; 959 case CXXRecTemplate: 960 D->TemplateOrInstantiation 961 = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 962 break; 963 case CXXRecMemberSpecialization: { 964 CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 965 TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++]; 966 SourceLocation POI = ReadSourceLocation(Record, Idx); 967 MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK); 968 MSI->setPointOfInstantiation(POI); 969 D->TemplateOrInstantiation = MSI; 970 break; 971 } 972 } 973 974 // Load the key function to avoid deserializing every method so we can 975 // compute it. 976 if (D->IsDefinition) { 977 CXXMethodDecl *Key 978 = cast_or_null<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 979 if (Key) 980 C.KeyFunctions[D] = Key; 981 } 982 } 983 984 void ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { 985 VisitFunctionDecl(D); 986 unsigned NumOverridenMethods = Record[Idx++]; 987 while (NumOverridenMethods--) { 988 CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++])); 989 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod, 990 // MD may be initializing. 991 Reader.getContext()->addOverriddenMethod(D, MD); 992 } 993 } 994 995 void ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 996 VisitCXXMethodDecl(D); 997 998 D->IsExplicitSpecified = Record[Idx++]; 999 D->ImplicitlyDefined = Record[Idx++]; 1000 llvm::tie(D->CtorInitializers, D->NumCtorInitializers) 1001 = Reader.ReadCXXCtorInitializers(F, Record, Idx); 1002 } 1003 1004 void ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 1005 VisitCXXMethodDecl(D); 1006 1007 D->ImplicitlyDefined = Record[Idx++]; 1008 D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 1009 } 1010 1011 void ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) { 1012 VisitCXXMethodDecl(D); 1013 D->IsExplicitSpecified = Record[Idx++]; 1014 } 1015 1016 void ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) { 1017 VisitDecl(D); 1018 D->setColonLoc(ReadSourceLocation(Record, Idx)); 1019 } 1020 1021 void ASTDeclReader::VisitFriendDecl(FriendDecl *D) { 1022 VisitDecl(D); 1023 if (Record[Idx++]) 1024 D->Friend = GetTypeSourceInfo(Record, Idx); 1025 else 1026 D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 1027 D->NextFriend = Record[Idx++]; 1028 D->UnsupportedFriend = (Record[Idx++] != 0); 1029 D->FriendLoc = ReadSourceLocation(Record, Idx); 1030 } 1031 1032 void ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) { 1033 VisitDecl(D); 1034 unsigned NumParams = Record[Idx++]; 1035 D->NumParams = NumParams; 1036 D->Params = new TemplateParameterList*[NumParams]; 1037 for (unsigned i = 0; i != NumParams; ++i) 1038 D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx); 1039 if (Record[Idx++]) // HasFriendDecl 1040 D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 1041 else 1042 D->Friend = GetTypeSourceInfo(Record, Idx); 1043 D->FriendLoc = ReadSourceLocation(Record, Idx); 1044 } 1045 1046 void ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) { 1047 VisitNamedDecl(D); 1048 1049 NamedDecl *TemplatedDecl 1050 = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 1051 TemplateParameterList* TemplateParams 1052 = Reader.ReadTemplateParameterList(F, Record, Idx); 1053 D->init(TemplatedDecl, TemplateParams); 1054 } 1055 1056 void ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { 1057 // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr() 1058 // can be used while this is still initializing. 1059 1060 assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this"); 1061 DeclID PreviousDeclID = Record[Idx++]; 1062 DeclID FirstDeclID = PreviousDeclID ? Record[Idx++] : 0; 1063 // We delay loading of the redeclaration chain to avoid deeply nested calls. 1064 // We temporarily set the first (canonical) declaration as the previous one 1065 // which is the one that matters and mark the real previous DeclID to be 1066 // loaded & attached later on. 1067 RedeclarableTemplateDecl *FirstDecl = 1068 cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(FirstDeclID)); 1069 assert((FirstDecl == 0 || FirstDecl->getKind() == D->getKind()) && 1070 "FirstDecl kind mismatch"); 1071 if (FirstDecl) { 1072 D->CommonOrPrev = FirstDecl; 1073 // Mark the real previous DeclID to be loaded & attached later on. 1074 if (PreviousDeclID != FirstDeclID) 1075 Reader.PendingPreviousDecls.push_back(std::make_pair(D, PreviousDeclID)); 1076 } else { 1077 D->CommonOrPrev = D->newCommon(*Reader.getContext()); 1078 if (RedeclarableTemplateDecl *RTD 1079 = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) { 1080 assert(RTD->getKind() == D->getKind() && 1081 "InstantiatedFromMemberTemplate kind mismatch"); 1082 D->setInstantiatedFromMemberTemplateImpl(RTD); 1083 if (Record[Idx++]) 1084 D->setMemberSpecialization(); 1085 } 1086 1087 RedeclarableTemplateDecl *LatestDecl = 1088 cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++])); 1089 1090 // This decl is a first one and the latest declaration that it points to is 1091 // in the same AST file. However, if this actually needs to point to a 1092 // redeclaration in another AST file, we need to update it by checking 1093 // the FirstLatestDeclIDs map which tracks this kind of decls. 1094 assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?"); 1095 ASTReader::FirstLatestDeclIDMap::iterator I 1096 = Reader.FirstLatestDeclIDs.find(ThisDeclID); 1097 if (I != Reader.FirstLatestDeclIDs.end()) { 1098 Decl *NewLatest = Reader.GetDecl(I->second); 1099 assert((LatestDecl->getLocation().isInvalid() || 1100 NewLatest->getLocation().isInvalid() || 1101 !Reader.SourceMgr.isBeforeInTranslationUnit( 1102 NewLatest->getLocation(), 1103 LatestDecl->getLocation())) && 1104 "The new latest is supposed to come after the previous latest"); 1105 LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest); 1106 } 1107 1108 assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch"); 1109 D->getCommonPtr()->Latest = LatestDecl; 1110 } 1111 1112 VisitTemplateDecl(D); 1113 D->IdentifierNamespace = Record[Idx++]; 1114 } 1115 1116 void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { 1117 VisitRedeclarableTemplateDecl(D); 1118 1119 if (D->getPreviousDeclaration() == 0) { 1120 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of 1121 // the specializations. 1122 llvm::SmallVector<serialization::DeclID, 2> SpecIDs; 1123 SpecIDs.push_back(0); 1124 1125 // Specializations. 1126 unsigned Size = Record[Idx++]; 1127 SpecIDs[0] += Size; 1128 SpecIDs.append(Record.begin() + Idx, Record.begin() + Idx + Size); 1129 Idx += Size; 1130 1131 // Partial specializations. 1132 Size = Record[Idx++]; 1133 SpecIDs[0] += Size; 1134 SpecIDs.append(Record.begin() + Idx, Record.begin() + Idx + Size); 1135 Idx += Size; 1136 1137 if (SpecIDs[0]) { 1138 typedef serialization::DeclID DeclID; 1139 1140 ClassTemplateDecl::Common *CommonPtr = D->getCommonPtr(); 1141 CommonPtr->LazySpecializations 1142 = new (*Reader.getContext()) DeclID [SpecIDs.size()]; 1143 memcpy(CommonPtr->LazySpecializations, SpecIDs.data(), 1144 SpecIDs.size() * sizeof(DeclID)); 1145 } 1146 1147 // InjectedClassNameType is computed. 1148 } 1149 } 1150 1151 void ASTDeclReader::VisitClassTemplateSpecializationDecl( 1152 ClassTemplateSpecializationDecl *D) { 1153 VisitCXXRecordDecl(D); 1154 1155 ASTContext &C = *Reader.getContext(); 1156 if (Decl *InstD = Reader.GetDecl(Record[Idx++])) { 1157 if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) { 1158 D->SpecializedTemplate = CTD; 1159 } else { 1160 llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1161 Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1162 TemplateArgumentList *ArgList 1163 = TemplateArgumentList::CreateCopy(C, TemplArgs.data(), 1164 TemplArgs.size()); 1165 ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS 1166 = new (C) ClassTemplateSpecializationDecl:: 1167 SpecializedPartialSpecialization(); 1168 PS->PartialSpecialization 1169 = cast<ClassTemplatePartialSpecializationDecl>(InstD); 1170 PS->TemplateArgs = ArgList; 1171 D->SpecializedTemplate = PS; 1172 } 1173 } 1174 1175 // Explicit info. 1176 if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) { 1177 ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo 1178 = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo; 1179 ExplicitInfo->TypeAsWritten = TyInfo; 1180 ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx); 1181 ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx); 1182 D->ExplicitInfo = ExplicitInfo; 1183 } 1184 1185 llvm::SmallVector<TemplateArgument, 8> TemplArgs; 1186 Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx); 1187 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs.data(), 1188 TemplArgs.size()); 1189 D->PointOfInstantiation = ReadSourceLocation(Record, Idx); 1190 D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++]; 1191 1192 if (D->isCanonicalDecl()) { // It's kept in the folding set. 1193 ClassTemplateDecl *CanonPattern 1194 = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++])); 1195 if (ClassTemplatePartialSpecializationDecl *Partial 1196 = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) { 1197 CanonPattern->getCommonPtr()->PartialSpecializations.InsertNode(Partial); 1198 } else { 1199 CanonPattern->getCommonPtr()->Specializations.InsertNode(D); 1200 } 1201 } 1202 } 1203 1204 void ASTDeclReader::VisitClassTemplatePartialSpecializationDecl( 1205 ClassTemplatePartialSpecializationDecl *D) { 1206 VisitClassTemplateSpecializationDecl(D); 1207 1208 ASTContext &C = *Reader.getContext(); 1209 D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx); 1210 1211 unsigned NumArgs = Record[Idx++]; 1212 if (NumArgs) { 1213 D->NumArgsAsWritten = NumArgs; 1214 D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs]; 1215 for (unsigned i=0; i != NumArgs; ++i) 1216 D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 1217 } 1218 1219 D->SequenceNumber = Record[Idx++]; 1220 1221 // These are read/set from/to the first declaration. 1222 if (D->getPreviousDeclaration() == 0) { 1223 D->InstantiatedFromMember.setPointer( 1224 cast_or_null<ClassTemplatePartialSpecializationDecl>( 1225 Reader.GetDecl(Record[Idx++]))); 1226 D->InstantiatedFromMember.setInt(Record[Idx++]); 1227 } 1228 } 1229 1230 void ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 1231 VisitRedeclarableTemplateDecl(D); 1232 1233 if (D->getPreviousDeclaration() == 0) { 1234 // This FunctionTemplateDecl owns a CommonPtr; read it. 1235 1236 // Read the function specialization declarations. 1237 // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled 1238 // when reading the specialized FunctionDecl. 1239 unsigned NumSpecs = Record[Idx++]; 1240 while (NumSpecs--) 1241 Reader.GetDecl(Record[Idx++]); 1242 } 1243 } 1244 1245 void ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 1246 VisitTypeDecl(D); 1247 1248 D->setDeclaredWithTypename(Record[Idx++]); 1249 1250 bool Inherited = Record[Idx++]; 1251 TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx); 1252 D->setDefaultArgument(DefArg, Inherited); 1253 } 1254 1255 void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 1256 VisitDeclaratorDecl(D); 1257 // TemplateParmPosition. 1258 D->setDepth(Record[Idx++]); 1259 D->setPosition(Record[Idx++]); 1260 if (D->isExpandedParameterPack()) { 1261 void **Data = reinterpret_cast<void **>(D + 1); 1262 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) { 1263 Data[2*I] = Reader.GetType(Record[Idx++]).getAsOpaquePtr(); 1264 Data[2*I + 1] = GetTypeSourceInfo(Record, Idx); 1265 } 1266 } else { 1267 // Rest of NonTypeTemplateParmDecl. 1268 D->ParameterPack = Record[Idx++]; 1269 if (Record[Idx++]) { 1270 Expr *DefArg = Reader.ReadExpr(F); 1271 bool Inherited = Record[Idx++]; 1272 D->setDefaultArgument(DefArg, Inherited); 1273 } 1274 } 1275 } 1276 1277 void ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 1278 VisitTemplateDecl(D); 1279 // TemplateParmPosition. 1280 D->setDepth(Record[Idx++]); 1281 D->setPosition(Record[Idx++]); 1282 // Rest of TemplateTemplateParmDecl. 1283 TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx); 1284 bool IsInherited = Record[Idx++]; 1285 D->setDefaultArgument(Arg, IsInherited); 1286 D->ParameterPack = Record[Idx++]; 1287 } 1288 1289 void ASTDeclReader::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 1290 VisitRedeclarableTemplateDecl(D); 1291 } 1292 1293 void ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) { 1294 VisitDecl(D); 1295 D->AssertExpr = Reader.ReadExpr(F); 1296 D->Message = cast<StringLiteral>(Reader.ReadExpr(F)); 1297 D->RParenLoc = ReadSourceLocation(Record, Idx); 1298 } 1299 1300 std::pair<uint64_t, uint64_t> 1301 ASTDeclReader::VisitDeclContext(DeclContext *DC) { 1302 uint64_t LexicalOffset = Record[Idx++]; 1303 uint64_t VisibleOffset = Record[Idx++]; 1304 return std::make_pair(LexicalOffset, VisibleOffset); 1305 } 1306 1307 template <typename T> 1308 void ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) { 1309 enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest }; 1310 RedeclKind Kind = (RedeclKind)Record[Idx++]; 1311 switch (Kind) { 1312 default: 1313 assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up" 1314 " reading"); 1315 case NoRedeclaration: 1316 break; 1317 case PointsToPrevious: { 1318 DeclID PreviousDeclID = Record[Idx++]; 1319 DeclID FirstDeclID = Record[Idx++]; 1320 // We delay loading of the redeclaration chain to avoid deeply nested calls. 1321 // We temporarily set the first (canonical) declaration as the previous one 1322 // which is the one that matters and mark the real previous DeclID to be 1323 // loaded & attached later on. 1324 D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink( 1325 cast_or_null<T>(Reader.GetDecl(FirstDeclID))); 1326 if (PreviousDeclID != FirstDeclID) 1327 Reader.PendingPreviousDecls.push_back(std::make_pair(static_cast<T*>(D), 1328 PreviousDeclID)); 1329 break; 1330 } 1331 case PointsToLatest: 1332 D->RedeclLink = typename Redeclarable<T>::LatestDeclLink( 1333 cast_or_null<T>(Reader.GetDecl(Record[Idx++]))); 1334 break; 1335 } 1336 1337 assert(!(Kind == PointsToPrevious && 1338 Reader.FirstLatestDeclIDs.find(ThisDeclID) != 1339 Reader.FirstLatestDeclIDs.end()) && 1340 "This decl is not first, it should not be in the map"); 1341 if (Kind == PointsToPrevious) 1342 return; 1343 1344 // This decl is a first one and the latest declaration that it points to is in 1345 // the same AST file. However, if this actually needs to point to a 1346 // redeclaration in another AST file, we need to update it by checking the 1347 // FirstLatestDeclIDs map which tracks this kind of decls. 1348 assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) && 1349 "Invalid ThisDeclID ?"); 1350 ASTReader::FirstLatestDeclIDMap::iterator I 1351 = Reader.FirstLatestDeclIDs.find(ThisDeclID); 1352 if (I != Reader.FirstLatestDeclIDs.end()) { 1353 Decl *NewLatest = Reader.GetDecl(I->second); 1354 D->RedeclLink 1355 = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest)); 1356 } 1357 } 1358 1359 //===----------------------------------------------------------------------===// 1360 // Attribute Reading 1361 //===----------------------------------------------------------------------===// 1362 1363 /// \brief Reads attributes from the current stream position. 1364 void ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs, 1365 const RecordData &Record, unsigned &Idx) { 1366 for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) { 1367 Attr *New = 0; 1368 attr::Kind Kind = (attr::Kind)Record[Idx++]; 1369 SourceLocation Loc = ReadSourceLocation(F, Record, Idx); 1370 1371 #include "clang/Serialization/AttrPCHRead.inc" 1372 1373 assert(New && "Unable to decode attribute?"); 1374 Attrs.push_back(New); 1375 } 1376 } 1377 1378 //===----------------------------------------------------------------------===// 1379 // ASTReader Implementation 1380 //===----------------------------------------------------------------------===// 1381 1382 /// \brief Note that we have loaded the declaration with the given 1383 /// Index. 1384 /// 1385 /// This routine notes that this declaration has already been loaded, 1386 /// so that future GetDecl calls will return this declaration rather 1387 /// than trying to load a new declaration. 1388 inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) { 1389 assert(!DeclsLoaded[Index] && "Decl loaded twice?"); 1390 DeclsLoaded[Index] = D; 1391 } 1392 1393 1394 /// \brief Determine whether the consumer will be interested in seeing 1395 /// this declaration (via HandleTopLevelDecl). 1396 /// 1397 /// This routine should return true for anything that might affect 1398 /// code generation, e.g., inline function definitions, Objective-C 1399 /// declarations with metadata, etc. 1400 static bool isConsumerInterestedIn(Decl *D) { 1401 if (isa<FileScopeAsmDecl>(D)) 1402 return true; 1403 if (VarDecl *Var = dyn_cast<VarDecl>(D)) 1404 return Var->isFileVarDecl() && 1405 Var->isThisDeclarationADefinition() == VarDecl::Definition; 1406 if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D)) 1407 return Func->doesThisDeclarationHaveABody(); 1408 return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D); 1409 } 1410 1411 /// \brief Get the correct cursor and offset for loading a declaration. 1412 ASTReader::RecordLocation 1413 ASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) { 1414 // See if there's an override. 1415 DeclReplacementMap::iterator It = ReplacedDecls.find(ID); 1416 if (It != ReplacedDecls.end()) 1417 return RecordLocation(It->second.first, It->second.second); 1418 1419 GlobalDeclMapType::iterator I = GlobalDeclMap.find(ID); 1420 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 1421 return RecordLocation(I->second.first, 1422 I->second.first->DeclOffsets[Index + I->second.second]); 1423 } 1424 1425 void ASTDeclReader::attachPreviousDecl(Decl *D, Decl *previous) { 1426 assert(D && previous); 1427 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 1428 TD->RedeclLink.setPointer(cast<TagDecl>(previous)); 1429 } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 1430 FD->RedeclLink.setPointer(cast<FunctionDecl>(previous)); 1431 } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 1432 VD->RedeclLink.setPointer(cast<VarDecl>(previous)); 1433 } else { 1434 RedeclarableTemplateDecl *TD = cast<RedeclarableTemplateDecl>(D); 1435 TD->CommonOrPrev = cast<RedeclarableTemplateDecl>(previous); 1436 } 1437 } 1438 1439 void ASTReader::loadAndAttachPreviousDecl(Decl *D, serialization::DeclID ID) { 1440 Decl *previous = GetDecl(ID); 1441 ASTDeclReader::attachPreviousDecl(D, previous); 1442 } 1443 1444 /// \brief Read the declaration at the given offset from the AST file. 1445 Decl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) { 1446 RecordLocation Loc = DeclCursorForIndex(Index, ID); 1447 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 1448 // Keep track of where we are in the stream, then jump back there 1449 // after reading this declaration. 1450 SavedStreamPosition SavedPosition(DeclsCursor); 1451 1452 ReadingKindTracker ReadingKind(Read_Decl, *this); 1453 1454 // Note that we are loading a declaration record. 1455 Deserializing ADecl(this); 1456 1457 DeclsCursor.JumpToBit(Loc.Offset); 1458 RecordData Record; 1459 unsigned Code = DeclsCursor.ReadCode(); 1460 unsigned Idx = 0; 1461 ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx); 1462 1463 Decl *D = 0; 1464 switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) { 1465 case DECL_CONTEXT_LEXICAL: 1466 case DECL_CONTEXT_VISIBLE: 1467 assert(false && "Record cannot be de-serialized with ReadDeclRecord"); 1468 break; 1469 case DECL_TRANSLATION_UNIT: 1470 assert(Index == 0 && "Translation unit must be at index 0"); 1471 D = Context->getTranslationUnitDecl(); 1472 break; 1473 case DECL_TYPEDEF: 1474 D = TypedefDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 1475 0, 0); 1476 break; 1477 case DECL_TYPEALIAS: 1478 D = TypeAliasDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 1479 0, 0); 1480 break; 1481 case DECL_ENUM: 1482 D = EnumDecl::Create(*Context, Decl::EmptyShell()); 1483 break; 1484 case DECL_RECORD: 1485 D = RecordDecl::Create(*Context, Decl::EmptyShell()); 1486 break; 1487 case DECL_ENUM_CONSTANT: 1488 D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 1489 0, llvm::APSInt()); 1490 break; 1491 case DECL_FUNCTION: 1492 D = FunctionDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 1493 DeclarationName(), QualType(), 0); 1494 break; 1495 case DECL_LINKAGE_SPEC: 1496 D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 1497 (LinkageSpecDecl::LanguageIDs)0, 1498 SourceLocation()); 1499 break; 1500 case DECL_LABEL: 1501 D = LabelDecl::Create(*Context, 0, SourceLocation(), 0); 1502 break; 1503 case DECL_NAMESPACE: 1504 D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 1505 SourceLocation(), 0); 1506 break; 1507 case DECL_NAMESPACE_ALIAS: 1508 D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(), 1509 SourceLocation(), 0, 1510 NestedNameSpecifierLoc(), 1511 SourceLocation(), 0); 1512 break; 1513 case DECL_USING: 1514 D = UsingDecl::Create(*Context, 0, SourceLocation(), 1515 NestedNameSpecifierLoc(), DeclarationNameInfo(), 1516 false); 1517 break; 1518 case DECL_USING_SHADOW: 1519 D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1520 break; 1521 case DECL_USING_DIRECTIVE: 1522 D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(), 1523 SourceLocation(), NestedNameSpecifierLoc(), 1524 SourceLocation(), 0, 0); 1525 break; 1526 case DECL_UNRESOLVED_USING_VALUE: 1527 D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(), 1528 NestedNameSpecifierLoc(), 1529 DeclarationNameInfo()); 1530 break; 1531 case DECL_UNRESOLVED_USING_TYPENAME: 1532 D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(), 1533 SourceLocation(), 1534 NestedNameSpecifierLoc(), 1535 SourceLocation(), 1536 DeclarationName()); 1537 break; 1538 case DECL_CXX_RECORD: 1539 D = CXXRecordDecl::Create(*Context, Decl::EmptyShell()); 1540 break; 1541 case DECL_CXX_METHOD: 1542 D = CXXMethodDecl::Create(*Context, 0, SourceLocation(), 1543 DeclarationNameInfo(), QualType(), 0, 1544 false, SC_None, false, SourceLocation()); 1545 break; 1546 case DECL_CXX_CONSTRUCTOR: 1547 D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell()); 1548 break; 1549 case DECL_CXX_DESTRUCTOR: 1550 D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell()); 1551 break; 1552 case DECL_CXX_CONVERSION: 1553 D = CXXConversionDecl::Create(*Context, Decl::EmptyShell()); 1554 break; 1555 case DECL_ACCESS_SPEC: 1556 D = AccessSpecDecl::Create(*Context, Decl::EmptyShell()); 1557 break; 1558 case DECL_FRIEND: 1559 D = FriendDecl::Create(*Context, Decl::EmptyShell()); 1560 break; 1561 case DECL_FRIEND_TEMPLATE: 1562 D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell()); 1563 break; 1564 case DECL_CLASS_TEMPLATE: 1565 D = ClassTemplateDecl::Create(*Context, Decl::EmptyShell()); 1566 break; 1567 case DECL_CLASS_TEMPLATE_SPECIALIZATION: 1568 D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell()); 1569 break; 1570 case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION: 1571 D = ClassTemplatePartialSpecializationDecl::Create(*Context, 1572 Decl::EmptyShell()); 1573 break; 1574 case DECL_FUNCTION_TEMPLATE: 1575 D = FunctionTemplateDecl::Create(*Context, Decl::EmptyShell()); 1576 break; 1577 case DECL_TEMPLATE_TYPE_PARM: 1578 D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell()); 1579 break; 1580 case DECL_NON_TYPE_TEMPLATE_PARM: 1581 D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 1582 SourceLocation(), 0, 0, 0, QualType(), 1583 false, 0); 1584 break; 1585 case DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK: 1586 D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 1587 SourceLocation(), 0, 0, 0, QualType(), 1588 0, 0, Record[Idx++], 0); 1589 break; 1590 case DECL_TEMPLATE_TEMPLATE_PARM: 1591 D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0, 0, 1592 false, 0, 0); 1593 break; 1594 case DECL_TYPE_ALIAS_TEMPLATE: 1595 D = TypeAliasTemplateDecl::Create(*Context, Decl::EmptyShell()); 1596 break; 1597 case DECL_STATIC_ASSERT: 1598 D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0, 1599 SourceLocation()); 1600 break; 1601 1602 case DECL_OBJC_METHOD: 1603 D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(), 1604 Selector(), QualType(), 0, 0); 1605 break; 1606 case DECL_OBJC_INTERFACE: 1607 D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0); 1608 break; 1609 case DECL_OBJC_IVAR: 1610 D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 1611 0, QualType(), 0, ObjCIvarDecl::None); 1612 break; 1613 case DECL_OBJC_PROTOCOL: 1614 D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0); 1615 break; 1616 case DECL_OBJC_AT_DEFS_FIELD: 1617 D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 1618 SourceLocation(), 0, QualType(), 0); 1619 break; 1620 case DECL_OBJC_CLASS: 1621 D = ObjCClassDecl::Create(*Context, 0, SourceLocation()); 1622 break; 1623 case DECL_OBJC_FORWARD_PROTOCOL: 1624 D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation()); 1625 break; 1626 case DECL_OBJC_CATEGORY: 1627 D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(), 1628 SourceLocation(), SourceLocation(), 0); 1629 break; 1630 case DECL_OBJC_CATEGORY_IMPL: 1631 D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1632 break; 1633 case DECL_OBJC_IMPLEMENTATION: 1634 D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1635 break; 1636 case DECL_OBJC_COMPATIBLE_ALIAS: 1637 D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0); 1638 break; 1639 case DECL_OBJC_PROPERTY: 1640 D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(), 1641 0); 1642 break; 1643 case DECL_OBJC_PROPERTY_IMPL: 1644 D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(), 1645 SourceLocation(), 0, 1646 ObjCPropertyImplDecl::Dynamic, 0, 1647 SourceLocation()); 1648 break; 1649 case DECL_FIELD: 1650 D = FieldDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 0, 1651 QualType(), 0, 0, false, false); 1652 break; 1653 case DECL_INDIRECTFIELD: 1654 D = IndirectFieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 1655 0, 0); 1656 break; 1657 case DECL_VAR: 1658 D = VarDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 0, 1659 QualType(), 0, SC_None, SC_None); 1660 break; 1661 1662 case DECL_IMPLICIT_PARAM: 1663 D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType()); 1664 break; 1665 1666 case DECL_PARM_VAR: 1667 D = ParmVarDecl::Create(*Context, 0, SourceLocation(), SourceLocation(), 0, 1668 QualType(), 0, SC_None, SC_None, 0); 1669 break; 1670 case DECL_FILE_SCOPE_ASM: 1671 D = FileScopeAsmDecl::Create(*Context, 0, 0, SourceLocation(), 1672 SourceLocation()); 1673 break; 1674 case DECL_BLOCK: 1675 D = BlockDecl::Create(*Context, 0, SourceLocation()); 1676 break; 1677 case DECL_CXX_BASE_SPECIFIERS: 1678 Error("attempt to read a C++ base-specifier record as a declaration"); 1679 return 0; 1680 } 1681 1682 assert(D && "Unknown declaration reading AST file"); 1683 LoadedDecl(Index, D); 1684 Reader.Visit(D); 1685 1686 // If this declaration is also a declaration context, get the 1687 // offsets for its tables of lexical and visible declarations. 1688 if (DeclContext *DC = dyn_cast<DeclContext>(D)) { 1689 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC); 1690 if (Offsets.first || Offsets.second) { 1691 DC->setHasExternalLexicalStorage(Offsets.first != 0); 1692 DC->setHasExternalVisibleStorage(Offsets.second != 0); 1693 DeclContextInfo Info; 1694 if (ReadDeclContextStorage(DeclsCursor, Offsets, Info)) 1695 return 0; 1696 DeclContextInfos &Infos = DeclContextOffsets[DC]; 1697 // Reading the TU will happen after reading its lexical update blocks, 1698 // so we need to make sure we insert in front. For all other contexts, 1699 // the vector is empty here anyway, so there's no loss in efficiency. 1700 Infos.insert(Infos.begin(), Info); 1701 } 1702 1703 // Now add the pending visible updates for this decl context, if it has any. 1704 DeclContextVisibleUpdatesPending::iterator I = 1705 PendingVisibleUpdates.find(ID); 1706 if (I != PendingVisibleUpdates.end()) { 1707 // There are updates. This means the context has external visible 1708 // storage, even if the original stored version didn't. 1709 DC->setHasExternalVisibleStorage(true); 1710 DeclContextVisibleUpdates &U = I->second; 1711 DeclContextInfos &Infos = DeclContextOffsets[DC]; 1712 DeclContextInfo Info; 1713 Info.LexicalDecls = 0; 1714 Info.NumLexicalDecls = 0; 1715 for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); 1716 UI != UE; ++UI) { 1717 Info.NameLookupTableData = *UI; 1718 Infos.push_back(Info); 1719 } 1720 PendingVisibleUpdates.erase(I); 1721 } 1722 } 1723 assert(Idx == Record.size()); 1724 1725 // The declaration may have been modified by files later in the chain. 1726 // If this is the case, read the record containing the updates from each file 1727 // and pass it to ASTDeclReader to make the modifications. 1728 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID); 1729 if (UpdI != DeclUpdateOffsets.end()) { 1730 FileOffsetsTy &UpdateOffsets = UpdI->second; 1731 for (FileOffsetsTy::iterator 1732 I = UpdateOffsets.begin(), E = UpdateOffsets.end(); I != E; ++I) { 1733 PerFileData *F = I->first; 1734 uint64_t Offset = I->second; 1735 llvm::BitstreamCursor &Cursor = F->DeclsCursor; 1736 SavedStreamPosition SavedPosition(Cursor); 1737 Cursor.JumpToBit(Offset); 1738 RecordData Record; 1739 unsigned Code = Cursor.ReadCode(); 1740 unsigned RecCode = Cursor.ReadRecord(Code, Record); 1741 (void)RecCode; 1742 assert(RecCode == DECL_UPDATES && "Expected DECL_UPDATES record!"); 1743 Reader.UpdateDecl(D, *F, Record); 1744 } 1745 } 1746 1747 // If we have deserialized a declaration that has a definition the 1748 // AST consumer might need to know about, queue it. 1749 // We don't pass it to the consumer immediately because we may be in recursive 1750 // loading, and some declarations may still be initializing. 1751 if (isConsumerInterestedIn(D)) 1752 InterestingDecls.push_back(D); 1753 1754 return D; 1755 } 1756 1757 void ASTDeclReader::UpdateDecl(Decl *D, ASTReader::PerFileData &Module, 1758 const RecordData &Record) { 1759 unsigned Idx = 0; 1760 while (Idx < Record.size()) { 1761 switch ((DeclUpdateKind)Record[Idx++]) { 1762 case UPD_CXX_SET_DEFINITIONDATA: { 1763 CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 1764 CXXRecordDecl * 1765 DefinitionDecl = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])); 1766 assert(!RD->DefinitionData && "DefinitionData is already set!"); 1767 InitializeCXXDefinitionData(RD, DefinitionDecl, Record, Idx); 1768 break; 1769 } 1770 1771 case UPD_CXX_ADDED_IMPLICIT_MEMBER: 1772 cast<CXXRecordDecl>(D)->addedMember(Reader.GetDecl(Record[Idx++])); 1773 break; 1774 1775 case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: 1776 // It will be added to the template's specializations set when loaded. 1777 Reader.GetDecl(Record[Idx++]); 1778 break; 1779 1780 case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE: { 1781 NamespaceDecl *Anon = cast<NamespaceDecl>(Reader.GetDecl(Record[Idx++])); 1782 // Guard against these being loaded out of original order. Don't use 1783 // getNextNamespace(), since it tries to access the context and can't in 1784 // the middle of deserialization. 1785 if (!Anon->NextNamespace) { 1786 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(D)) 1787 TU->setAnonymousNamespace(Anon); 1788 else 1789 cast<NamespaceDecl>(D)->OrigOrAnonNamespace.setPointer(Anon); 1790 } 1791 break; 1792 } 1793 1794 case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER: 1795 cast<VarDecl>(D)->getMemberSpecializationInfo()->setPointOfInstantiation( 1796 Reader.ReadSourceLocation(Module, Record, Idx)); 1797 break; 1798 } 1799 } 1800 } 1801