1 //===--- ASTReader.cpp - AST File Reader ----------------------------------===// 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 defines the ASTReader class, which reads AST files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Serialization/ASTReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/ASTConsumer.h" 18 #include "clang/AST/ASTContext.h" 19 #include "clang/AST/DeclTemplate.h" 20 #include "clang/AST/Expr.h" 21 #include "clang/AST/ExprCXX.h" 22 #include "clang/AST/NestedNameSpecifier.h" 23 #include "clang/AST/Type.h" 24 #include "clang/AST/TypeLocVisitor.h" 25 #include "clang/Basic/FileManager.h" 26 #include "clang/Basic/SourceManager.h" 27 #include "clang/Basic/SourceManagerInternals.h" 28 #include "clang/Basic/TargetInfo.h" 29 #include "clang/Basic/TargetOptions.h" 30 #include "clang/Basic/Version.h" 31 #include "clang/Basic/VersionTuple.h" 32 #include "clang/Lex/HeaderSearch.h" 33 #include "clang/Lex/HeaderSearchOptions.h" 34 #include "clang/Lex/MacroInfo.h" 35 #include "clang/Lex/PreprocessingRecord.h" 36 #include "clang/Lex/Preprocessor.h" 37 #include "clang/Lex/PreprocessorOptions.h" 38 #include "clang/Sema/Scope.h" 39 #include "clang/Sema/Sema.h" 40 #include "clang/Serialization/ASTDeserializationListener.h" 41 #include "clang/Serialization/GlobalModuleIndex.h" 42 #include "clang/Serialization/ModuleManager.h" 43 #include "clang/Serialization/SerializationDiagnostic.h" 44 #include "llvm/ADT/Hashing.h" 45 #include "llvm/ADT/StringExtras.h" 46 #include "llvm/Bitcode/BitstreamReader.h" 47 #include "llvm/Support/ErrorHandling.h" 48 #include "llvm/Support/FileSystem.h" 49 #include "llvm/Support/MemoryBuffer.h" 50 #include "llvm/Support/Path.h" 51 #include "llvm/Support/SaveAndRestore.h" 52 #include "llvm/Support/system_error.h" 53 #include <algorithm> 54 #include <cstdio> 55 #include <iterator> 56 57 using namespace clang; 58 using namespace clang::serialization; 59 using namespace clang::serialization::reader; 60 using llvm::BitstreamCursor; 61 62 //===----------------------------------------------------------------------===// 63 // PCH validator implementation 64 //===----------------------------------------------------------------------===// 65 66 ASTReaderListener::~ASTReaderListener() {} 67 68 /// \brief Compare the given set of language options against an existing set of 69 /// language options. 70 /// 71 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 72 /// 73 /// \returns true if the languagae options mis-match, false otherwise. 74 static bool checkLanguageOptions(const LangOptions &LangOpts, 75 const LangOptions &ExistingLangOpts, 76 DiagnosticsEngine *Diags) { 77 #define LANGOPT(Name, Bits, Default, Description) \ 78 if (ExistingLangOpts.Name != LangOpts.Name) { \ 79 if (Diags) \ 80 Diags->Report(diag::err_pch_langopt_mismatch) \ 81 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 82 return true; \ 83 } 84 85 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 86 if (ExistingLangOpts.Name != LangOpts.Name) { \ 87 if (Diags) \ 88 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 89 << Description; \ 90 return true; \ 91 } 92 93 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 94 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 95 if (Diags) \ 96 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 97 << Description; \ 98 return true; \ 99 } 100 101 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 102 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 103 #include "clang/Basic/LangOptions.def" 104 105 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 106 if (Diags) 107 Diags->Report(diag::err_pch_langopt_value_mismatch) 108 << "target Objective-C runtime"; 109 return true; 110 } 111 112 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 113 LangOpts.CommentOpts.BlockCommandNames) { 114 if (Diags) 115 Diags->Report(diag::err_pch_langopt_value_mismatch) 116 << "block command names"; 117 return true; 118 } 119 120 return false; 121 } 122 123 /// \brief Compare the given set of target options against an existing set of 124 /// target options. 125 /// 126 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 127 /// 128 /// \returns true if the target options mis-match, false otherwise. 129 static bool checkTargetOptions(const TargetOptions &TargetOpts, 130 const TargetOptions &ExistingTargetOpts, 131 DiagnosticsEngine *Diags) { 132 #define CHECK_TARGET_OPT(Field, Name) \ 133 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 134 if (Diags) \ 135 Diags->Report(diag::err_pch_targetopt_mismatch) \ 136 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 137 return true; \ 138 } 139 140 CHECK_TARGET_OPT(Triple, "target"); 141 CHECK_TARGET_OPT(CPU, "target CPU"); 142 CHECK_TARGET_OPT(ABI, "target ABI"); 143 CHECK_TARGET_OPT(CXXABI, "target C++ ABI"); 144 CHECK_TARGET_OPT(LinkerVersion, "target linker version"); 145 #undef CHECK_TARGET_OPT 146 147 // Compare feature sets. 148 SmallVector<StringRef, 4> ExistingFeatures( 149 ExistingTargetOpts.FeaturesAsWritten.begin(), 150 ExistingTargetOpts.FeaturesAsWritten.end()); 151 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 152 TargetOpts.FeaturesAsWritten.end()); 153 std::sort(ExistingFeatures.begin(), ExistingFeatures.end()); 154 std::sort(ReadFeatures.begin(), ReadFeatures.end()); 155 156 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size(); 157 unsigned ReadIdx = 0, ReadN = ReadFeatures.size(); 158 while (ExistingIdx < ExistingN && ReadIdx < ReadN) { 159 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) { 160 ++ExistingIdx; 161 ++ReadIdx; 162 continue; 163 } 164 165 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) { 166 if (Diags) 167 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 168 << false << ReadFeatures[ReadIdx]; 169 return true; 170 } 171 172 if (Diags) 173 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 174 << true << ExistingFeatures[ExistingIdx]; 175 return true; 176 } 177 178 if (ExistingIdx < ExistingN) { 179 if (Diags) 180 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 181 << true << ExistingFeatures[ExistingIdx]; 182 return true; 183 } 184 185 if (ReadIdx < ReadN) { 186 if (Diags) 187 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 188 << false << ReadFeatures[ReadIdx]; 189 return true; 190 } 191 192 return false; 193 } 194 195 bool 196 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 197 bool Complain) { 198 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 199 return checkLanguageOptions(LangOpts, ExistingLangOpts, 200 Complain? &Reader.Diags : 0); 201 } 202 203 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 204 bool Complain) { 205 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 206 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 207 Complain? &Reader.Diags : 0); 208 } 209 210 namespace { 211 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> > 212 MacroDefinitionsMap; 213 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > 214 DeclsMap; 215 } 216 217 /// \brief Collect the macro definitions provided by the given preprocessor 218 /// options. 219 static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, 220 MacroDefinitionsMap &Macros, 221 SmallVectorImpl<StringRef> *MacroNames = 0){ 222 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 223 StringRef Macro = PPOpts.Macros[I].first; 224 bool IsUndef = PPOpts.Macros[I].second; 225 226 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 227 StringRef MacroName = MacroPair.first; 228 StringRef MacroBody = MacroPair.second; 229 230 // For an #undef'd macro, we only care about the name. 231 if (IsUndef) { 232 if (MacroNames && !Macros.count(MacroName)) 233 MacroNames->push_back(MacroName); 234 235 Macros[MacroName] = std::make_pair("", true); 236 continue; 237 } 238 239 // For a #define'd macro, figure out the actual definition. 240 if (MacroName.size() == Macro.size()) 241 MacroBody = "1"; 242 else { 243 // Note: GCC drops anything following an end-of-line character. 244 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 245 MacroBody = MacroBody.substr(0, End); 246 } 247 248 if (MacroNames && !Macros.count(MacroName)) 249 MacroNames->push_back(MacroName); 250 Macros[MacroName] = std::make_pair(MacroBody, false); 251 } 252 } 253 254 /// \brief Check the preprocessor options deserialized from the control block 255 /// against the preprocessor options in an existing preprocessor. 256 /// 257 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 258 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 259 const PreprocessorOptions &ExistingPPOpts, 260 DiagnosticsEngine *Diags, 261 FileManager &FileMgr, 262 std::string &SuggestedPredefines, 263 const LangOptions &LangOpts) { 264 // Check macro definitions. 265 MacroDefinitionsMap ASTFileMacros; 266 collectMacroDefinitions(PPOpts, ASTFileMacros); 267 MacroDefinitionsMap ExistingMacros; 268 SmallVector<StringRef, 4> ExistingMacroNames; 269 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 270 271 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 272 // Dig out the macro definition in the existing preprocessor options. 273 StringRef MacroName = ExistingMacroNames[I]; 274 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 275 276 // Check whether we know anything about this macro name or not. 277 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known 278 = ASTFileMacros.find(MacroName); 279 if (Known == ASTFileMacros.end()) { 280 // FIXME: Check whether this identifier was referenced anywhere in the 281 // AST file. If so, we should reject the AST file. Unfortunately, this 282 // information isn't in the control block. What shall we do about it? 283 284 if (Existing.second) { 285 SuggestedPredefines += "#undef "; 286 SuggestedPredefines += MacroName.str(); 287 SuggestedPredefines += '\n'; 288 } else { 289 SuggestedPredefines += "#define "; 290 SuggestedPredefines += MacroName.str(); 291 SuggestedPredefines += ' '; 292 SuggestedPredefines += Existing.first.str(); 293 SuggestedPredefines += '\n'; 294 } 295 continue; 296 } 297 298 // If the macro was defined in one but undef'd in the other, we have a 299 // conflict. 300 if (Existing.second != Known->second.second) { 301 if (Diags) { 302 Diags->Report(diag::err_pch_macro_def_undef) 303 << MacroName << Known->second.second; 304 } 305 return true; 306 } 307 308 // If the macro was #undef'd in both, or if the macro bodies are identical, 309 // it's fine. 310 if (Existing.second || Existing.first == Known->second.first) 311 continue; 312 313 // The macro bodies differ; complain. 314 if (Diags) { 315 Diags->Report(diag::err_pch_macro_def_conflict) 316 << MacroName << Known->second.first << Existing.first; 317 } 318 return true; 319 } 320 321 // Check whether we're using predefines. 322 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) { 323 if (Diags) { 324 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 325 } 326 return true; 327 } 328 329 // Detailed record is important since it is used for the module cache hash. 330 if (LangOpts.Modules && 331 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) { 332 if (Diags) { 333 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 334 } 335 return true; 336 } 337 338 // Compute the #include and #include_macros lines we need. 339 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 340 StringRef File = ExistingPPOpts.Includes[I]; 341 if (File == ExistingPPOpts.ImplicitPCHInclude) 342 continue; 343 344 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 345 != PPOpts.Includes.end()) 346 continue; 347 348 SuggestedPredefines += "#include \""; 349 SuggestedPredefines += 350 HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 351 SuggestedPredefines += "\"\n"; 352 } 353 354 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 355 StringRef File = ExistingPPOpts.MacroIncludes[I]; 356 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 357 File) 358 != PPOpts.MacroIncludes.end()) 359 continue; 360 361 SuggestedPredefines += "#__include_macros \""; 362 SuggestedPredefines += 363 HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 364 SuggestedPredefines += "\"\n##\n"; 365 } 366 367 return false; 368 } 369 370 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 371 bool Complain, 372 std::string &SuggestedPredefines) { 373 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 374 375 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 376 Complain? &Reader.Diags : 0, 377 PP.getFileManager(), 378 SuggestedPredefines, 379 PP.getLangOpts()); 380 } 381 382 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 383 PP.setCounterValue(Value); 384 } 385 386 //===----------------------------------------------------------------------===// 387 // AST reader implementation 388 //===----------------------------------------------------------------------===// 389 390 void 391 ASTReader::setDeserializationListener(ASTDeserializationListener *Listener) { 392 DeserializationListener = Listener; 393 } 394 395 396 397 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 398 return serialization::ComputeHash(Sel); 399 } 400 401 402 std::pair<unsigned, unsigned> 403 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 404 using namespace clang::io; 405 unsigned KeyLen = ReadUnalignedLE16(d); 406 unsigned DataLen = ReadUnalignedLE16(d); 407 return std::make_pair(KeyLen, DataLen); 408 } 409 410 ASTSelectorLookupTrait::internal_key_type 411 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 412 using namespace clang::io; 413 SelectorTable &SelTable = Reader.getContext().Selectors; 414 unsigned N = ReadUnalignedLE16(d); 415 IdentifierInfo *FirstII 416 = Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 417 if (N == 0) 418 return SelTable.getNullarySelector(FirstII); 419 else if (N == 1) 420 return SelTable.getUnarySelector(FirstII); 421 422 SmallVector<IdentifierInfo *, 16> Args; 423 Args.push_back(FirstII); 424 for (unsigned I = 1; I != N; ++I) 425 Args.push_back(Reader.getLocalIdentifier(F, ReadUnalignedLE32(d))); 426 427 return SelTable.getSelector(N, Args.data()); 428 } 429 430 ASTSelectorLookupTrait::data_type 431 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 432 unsigned DataLen) { 433 using namespace clang::io; 434 435 data_type Result; 436 437 Result.ID = Reader.getGlobalSelectorID(F, ReadUnalignedLE32(d)); 438 unsigned NumInstanceMethodsAndBits = ReadUnalignedLE16(d); 439 unsigned NumFactoryMethodsAndBits = ReadUnalignedLE16(d); 440 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3; 441 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3; 442 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2; 443 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2; 444 445 // Load instance methods 446 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 447 if (ObjCMethodDecl *Method 448 = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d))) 449 Result.Instance.push_back(Method); 450 } 451 452 // Load factory methods 453 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 454 if (ObjCMethodDecl *Method 455 = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d))) 456 Result.Factory.push_back(Method); 457 } 458 459 return Result; 460 } 461 462 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 463 return llvm::HashString(a); 464 } 465 466 std::pair<unsigned, unsigned> 467 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 468 using namespace clang::io; 469 unsigned DataLen = ReadUnalignedLE16(d); 470 unsigned KeyLen = ReadUnalignedLE16(d); 471 return std::make_pair(KeyLen, DataLen); 472 } 473 474 ASTIdentifierLookupTraitBase::internal_key_type 475 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 476 assert(n >= 2 && d[n-1] == '\0'); 477 return StringRef((const char*) d, n-1); 478 } 479 480 /// \brief Whether the given identifier is "interesting". 481 static bool isInterestingIdentifier(IdentifierInfo &II) { 482 return II.isPoisoned() || 483 II.isExtensionToken() || 484 II.getObjCOrBuiltinID() || 485 II.hasRevertedTokenIDToIdentifier() || 486 II.hadMacroDefinition() || 487 II.getFETokenInfo<void>(); 488 } 489 490 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 491 const unsigned char* d, 492 unsigned DataLen) { 493 using namespace clang::io; 494 unsigned RawID = ReadUnalignedLE32(d); 495 bool IsInteresting = RawID & 0x01; 496 497 // Wipe out the "is interesting" bit. 498 RawID = RawID >> 1; 499 500 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 501 if (!IsInteresting) { 502 // For uninteresting identifiers, just build the IdentifierInfo 503 // and associate it with the persistent ID. 504 IdentifierInfo *II = KnownII; 505 if (!II) { 506 II = &Reader.getIdentifierTable().getOwn(k); 507 KnownII = II; 508 } 509 Reader.SetIdentifierInfo(ID, II); 510 if (!II->isFromAST()) { 511 bool WasInteresting = isInterestingIdentifier(*II); 512 II->setIsFromAST(); 513 if (WasInteresting) 514 II->setChangedSinceDeserialization(); 515 } 516 Reader.markIdentifierUpToDate(II); 517 return II; 518 } 519 520 unsigned ObjCOrBuiltinID = ReadUnalignedLE16(d); 521 unsigned Bits = ReadUnalignedLE16(d); 522 bool CPlusPlusOperatorKeyword = Bits & 0x01; 523 Bits >>= 1; 524 bool HasRevertedTokenIDToIdentifier = Bits & 0x01; 525 Bits >>= 1; 526 bool Poisoned = Bits & 0x01; 527 Bits >>= 1; 528 bool ExtensionToken = Bits & 0x01; 529 Bits >>= 1; 530 bool hasSubmoduleMacros = Bits & 0x01; 531 Bits >>= 1; 532 bool hadMacroDefinition = Bits & 0x01; 533 Bits >>= 1; 534 535 assert(Bits == 0 && "Extra bits in the identifier?"); 536 DataLen -= 8; 537 538 // Build the IdentifierInfo itself and link the identifier ID with 539 // the new IdentifierInfo. 540 IdentifierInfo *II = KnownII; 541 if (!II) { 542 II = &Reader.getIdentifierTable().getOwn(StringRef(k)); 543 KnownII = II; 544 } 545 Reader.markIdentifierUpToDate(II); 546 if (!II->isFromAST()) { 547 bool WasInteresting = isInterestingIdentifier(*II); 548 II->setIsFromAST(); 549 if (WasInteresting) 550 II->setChangedSinceDeserialization(); 551 } 552 553 // Set or check the various bits in the IdentifierInfo structure. 554 // Token IDs are read-only. 555 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 556 II->RevertTokenIDToIdentifier(); 557 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 558 assert(II->isExtensionToken() == ExtensionToken && 559 "Incorrect extension token flag"); 560 (void)ExtensionToken; 561 if (Poisoned) 562 II->setIsPoisoned(true); 563 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 564 "Incorrect C++ operator keyword flag"); 565 (void)CPlusPlusOperatorKeyword; 566 567 // If this identifier is a macro, deserialize the macro 568 // definition. 569 if (hadMacroDefinition) { 570 uint32_t MacroDirectivesOffset = ReadUnalignedLE32(d); 571 DataLen -= 4; 572 SmallVector<uint32_t, 8> LocalMacroIDs; 573 if (hasSubmoduleMacros) { 574 while (uint32_t LocalMacroID = ReadUnalignedLE32(d)) { 575 DataLen -= 4; 576 LocalMacroIDs.push_back(LocalMacroID); 577 } 578 DataLen -= 4; 579 } 580 581 if (F.Kind == MK_Module) { 582 for (SmallVectorImpl<uint32_t>::iterator 583 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; ++I) { 584 MacroID MacID = Reader.getGlobalMacroID(F, *I); 585 Reader.addPendingMacroFromModule(II, &F, MacID, F.DirectImportLoc); 586 } 587 } else { 588 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset); 589 } 590 } 591 592 Reader.SetIdentifierInfo(ID, II); 593 594 // Read all of the declarations visible at global scope with this 595 // name. 596 if (DataLen > 0) { 597 SmallVector<uint32_t, 4> DeclIDs; 598 for (; DataLen > 0; DataLen -= 4) 599 DeclIDs.push_back(Reader.getGlobalDeclID(F, ReadUnalignedLE32(d))); 600 Reader.SetGloballyVisibleDecls(II, DeclIDs); 601 } 602 603 return II; 604 } 605 606 unsigned 607 ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const { 608 llvm::FoldingSetNodeID ID; 609 ID.AddInteger(Key.Kind); 610 611 switch (Key.Kind) { 612 case DeclarationName::Identifier: 613 case DeclarationName::CXXLiteralOperatorName: 614 ID.AddString(((IdentifierInfo*)Key.Data)->getName()); 615 break; 616 case DeclarationName::ObjCZeroArgSelector: 617 case DeclarationName::ObjCOneArgSelector: 618 case DeclarationName::ObjCMultiArgSelector: 619 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data))); 620 break; 621 case DeclarationName::CXXOperatorName: 622 ID.AddInteger((OverloadedOperatorKind)Key.Data); 623 break; 624 case DeclarationName::CXXConstructorName: 625 case DeclarationName::CXXDestructorName: 626 case DeclarationName::CXXConversionFunctionName: 627 case DeclarationName::CXXUsingDirective: 628 break; 629 } 630 631 return ID.ComputeHash(); 632 } 633 634 ASTDeclContextNameLookupTrait::internal_key_type 635 ASTDeclContextNameLookupTrait::GetInternalKey( 636 const external_key_type& Name) const { 637 DeclNameKey Key; 638 Key.Kind = Name.getNameKind(); 639 switch (Name.getNameKind()) { 640 case DeclarationName::Identifier: 641 Key.Data = (uint64_t)Name.getAsIdentifierInfo(); 642 break; 643 case DeclarationName::ObjCZeroArgSelector: 644 case DeclarationName::ObjCOneArgSelector: 645 case DeclarationName::ObjCMultiArgSelector: 646 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 647 break; 648 case DeclarationName::CXXOperatorName: 649 Key.Data = Name.getCXXOverloadedOperator(); 650 break; 651 case DeclarationName::CXXLiteralOperatorName: 652 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier(); 653 break; 654 case DeclarationName::CXXConstructorName: 655 case DeclarationName::CXXDestructorName: 656 case DeclarationName::CXXConversionFunctionName: 657 case DeclarationName::CXXUsingDirective: 658 Key.Data = 0; 659 break; 660 } 661 662 return Key; 663 } 664 665 std::pair<unsigned, unsigned> 666 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 667 using namespace clang::io; 668 unsigned KeyLen = ReadUnalignedLE16(d); 669 unsigned DataLen = ReadUnalignedLE16(d); 670 return std::make_pair(KeyLen, DataLen); 671 } 672 673 ASTDeclContextNameLookupTrait::internal_key_type 674 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) { 675 using namespace clang::io; 676 677 DeclNameKey Key; 678 Key.Kind = (DeclarationName::NameKind)*d++; 679 switch (Key.Kind) { 680 case DeclarationName::Identifier: 681 Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 682 break; 683 case DeclarationName::ObjCZeroArgSelector: 684 case DeclarationName::ObjCOneArgSelector: 685 case DeclarationName::ObjCMultiArgSelector: 686 Key.Data = 687 (uint64_t)Reader.getLocalSelector(F, ReadUnalignedLE32(d)) 688 .getAsOpaquePtr(); 689 break; 690 case DeclarationName::CXXOperatorName: 691 Key.Data = *d++; // OverloadedOperatorKind 692 break; 693 case DeclarationName::CXXLiteralOperatorName: 694 Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 695 break; 696 case DeclarationName::CXXConstructorName: 697 case DeclarationName::CXXDestructorName: 698 case DeclarationName::CXXConversionFunctionName: 699 case DeclarationName::CXXUsingDirective: 700 Key.Data = 0; 701 break; 702 } 703 704 return Key; 705 } 706 707 ASTDeclContextNameLookupTrait::data_type 708 ASTDeclContextNameLookupTrait::ReadData(internal_key_type, 709 const unsigned char* d, 710 unsigned DataLen) { 711 using namespace clang::io; 712 unsigned NumDecls = ReadUnalignedLE16(d); 713 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>( 714 const_cast<unsigned char *>(d)); 715 return std::make_pair(Start, Start + NumDecls); 716 } 717 718 bool ASTReader::ReadDeclContextStorage(ModuleFile &M, 719 BitstreamCursor &Cursor, 720 const std::pair<uint64_t, uint64_t> &Offsets, 721 DeclContextInfo &Info) { 722 SavedStreamPosition SavedPosition(Cursor); 723 // First the lexical decls. 724 if (Offsets.first != 0) { 725 Cursor.JumpToBit(Offsets.first); 726 727 RecordData Record; 728 StringRef Blob; 729 unsigned Code = Cursor.ReadCode(); 730 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 731 if (RecCode != DECL_CONTEXT_LEXICAL) { 732 Error("Expected lexical block"); 733 return true; 734 } 735 736 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data()); 737 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair); 738 } 739 740 // Now the lookup table. 741 if (Offsets.second != 0) { 742 Cursor.JumpToBit(Offsets.second); 743 744 RecordData Record; 745 StringRef Blob; 746 unsigned Code = Cursor.ReadCode(); 747 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 748 if (RecCode != DECL_CONTEXT_VISIBLE) { 749 Error("Expected visible lookup table block"); 750 return true; 751 } 752 Info.NameLookupTableData 753 = ASTDeclContextNameLookupTable::Create( 754 (const unsigned char *)Blob.data() + Record[0], 755 (const unsigned char *)Blob.data(), 756 ASTDeclContextNameLookupTrait(*this, M)); 757 } 758 759 return false; 760 } 761 762 void ASTReader::Error(StringRef Msg) { 763 Error(diag::err_fe_pch_malformed, Msg); 764 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) { 765 Diag(diag::note_module_cache_path) 766 << PP.getHeaderSearchInfo().getModuleCachePath(); 767 } 768 } 769 770 void ASTReader::Error(unsigned DiagID, 771 StringRef Arg1, StringRef Arg2) { 772 if (Diags.isDiagnosticInFlight()) 773 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2); 774 else 775 Diag(DiagID) << Arg1 << Arg2; 776 } 777 778 //===----------------------------------------------------------------------===// 779 // Source Manager Deserialization 780 //===----------------------------------------------------------------------===// 781 782 /// \brief Read the line table in the source manager block. 783 /// \returns true if there was an error. 784 bool ASTReader::ParseLineTable(ModuleFile &F, 785 SmallVectorImpl<uint64_t> &Record) { 786 unsigned Idx = 0; 787 LineTableInfo &LineTable = SourceMgr.getLineTable(); 788 789 // Parse the file names 790 std::map<int, int> FileIDs; 791 for (int I = 0, N = Record[Idx++]; I != N; ++I) { 792 // Extract the file name 793 unsigned FilenameLen = Record[Idx++]; 794 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen); 795 Idx += FilenameLen; 796 MaybeAddSystemRootToFilename(F, Filename); 797 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 798 } 799 800 // Parse the line entries 801 std::vector<LineEntry> Entries; 802 while (Idx < Record.size()) { 803 int FID = Record[Idx++]; 804 assert(FID >= 0 && "Serialized line entries for non-local file."); 805 // Remap FileID from 1-based old view. 806 FID += F.SLocEntryBaseID - 1; 807 808 // Extract the line entries 809 unsigned NumEntries = Record[Idx++]; 810 assert(NumEntries && "Numentries is 00000"); 811 Entries.clear(); 812 Entries.reserve(NumEntries); 813 for (unsigned I = 0; I != NumEntries; ++I) { 814 unsigned FileOffset = Record[Idx++]; 815 unsigned LineNo = Record[Idx++]; 816 int FilenameID = FileIDs[Record[Idx++]]; 817 SrcMgr::CharacteristicKind FileKind 818 = (SrcMgr::CharacteristicKind)Record[Idx++]; 819 unsigned IncludeOffset = Record[Idx++]; 820 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 821 FileKind, IncludeOffset)); 822 } 823 LineTable.AddEntry(FileID::get(FID), Entries); 824 } 825 826 return false; 827 } 828 829 /// \brief Read a source manager block 830 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 831 using namespace SrcMgr; 832 833 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 834 835 // Set the source-location entry cursor to the current position in 836 // the stream. This cursor will be used to read the contents of the 837 // source manager block initially, and then lazily read 838 // source-location entries as needed. 839 SLocEntryCursor = F.Stream; 840 841 // The stream itself is going to skip over the source manager block. 842 if (F.Stream.SkipBlock()) { 843 Error("malformed block record in AST file"); 844 return true; 845 } 846 847 // Enter the source manager block. 848 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 849 Error("malformed source manager block record in AST file"); 850 return true; 851 } 852 853 RecordData Record; 854 while (true) { 855 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks(); 856 857 switch (E.Kind) { 858 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 859 case llvm::BitstreamEntry::Error: 860 Error("malformed block record in AST file"); 861 return true; 862 case llvm::BitstreamEntry::EndBlock: 863 return false; 864 case llvm::BitstreamEntry::Record: 865 // The interesting case. 866 break; 867 } 868 869 // Read a record. 870 Record.clear(); 871 StringRef Blob; 872 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) { 873 default: // Default behavior: ignore. 874 break; 875 876 case SM_SLOC_FILE_ENTRY: 877 case SM_SLOC_BUFFER_ENTRY: 878 case SM_SLOC_EXPANSION_ENTRY: 879 // Once we hit one of the source location entries, we're done. 880 return false; 881 } 882 } 883 } 884 885 /// \brief If a header file is not found at the path that we expect it to be 886 /// and the PCH file was moved from its original location, try to resolve the 887 /// file by assuming that header+PCH were moved together and the header is in 888 /// the same place relative to the PCH. 889 static std::string 890 resolveFileRelativeToOriginalDir(const std::string &Filename, 891 const std::string &OriginalDir, 892 const std::string &CurrDir) { 893 assert(OriginalDir != CurrDir && 894 "No point trying to resolve the file if the PCH dir didn't change"); 895 using namespace llvm::sys; 896 SmallString<128> filePath(Filename); 897 fs::make_absolute(filePath); 898 assert(path::is_absolute(OriginalDir)); 899 SmallString<128> currPCHPath(CurrDir); 900 901 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 902 fileDirE = path::end(path::parent_path(filePath)); 903 path::const_iterator origDirI = path::begin(OriginalDir), 904 origDirE = path::end(OriginalDir); 905 // Skip the common path components from filePath and OriginalDir. 906 while (fileDirI != fileDirE && origDirI != origDirE && 907 *fileDirI == *origDirI) { 908 ++fileDirI; 909 ++origDirI; 910 } 911 for (; origDirI != origDirE; ++origDirI) 912 path::append(currPCHPath, ".."); 913 path::append(currPCHPath, fileDirI, fileDirE); 914 path::append(currPCHPath, path::filename(Filename)); 915 return currPCHPath.str(); 916 } 917 918 bool ASTReader::ReadSLocEntry(int ID) { 919 if (ID == 0) 920 return false; 921 922 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 923 Error("source location entry ID out-of-range for AST file"); 924 return true; 925 } 926 927 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 928 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]); 929 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 930 unsigned BaseOffset = F->SLocEntryBaseOffset; 931 932 ++NumSLocEntriesRead; 933 llvm::BitstreamEntry Entry = SLocEntryCursor.advance(); 934 if (Entry.Kind != llvm::BitstreamEntry::Record) { 935 Error("incorrectly-formatted source location entry in AST file"); 936 return true; 937 } 938 939 RecordData Record; 940 StringRef Blob; 941 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) { 942 default: 943 Error("incorrectly-formatted source location entry in AST file"); 944 return true; 945 946 case SM_SLOC_FILE_ENTRY: { 947 // We will detect whether a file changed and return 'Failure' for it, but 948 // we will also try to fail gracefully by setting up the SLocEntry. 949 unsigned InputID = Record[4]; 950 InputFile IF = getInputFile(*F, InputID); 951 const FileEntry *File = IF.getFile(); 952 bool OverriddenBuffer = IF.isOverridden(); 953 954 // Note that we only check if a File was returned. If it was out-of-date 955 // we have complained but we will continue creating a FileID to recover 956 // gracefully. 957 if (!File) 958 return true; 959 960 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 961 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 962 // This is the module's main file. 963 IncludeLoc = getImportLocation(F); 964 } 965 SrcMgr::CharacteristicKind 966 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 967 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 968 ID, BaseOffset + Record[0]); 969 SrcMgr::FileInfo &FileInfo = 970 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 971 FileInfo.NumCreatedFIDs = Record[5]; 972 if (Record[3]) 973 FileInfo.setHasLineDirectives(); 974 975 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 976 unsigned NumFileDecls = Record[7]; 977 if (NumFileDecls) { 978 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 979 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 980 NumFileDecls)); 981 } 982 983 const SrcMgr::ContentCache *ContentCache 984 = SourceMgr.getOrCreateContentCache(File, 985 /*isSystemFile=*/FileCharacter != SrcMgr::C_User); 986 if (OverriddenBuffer && !ContentCache->BufferOverridden && 987 ContentCache->ContentsEntry == ContentCache->OrigEntry) { 988 unsigned Code = SLocEntryCursor.ReadCode(); 989 Record.clear(); 990 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob); 991 992 if (RecCode != SM_SLOC_BUFFER_BLOB) { 993 Error("AST record has invalid code"); 994 return true; 995 } 996 997 llvm::MemoryBuffer *Buffer 998 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName()); 999 SourceMgr.overrideFileContents(File, Buffer); 1000 } 1001 1002 break; 1003 } 1004 1005 case SM_SLOC_BUFFER_ENTRY: { 1006 const char *Name = Blob.data(); 1007 unsigned Offset = Record[0]; 1008 SrcMgr::CharacteristicKind 1009 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1010 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1011 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) { 1012 IncludeLoc = getImportLocation(F); 1013 } 1014 unsigned Code = SLocEntryCursor.ReadCode(); 1015 Record.clear(); 1016 unsigned RecCode 1017 = SLocEntryCursor.readRecord(Code, Record, &Blob); 1018 1019 if (RecCode != SM_SLOC_BUFFER_BLOB) { 1020 Error("AST record has invalid code"); 1021 return true; 1022 } 1023 1024 llvm::MemoryBuffer *Buffer 1025 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name); 1026 SourceMgr.createFileIDForMemBuffer(Buffer, FileCharacter, ID, 1027 BaseOffset + Offset, IncludeLoc); 1028 break; 1029 } 1030 1031 case SM_SLOC_EXPANSION_ENTRY: { 1032 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1033 SourceMgr.createExpansionLoc(SpellingLoc, 1034 ReadSourceLocation(*F, Record[2]), 1035 ReadSourceLocation(*F, Record[3]), 1036 Record[4], 1037 ID, 1038 BaseOffset + Record[0]); 1039 break; 1040 } 1041 } 1042 1043 return false; 1044 } 1045 1046 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1047 if (ID == 0) 1048 return std::make_pair(SourceLocation(), ""); 1049 1050 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1051 Error("source location entry ID out-of-range for AST file"); 1052 return std::make_pair(SourceLocation(), ""); 1053 } 1054 1055 // Find which module file this entry lands in. 1056 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1057 if (M->Kind != MK_Module) 1058 return std::make_pair(SourceLocation(), ""); 1059 1060 // FIXME: Can we map this down to a particular submodule? That would be 1061 // ideal. 1062 return std::make_pair(M->ImportLoc, llvm::sys::path::stem(M->FileName)); 1063 } 1064 1065 /// \brief Find the location where the module F is imported. 1066 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1067 if (F->ImportLoc.isValid()) 1068 return F->ImportLoc; 1069 1070 // Otherwise we have a PCH. It's considered to be "imported" at the first 1071 // location of its includer. 1072 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1073 // Main file is the importer. We assume that it is the first entry in the 1074 // entry table. We can't ask the manager, because at the time of PCH loading 1075 // the main file entry doesn't exist yet. 1076 // The very first entry is the invalid instantiation loc, which takes up 1077 // offsets 0 and 1. 1078 return SourceLocation::getFromRawEncoding(2U); 1079 } 1080 //return F->Loaders[0]->FirstLoc; 1081 return F->ImportedBy[0]->FirstLoc; 1082 } 1083 1084 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the 1085 /// specified cursor. Read the abbreviations that are at the top of the block 1086 /// and then leave the cursor pointing into the block. 1087 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 1088 if (Cursor.EnterSubBlock(BlockID)) { 1089 Error("malformed block record in AST file"); 1090 return Failure; 1091 } 1092 1093 while (true) { 1094 uint64_t Offset = Cursor.GetCurrentBitNo(); 1095 unsigned Code = Cursor.ReadCode(); 1096 1097 // We expect all abbrevs to be at the start of the block. 1098 if (Code != llvm::bitc::DEFINE_ABBREV) { 1099 Cursor.JumpToBit(Offset); 1100 return false; 1101 } 1102 Cursor.ReadAbbrevRecord(); 1103 } 1104 } 1105 1106 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1107 unsigned &Idx) { 1108 Token Tok; 1109 Tok.startToken(); 1110 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1111 Tok.setLength(Record[Idx++]); 1112 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1113 Tok.setIdentifierInfo(II); 1114 Tok.setKind((tok::TokenKind)Record[Idx++]); 1115 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1116 return Tok; 1117 } 1118 1119 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1120 BitstreamCursor &Stream = F.MacroCursor; 1121 1122 // Keep track of where we are in the stream, then jump back there 1123 // after reading this macro. 1124 SavedStreamPosition SavedPosition(Stream); 1125 1126 Stream.JumpToBit(Offset); 1127 RecordData Record; 1128 SmallVector<IdentifierInfo*, 16> MacroArgs; 1129 MacroInfo *Macro = 0; 1130 1131 while (true) { 1132 // Advance to the next record, but if we get to the end of the block, don't 1133 // pop it (removing all the abbreviations from the cursor) since we want to 1134 // be able to reseek within the block and read entries. 1135 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1136 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags); 1137 1138 switch (Entry.Kind) { 1139 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1140 case llvm::BitstreamEntry::Error: 1141 Error("malformed block record in AST file"); 1142 return Macro; 1143 case llvm::BitstreamEntry::EndBlock: 1144 return Macro; 1145 case llvm::BitstreamEntry::Record: 1146 // The interesting case. 1147 break; 1148 } 1149 1150 // Read a record. 1151 Record.clear(); 1152 PreprocessorRecordTypes RecType = 1153 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record); 1154 switch (RecType) { 1155 case PP_MACRO_DIRECTIVE_HISTORY: 1156 return Macro; 1157 1158 case PP_MACRO_OBJECT_LIKE: 1159 case PP_MACRO_FUNCTION_LIKE: { 1160 // If we already have a macro, that means that we've hit the end 1161 // of the definition of the macro we were looking for. We're 1162 // done. 1163 if (Macro) 1164 return Macro; 1165 1166 unsigned NextIndex = 1; // Skip identifier ID. 1167 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]); 1168 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1169 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID); 1170 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1171 MI->setIsUsed(Record[NextIndex++]); 1172 1173 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1174 // Decode function-like macro info. 1175 bool isC99VarArgs = Record[NextIndex++]; 1176 bool isGNUVarArgs = Record[NextIndex++]; 1177 bool hasCommaPasting = Record[NextIndex++]; 1178 MacroArgs.clear(); 1179 unsigned NumArgs = Record[NextIndex++]; 1180 for (unsigned i = 0; i != NumArgs; ++i) 1181 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1182 1183 // Install function-like macro info. 1184 MI->setIsFunctionLike(); 1185 if (isC99VarArgs) MI->setIsC99Varargs(); 1186 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1187 if (hasCommaPasting) MI->setHasCommaPasting(); 1188 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(), 1189 PP.getPreprocessorAllocator()); 1190 } 1191 1192 // Remember that we saw this macro last so that we add the tokens that 1193 // form its body to it. 1194 Macro = MI; 1195 1196 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1197 Record[NextIndex]) { 1198 // We have a macro definition. Register the association 1199 PreprocessedEntityID 1200 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1201 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1202 PreprocessingRecord::PPEntityID 1203 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true); 1204 MacroDefinition *PPDef = 1205 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID)); 1206 if (PPDef) 1207 PPRec.RegisterMacroDefinition(Macro, PPDef); 1208 } 1209 1210 ++NumMacrosRead; 1211 break; 1212 } 1213 1214 case PP_TOKEN: { 1215 // If we see a TOKEN before a PP_MACRO_*, then the file is 1216 // erroneous, just pretend we didn't see this. 1217 if (Macro == 0) break; 1218 1219 unsigned Idx = 0; 1220 Token Tok = ReadToken(F, Record, Idx); 1221 Macro->AddTokenToBody(Tok); 1222 break; 1223 } 1224 } 1225 } 1226 } 1227 1228 PreprocessedEntityID 1229 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const { 1230 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1231 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1232 assert(I != M.PreprocessedEntityRemap.end() 1233 && "Invalid index into preprocessed entity index remap"); 1234 1235 return LocalID + I->second; 1236 } 1237 1238 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1239 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1240 } 1241 1242 HeaderFileInfoTrait::internal_key_type 1243 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1244 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(), 1245 FE->getName() }; 1246 return ikey; 1247 } 1248 1249 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1250 if (a.Size != b.Size || a.ModTime != b.ModTime) 1251 return false; 1252 1253 if (strcmp(a.Filename, b.Filename) == 0) 1254 return true; 1255 1256 // Determine whether the actual files are equivalent. 1257 FileManager &FileMgr = Reader.getFileManager(); 1258 const FileEntry *FEA = FileMgr.getFile(a.Filename); 1259 const FileEntry *FEB = FileMgr.getFile(b.Filename); 1260 return (FEA && FEA == FEB); 1261 } 1262 1263 std::pair<unsigned, unsigned> 1264 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1265 unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d); 1266 unsigned DataLen = (unsigned) *d++; 1267 return std::make_pair(KeyLen, DataLen); 1268 } 1269 1270 HeaderFileInfoTrait::internal_key_type 1271 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1272 internal_key_type ikey; 1273 ikey.Size = off_t(clang::io::ReadUnalignedLE64(d)); 1274 ikey.ModTime = time_t(clang::io::ReadUnalignedLE64(d)); 1275 ikey.Filename = (const char *)d; 1276 return ikey; 1277 } 1278 1279 HeaderFileInfoTrait::data_type 1280 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1281 unsigned DataLen) { 1282 const unsigned char *End = d + DataLen; 1283 using namespace clang::io; 1284 HeaderFileInfo HFI; 1285 unsigned Flags = *d++; 1286 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole> 1287 ((Flags >> 6) & 0x03); 1288 HFI.isImport = (Flags >> 5) & 0x01; 1289 HFI.isPragmaOnce = (Flags >> 4) & 0x01; 1290 HFI.DirInfo = (Flags >> 2) & 0x03; 1291 HFI.Resolved = (Flags >> 1) & 0x01; 1292 HFI.IndexHeaderMapHeader = Flags & 0x01; 1293 HFI.NumIncludes = ReadUnalignedLE16(d); 1294 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(M, 1295 ReadUnalignedLE32(d)); 1296 if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) { 1297 // The framework offset is 1 greater than the actual offset, 1298 // since 0 is used as an indicator for "no framework name". 1299 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1300 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1301 } 1302 1303 if (d != End) { 1304 uint32_t LocalSMID = ReadUnalignedLE32(d); 1305 if (LocalSMID) { 1306 // This header is part of a module. Associate it with the module to enable 1307 // implicit module import. 1308 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1309 Module *Mod = Reader.getSubmodule(GlobalSMID); 1310 HFI.isModuleHeader = true; 1311 FileManager &FileMgr = Reader.getFileManager(); 1312 ModuleMap &ModMap = 1313 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1314 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole()); 1315 } 1316 } 1317 1318 assert(End == d && "Wrong data length in HeaderFileInfo deserialization"); 1319 (void)End; 1320 1321 // This HeaderFileInfo was externally loaded. 1322 HFI.External = true; 1323 return HFI; 1324 } 1325 1326 void ASTReader::addPendingMacroFromModule(IdentifierInfo *II, 1327 ModuleFile *M, 1328 GlobalMacroID GMacID, 1329 SourceLocation ImportLoc) { 1330 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1331 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, ImportLoc)); 1332 } 1333 1334 void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II, 1335 ModuleFile *M, 1336 uint64_t MacroDirectivesOffset) { 1337 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1338 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1339 } 1340 1341 void ASTReader::ReadDefinedMacros() { 1342 // Note that we are loading defined macros. 1343 Deserializing Macros(this); 1344 1345 for (ModuleReverseIterator I = ModuleMgr.rbegin(), 1346 E = ModuleMgr.rend(); I != E; ++I) { 1347 BitstreamCursor &MacroCursor = (*I)->MacroCursor; 1348 1349 // If there was no preprocessor block, skip this file. 1350 if (!MacroCursor.getBitStreamReader()) 1351 continue; 1352 1353 BitstreamCursor Cursor = MacroCursor; 1354 Cursor.JumpToBit((*I)->MacroStartOffset); 1355 1356 RecordData Record; 1357 while (true) { 1358 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks(); 1359 1360 switch (E.Kind) { 1361 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1362 case llvm::BitstreamEntry::Error: 1363 Error("malformed block record in AST file"); 1364 return; 1365 case llvm::BitstreamEntry::EndBlock: 1366 goto NextCursor; 1367 1368 case llvm::BitstreamEntry::Record: 1369 Record.clear(); 1370 switch (Cursor.readRecord(E.ID, Record)) { 1371 default: // Default behavior: ignore. 1372 break; 1373 1374 case PP_MACRO_OBJECT_LIKE: 1375 case PP_MACRO_FUNCTION_LIKE: 1376 getLocalIdentifier(**I, Record[0]); 1377 break; 1378 1379 case PP_TOKEN: 1380 // Ignore tokens. 1381 break; 1382 } 1383 break; 1384 } 1385 } 1386 NextCursor: ; 1387 } 1388 } 1389 1390 namespace { 1391 /// \brief Visitor class used to look up identifirs in an AST file. 1392 class IdentifierLookupVisitor { 1393 StringRef Name; 1394 unsigned PriorGeneration; 1395 unsigned &NumIdentifierLookups; 1396 unsigned &NumIdentifierLookupHits; 1397 IdentifierInfo *Found; 1398 1399 public: 1400 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 1401 unsigned &NumIdentifierLookups, 1402 unsigned &NumIdentifierLookupHits) 1403 : Name(Name), PriorGeneration(PriorGeneration), 1404 NumIdentifierLookups(NumIdentifierLookups), 1405 NumIdentifierLookupHits(NumIdentifierLookupHits), 1406 Found() 1407 { 1408 } 1409 1410 static bool visit(ModuleFile &M, void *UserData) { 1411 IdentifierLookupVisitor *This 1412 = static_cast<IdentifierLookupVisitor *>(UserData); 1413 1414 // If we've already searched this module file, skip it now. 1415 if (M.Generation <= This->PriorGeneration) 1416 return true; 1417 1418 ASTIdentifierLookupTable *IdTable 1419 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 1420 if (!IdTable) 1421 return false; 1422 1423 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), 1424 M, This->Found); 1425 ++This->NumIdentifierLookups; 1426 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait); 1427 if (Pos == IdTable->end()) 1428 return false; 1429 1430 // Dereferencing the iterator has the effect of building the 1431 // IdentifierInfo node and populating it with the various 1432 // declarations it needs. 1433 ++This->NumIdentifierLookupHits; 1434 This->Found = *Pos; 1435 return true; 1436 } 1437 1438 // \brief Retrieve the identifier info found within the module 1439 // files. 1440 IdentifierInfo *getIdentifierInfo() const { return Found; } 1441 }; 1442 } 1443 1444 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 1445 // Note that we are loading an identifier. 1446 Deserializing AnIdentifier(this); 1447 1448 unsigned PriorGeneration = 0; 1449 if (getContext().getLangOpts().Modules) 1450 PriorGeneration = IdentifierGeneration[&II]; 1451 1452 // If there is a global index, look there first to determine which modules 1453 // provably do not have any results for this identifier. 1454 GlobalModuleIndex::HitSet Hits; 1455 GlobalModuleIndex::HitSet *HitsPtr = 0; 1456 if (!loadGlobalIndex()) { 1457 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 1458 HitsPtr = &Hits; 1459 } 1460 } 1461 1462 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 1463 NumIdentifierLookups, 1464 NumIdentifierLookupHits); 1465 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 1466 markIdentifierUpToDate(&II); 1467 } 1468 1469 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 1470 if (!II) 1471 return; 1472 1473 II->setOutOfDate(false); 1474 1475 // Update the generation for this identifier. 1476 if (getContext().getLangOpts().Modules) 1477 IdentifierGeneration[II] = CurrentGeneration; 1478 } 1479 1480 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 1481 const PendingMacroInfo &PMInfo) { 1482 assert(II); 1483 1484 if (PMInfo.M->Kind != MK_Module) { 1485 installPCHMacroDirectives(II, *PMInfo.M, 1486 PMInfo.PCHMacroData.MacroDirectivesOffset); 1487 return; 1488 } 1489 1490 // Module Macro. 1491 1492 GlobalMacroID GMacID = PMInfo.ModuleMacroData.GMacID; 1493 SourceLocation ImportLoc = 1494 SourceLocation::getFromRawEncoding(PMInfo.ModuleMacroData.ImportLoc); 1495 1496 assert(GMacID); 1497 // If this macro has already been loaded, don't do so again. 1498 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS]) 1499 return; 1500 1501 MacroInfo *MI = getMacro(GMacID); 1502 SubmoduleID SubModID = MI->getOwningModuleID(); 1503 MacroDirective *MD = PP.AllocateDefMacroDirective(MI, ImportLoc, 1504 /*isImported=*/true); 1505 1506 // Determine whether this macro definition is visible. 1507 bool Hidden = false; 1508 Module *Owner = 0; 1509 if (SubModID) { 1510 if ((Owner = getSubmodule(SubModID))) { 1511 if (Owner->NameVisibility == Module::Hidden) { 1512 // The owning module is not visible, and this macro definition 1513 // should not be, either. 1514 Hidden = true; 1515 1516 // Note that this macro definition was hidden because its owning 1517 // module is not yet visible. 1518 HiddenNamesMap[Owner].push_back(HiddenName(II, MD)); 1519 } 1520 } 1521 } 1522 1523 if (!Hidden) 1524 installImportedMacro(II, MD, Owner); 1525 } 1526 1527 void ASTReader::installPCHMacroDirectives(IdentifierInfo *II, 1528 ModuleFile &M, uint64_t Offset) { 1529 assert(M.Kind != MK_Module); 1530 1531 BitstreamCursor &Cursor = M.MacroCursor; 1532 SavedStreamPosition SavedPosition(Cursor); 1533 Cursor.JumpToBit(Offset); 1534 1535 llvm::BitstreamEntry Entry = 1536 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 1537 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1538 Error("malformed block record in AST file"); 1539 return; 1540 } 1541 1542 RecordData Record; 1543 PreprocessorRecordTypes RecType = 1544 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record); 1545 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) { 1546 Error("malformed block record in AST file"); 1547 return; 1548 } 1549 1550 // Deserialize the macro directives history in reverse source-order. 1551 MacroDirective *Latest = 0, *Earliest = 0; 1552 unsigned Idx = 0, N = Record.size(); 1553 while (Idx < N) { 1554 MacroDirective *MD = 0; 1555 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 1556 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 1557 switch (K) { 1558 case MacroDirective::MD_Define: { 1559 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]); 1560 MacroInfo *MI = getMacro(GMacID); 1561 bool isImported = Record[Idx++]; 1562 bool isAmbiguous = Record[Idx++]; 1563 DefMacroDirective *DefMD = 1564 PP.AllocateDefMacroDirective(MI, Loc, isImported); 1565 DefMD->setAmbiguous(isAmbiguous); 1566 MD = DefMD; 1567 break; 1568 } 1569 case MacroDirective::MD_Undefine: 1570 MD = PP.AllocateUndefMacroDirective(Loc); 1571 break; 1572 case MacroDirective::MD_Visibility: { 1573 bool isPublic = Record[Idx++]; 1574 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 1575 break; 1576 } 1577 } 1578 1579 if (!Latest) 1580 Latest = MD; 1581 if (Earliest) 1582 Earliest->setPrevious(MD); 1583 Earliest = MD; 1584 } 1585 1586 PP.setLoadedMacroDirective(II, Latest); 1587 } 1588 1589 /// \brief For the given macro definitions, check if they are both in system 1590 /// modules. 1591 static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI, 1592 Module *NewOwner, ASTReader &Reader) { 1593 assert(PrevMI && NewMI); 1594 Module *PrevOwner = 0; 1595 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID()) 1596 PrevOwner = Reader.getSubmodule(PrevModID); 1597 SourceManager &SrcMgr = Reader.getSourceManager(); 1598 bool PrevInSystem 1599 = PrevOwner? PrevOwner->IsSystem 1600 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc()); 1601 bool NewInSystem 1602 = NewOwner? NewOwner->IsSystem 1603 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc()); 1604 if (PrevOwner && PrevOwner == NewOwner) 1605 return false; 1606 return PrevInSystem && NewInSystem; 1607 } 1608 1609 void ASTReader::installImportedMacro(IdentifierInfo *II, MacroDirective *MD, 1610 Module *Owner) { 1611 assert(II && MD); 1612 1613 DefMacroDirective *DefMD = cast<DefMacroDirective>(MD); 1614 MacroDirective *Prev = PP.getMacroDirective(II); 1615 if (Prev) { 1616 MacroDirective::DefInfo PrevDef = Prev->getDefinition(); 1617 MacroInfo *PrevMI = PrevDef.getMacroInfo(); 1618 MacroInfo *NewMI = DefMD->getInfo(); 1619 if (NewMI != PrevMI && !PrevMI->isIdenticalTo(*NewMI, PP, 1620 /*Syntactically=*/true)) { 1621 // Before marking the macros as ambiguous, check if this is a case where 1622 // both macros are in system headers. If so, we trust that the system 1623 // did not get it wrong. This also handles cases where Clang's own 1624 // headers have a different spelling of certain system macros: 1625 // #define LONG_MAX __LONG_MAX__ (clang's limits.h) 1626 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h) 1627 if (!areDefinedInSystemModules(PrevMI, NewMI, Owner, *this)) { 1628 PrevDef.getDirective()->setAmbiguous(true); 1629 DefMD->setAmbiguous(true); 1630 } 1631 } 1632 } 1633 1634 PP.appendMacroDirective(II, MD); 1635 } 1636 1637 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 1638 // If this ID is bogus, just return an empty input file. 1639 if (ID == 0 || ID > F.InputFilesLoaded.size()) 1640 return InputFile(); 1641 1642 // If we've already loaded this input file, return it. 1643 if (F.InputFilesLoaded[ID-1].getFile()) 1644 return F.InputFilesLoaded[ID-1]; 1645 1646 // Go find this input file. 1647 BitstreamCursor &Cursor = F.InputFilesCursor; 1648 SavedStreamPosition SavedPosition(Cursor); 1649 Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 1650 1651 unsigned Code = Cursor.ReadCode(); 1652 RecordData Record; 1653 StringRef Blob; 1654 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 1655 case INPUT_FILE: { 1656 unsigned StoredID = Record[0]; 1657 assert(ID == StoredID && "Bogus stored ID or offset"); 1658 (void)StoredID; 1659 off_t StoredSize = (off_t)Record[1]; 1660 time_t StoredTime = (time_t)Record[2]; 1661 bool Overridden = (bool)Record[3]; 1662 1663 // Get the file entry for this input file. 1664 StringRef OrigFilename = Blob; 1665 std::string Filename = OrigFilename; 1666 MaybeAddSystemRootToFilename(F, Filename); 1667 const FileEntry *File 1668 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime) 1669 : FileMgr.getFile(Filename, /*OpenFile=*/false); 1670 1671 // If we didn't find the file, resolve it relative to the 1672 // original directory from which this AST file was created. 1673 if (File == 0 && !F.OriginalDir.empty() && !CurrentDir.empty() && 1674 F.OriginalDir != CurrentDir) { 1675 std::string Resolved = resolveFileRelativeToOriginalDir(Filename, 1676 F.OriginalDir, 1677 CurrentDir); 1678 if (!Resolved.empty()) 1679 File = FileMgr.getFile(Resolved); 1680 } 1681 1682 // For an overridden file, create a virtual file with the stored 1683 // size/timestamp. 1684 if (Overridden && File == 0) { 1685 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 1686 } 1687 1688 if (File == 0) { 1689 if (Complain) { 1690 std::string ErrorStr = "could not find file '"; 1691 ErrorStr += Filename; 1692 ErrorStr += "' referenced by AST file"; 1693 Error(ErrorStr.c_str()); 1694 } 1695 return InputFile(); 1696 } 1697 1698 // Check if there was a request to override the contents of the file 1699 // that was part of the precompiled header. Overridding such a file 1700 // can lead to problems when lexing using the source locations from the 1701 // PCH. 1702 SourceManager &SM = getSourceManager(); 1703 if (!Overridden && SM.isFileOverridden(File)) { 1704 if (Complain) 1705 Error(diag::err_fe_pch_file_overridden, Filename); 1706 // After emitting the diagnostic, recover by disabling the override so 1707 // that the original file will be used. 1708 SM.disableFileContentsOverride(File); 1709 // The FileEntry is a virtual file entry with the size of the contents 1710 // that would override the original contents. Set it to the original's 1711 // size/time. 1712 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File), 1713 StoredSize, StoredTime); 1714 } 1715 1716 bool IsOutOfDate = false; 1717 1718 // For an overridden file, there is nothing to validate. 1719 if (!Overridden && (StoredSize != File->getSize() 1720 #if !defined(LLVM_ON_WIN32) 1721 // In our regression testing, the Windows file system seems to 1722 // have inconsistent modification times that sometimes 1723 // erroneously trigger this error-handling path. 1724 || StoredTime != File->getModificationTime() 1725 #endif 1726 )) { 1727 if (Complain) { 1728 Error(diag::err_fe_pch_file_modified, Filename, F.FileName); 1729 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) { 1730 Diag(diag::note_module_cache_path) 1731 << PP.getHeaderSearchInfo().getModuleCachePath(); 1732 } 1733 } 1734 1735 IsOutOfDate = true; 1736 } 1737 1738 InputFile IF = InputFile(File, Overridden, IsOutOfDate); 1739 1740 // Note that we've loaded this input file. 1741 F.InputFilesLoaded[ID-1] = IF; 1742 return IF; 1743 } 1744 } 1745 1746 return InputFile(); 1747 } 1748 1749 const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) { 1750 ModuleFile &M = ModuleMgr.getPrimaryModule(); 1751 std::string Filename = filenameStrRef; 1752 MaybeAddSystemRootToFilename(M, Filename); 1753 const FileEntry *File = FileMgr.getFile(Filename); 1754 if (File == 0 && !M.OriginalDir.empty() && !CurrentDir.empty() && 1755 M.OriginalDir != CurrentDir) { 1756 std::string resolved = resolveFileRelativeToOriginalDir(Filename, 1757 M.OriginalDir, 1758 CurrentDir); 1759 if (!resolved.empty()) 1760 File = FileMgr.getFile(resolved); 1761 } 1762 1763 return File; 1764 } 1765 1766 /// \brief If we are loading a relocatable PCH file, and the filename is 1767 /// not an absolute path, add the system root to the beginning of the file 1768 /// name. 1769 void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M, 1770 std::string &Filename) { 1771 // If this is not a relocatable PCH file, there's nothing to do. 1772 if (!M.RelocatablePCH) 1773 return; 1774 1775 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 1776 return; 1777 1778 if (isysroot.empty()) { 1779 // If no system root was given, default to '/' 1780 Filename.insert(Filename.begin(), '/'); 1781 return; 1782 } 1783 1784 unsigned Length = isysroot.size(); 1785 if (isysroot[Length - 1] != '/') 1786 Filename.insert(Filename.begin(), '/'); 1787 1788 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end()); 1789 } 1790 1791 ASTReader::ASTReadResult 1792 ASTReader::ReadControlBlock(ModuleFile &F, 1793 SmallVectorImpl<ImportedModule> &Loaded, 1794 unsigned ClientLoadCapabilities) { 1795 BitstreamCursor &Stream = F.Stream; 1796 1797 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 1798 Error("malformed block record in AST file"); 1799 return Failure; 1800 } 1801 1802 // Read all of the records and blocks in the control block. 1803 RecordData Record; 1804 while (1) { 1805 llvm::BitstreamEntry Entry = Stream.advance(); 1806 1807 switch (Entry.Kind) { 1808 case llvm::BitstreamEntry::Error: 1809 Error("malformed block record in AST file"); 1810 return Failure; 1811 case llvm::BitstreamEntry::EndBlock: 1812 // Validate all of the non-system input files. 1813 if (!DisableValidation) { 1814 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 1815 // All user input files reside at the index range [0, Record[1]). 1816 // Record is the one from INPUT_FILE_OFFSETS. 1817 for (unsigned I = 0, N = Record[1]; I < N; ++I) { 1818 InputFile IF = getInputFile(F, I+1, Complain); 1819 if (!IF.getFile() || IF.isOutOfDate()) 1820 return OutOfDate; 1821 } 1822 } 1823 return Success; 1824 1825 case llvm::BitstreamEntry::SubBlock: 1826 switch (Entry.ID) { 1827 case INPUT_FILES_BLOCK_ID: 1828 F.InputFilesCursor = Stream; 1829 if (Stream.SkipBlock() || // Skip with the main cursor 1830 // Read the abbreviations 1831 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 1832 Error("malformed block record in AST file"); 1833 return Failure; 1834 } 1835 continue; 1836 1837 default: 1838 if (Stream.SkipBlock()) { 1839 Error("malformed block record in AST file"); 1840 return Failure; 1841 } 1842 continue; 1843 } 1844 1845 case llvm::BitstreamEntry::Record: 1846 // The interesting case. 1847 break; 1848 } 1849 1850 // Read and process a record. 1851 Record.clear(); 1852 StringRef Blob; 1853 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 1854 case METADATA: { 1855 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 1856 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 1857 Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old 1858 : diag::warn_pch_version_too_new); 1859 return VersionMismatch; 1860 } 1861 1862 bool hasErrors = Record[5]; 1863 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 1864 Diag(diag::err_pch_with_compiler_errors); 1865 return HadErrors; 1866 } 1867 1868 F.RelocatablePCH = Record[4]; 1869 1870 const std::string &CurBranch = getClangFullRepositoryVersion(); 1871 StringRef ASTBranch = Blob; 1872 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 1873 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 1874 Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch; 1875 return VersionMismatch; 1876 } 1877 break; 1878 } 1879 1880 case IMPORTS: { 1881 // Load each of the imported PCH files. 1882 unsigned Idx = 0, N = Record.size(); 1883 while (Idx < N) { 1884 // Read information about the AST file. 1885 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 1886 // The import location will be the local one for now; we will adjust 1887 // all import locations of module imports after the global source 1888 // location info are setup. 1889 SourceLocation ImportLoc = 1890 SourceLocation::getFromRawEncoding(Record[Idx++]); 1891 off_t StoredSize = (off_t)Record[Idx++]; 1892 time_t StoredModTime = (time_t)Record[Idx++]; 1893 unsigned Length = Record[Idx++]; 1894 SmallString<128> ImportedFile(Record.begin() + Idx, 1895 Record.begin() + Idx + Length); 1896 Idx += Length; 1897 1898 // Load the AST file. 1899 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded, 1900 StoredSize, StoredModTime, 1901 ClientLoadCapabilities)) { 1902 case Failure: return Failure; 1903 // If we have to ignore the dependency, we'll have to ignore this too. 1904 case Missing: 1905 case OutOfDate: return OutOfDate; 1906 case VersionMismatch: return VersionMismatch; 1907 case ConfigurationMismatch: return ConfigurationMismatch; 1908 case HadErrors: return HadErrors; 1909 case Success: break; 1910 } 1911 } 1912 break; 1913 } 1914 1915 case LANGUAGE_OPTIONS: { 1916 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 1917 if (Listener && &F == *ModuleMgr.begin() && 1918 ParseLanguageOptions(Record, Complain, *Listener) && 1919 !DisableValidation) 1920 return ConfigurationMismatch; 1921 break; 1922 } 1923 1924 case TARGET_OPTIONS: { 1925 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 1926 if (Listener && &F == *ModuleMgr.begin() && 1927 ParseTargetOptions(Record, Complain, *Listener) && 1928 !DisableValidation) 1929 return ConfigurationMismatch; 1930 break; 1931 } 1932 1933 case DIAGNOSTIC_OPTIONS: { 1934 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 1935 if (Listener && &F == *ModuleMgr.begin() && 1936 ParseDiagnosticOptions(Record, Complain, *Listener) && 1937 !DisableValidation) 1938 return ConfigurationMismatch; 1939 break; 1940 } 1941 1942 case FILE_SYSTEM_OPTIONS: { 1943 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 1944 if (Listener && &F == *ModuleMgr.begin() && 1945 ParseFileSystemOptions(Record, Complain, *Listener) && 1946 !DisableValidation) 1947 return ConfigurationMismatch; 1948 break; 1949 } 1950 1951 case HEADER_SEARCH_OPTIONS: { 1952 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 1953 if (Listener && &F == *ModuleMgr.begin() && 1954 ParseHeaderSearchOptions(Record, Complain, *Listener) && 1955 !DisableValidation) 1956 return ConfigurationMismatch; 1957 break; 1958 } 1959 1960 case PREPROCESSOR_OPTIONS: { 1961 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 1962 if (Listener && &F == *ModuleMgr.begin() && 1963 ParsePreprocessorOptions(Record, Complain, *Listener, 1964 SuggestedPredefines) && 1965 !DisableValidation) 1966 return ConfigurationMismatch; 1967 break; 1968 } 1969 1970 case ORIGINAL_FILE: 1971 F.OriginalSourceFileID = FileID::get(Record[0]); 1972 F.ActualOriginalSourceFileName = Blob; 1973 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 1974 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName); 1975 break; 1976 1977 case ORIGINAL_FILE_ID: 1978 F.OriginalSourceFileID = FileID::get(Record[0]); 1979 break; 1980 1981 case ORIGINAL_PCH_DIR: 1982 F.OriginalDir = Blob; 1983 break; 1984 1985 case INPUT_FILE_OFFSETS: 1986 F.InputFileOffsets = (const uint32_t *)Blob.data(); 1987 F.InputFilesLoaded.resize(Record[0]); 1988 break; 1989 } 1990 } 1991 } 1992 1993 bool ASTReader::ReadASTBlock(ModuleFile &F) { 1994 BitstreamCursor &Stream = F.Stream; 1995 1996 if (Stream.EnterSubBlock(AST_BLOCK_ID)) { 1997 Error("malformed block record in AST file"); 1998 return true; 1999 } 2000 2001 // Read all of the records and blocks for the AST file. 2002 RecordData Record; 2003 while (1) { 2004 llvm::BitstreamEntry Entry = Stream.advance(); 2005 2006 switch (Entry.Kind) { 2007 case llvm::BitstreamEntry::Error: 2008 Error("error at end of module block in AST file"); 2009 return true; 2010 case llvm::BitstreamEntry::EndBlock: { 2011 // Outside of C++, we do not store a lookup map for the translation unit. 2012 // Instead, mark it as needing a lookup map to be built if this module 2013 // contains any declarations lexically within it (which it always does!). 2014 // This usually has no cost, since we very rarely need the lookup map for 2015 // the translation unit outside C++. 2016 DeclContext *DC = Context.getTranslationUnitDecl(); 2017 if (DC->hasExternalLexicalStorage() && 2018 !getContext().getLangOpts().CPlusPlus) 2019 DC->setMustBuildLookupTable(); 2020 2021 return false; 2022 } 2023 case llvm::BitstreamEntry::SubBlock: 2024 switch (Entry.ID) { 2025 case DECLTYPES_BLOCK_ID: 2026 // We lazily load the decls block, but we want to set up the 2027 // DeclsCursor cursor to point into it. Clone our current bitcode 2028 // cursor to it, enter the block and read the abbrevs in that block. 2029 // With the main cursor, we just skip over it. 2030 F.DeclsCursor = Stream; 2031 if (Stream.SkipBlock() || // Skip with the main cursor. 2032 // Read the abbrevs. 2033 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 2034 Error("malformed block record in AST file"); 2035 return true; 2036 } 2037 break; 2038 2039 case DECL_UPDATES_BLOCK_ID: 2040 if (Stream.SkipBlock()) { 2041 Error("malformed block record in AST file"); 2042 return true; 2043 } 2044 break; 2045 2046 case PREPROCESSOR_BLOCK_ID: 2047 F.MacroCursor = Stream; 2048 if (!PP.getExternalSource()) 2049 PP.setExternalSource(this); 2050 2051 if (Stream.SkipBlock() || 2052 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2053 Error("malformed block record in AST file"); 2054 return true; 2055 } 2056 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 2057 break; 2058 2059 case PREPROCESSOR_DETAIL_BLOCK_ID: 2060 F.PreprocessorDetailCursor = Stream; 2061 if (Stream.SkipBlock() || 2062 ReadBlockAbbrevs(F.PreprocessorDetailCursor, 2063 PREPROCESSOR_DETAIL_BLOCK_ID)) { 2064 Error("malformed preprocessor detail record in AST file"); 2065 return true; 2066 } 2067 F.PreprocessorDetailStartOffset 2068 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 2069 2070 if (!PP.getPreprocessingRecord()) 2071 PP.createPreprocessingRecord(); 2072 if (!PP.getPreprocessingRecord()->getExternalSource()) 2073 PP.getPreprocessingRecord()->SetExternalSource(*this); 2074 break; 2075 2076 case SOURCE_MANAGER_BLOCK_ID: 2077 if (ReadSourceManagerBlock(F)) 2078 return true; 2079 break; 2080 2081 case SUBMODULE_BLOCK_ID: 2082 if (ReadSubmoduleBlock(F)) 2083 return true; 2084 break; 2085 2086 case COMMENTS_BLOCK_ID: { 2087 BitstreamCursor C = Stream; 2088 if (Stream.SkipBlock() || 2089 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 2090 Error("malformed comments block in AST file"); 2091 return true; 2092 } 2093 CommentsCursors.push_back(std::make_pair(C, &F)); 2094 break; 2095 } 2096 2097 default: 2098 if (Stream.SkipBlock()) { 2099 Error("malformed block record in AST file"); 2100 return true; 2101 } 2102 break; 2103 } 2104 continue; 2105 2106 case llvm::BitstreamEntry::Record: 2107 // The interesting case. 2108 break; 2109 } 2110 2111 // Read and process a record. 2112 Record.clear(); 2113 StringRef Blob; 2114 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 2115 default: // Default behavior: ignore. 2116 break; 2117 2118 case TYPE_OFFSET: { 2119 if (F.LocalNumTypes != 0) { 2120 Error("duplicate TYPE_OFFSET record in AST file"); 2121 return true; 2122 } 2123 F.TypeOffsets = (const uint32_t *)Blob.data(); 2124 F.LocalNumTypes = Record[0]; 2125 unsigned LocalBaseTypeIndex = Record[1]; 2126 F.BaseTypeIndex = getTotalNumTypes(); 2127 2128 if (F.LocalNumTypes > 0) { 2129 // Introduce the global -> local mapping for types within this module. 2130 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 2131 2132 // Introduce the local -> global mapping for types within this module. 2133 F.TypeRemap.insertOrReplace( 2134 std::make_pair(LocalBaseTypeIndex, 2135 F.BaseTypeIndex - LocalBaseTypeIndex)); 2136 2137 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 2138 } 2139 break; 2140 } 2141 2142 case DECL_OFFSET: { 2143 if (F.LocalNumDecls != 0) { 2144 Error("duplicate DECL_OFFSET record in AST file"); 2145 return true; 2146 } 2147 F.DeclOffsets = (const DeclOffset *)Blob.data(); 2148 F.LocalNumDecls = Record[0]; 2149 unsigned LocalBaseDeclID = Record[1]; 2150 F.BaseDeclID = getTotalNumDecls(); 2151 2152 if (F.LocalNumDecls > 0) { 2153 // Introduce the global -> local mapping for declarations within this 2154 // module. 2155 GlobalDeclMap.insert( 2156 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 2157 2158 // Introduce the local -> global mapping for declarations within this 2159 // module. 2160 F.DeclRemap.insertOrReplace( 2161 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 2162 2163 // Introduce the global -> local mapping for declarations within this 2164 // module. 2165 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 2166 2167 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 2168 } 2169 break; 2170 } 2171 2172 case TU_UPDATE_LEXICAL: { 2173 DeclContext *TU = Context.getTranslationUnitDecl(); 2174 DeclContextInfo &Info = F.DeclContextInfos[TU]; 2175 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data()); 2176 Info.NumLexicalDecls 2177 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair)); 2178 TU->setHasExternalLexicalStorage(true); 2179 break; 2180 } 2181 2182 case UPDATE_VISIBLE: { 2183 unsigned Idx = 0; 2184 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 2185 ASTDeclContextNameLookupTable *Table = 2186 ASTDeclContextNameLookupTable::Create( 2187 (const unsigned char *)Blob.data() + Record[Idx++], 2188 (const unsigned char *)Blob.data(), 2189 ASTDeclContextNameLookupTrait(*this, F)); 2190 if (ID == PREDEF_DECL_TRANSLATION_UNIT_ID) { // Is it the TU? 2191 DeclContext *TU = Context.getTranslationUnitDecl(); 2192 F.DeclContextInfos[TU].NameLookupTableData = Table; 2193 TU->setHasExternalVisibleStorage(true); 2194 } else 2195 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F)); 2196 break; 2197 } 2198 2199 case IDENTIFIER_TABLE: 2200 F.IdentifierTableData = Blob.data(); 2201 if (Record[0]) { 2202 F.IdentifierLookupTable 2203 = ASTIdentifierLookupTable::Create( 2204 (const unsigned char *)F.IdentifierTableData + Record[0], 2205 (const unsigned char *)F.IdentifierTableData, 2206 ASTIdentifierLookupTrait(*this, F)); 2207 2208 PP.getIdentifierTable().setExternalIdentifierLookup(this); 2209 } 2210 break; 2211 2212 case IDENTIFIER_OFFSET: { 2213 if (F.LocalNumIdentifiers != 0) { 2214 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 2215 return true; 2216 } 2217 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 2218 F.LocalNumIdentifiers = Record[0]; 2219 unsigned LocalBaseIdentifierID = Record[1]; 2220 F.BaseIdentifierID = getTotalNumIdentifiers(); 2221 2222 if (F.LocalNumIdentifiers > 0) { 2223 // Introduce the global -> local mapping for identifiers within this 2224 // module. 2225 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 2226 &F)); 2227 2228 // Introduce the local -> global mapping for identifiers within this 2229 // module. 2230 F.IdentifierRemap.insertOrReplace( 2231 std::make_pair(LocalBaseIdentifierID, 2232 F.BaseIdentifierID - LocalBaseIdentifierID)); 2233 2234 IdentifiersLoaded.resize(IdentifiersLoaded.size() 2235 + F.LocalNumIdentifiers); 2236 } 2237 break; 2238 } 2239 2240 case EXTERNAL_DEFINITIONS: 2241 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2242 ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I])); 2243 break; 2244 2245 case SPECIAL_TYPES: 2246 if (SpecialTypes.empty()) { 2247 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2248 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 2249 break; 2250 } 2251 2252 if (SpecialTypes.size() != Record.size()) { 2253 Error("invalid special-types record"); 2254 return true; 2255 } 2256 2257 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2258 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 2259 if (!SpecialTypes[I]) 2260 SpecialTypes[I] = ID; 2261 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 2262 // merge step? 2263 } 2264 break; 2265 2266 case STATISTICS: 2267 TotalNumStatements += Record[0]; 2268 TotalNumMacros += Record[1]; 2269 TotalLexicalDeclContexts += Record[2]; 2270 TotalVisibleDeclContexts += Record[3]; 2271 break; 2272 2273 case UNUSED_FILESCOPED_DECLS: 2274 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2275 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 2276 break; 2277 2278 case DELEGATING_CTORS: 2279 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2280 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 2281 break; 2282 2283 case WEAK_UNDECLARED_IDENTIFIERS: 2284 if (Record.size() % 4 != 0) { 2285 Error("invalid weak identifiers record"); 2286 return true; 2287 } 2288 2289 // FIXME: Ignore weak undeclared identifiers from non-original PCH 2290 // files. This isn't the way to do it :) 2291 WeakUndeclaredIdentifiers.clear(); 2292 2293 // Translate the weak, undeclared identifiers into global IDs. 2294 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 2295 WeakUndeclaredIdentifiers.push_back( 2296 getGlobalIdentifierID(F, Record[I++])); 2297 WeakUndeclaredIdentifiers.push_back( 2298 getGlobalIdentifierID(F, Record[I++])); 2299 WeakUndeclaredIdentifiers.push_back( 2300 ReadSourceLocation(F, Record, I).getRawEncoding()); 2301 WeakUndeclaredIdentifiers.push_back(Record[I++]); 2302 } 2303 break; 2304 2305 case LOCALLY_SCOPED_EXTERN_C_DECLS: 2306 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2307 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I])); 2308 break; 2309 2310 case SELECTOR_OFFSETS: { 2311 F.SelectorOffsets = (const uint32_t *)Blob.data(); 2312 F.LocalNumSelectors = Record[0]; 2313 unsigned LocalBaseSelectorID = Record[1]; 2314 F.BaseSelectorID = getTotalNumSelectors(); 2315 2316 if (F.LocalNumSelectors > 0) { 2317 // Introduce the global -> local mapping for selectors within this 2318 // module. 2319 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 2320 2321 // Introduce the local -> global mapping for selectors within this 2322 // module. 2323 F.SelectorRemap.insertOrReplace( 2324 std::make_pair(LocalBaseSelectorID, 2325 F.BaseSelectorID - LocalBaseSelectorID)); 2326 2327 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 2328 } 2329 break; 2330 } 2331 2332 case METHOD_POOL: 2333 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 2334 if (Record[0]) 2335 F.SelectorLookupTable 2336 = ASTSelectorLookupTable::Create( 2337 F.SelectorLookupTableData + Record[0], 2338 F.SelectorLookupTableData, 2339 ASTSelectorLookupTrait(*this, F)); 2340 TotalNumMethodPoolEntries += Record[1]; 2341 break; 2342 2343 case REFERENCED_SELECTOR_POOL: 2344 if (!Record.empty()) { 2345 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 2346 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 2347 Record[Idx++])); 2348 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 2349 getRawEncoding()); 2350 } 2351 } 2352 break; 2353 2354 case PP_COUNTER_VALUE: 2355 if (!Record.empty() && Listener) 2356 Listener->ReadCounter(F, Record[0]); 2357 break; 2358 2359 case FILE_SORTED_DECLS: 2360 F.FileSortedDecls = (const DeclID *)Blob.data(); 2361 F.NumFileSortedDecls = Record[0]; 2362 break; 2363 2364 case SOURCE_LOCATION_OFFSETS: { 2365 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 2366 F.LocalNumSLocEntries = Record[0]; 2367 unsigned SLocSpaceSize = Record[1]; 2368 llvm::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 2369 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 2370 SLocSpaceSize); 2371 // Make our entry in the range map. BaseID is negative and growing, so 2372 // we invert it. Because we invert it, though, we need the other end of 2373 // the range. 2374 unsigned RangeStart = 2375 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 2376 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 2377 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 2378 2379 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 2380 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 2381 GlobalSLocOffsetMap.insert( 2382 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 2383 - SLocSpaceSize,&F)); 2384 2385 // Initialize the remapping table. 2386 // Invalid stays invalid. 2387 F.SLocRemap.insert(std::make_pair(0U, 0)); 2388 // This module. Base was 2 when being compiled. 2389 F.SLocRemap.insert(std::make_pair(2U, 2390 static_cast<int>(F.SLocEntryBaseOffset - 2))); 2391 2392 TotalNumSLocEntries += F.LocalNumSLocEntries; 2393 break; 2394 } 2395 2396 case MODULE_OFFSET_MAP: { 2397 // Additional remapping information. 2398 const unsigned char *Data = (const unsigned char*)Blob.data(); 2399 const unsigned char *DataEnd = Data + Blob.size(); 2400 2401 // Continuous range maps we may be updating in our module. 2402 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap); 2403 ContinuousRangeMap<uint32_t, int, 2>::Builder 2404 IdentifierRemap(F.IdentifierRemap); 2405 ContinuousRangeMap<uint32_t, int, 2>::Builder 2406 MacroRemap(F.MacroRemap); 2407 ContinuousRangeMap<uint32_t, int, 2>::Builder 2408 PreprocessedEntityRemap(F.PreprocessedEntityRemap); 2409 ContinuousRangeMap<uint32_t, int, 2>::Builder 2410 SubmoduleRemap(F.SubmoduleRemap); 2411 ContinuousRangeMap<uint32_t, int, 2>::Builder 2412 SelectorRemap(F.SelectorRemap); 2413 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap); 2414 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap); 2415 2416 while(Data < DataEnd) { 2417 uint16_t Len = io::ReadUnalignedLE16(Data); 2418 StringRef Name = StringRef((const char*)Data, Len); 2419 Data += Len; 2420 ModuleFile *OM = ModuleMgr.lookup(Name); 2421 if (!OM) { 2422 Error("SourceLocation remap refers to unknown module"); 2423 return true; 2424 } 2425 2426 uint32_t SLocOffset = io::ReadUnalignedLE32(Data); 2427 uint32_t IdentifierIDOffset = io::ReadUnalignedLE32(Data); 2428 uint32_t MacroIDOffset = io::ReadUnalignedLE32(Data); 2429 uint32_t PreprocessedEntityIDOffset = io::ReadUnalignedLE32(Data); 2430 uint32_t SubmoduleIDOffset = io::ReadUnalignedLE32(Data); 2431 uint32_t SelectorIDOffset = io::ReadUnalignedLE32(Data); 2432 uint32_t DeclIDOffset = io::ReadUnalignedLE32(Data); 2433 uint32_t TypeIndexOffset = io::ReadUnalignedLE32(Data); 2434 2435 // Source location offset is mapped to OM->SLocEntryBaseOffset. 2436 SLocRemap.insert(std::make_pair(SLocOffset, 2437 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset))); 2438 IdentifierRemap.insert( 2439 std::make_pair(IdentifierIDOffset, 2440 OM->BaseIdentifierID - IdentifierIDOffset)); 2441 MacroRemap.insert(std::make_pair(MacroIDOffset, 2442 OM->BaseMacroID - MacroIDOffset)); 2443 PreprocessedEntityRemap.insert( 2444 std::make_pair(PreprocessedEntityIDOffset, 2445 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset)); 2446 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset, 2447 OM->BaseSubmoduleID - SubmoduleIDOffset)); 2448 SelectorRemap.insert(std::make_pair(SelectorIDOffset, 2449 OM->BaseSelectorID - SelectorIDOffset)); 2450 DeclRemap.insert(std::make_pair(DeclIDOffset, 2451 OM->BaseDeclID - DeclIDOffset)); 2452 2453 TypeRemap.insert(std::make_pair(TypeIndexOffset, 2454 OM->BaseTypeIndex - TypeIndexOffset)); 2455 2456 // Global -> local mappings. 2457 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 2458 } 2459 break; 2460 } 2461 2462 case SOURCE_MANAGER_LINE_TABLE: 2463 if (ParseLineTable(F, Record)) 2464 return true; 2465 break; 2466 2467 case SOURCE_LOCATION_PRELOADS: { 2468 // Need to transform from the local view (1-based IDs) to the global view, 2469 // which is based off F.SLocEntryBaseID. 2470 if (!F.PreloadSLocEntries.empty()) { 2471 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 2472 return true; 2473 } 2474 2475 F.PreloadSLocEntries.swap(Record); 2476 break; 2477 } 2478 2479 case EXT_VECTOR_DECLS: 2480 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2481 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 2482 break; 2483 2484 case VTABLE_USES: 2485 if (Record.size() % 3 != 0) { 2486 Error("Invalid VTABLE_USES record"); 2487 return true; 2488 } 2489 2490 // Later tables overwrite earlier ones. 2491 // FIXME: Modules will have some trouble with this. This is clearly not 2492 // the right way to do this. 2493 VTableUses.clear(); 2494 2495 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 2496 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 2497 VTableUses.push_back( 2498 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 2499 VTableUses.push_back(Record[Idx++]); 2500 } 2501 break; 2502 2503 case DYNAMIC_CLASSES: 2504 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2505 DynamicClasses.push_back(getGlobalDeclID(F, Record[I])); 2506 break; 2507 2508 case PENDING_IMPLICIT_INSTANTIATIONS: 2509 if (PendingInstantiations.size() % 2 != 0) { 2510 Error("Invalid existing PendingInstantiations"); 2511 return true; 2512 } 2513 2514 if (Record.size() % 2 != 0) { 2515 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 2516 return true; 2517 } 2518 2519 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 2520 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 2521 PendingInstantiations.push_back( 2522 ReadSourceLocation(F, Record, I).getRawEncoding()); 2523 } 2524 break; 2525 2526 case SEMA_DECL_REFS: 2527 // Later tables overwrite earlier ones. 2528 // FIXME: Modules will have some trouble with this. 2529 SemaDeclRefs.clear(); 2530 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2531 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 2532 break; 2533 2534 case PPD_ENTITIES_OFFSETS: { 2535 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 2536 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 2537 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 2538 2539 unsigned LocalBasePreprocessedEntityID = Record[0]; 2540 2541 unsigned StartingID; 2542 if (!PP.getPreprocessingRecord()) 2543 PP.createPreprocessingRecord(); 2544 if (!PP.getPreprocessingRecord()->getExternalSource()) 2545 PP.getPreprocessingRecord()->SetExternalSource(*this); 2546 StartingID 2547 = PP.getPreprocessingRecord() 2548 ->allocateLoadedEntities(F.NumPreprocessedEntities); 2549 F.BasePreprocessedEntityID = StartingID; 2550 2551 if (F.NumPreprocessedEntities > 0) { 2552 // Introduce the global -> local mapping for preprocessed entities in 2553 // this module. 2554 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 2555 2556 // Introduce the local -> global mapping for preprocessed entities in 2557 // this module. 2558 F.PreprocessedEntityRemap.insertOrReplace( 2559 std::make_pair(LocalBasePreprocessedEntityID, 2560 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 2561 } 2562 2563 break; 2564 } 2565 2566 case DECL_UPDATE_OFFSETS: { 2567 if (Record.size() % 2 != 0) { 2568 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 2569 return true; 2570 } 2571 for (unsigned I = 0, N = Record.size(); I != N; I += 2) 2572 DeclUpdateOffsets[getGlobalDeclID(F, Record[I])] 2573 .push_back(std::make_pair(&F, Record[I+1])); 2574 break; 2575 } 2576 2577 case DECL_REPLACEMENTS: { 2578 if (Record.size() % 3 != 0) { 2579 Error("invalid DECL_REPLACEMENTS block in AST file"); 2580 return true; 2581 } 2582 for (unsigned I = 0, N = Record.size(); I != N; I += 3) 2583 ReplacedDecls[getGlobalDeclID(F, Record[I])] 2584 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]); 2585 break; 2586 } 2587 2588 case OBJC_CATEGORIES_MAP: { 2589 if (F.LocalNumObjCCategoriesInMap != 0) { 2590 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 2591 return true; 2592 } 2593 2594 F.LocalNumObjCCategoriesInMap = Record[0]; 2595 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 2596 break; 2597 } 2598 2599 case OBJC_CATEGORIES: 2600 F.ObjCCategories.swap(Record); 2601 break; 2602 2603 case CXX_BASE_SPECIFIER_OFFSETS: { 2604 if (F.LocalNumCXXBaseSpecifiers != 0) { 2605 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 2606 return true; 2607 } 2608 2609 F.LocalNumCXXBaseSpecifiers = Record[0]; 2610 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 2611 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers; 2612 break; 2613 } 2614 2615 case DIAG_PRAGMA_MAPPINGS: 2616 if (F.PragmaDiagMappings.empty()) 2617 F.PragmaDiagMappings.swap(Record); 2618 else 2619 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 2620 Record.begin(), Record.end()); 2621 break; 2622 2623 case CUDA_SPECIAL_DECL_REFS: 2624 // Later tables overwrite earlier ones. 2625 // FIXME: Modules will have trouble with this. 2626 CUDASpecialDeclRefs.clear(); 2627 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2628 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 2629 break; 2630 2631 case HEADER_SEARCH_TABLE: { 2632 F.HeaderFileInfoTableData = Blob.data(); 2633 F.LocalNumHeaderFileInfos = Record[1]; 2634 if (Record[0]) { 2635 F.HeaderFileInfoTable 2636 = HeaderFileInfoLookupTable::Create( 2637 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 2638 (const unsigned char *)F.HeaderFileInfoTableData, 2639 HeaderFileInfoTrait(*this, F, 2640 &PP.getHeaderSearchInfo(), 2641 Blob.data() + Record[2])); 2642 2643 PP.getHeaderSearchInfo().SetExternalSource(this); 2644 if (!PP.getHeaderSearchInfo().getExternalLookup()) 2645 PP.getHeaderSearchInfo().SetExternalLookup(this); 2646 } 2647 break; 2648 } 2649 2650 case FP_PRAGMA_OPTIONS: 2651 // Later tables overwrite earlier ones. 2652 FPPragmaOptions.swap(Record); 2653 break; 2654 2655 case OPENCL_EXTENSIONS: 2656 // Later tables overwrite earlier ones. 2657 OpenCLExtensions.swap(Record); 2658 break; 2659 2660 case TENTATIVE_DEFINITIONS: 2661 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2662 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 2663 break; 2664 2665 case KNOWN_NAMESPACES: 2666 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2667 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 2668 break; 2669 2670 case UNDEFINED_BUT_USED: 2671 if (UndefinedButUsed.size() % 2 != 0) { 2672 Error("Invalid existing UndefinedButUsed"); 2673 return true; 2674 } 2675 2676 if (Record.size() % 2 != 0) { 2677 Error("invalid undefined-but-used record"); 2678 return true; 2679 } 2680 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 2681 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 2682 UndefinedButUsed.push_back( 2683 ReadSourceLocation(F, Record, I).getRawEncoding()); 2684 } 2685 break; 2686 2687 case IMPORTED_MODULES: { 2688 if (F.Kind != MK_Module) { 2689 // If we aren't loading a module (which has its own exports), make 2690 // all of the imported modules visible. 2691 // FIXME: Deal with macros-only imports. 2692 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2693 if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I])) 2694 ImportedModules.push_back(GlobalID); 2695 } 2696 } 2697 break; 2698 } 2699 2700 case LOCAL_REDECLARATIONS: { 2701 F.RedeclarationChains.swap(Record); 2702 break; 2703 } 2704 2705 case LOCAL_REDECLARATIONS_MAP: { 2706 if (F.LocalNumRedeclarationsInMap != 0) { 2707 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 2708 return true; 2709 } 2710 2711 F.LocalNumRedeclarationsInMap = Record[0]; 2712 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 2713 break; 2714 } 2715 2716 case MERGED_DECLARATIONS: { 2717 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) { 2718 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]); 2719 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID]; 2720 for (unsigned N = Record[Idx++]; N > 0; --N) 2721 Decls.push_back(getGlobalDeclID(F, Record[Idx++])); 2722 } 2723 break; 2724 } 2725 2726 case MACRO_OFFSET: { 2727 if (F.LocalNumMacros != 0) { 2728 Error("duplicate MACRO_OFFSET record in AST file"); 2729 return true; 2730 } 2731 F.MacroOffsets = (const uint32_t *)Blob.data(); 2732 F.LocalNumMacros = Record[0]; 2733 unsigned LocalBaseMacroID = Record[1]; 2734 F.BaseMacroID = getTotalNumMacros(); 2735 2736 if (F.LocalNumMacros > 0) { 2737 // Introduce the global -> local mapping for macros within this module. 2738 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 2739 2740 // Introduce the local -> global mapping for macros within this module. 2741 F.MacroRemap.insertOrReplace( 2742 std::make_pair(LocalBaseMacroID, 2743 F.BaseMacroID - LocalBaseMacroID)); 2744 2745 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 2746 } 2747 break; 2748 } 2749 2750 case MACRO_TABLE: { 2751 // FIXME: Not used yet. 2752 break; 2753 } 2754 2755 case LATE_PARSED_TEMPLATE: { 2756 LateParsedTemplates.append(Record.begin(), Record.end()); 2757 break; 2758 } 2759 } 2760 } 2761 } 2762 2763 /// \brief Move the given method to the back of the global list of methods. 2764 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 2765 // Find the entry for this selector in the method pool. 2766 Sema::GlobalMethodPool::iterator Known 2767 = S.MethodPool.find(Method->getSelector()); 2768 if (Known == S.MethodPool.end()) 2769 return; 2770 2771 // Retrieve the appropriate method list. 2772 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 2773 : Known->second.second; 2774 bool Found = false; 2775 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 2776 if (!Found) { 2777 if (List->Method == Method) { 2778 Found = true; 2779 } else { 2780 // Keep searching. 2781 continue; 2782 } 2783 } 2784 2785 if (List->getNext()) 2786 List->Method = List->getNext()->Method; 2787 else 2788 List->Method = Method; 2789 } 2790 } 2791 2792 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 2793 for (unsigned I = 0, N = Names.size(); I != N; ++I) { 2794 switch (Names[I].getKind()) { 2795 case HiddenName::Declaration: { 2796 Decl *D = Names[I].getDecl(); 2797 bool wasHidden = D->Hidden; 2798 D->Hidden = false; 2799 2800 if (wasHidden && SemaObj) { 2801 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 2802 moveMethodToBackOfGlobalList(*SemaObj, Method); 2803 } 2804 } 2805 break; 2806 } 2807 case HiddenName::MacroVisibility: { 2808 std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro(); 2809 installImportedMacro(Macro.first, Macro.second, Owner); 2810 break; 2811 } 2812 } 2813 } 2814 } 2815 2816 void ASTReader::makeModuleVisible(Module *Mod, 2817 Module::NameVisibilityKind NameVisibility, 2818 SourceLocation ImportLoc, 2819 bool Complain) { 2820 llvm::SmallPtrSet<Module *, 4> Visited; 2821 SmallVector<Module *, 4> Stack; 2822 Stack.push_back(Mod); 2823 while (!Stack.empty()) { 2824 Mod = Stack.pop_back_val(); 2825 2826 if (NameVisibility <= Mod->NameVisibility) { 2827 // This module already has this level of visibility (or greater), so 2828 // there is nothing more to do. 2829 continue; 2830 } 2831 2832 if (!Mod->isAvailable()) { 2833 // Modules that aren't available cannot be made visible. 2834 continue; 2835 } 2836 2837 // Update the module's name visibility. 2838 Mod->NameVisibility = NameVisibility; 2839 2840 // If we've already deserialized any names from this module, 2841 // mark them as visible. 2842 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 2843 if (Hidden != HiddenNamesMap.end()) { 2844 makeNamesVisible(Hidden->second, Hidden->first); 2845 HiddenNamesMap.erase(Hidden); 2846 } 2847 2848 // Push any non-explicit submodules onto the stack to be marked as 2849 // visible. 2850 for (Module::submodule_iterator Sub = Mod->submodule_begin(), 2851 SubEnd = Mod->submodule_end(); 2852 Sub != SubEnd; ++Sub) { 2853 if (!(*Sub)->IsExplicit && Visited.insert(*Sub)) 2854 Stack.push_back(*Sub); 2855 } 2856 2857 // Push any exported modules onto the stack to be marked as visible. 2858 SmallVector<Module *, 16> Exports; 2859 Mod->getExportedModules(Exports); 2860 for (SmallVectorImpl<Module *>::iterator 2861 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 2862 Module *Exported = *I; 2863 if (Visited.insert(Exported)) 2864 Stack.push_back(Exported); 2865 } 2866 2867 // Detect any conflicts. 2868 if (Complain) { 2869 assert(ImportLoc.isValid() && "Missing import location"); 2870 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 2871 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) { 2872 Diag(ImportLoc, diag::warn_module_conflict) 2873 << Mod->getFullModuleName() 2874 << Mod->Conflicts[I].Other->getFullModuleName() 2875 << Mod->Conflicts[I].Message; 2876 // FIXME: Need note where the other module was imported. 2877 } 2878 } 2879 } 2880 } 2881 } 2882 2883 bool ASTReader::loadGlobalIndex() { 2884 if (GlobalIndex) 2885 return false; 2886 2887 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 2888 !Context.getLangOpts().Modules) 2889 return true; 2890 2891 // Try to load the global index. 2892 TriedLoadingGlobalIndex = true; 2893 StringRef ModuleCachePath 2894 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 2895 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 2896 = GlobalModuleIndex::readIndex(ModuleCachePath); 2897 if (!Result.first) 2898 return true; 2899 2900 GlobalIndex.reset(Result.first); 2901 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 2902 return false; 2903 } 2904 2905 bool ASTReader::isGlobalIndexUnavailable() const { 2906 return Context.getLangOpts().Modules && UseGlobalIndex && 2907 !hasGlobalIndex() && TriedLoadingGlobalIndex; 2908 } 2909 2910 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 2911 ModuleKind Type, 2912 SourceLocation ImportLoc, 2913 unsigned ClientLoadCapabilities) { 2914 llvm::SaveAndRestore<SourceLocation> 2915 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 2916 2917 // Bump the generation number. 2918 unsigned PreviousGeneration = CurrentGeneration++; 2919 2920 unsigned NumModules = ModuleMgr.size(); 2921 SmallVector<ImportedModule, 4> Loaded; 2922 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 2923 /*ImportedBy=*/0, Loaded, 2924 0, 0, 2925 ClientLoadCapabilities)) { 2926 case Failure: 2927 case Missing: 2928 case OutOfDate: 2929 case VersionMismatch: 2930 case ConfigurationMismatch: 2931 case HadErrors: 2932 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 2933 Context.getLangOpts().Modules 2934 ? &PP.getHeaderSearchInfo().getModuleMap() 2935 : 0); 2936 2937 // If we find that any modules are unusable, the global index is going 2938 // to be out-of-date. Just remove it. 2939 GlobalIndex.reset(); 2940 ModuleMgr.setGlobalIndex(0); 2941 return ReadResult; 2942 2943 case Success: 2944 break; 2945 } 2946 2947 // Here comes stuff that we only do once the entire chain is loaded. 2948 2949 // Load the AST blocks of all of the modules that we loaded. 2950 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2951 MEnd = Loaded.end(); 2952 M != MEnd; ++M) { 2953 ModuleFile &F = *M->Mod; 2954 2955 // Read the AST block. 2956 if (ReadASTBlock(F)) 2957 return Failure; 2958 2959 // Once read, set the ModuleFile bit base offset and update the size in 2960 // bits of all files we've seen. 2961 F.GlobalBitOffset = TotalModulesSizeInBits; 2962 TotalModulesSizeInBits += F.SizeInBits; 2963 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 2964 2965 // Preload SLocEntries. 2966 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 2967 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 2968 // Load it through the SourceManager and don't call ReadSLocEntry() 2969 // directly because the entry may have already been loaded in which case 2970 // calling ReadSLocEntry() directly would trigger an assertion in 2971 // SourceManager. 2972 SourceMgr.getLoadedSLocEntryByID(Index); 2973 } 2974 } 2975 2976 // Setup the import locations and notify the module manager that we've 2977 // committed to these module files. 2978 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2979 MEnd = Loaded.end(); 2980 M != MEnd; ++M) { 2981 ModuleFile &F = *M->Mod; 2982 2983 ModuleMgr.moduleFileAccepted(&F); 2984 2985 // Set the import location. 2986 F.DirectImportLoc = ImportLoc; 2987 if (!M->ImportedBy) 2988 F.ImportLoc = M->ImportLoc; 2989 else 2990 F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 2991 M->ImportLoc.getRawEncoding()); 2992 } 2993 2994 // Mark all of the identifiers in the identifier table as being out of date, 2995 // so that various accessors know to check the loaded modules when the 2996 // identifier is used. 2997 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 2998 IdEnd = PP.getIdentifierTable().end(); 2999 Id != IdEnd; ++Id) 3000 Id->second->setOutOfDate(true); 3001 3002 // Resolve any unresolved module exports. 3003 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3004 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 3005 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 3006 Module *ResolvedMod = getSubmodule(GlobalID); 3007 3008 switch (Unresolved.Kind) { 3009 case UnresolvedModuleRef::Conflict: 3010 if (ResolvedMod) { 3011 Module::Conflict Conflict; 3012 Conflict.Other = ResolvedMod; 3013 Conflict.Message = Unresolved.String.str(); 3014 Unresolved.Mod->Conflicts.push_back(Conflict); 3015 } 3016 continue; 3017 3018 case UnresolvedModuleRef::Import: 3019 if (ResolvedMod) 3020 Unresolved.Mod->Imports.push_back(ResolvedMod); 3021 continue; 3022 3023 case UnresolvedModuleRef::Export: 3024 if (ResolvedMod || Unresolved.IsWildcard) 3025 Unresolved.Mod->Exports.push_back( 3026 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3027 continue; 3028 } 3029 } 3030 UnresolvedModuleRefs.clear(); 3031 3032 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3033 // Might be unnecessary as use declarations are only used to build the 3034 // module itself. 3035 3036 InitializeContext(); 3037 3038 if (DeserializationListener) 3039 DeserializationListener->ReaderInitialized(this); 3040 3041 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3042 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 3043 PrimaryModule.OriginalSourceFileID 3044 = FileID::get(PrimaryModule.SLocEntryBaseID 3045 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3046 3047 // If this AST file is a precompiled preamble, then set the 3048 // preamble file ID of the source manager to the file source file 3049 // from which the preamble was built. 3050 if (Type == MK_Preamble) { 3051 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3052 } else if (Type == MK_MainFile) { 3053 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3054 } 3055 } 3056 3057 // For any Objective-C class definitions we have already loaded, make sure 3058 // that we load any additional categories. 3059 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3060 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3061 ObjCClassesLoaded[I], 3062 PreviousGeneration); 3063 } 3064 3065 return Success; 3066 } 3067 3068 ASTReader::ASTReadResult 3069 ASTReader::ReadASTCore(StringRef FileName, 3070 ModuleKind Type, 3071 SourceLocation ImportLoc, 3072 ModuleFile *ImportedBy, 3073 SmallVectorImpl<ImportedModule> &Loaded, 3074 off_t ExpectedSize, time_t ExpectedModTime, 3075 unsigned ClientLoadCapabilities) { 3076 ModuleFile *M; 3077 std::string ErrorStr; 3078 ModuleManager::AddModuleResult AddResult 3079 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3080 CurrentGeneration, ExpectedSize, ExpectedModTime, 3081 M, ErrorStr); 3082 3083 switch (AddResult) { 3084 case ModuleManager::AlreadyLoaded: 3085 return Success; 3086 3087 case ModuleManager::NewlyLoaded: 3088 // Load module file below. 3089 break; 3090 3091 case ModuleManager::Missing: 3092 // The module file was missing; if the client handle handle, that, return 3093 // it. 3094 if (ClientLoadCapabilities & ARR_Missing) 3095 return Missing; 3096 3097 // Otherwise, return an error. 3098 { 3099 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3100 + ErrorStr; 3101 Error(Msg); 3102 } 3103 return Failure; 3104 3105 case ModuleManager::OutOfDate: 3106 // We couldn't load the module file because it is out-of-date. If the 3107 // client can handle out-of-date, return it. 3108 if (ClientLoadCapabilities & ARR_OutOfDate) 3109 return OutOfDate; 3110 3111 // Otherwise, return an error. 3112 { 3113 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3114 + ErrorStr; 3115 Error(Msg); 3116 } 3117 return Failure; 3118 } 3119 3120 assert(M && "Missing module file"); 3121 3122 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3123 // module? 3124 if (FileName != "-") { 3125 CurrentDir = llvm::sys::path::parent_path(FileName); 3126 if (CurrentDir.empty()) CurrentDir = "."; 3127 } 3128 3129 ModuleFile &F = *M; 3130 BitstreamCursor &Stream = F.Stream; 3131 Stream.init(F.StreamFile); 3132 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3133 3134 // Sniff for the signature. 3135 if (Stream.Read(8) != 'C' || 3136 Stream.Read(8) != 'P' || 3137 Stream.Read(8) != 'C' || 3138 Stream.Read(8) != 'H') { 3139 Diag(diag::err_not_a_pch_file) << FileName; 3140 return Failure; 3141 } 3142 3143 // This is used for compatibility with older PCH formats. 3144 bool HaveReadControlBlock = false; 3145 3146 while (1) { 3147 llvm::BitstreamEntry Entry = Stream.advance(); 3148 3149 switch (Entry.Kind) { 3150 case llvm::BitstreamEntry::Error: 3151 case llvm::BitstreamEntry::EndBlock: 3152 case llvm::BitstreamEntry::Record: 3153 Error("invalid record at top-level of AST file"); 3154 return Failure; 3155 3156 case llvm::BitstreamEntry::SubBlock: 3157 break; 3158 } 3159 3160 // We only know the control subblock ID. 3161 switch (Entry.ID) { 3162 case llvm::bitc::BLOCKINFO_BLOCK_ID: 3163 if (Stream.ReadBlockInfoBlock()) { 3164 Error("malformed BlockInfoBlock in AST file"); 3165 return Failure; 3166 } 3167 break; 3168 case CONTROL_BLOCK_ID: 3169 HaveReadControlBlock = true; 3170 switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) { 3171 case Success: 3172 break; 3173 3174 case Failure: return Failure; 3175 case Missing: return Missing; 3176 case OutOfDate: return OutOfDate; 3177 case VersionMismatch: return VersionMismatch; 3178 case ConfigurationMismatch: return ConfigurationMismatch; 3179 case HadErrors: return HadErrors; 3180 } 3181 break; 3182 case AST_BLOCK_ID: 3183 if (!HaveReadControlBlock) { 3184 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3185 Diag(diag::warn_pch_version_too_old); 3186 return VersionMismatch; 3187 } 3188 3189 // Record that we've loaded this module. 3190 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3191 return Success; 3192 3193 default: 3194 if (Stream.SkipBlock()) { 3195 Error("malformed block record in AST file"); 3196 return Failure; 3197 } 3198 break; 3199 } 3200 } 3201 3202 return Success; 3203 } 3204 3205 void ASTReader::InitializeContext() { 3206 // If there's a listener, notify them that we "read" the translation unit. 3207 if (DeserializationListener) 3208 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3209 Context.getTranslationUnitDecl()); 3210 3211 // Make sure we load the declaration update records for the translation unit, 3212 // if there are any. 3213 loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID, 3214 Context.getTranslationUnitDecl()); 3215 3216 // FIXME: Find a better way to deal with collisions between these 3217 // built-in types. Right now, we just ignore the problem. 3218 3219 // Load the special types. 3220 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3221 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3222 if (!Context.CFConstantStringTypeDecl) 3223 Context.setCFConstantStringType(GetType(String)); 3224 } 3225 3226 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3227 QualType FileType = GetType(File); 3228 if (FileType.isNull()) { 3229 Error("FILE type is NULL"); 3230 return; 3231 } 3232 3233 if (!Context.FILEDecl) { 3234 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3235 Context.setFILEDecl(Typedef->getDecl()); 3236 else { 3237 const TagType *Tag = FileType->getAs<TagType>(); 3238 if (!Tag) { 3239 Error("Invalid FILE type in AST file"); 3240 return; 3241 } 3242 Context.setFILEDecl(Tag->getDecl()); 3243 } 3244 } 3245 } 3246 3247 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 3248 QualType Jmp_bufType = GetType(Jmp_buf); 3249 if (Jmp_bufType.isNull()) { 3250 Error("jmp_buf type is NULL"); 3251 return; 3252 } 3253 3254 if (!Context.jmp_bufDecl) { 3255 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 3256 Context.setjmp_bufDecl(Typedef->getDecl()); 3257 else { 3258 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 3259 if (!Tag) { 3260 Error("Invalid jmp_buf type in AST file"); 3261 return; 3262 } 3263 Context.setjmp_bufDecl(Tag->getDecl()); 3264 } 3265 } 3266 } 3267 3268 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 3269 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 3270 if (Sigjmp_bufType.isNull()) { 3271 Error("sigjmp_buf type is NULL"); 3272 return; 3273 } 3274 3275 if (!Context.sigjmp_bufDecl) { 3276 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 3277 Context.setsigjmp_bufDecl(Typedef->getDecl()); 3278 else { 3279 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 3280 assert(Tag && "Invalid sigjmp_buf type in AST file"); 3281 Context.setsigjmp_bufDecl(Tag->getDecl()); 3282 } 3283 } 3284 } 3285 3286 if (unsigned ObjCIdRedef 3287 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 3288 if (Context.ObjCIdRedefinitionType.isNull()) 3289 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 3290 } 3291 3292 if (unsigned ObjCClassRedef 3293 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 3294 if (Context.ObjCClassRedefinitionType.isNull()) 3295 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 3296 } 3297 3298 if (unsigned ObjCSelRedef 3299 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 3300 if (Context.ObjCSelRedefinitionType.isNull()) 3301 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 3302 } 3303 3304 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 3305 QualType Ucontext_tType = GetType(Ucontext_t); 3306 if (Ucontext_tType.isNull()) { 3307 Error("ucontext_t type is NULL"); 3308 return; 3309 } 3310 3311 if (!Context.ucontext_tDecl) { 3312 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 3313 Context.setucontext_tDecl(Typedef->getDecl()); 3314 else { 3315 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 3316 assert(Tag && "Invalid ucontext_t type in AST file"); 3317 Context.setucontext_tDecl(Tag->getDecl()); 3318 } 3319 } 3320 } 3321 } 3322 3323 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 3324 3325 // If there were any CUDA special declarations, deserialize them. 3326 if (!CUDASpecialDeclRefs.empty()) { 3327 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 3328 Context.setcudaConfigureCallDecl( 3329 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 3330 } 3331 3332 // Re-export any modules that were imported by a non-module AST file. 3333 for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) { 3334 if (Module *Imported = getSubmodule(ImportedModules[I])) 3335 makeModuleVisible(Imported, Module::AllVisible, 3336 /*ImportLoc=*/SourceLocation(), 3337 /*Complain=*/false); 3338 } 3339 ImportedModules.clear(); 3340 } 3341 3342 void ASTReader::finalizeForWriting() { 3343 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), 3344 HiddenEnd = HiddenNamesMap.end(); 3345 Hidden != HiddenEnd; ++Hidden) { 3346 makeNamesVisible(Hidden->second, Hidden->first); 3347 } 3348 HiddenNamesMap.clear(); 3349 } 3350 3351 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3352 /// cursor into the start of the given block ID, returning false on success and 3353 /// true on failure. 3354 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 3355 while (1) { 3356 llvm::BitstreamEntry Entry = Cursor.advance(); 3357 switch (Entry.Kind) { 3358 case llvm::BitstreamEntry::Error: 3359 case llvm::BitstreamEntry::EndBlock: 3360 return true; 3361 3362 case llvm::BitstreamEntry::Record: 3363 // Ignore top-level records. 3364 Cursor.skipRecord(Entry.ID); 3365 break; 3366 3367 case llvm::BitstreamEntry::SubBlock: 3368 if (Entry.ID == BlockID) { 3369 if (Cursor.EnterSubBlock(BlockID)) 3370 return true; 3371 // Found it! 3372 return false; 3373 } 3374 3375 if (Cursor.SkipBlock()) 3376 return true; 3377 } 3378 } 3379 } 3380 3381 /// \brief Retrieve the name of the original source file name 3382 /// directly from the AST file, without actually loading the AST 3383 /// file. 3384 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 3385 FileManager &FileMgr, 3386 DiagnosticsEngine &Diags) { 3387 // Open the AST file. 3388 std::string ErrStr; 3389 OwningPtr<llvm::MemoryBuffer> Buffer; 3390 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr)); 3391 if (!Buffer) { 3392 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr; 3393 return std::string(); 3394 } 3395 3396 // Initialize the stream 3397 llvm::BitstreamReader StreamFile; 3398 BitstreamCursor Stream; 3399 StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 3400 (const unsigned char *)Buffer->getBufferEnd()); 3401 Stream.init(StreamFile); 3402 3403 // Sniff for the signature. 3404 if (Stream.Read(8) != 'C' || 3405 Stream.Read(8) != 'P' || 3406 Stream.Read(8) != 'C' || 3407 Stream.Read(8) != 'H') { 3408 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 3409 return std::string(); 3410 } 3411 3412 // Scan for the CONTROL_BLOCK_ID block. 3413 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 3414 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 3415 return std::string(); 3416 } 3417 3418 // Scan for ORIGINAL_FILE inside the control block. 3419 RecordData Record; 3420 while (1) { 3421 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3422 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 3423 return std::string(); 3424 3425 if (Entry.Kind != llvm::BitstreamEntry::Record) { 3426 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 3427 return std::string(); 3428 } 3429 3430 Record.clear(); 3431 StringRef Blob; 3432 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 3433 return Blob.str(); 3434 } 3435 } 3436 3437 namespace { 3438 class SimplePCHValidator : public ASTReaderListener { 3439 const LangOptions &ExistingLangOpts; 3440 const TargetOptions &ExistingTargetOpts; 3441 const PreprocessorOptions &ExistingPPOpts; 3442 FileManager &FileMgr; 3443 3444 public: 3445 SimplePCHValidator(const LangOptions &ExistingLangOpts, 3446 const TargetOptions &ExistingTargetOpts, 3447 const PreprocessorOptions &ExistingPPOpts, 3448 FileManager &FileMgr) 3449 : ExistingLangOpts(ExistingLangOpts), 3450 ExistingTargetOpts(ExistingTargetOpts), 3451 ExistingPPOpts(ExistingPPOpts), 3452 FileMgr(FileMgr) 3453 { 3454 } 3455 3456 virtual bool ReadLanguageOptions(const LangOptions &LangOpts, 3457 bool Complain) { 3458 return checkLanguageOptions(ExistingLangOpts, LangOpts, 0); 3459 } 3460 virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, 3461 bool Complain) { 3462 return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0); 3463 } 3464 virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 3465 bool Complain, 3466 std::string &SuggestedPredefines) { 3467 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr, 3468 SuggestedPredefines, ExistingLangOpts); 3469 } 3470 }; 3471 } 3472 3473 bool ASTReader::readASTFileControlBlock(StringRef Filename, 3474 FileManager &FileMgr, 3475 ASTReaderListener &Listener) { 3476 // Open the AST file. 3477 std::string ErrStr; 3478 OwningPtr<llvm::MemoryBuffer> Buffer; 3479 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr)); 3480 if (!Buffer) { 3481 return true; 3482 } 3483 3484 // Initialize the stream 3485 llvm::BitstreamReader StreamFile; 3486 BitstreamCursor Stream; 3487 StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 3488 (const unsigned char *)Buffer->getBufferEnd()); 3489 Stream.init(StreamFile); 3490 3491 // Sniff for the signature. 3492 if (Stream.Read(8) != 'C' || 3493 Stream.Read(8) != 'P' || 3494 Stream.Read(8) != 'C' || 3495 Stream.Read(8) != 'H') { 3496 return true; 3497 } 3498 3499 // Scan for the CONTROL_BLOCK_ID block. 3500 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 3501 return true; 3502 3503 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 3504 BitstreamCursor InputFilesCursor; 3505 if (NeedsInputFiles) { 3506 InputFilesCursor = Stream; 3507 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 3508 return true; 3509 3510 // Read the abbreviations 3511 while (true) { 3512 uint64_t Offset = InputFilesCursor.GetCurrentBitNo(); 3513 unsigned Code = InputFilesCursor.ReadCode(); 3514 3515 // We expect all abbrevs to be at the start of the block. 3516 if (Code != llvm::bitc::DEFINE_ABBREV) { 3517 InputFilesCursor.JumpToBit(Offset); 3518 break; 3519 } 3520 InputFilesCursor.ReadAbbrevRecord(); 3521 } 3522 } 3523 3524 // Scan for ORIGINAL_FILE inside the control block. 3525 RecordData Record; 3526 while (1) { 3527 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3528 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 3529 return false; 3530 3531 if (Entry.Kind != llvm::BitstreamEntry::Record) 3532 return true; 3533 3534 Record.clear(); 3535 StringRef Blob; 3536 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 3537 switch ((ControlRecordTypes)RecCode) { 3538 case METADATA: { 3539 if (Record[0] != VERSION_MAJOR) 3540 return true; 3541 3542 if (Listener.ReadFullVersionInformation(Blob)) 3543 return true; 3544 3545 break; 3546 } 3547 case LANGUAGE_OPTIONS: 3548 if (ParseLanguageOptions(Record, false, Listener)) 3549 return true; 3550 break; 3551 3552 case TARGET_OPTIONS: 3553 if (ParseTargetOptions(Record, false, Listener)) 3554 return true; 3555 break; 3556 3557 case DIAGNOSTIC_OPTIONS: 3558 if (ParseDiagnosticOptions(Record, false, Listener)) 3559 return true; 3560 break; 3561 3562 case FILE_SYSTEM_OPTIONS: 3563 if (ParseFileSystemOptions(Record, false, Listener)) 3564 return true; 3565 break; 3566 3567 case HEADER_SEARCH_OPTIONS: 3568 if (ParseHeaderSearchOptions(Record, false, Listener)) 3569 return true; 3570 break; 3571 3572 case PREPROCESSOR_OPTIONS: { 3573 std::string IgnoredSuggestedPredefines; 3574 if (ParsePreprocessorOptions(Record, false, Listener, 3575 IgnoredSuggestedPredefines)) 3576 return true; 3577 break; 3578 } 3579 3580 case INPUT_FILE_OFFSETS: { 3581 if (!NeedsInputFiles) 3582 break; 3583 3584 unsigned NumInputFiles = Record[0]; 3585 unsigned NumUserFiles = Record[1]; 3586 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data(); 3587 for (unsigned I = 0; I != NumInputFiles; ++I) { 3588 // Go find this input file. 3589 bool isSystemFile = I >= NumUserFiles; 3590 BitstreamCursor &Cursor = InputFilesCursor; 3591 SavedStreamPosition SavedPosition(Cursor); 3592 Cursor.JumpToBit(InputFileOffs[I]); 3593 3594 unsigned Code = Cursor.ReadCode(); 3595 RecordData Record; 3596 StringRef Blob; 3597 bool shouldContinue = false; 3598 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 3599 case INPUT_FILE: 3600 shouldContinue = Listener.visitInputFile(Blob, isSystemFile); 3601 break; 3602 } 3603 if (!shouldContinue) 3604 break; 3605 } 3606 break; 3607 } 3608 3609 default: 3610 // No other validation to perform. 3611 break; 3612 } 3613 } 3614 } 3615 3616 3617 bool ASTReader::isAcceptableASTFile(StringRef Filename, 3618 FileManager &FileMgr, 3619 const LangOptions &LangOpts, 3620 const TargetOptions &TargetOpts, 3621 const PreprocessorOptions &PPOpts) { 3622 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr); 3623 return !readASTFileControlBlock(Filename, FileMgr, validator); 3624 } 3625 3626 bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) { 3627 // Enter the submodule block. 3628 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 3629 Error("malformed submodule block record in AST file"); 3630 return true; 3631 } 3632 3633 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 3634 bool First = true; 3635 Module *CurrentModule = 0; 3636 RecordData Record; 3637 while (true) { 3638 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 3639 3640 switch (Entry.Kind) { 3641 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 3642 case llvm::BitstreamEntry::Error: 3643 Error("malformed block record in AST file"); 3644 return true; 3645 case llvm::BitstreamEntry::EndBlock: 3646 return false; 3647 case llvm::BitstreamEntry::Record: 3648 // The interesting case. 3649 break; 3650 } 3651 3652 // Read a record. 3653 StringRef Blob; 3654 Record.clear(); 3655 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) { 3656 default: // Default behavior: ignore. 3657 break; 3658 3659 case SUBMODULE_DEFINITION: { 3660 if (First) { 3661 Error("missing submodule metadata record at beginning of block"); 3662 return true; 3663 } 3664 3665 if (Record.size() < 8) { 3666 Error("malformed module definition"); 3667 return true; 3668 } 3669 3670 StringRef Name = Blob; 3671 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]); 3672 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]); 3673 bool IsFramework = Record[2]; 3674 bool IsExplicit = Record[3]; 3675 bool IsSystem = Record[4]; 3676 bool InferSubmodules = Record[5]; 3677 bool InferExplicitSubmodules = Record[6]; 3678 bool InferExportWildcard = Record[7]; 3679 bool ConfigMacrosExhaustive = Record[8]; 3680 3681 Module *ParentModule = 0; 3682 if (Parent) 3683 ParentModule = getSubmodule(Parent); 3684 3685 // Retrieve this (sub)module from the module map, creating it if 3686 // necessary. 3687 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, 3688 IsFramework, 3689 IsExplicit).first; 3690 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 3691 if (GlobalIndex >= SubmodulesLoaded.size() || 3692 SubmodulesLoaded[GlobalIndex]) { 3693 Error("too many submodules"); 3694 return true; 3695 } 3696 3697 if (!ParentModule) { 3698 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 3699 if (CurFile != F.File) { 3700 if (!Diags.isDiagnosticInFlight()) { 3701 Diag(diag::err_module_file_conflict) 3702 << CurrentModule->getTopLevelModuleName() 3703 << CurFile->getName() 3704 << F.File->getName(); 3705 } 3706 return true; 3707 } 3708 } 3709 3710 CurrentModule->setASTFile(F.File); 3711 } 3712 3713 CurrentModule->IsFromModuleFile = true; 3714 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 3715 CurrentModule->InferSubmodules = InferSubmodules; 3716 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 3717 CurrentModule->InferExportWildcard = InferExportWildcard; 3718 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 3719 if (DeserializationListener) 3720 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 3721 3722 SubmodulesLoaded[GlobalIndex] = CurrentModule; 3723 3724 // Clear out data that will be replaced by what is the module file. 3725 CurrentModule->LinkLibraries.clear(); 3726 CurrentModule->ConfigMacros.clear(); 3727 CurrentModule->UnresolvedConflicts.clear(); 3728 CurrentModule->Conflicts.clear(); 3729 break; 3730 } 3731 3732 case SUBMODULE_UMBRELLA_HEADER: { 3733 if (First) { 3734 Error("missing submodule metadata record at beginning of block"); 3735 return true; 3736 } 3737 3738 if (!CurrentModule) 3739 break; 3740 3741 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 3742 if (!CurrentModule->getUmbrellaHeader()) 3743 ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 3744 else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 3745 Error("mismatched umbrella headers in submodule"); 3746 return true; 3747 } 3748 } 3749 break; 3750 } 3751 3752 case SUBMODULE_HEADER: { 3753 if (First) { 3754 Error("missing submodule metadata record at beginning of block"); 3755 return true; 3756 } 3757 3758 if (!CurrentModule) 3759 break; 3760 3761 // We lazily associate headers with their modules via the HeaderInfoTable. 3762 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3763 // of complete filenames or remove it entirely. 3764 break; 3765 } 3766 3767 case SUBMODULE_EXCLUDED_HEADER: { 3768 if (First) { 3769 Error("missing submodule metadata record at beginning of block"); 3770 return true; 3771 } 3772 3773 if (!CurrentModule) 3774 break; 3775 3776 // We lazily associate headers with their modules via the HeaderInfoTable. 3777 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3778 // of complete filenames or remove it entirely. 3779 break; 3780 } 3781 3782 case SUBMODULE_PRIVATE_HEADER: { 3783 if (First) { 3784 Error("missing submodule metadata record at beginning of block"); 3785 return true; 3786 } 3787 3788 if (!CurrentModule) 3789 break; 3790 3791 // We lazily associate headers with their modules via the HeaderInfoTable. 3792 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3793 // of complete filenames or remove it entirely. 3794 break; 3795 } 3796 3797 case SUBMODULE_TOPHEADER: { 3798 if (First) { 3799 Error("missing submodule metadata record at beginning of block"); 3800 return true; 3801 } 3802 3803 if (!CurrentModule) 3804 break; 3805 3806 CurrentModule->addTopHeaderFilename(Blob); 3807 break; 3808 } 3809 3810 case SUBMODULE_UMBRELLA_DIR: { 3811 if (First) { 3812 Error("missing submodule metadata record at beginning of block"); 3813 return true; 3814 } 3815 3816 if (!CurrentModule) 3817 break; 3818 3819 if (const DirectoryEntry *Umbrella 3820 = PP.getFileManager().getDirectory(Blob)) { 3821 if (!CurrentModule->getUmbrellaDir()) 3822 ModMap.setUmbrellaDir(CurrentModule, Umbrella); 3823 else if (CurrentModule->getUmbrellaDir() != Umbrella) { 3824 Error("mismatched umbrella directories in submodule"); 3825 return true; 3826 } 3827 } 3828 break; 3829 } 3830 3831 case SUBMODULE_METADATA: { 3832 if (!First) { 3833 Error("submodule metadata record not at beginning of block"); 3834 return true; 3835 } 3836 First = false; 3837 3838 F.BaseSubmoduleID = getTotalNumSubmodules(); 3839 F.LocalNumSubmodules = Record[0]; 3840 unsigned LocalBaseSubmoduleID = Record[1]; 3841 if (F.LocalNumSubmodules > 0) { 3842 // Introduce the global -> local mapping for submodules within this 3843 // module. 3844 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 3845 3846 // Introduce the local -> global mapping for submodules within this 3847 // module. 3848 F.SubmoduleRemap.insertOrReplace( 3849 std::make_pair(LocalBaseSubmoduleID, 3850 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 3851 3852 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 3853 } 3854 break; 3855 } 3856 3857 case SUBMODULE_IMPORTS: { 3858 if (First) { 3859 Error("missing submodule metadata record at beginning of block"); 3860 return true; 3861 } 3862 3863 if (!CurrentModule) 3864 break; 3865 3866 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 3867 UnresolvedModuleRef Unresolved; 3868 Unresolved.File = &F; 3869 Unresolved.Mod = CurrentModule; 3870 Unresolved.ID = Record[Idx]; 3871 Unresolved.Kind = UnresolvedModuleRef::Import; 3872 Unresolved.IsWildcard = false; 3873 UnresolvedModuleRefs.push_back(Unresolved); 3874 } 3875 break; 3876 } 3877 3878 case SUBMODULE_EXPORTS: { 3879 if (First) { 3880 Error("missing submodule metadata record at beginning of block"); 3881 return true; 3882 } 3883 3884 if (!CurrentModule) 3885 break; 3886 3887 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 3888 UnresolvedModuleRef Unresolved; 3889 Unresolved.File = &F; 3890 Unresolved.Mod = CurrentModule; 3891 Unresolved.ID = Record[Idx]; 3892 Unresolved.Kind = UnresolvedModuleRef::Export; 3893 Unresolved.IsWildcard = Record[Idx + 1]; 3894 UnresolvedModuleRefs.push_back(Unresolved); 3895 } 3896 3897 // Once we've loaded the set of exports, there's no reason to keep 3898 // the parsed, unresolved exports around. 3899 CurrentModule->UnresolvedExports.clear(); 3900 break; 3901 } 3902 case SUBMODULE_REQUIRES: { 3903 if (First) { 3904 Error("missing submodule metadata record at beginning of block"); 3905 return true; 3906 } 3907 3908 if (!CurrentModule) 3909 break; 3910 3911 CurrentModule->addRequirement(Blob, Context.getLangOpts(), 3912 Context.getTargetInfo()); 3913 break; 3914 } 3915 3916 case SUBMODULE_LINK_LIBRARY: 3917 if (First) { 3918 Error("missing submodule metadata record at beginning of block"); 3919 return true; 3920 } 3921 3922 if (!CurrentModule) 3923 break; 3924 3925 CurrentModule->LinkLibraries.push_back( 3926 Module::LinkLibrary(Blob, Record[0])); 3927 break; 3928 3929 case SUBMODULE_CONFIG_MACRO: 3930 if (First) { 3931 Error("missing submodule metadata record at beginning of block"); 3932 return true; 3933 } 3934 3935 if (!CurrentModule) 3936 break; 3937 3938 CurrentModule->ConfigMacros.push_back(Blob.str()); 3939 break; 3940 3941 case SUBMODULE_CONFLICT: { 3942 if (First) { 3943 Error("missing submodule metadata record at beginning of block"); 3944 return true; 3945 } 3946 3947 if (!CurrentModule) 3948 break; 3949 3950 UnresolvedModuleRef Unresolved; 3951 Unresolved.File = &F; 3952 Unresolved.Mod = CurrentModule; 3953 Unresolved.ID = Record[0]; 3954 Unresolved.Kind = UnresolvedModuleRef::Conflict; 3955 Unresolved.IsWildcard = false; 3956 Unresolved.String = Blob; 3957 UnresolvedModuleRefs.push_back(Unresolved); 3958 break; 3959 } 3960 } 3961 } 3962 } 3963 3964 /// \brief Parse the record that corresponds to a LangOptions data 3965 /// structure. 3966 /// 3967 /// This routine parses the language options from the AST file and then gives 3968 /// them to the AST listener if one is set. 3969 /// 3970 /// \returns true if the listener deems the file unacceptable, false otherwise. 3971 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 3972 bool Complain, 3973 ASTReaderListener &Listener) { 3974 LangOptions LangOpts; 3975 unsigned Idx = 0; 3976 #define LANGOPT(Name, Bits, Default, Description) \ 3977 LangOpts.Name = Record[Idx++]; 3978 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 3979 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 3980 #include "clang/Basic/LangOptions.def" 3981 #define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++]; 3982 #include "clang/Basic/Sanitizers.def" 3983 3984 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 3985 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 3986 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 3987 3988 unsigned Length = Record[Idx++]; 3989 LangOpts.CurrentModule.assign(Record.begin() + Idx, 3990 Record.begin() + Idx + Length); 3991 3992 Idx += Length; 3993 3994 // Comment options. 3995 for (unsigned N = Record[Idx++]; N; --N) { 3996 LangOpts.CommentOpts.BlockCommandNames.push_back( 3997 ReadString(Record, Idx)); 3998 } 3999 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 4000 4001 return Listener.ReadLanguageOptions(LangOpts, Complain); 4002 } 4003 4004 bool ASTReader::ParseTargetOptions(const RecordData &Record, 4005 bool Complain, 4006 ASTReaderListener &Listener) { 4007 unsigned Idx = 0; 4008 TargetOptions TargetOpts; 4009 TargetOpts.Triple = ReadString(Record, Idx); 4010 TargetOpts.CPU = ReadString(Record, Idx); 4011 TargetOpts.ABI = ReadString(Record, Idx); 4012 TargetOpts.CXXABI = ReadString(Record, Idx); 4013 TargetOpts.LinkerVersion = ReadString(Record, Idx); 4014 for (unsigned N = Record[Idx++]; N; --N) { 4015 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4016 } 4017 for (unsigned N = Record[Idx++]; N; --N) { 4018 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4019 } 4020 4021 return Listener.ReadTargetOptions(TargetOpts, Complain); 4022 } 4023 4024 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4025 ASTReaderListener &Listener) { 4026 DiagnosticOptions DiagOpts; 4027 unsigned Idx = 0; 4028 #define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++]; 4029 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4030 DiagOpts.set##Name(static_cast<Type>(Record[Idx++])); 4031 #include "clang/Basic/DiagnosticOptions.def" 4032 4033 for (unsigned N = Record[Idx++]; N; --N) { 4034 DiagOpts.Warnings.push_back(ReadString(Record, Idx)); 4035 } 4036 4037 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4038 } 4039 4040 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4041 ASTReaderListener &Listener) { 4042 FileSystemOptions FSOpts; 4043 unsigned Idx = 0; 4044 FSOpts.WorkingDir = ReadString(Record, Idx); 4045 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4046 } 4047 4048 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4049 bool Complain, 4050 ASTReaderListener &Listener) { 4051 HeaderSearchOptions HSOpts; 4052 unsigned Idx = 0; 4053 HSOpts.Sysroot = ReadString(Record, Idx); 4054 4055 // Include entries. 4056 for (unsigned N = Record[Idx++]; N; --N) { 4057 std::string Path = ReadString(Record, Idx); 4058 frontend::IncludeDirGroup Group 4059 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4060 bool IsFramework = Record[Idx++]; 4061 bool IgnoreSysRoot = Record[Idx++]; 4062 HSOpts.UserEntries.push_back( 4063 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 4064 } 4065 4066 // System header prefixes. 4067 for (unsigned N = Record[Idx++]; N; --N) { 4068 std::string Prefix = ReadString(Record, Idx); 4069 bool IsSystemHeader = Record[Idx++]; 4070 HSOpts.SystemHeaderPrefixes.push_back( 4071 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 4072 } 4073 4074 HSOpts.ResourceDir = ReadString(Record, Idx); 4075 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4076 HSOpts.DisableModuleHash = Record[Idx++]; 4077 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4078 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4079 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4080 HSOpts.UseLibcxx = Record[Idx++]; 4081 4082 return Listener.ReadHeaderSearchOptions(HSOpts, Complain); 4083 } 4084 4085 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4086 bool Complain, 4087 ASTReaderListener &Listener, 4088 std::string &SuggestedPredefines) { 4089 PreprocessorOptions PPOpts; 4090 unsigned Idx = 0; 4091 4092 // Macro definitions/undefs 4093 for (unsigned N = Record[Idx++]; N; --N) { 4094 std::string Macro = ReadString(Record, Idx); 4095 bool IsUndef = Record[Idx++]; 4096 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4097 } 4098 4099 // Includes 4100 for (unsigned N = Record[Idx++]; N; --N) { 4101 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4102 } 4103 4104 // Macro Includes 4105 for (unsigned N = Record[Idx++]; N; --N) { 4106 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4107 } 4108 4109 PPOpts.UsePredefines = Record[Idx++]; 4110 PPOpts.DetailedRecord = Record[Idx++]; 4111 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4112 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4113 PPOpts.ObjCXXARCStandardLibrary = 4114 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4115 SuggestedPredefines.clear(); 4116 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4117 SuggestedPredefines); 4118 } 4119 4120 std::pair<ModuleFile *, unsigned> 4121 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4122 GlobalPreprocessedEntityMapType::iterator 4123 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4124 assert(I != GlobalPreprocessedEntityMap.end() && 4125 "Corrupted global preprocessed entity map"); 4126 ModuleFile *M = I->second; 4127 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4128 return std::make_pair(M, LocalIndex); 4129 } 4130 4131 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 4132 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4133 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4134 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4135 Mod.NumPreprocessedEntities); 4136 4137 return std::make_pair(PreprocessingRecord::iterator(), 4138 PreprocessingRecord::iterator()); 4139 } 4140 4141 std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator> 4142 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4143 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4144 ModuleDeclIterator(this, &Mod, 4145 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4146 } 4147 4148 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4149 PreprocessedEntityID PPID = Index+1; 4150 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4151 ModuleFile &M = *PPInfo.first; 4152 unsigned LocalIndex = PPInfo.second; 4153 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4154 4155 if (!PP.getPreprocessingRecord()) { 4156 Error("no preprocessing record"); 4157 return 0; 4158 } 4159 4160 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4161 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4162 4163 llvm::BitstreamEntry Entry = 4164 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4165 if (Entry.Kind != llvm::BitstreamEntry::Record) 4166 return 0; 4167 4168 // Read the record. 4169 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 4170 ReadSourceLocation(M, PPOffs.End)); 4171 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4172 StringRef Blob; 4173 RecordData Record; 4174 PreprocessorDetailRecordTypes RecType = 4175 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4176 Entry.ID, Record, &Blob); 4177 switch (RecType) { 4178 case PPD_MACRO_EXPANSION: { 4179 bool isBuiltin = Record[0]; 4180 IdentifierInfo *Name = 0; 4181 MacroDefinition *Def = 0; 4182 if (isBuiltin) 4183 Name = getLocalIdentifier(M, Record[1]); 4184 else { 4185 PreprocessedEntityID 4186 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 4187 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 4188 } 4189 4190 MacroExpansion *ME; 4191 if (isBuiltin) 4192 ME = new (PPRec) MacroExpansion(Name, Range); 4193 else 4194 ME = new (PPRec) MacroExpansion(Def, Range); 4195 4196 return ME; 4197 } 4198 4199 case PPD_MACRO_DEFINITION: { 4200 // Decode the identifier info and then check again; if the macro is 4201 // still defined and associated with the identifier, 4202 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4203 MacroDefinition *MD 4204 = new (PPRec) MacroDefinition(II, Range); 4205 4206 if (DeserializationListener) 4207 DeserializationListener->MacroDefinitionRead(PPID, MD); 4208 4209 return MD; 4210 } 4211 4212 case PPD_INCLUSION_DIRECTIVE: { 4213 const char *FullFileNameStart = Blob.data() + Record[0]; 4214 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4215 const FileEntry *File = 0; 4216 if (!FullFileName.empty()) 4217 File = PP.getFileManager().getFile(FullFileName); 4218 4219 // FIXME: Stable encoding 4220 InclusionDirective::InclusionKind Kind 4221 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4222 InclusionDirective *ID 4223 = new (PPRec) InclusionDirective(PPRec, Kind, 4224 StringRef(Blob.data(), Record[0]), 4225 Record[1], Record[3], 4226 File, 4227 Range); 4228 return ID; 4229 } 4230 } 4231 4232 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4233 } 4234 4235 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4236 /// preprocessed entities or the entities it contains are not the ones we are 4237 /// looking for. Find the next module that contains entities and return the ID 4238 /// of the first entry. 4239 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 4240 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 4241 ++SLocMapI; 4242 for (GlobalSLocOffsetMapType::const_iterator 4243 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 4244 ModuleFile &M = *SLocMapI->second; 4245 if (M.NumPreprocessedEntities) 4246 return M.BasePreprocessedEntityID; 4247 } 4248 4249 return getTotalNumPreprocessedEntities(); 4250 } 4251 4252 namespace { 4253 4254 template <unsigned PPEntityOffset::*PPLoc> 4255 struct PPEntityComp { 4256 const ASTReader &Reader; 4257 ModuleFile &M; 4258 4259 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 4260 4261 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 4262 SourceLocation LHS = getLoc(L); 4263 SourceLocation RHS = getLoc(R); 4264 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4265 } 4266 4267 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 4268 SourceLocation LHS = getLoc(L); 4269 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4270 } 4271 4272 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 4273 SourceLocation RHS = getLoc(R); 4274 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4275 } 4276 4277 SourceLocation getLoc(const PPEntityOffset &PPE) const { 4278 return Reader.ReadSourceLocation(M, PPE.*PPLoc); 4279 } 4280 }; 4281 4282 } 4283 4284 /// \brief Returns the first preprocessed entity ID that ends after \arg BLoc. 4285 PreprocessedEntityID 4286 ASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const { 4287 if (SourceMgr.isLocalSourceLocation(BLoc)) 4288 return getTotalNumPreprocessedEntities(); 4289 4290 GlobalSLocOffsetMapType::const_iterator 4291 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 4292 BLoc.getOffset() - 1); 4293 assert(SLocMapI != GlobalSLocOffsetMap.end() && 4294 "Corrupted global sloc offset map"); 4295 4296 if (SLocMapI->second->NumPreprocessedEntities == 0) 4297 return findNextPreprocessedEntity(SLocMapI); 4298 4299 ModuleFile &M = *SLocMapI->second; 4300 typedef const PPEntityOffset *pp_iterator; 4301 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 4302 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 4303 4304 size_t Count = M.NumPreprocessedEntities; 4305 size_t Half; 4306 pp_iterator First = pp_begin; 4307 pp_iterator PPI; 4308 4309 // Do a binary search manually instead of using std::lower_bound because 4310 // The end locations of entities may be unordered (when a macro expansion 4311 // is inside another macro argument), but for this case it is not important 4312 // whether we get the first macro expansion or its containing macro. 4313 while (Count > 0) { 4314 Half = Count/2; 4315 PPI = First; 4316 std::advance(PPI, Half); 4317 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 4318 BLoc)){ 4319 First = PPI; 4320 ++First; 4321 Count = Count - Half - 1; 4322 } else 4323 Count = Half; 4324 } 4325 4326 if (PPI == pp_end) 4327 return findNextPreprocessedEntity(SLocMapI); 4328 4329 return M.BasePreprocessedEntityID + (PPI - pp_begin); 4330 } 4331 4332 /// \brief Returns the first preprocessed entity ID that begins after \arg ELoc. 4333 PreprocessedEntityID 4334 ASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const { 4335 if (SourceMgr.isLocalSourceLocation(ELoc)) 4336 return getTotalNumPreprocessedEntities(); 4337 4338 GlobalSLocOffsetMapType::const_iterator 4339 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 4340 ELoc.getOffset() - 1); 4341 assert(SLocMapI != GlobalSLocOffsetMap.end() && 4342 "Corrupted global sloc offset map"); 4343 4344 if (SLocMapI->second->NumPreprocessedEntities == 0) 4345 return findNextPreprocessedEntity(SLocMapI); 4346 4347 ModuleFile &M = *SLocMapI->second; 4348 typedef const PPEntityOffset *pp_iterator; 4349 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 4350 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 4351 pp_iterator PPI = 4352 std::upper_bound(pp_begin, pp_end, ELoc, 4353 PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 4354 4355 if (PPI == pp_end) 4356 return findNextPreprocessedEntity(SLocMapI); 4357 4358 return M.BasePreprocessedEntityID + (PPI - pp_begin); 4359 } 4360 4361 /// \brief Returns a pair of [Begin, End) indices of preallocated 4362 /// preprocessed entities that \arg Range encompasses. 4363 std::pair<unsigned, unsigned> 4364 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 4365 if (Range.isInvalid()) 4366 return std::make_pair(0,0); 4367 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 4368 4369 PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin()); 4370 PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd()); 4371 return std::make_pair(BeginID, EndID); 4372 } 4373 4374 /// \brief Optionally returns true or false if the preallocated preprocessed 4375 /// entity with index \arg Index came from file \arg FID. 4376 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 4377 FileID FID) { 4378 if (FID.isInvalid()) 4379 return false; 4380 4381 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4382 ModuleFile &M = *PPInfo.first; 4383 unsigned LocalIndex = PPInfo.second; 4384 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4385 4386 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 4387 if (Loc.isInvalid()) 4388 return false; 4389 4390 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 4391 return true; 4392 else 4393 return false; 4394 } 4395 4396 namespace { 4397 /// \brief Visitor used to search for information about a header file. 4398 class HeaderFileInfoVisitor { 4399 const FileEntry *FE; 4400 4401 Optional<HeaderFileInfo> HFI; 4402 4403 public: 4404 explicit HeaderFileInfoVisitor(const FileEntry *FE) 4405 : FE(FE) { } 4406 4407 static bool visit(ModuleFile &M, void *UserData) { 4408 HeaderFileInfoVisitor *This 4409 = static_cast<HeaderFileInfoVisitor *>(UserData); 4410 4411 HeaderFileInfoLookupTable *Table 4412 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 4413 if (!Table) 4414 return false; 4415 4416 // Look in the on-disk hash table for an entry for this file name. 4417 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE); 4418 if (Pos == Table->end()) 4419 return false; 4420 4421 This->HFI = *Pos; 4422 return true; 4423 } 4424 4425 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 4426 }; 4427 } 4428 4429 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 4430 HeaderFileInfoVisitor Visitor(FE); 4431 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 4432 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 4433 return *HFI; 4434 4435 return HeaderFileInfo(); 4436 } 4437 4438 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 4439 // FIXME: Make it work properly with modules. 4440 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 4441 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 4442 ModuleFile &F = *(*I); 4443 unsigned Idx = 0; 4444 DiagStates.clear(); 4445 assert(!Diag.DiagStates.empty()); 4446 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 4447 while (Idx < F.PragmaDiagMappings.size()) { 4448 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 4449 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 4450 if (DiagStateID != 0) { 4451 Diag.DiagStatePoints.push_back( 4452 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 4453 FullSourceLoc(Loc, SourceMgr))); 4454 continue; 4455 } 4456 4457 assert(DiagStateID == 0); 4458 // A new DiagState was created here. 4459 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 4460 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 4461 DiagStates.push_back(NewState); 4462 Diag.DiagStatePoints.push_back( 4463 DiagnosticsEngine::DiagStatePoint(NewState, 4464 FullSourceLoc(Loc, SourceMgr))); 4465 while (1) { 4466 assert(Idx < F.PragmaDiagMappings.size() && 4467 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 4468 if (Idx >= F.PragmaDiagMappings.size()) { 4469 break; // Something is messed up but at least avoid infinite loop in 4470 // release build. 4471 } 4472 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 4473 if (DiagID == (unsigned)-1) { 4474 break; // no more diag/map pairs for this location. 4475 } 4476 diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++]; 4477 DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc); 4478 Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo); 4479 } 4480 } 4481 } 4482 } 4483 4484 /// \brief Get the correct cursor and offset for loading a type. 4485 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 4486 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 4487 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 4488 ModuleFile *M = I->second; 4489 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 4490 } 4491 4492 /// \brief Read and return the type with the given index.. 4493 /// 4494 /// The index is the type ID, shifted and minus the number of predefs. This 4495 /// routine actually reads the record corresponding to the type at the given 4496 /// location. It is a helper routine for GetType, which deals with reading type 4497 /// IDs. 4498 QualType ASTReader::readTypeRecord(unsigned Index) { 4499 RecordLocation Loc = TypeCursorForIndex(Index); 4500 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 4501 4502 // Keep track of where we are in the stream, then jump back there 4503 // after reading this type. 4504 SavedStreamPosition SavedPosition(DeclsCursor); 4505 4506 ReadingKindTracker ReadingKind(Read_Type, *this); 4507 4508 // Note that we are loading a type record. 4509 Deserializing AType(this); 4510 4511 unsigned Idx = 0; 4512 DeclsCursor.JumpToBit(Loc.Offset); 4513 RecordData Record; 4514 unsigned Code = DeclsCursor.ReadCode(); 4515 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 4516 case TYPE_EXT_QUAL: { 4517 if (Record.size() != 2) { 4518 Error("Incorrect encoding of extended qualifier type"); 4519 return QualType(); 4520 } 4521 QualType Base = readType(*Loc.F, Record, Idx); 4522 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 4523 return Context.getQualifiedType(Base, Quals); 4524 } 4525 4526 case TYPE_COMPLEX: { 4527 if (Record.size() != 1) { 4528 Error("Incorrect encoding of complex type"); 4529 return QualType(); 4530 } 4531 QualType ElemType = readType(*Loc.F, Record, Idx); 4532 return Context.getComplexType(ElemType); 4533 } 4534 4535 case TYPE_POINTER: { 4536 if (Record.size() != 1) { 4537 Error("Incorrect encoding of pointer type"); 4538 return QualType(); 4539 } 4540 QualType PointeeType = readType(*Loc.F, Record, Idx); 4541 return Context.getPointerType(PointeeType); 4542 } 4543 4544 case TYPE_DECAYED: { 4545 if (Record.size() != 1) { 4546 Error("Incorrect encoding of decayed type"); 4547 return QualType(); 4548 } 4549 QualType OriginalType = readType(*Loc.F, Record, Idx); 4550 QualType DT = Context.getAdjustedParameterType(OriginalType); 4551 if (!isa<DecayedType>(DT)) 4552 Error("Decayed type does not decay"); 4553 return DT; 4554 } 4555 4556 case TYPE_BLOCK_POINTER: { 4557 if (Record.size() != 1) { 4558 Error("Incorrect encoding of block pointer type"); 4559 return QualType(); 4560 } 4561 QualType PointeeType = readType(*Loc.F, Record, Idx); 4562 return Context.getBlockPointerType(PointeeType); 4563 } 4564 4565 case TYPE_LVALUE_REFERENCE: { 4566 if (Record.size() != 2) { 4567 Error("Incorrect encoding of lvalue reference type"); 4568 return QualType(); 4569 } 4570 QualType PointeeType = readType(*Loc.F, Record, Idx); 4571 return Context.getLValueReferenceType(PointeeType, Record[1]); 4572 } 4573 4574 case TYPE_RVALUE_REFERENCE: { 4575 if (Record.size() != 1) { 4576 Error("Incorrect encoding of rvalue reference type"); 4577 return QualType(); 4578 } 4579 QualType PointeeType = readType(*Loc.F, Record, Idx); 4580 return Context.getRValueReferenceType(PointeeType); 4581 } 4582 4583 case TYPE_MEMBER_POINTER: { 4584 if (Record.size() != 2) { 4585 Error("Incorrect encoding of member pointer type"); 4586 return QualType(); 4587 } 4588 QualType PointeeType = readType(*Loc.F, Record, Idx); 4589 QualType ClassType = readType(*Loc.F, Record, Idx); 4590 if (PointeeType.isNull() || ClassType.isNull()) 4591 return QualType(); 4592 4593 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 4594 } 4595 4596 case TYPE_CONSTANT_ARRAY: { 4597 QualType ElementType = readType(*Loc.F, Record, Idx); 4598 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4599 unsigned IndexTypeQuals = Record[2]; 4600 unsigned Idx = 3; 4601 llvm::APInt Size = ReadAPInt(Record, Idx); 4602 return Context.getConstantArrayType(ElementType, Size, 4603 ASM, IndexTypeQuals); 4604 } 4605 4606 case TYPE_INCOMPLETE_ARRAY: { 4607 QualType ElementType = readType(*Loc.F, Record, Idx); 4608 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4609 unsigned IndexTypeQuals = Record[2]; 4610 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 4611 } 4612 4613 case TYPE_VARIABLE_ARRAY: { 4614 QualType ElementType = readType(*Loc.F, Record, Idx); 4615 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4616 unsigned IndexTypeQuals = Record[2]; 4617 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 4618 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 4619 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 4620 ASM, IndexTypeQuals, 4621 SourceRange(LBLoc, RBLoc)); 4622 } 4623 4624 case TYPE_VECTOR: { 4625 if (Record.size() != 3) { 4626 Error("incorrect encoding of vector type in AST file"); 4627 return QualType(); 4628 } 4629 4630 QualType ElementType = readType(*Loc.F, Record, Idx); 4631 unsigned NumElements = Record[1]; 4632 unsigned VecKind = Record[2]; 4633 return Context.getVectorType(ElementType, NumElements, 4634 (VectorType::VectorKind)VecKind); 4635 } 4636 4637 case TYPE_EXT_VECTOR: { 4638 if (Record.size() != 3) { 4639 Error("incorrect encoding of extended vector type in AST file"); 4640 return QualType(); 4641 } 4642 4643 QualType ElementType = readType(*Loc.F, Record, Idx); 4644 unsigned NumElements = Record[1]; 4645 return Context.getExtVectorType(ElementType, NumElements); 4646 } 4647 4648 case TYPE_FUNCTION_NO_PROTO: { 4649 if (Record.size() != 6) { 4650 Error("incorrect encoding of no-proto function type"); 4651 return QualType(); 4652 } 4653 QualType ResultType = readType(*Loc.F, Record, Idx); 4654 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 4655 (CallingConv)Record[4], Record[5]); 4656 return Context.getFunctionNoProtoType(ResultType, Info); 4657 } 4658 4659 case TYPE_FUNCTION_PROTO: { 4660 QualType ResultType = readType(*Loc.F, Record, Idx); 4661 4662 FunctionProtoType::ExtProtoInfo EPI; 4663 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 4664 /*hasregparm*/ Record[2], 4665 /*regparm*/ Record[3], 4666 static_cast<CallingConv>(Record[4]), 4667 /*produces*/ Record[5]); 4668 4669 unsigned Idx = 6; 4670 unsigned NumParams = Record[Idx++]; 4671 SmallVector<QualType, 16> ParamTypes; 4672 for (unsigned I = 0; I != NumParams; ++I) 4673 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 4674 4675 EPI.Variadic = Record[Idx++]; 4676 EPI.HasTrailingReturn = Record[Idx++]; 4677 EPI.TypeQuals = Record[Idx++]; 4678 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 4679 ExceptionSpecificationType EST = 4680 static_cast<ExceptionSpecificationType>(Record[Idx++]); 4681 EPI.ExceptionSpecType = EST; 4682 SmallVector<QualType, 2> Exceptions; 4683 if (EST == EST_Dynamic) { 4684 EPI.NumExceptions = Record[Idx++]; 4685 for (unsigned I = 0; I != EPI.NumExceptions; ++I) 4686 Exceptions.push_back(readType(*Loc.F, Record, Idx)); 4687 EPI.Exceptions = Exceptions.data(); 4688 } else if (EST == EST_ComputedNoexcept) { 4689 EPI.NoexceptExpr = ReadExpr(*Loc.F); 4690 } else if (EST == EST_Uninstantiated) { 4691 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4692 EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4693 } else if (EST == EST_Unevaluated) { 4694 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4695 } 4696 return Context.getFunctionType(ResultType, ParamTypes, EPI); 4697 } 4698 4699 case TYPE_UNRESOLVED_USING: { 4700 unsigned Idx = 0; 4701 return Context.getTypeDeclType( 4702 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 4703 } 4704 4705 case TYPE_TYPEDEF: { 4706 if (Record.size() != 2) { 4707 Error("incorrect encoding of typedef type"); 4708 return QualType(); 4709 } 4710 unsigned Idx = 0; 4711 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 4712 QualType Canonical = readType(*Loc.F, Record, Idx); 4713 if (!Canonical.isNull()) 4714 Canonical = Context.getCanonicalType(Canonical); 4715 return Context.getTypedefType(Decl, Canonical); 4716 } 4717 4718 case TYPE_TYPEOF_EXPR: 4719 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 4720 4721 case TYPE_TYPEOF: { 4722 if (Record.size() != 1) { 4723 Error("incorrect encoding of typeof(type) in AST file"); 4724 return QualType(); 4725 } 4726 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4727 return Context.getTypeOfType(UnderlyingType); 4728 } 4729 4730 case TYPE_DECLTYPE: { 4731 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4732 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 4733 } 4734 4735 case TYPE_UNARY_TRANSFORM: { 4736 QualType BaseType = readType(*Loc.F, Record, Idx); 4737 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4738 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 4739 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 4740 } 4741 4742 case TYPE_AUTO: { 4743 QualType Deduced = readType(*Loc.F, Record, Idx); 4744 bool IsDecltypeAuto = Record[Idx++]; 4745 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 4746 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent); 4747 } 4748 4749 case TYPE_RECORD: { 4750 if (Record.size() != 2) { 4751 Error("incorrect encoding of record type"); 4752 return QualType(); 4753 } 4754 unsigned Idx = 0; 4755 bool IsDependent = Record[Idx++]; 4756 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 4757 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 4758 QualType T = Context.getRecordType(RD); 4759 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4760 return T; 4761 } 4762 4763 case TYPE_ENUM: { 4764 if (Record.size() != 2) { 4765 Error("incorrect encoding of enum type"); 4766 return QualType(); 4767 } 4768 unsigned Idx = 0; 4769 bool IsDependent = Record[Idx++]; 4770 QualType T 4771 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 4772 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4773 return T; 4774 } 4775 4776 case TYPE_ATTRIBUTED: { 4777 if (Record.size() != 3) { 4778 Error("incorrect encoding of attributed type"); 4779 return QualType(); 4780 } 4781 QualType modifiedType = readType(*Loc.F, Record, Idx); 4782 QualType equivalentType = readType(*Loc.F, Record, Idx); 4783 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 4784 return Context.getAttributedType(kind, modifiedType, equivalentType); 4785 } 4786 4787 case TYPE_PAREN: { 4788 if (Record.size() != 1) { 4789 Error("incorrect encoding of paren type"); 4790 return QualType(); 4791 } 4792 QualType InnerType = readType(*Loc.F, Record, Idx); 4793 return Context.getParenType(InnerType); 4794 } 4795 4796 case TYPE_PACK_EXPANSION: { 4797 if (Record.size() != 2) { 4798 Error("incorrect encoding of pack expansion type"); 4799 return QualType(); 4800 } 4801 QualType Pattern = readType(*Loc.F, Record, Idx); 4802 if (Pattern.isNull()) 4803 return QualType(); 4804 Optional<unsigned> NumExpansions; 4805 if (Record[1]) 4806 NumExpansions = Record[1] - 1; 4807 return Context.getPackExpansionType(Pattern, NumExpansions); 4808 } 4809 4810 case TYPE_ELABORATED: { 4811 unsigned Idx = 0; 4812 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4813 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4814 QualType NamedType = readType(*Loc.F, Record, Idx); 4815 return Context.getElaboratedType(Keyword, NNS, NamedType); 4816 } 4817 4818 case TYPE_OBJC_INTERFACE: { 4819 unsigned Idx = 0; 4820 ObjCInterfaceDecl *ItfD 4821 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 4822 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 4823 } 4824 4825 case TYPE_OBJC_OBJECT: { 4826 unsigned Idx = 0; 4827 QualType Base = readType(*Loc.F, Record, Idx); 4828 unsigned NumProtos = Record[Idx++]; 4829 SmallVector<ObjCProtocolDecl*, 4> Protos; 4830 for (unsigned I = 0; I != NumProtos; ++I) 4831 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 4832 return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 4833 } 4834 4835 case TYPE_OBJC_OBJECT_POINTER: { 4836 unsigned Idx = 0; 4837 QualType Pointee = readType(*Loc.F, Record, Idx); 4838 return Context.getObjCObjectPointerType(Pointee); 4839 } 4840 4841 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 4842 unsigned Idx = 0; 4843 QualType Parm = readType(*Loc.F, Record, Idx); 4844 QualType Replacement = readType(*Loc.F, Record, Idx); 4845 return 4846 Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm), 4847 Replacement); 4848 } 4849 4850 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 4851 unsigned Idx = 0; 4852 QualType Parm = readType(*Loc.F, Record, Idx); 4853 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 4854 return Context.getSubstTemplateTypeParmPackType( 4855 cast<TemplateTypeParmType>(Parm), 4856 ArgPack); 4857 } 4858 4859 case TYPE_INJECTED_CLASS_NAME: { 4860 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 4861 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 4862 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 4863 // for AST reading, too much interdependencies. 4864 return 4865 QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0); 4866 } 4867 4868 case TYPE_TEMPLATE_TYPE_PARM: { 4869 unsigned Idx = 0; 4870 unsigned Depth = Record[Idx++]; 4871 unsigned Index = Record[Idx++]; 4872 bool Pack = Record[Idx++]; 4873 TemplateTypeParmDecl *D 4874 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 4875 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 4876 } 4877 4878 case TYPE_DEPENDENT_NAME: { 4879 unsigned Idx = 0; 4880 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4881 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4882 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 4883 QualType Canon = readType(*Loc.F, Record, Idx); 4884 if (!Canon.isNull()) 4885 Canon = Context.getCanonicalType(Canon); 4886 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 4887 } 4888 4889 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 4890 unsigned Idx = 0; 4891 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4892 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4893 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 4894 unsigned NumArgs = Record[Idx++]; 4895 SmallVector<TemplateArgument, 8> Args; 4896 Args.reserve(NumArgs); 4897 while (NumArgs--) 4898 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 4899 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 4900 Args.size(), Args.data()); 4901 } 4902 4903 case TYPE_DEPENDENT_SIZED_ARRAY: { 4904 unsigned Idx = 0; 4905 4906 // ArrayType 4907 QualType ElementType = readType(*Loc.F, Record, Idx); 4908 ArrayType::ArraySizeModifier ASM 4909 = (ArrayType::ArraySizeModifier)Record[Idx++]; 4910 unsigned IndexTypeQuals = Record[Idx++]; 4911 4912 // DependentSizedArrayType 4913 Expr *NumElts = ReadExpr(*Loc.F); 4914 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 4915 4916 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 4917 IndexTypeQuals, Brackets); 4918 } 4919 4920 case TYPE_TEMPLATE_SPECIALIZATION: { 4921 unsigned Idx = 0; 4922 bool IsDependent = Record[Idx++]; 4923 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 4924 SmallVector<TemplateArgument, 8> Args; 4925 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 4926 QualType Underlying = readType(*Loc.F, Record, Idx); 4927 QualType T; 4928 if (Underlying.isNull()) 4929 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 4930 Args.size()); 4931 else 4932 T = Context.getTemplateSpecializationType(Name, Args.data(), 4933 Args.size(), Underlying); 4934 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4935 return T; 4936 } 4937 4938 case TYPE_ATOMIC: { 4939 if (Record.size() != 1) { 4940 Error("Incorrect encoding of atomic type"); 4941 return QualType(); 4942 } 4943 QualType ValueType = readType(*Loc.F, Record, Idx); 4944 return Context.getAtomicType(ValueType); 4945 } 4946 } 4947 llvm_unreachable("Invalid TypeCode!"); 4948 } 4949 4950 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 4951 ASTReader &Reader; 4952 ModuleFile &F; 4953 const ASTReader::RecordData &Record; 4954 unsigned &Idx; 4955 4956 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 4957 unsigned &I) { 4958 return Reader.ReadSourceLocation(F, R, I); 4959 } 4960 4961 template<typename T> 4962 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 4963 return Reader.ReadDeclAs<T>(F, Record, Idx); 4964 } 4965 4966 public: 4967 TypeLocReader(ASTReader &Reader, ModuleFile &F, 4968 const ASTReader::RecordData &Record, unsigned &Idx) 4969 : Reader(Reader), F(F), Record(Record), Idx(Idx) 4970 { } 4971 4972 // We want compile-time assurance that we've enumerated all of 4973 // these, so unfortunately we have to declare them first, then 4974 // define them out-of-line. 4975 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4976 #define TYPELOC(CLASS, PARENT) \ 4977 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 4978 #include "clang/AST/TypeLocNodes.def" 4979 4980 void VisitFunctionTypeLoc(FunctionTypeLoc); 4981 void VisitArrayTypeLoc(ArrayTypeLoc); 4982 }; 4983 4984 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 4985 // nothing to do 4986 } 4987 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 4988 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 4989 if (TL.needsExtraLocalData()) { 4990 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 4991 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 4992 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 4993 TL.setModeAttr(Record[Idx++]); 4994 } 4995 } 4996 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 4997 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 4998 } 4999 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 5000 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5001 } 5002 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 5003 // nothing to do 5004 } 5005 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5006 TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 5007 } 5008 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5009 TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 5010 } 5011 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5012 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 5013 } 5014 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5015 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5016 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5017 } 5018 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5019 TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 5020 TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 5021 if (Record[Idx++]) 5022 TL.setSizeExpr(Reader.ReadExpr(F)); 5023 else 5024 TL.setSizeExpr(0); 5025 } 5026 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 5027 VisitArrayTypeLoc(TL); 5028 } 5029 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 5030 VisitArrayTypeLoc(TL); 5031 } 5032 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 5033 VisitArrayTypeLoc(TL); 5034 } 5035 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 5036 DependentSizedArrayTypeLoc TL) { 5037 VisitArrayTypeLoc(TL); 5038 } 5039 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 5040 DependentSizedExtVectorTypeLoc TL) { 5041 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5042 } 5043 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 5044 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5045 } 5046 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5047 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5048 } 5049 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5050 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 5051 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5052 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5053 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5054 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 5055 TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 5056 } 5057 } 5058 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 5059 VisitFunctionTypeLoc(TL); 5060 } 5061 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 5062 VisitFunctionTypeLoc(TL); 5063 } 5064 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5065 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5066 } 5067 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5068 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5069 } 5070 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5071 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5072 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5073 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5074 } 5075 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5076 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5077 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5078 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5079 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5080 } 5081 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 5082 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5083 } 5084 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 5085 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5086 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5087 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5088 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5089 } 5090 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 5091 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5092 } 5093 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 5094 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5095 } 5096 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 5097 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5098 } 5099 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 5100 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 5101 if (TL.hasAttrOperand()) { 5102 SourceRange range; 5103 range.setBegin(ReadSourceLocation(Record, Idx)); 5104 range.setEnd(ReadSourceLocation(Record, Idx)); 5105 TL.setAttrOperandParensRange(range); 5106 } 5107 if (TL.hasAttrExprOperand()) { 5108 if (Record[Idx++]) 5109 TL.setAttrExprOperand(Reader.ReadExpr(F)); 5110 else 5111 TL.setAttrExprOperand(0); 5112 } else if (TL.hasAttrEnumOperand()) 5113 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 5114 } 5115 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 5116 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5117 } 5118 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 5119 SubstTemplateTypeParmTypeLoc TL) { 5120 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5121 } 5122 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 5123 SubstTemplateTypeParmPackTypeLoc TL) { 5124 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5125 } 5126 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 5127 TemplateSpecializationTypeLoc TL) { 5128 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5129 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5130 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5131 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5132 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 5133 TL.setArgLocInfo(i, 5134 Reader.GetTemplateArgumentLocInfo(F, 5135 TL.getTypePtr()->getArg(i).getKind(), 5136 Record, Idx)); 5137 } 5138 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 5139 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5140 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5141 } 5142 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 5143 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5144 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5145 } 5146 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 5147 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5148 } 5149 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 5150 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5151 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5152 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5153 } 5154 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 5155 DependentTemplateSpecializationTypeLoc TL) { 5156 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5157 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5158 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5159 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5160 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5161 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5162 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 5163 TL.setArgLocInfo(I, 5164 Reader.GetTemplateArgumentLocInfo(F, 5165 TL.getTypePtr()->getArg(I).getKind(), 5166 Record, Idx)); 5167 } 5168 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 5169 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 5170 } 5171 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 5172 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5173 } 5174 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 5175 TL.setHasBaseTypeAsWritten(Record[Idx++]); 5176 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5177 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5178 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 5179 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 5180 } 5181 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 5182 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5183 } 5184 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 5185 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5186 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5187 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5188 } 5189 5190 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 5191 const RecordData &Record, 5192 unsigned &Idx) { 5193 QualType InfoTy = readType(F, Record, Idx); 5194 if (InfoTy.isNull()) 5195 return 0; 5196 5197 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 5198 TypeLocReader TLR(*this, F, Record, Idx); 5199 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 5200 TLR.Visit(TL); 5201 return TInfo; 5202 } 5203 5204 QualType ASTReader::GetType(TypeID ID) { 5205 unsigned FastQuals = ID & Qualifiers::FastMask; 5206 unsigned Index = ID >> Qualifiers::FastWidth; 5207 5208 if (Index < NUM_PREDEF_TYPE_IDS) { 5209 QualType T; 5210 switch ((PredefinedTypeIDs)Index) { 5211 case PREDEF_TYPE_NULL_ID: return QualType(); 5212 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 5213 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 5214 5215 case PREDEF_TYPE_CHAR_U_ID: 5216 case PREDEF_TYPE_CHAR_S_ID: 5217 // FIXME: Check that the signedness of CharTy is correct! 5218 T = Context.CharTy; 5219 break; 5220 5221 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 5222 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 5223 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 5224 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 5225 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 5226 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 5227 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 5228 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 5229 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 5230 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 5231 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 5232 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 5233 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 5234 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 5235 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 5236 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 5237 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 5238 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 5239 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 5240 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 5241 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 5242 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 5243 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 5244 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 5245 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 5246 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 5247 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 5248 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 5249 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 5250 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 5251 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 5252 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 5253 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 5254 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 5255 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 5256 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 5257 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 5258 5259 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 5260 T = Context.getAutoRRefDeductType(); 5261 break; 5262 5263 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 5264 T = Context.ARCUnbridgedCastTy; 5265 break; 5266 5267 case PREDEF_TYPE_VA_LIST_TAG: 5268 T = Context.getVaListTagType(); 5269 break; 5270 5271 case PREDEF_TYPE_BUILTIN_FN: 5272 T = Context.BuiltinFnTy; 5273 break; 5274 } 5275 5276 assert(!T.isNull() && "Unknown predefined type"); 5277 return T.withFastQualifiers(FastQuals); 5278 } 5279 5280 Index -= NUM_PREDEF_TYPE_IDS; 5281 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 5282 if (TypesLoaded[Index].isNull()) { 5283 TypesLoaded[Index] = readTypeRecord(Index); 5284 if (TypesLoaded[Index].isNull()) 5285 return QualType(); 5286 5287 TypesLoaded[Index]->setFromAST(); 5288 if (DeserializationListener) 5289 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 5290 TypesLoaded[Index]); 5291 } 5292 5293 return TypesLoaded[Index].withFastQualifiers(FastQuals); 5294 } 5295 5296 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 5297 return GetType(getGlobalTypeID(F, LocalID)); 5298 } 5299 5300 serialization::TypeID 5301 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 5302 unsigned FastQuals = LocalID & Qualifiers::FastMask; 5303 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 5304 5305 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 5306 return LocalID; 5307 5308 ContinuousRangeMap<uint32_t, int, 2>::iterator I 5309 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 5310 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 5311 5312 unsigned GlobalIndex = LocalIndex + I->second; 5313 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 5314 } 5315 5316 TemplateArgumentLocInfo 5317 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 5318 TemplateArgument::ArgKind Kind, 5319 const RecordData &Record, 5320 unsigned &Index) { 5321 switch (Kind) { 5322 case TemplateArgument::Expression: 5323 return ReadExpr(F); 5324 case TemplateArgument::Type: 5325 return GetTypeSourceInfo(F, Record, Index); 5326 case TemplateArgument::Template: { 5327 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 5328 Index); 5329 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 5330 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 5331 SourceLocation()); 5332 } 5333 case TemplateArgument::TemplateExpansion: { 5334 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 5335 Index); 5336 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 5337 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 5338 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 5339 EllipsisLoc); 5340 } 5341 case TemplateArgument::Null: 5342 case TemplateArgument::Integral: 5343 case TemplateArgument::Declaration: 5344 case TemplateArgument::NullPtr: 5345 case TemplateArgument::Pack: 5346 // FIXME: Is this right? 5347 return TemplateArgumentLocInfo(); 5348 } 5349 llvm_unreachable("unexpected template argument loc"); 5350 } 5351 5352 TemplateArgumentLoc 5353 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 5354 const RecordData &Record, unsigned &Index) { 5355 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 5356 5357 if (Arg.getKind() == TemplateArgument::Expression) { 5358 if (Record[Index++]) // bool InfoHasSameExpr. 5359 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 5360 } 5361 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 5362 Record, Index)); 5363 } 5364 5365 const ASTTemplateArgumentListInfo* 5366 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 5367 const RecordData &Record, 5368 unsigned &Index) { 5369 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 5370 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 5371 unsigned NumArgsAsWritten = Record[Index++]; 5372 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 5373 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 5374 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 5375 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 5376 } 5377 5378 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 5379 return GetDecl(ID); 5380 } 5381 5382 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record, 5383 unsigned &Idx){ 5384 if (Idx >= Record.size()) 5385 return 0; 5386 5387 unsigned LocalID = Record[Idx++]; 5388 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 5389 } 5390 5391 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 5392 RecordLocation Loc = getLocalBitOffset(Offset); 5393 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 5394 SavedStreamPosition SavedPosition(Cursor); 5395 Cursor.JumpToBit(Loc.Offset); 5396 ReadingKindTracker ReadingKind(Read_Decl, *this); 5397 RecordData Record; 5398 unsigned Code = Cursor.ReadCode(); 5399 unsigned RecCode = Cursor.readRecord(Code, Record); 5400 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 5401 Error("Malformed AST file: missing C++ base specifiers"); 5402 return 0; 5403 } 5404 5405 unsigned Idx = 0; 5406 unsigned NumBases = Record[Idx++]; 5407 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 5408 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 5409 for (unsigned I = 0; I != NumBases; ++I) 5410 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 5411 return Bases; 5412 } 5413 5414 serialization::DeclID 5415 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 5416 if (LocalID < NUM_PREDEF_DECL_IDS) 5417 return LocalID; 5418 5419 ContinuousRangeMap<uint32_t, int, 2>::iterator I 5420 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 5421 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 5422 5423 return LocalID + I->second; 5424 } 5425 5426 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 5427 ModuleFile &M) const { 5428 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 5429 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5430 return &M == I->second; 5431 } 5432 5433 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 5434 if (!D->isFromASTFile()) 5435 return 0; 5436 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 5437 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5438 return I->second; 5439 } 5440 5441 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 5442 if (ID < NUM_PREDEF_DECL_IDS) 5443 return SourceLocation(); 5444 5445 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 5446 5447 if (Index > DeclsLoaded.size()) { 5448 Error("declaration ID out-of-range for AST file"); 5449 return SourceLocation(); 5450 } 5451 5452 if (Decl *D = DeclsLoaded[Index]) 5453 return D->getLocation(); 5454 5455 unsigned RawLocation = 0; 5456 RecordLocation Rec = DeclCursorForID(ID, RawLocation); 5457 return ReadSourceLocation(*Rec.F, RawLocation); 5458 } 5459 5460 Decl *ASTReader::GetDecl(DeclID ID) { 5461 if (ID < NUM_PREDEF_DECL_IDS) { 5462 switch ((PredefinedDeclIDs)ID) { 5463 case PREDEF_DECL_NULL_ID: 5464 return 0; 5465 5466 case PREDEF_DECL_TRANSLATION_UNIT_ID: 5467 return Context.getTranslationUnitDecl(); 5468 5469 case PREDEF_DECL_OBJC_ID_ID: 5470 return Context.getObjCIdDecl(); 5471 5472 case PREDEF_DECL_OBJC_SEL_ID: 5473 return Context.getObjCSelDecl(); 5474 5475 case PREDEF_DECL_OBJC_CLASS_ID: 5476 return Context.getObjCClassDecl(); 5477 5478 case PREDEF_DECL_OBJC_PROTOCOL_ID: 5479 return Context.getObjCProtocolDecl(); 5480 5481 case PREDEF_DECL_INT_128_ID: 5482 return Context.getInt128Decl(); 5483 5484 case PREDEF_DECL_UNSIGNED_INT_128_ID: 5485 return Context.getUInt128Decl(); 5486 5487 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 5488 return Context.getObjCInstanceTypeDecl(); 5489 5490 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 5491 return Context.getBuiltinVaListDecl(); 5492 } 5493 } 5494 5495 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 5496 5497 if (Index >= DeclsLoaded.size()) { 5498 assert(0 && "declaration ID out-of-range for AST file"); 5499 Error("declaration ID out-of-range for AST file"); 5500 return 0; 5501 } 5502 5503 if (!DeclsLoaded[Index]) { 5504 ReadDeclRecord(ID); 5505 if (DeserializationListener) 5506 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 5507 } 5508 5509 return DeclsLoaded[Index]; 5510 } 5511 5512 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 5513 DeclID GlobalID) { 5514 if (GlobalID < NUM_PREDEF_DECL_IDS) 5515 return GlobalID; 5516 5517 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 5518 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5519 ModuleFile *Owner = I->second; 5520 5521 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 5522 = M.GlobalToLocalDeclIDs.find(Owner); 5523 if (Pos == M.GlobalToLocalDeclIDs.end()) 5524 return 0; 5525 5526 return GlobalID - Owner->BaseDeclID + Pos->second; 5527 } 5528 5529 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 5530 const RecordData &Record, 5531 unsigned &Idx) { 5532 if (Idx >= Record.size()) { 5533 Error("Corrupted AST file"); 5534 return 0; 5535 } 5536 5537 return getGlobalDeclID(F, Record[Idx++]); 5538 } 5539 5540 /// \brief Resolve the offset of a statement into a statement. 5541 /// 5542 /// This operation will read a new statement from the external 5543 /// source each time it is called, and is meant to be used via a 5544 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 5545 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 5546 // Switch case IDs are per Decl. 5547 ClearSwitchCaseIDs(); 5548 5549 // Offset here is a global offset across the entire chain. 5550 RecordLocation Loc = getLocalBitOffset(Offset); 5551 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 5552 return ReadStmtFromStream(*Loc.F); 5553 } 5554 5555 namespace { 5556 class FindExternalLexicalDeclsVisitor { 5557 ASTReader &Reader; 5558 const DeclContext *DC; 5559 bool (*isKindWeWant)(Decl::Kind); 5560 5561 SmallVectorImpl<Decl*> &Decls; 5562 bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 5563 5564 public: 5565 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 5566 bool (*isKindWeWant)(Decl::Kind), 5567 SmallVectorImpl<Decl*> &Decls) 5568 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 5569 { 5570 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 5571 PredefsVisited[I] = false; 5572 } 5573 5574 static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 5575 if (Preorder) 5576 return false; 5577 5578 FindExternalLexicalDeclsVisitor *This 5579 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 5580 5581 ModuleFile::DeclContextInfosMap::iterator Info 5582 = M.DeclContextInfos.find(This->DC); 5583 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 5584 return false; 5585 5586 // Load all of the declaration IDs 5587 for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 5588 *IDE = ID + Info->second.NumLexicalDecls; 5589 ID != IDE; ++ID) { 5590 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 5591 continue; 5592 5593 // Don't add predefined declarations to the lexical context more 5594 // than once. 5595 if (ID->second < NUM_PREDEF_DECL_IDS) { 5596 if (This->PredefsVisited[ID->second]) 5597 continue; 5598 5599 This->PredefsVisited[ID->second] = true; 5600 } 5601 5602 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 5603 if (!This->DC->isDeclInLexicalTraversal(D)) 5604 This->Decls.push_back(D); 5605 } 5606 } 5607 5608 return false; 5609 } 5610 }; 5611 } 5612 5613 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 5614 bool (*isKindWeWant)(Decl::Kind), 5615 SmallVectorImpl<Decl*> &Decls) { 5616 // There might be lexical decls in multiple modules, for the TU at 5617 // least. Walk all of the modules in the order they were loaded. 5618 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 5619 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 5620 ++NumLexicalDeclContextsRead; 5621 return ELR_Success; 5622 } 5623 5624 namespace { 5625 5626 class DeclIDComp { 5627 ASTReader &Reader; 5628 ModuleFile &Mod; 5629 5630 public: 5631 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 5632 5633 bool operator()(LocalDeclID L, LocalDeclID R) const { 5634 SourceLocation LHS = getLocation(L); 5635 SourceLocation RHS = getLocation(R); 5636 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5637 } 5638 5639 bool operator()(SourceLocation LHS, LocalDeclID R) const { 5640 SourceLocation RHS = getLocation(R); 5641 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5642 } 5643 5644 bool operator()(LocalDeclID L, SourceLocation RHS) const { 5645 SourceLocation LHS = getLocation(L); 5646 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5647 } 5648 5649 SourceLocation getLocation(LocalDeclID ID) const { 5650 return Reader.getSourceManager().getFileLoc( 5651 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 5652 } 5653 }; 5654 5655 } 5656 5657 void ASTReader::FindFileRegionDecls(FileID File, 5658 unsigned Offset, unsigned Length, 5659 SmallVectorImpl<Decl *> &Decls) { 5660 SourceManager &SM = getSourceManager(); 5661 5662 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 5663 if (I == FileDeclIDs.end()) 5664 return; 5665 5666 FileDeclsInfo &DInfo = I->second; 5667 if (DInfo.Decls.empty()) 5668 return; 5669 5670 SourceLocation 5671 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 5672 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 5673 5674 DeclIDComp DIDComp(*this, *DInfo.Mod); 5675 ArrayRef<serialization::LocalDeclID>::iterator 5676 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 5677 BeginLoc, DIDComp); 5678 if (BeginIt != DInfo.Decls.begin()) 5679 --BeginIt; 5680 5681 // If we are pointing at a top-level decl inside an objc container, we need 5682 // to backtrack until we find it otherwise we will fail to report that the 5683 // region overlaps with an objc container. 5684 while (BeginIt != DInfo.Decls.begin() && 5685 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 5686 ->isTopLevelDeclInObjCContainer()) 5687 --BeginIt; 5688 5689 ArrayRef<serialization::LocalDeclID>::iterator 5690 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 5691 EndLoc, DIDComp); 5692 if (EndIt != DInfo.Decls.end()) 5693 ++EndIt; 5694 5695 for (ArrayRef<serialization::LocalDeclID>::iterator 5696 DIt = BeginIt; DIt != EndIt; ++DIt) 5697 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 5698 } 5699 5700 namespace { 5701 /// \brief ModuleFile visitor used to perform name lookup into a 5702 /// declaration context. 5703 class DeclContextNameLookupVisitor { 5704 ASTReader &Reader; 5705 SmallVectorImpl<const DeclContext *> &Contexts; 5706 DeclarationName Name; 5707 SmallVectorImpl<NamedDecl *> &Decls; 5708 5709 public: 5710 DeclContextNameLookupVisitor(ASTReader &Reader, 5711 SmallVectorImpl<const DeclContext *> &Contexts, 5712 DeclarationName Name, 5713 SmallVectorImpl<NamedDecl *> &Decls) 5714 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { } 5715 5716 static bool visit(ModuleFile &M, void *UserData) { 5717 DeclContextNameLookupVisitor *This 5718 = static_cast<DeclContextNameLookupVisitor *>(UserData); 5719 5720 // Check whether we have any visible declaration information for 5721 // this context in this module. 5722 ModuleFile::DeclContextInfosMap::iterator Info; 5723 bool FoundInfo = false; 5724 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 5725 Info = M.DeclContextInfos.find(This->Contexts[I]); 5726 if (Info != M.DeclContextInfos.end() && 5727 Info->second.NameLookupTableData) { 5728 FoundInfo = true; 5729 break; 5730 } 5731 } 5732 5733 if (!FoundInfo) 5734 return false; 5735 5736 // Look for this name within this module. 5737 ASTDeclContextNameLookupTable *LookupTable = 5738 Info->second.NameLookupTableData; 5739 ASTDeclContextNameLookupTable::iterator Pos 5740 = LookupTable->find(This->Name); 5741 if (Pos == LookupTable->end()) 5742 return false; 5743 5744 bool FoundAnything = false; 5745 ASTDeclContextNameLookupTrait::data_type Data = *Pos; 5746 for (; Data.first != Data.second; ++Data.first) { 5747 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 5748 if (!ND) 5749 continue; 5750 5751 if (ND->getDeclName() != This->Name) { 5752 // A name might be null because the decl's redeclarable part is 5753 // currently read before reading its name. The lookup is triggered by 5754 // building that decl (likely indirectly), and so it is later in the 5755 // sense of "already existing" and can be ignored here. 5756 continue; 5757 } 5758 5759 // Record this declaration. 5760 FoundAnything = true; 5761 This->Decls.push_back(ND); 5762 } 5763 5764 return FoundAnything; 5765 } 5766 }; 5767 } 5768 5769 /// \brief Retrieve the "definitive" module file for the definition of the 5770 /// given declaration context, if there is one. 5771 /// 5772 /// The "definitive" module file is the only place where we need to look to 5773 /// find information about the declarations within the given declaration 5774 /// context. For example, C++ and Objective-C classes, C structs/unions, and 5775 /// Objective-C protocols, categories, and extensions are all defined in a 5776 /// single place in the source code, so they have definitive module files 5777 /// associated with them. C++ namespaces, on the other hand, can have 5778 /// definitions in multiple different module files. 5779 /// 5780 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 5781 /// NDEBUG checking. 5782 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 5783 ASTReader &Reader) { 5784 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 5785 return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 5786 5787 return 0; 5788 } 5789 5790 bool 5791 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 5792 DeclarationName Name) { 5793 assert(DC->hasExternalVisibleStorage() && 5794 "DeclContext has no visible decls in storage"); 5795 if (!Name) 5796 return false; 5797 5798 SmallVector<NamedDecl *, 64> Decls; 5799 5800 // Compute the declaration contexts we need to look into. Multiple such 5801 // declaration contexts occur when two declaration contexts from disjoint 5802 // modules get merged, e.g., when two namespaces with the same name are 5803 // independently defined in separate modules. 5804 SmallVector<const DeclContext *, 2> Contexts; 5805 Contexts.push_back(DC); 5806 5807 if (DC->isNamespace()) { 5808 MergedDeclsMap::iterator Merged 5809 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 5810 if (Merged != MergedDecls.end()) { 5811 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 5812 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 5813 } 5814 } 5815 5816 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls); 5817 5818 // If we can definitively determine which module file to look into, 5819 // only look there. Otherwise, look in all module files. 5820 ModuleFile *Definitive; 5821 if (Contexts.size() == 1 && 5822 (Definitive = getDefinitiveModuleFileFor(DC, *this))) { 5823 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 5824 } else { 5825 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 5826 } 5827 ++NumVisibleDeclContextsRead; 5828 SetExternalVisibleDeclsForName(DC, Name, Decls); 5829 return !Decls.empty(); 5830 } 5831 5832 namespace { 5833 /// \brief ModuleFile visitor used to retrieve all visible names in a 5834 /// declaration context. 5835 class DeclContextAllNamesVisitor { 5836 ASTReader &Reader; 5837 SmallVectorImpl<const DeclContext *> &Contexts; 5838 DeclsMap &Decls; 5839 bool VisitAll; 5840 5841 public: 5842 DeclContextAllNamesVisitor(ASTReader &Reader, 5843 SmallVectorImpl<const DeclContext *> &Contexts, 5844 DeclsMap &Decls, bool VisitAll) 5845 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 5846 5847 static bool visit(ModuleFile &M, void *UserData) { 5848 DeclContextAllNamesVisitor *This 5849 = static_cast<DeclContextAllNamesVisitor *>(UserData); 5850 5851 // Check whether we have any visible declaration information for 5852 // this context in this module. 5853 ModuleFile::DeclContextInfosMap::iterator Info; 5854 bool FoundInfo = false; 5855 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 5856 Info = M.DeclContextInfos.find(This->Contexts[I]); 5857 if (Info != M.DeclContextInfos.end() && 5858 Info->second.NameLookupTableData) { 5859 FoundInfo = true; 5860 break; 5861 } 5862 } 5863 5864 if (!FoundInfo) 5865 return false; 5866 5867 ASTDeclContextNameLookupTable *LookupTable = 5868 Info->second.NameLookupTableData; 5869 bool FoundAnything = false; 5870 for (ASTDeclContextNameLookupTable::data_iterator 5871 I = LookupTable->data_begin(), E = LookupTable->data_end(); 5872 I != E; 5873 ++I) { 5874 ASTDeclContextNameLookupTrait::data_type Data = *I; 5875 for (; Data.first != Data.second; ++Data.first) { 5876 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 5877 *Data.first); 5878 if (!ND) 5879 continue; 5880 5881 // Record this declaration. 5882 FoundAnything = true; 5883 This->Decls[ND->getDeclName()].push_back(ND); 5884 } 5885 } 5886 5887 return FoundAnything && !This->VisitAll; 5888 } 5889 }; 5890 } 5891 5892 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 5893 if (!DC->hasExternalVisibleStorage()) 5894 return; 5895 DeclsMap Decls; 5896 5897 // Compute the declaration contexts we need to look into. Multiple such 5898 // declaration contexts occur when two declaration contexts from disjoint 5899 // modules get merged, e.g., when two namespaces with the same name are 5900 // independently defined in separate modules. 5901 SmallVector<const DeclContext *, 2> Contexts; 5902 Contexts.push_back(DC); 5903 5904 if (DC->isNamespace()) { 5905 MergedDeclsMap::iterator Merged 5906 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 5907 if (Merged != MergedDecls.end()) { 5908 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 5909 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 5910 } 5911 } 5912 5913 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 5914 /*VisitAll=*/DC->isFileContext()); 5915 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 5916 ++NumVisibleDeclContextsRead; 5917 5918 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 5919 SetExternalVisibleDeclsForName(DC, I->first, I->second); 5920 } 5921 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 5922 } 5923 5924 /// \brief Under non-PCH compilation the consumer receives the objc methods 5925 /// before receiving the implementation, and codegen depends on this. 5926 /// We simulate this by deserializing and passing to consumer the methods of the 5927 /// implementation before passing the deserialized implementation decl. 5928 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 5929 ASTConsumer *Consumer) { 5930 assert(ImplD && Consumer); 5931 5932 for (ObjCImplDecl::method_iterator 5933 I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I) 5934 Consumer->HandleInterestingDecl(DeclGroupRef(*I)); 5935 5936 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 5937 } 5938 5939 void ASTReader::PassInterestingDeclsToConsumer() { 5940 assert(Consumer); 5941 while (!InterestingDecls.empty()) { 5942 Decl *D = InterestingDecls.front(); 5943 InterestingDecls.pop_front(); 5944 5945 PassInterestingDeclToConsumer(D); 5946 } 5947 } 5948 5949 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 5950 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 5951 PassObjCImplDeclToConsumer(ImplD, Consumer); 5952 else 5953 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 5954 } 5955 5956 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 5957 this->Consumer = Consumer; 5958 5959 if (!Consumer) 5960 return; 5961 5962 for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) { 5963 // Force deserialization of this decl, which will cause it to be queued for 5964 // passing to the consumer. 5965 GetDecl(ExternalDefinitions[I]); 5966 } 5967 ExternalDefinitions.clear(); 5968 5969 PassInterestingDeclsToConsumer(); 5970 } 5971 5972 void ASTReader::PrintStats() { 5973 std::fprintf(stderr, "*** AST File Statistics:\n"); 5974 5975 unsigned NumTypesLoaded 5976 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 5977 QualType()); 5978 unsigned NumDeclsLoaded 5979 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 5980 (Decl *)0); 5981 unsigned NumIdentifiersLoaded 5982 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 5983 IdentifiersLoaded.end(), 5984 (IdentifierInfo *)0); 5985 unsigned NumMacrosLoaded 5986 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 5987 MacrosLoaded.end(), 5988 (MacroInfo *)0); 5989 unsigned NumSelectorsLoaded 5990 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 5991 SelectorsLoaded.end(), 5992 Selector()); 5993 5994 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 5995 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 5996 NumSLocEntriesRead, TotalNumSLocEntries, 5997 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 5998 if (!TypesLoaded.empty()) 5999 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6000 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6001 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6002 if (!DeclsLoaded.empty()) 6003 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6004 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6005 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6006 if (!IdentifiersLoaded.empty()) 6007 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6008 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6009 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6010 if (!MacrosLoaded.empty()) 6011 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6012 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6013 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6014 if (!SelectorsLoaded.empty()) 6015 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6016 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6017 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6018 if (TotalNumStatements) 6019 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6020 NumStatementsRead, TotalNumStatements, 6021 ((float)NumStatementsRead/TotalNumStatements * 100)); 6022 if (TotalNumMacros) 6023 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6024 NumMacrosRead, TotalNumMacros, 6025 ((float)NumMacrosRead/TotalNumMacros * 100)); 6026 if (TotalLexicalDeclContexts) 6027 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6028 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6029 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6030 * 100)); 6031 if (TotalVisibleDeclContexts) 6032 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6033 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6034 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6035 * 100)); 6036 if (TotalNumMethodPoolEntries) { 6037 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6038 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6039 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6040 * 100)); 6041 } 6042 if (NumMethodPoolLookups) { 6043 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6044 NumMethodPoolHits, NumMethodPoolLookups, 6045 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6046 } 6047 if (NumMethodPoolTableLookups) { 6048 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6049 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6050 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6051 * 100.0)); 6052 } 6053 6054 if (NumIdentifierLookupHits) { 6055 std::fprintf(stderr, 6056 " %u / %u identifier table lookups succeeded (%f%%)\n", 6057 NumIdentifierLookupHits, NumIdentifierLookups, 6058 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6059 } 6060 6061 if (GlobalIndex) { 6062 std::fprintf(stderr, "\n"); 6063 GlobalIndex->printStats(); 6064 } 6065 6066 std::fprintf(stderr, "\n"); 6067 dump(); 6068 std::fprintf(stderr, "\n"); 6069 } 6070 6071 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 6072 static void 6073 dumpModuleIDMap(StringRef Name, 6074 const ContinuousRangeMap<Key, ModuleFile *, 6075 InitialCapacity> &Map) { 6076 if (Map.begin() == Map.end()) 6077 return; 6078 6079 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 6080 llvm::errs() << Name << ":\n"; 6081 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 6082 I != IEnd; ++I) { 6083 llvm::errs() << " " << I->first << " -> " << I->second->FileName 6084 << "\n"; 6085 } 6086 } 6087 6088 void ASTReader::dump() { 6089 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 6090 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 6091 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 6092 dumpModuleIDMap("Global type map", GlobalTypeMap); 6093 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 6094 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 6095 dumpModuleIDMap("Global macro map", GlobalMacroMap); 6096 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 6097 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 6098 dumpModuleIDMap("Global preprocessed entity map", 6099 GlobalPreprocessedEntityMap); 6100 6101 llvm::errs() << "\n*** PCH/Modules Loaded:"; 6102 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 6103 MEnd = ModuleMgr.end(); 6104 M != MEnd; ++M) 6105 (*M)->dump(); 6106 } 6107 6108 /// Return the amount of memory used by memory buffers, breaking down 6109 /// by heap-backed versus mmap'ed memory. 6110 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 6111 for (ModuleConstIterator I = ModuleMgr.begin(), 6112 E = ModuleMgr.end(); I != E; ++I) { 6113 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 6114 size_t bytes = buf->getBufferSize(); 6115 switch (buf->getBufferKind()) { 6116 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 6117 sizes.malloc_bytes += bytes; 6118 break; 6119 case llvm::MemoryBuffer::MemoryBuffer_MMap: 6120 sizes.mmap_bytes += bytes; 6121 break; 6122 } 6123 } 6124 } 6125 } 6126 6127 void ASTReader::InitializeSema(Sema &S) { 6128 SemaObj = &S; 6129 S.addExternalSource(this); 6130 6131 // Makes sure any declarations that were deserialized "too early" 6132 // still get added to the identifier's declaration chains. 6133 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { 6134 pushExternalDeclIntoScope(PreloadedDecls[I], 6135 PreloadedDecls[I]->getDeclName()); 6136 } 6137 PreloadedDecls.clear(); 6138 6139 // Load the offsets of the declarations that Sema references. 6140 // They will be lazily deserialized when needed. 6141 if (!SemaDeclRefs.empty()) { 6142 assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!"); 6143 if (!SemaObj->StdNamespace) 6144 SemaObj->StdNamespace = SemaDeclRefs[0]; 6145 if (!SemaObj->StdBadAlloc) 6146 SemaObj->StdBadAlloc = SemaDeclRefs[1]; 6147 } 6148 6149 if (!FPPragmaOptions.empty()) { 6150 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 6151 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 6152 } 6153 6154 if (!OpenCLExtensions.empty()) { 6155 unsigned I = 0; 6156 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 6157 #include "clang/Basic/OpenCLExtensions.def" 6158 6159 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 6160 } 6161 } 6162 6163 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 6164 // Note that we are loading an identifier. 6165 Deserializing AnIdentifier(this); 6166 StringRef Name(NameStart, NameEnd - NameStart); 6167 6168 // If there is a global index, look there first to determine which modules 6169 // provably do not have any results for this identifier. 6170 GlobalModuleIndex::HitSet Hits; 6171 GlobalModuleIndex::HitSet *HitsPtr = 0; 6172 if (!loadGlobalIndex()) { 6173 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 6174 HitsPtr = &Hits; 6175 } 6176 } 6177 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 6178 NumIdentifierLookups, 6179 NumIdentifierLookupHits); 6180 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 6181 IdentifierInfo *II = Visitor.getIdentifierInfo(); 6182 markIdentifierUpToDate(II); 6183 return II; 6184 } 6185 6186 namespace clang { 6187 /// \brief An identifier-lookup iterator that enumerates all of the 6188 /// identifiers stored within a set of AST files. 6189 class ASTIdentifierIterator : public IdentifierIterator { 6190 /// \brief The AST reader whose identifiers are being enumerated. 6191 const ASTReader &Reader; 6192 6193 /// \brief The current index into the chain of AST files stored in 6194 /// the AST reader. 6195 unsigned Index; 6196 6197 /// \brief The current position within the identifier lookup table 6198 /// of the current AST file. 6199 ASTIdentifierLookupTable::key_iterator Current; 6200 6201 /// \brief The end position within the identifier lookup table of 6202 /// the current AST file. 6203 ASTIdentifierLookupTable::key_iterator End; 6204 6205 public: 6206 explicit ASTIdentifierIterator(const ASTReader &Reader); 6207 6208 virtual StringRef Next(); 6209 }; 6210 } 6211 6212 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 6213 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 6214 ASTIdentifierLookupTable *IdTable 6215 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 6216 Current = IdTable->key_begin(); 6217 End = IdTable->key_end(); 6218 } 6219 6220 StringRef ASTIdentifierIterator::Next() { 6221 while (Current == End) { 6222 // If we have exhausted all of our AST files, we're done. 6223 if (Index == 0) 6224 return StringRef(); 6225 6226 --Index; 6227 ASTIdentifierLookupTable *IdTable 6228 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 6229 IdentifierLookupTable; 6230 Current = IdTable->key_begin(); 6231 End = IdTable->key_end(); 6232 } 6233 6234 // We have any identifiers remaining in the current AST file; return 6235 // the next one. 6236 StringRef Result = *Current; 6237 ++Current; 6238 return Result; 6239 } 6240 6241 IdentifierIterator *ASTReader::getIdentifiers() { 6242 if (!loadGlobalIndex()) 6243 return GlobalIndex->createIdentifierIterator(); 6244 6245 return new ASTIdentifierIterator(*this); 6246 } 6247 6248 namespace clang { namespace serialization { 6249 class ReadMethodPoolVisitor { 6250 ASTReader &Reader; 6251 Selector Sel; 6252 unsigned PriorGeneration; 6253 unsigned InstanceBits; 6254 unsigned FactoryBits; 6255 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 6256 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 6257 6258 public: 6259 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 6260 unsigned PriorGeneration) 6261 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 6262 InstanceBits(0), FactoryBits(0) { } 6263 6264 static bool visit(ModuleFile &M, void *UserData) { 6265 ReadMethodPoolVisitor *This 6266 = static_cast<ReadMethodPoolVisitor *>(UserData); 6267 6268 if (!M.SelectorLookupTable) 6269 return false; 6270 6271 // If we've already searched this module file, skip it now. 6272 if (M.Generation <= This->PriorGeneration) 6273 return true; 6274 6275 ++This->Reader.NumMethodPoolTableLookups; 6276 ASTSelectorLookupTable *PoolTable 6277 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 6278 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 6279 if (Pos == PoolTable->end()) 6280 return false; 6281 6282 ++This->Reader.NumMethodPoolTableHits; 6283 ++This->Reader.NumSelectorsRead; 6284 // FIXME: Not quite happy with the statistics here. We probably should 6285 // disable this tracking when called via LoadSelector. 6286 // Also, should entries without methods count as misses? 6287 ++This->Reader.NumMethodPoolEntriesRead; 6288 ASTSelectorLookupTrait::data_type Data = *Pos; 6289 if (This->Reader.DeserializationListener) 6290 This->Reader.DeserializationListener->SelectorRead(Data.ID, 6291 This->Sel); 6292 6293 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 6294 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 6295 This->InstanceBits = Data.InstanceBits; 6296 This->FactoryBits = Data.FactoryBits; 6297 return true; 6298 } 6299 6300 /// \brief Retrieve the instance methods found by this visitor. 6301 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 6302 return InstanceMethods; 6303 } 6304 6305 /// \brief Retrieve the instance methods found by this visitor. 6306 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 6307 return FactoryMethods; 6308 } 6309 6310 unsigned getInstanceBits() const { return InstanceBits; } 6311 unsigned getFactoryBits() const { return FactoryBits; } 6312 }; 6313 } } // end namespace clang::serialization 6314 6315 /// \brief Add the given set of methods to the method list. 6316 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 6317 ObjCMethodList &List) { 6318 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 6319 S.addMethodToGlobalList(&List, Methods[I]); 6320 } 6321 } 6322 6323 void ASTReader::ReadMethodPool(Selector Sel) { 6324 // Get the selector generation and update it to the current generation. 6325 unsigned &Generation = SelectorGeneration[Sel]; 6326 unsigned PriorGeneration = Generation; 6327 Generation = CurrentGeneration; 6328 6329 // Search for methods defined with this selector. 6330 ++NumMethodPoolLookups; 6331 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 6332 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 6333 6334 if (Visitor.getInstanceMethods().empty() && 6335 Visitor.getFactoryMethods().empty()) 6336 return; 6337 6338 ++NumMethodPoolHits; 6339 6340 if (!getSema()) 6341 return; 6342 6343 Sema &S = *getSema(); 6344 Sema::GlobalMethodPool::iterator Pos 6345 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 6346 6347 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 6348 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 6349 Pos->second.first.setBits(Visitor.getInstanceBits()); 6350 Pos->second.second.setBits(Visitor.getFactoryBits()); 6351 } 6352 6353 void ASTReader::ReadKnownNamespaces( 6354 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 6355 Namespaces.clear(); 6356 6357 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 6358 if (NamespaceDecl *Namespace 6359 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 6360 Namespaces.push_back(Namespace); 6361 } 6362 } 6363 6364 void ASTReader::ReadUndefinedButUsed( 6365 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 6366 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 6367 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 6368 SourceLocation Loc = 6369 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 6370 Undefined.insert(std::make_pair(D, Loc)); 6371 } 6372 } 6373 6374 void ASTReader::ReadTentativeDefinitions( 6375 SmallVectorImpl<VarDecl *> &TentativeDefs) { 6376 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 6377 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 6378 if (Var) 6379 TentativeDefs.push_back(Var); 6380 } 6381 TentativeDefinitions.clear(); 6382 } 6383 6384 void ASTReader::ReadUnusedFileScopedDecls( 6385 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 6386 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 6387 DeclaratorDecl *D 6388 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 6389 if (D) 6390 Decls.push_back(D); 6391 } 6392 UnusedFileScopedDecls.clear(); 6393 } 6394 6395 void ASTReader::ReadDelegatingConstructors( 6396 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 6397 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 6398 CXXConstructorDecl *D 6399 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 6400 if (D) 6401 Decls.push_back(D); 6402 } 6403 DelegatingCtorDecls.clear(); 6404 } 6405 6406 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 6407 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 6408 TypedefNameDecl *D 6409 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 6410 if (D) 6411 Decls.push_back(D); 6412 } 6413 ExtVectorDecls.clear(); 6414 } 6415 6416 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) { 6417 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) { 6418 CXXRecordDecl *D 6419 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I])); 6420 if (D) 6421 Decls.push_back(D); 6422 } 6423 DynamicClasses.clear(); 6424 } 6425 6426 void 6427 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) { 6428 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) { 6429 NamedDecl *D 6430 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I])); 6431 if (D) 6432 Decls.push_back(D); 6433 } 6434 LocallyScopedExternCDecls.clear(); 6435 } 6436 6437 void ASTReader::ReadReferencedSelectors( 6438 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 6439 if (ReferencedSelectorsData.empty()) 6440 return; 6441 6442 // If there are @selector references added them to its pool. This is for 6443 // implementation of -Wselector. 6444 unsigned int DataSize = ReferencedSelectorsData.size()-1; 6445 unsigned I = 0; 6446 while (I < DataSize) { 6447 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 6448 SourceLocation SelLoc 6449 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 6450 Sels.push_back(std::make_pair(Sel, SelLoc)); 6451 } 6452 ReferencedSelectorsData.clear(); 6453 } 6454 6455 void ASTReader::ReadWeakUndeclaredIdentifiers( 6456 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 6457 if (WeakUndeclaredIdentifiers.empty()) 6458 return; 6459 6460 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 6461 IdentifierInfo *WeakId 6462 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 6463 IdentifierInfo *AliasId 6464 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 6465 SourceLocation Loc 6466 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 6467 bool Used = WeakUndeclaredIdentifiers[I++]; 6468 WeakInfo WI(AliasId, Loc); 6469 WI.setUsed(Used); 6470 WeakIDs.push_back(std::make_pair(WeakId, WI)); 6471 } 6472 WeakUndeclaredIdentifiers.clear(); 6473 } 6474 6475 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 6476 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 6477 ExternalVTableUse VT; 6478 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 6479 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 6480 VT.DefinitionRequired = VTableUses[Idx++]; 6481 VTables.push_back(VT); 6482 } 6483 6484 VTableUses.clear(); 6485 } 6486 6487 void ASTReader::ReadPendingInstantiations( 6488 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 6489 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 6490 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 6491 SourceLocation Loc 6492 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 6493 6494 Pending.push_back(std::make_pair(D, Loc)); 6495 } 6496 PendingInstantiations.clear(); 6497 } 6498 6499 void ASTReader::ReadLateParsedTemplates( 6500 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 6501 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 6502 /* In loop */) { 6503 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 6504 6505 LateParsedTemplate *LT = new LateParsedTemplate; 6506 LT->D = GetDecl(LateParsedTemplates[Idx++]); 6507 6508 ModuleFile *F = getOwningModuleFile(LT->D); 6509 assert(F && "No module"); 6510 6511 unsigned TokN = LateParsedTemplates[Idx++]; 6512 LT->Toks.reserve(TokN); 6513 for (unsigned T = 0; T < TokN; ++T) 6514 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 6515 6516 LPTMap[FD] = LT; 6517 } 6518 6519 LateParsedTemplates.clear(); 6520 } 6521 6522 void ASTReader::LoadSelector(Selector Sel) { 6523 // It would be complicated to avoid reading the methods anyway. So don't. 6524 ReadMethodPool(Sel); 6525 } 6526 6527 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 6528 assert(ID && "Non-zero identifier ID required"); 6529 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 6530 IdentifiersLoaded[ID - 1] = II; 6531 if (DeserializationListener) 6532 DeserializationListener->IdentifierRead(ID, II); 6533 } 6534 6535 /// \brief Set the globally-visible declarations associated with the given 6536 /// identifier. 6537 /// 6538 /// If the AST reader is currently in a state where the given declaration IDs 6539 /// cannot safely be resolved, they are queued until it is safe to resolve 6540 /// them. 6541 /// 6542 /// \param II an IdentifierInfo that refers to one or more globally-visible 6543 /// declarations. 6544 /// 6545 /// \param DeclIDs the set of declaration IDs with the name @p II that are 6546 /// visible at global scope. 6547 /// 6548 /// \param Decls if non-null, this vector will be populated with the set of 6549 /// deserialized declarations. These declarations will not be pushed into 6550 /// scope. 6551 void 6552 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 6553 const SmallVectorImpl<uint32_t> &DeclIDs, 6554 SmallVectorImpl<Decl *> *Decls) { 6555 if (NumCurrentElementsDeserializing && !Decls) { 6556 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 6557 return; 6558 } 6559 6560 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 6561 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 6562 if (SemaObj) { 6563 // If we're simply supposed to record the declarations, do so now. 6564 if (Decls) { 6565 Decls->push_back(D); 6566 continue; 6567 } 6568 6569 // Introduce this declaration into the translation-unit scope 6570 // and add it to the declaration chain for this identifier, so 6571 // that (unqualified) name lookup will find it. 6572 pushExternalDeclIntoScope(D, II); 6573 } else { 6574 // Queue this declaration so that it will be added to the 6575 // translation unit scope and identifier's declaration chain 6576 // once a Sema object is known. 6577 PreloadedDecls.push_back(D); 6578 } 6579 } 6580 } 6581 6582 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 6583 if (ID == 0) 6584 return 0; 6585 6586 if (IdentifiersLoaded.empty()) { 6587 Error("no identifier table in AST file"); 6588 return 0; 6589 } 6590 6591 ID -= 1; 6592 if (!IdentifiersLoaded[ID]) { 6593 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 6594 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 6595 ModuleFile *M = I->second; 6596 unsigned Index = ID - M->BaseIdentifierID; 6597 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 6598 6599 // All of the strings in the AST file are preceded by a 16-bit length. 6600 // Extract that 16-bit length to avoid having to execute strlen(). 6601 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 6602 // unsigned integers. This is important to avoid integer overflow when 6603 // we cast them to 'unsigned'. 6604 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 6605 unsigned StrLen = (((unsigned) StrLenPtr[0]) 6606 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 6607 IdentifiersLoaded[ID] 6608 = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 6609 if (DeserializationListener) 6610 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 6611 } 6612 6613 return IdentifiersLoaded[ID]; 6614 } 6615 6616 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 6617 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 6618 } 6619 6620 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 6621 if (LocalID < NUM_PREDEF_IDENT_IDS) 6622 return LocalID; 6623 6624 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6625 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 6626 assert(I != M.IdentifierRemap.end() 6627 && "Invalid index into identifier index remap"); 6628 6629 return LocalID + I->second; 6630 } 6631 6632 MacroInfo *ASTReader::getMacro(MacroID ID) { 6633 if (ID == 0) 6634 return 0; 6635 6636 if (MacrosLoaded.empty()) { 6637 Error("no macro table in AST file"); 6638 return 0; 6639 } 6640 6641 ID -= NUM_PREDEF_MACRO_IDS; 6642 if (!MacrosLoaded[ID]) { 6643 GlobalMacroMapType::iterator I 6644 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 6645 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 6646 ModuleFile *M = I->second; 6647 unsigned Index = ID - M->BaseMacroID; 6648 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 6649 6650 if (DeserializationListener) 6651 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 6652 MacrosLoaded[ID]); 6653 } 6654 6655 return MacrosLoaded[ID]; 6656 } 6657 6658 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 6659 if (LocalID < NUM_PREDEF_MACRO_IDS) 6660 return LocalID; 6661 6662 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6663 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 6664 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 6665 6666 return LocalID + I->second; 6667 } 6668 6669 serialization::SubmoduleID 6670 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 6671 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 6672 return LocalID; 6673 6674 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6675 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 6676 assert(I != M.SubmoduleRemap.end() 6677 && "Invalid index into submodule index remap"); 6678 6679 return LocalID + I->second; 6680 } 6681 6682 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 6683 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 6684 assert(GlobalID == 0 && "Unhandled global submodule ID"); 6685 return 0; 6686 } 6687 6688 if (GlobalID > SubmodulesLoaded.size()) { 6689 Error("submodule ID out of range in AST file"); 6690 return 0; 6691 } 6692 6693 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 6694 } 6695 6696 Module *ASTReader::getModule(unsigned ID) { 6697 return getSubmodule(ID); 6698 } 6699 6700 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 6701 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 6702 } 6703 6704 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 6705 if (ID == 0) 6706 return Selector(); 6707 6708 if (ID > SelectorsLoaded.size()) { 6709 Error("selector ID out of range in AST file"); 6710 return Selector(); 6711 } 6712 6713 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) { 6714 // Load this selector from the selector table. 6715 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 6716 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 6717 ModuleFile &M = *I->second; 6718 ASTSelectorLookupTrait Trait(*this, M); 6719 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 6720 SelectorsLoaded[ID - 1] = 6721 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 6722 if (DeserializationListener) 6723 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 6724 } 6725 6726 return SelectorsLoaded[ID - 1]; 6727 } 6728 6729 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 6730 return DecodeSelector(ID); 6731 } 6732 6733 uint32_t ASTReader::GetNumExternalSelectors() { 6734 // ID 0 (the null selector) is considered an external selector. 6735 return getTotalNumSelectors() + 1; 6736 } 6737 6738 serialization::SelectorID 6739 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 6740 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 6741 return LocalID; 6742 6743 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6744 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 6745 assert(I != M.SelectorRemap.end() 6746 && "Invalid index into selector index remap"); 6747 6748 return LocalID + I->second; 6749 } 6750 6751 DeclarationName 6752 ASTReader::ReadDeclarationName(ModuleFile &F, 6753 const RecordData &Record, unsigned &Idx) { 6754 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 6755 switch (Kind) { 6756 case DeclarationName::Identifier: 6757 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 6758 6759 case DeclarationName::ObjCZeroArgSelector: 6760 case DeclarationName::ObjCOneArgSelector: 6761 case DeclarationName::ObjCMultiArgSelector: 6762 return DeclarationName(ReadSelector(F, Record, Idx)); 6763 6764 case DeclarationName::CXXConstructorName: 6765 return Context.DeclarationNames.getCXXConstructorName( 6766 Context.getCanonicalType(readType(F, Record, Idx))); 6767 6768 case DeclarationName::CXXDestructorName: 6769 return Context.DeclarationNames.getCXXDestructorName( 6770 Context.getCanonicalType(readType(F, Record, Idx))); 6771 6772 case DeclarationName::CXXConversionFunctionName: 6773 return Context.DeclarationNames.getCXXConversionFunctionName( 6774 Context.getCanonicalType(readType(F, Record, Idx))); 6775 6776 case DeclarationName::CXXOperatorName: 6777 return Context.DeclarationNames.getCXXOperatorName( 6778 (OverloadedOperatorKind)Record[Idx++]); 6779 6780 case DeclarationName::CXXLiteralOperatorName: 6781 return Context.DeclarationNames.getCXXLiteralOperatorName( 6782 GetIdentifierInfo(F, Record, Idx)); 6783 6784 case DeclarationName::CXXUsingDirective: 6785 return DeclarationName::getUsingDirectiveName(); 6786 } 6787 6788 llvm_unreachable("Invalid NameKind!"); 6789 } 6790 6791 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 6792 DeclarationNameLoc &DNLoc, 6793 DeclarationName Name, 6794 const RecordData &Record, unsigned &Idx) { 6795 switch (Name.getNameKind()) { 6796 case DeclarationName::CXXConstructorName: 6797 case DeclarationName::CXXDestructorName: 6798 case DeclarationName::CXXConversionFunctionName: 6799 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 6800 break; 6801 6802 case DeclarationName::CXXOperatorName: 6803 DNLoc.CXXOperatorName.BeginOpNameLoc 6804 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6805 DNLoc.CXXOperatorName.EndOpNameLoc 6806 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6807 break; 6808 6809 case DeclarationName::CXXLiteralOperatorName: 6810 DNLoc.CXXLiteralOperatorName.OpNameLoc 6811 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6812 break; 6813 6814 case DeclarationName::Identifier: 6815 case DeclarationName::ObjCZeroArgSelector: 6816 case DeclarationName::ObjCOneArgSelector: 6817 case DeclarationName::ObjCMultiArgSelector: 6818 case DeclarationName::CXXUsingDirective: 6819 break; 6820 } 6821 } 6822 6823 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 6824 DeclarationNameInfo &NameInfo, 6825 const RecordData &Record, unsigned &Idx) { 6826 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 6827 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 6828 DeclarationNameLoc DNLoc; 6829 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 6830 NameInfo.setInfo(DNLoc); 6831 } 6832 6833 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 6834 const RecordData &Record, unsigned &Idx) { 6835 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 6836 unsigned NumTPLists = Record[Idx++]; 6837 Info.NumTemplParamLists = NumTPLists; 6838 if (NumTPLists) { 6839 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 6840 for (unsigned i=0; i != NumTPLists; ++i) 6841 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 6842 } 6843 } 6844 6845 TemplateName 6846 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 6847 unsigned &Idx) { 6848 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 6849 switch (Kind) { 6850 case TemplateName::Template: 6851 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 6852 6853 case TemplateName::OverloadedTemplate: { 6854 unsigned size = Record[Idx++]; 6855 UnresolvedSet<8> Decls; 6856 while (size--) 6857 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 6858 6859 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 6860 } 6861 6862 case TemplateName::QualifiedTemplate: { 6863 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 6864 bool hasTemplKeyword = Record[Idx++]; 6865 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 6866 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 6867 } 6868 6869 case TemplateName::DependentTemplate: { 6870 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 6871 if (Record[Idx++]) // isIdentifier 6872 return Context.getDependentTemplateName(NNS, 6873 GetIdentifierInfo(F, Record, 6874 Idx)); 6875 return Context.getDependentTemplateName(NNS, 6876 (OverloadedOperatorKind)Record[Idx++]); 6877 } 6878 6879 case TemplateName::SubstTemplateTemplateParm: { 6880 TemplateTemplateParmDecl *param 6881 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 6882 if (!param) return TemplateName(); 6883 TemplateName replacement = ReadTemplateName(F, Record, Idx); 6884 return Context.getSubstTemplateTemplateParm(param, replacement); 6885 } 6886 6887 case TemplateName::SubstTemplateTemplateParmPack: { 6888 TemplateTemplateParmDecl *Param 6889 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 6890 if (!Param) 6891 return TemplateName(); 6892 6893 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 6894 if (ArgPack.getKind() != TemplateArgument::Pack) 6895 return TemplateName(); 6896 6897 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 6898 } 6899 } 6900 6901 llvm_unreachable("Unhandled template name kind!"); 6902 } 6903 6904 TemplateArgument 6905 ASTReader::ReadTemplateArgument(ModuleFile &F, 6906 const RecordData &Record, unsigned &Idx) { 6907 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 6908 switch (Kind) { 6909 case TemplateArgument::Null: 6910 return TemplateArgument(); 6911 case TemplateArgument::Type: 6912 return TemplateArgument(readType(F, Record, Idx)); 6913 case TemplateArgument::Declaration: { 6914 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 6915 bool ForReferenceParam = Record[Idx++]; 6916 return TemplateArgument(D, ForReferenceParam); 6917 } 6918 case TemplateArgument::NullPtr: 6919 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 6920 case TemplateArgument::Integral: { 6921 llvm::APSInt Value = ReadAPSInt(Record, Idx); 6922 QualType T = readType(F, Record, Idx); 6923 return TemplateArgument(Context, Value, T); 6924 } 6925 case TemplateArgument::Template: 6926 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 6927 case TemplateArgument::TemplateExpansion: { 6928 TemplateName Name = ReadTemplateName(F, Record, Idx); 6929 Optional<unsigned> NumTemplateExpansions; 6930 if (unsigned NumExpansions = Record[Idx++]) 6931 NumTemplateExpansions = NumExpansions - 1; 6932 return TemplateArgument(Name, NumTemplateExpansions); 6933 } 6934 case TemplateArgument::Expression: 6935 return TemplateArgument(ReadExpr(F)); 6936 case TemplateArgument::Pack: { 6937 unsigned NumArgs = Record[Idx++]; 6938 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 6939 for (unsigned I = 0; I != NumArgs; ++I) 6940 Args[I] = ReadTemplateArgument(F, Record, Idx); 6941 return TemplateArgument(Args, NumArgs); 6942 } 6943 } 6944 6945 llvm_unreachable("Unhandled template argument kind!"); 6946 } 6947 6948 TemplateParameterList * 6949 ASTReader::ReadTemplateParameterList(ModuleFile &F, 6950 const RecordData &Record, unsigned &Idx) { 6951 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 6952 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 6953 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 6954 6955 unsigned NumParams = Record[Idx++]; 6956 SmallVector<NamedDecl *, 16> Params; 6957 Params.reserve(NumParams); 6958 while (NumParams--) 6959 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 6960 6961 TemplateParameterList* TemplateParams = 6962 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 6963 Params.data(), Params.size(), RAngleLoc); 6964 return TemplateParams; 6965 } 6966 6967 void 6968 ASTReader:: 6969 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 6970 ModuleFile &F, const RecordData &Record, 6971 unsigned &Idx) { 6972 unsigned NumTemplateArgs = Record[Idx++]; 6973 TemplArgs.reserve(NumTemplateArgs); 6974 while (NumTemplateArgs--) 6975 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 6976 } 6977 6978 /// \brief Read a UnresolvedSet structure. 6979 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 6980 const RecordData &Record, unsigned &Idx) { 6981 unsigned NumDecls = Record[Idx++]; 6982 Set.reserve(Context, NumDecls); 6983 while (NumDecls--) { 6984 DeclID ID = ReadDeclID(F, Record, Idx); 6985 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 6986 Set.addLazyDecl(Context, ID, AS); 6987 } 6988 } 6989 6990 CXXBaseSpecifier 6991 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 6992 const RecordData &Record, unsigned &Idx) { 6993 bool isVirtual = static_cast<bool>(Record[Idx++]); 6994 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 6995 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 6996 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 6997 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 6998 SourceRange Range = ReadSourceRange(F, Record, Idx); 6999 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7000 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7001 EllipsisLoc); 7002 Result.setInheritConstructors(inheritConstructors); 7003 return Result; 7004 } 7005 7006 std::pair<CXXCtorInitializer **, unsigned> 7007 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7008 unsigned &Idx) { 7009 CXXCtorInitializer **CtorInitializers = 0; 7010 unsigned NumInitializers = Record[Idx++]; 7011 if (NumInitializers) { 7012 CtorInitializers 7013 = new (Context) CXXCtorInitializer*[NumInitializers]; 7014 for (unsigned i=0; i != NumInitializers; ++i) { 7015 TypeSourceInfo *TInfo = 0; 7016 bool IsBaseVirtual = false; 7017 FieldDecl *Member = 0; 7018 IndirectFieldDecl *IndirectMember = 0; 7019 7020 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7021 switch (Type) { 7022 case CTOR_INITIALIZER_BASE: 7023 TInfo = GetTypeSourceInfo(F, Record, Idx); 7024 IsBaseVirtual = Record[Idx++]; 7025 break; 7026 7027 case CTOR_INITIALIZER_DELEGATING: 7028 TInfo = GetTypeSourceInfo(F, Record, Idx); 7029 break; 7030 7031 case CTOR_INITIALIZER_MEMBER: 7032 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7033 break; 7034 7035 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7036 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7037 break; 7038 } 7039 7040 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7041 Expr *Init = ReadExpr(F); 7042 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7043 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7044 bool IsWritten = Record[Idx++]; 7045 unsigned SourceOrderOrNumArrayIndices; 7046 SmallVector<VarDecl *, 8> Indices; 7047 if (IsWritten) { 7048 SourceOrderOrNumArrayIndices = Record[Idx++]; 7049 } else { 7050 SourceOrderOrNumArrayIndices = Record[Idx++]; 7051 Indices.reserve(SourceOrderOrNumArrayIndices); 7052 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 7053 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 7054 } 7055 7056 CXXCtorInitializer *BOMInit; 7057 if (Type == CTOR_INITIALIZER_BASE) { 7058 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual, 7059 LParenLoc, Init, RParenLoc, 7060 MemberOrEllipsisLoc); 7061 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 7062 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc, 7063 Init, RParenLoc); 7064 } else if (IsWritten) { 7065 if (Member) 7066 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, 7067 LParenLoc, Init, RParenLoc); 7068 else 7069 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7070 MemberOrEllipsisLoc, LParenLoc, 7071 Init, RParenLoc); 7072 } else { 7073 if (IndirectMember) { 7074 assert(Indices.empty() && "Indirect field improperly initialized"); 7075 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7076 MemberOrEllipsisLoc, LParenLoc, 7077 Init, RParenLoc); 7078 } else { 7079 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc, 7080 LParenLoc, Init, RParenLoc, 7081 Indices.data(), Indices.size()); 7082 } 7083 } 7084 7085 if (IsWritten) 7086 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 7087 CtorInitializers[i] = BOMInit; 7088 } 7089 } 7090 7091 return std::make_pair(CtorInitializers, NumInitializers); 7092 } 7093 7094 NestedNameSpecifier * 7095 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 7096 const RecordData &Record, unsigned &Idx) { 7097 unsigned N = Record[Idx++]; 7098 NestedNameSpecifier *NNS = 0, *Prev = 0; 7099 for (unsigned I = 0; I != N; ++I) { 7100 NestedNameSpecifier::SpecifierKind Kind 7101 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 7102 switch (Kind) { 7103 case NestedNameSpecifier::Identifier: { 7104 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 7105 NNS = NestedNameSpecifier::Create(Context, Prev, II); 7106 break; 7107 } 7108 7109 case NestedNameSpecifier::Namespace: { 7110 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 7111 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 7112 break; 7113 } 7114 7115 case NestedNameSpecifier::NamespaceAlias: { 7116 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 7117 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 7118 break; 7119 } 7120 7121 case NestedNameSpecifier::TypeSpec: 7122 case NestedNameSpecifier::TypeSpecWithTemplate: { 7123 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 7124 if (!T) 7125 return 0; 7126 7127 bool Template = Record[Idx++]; 7128 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 7129 break; 7130 } 7131 7132 case NestedNameSpecifier::Global: { 7133 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 7134 // No associated value, and there can't be a prefix. 7135 break; 7136 } 7137 } 7138 Prev = NNS; 7139 } 7140 return NNS; 7141 } 7142 7143 NestedNameSpecifierLoc 7144 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 7145 unsigned &Idx) { 7146 unsigned N = Record[Idx++]; 7147 NestedNameSpecifierLocBuilder Builder; 7148 for (unsigned I = 0; I != N; ++I) { 7149 NestedNameSpecifier::SpecifierKind Kind 7150 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 7151 switch (Kind) { 7152 case NestedNameSpecifier::Identifier: { 7153 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 7154 SourceRange Range = ReadSourceRange(F, Record, Idx); 7155 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 7156 break; 7157 } 7158 7159 case NestedNameSpecifier::Namespace: { 7160 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 7161 SourceRange Range = ReadSourceRange(F, Record, Idx); 7162 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 7163 break; 7164 } 7165 7166 case NestedNameSpecifier::NamespaceAlias: { 7167 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 7168 SourceRange Range = ReadSourceRange(F, Record, Idx); 7169 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 7170 break; 7171 } 7172 7173 case NestedNameSpecifier::TypeSpec: 7174 case NestedNameSpecifier::TypeSpecWithTemplate: { 7175 bool Template = Record[Idx++]; 7176 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 7177 if (!T) 7178 return NestedNameSpecifierLoc(); 7179 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 7180 7181 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 7182 Builder.Extend(Context, 7183 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 7184 T->getTypeLoc(), ColonColonLoc); 7185 break; 7186 } 7187 7188 case NestedNameSpecifier::Global: { 7189 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 7190 Builder.MakeGlobal(Context, ColonColonLoc); 7191 break; 7192 } 7193 } 7194 } 7195 7196 return Builder.getWithLocInContext(Context); 7197 } 7198 7199 SourceRange 7200 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 7201 unsigned &Idx) { 7202 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 7203 SourceLocation end = ReadSourceLocation(F, Record, Idx); 7204 return SourceRange(beg, end); 7205 } 7206 7207 /// \brief Read an integral value 7208 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 7209 unsigned BitWidth = Record[Idx++]; 7210 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 7211 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 7212 Idx += NumWords; 7213 return Result; 7214 } 7215 7216 /// \brief Read a signed integral value 7217 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 7218 bool isUnsigned = Record[Idx++]; 7219 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 7220 } 7221 7222 /// \brief Read a floating-point value 7223 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 7224 const llvm::fltSemantics &Sem, 7225 unsigned &Idx) { 7226 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 7227 } 7228 7229 // \brief Read a string 7230 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 7231 unsigned Len = Record[Idx++]; 7232 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 7233 Idx += Len; 7234 return Result; 7235 } 7236 7237 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 7238 unsigned &Idx) { 7239 unsigned Major = Record[Idx++]; 7240 unsigned Minor = Record[Idx++]; 7241 unsigned Subminor = Record[Idx++]; 7242 if (Minor == 0) 7243 return VersionTuple(Major); 7244 if (Subminor == 0) 7245 return VersionTuple(Major, Minor - 1); 7246 return VersionTuple(Major, Minor - 1, Subminor - 1); 7247 } 7248 7249 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 7250 const RecordData &Record, 7251 unsigned &Idx) { 7252 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 7253 return CXXTemporary::Create(Context, Decl); 7254 } 7255 7256 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 7257 return Diag(CurrentImportLoc, DiagID); 7258 } 7259 7260 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 7261 return Diags.Report(Loc, DiagID); 7262 } 7263 7264 /// \brief Retrieve the identifier table associated with the 7265 /// preprocessor. 7266 IdentifierTable &ASTReader::getIdentifierTable() { 7267 return PP.getIdentifierTable(); 7268 } 7269 7270 /// \brief Record that the given ID maps to the given switch-case 7271 /// statement. 7272 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 7273 assert((*CurrSwitchCaseStmts)[ID] == 0 && 7274 "Already have a SwitchCase with this ID"); 7275 (*CurrSwitchCaseStmts)[ID] = SC; 7276 } 7277 7278 /// \brief Retrieve the switch-case statement with the given ID. 7279 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 7280 assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID"); 7281 return (*CurrSwitchCaseStmts)[ID]; 7282 } 7283 7284 void ASTReader::ClearSwitchCaseIDs() { 7285 CurrSwitchCaseStmts->clear(); 7286 } 7287 7288 void ASTReader::ReadComments() { 7289 std::vector<RawComment *> Comments; 7290 for (SmallVectorImpl<std::pair<BitstreamCursor, 7291 serialization::ModuleFile *> >::iterator 7292 I = CommentsCursors.begin(), 7293 E = CommentsCursors.end(); 7294 I != E; ++I) { 7295 BitstreamCursor &Cursor = I->first; 7296 serialization::ModuleFile &F = *I->second; 7297 SavedStreamPosition SavedPosition(Cursor); 7298 7299 RecordData Record; 7300 while (true) { 7301 llvm::BitstreamEntry Entry = 7302 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 7303 7304 switch (Entry.Kind) { 7305 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 7306 case llvm::BitstreamEntry::Error: 7307 Error("malformed block record in AST file"); 7308 return; 7309 case llvm::BitstreamEntry::EndBlock: 7310 goto NextCursor; 7311 case llvm::BitstreamEntry::Record: 7312 // The interesting case. 7313 break; 7314 } 7315 7316 // Read a record. 7317 Record.clear(); 7318 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 7319 case COMMENTS_RAW_COMMENT: { 7320 unsigned Idx = 0; 7321 SourceRange SR = ReadSourceRange(F, Record, Idx); 7322 RawComment::CommentKind Kind = 7323 (RawComment::CommentKind) Record[Idx++]; 7324 bool IsTrailingComment = Record[Idx++]; 7325 bool IsAlmostTrailingComment = Record[Idx++]; 7326 Comments.push_back(new (Context) RawComment( 7327 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 7328 Context.getLangOpts().CommentOpts.ParseAllComments)); 7329 break; 7330 } 7331 } 7332 } 7333 NextCursor:; 7334 } 7335 Context.Comments.addCommentsToFront(Comments); 7336 } 7337 7338 void ASTReader::finishPendingActions() { 7339 while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() || 7340 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) { 7341 // If any identifiers with corresponding top-level declarations have 7342 // been loaded, load those declarations now. 7343 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 7344 TopLevelDeclsMap; 7345 TopLevelDeclsMap TopLevelDecls; 7346 7347 while (!PendingIdentifierInfos.empty()) { 7348 // FIXME: std::move 7349 IdentifierInfo *II = PendingIdentifierInfos.back().first; 7350 SmallVector<uint32_t, 4> DeclIDs = PendingIdentifierInfos.back().second; 7351 PendingIdentifierInfos.pop_back(); 7352 7353 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 7354 } 7355 7356 // Load pending declaration chains. 7357 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 7358 loadPendingDeclChain(PendingDeclChains[I]); 7359 PendingDeclChainsKnown.erase(PendingDeclChains[I]); 7360 } 7361 PendingDeclChains.clear(); 7362 7363 // Make the most recent of the top-level declarations visible. 7364 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 7365 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 7366 IdentifierInfo *II = TLD->first; 7367 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 7368 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 7369 } 7370 } 7371 7372 // Load any pending macro definitions. 7373 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 7374 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 7375 SmallVector<PendingMacroInfo, 2> GlobalIDs; 7376 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 7377 // Initialize the macro history from chained-PCHs ahead of module imports. 7378 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 7379 ++IDIdx) { 7380 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 7381 if (Info.M->Kind != MK_Module) 7382 resolvePendingMacro(II, Info); 7383 } 7384 // Handle module imports. 7385 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 7386 ++IDIdx) { 7387 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 7388 if (Info.M->Kind == MK_Module) 7389 resolvePendingMacro(II, Info); 7390 } 7391 } 7392 PendingMacroIDs.clear(); 7393 7394 // Wire up the DeclContexts for Decls that we delayed setting until 7395 // recursive loading is completed. 7396 while (!PendingDeclContextInfos.empty()) { 7397 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 7398 PendingDeclContextInfos.pop_front(); 7399 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 7400 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 7401 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 7402 } 7403 } 7404 7405 // If we deserialized any C++ or Objective-C class definitions, any 7406 // Objective-C protocol definitions, or any redeclarable templates, make sure 7407 // that all redeclarations point to the definitions. Note that this can only 7408 // happen now, after the redeclaration chains have been fully wired. 7409 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(), 7410 DEnd = PendingDefinitions.end(); 7411 D != DEnd; ++D) { 7412 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) { 7413 if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) { 7414 // Make sure that the TagType points at the definition. 7415 const_cast<TagType*>(TagT)->decl = TD; 7416 } 7417 7418 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) { 7419 for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(), 7420 REnd = RD->redecls_end(); 7421 R != REnd; ++R) 7422 cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData; 7423 7424 } 7425 7426 continue; 7427 } 7428 7429 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) { 7430 // Make sure that the ObjCInterfaceType points at the definition. 7431 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 7432 ->Decl = ID; 7433 7434 for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(), 7435 REnd = ID->redecls_end(); 7436 R != REnd; ++R) 7437 R->Data = ID->Data; 7438 7439 continue; 7440 } 7441 7442 if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) { 7443 for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(), 7444 REnd = PD->redecls_end(); 7445 R != REnd; ++R) 7446 R->Data = PD->Data; 7447 7448 continue; 7449 } 7450 7451 RedeclarableTemplateDecl *RTD 7452 = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl(); 7453 for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(), 7454 REnd = RTD->redecls_end(); 7455 R != REnd; ++R) 7456 R->Common = RTD->Common; 7457 } 7458 PendingDefinitions.clear(); 7459 7460 // Load the bodies of any functions or methods we've encountered. We do 7461 // this now (delayed) so that we can be sure that the declaration chains 7462 // have been fully wired up. 7463 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 7464 PBEnd = PendingBodies.end(); 7465 PB != PBEnd; ++PB) { 7466 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 7467 // FIXME: Check for =delete/=default? 7468 // FIXME: Complain about ODR violations here? 7469 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 7470 FD->setLazyBody(PB->second); 7471 continue; 7472 } 7473 7474 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 7475 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 7476 MD->setLazyBody(PB->second); 7477 } 7478 PendingBodies.clear(); 7479 } 7480 7481 void ASTReader::FinishedDeserializing() { 7482 assert(NumCurrentElementsDeserializing && 7483 "FinishedDeserializing not paired with StartedDeserializing"); 7484 if (NumCurrentElementsDeserializing == 1) { 7485 // We decrease NumCurrentElementsDeserializing only after pending actions 7486 // are finished, to avoid recursively re-calling finishPendingActions(). 7487 finishPendingActions(); 7488 } 7489 --NumCurrentElementsDeserializing; 7490 7491 if (NumCurrentElementsDeserializing == 0 && 7492 Consumer && !PassingDeclsToConsumer) { 7493 // Guard variable to avoid recursively redoing the process of passing 7494 // decls to consumer. 7495 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 7496 true); 7497 7498 while (!InterestingDecls.empty()) { 7499 // We are not in recursive loading, so it's safe to pass the "interesting" 7500 // decls to the consumer. 7501 Decl *D = InterestingDecls.front(); 7502 InterestingDecls.pop_front(); 7503 PassInterestingDeclToConsumer(D); 7504 } 7505 } 7506 } 7507 7508 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 7509 D = cast<NamedDecl>(D->getMostRecentDecl()); 7510 7511 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 7512 SemaObj->TUScope->AddDecl(D); 7513 } else if (SemaObj->TUScope) { 7514 // Adding the decl to IdResolver may have failed because it was already in 7515 // (even though it was not added in scope). If it is already in, make sure 7516 // it gets in the scope as well. 7517 if (std::find(SemaObj->IdResolver.begin(Name), 7518 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 7519 SemaObj->TUScope->AddDecl(D); 7520 } 7521 } 7522 7523 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, 7524 StringRef isysroot, bool DisableValidation, 7525 bool AllowASTWithCompilerErrors, bool UseGlobalIndex) 7526 : Listener(new PCHValidator(PP, *this)), DeserializationListener(0), 7527 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 7528 Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context), 7529 Consumer(0), ModuleMgr(PP.getFileManager()), 7530 isysroot(isysroot), DisableValidation(DisableValidation), 7531 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 7532 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 7533 CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts), 7534 NumSLocEntriesRead(0), TotalNumSLocEntries(0), 7535 NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), 7536 TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0), 7537 NumSelectorsRead(0), NumMethodPoolEntriesRead(0), 7538 NumMethodPoolLookups(0), NumMethodPoolHits(0), 7539 NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0), 7540 TotalNumMethodPoolEntries(0), 7541 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 7542 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 7543 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 7544 PassingDeclsToConsumer(false), 7545 NumCXXBaseSpecifiersLoaded(0), ReadingKind(Read_None) 7546 { 7547 SourceMgr.setExternalSLocEntrySource(this); 7548 } 7549 7550 ASTReader::~ASTReader() { 7551 for (DeclContextVisibleUpdatesPending::iterator 7552 I = PendingVisibleUpdates.begin(), 7553 E = PendingVisibleUpdates.end(); 7554 I != E; ++I) { 7555 for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 7556 F = I->second.end(); 7557 J != F; ++J) 7558 delete J->first; 7559 } 7560 } 7561