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 if (Record.size() != 2) { 2528 Error("Invalid SEMA_DECL_REFS block"); 2529 return true; 2530 } 2531 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2532 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 2533 break; 2534 2535 case PPD_ENTITIES_OFFSETS: { 2536 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 2537 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 2538 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 2539 2540 unsigned LocalBasePreprocessedEntityID = Record[0]; 2541 2542 unsigned StartingID; 2543 if (!PP.getPreprocessingRecord()) 2544 PP.createPreprocessingRecord(); 2545 if (!PP.getPreprocessingRecord()->getExternalSource()) 2546 PP.getPreprocessingRecord()->SetExternalSource(*this); 2547 StartingID 2548 = PP.getPreprocessingRecord() 2549 ->allocateLoadedEntities(F.NumPreprocessedEntities); 2550 F.BasePreprocessedEntityID = StartingID; 2551 2552 if (F.NumPreprocessedEntities > 0) { 2553 // Introduce the global -> local mapping for preprocessed entities in 2554 // this module. 2555 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 2556 2557 // Introduce the local -> global mapping for preprocessed entities in 2558 // this module. 2559 F.PreprocessedEntityRemap.insertOrReplace( 2560 std::make_pair(LocalBasePreprocessedEntityID, 2561 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 2562 } 2563 2564 break; 2565 } 2566 2567 case DECL_UPDATE_OFFSETS: { 2568 if (Record.size() % 2 != 0) { 2569 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 2570 return true; 2571 } 2572 for (unsigned I = 0, N = Record.size(); I != N; I += 2) 2573 DeclUpdateOffsets[getGlobalDeclID(F, Record[I])] 2574 .push_back(std::make_pair(&F, Record[I+1])); 2575 break; 2576 } 2577 2578 case DECL_REPLACEMENTS: { 2579 if (Record.size() % 3 != 0) { 2580 Error("invalid DECL_REPLACEMENTS block in AST file"); 2581 return true; 2582 } 2583 for (unsigned I = 0, N = Record.size(); I != N; I += 3) 2584 ReplacedDecls[getGlobalDeclID(F, Record[I])] 2585 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]); 2586 break; 2587 } 2588 2589 case OBJC_CATEGORIES_MAP: { 2590 if (F.LocalNumObjCCategoriesInMap != 0) { 2591 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 2592 return true; 2593 } 2594 2595 F.LocalNumObjCCategoriesInMap = Record[0]; 2596 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 2597 break; 2598 } 2599 2600 case OBJC_CATEGORIES: 2601 F.ObjCCategories.swap(Record); 2602 break; 2603 2604 case CXX_BASE_SPECIFIER_OFFSETS: { 2605 if (F.LocalNumCXXBaseSpecifiers != 0) { 2606 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 2607 return true; 2608 } 2609 2610 F.LocalNumCXXBaseSpecifiers = Record[0]; 2611 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 2612 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers; 2613 break; 2614 } 2615 2616 case DIAG_PRAGMA_MAPPINGS: 2617 if (F.PragmaDiagMappings.empty()) 2618 F.PragmaDiagMappings.swap(Record); 2619 else 2620 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 2621 Record.begin(), Record.end()); 2622 break; 2623 2624 case CUDA_SPECIAL_DECL_REFS: 2625 // Later tables overwrite earlier ones. 2626 // FIXME: Modules will have trouble with this. 2627 CUDASpecialDeclRefs.clear(); 2628 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2629 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 2630 break; 2631 2632 case HEADER_SEARCH_TABLE: { 2633 F.HeaderFileInfoTableData = Blob.data(); 2634 F.LocalNumHeaderFileInfos = Record[1]; 2635 if (Record[0]) { 2636 F.HeaderFileInfoTable 2637 = HeaderFileInfoLookupTable::Create( 2638 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 2639 (const unsigned char *)F.HeaderFileInfoTableData, 2640 HeaderFileInfoTrait(*this, F, 2641 &PP.getHeaderSearchInfo(), 2642 Blob.data() + Record[2])); 2643 2644 PP.getHeaderSearchInfo().SetExternalSource(this); 2645 if (!PP.getHeaderSearchInfo().getExternalLookup()) 2646 PP.getHeaderSearchInfo().SetExternalLookup(this); 2647 } 2648 break; 2649 } 2650 2651 case FP_PRAGMA_OPTIONS: 2652 // Later tables overwrite earlier ones. 2653 FPPragmaOptions.swap(Record); 2654 break; 2655 2656 case OPENCL_EXTENSIONS: 2657 // Later tables overwrite earlier ones. 2658 OpenCLExtensions.swap(Record); 2659 break; 2660 2661 case TENTATIVE_DEFINITIONS: 2662 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2663 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 2664 break; 2665 2666 case KNOWN_NAMESPACES: 2667 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2668 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 2669 break; 2670 2671 case UNDEFINED_BUT_USED: 2672 if (UndefinedButUsed.size() % 2 != 0) { 2673 Error("Invalid existing UndefinedButUsed"); 2674 return true; 2675 } 2676 2677 if (Record.size() % 2 != 0) { 2678 Error("invalid undefined-but-used record"); 2679 return true; 2680 } 2681 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 2682 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 2683 UndefinedButUsed.push_back( 2684 ReadSourceLocation(F, Record, I).getRawEncoding()); 2685 } 2686 break; 2687 2688 case IMPORTED_MODULES: { 2689 if (F.Kind != MK_Module) { 2690 // If we aren't loading a module (which has its own exports), make 2691 // all of the imported modules visible. 2692 // FIXME: Deal with macros-only imports. 2693 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2694 if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I])) 2695 ImportedModules.push_back(GlobalID); 2696 } 2697 } 2698 break; 2699 } 2700 2701 case LOCAL_REDECLARATIONS: { 2702 F.RedeclarationChains.swap(Record); 2703 break; 2704 } 2705 2706 case LOCAL_REDECLARATIONS_MAP: { 2707 if (F.LocalNumRedeclarationsInMap != 0) { 2708 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 2709 return true; 2710 } 2711 2712 F.LocalNumRedeclarationsInMap = Record[0]; 2713 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 2714 break; 2715 } 2716 2717 case MERGED_DECLARATIONS: { 2718 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) { 2719 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]); 2720 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID]; 2721 for (unsigned N = Record[Idx++]; N > 0; --N) 2722 Decls.push_back(getGlobalDeclID(F, Record[Idx++])); 2723 } 2724 break; 2725 } 2726 2727 case MACRO_OFFSET: { 2728 if (F.LocalNumMacros != 0) { 2729 Error("duplicate MACRO_OFFSET record in AST file"); 2730 return true; 2731 } 2732 F.MacroOffsets = (const uint32_t *)Blob.data(); 2733 F.LocalNumMacros = Record[0]; 2734 unsigned LocalBaseMacroID = Record[1]; 2735 F.BaseMacroID = getTotalNumMacros(); 2736 2737 if (F.LocalNumMacros > 0) { 2738 // Introduce the global -> local mapping for macros within this module. 2739 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 2740 2741 // Introduce the local -> global mapping for macros within this module. 2742 F.MacroRemap.insertOrReplace( 2743 std::make_pair(LocalBaseMacroID, 2744 F.BaseMacroID - LocalBaseMacroID)); 2745 2746 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 2747 } 2748 break; 2749 } 2750 2751 case MACRO_TABLE: { 2752 // FIXME: Not used yet. 2753 break; 2754 } 2755 2756 case LATE_PARSED_TEMPLATE: { 2757 LateParsedTemplates.append(Record.begin(), Record.end()); 2758 break; 2759 } 2760 } 2761 } 2762 } 2763 2764 /// \brief Move the given method to the back of the global list of methods. 2765 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 2766 // Find the entry for this selector in the method pool. 2767 Sema::GlobalMethodPool::iterator Known 2768 = S.MethodPool.find(Method->getSelector()); 2769 if (Known == S.MethodPool.end()) 2770 return; 2771 2772 // Retrieve the appropriate method list. 2773 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 2774 : Known->second.second; 2775 bool Found = false; 2776 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 2777 if (!Found) { 2778 if (List->Method == Method) { 2779 Found = true; 2780 } else { 2781 // Keep searching. 2782 continue; 2783 } 2784 } 2785 2786 if (List->getNext()) 2787 List->Method = List->getNext()->Method; 2788 else 2789 List->Method = Method; 2790 } 2791 } 2792 2793 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 2794 for (unsigned I = 0, N = Names.size(); I != N; ++I) { 2795 switch (Names[I].getKind()) { 2796 case HiddenName::Declaration: { 2797 Decl *D = Names[I].getDecl(); 2798 bool wasHidden = D->Hidden; 2799 D->Hidden = false; 2800 2801 if (wasHidden && SemaObj) { 2802 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 2803 moveMethodToBackOfGlobalList(*SemaObj, Method); 2804 } 2805 } 2806 break; 2807 } 2808 case HiddenName::MacroVisibility: { 2809 std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro(); 2810 installImportedMacro(Macro.first, Macro.second, Owner); 2811 break; 2812 } 2813 } 2814 } 2815 } 2816 2817 void ASTReader::makeModuleVisible(Module *Mod, 2818 Module::NameVisibilityKind NameVisibility, 2819 SourceLocation ImportLoc, 2820 bool Complain) { 2821 llvm::SmallPtrSet<Module *, 4> Visited; 2822 SmallVector<Module *, 4> Stack; 2823 Stack.push_back(Mod); 2824 while (!Stack.empty()) { 2825 Mod = Stack.pop_back_val(); 2826 2827 if (NameVisibility <= Mod->NameVisibility) { 2828 // This module already has this level of visibility (or greater), so 2829 // there is nothing more to do. 2830 continue; 2831 } 2832 2833 if (!Mod->isAvailable()) { 2834 // Modules that aren't available cannot be made visible. 2835 continue; 2836 } 2837 2838 // Update the module's name visibility. 2839 Mod->NameVisibility = NameVisibility; 2840 2841 // If we've already deserialized any names from this module, 2842 // mark them as visible. 2843 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 2844 if (Hidden != HiddenNamesMap.end()) { 2845 makeNamesVisible(Hidden->second, Hidden->first); 2846 HiddenNamesMap.erase(Hidden); 2847 } 2848 2849 // Push any exported modules onto the stack to be marked as visible. 2850 SmallVector<Module *, 16> Exports; 2851 Mod->getExportedModules(Exports); 2852 for (SmallVectorImpl<Module *>::iterator 2853 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 2854 Module *Exported = *I; 2855 if (Visited.insert(Exported)) 2856 Stack.push_back(Exported); 2857 } 2858 2859 // Detect any conflicts. 2860 if (Complain) { 2861 assert(ImportLoc.isValid() && "Missing import location"); 2862 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 2863 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) { 2864 Diag(ImportLoc, diag::warn_module_conflict) 2865 << Mod->getFullModuleName() 2866 << Mod->Conflicts[I].Other->getFullModuleName() 2867 << Mod->Conflicts[I].Message; 2868 // FIXME: Need note where the other module was imported. 2869 } 2870 } 2871 } 2872 } 2873 } 2874 2875 bool ASTReader::loadGlobalIndex() { 2876 if (GlobalIndex) 2877 return false; 2878 2879 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 2880 !Context.getLangOpts().Modules) 2881 return true; 2882 2883 // Try to load the global index. 2884 TriedLoadingGlobalIndex = true; 2885 StringRef ModuleCachePath 2886 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 2887 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 2888 = GlobalModuleIndex::readIndex(ModuleCachePath); 2889 if (!Result.first) 2890 return true; 2891 2892 GlobalIndex.reset(Result.first); 2893 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 2894 return false; 2895 } 2896 2897 bool ASTReader::isGlobalIndexUnavailable() const { 2898 return Context.getLangOpts().Modules && UseGlobalIndex && 2899 !hasGlobalIndex() && TriedLoadingGlobalIndex; 2900 } 2901 2902 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 2903 ModuleKind Type, 2904 SourceLocation ImportLoc, 2905 unsigned ClientLoadCapabilities) { 2906 llvm::SaveAndRestore<SourceLocation> 2907 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 2908 2909 // Bump the generation number. 2910 unsigned PreviousGeneration = CurrentGeneration++; 2911 2912 unsigned NumModules = ModuleMgr.size(); 2913 SmallVector<ImportedModule, 4> Loaded; 2914 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 2915 /*ImportedBy=*/0, Loaded, 2916 0, 0, 2917 ClientLoadCapabilities)) { 2918 case Failure: 2919 case Missing: 2920 case OutOfDate: 2921 case VersionMismatch: 2922 case ConfigurationMismatch: 2923 case HadErrors: 2924 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 2925 Context.getLangOpts().Modules 2926 ? &PP.getHeaderSearchInfo().getModuleMap() 2927 : 0); 2928 2929 // If we find that any modules are unusable, the global index is going 2930 // to be out-of-date. Just remove it. 2931 GlobalIndex.reset(); 2932 ModuleMgr.setGlobalIndex(0); 2933 return ReadResult; 2934 2935 case Success: 2936 break; 2937 } 2938 2939 // Here comes stuff that we only do once the entire chain is loaded. 2940 2941 // Load the AST blocks of all of the modules that we loaded. 2942 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2943 MEnd = Loaded.end(); 2944 M != MEnd; ++M) { 2945 ModuleFile &F = *M->Mod; 2946 2947 // Read the AST block. 2948 if (ReadASTBlock(F)) 2949 return Failure; 2950 2951 // Once read, set the ModuleFile bit base offset and update the size in 2952 // bits of all files we've seen. 2953 F.GlobalBitOffset = TotalModulesSizeInBits; 2954 TotalModulesSizeInBits += F.SizeInBits; 2955 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 2956 2957 // Preload SLocEntries. 2958 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 2959 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 2960 // Load it through the SourceManager and don't call ReadSLocEntry() 2961 // directly because the entry may have already been loaded in which case 2962 // calling ReadSLocEntry() directly would trigger an assertion in 2963 // SourceManager. 2964 SourceMgr.getLoadedSLocEntryByID(Index); 2965 } 2966 } 2967 2968 // Setup the import locations and notify the module manager that we've 2969 // committed to these module files. 2970 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2971 MEnd = Loaded.end(); 2972 M != MEnd; ++M) { 2973 ModuleFile &F = *M->Mod; 2974 2975 ModuleMgr.moduleFileAccepted(&F); 2976 2977 // Set the import location. 2978 F.DirectImportLoc = ImportLoc; 2979 if (!M->ImportedBy) 2980 F.ImportLoc = M->ImportLoc; 2981 else 2982 F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 2983 M->ImportLoc.getRawEncoding()); 2984 } 2985 2986 // Mark all of the identifiers in the identifier table as being out of date, 2987 // so that various accessors know to check the loaded modules when the 2988 // identifier is used. 2989 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 2990 IdEnd = PP.getIdentifierTable().end(); 2991 Id != IdEnd; ++Id) 2992 Id->second->setOutOfDate(true); 2993 2994 // Resolve any unresolved module exports. 2995 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 2996 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 2997 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 2998 Module *ResolvedMod = getSubmodule(GlobalID); 2999 3000 switch (Unresolved.Kind) { 3001 case UnresolvedModuleRef::Conflict: 3002 if (ResolvedMod) { 3003 Module::Conflict Conflict; 3004 Conflict.Other = ResolvedMod; 3005 Conflict.Message = Unresolved.String.str(); 3006 Unresolved.Mod->Conflicts.push_back(Conflict); 3007 } 3008 continue; 3009 3010 case UnresolvedModuleRef::Import: 3011 if (ResolvedMod) 3012 Unresolved.Mod->Imports.push_back(ResolvedMod); 3013 continue; 3014 3015 case UnresolvedModuleRef::Export: 3016 if (ResolvedMod || Unresolved.IsWildcard) 3017 Unresolved.Mod->Exports.push_back( 3018 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3019 continue; 3020 } 3021 } 3022 UnresolvedModuleRefs.clear(); 3023 3024 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3025 // Might be unnecessary as use declarations are only used to build the 3026 // module itself. 3027 3028 InitializeContext(); 3029 3030 if (SemaObj) 3031 UpdateSema(); 3032 3033 if (DeserializationListener) 3034 DeserializationListener->ReaderInitialized(this); 3035 3036 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3037 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 3038 PrimaryModule.OriginalSourceFileID 3039 = FileID::get(PrimaryModule.SLocEntryBaseID 3040 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3041 3042 // If this AST file is a precompiled preamble, then set the 3043 // preamble file ID of the source manager to the file source file 3044 // from which the preamble was built. 3045 if (Type == MK_Preamble) { 3046 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3047 } else if (Type == MK_MainFile) { 3048 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3049 } 3050 } 3051 3052 // For any Objective-C class definitions we have already loaded, make sure 3053 // that we load any additional categories. 3054 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3055 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3056 ObjCClassesLoaded[I], 3057 PreviousGeneration); 3058 } 3059 3060 return Success; 3061 } 3062 3063 ASTReader::ASTReadResult 3064 ASTReader::ReadASTCore(StringRef FileName, 3065 ModuleKind Type, 3066 SourceLocation ImportLoc, 3067 ModuleFile *ImportedBy, 3068 SmallVectorImpl<ImportedModule> &Loaded, 3069 off_t ExpectedSize, time_t ExpectedModTime, 3070 unsigned ClientLoadCapabilities) { 3071 ModuleFile *M; 3072 std::string ErrorStr; 3073 ModuleManager::AddModuleResult AddResult 3074 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3075 CurrentGeneration, ExpectedSize, ExpectedModTime, 3076 M, ErrorStr); 3077 3078 switch (AddResult) { 3079 case ModuleManager::AlreadyLoaded: 3080 return Success; 3081 3082 case ModuleManager::NewlyLoaded: 3083 // Load module file below. 3084 break; 3085 3086 case ModuleManager::Missing: 3087 // The module file was missing; if the client handle handle, that, return 3088 // it. 3089 if (ClientLoadCapabilities & ARR_Missing) 3090 return Missing; 3091 3092 // Otherwise, return an error. 3093 { 3094 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3095 + ErrorStr; 3096 Error(Msg); 3097 } 3098 return Failure; 3099 3100 case ModuleManager::OutOfDate: 3101 // We couldn't load the module file because it is out-of-date. If the 3102 // client can handle out-of-date, return it. 3103 if (ClientLoadCapabilities & ARR_OutOfDate) 3104 return OutOfDate; 3105 3106 // Otherwise, return an error. 3107 { 3108 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3109 + ErrorStr; 3110 Error(Msg); 3111 } 3112 return Failure; 3113 } 3114 3115 assert(M && "Missing module file"); 3116 3117 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3118 // module? 3119 if (FileName != "-") { 3120 CurrentDir = llvm::sys::path::parent_path(FileName); 3121 if (CurrentDir.empty()) CurrentDir = "."; 3122 } 3123 3124 ModuleFile &F = *M; 3125 BitstreamCursor &Stream = F.Stream; 3126 Stream.init(F.StreamFile); 3127 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3128 3129 // Sniff for the signature. 3130 if (Stream.Read(8) != 'C' || 3131 Stream.Read(8) != 'P' || 3132 Stream.Read(8) != 'C' || 3133 Stream.Read(8) != 'H') { 3134 Diag(diag::err_not_a_pch_file) << FileName; 3135 return Failure; 3136 } 3137 3138 // This is used for compatibility with older PCH formats. 3139 bool HaveReadControlBlock = false; 3140 3141 while (1) { 3142 llvm::BitstreamEntry Entry = Stream.advance(); 3143 3144 switch (Entry.Kind) { 3145 case llvm::BitstreamEntry::Error: 3146 case llvm::BitstreamEntry::EndBlock: 3147 case llvm::BitstreamEntry::Record: 3148 Error("invalid record at top-level of AST file"); 3149 return Failure; 3150 3151 case llvm::BitstreamEntry::SubBlock: 3152 break; 3153 } 3154 3155 // We only know the control subblock ID. 3156 switch (Entry.ID) { 3157 case llvm::bitc::BLOCKINFO_BLOCK_ID: 3158 if (Stream.ReadBlockInfoBlock()) { 3159 Error("malformed BlockInfoBlock in AST file"); 3160 return Failure; 3161 } 3162 break; 3163 case CONTROL_BLOCK_ID: 3164 HaveReadControlBlock = true; 3165 switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) { 3166 case Success: 3167 break; 3168 3169 case Failure: return Failure; 3170 case Missing: return Missing; 3171 case OutOfDate: return OutOfDate; 3172 case VersionMismatch: return VersionMismatch; 3173 case ConfigurationMismatch: return ConfigurationMismatch; 3174 case HadErrors: return HadErrors; 3175 } 3176 break; 3177 case AST_BLOCK_ID: 3178 if (!HaveReadControlBlock) { 3179 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3180 Diag(diag::warn_pch_version_too_old); 3181 return VersionMismatch; 3182 } 3183 3184 // Record that we've loaded this module. 3185 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3186 return Success; 3187 3188 default: 3189 if (Stream.SkipBlock()) { 3190 Error("malformed block record in AST file"); 3191 return Failure; 3192 } 3193 break; 3194 } 3195 } 3196 3197 return Success; 3198 } 3199 3200 void ASTReader::InitializeContext() { 3201 // If there's a listener, notify them that we "read" the translation unit. 3202 if (DeserializationListener) 3203 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3204 Context.getTranslationUnitDecl()); 3205 3206 // Make sure we load the declaration update records for the translation unit, 3207 // if there are any. 3208 loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID, 3209 Context.getTranslationUnitDecl()); 3210 3211 // FIXME: Find a better way to deal with collisions between these 3212 // built-in types. Right now, we just ignore the problem. 3213 3214 // Load the special types. 3215 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3216 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3217 if (!Context.CFConstantStringTypeDecl) 3218 Context.setCFConstantStringType(GetType(String)); 3219 } 3220 3221 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3222 QualType FileType = GetType(File); 3223 if (FileType.isNull()) { 3224 Error("FILE type is NULL"); 3225 return; 3226 } 3227 3228 if (!Context.FILEDecl) { 3229 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3230 Context.setFILEDecl(Typedef->getDecl()); 3231 else { 3232 const TagType *Tag = FileType->getAs<TagType>(); 3233 if (!Tag) { 3234 Error("Invalid FILE type in AST file"); 3235 return; 3236 } 3237 Context.setFILEDecl(Tag->getDecl()); 3238 } 3239 } 3240 } 3241 3242 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 3243 QualType Jmp_bufType = GetType(Jmp_buf); 3244 if (Jmp_bufType.isNull()) { 3245 Error("jmp_buf type is NULL"); 3246 return; 3247 } 3248 3249 if (!Context.jmp_bufDecl) { 3250 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 3251 Context.setjmp_bufDecl(Typedef->getDecl()); 3252 else { 3253 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 3254 if (!Tag) { 3255 Error("Invalid jmp_buf type in AST file"); 3256 return; 3257 } 3258 Context.setjmp_bufDecl(Tag->getDecl()); 3259 } 3260 } 3261 } 3262 3263 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 3264 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 3265 if (Sigjmp_bufType.isNull()) { 3266 Error("sigjmp_buf type is NULL"); 3267 return; 3268 } 3269 3270 if (!Context.sigjmp_bufDecl) { 3271 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 3272 Context.setsigjmp_bufDecl(Typedef->getDecl()); 3273 else { 3274 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 3275 assert(Tag && "Invalid sigjmp_buf type in AST file"); 3276 Context.setsigjmp_bufDecl(Tag->getDecl()); 3277 } 3278 } 3279 } 3280 3281 if (unsigned ObjCIdRedef 3282 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 3283 if (Context.ObjCIdRedefinitionType.isNull()) 3284 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 3285 } 3286 3287 if (unsigned ObjCClassRedef 3288 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 3289 if (Context.ObjCClassRedefinitionType.isNull()) 3290 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 3291 } 3292 3293 if (unsigned ObjCSelRedef 3294 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 3295 if (Context.ObjCSelRedefinitionType.isNull()) 3296 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 3297 } 3298 3299 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 3300 QualType Ucontext_tType = GetType(Ucontext_t); 3301 if (Ucontext_tType.isNull()) { 3302 Error("ucontext_t type is NULL"); 3303 return; 3304 } 3305 3306 if (!Context.ucontext_tDecl) { 3307 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 3308 Context.setucontext_tDecl(Typedef->getDecl()); 3309 else { 3310 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 3311 assert(Tag && "Invalid ucontext_t type in AST file"); 3312 Context.setucontext_tDecl(Tag->getDecl()); 3313 } 3314 } 3315 } 3316 } 3317 3318 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 3319 3320 // If there were any CUDA special declarations, deserialize them. 3321 if (!CUDASpecialDeclRefs.empty()) { 3322 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 3323 Context.setcudaConfigureCallDecl( 3324 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 3325 } 3326 3327 // Re-export any modules that were imported by a non-module AST file. 3328 for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) { 3329 if (Module *Imported = getSubmodule(ImportedModules[I])) 3330 makeModuleVisible(Imported, Module::AllVisible, 3331 /*ImportLoc=*/SourceLocation(), 3332 /*Complain=*/false); 3333 } 3334 ImportedModules.clear(); 3335 } 3336 3337 void ASTReader::finalizeForWriting() { 3338 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), 3339 HiddenEnd = HiddenNamesMap.end(); 3340 Hidden != HiddenEnd; ++Hidden) { 3341 makeNamesVisible(Hidden->second, Hidden->first); 3342 } 3343 HiddenNamesMap.clear(); 3344 } 3345 3346 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3347 /// cursor into the start of the given block ID, returning false on success and 3348 /// true on failure. 3349 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 3350 while (1) { 3351 llvm::BitstreamEntry Entry = Cursor.advance(); 3352 switch (Entry.Kind) { 3353 case llvm::BitstreamEntry::Error: 3354 case llvm::BitstreamEntry::EndBlock: 3355 return true; 3356 3357 case llvm::BitstreamEntry::Record: 3358 // Ignore top-level records. 3359 Cursor.skipRecord(Entry.ID); 3360 break; 3361 3362 case llvm::BitstreamEntry::SubBlock: 3363 if (Entry.ID == BlockID) { 3364 if (Cursor.EnterSubBlock(BlockID)) 3365 return true; 3366 // Found it! 3367 return false; 3368 } 3369 3370 if (Cursor.SkipBlock()) 3371 return true; 3372 } 3373 } 3374 } 3375 3376 /// \brief Retrieve the name of the original source file name 3377 /// directly from the AST file, without actually loading the AST 3378 /// file. 3379 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 3380 FileManager &FileMgr, 3381 DiagnosticsEngine &Diags) { 3382 // Open the AST file. 3383 std::string ErrStr; 3384 OwningPtr<llvm::MemoryBuffer> Buffer; 3385 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr)); 3386 if (!Buffer) { 3387 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr; 3388 return std::string(); 3389 } 3390 3391 // Initialize the stream 3392 llvm::BitstreamReader StreamFile; 3393 BitstreamCursor Stream; 3394 StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 3395 (const unsigned char *)Buffer->getBufferEnd()); 3396 Stream.init(StreamFile); 3397 3398 // Sniff for the signature. 3399 if (Stream.Read(8) != 'C' || 3400 Stream.Read(8) != 'P' || 3401 Stream.Read(8) != 'C' || 3402 Stream.Read(8) != 'H') { 3403 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 3404 return std::string(); 3405 } 3406 3407 // Scan for the CONTROL_BLOCK_ID block. 3408 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 3409 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 3410 return std::string(); 3411 } 3412 3413 // Scan for ORIGINAL_FILE inside the control block. 3414 RecordData Record; 3415 while (1) { 3416 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3417 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 3418 return std::string(); 3419 3420 if (Entry.Kind != llvm::BitstreamEntry::Record) { 3421 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 3422 return std::string(); 3423 } 3424 3425 Record.clear(); 3426 StringRef Blob; 3427 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 3428 return Blob.str(); 3429 } 3430 } 3431 3432 namespace { 3433 class SimplePCHValidator : public ASTReaderListener { 3434 const LangOptions &ExistingLangOpts; 3435 const TargetOptions &ExistingTargetOpts; 3436 const PreprocessorOptions &ExistingPPOpts; 3437 FileManager &FileMgr; 3438 3439 public: 3440 SimplePCHValidator(const LangOptions &ExistingLangOpts, 3441 const TargetOptions &ExistingTargetOpts, 3442 const PreprocessorOptions &ExistingPPOpts, 3443 FileManager &FileMgr) 3444 : ExistingLangOpts(ExistingLangOpts), 3445 ExistingTargetOpts(ExistingTargetOpts), 3446 ExistingPPOpts(ExistingPPOpts), 3447 FileMgr(FileMgr) 3448 { 3449 } 3450 3451 virtual bool ReadLanguageOptions(const LangOptions &LangOpts, 3452 bool Complain) { 3453 return checkLanguageOptions(ExistingLangOpts, LangOpts, 0); 3454 } 3455 virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, 3456 bool Complain) { 3457 return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0); 3458 } 3459 virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 3460 bool Complain, 3461 std::string &SuggestedPredefines) { 3462 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr, 3463 SuggestedPredefines, ExistingLangOpts); 3464 } 3465 }; 3466 } 3467 3468 bool ASTReader::readASTFileControlBlock(StringRef Filename, 3469 FileManager &FileMgr, 3470 ASTReaderListener &Listener) { 3471 // Open the AST file. 3472 std::string ErrStr; 3473 OwningPtr<llvm::MemoryBuffer> Buffer; 3474 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr)); 3475 if (!Buffer) { 3476 return true; 3477 } 3478 3479 // Initialize the stream 3480 llvm::BitstreamReader StreamFile; 3481 BitstreamCursor Stream; 3482 StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 3483 (const unsigned char *)Buffer->getBufferEnd()); 3484 Stream.init(StreamFile); 3485 3486 // Sniff for the signature. 3487 if (Stream.Read(8) != 'C' || 3488 Stream.Read(8) != 'P' || 3489 Stream.Read(8) != 'C' || 3490 Stream.Read(8) != 'H') { 3491 return true; 3492 } 3493 3494 // Scan for the CONTROL_BLOCK_ID block. 3495 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 3496 return true; 3497 3498 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 3499 BitstreamCursor InputFilesCursor; 3500 if (NeedsInputFiles) { 3501 InputFilesCursor = Stream; 3502 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 3503 return true; 3504 3505 // Read the abbreviations 3506 while (true) { 3507 uint64_t Offset = InputFilesCursor.GetCurrentBitNo(); 3508 unsigned Code = InputFilesCursor.ReadCode(); 3509 3510 // We expect all abbrevs to be at the start of the block. 3511 if (Code != llvm::bitc::DEFINE_ABBREV) { 3512 InputFilesCursor.JumpToBit(Offset); 3513 break; 3514 } 3515 InputFilesCursor.ReadAbbrevRecord(); 3516 } 3517 } 3518 3519 // Scan for ORIGINAL_FILE inside the control block. 3520 RecordData Record; 3521 while (1) { 3522 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 3523 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 3524 return false; 3525 3526 if (Entry.Kind != llvm::BitstreamEntry::Record) 3527 return true; 3528 3529 Record.clear(); 3530 StringRef Blob; 3531 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 3532 switch ((ControlRecordTypes)RecCode) { 3533 case METADATA: { 3534 if (Record[0] != VERSION_MAJOR) 3535 return true; 3536 3537 if (Listener.ReadFullVersionInformation(Blob)) 3538 return true; 3539 3540 break; 3541 } 3542 case LANGUAGE_OPTIONS: 3543 if (ParseLanguageOptions(Record, false, Listener)) 3544 return true; 3545 break; 3546 3547 case TARGET_OPTIONS: 3548 if (ParseTargetOptions(Record, false, Listener)) 3549 return true; 3550 break; 3551 3552 case DIAGNOSTIC_OPTIONS: 3553 if (ParseDiagnosticOptions(Record, false, Listener)) 3554 return true; 3555 break; 3556 3557 case FILE_SYSTEM_OPTIONS: 3558 if (ParseFileSystemOptions(Record, false, Listener)) 3559 return true; 3560 break; 3561 3562 case HEADER_SEARCH_OPTIONS: 3563 if (ParseHeaderSearchOptions(Record, false, Listener)) 3564 return true; 3565 break; 3566 3567 case PREPROCESSOR_OPTIONS: { 3568 std::string IgnoredSuggestedPredefines; 3569 if (ParsePreprocessorOptions(Record, false, Listener, 3570 IgnoredSuggestedPredefines)) 3571 return true; 3572 break; 3573 } 3574 3575 case INPUT_FILE_OFFSETS: { 3576 if (!NeedsInputFiles) 3577 break; 3578 3579 unsigned NumInputFiles = Record[0]; 3580 unsigned NumUserFiles = Record[1]; 3581 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data(); 3582 for (unsigned I = 0; I != NumInputFiles; ++I) { 3583 // Go find this input file. 3584 bool isSystemFile = I >= NumUserFiles; 3585 BitstreamCursor &Cursor = InputFilesCursor; 3586 SavedStreamPosition SavedPosition(Cursor); 3587 Cursor.JumpToBit(InputFileOffs[I]); 3588 3589 unsigned Code = Cursor.ReadCode(); 3590 RecordData Record; 3591 StringRef Blob; 3592 bool shouldContinue = false; 3593 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 3594 case INPUT_FILE: 3595 shouldContinue = Listener.visitInputFile(Blob, isSystemFile); 3596 break; 3597 } 3598 if (!shouldContinue) 3599 break; 3600 } 3601 break; 3602 } 3603 3604 default: 3605 // No other validation to perform. 3606 break; 3607 } 3608 } 3609 } 3610 3611 3612 bool ASTReader::isAcceptableASTFile(StringRef Filename, 3613 FileManager &FileMgr, 3614 const LangOptions &LangOpts, 3615 const TargetOptions &TargetOpts, 3616 const PreprocessorOptions &PPOpts) { 3617 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr); 3618 return !readASTFileControlBlock(Filename, FileMgr, validator); 3619 } 3620 3621 bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) { 3622 // Enter the submodule block. 3623 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 3624 Error("malformed submodule block record in AST file"); 3625 return true; 3626 } 3627 3628 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 3629 bool First = true; 3630 Module *CurrentModule = 0; 3631 RecordData Record; 3632 while (true) { 3633 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 3634 3635 switch (Entry.Kind) { 3636 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 3637 case llvm::BitstreamEntry::Error: 3638 Error("malformed block record in AST file"); 3639 return true; 3640 case llvm::BitstreamEntry::EndBlock: 3641 return false; 3642 case llvm::BitstreamEntry::Record: 3643 // The interesting case. 3644 break; 3645 } 3646 3647 // Read a record. 3648 StringRef Blob; 3649 Record.clear(); 3650 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) { 3651 default: // Default behavior: ignore. 3652 break; 3653 3654 case SUBMODULE_DEFINITION: { 3655 if (First) { 3656 Error("missing submodule metadata record at beginning of block"); 3657 return true; 3658 } 3659 3660 if (Record.size() < 8) { 3661 Error("malformed module definition"); 3662 return true; 3663 } 3664 3665 StringRef Name = Blob; 3666 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]); 3667 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]); 3668 bool IsFramework = Record[2]; 3669 bool IsExplicit = Record[3]; 3670 bool IsSystem = Record[4]; 3671 bool InferSubmodules = Record[5]; 3672 bool InferExplicitSubmodules = Record[6]; 3673 bool InferExportWildcard = Record[7]; 3674 bool ConfigMacrosExhaustive = Record[8]; 3675 3676 Module *ParentModule = 0; 3677 if (Parent) 3678 ParentModule = getSubmodule(Parent); 3679 3680 // Retrieve this (sub)module from the module map, creating it if 3681 // necessary. 3682 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, 3683 IsFramework, 3684 IsExplicit).first; 3685 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 3686 if (GlobalIndex >= SubmodulesLoaded.size() || 3687 SubmodulesLoaded[GlobalIndex]) { 3688 Error("too many submodules"); 3689 return true; 3690 } 3691 3692 if (!ParentModule) { 3693 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 3694 if (CurFile != F.File) { 3695 if (!Diags.isDiagnosticInFlight()) { 3696 Diag(diag::err_module_file_conflict) 3697 << CurrentModule->getTopLevelModuleName() 3698 << CurFile->getName() 3699 << F.File->getName(); 3700 } 3701 return true; 3702 } 3703 } 3704 3705 CurrentModule->setASTFile(F.File); 3706 } 3707 3708 CurrentModule->IsFromModuleFile = true; 3709 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 3710 CurrentModule->InferSubmodules = InferSubmodules; 3711 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 3712 CurrentModule->InferExportWildcard = InferExportWildcard; 3713 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 3714 if (DeserializationListener) 3715 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 3716 3717 SubmodulesLoaded[GlobalIndex] = CurrentModule; 3718 3719 // Clear out data that will be replaced by what is the module file. 3720 CurrentModule->LinkLibraries.clear(); 3721 CurrentModule->ConfigMacros.clear(); 3722 CurrentModule->UnresolvedConflicts.clear(); 3723 CurrentModule->Conflicts.clear(); 3724 break; 3725 } 3726 3727 case SUBMODULE_UMBRELLA_HEADER: { 3728 if (First) { 3729 Error("missing submodule metadata record at beginning of block"); 3730 return true; 3731 } 3732 3733 if (!CurrentModule) 3734 break; 3735 3736 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 3737 if (!CurrentModule->getUmbrellaHeader()) 3738 ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 3739 else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 3740 Error("mismatched umbrella headers in submodule"); 3741 return true; 3742 } 3743 } 3744 break; 3745 } 3746 3747 case SUBMODULE_HEADER: { 3748 if (First) { 3749 Error("missing submodule metadata record at beginning of block"); 3750 return true; 3751 } 3752 3753 if (!CurrentModule) 3754 break; 3755 3756 // We lazily associate headers with their modules via the HeaderInfoTable. 3757 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3758 // of complete filenames or remove it entirely. 3759 break; 3760 } 3761 3762 case SUBMODULE_EXCLUDED_HEADER: { 3763 if (First) { 3764 Error("missing submodule metadata record at beginning of block"); 3765 return true; 3766 } 3767 3768 if (!CurrentModule) 3769 break; 3770 3771 // We lazily associate headers with their modules via the HeaderInfoTable. 3772 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3773 // of complete filenames or remove it entirely. 3774 break; 3775 } 3776 3777 case SUBMODULE_PRIVATE_HEADER: { 3778 if (First) { 3779 Error("missing submodule metadata record at beginning of block"); 3780 return true; 3781 } 3782 3783 if (!CurrentModule) 3784 break; 3785 3786 // We lazily associate headers with their modules via the HeaderInfoTable. 3787 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 3788 // of complete filenames or remove it entirely. 3789 break; 3790 } 3791 3792 case SUBMODULE_TOPHEADER: { 3793 if (First) { 3794 Error("missing submodule metadata record at beginning of block"); 3795 return true; 3796 } 3797 3798 if (!CurrentModule) 3799 break; 3800 3801 CurrentModule->addTopHeaderFilename(Blob); 3802 break; 3803 } 3804 3805 case SUBMODULE_UMBRELLA_DIR: { 3806 if (First) { 3807 Error("missing submodule metadata record at beginning of block"); 3808 return true; 3809 } 3810 3811 if (!CurrentModule) 3812 break; 3813 3814 if (const DirectoryEntry *Umbrella 3815 = PP.getFileManager().getDirectory(Blob)) { 3816 if (!CurrentModule->getUmbrellaDir()) 3817 ModMap.setUmbrellaDir(CurrentModule, Umbrella); 3818 else if (CurrentModule->getUmbrellaDir() != Umbrella) { 3819 Error("mismatched umbrella directories in submodule"); 3820 return true; 3821 } 3822 } 3823 break; 3824 } 3825 3826 case SUBMODULE_METADATA: { 3827 if (!First) { 3828 Error("submodule metadata record not at beginning of block"); 3829 return true; 3830 } 3831 First = false; 3832 3833 F.BaseSubmoduleID = getTotalNumSubmodules(); 3834 F.LocalNumSubmodules = Record[0]; 3835 unsigned LocalBaseSubmoduleID = Record[1]; 3836 if (F.LocalNumSubmodules > 0) { 3837 // Introduce the global -> local mapping for submodules within this 3838 // module. 3839 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 3840 3841 // Introduce the local -> global mapping for submodules within this 3842 // module. 3843 F.SubmoduleRemap.insertOrReplace( 3844 std::make_pair(LocalBaseSubmoduleID, 3845 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 3846 3847 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 3848 } 3849 break; 3850 } 3851 3852 case SUBMODULE_IMPORTS: { 3853 if (First) { 3854 Error("missing submodule metadata record at beginning of block"); 3855 return true; 3856 } 3857 3858 if (!CurrentModule) 3859 break; 3860 3861 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 3862 UnresolvedModuleRef Unresolved; 3863 Unresolved.File = &F; 3864 Unresolved.Mod = CurrentModule; 3865 Unresolved.ID = Record[Idx]; 3866 Unresolved.Kind = UnresolvedModuleRef::Import; 3867 Unresolved.IsWildcard = false; 3868 UnresolvedModuleRefs.push_back(Unresolved); 3869 } 3870 break; 3871 } 3872 3873 case SUBMODULE_EXPORTS: { 3874 if (First) { 3875 Error("missing submodule metadata record at beginning of block"); 3876 return true; 3877 } 3878 3879 if (!CurrentModule) 3880 break; 3881 3882 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 3883 UnresolvedModuleRef Unresolved; 3884 Unresolved.File = &F; 3885 Unresolved.Mod = CurrentModule; 3886 Unresolved.ID = Record[Idx]; 3887 Unresolved.Kind = UnresolvedModuleRef::Export; 3888 Unresolved.IsWildcard = Record[Idx + 1]; 3889 UnresolvedModuleRefs.push_back(Unresolved); 3890 } 3891 3892 // Once we've loaded the set of exports, there's no reason to keep 3893 // the parsed, unresolved exports around. 3894 CurrentModule->UnresolvedExports.clear(); 3895 break; 3896 } 3897 case SUBMODULE_REQUIRES: { 3898 if (First) { 3899 Error("missing submodule metadata record at beginning of block"); 3900 return true; 3901 } 3902 3903 if (!CurrentModule) 3904 break; 3905 3906 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 3907 Context.getTargetInfo()); 3908 break; 3909 } 3910 3911 case SUBMODULE_LINK_LIBRARY: 3912 if (First) { 3913 Error("missing submodule metadata record at beginning of block"); 3914 return true; 3915 } 3916 3917 if (!CurrentModule) 3918 break; 3919 3920 CurrentModule->LinkLibraries.push_back( 3921 Module::LinkLibrary(Blob, Record[0])); 3922 break; 3923 3924 case SUBMODULE_CONFIG_MACRO: 3925 if (First) { 3926 Error("missing submodule metadata record at beginning of block"); 3927 return true; 3928 } 3929 3930 if (!CurrentModule) 3931 break; 3932 3933 CurrentModule->ConfigMacros.push_back(Blob.str()); 3934 break; 3935 3936 case SUBMODULE_CONFLICT: { 3937 if (First) { 3938 Error("missing submodule metadata record at beginning of block"); 3939 return true; 3940 } 3941 3942 if (!CurrentModule) 3943 break; 3944 3945 UnresolvedModuleRef Unresolved; 3946 Unresolved.File = &F; 3947 Unresolved.Mod = CurrentModule; 3948 Unresolved.ID = Record[0]; 3949 Unresolved.Kind = UnresolvedModuleRef::Conflict; 3950 Unresolved.IsWildcard = false; 3951 Unresolved.String = Blob; 3952 UnresolvedModuleRefs.push_back(Unresolved); 3953 break; 3954 } 3955 } 3956 } 3957 } 3958 3959 /// \brief Parse the record that corresponds to a LangOptions data 3960 /// structure. 3961 /// 3962 /// This routine parses the language options from the AST file and then gives 3963 /// them to the AST listener if one is set. 3964 /// 3965 /// \returns true if the listener deems the file unacceptable, false otherwise. 3966 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 3967 bool Complain, 3968 ASTReaderListener &Listener) { 3969 LangOptions LangOpts; 3970 unsigned Idx = 0; 3971 #define LANGOPT(Name, Bits, Default, Description) \ 3972 LangOpts.Name = Record[Idx++]; 3973 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 3974 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 3975 #include "clang/Basic/LangOptions.def" 3976 #define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++]; 3977 #include "clang/Basic/Sanitizers.def" 3978 3979 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 3980 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 3981 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 3982 3983 unsigned Length = Record[Idx++]; 3984 LangOpts.CurrentModule.assign(Record.begin() + Idx, 3985 Record.begin() + Idx + Length); 3986 3987 Idx += Length; 3988 3989 // Comment options. 3990 for (unsigned N = Record[Idx++]; N; --N) { 3991 LangOpts.CommentOpts.BlockCommandNames.push_back( 3992 ReadString(Record, Idx)); 3993 } 3994 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 3995 3996 return Listener.ReadLanguageOptions(LangOpts, Complain); 3997 } 3998 3999 bool ASTReader::ParseTargetOptions(const RecordData &Record, 4000 bool Complain, 4001 ASTReaderListener &Listener) { 4002 unsigned Idx = 0; 4003 TargetOptions TargetOpts; 4004 TargetOpts.Triple = ReadString(Record, Idx); 4005 TargetOpts.CPU = ReadString(Record, Idx); 4006 TargetOpts.ABI = ReadString(Record, Idx); 4007 TargetOpts.CXXABI = ReadString(Record, Idx); 4008 TargetOpts.LinkerVersion = ReadString(Record, Idx); 4009 for (unsigned N = Record[Idx++]; N; --N) { 4010 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4011 } 4012 for (unsigned N = Record[Idx++]; N; --N) { 4013 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4014 } 4015 4016 return Listener.ReadTargetOptions(TargetOpts, Complain); 4017 } 4018 4019 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4020 ASTReaderListener &Listener) { 4021 DiagnosticOptions DiagOpts; 4022 unsigned Idx = 0; 4023 #define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++]; 4024 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4025 DiagOpts.set##Name(static_cast<Type>(Record[Idx++])); 4026 #include "clang/Basic/DiagnosticOptions.def" 4027 4028 for (unsigned N = Record[Idx++]; N; --N) { 4029 DiagOpts.Warnings.push_back(ReadString(Record, Idx)); 4030 } 4031 4032 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4033 } 4034 4035 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4036 ASTReaderListener &Listener) { 4037 FileSystemOptions FSOpts; 4038 unsigned Idx = 0; 4039 FSOpts.WorkingDir = ReadString(Record, Idx); 4040 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4041 } 4042 4043 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4044 bool Complain, 4045 ASTReaderListener &Listener) { 4046 HeaderSearchOptions HSOpts; 4047 unsigned Idx = 0; 4048 HSOpts.Sysroot = ReadString(Record, Idx); 4049 4050 // Include entries. 4051 for (unsigned N = Record[Idx++]; N; --N) { 4052 std::string Path = ReadString(Record, Idx); 4053 frontend::IncludeDirGroup Group 4054 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4055 bool IsFramework = Record[Idx++]; 4056 bool IgnoreSysRoot = Record[Idx++]; 4057 HSOpts.UserEntries.push_back( 4058 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 4059 } 4060 4061 // System header prefixes. 4062 for (unsigned N = Record[Idx++]; N; --N) { 4063 std::string Prefix = ReadString(Record, Idx); 4064 bool IsSystemHeader = Record[Idx++]; 4065 HSOpts.SystemHeaderPrefixes.push_back( 4066 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 4067 } 4068 4069 HSOpts.ResourceDir = ReadString(Record, Idx); 4070 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4071 HSOpts.DisableModuleHash = Record[Idx++]; 4072 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4073 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4074 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4075 HSOpts.UseLibcxx = Record[Idx++]; 4076 4077 return Listener.ReadHeaderSearchOptions(HSOpts, Complain); 4078 } 4079 4080 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4081 bool Complain, 4082 ASTReaderListener &Listener, 4083 std::string &SuggestedPredefines) { 4084 PreprocessorOptions PPOpts; 4085 unsigned Idx = 0; 4086 4087 // Macro definitions/undefs 4088 for (unsigned N = Record[Idx++]; N; --N) { 4089 std::string Macro = ReadString(Record, Idx); 4090 bool IsUndef = Record[Idx++]; 4091 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4092 } 4093 4094 // Includes 4095 for (unsigned N = Record[Idx++]; N; --N) { 4096 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4097 } 4098 4099 // Macro Includes 4100 for (unsigned N = Record[Idx++]; N; --N) { 4101 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4102 } 4103 4104 PPOpts.UsePredefines = Record[Idx++]; 4105 PPOpts.DetailedRecord = Record[Idx++]; 4106 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4107 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4108 PPOpts.ObjCXXARCStandardLibrary = 4109 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4110 SuggestedPredefines.clear(); 4111 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4112 SuggestedPredefines); 4113 } 4114 4115 std::pair<ModuleFile *, unsigned> 4116 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4117 GlobalPreprocessedEntityMapType::iterator 4118 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4119 assert(I != GlobalPreprocessedEntityMap.end() && 4120 "Corrupted global preprocessed entity map"); 4121 ModuleFile *M = I->second; 4122 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4123 return std::make_pair(M, LocalIndex); 4124 } 4125 4126 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 4127 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4128 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4129 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4130 Mod.NumPreprocessedEntities); 4131 4132 return std::make_pair(PreprocessingRecord::iterator(), 4133 PreprocessingRecord::iterator()); 4134 } 4135 4136 std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator> 4137 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4138 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4139 ModuleDeclIterator(this, &Mod, 4140 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4141 } 4142 4143 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4144 PreprocessedEntityID PPID = Index+1; 4145 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4146 ModuleFile &M = *PPInfo.first; 4147 unsigned LocalIndex = PPInfo.second; 4148 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4149 4150 if (!PP.getPreprocessingRecord()) { 4151 Error("no preprocessing record"); 4152 return 0; 4153 } 4154 4155 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4156 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4157 4158 llvm::BitstreamEntry Entry = 4159 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4160 if (Entry.Kind != llvm::BitstreamEntry::Record) 4161 return 0; 4162 4163 // Read the record. 4164 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 4165 ReadSourceLocation(M, PPOffs.End)); 4166 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4167 StringRef Blob; 4168 RecordData Record; 4169 PreprocessorDetailRecordTypes RecType = 4170 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4171 Entry.ID, Record, &Blob); 4172 switch (RecType) { 4173 case PPD_MACRO_EXPANSION: { 4174 bool isBuiltin = Record[0]; 4175 IdentifierInfo *Name = 0; 4176 MacroDefinition *Def = 0; 4177 if (isBuiltin) 4178 Name = getLocalIdentifier(M, Record[1]); 4179 else { 4180 PreprocessedEntityID 4181 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 4182 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 4183 } 4184 4185 MacroExpansion *ME; 4186 if (isBuiltin) 4187 ME = new (PPRec) MacroExpansion(Name, Range); 4188 else 4189 ME = new (PPRec) MacroExpansion(Def, Range); 4190 4191 return ME; 4192 } 4193 4194 case PPD_MACRO_DEFINITION: { 4195 // Decode the identifier info and then check again; if the macro is 4196 // still defined and associated with the identifier, 4197 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4198 MacroDefinition *MD 4199 = new (PPRec) MacroDefinition(II, Range); 4200 4201 if (DeserializationListener) 4202 DeserializationListener->MacroDefinitionRead(PPID, MD); 4203 4204 return MD; 4205 } 4206 4207 case PPD_INCLUSION_DIRECTIVE: { 4208 const char *FullFileNameStart = Blob.data() + Record[0]; 4209 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4210 const FileEntry *File = 0; 4211 if (!FullFileName.empty()) 4212 File = PP.getFileManager().getFile(FullFileName); 4213 4214 // FIXME: Stable encoding 4215 InclusionDirective::InclusionKind Kind 4216 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4217 InclusionDirective *ID 4218 = new (PPRec) InclusionDirective(PPRec, Kind, 4219 StringRef(Blob.data(), Record[0]), 4220 Record[1], Record[3], 4221 File, 4222 Range); 4223 return ID; 4224 } 4225 } 4226 4227 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4228 } 4229 4230 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4231 /// preprocessed entities or the entities it contains are not the ones we are 4232 /// looking for. Find the next module that contains entities and return the ID 4233 /// of the first entry. 4234 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 4235 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 4236 ++SLocMapI; 4237 for (GlobalSLocOffsetMapType::const_iterator 4238 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 4239 ModuleFile &M = *SLocMapI->second; 4240 if (M.NumPreprocessedEntities) 4241 return M.BasePreprocessedEntityID; 4242 } 4243 4244 return getTotalNumPreprocessedEntities(); 4245 } 4246 4247 namespace { 4248 4249 template <unsigned PPEntityOffset::*PPLoc> 4250 struct PPEntityComp { 4251 const ASTReader &Reader; 4252 ModuleFile &M; 4253 4254 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 4255 4256 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 4257 SourceLocation LHS = getLoc(L); 4258 SourceLocation RHS = getLoc(R); 4259 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4260 } 4261 4262 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 4263 SourceLocation LHS = getLoc(L); 4264 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4265 } 4266 4267 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 4268 SourceLocation RHS = getLoc(R); 4269 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4270 } 4271 4272 SourceLocation getLoc(const PPEntityOffset &PPE) const { 4273 return Reader.ReadSourceLocation(M, PPE.*PPLoc); 4274 } 4275 }; 4276 4277 } 4278 4279 /// \brief Returns the first preprocessed entity ID that ends after \arg BLoc. 4280 PreprocessedEntityID 4281 ASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const { 4282 if (SourceMgr.isLocalSourceLocation(BLoc)) 4283 return getTotalNumPreprocessedEntities(); 4284 4285 GlobalSLocOffsetMapType::const_iterator 4286 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 4287 BLoc.getOffset() - 1); 4288 assert(SLocMapI != GlobalSLocOffsetMap.end() && 4289 "Corrupted global sloc offset map"); 4290 4291 if (SLocMapI->second->NumPreprocessedEntities == 0) 4292 return findNextPreprocessedEntity(SLocMapI); 4293 4294 ModuleFile &M = *SLocMapI->second; 4295 typedef const PPEntityOffset *pp_iterator; 4296 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 4297 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 4298 4299 size_t Count = M.NumPreprocessedEntities; 4300 size_t Half; 4301 pp_iterator First = pp_begin; 4302 pp_iterator PPI; 4303 4304 // Do a binary search manually instead of using std::lower_bound because 4305 // The end locations of entities may be unordered (when a macro expansion 4306 // is inside another macro argument), but for this case it is not important 4307 // whether we get the first macro expansion or its containing macro. 4308 while (Count > 0) { 4309 Half = Count/2; 4310 PPI = First; 4311 std::advance(PPI, Half); 4312 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 4313 BLoc)){ 4314 First = PPI; 4315 ++First; 4316 Count = Count - Half - 1; 4317 } else 4318 Count = Half; 4319 } 4320 4321 if (PPI == pp_end) 4322 return findNextPreprocessedEntity(SLocMapI); 4323 4324 return M.BasePreprocessedEntityID + (PPI - pp_begin); 4325 } 4326 4327 /// \brief Returns the first preprocessed entity ID that begins after \arg ELoc. 4328 PreprocessedEntityID 4329 ASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const { 4330 if (SourceMgr.isLocalSourceLocation(ELoc)) 4331 return getTotalNumPreprocessedEntities(); 4332 4333 GlobalSLocOffsetMapType::const_iterator 4334 SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 4335 ELoc.getOffset() - 1); 4336 assert(SLocMapI != GlobalSLocOffsetMap.end() && 4337 "Corrupted global sloc offset map"); 4338 4339 if (SLocMapI->second->NumPreprocessedEntities == 0) 4340 return findNextPreprocessedEntity(SLocMapI); 4341 4342 ModuleFile &M = *SLocMapI->second; 4343 typedef const PPEntityOffset *pp_iterator; 4344 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 4345 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 4346 pp_iterator PPI = 4347 std::upper_bound(pp_begin, pp_end, ELoc, 4348 PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 4349 4350 if (PPI == pp_end) 4351 return findNextPreprocessedEntity(SLocMapI); 4352 4353 return M.BasePreprocessedEntityID + (PPI - pp_begin); 4354 } 4355 4356 /// \brief Returns a pair of [Begin, End) indices of preallocated 4357 /// preprocessed entities that \arg Range encompasses. 4358 std::pair<unsigned, unsigned> 4359 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 4360 if (Range.isInvalid()) 4361 return std::make_pair(0,0); 4362 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 4363 4364 PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin()); 4365 PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd()); 4366 return std::make_pair(BeginID, EndID); 4367 } 4368 4369 /// \brief Optionally returns true or false if the preallocated preprocessed 4370 /// entity with index \arg Index came from file \arg FID. 4371 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 4372 FileID FID) { 4373 if (FID.isInvalid()) 4374 return false; 4375 4376 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4377 ModuleFile &M = *PPInfo.first; 4378 unsigned LocalIndex = PPInfo.second; 4379 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4380 4381 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 4382 if (Loc.isInvalid()) 4383 return false; 4384 4385 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 4386 return true; 4387 else 4388 return false; 4389 } 4390 4391 namespace { 4392 /// \brief Visitor used to search for information about a header file. 4393 class HeaderFileInfoVisitor { 4394 const FileEntry *FE; 4395 4396 Optional<HeaderFileInfo> HFI; 4397 4398 public: 4399 explicit HeaderFileInfoVisitor(const FileEntry *FE) 4400 : FE(FE) { } 4401 4402 static bool visit(ModuleFile &M, void *UserData) { 4403 HeaderFileInfoVisitor *This 4404 = static_cast<HeaderFileInfoVisitor *>(UserData); 4405 4406 HeaderFileInfoLookupTable *Table 4407 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 4408 if (!Table) 4409 return false; 4410 4411 // Look in the on-disk hash table for an entry for this file name. 4412 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE); 4413 if (Pos == Table->end()) 4414 return false; 4415 4416 This->HFI = *Pos; 4417 return true; 4418 } 4419 4420 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 4421 }; 4422 } 4423 4424 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 4425 HeaderFileInfoVisitor Visitor(FE); 4426 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 4427 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 4428 return *HFI; 4429 4430 return HeaderFileInfo(); 4431 } 4432 4433 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 4434 // FIXME: Make it work properly with modules. 4435 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 4436 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 4437 ModuleFile &F = *(*I); 4438 unsigned Idx = 0; 4439 DiagStates.clear(); 4440 assert(!Diag.DiagStates.empty()); 4441 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 4442 while (Idx < F.PragmaDiagMappings.size()) { 4443 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 4444 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 4445 if (DiagStateID != 0) { 4446 Diag.DiagStatePoints.push_back( 4447 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 4448 FullSourceLoc(Loc, SourceMgr))); 4449 continue; 4450 } 4451 4452 assert(DiagStateID == 0); 4453 // A new DiagState was created here. 4454 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 4455 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 4456 DiagStates.push_back(NewState); 4457 Diag.DiagStatePoints.push_back( 4458 DiagnosticsEngine::DiagStatePoint(NewState, 4459 FullSourceLoc(Loc, SourceMgr))); 4460 while (1) { 4461 assert(Idx < F.PragmaDiagMappings.size() && 4462 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 4463 if (Idx >= F.PragmaDiagMappings.size()) { 4464 break; // Something is messed up but at least avoid infinite loop in 4465 // release build. 4466 } 4467 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 4468 if (DiagID == (unsigned)-1) { 4469 break; // no more diag/map pairs for this location. 4470 } 4471 diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++]; 4472 DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc); 4473 Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo); 4474 } 4475 } 4476 } 4477 } 4478 4479 /// \brief Get the correct cursor and offset for loading a type. 4480 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 4481 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 4482 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 4483 ModuleFile *M = I->second; 4484 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 4485 } 4486 4487 /// \brief Read and return the type with the given index.. 4488 /// 4489 /// The index is the type ID, shifted and minus the number of predefs. This 4490 /// routine actually reads the record corresponding to the type at the given 4491 /// location. It is a helper routine for GetType, which deals with reading type 4492 /// IDs. 4493 QualType ASTReader::readTypeRecord(unsigned Index) { 4494 RecordLocation Loc = TypeCursorForIndex(Index); 4495 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 4496 4497 // Keep track of where we are in the stream, then jump back there 4498 // after reading this type. 4499 SavedStreamPosition SavedPosition(DeclsCursor); 4500 4501 ReadingKindTracker ReadingKind(Read_Type, *this); 4502 4503 // Note that we are loading a type record. 4504 Deserializing AType(this); 4505 4506 unsigned Idx = 0; 4507 DeclsCursor.JumpToBit(Loc.Offset); 4508 RecordData Record; 4509 unsigned Code = DeclsCursor.ReadCode(); 4510 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 4511 case TYPE_EXT_QUAL: { 4512 if (Record.size() != 2) { 4513 Error("Incorrect encoding of extended qualifier type"); 4514 return QualType(); 4515 } 4516 QualType Base = readType(*Loc.F, Record, Idx); 4517 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 4518 return Context.getQualifiedType(Base, Quals); 4519 } 4520 4521 case TYPE_COMPLEX: { 4522 if (Record.size() != 1) { 4523 Error("Incorrect encoding of complex type"); 4524 return QualType(); 4525 } 4526 QualType ElemType = readType(*Loc.F, Record, Idx); 4527 return Context.getComplexType(ElemType); 4528 } 4529 4530 case TYPE_POINTER: { 4531 if (Record.size() != 1) { 4532 Error("Incorrect encoding of pointer type"); 4533 return QualType(); 4534 } 4535 QualType PointeeType = readType(*Loc.F, Record, Idx); 4536 return Context.getPointerType(PointeeType); 4537 } 4538 4539 case TYPE_DECAYED: { 4540 if (Record.size() != 1) { 4541 Error("Incorrect encoding of decayed type"); 4542 return QualType(); 4543 } 4544 QualType OriginalType = readType(*Loc.F, Record, Idx); 4545 QualType DT = Context.getAdjustedParameterType(OriginalType); 4546 if (!isa<DecayedType>(DT)) 4547 Error("Decayed type does not decay"); 4548 return DT; 4549 } 4550 4551 case TYPE_ADJUSTED: { 4552 if (Record.size() != 2) { 4553 Error("Incorrect encoding of adjusted type"); 4554 return QualType(); 4555 } 4556 QualType OriginalTy = readType(*Loc.F, Record, Idx); 4557 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 4558 return Context.getAdjustedType(OriginalTy, AdjustedTy); 4559 } 4560 4561 case TYPE_BLOCK_POINTER: { 4562 if (Record.size() != 1) { 4563 Error("Incorrect encoding of block pointer type"); 4564 return QualType(); 4565 } 4566 QualType PointeeType = readType(*Loc.F, Record, Idx); 4567 return Context.getBlockPointerType(PointeeType); 4568 } 4569 4570 case TYPE_LVALUE_REFERENCE: { 4571 if (Record.size() != 2) { 4572 Error("Incorrect encoding of lvalue reference type"); 4573 return QualType(); 4574 } 4575 QualType PointeeType = readType(*Loc.F, Record, Idx); 4576 return Context.getLValueReferenceType(PointeeType, Record[1]); 4577 } 4578 4579 case TYPE_RVALUE_REFERENCE: { 4580 if (Record.size() != 1) { 4581 Error("Incorrect encoding of rvalue reference type"); 4582 return QualType(); 4583 } 4584 QualType PointeeType = readType(*Loc.F, Record, Idx); 4585 return Context.getRValueReferenceType(PointeeType); 4586 } 4587 4588 case TYPE_MEMBER_POINTER: { 4589 if (Record.size() != 2) { 4590 Error("Incorrect encoding of member pointer type"); 4591 return QualType(); 4592 } 4593 QualType PointeeType = readType(*Loc.F, Record, Idx); 4594 QualType ClassType = readType(*Loc.F, Record, Idx); 4595 if (PointeeType.isNull() || ClassType.isNull()) 4596 return QualType(); 4597 4598 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 4599 } 4600 4601 case TYPE_CONSTANT_ARRAY: { 4602 QualType ElementType = readType(*Loc.F, Record, Idx); 4603 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4604 unsigned IndexTypeQuals = Record[2]; 4605 unsigned Idx = 3; 4606 llvm::APInt Size = ReadAPInt(Record, Idx); 4607 return Context.getConstantArrayType(ElementType, Size, 4608 ASM, IndexTypeQuals); 4609 } 4610 4611 case TYPE_INCOMPLETE_ARRAY: { 4612 QualType ElementType = readType(*Loc.F, Record, Idx); 4613 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4614 unsigned IndexTypeQuals = Record[2]; 4615 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 4616 } 4617 4618 case TYPE_VARIABLE_ARRAY: { 4619 QualType ElementType = readType(*Loc.F, Record, Idx); 4620 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 4621 unsigned IndexTypeQuals = Record[2]; 4622 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 4623 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 4624 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 4625 ASM, IndexTypeQuals, 4626 SourceRange(LBLoc, RBLoc)); 4627 } 4628 4629 case TYPE_VECTOR: { 4630 if (Record.size() != 3) { 4631 Error("incorrect encoding of vector type in AST file"); 4632 return QualType(); 4633 } 4634 4635 QualType ElementType = readType(*Loc.F, Record, Idx); 4636 unsigned NumElements = Record[1]; 4637 unsigned VecKind = Record[2]; 4638 return Context.getVectorType(ElementType, NumElements, 4639 (VectorType::VectorKind)VecKind); 4640 } 4641 4642 case TYPE_EXT_VECTOR: { 4643 if (Record.size() != 3) { 4644 Error("incorrect encoding of extended vector type in AST file"); 4645 return QualType(); 4646 } 4647 4648 QualType ElementType = readType(*Loc.F, Record, Idx); 4649 unsigned NumElements = Record[1]; 4650 return Context.getExtVectorType(ElementType, NumElements); 4651 } 4652 4653 case TYPE_FUNCTION_NO_PROTO: { 4654 if (Record.size() != 6) { 4655 Error("incorrect encoding of no-proto function type"); 4656 return QualType(); 4657 } 4658 QualType ResultType = readType(*Loc.F, Record, Idx); 4659 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 4660 (CallingConv)Record[4], Record[5]); 4661 return Context.getFunctionNoProtoType(ResultType, Info); 4662 } 4663 4664 case TYPE_FUNCTION_PROTO: { 4665 QualType ResultType = readType(*Loc.F, Record, Idx); 4666 4667 FunctionProtoType::ExtProtoInfo EPI; 4668 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 4669 /*hasregparm*/ Record[2], 4670 /*regparm*/ Record[3], 4671 static_cast<CallingConv>(Record[4]), 4672 /*produces*/ Record[5]); 4673 4674 unsigned Idx = 6; 4675 unsigned NumParams = Record[Idx++]; 4676 SmallVector<QualType, 16> ParamTypes; 4677 for (unsigned I = 0; I != NumParams; ++I) 4678 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 4679 4680 EPI.Variadic = Record[Idx++]; 4681 EPI.HasTrailingReturn = Record[Idx++]; 4682 EPI.TypeQuals = Record[Idx++]; 4683 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 4684 ExceptionSpecificationType EST = 4685 static_cast<ExceptionSpecificationType>(Record[Idx++]); 4686 EPI.ExceptionSpecType = EST; 4687 SmallVector<QualType, 2> Exceptions; 4688 if (EST == EST_Dynamic) { 4689 EPI.NumExceptions = Record[Idx++]; 4690 for (unsigned I = 0; I != EPI.NumExceptions; ++I) 4691 Exceptions.push_back(readType(*Loc.F, Record, Idx)); 4692 EPI.Exceptions = Exceptions.data(); 4693 } else if (EST == EST_ComputedNoexcept) { 4694 EPI.NoexceptExpr = ReadExpr(*Loc.F); 4695 } else if (EST == EST_Uninstantiated) { 4696 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4697 EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4698 } else if (EST == EST_Unevaluated) { 4699 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 4700 } 4701 return Context.getFunctionType(ResultType, ParamTypes, EPI); 4702 } 4703 4704 case TYPE_UNRESOLVED_USING: { 4705 unsigned Idx = 0; 4706 return Context.getTypeDeclType( 4707 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 4708 } 4709 4710 case TYPE_TYPEDEF: { 4711 if (Record.size() != 2) { 4712 Error("incorrect encoding of typedef type"); 4713 return QualType(); 4714 } 4715 unsigned Idx = 0; 4716 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 4717 QualType Canonical = readType(*Loc.F, Record, Idx); 4718 if (!Canonical.isNull()) 4719 Canonical = Context.getCanonicalType(Canonical); 4720 return Context.getTypedefType(Decl, Canonical); 4721 } 4722 4723 case TYPE_TYPEOF_EXPR: 4724 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 4725 4726 case TYPE_TYPEOF: { 4727 if (Record.size() != 1) { 4728 Error("incorrect encoding of typeof(type) in AST file"); 4729 return QualType(); 4730 } 4731 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4732 return Context.getTypeOfType(UnderlyingType); 4733 } 4734 4735 case TYPE_DECLTYPE: { 4736 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4737 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 4738 } 4739 4740 case TYPE_UNARY_TRANSFORM: { 4741 QualType BaseType = readType(*Loc.F, Record, Idx); 4742 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 4743 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 4744 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 4745 } 4746 4747 case TYPE_AUTO: { 4748 QualType Deduced = readType(*Loc.F, Record, Idx); 4749 bool IsDecltypeAuto = Record[Idx++]; 4750 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 4751 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent); 4752 } 4753 4754 case TYPE_RECORD: { 4755 if (Record.size() != 2) { 4756 Error("incorrect encoding of record type"); 4757 return QualType(); 4758 } 4759 unsigned Idx = 0; 4760 bool IsDependent = Record[Idx++]; 4761 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 4762 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 4763 QualType T = Context.getRecordType(RD); 4764 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4765 return T; 4766 } 4767 4768 case TYPE_ENUM: { 4769 if (Record.size() != 2) { 4770 Error("incorrect encoding of enum type"); 4771 return QualType(); 4772 } 4773 unsigned Idx = 0; 4774 bool IsDependent = Record[Idx++]; 4775 QualType T 4776 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 4777 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4778 return T; 4779 } 4780 4781 case TYPE_ATTRIBUTED: { 4782 if (Record.size() != 3) { 4783 Error("incorrect encoding of attributed type"); 4784 return QualType(); 4785 } 4786 QualType modifiedType = readType(*Loc.F, Record, Idx); 4787 QualType equivalentType = readType(*Loc.F, Record, Idx); 4788 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 4789 return Context.getAttributedType(kind, modifiedType, equivalentType); 4790 } 4791 4792 case TYPE_PAREN: { 4793 if (Record.size() != 1) { 4794 Error("incorrect encoding of paren type"); 4795 return QualType(); 4796 } 4797 QualType InnerType = readType(*Loc.F, Record, Idx); 4798 return Context.getParenType(InnerType); 4799 } 4800 4801 case TYPE_PACK_EXPANSION: { 4802 if (Record.size() != 2) { 4803 Error("incorrect encoding of pack expansion type"); 4804 return QualType(); 4805 } 4806 QualType Pattern = readType(*Loc.F, Record, Idx); 4807 if (Pattern.isNull()) 4808 return QualType(); 4809 Optional<unsigned> NumExpansions; 4810 if (Record[1]) 4811 NumExpansions = Record[1] - 1; 4812 return Context.getPackExpansionType(Pattern, NumExpansions); 4813 } 4814 4815 case TYPE_ELABORATED: { 4816 unsigned Idx = 0; 4817 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4818 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4819 QualType NamedType = readType(*Loc.F, Record, Idx); 4820 return Context.getElaboratedType(Keyword, NNS, NamedType); 4821 } 4822 4823 case TYPE_OBJC_INTERFACE: { 4824 unsigned Idx = 0; 4825 ObjCInterfaceDecl *ItfD 4826 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 4827 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 4828 } 4829 4830 case TYPE_OBJC_OBJECT: { 4831 unsigned Idx = 0; 4832 QualType Base = readType(*Loc.F, Record, Idx); 4833 unsigned NumProtos = Record[Idx++]; 4834 SmallVector<ObjCProtocolDecl*, 4> Protos; 4835 for (unsigned I = 0; I != NumProtos; ++I) 4836 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 4837 return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 4838 } 4839 4840 case TYPE_OBJC_OBJECT_POINTER: { 4841 unsigned Idx = 0; 4842 QualType Pointee = readType(*Loc.F, Record, Idx); 4843 return Context.getObjCObjectPointerType(Pointee); 4844 } 4845 4846 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 4847 unsigned Idx = 0; 4848 QualType Parm = readType(*Loc.F, Record, Idx); 4849 QualType Replacement = readType(*Loc.F, Record, Idx); 4850 return 4851 Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm), 4852 Replacement); 4853 } 4854 4855 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 4856 unsigned Idx = 0; 4857 QualType Parm = readType(*Loc.F, Record, Idx); 4858 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 4859 return Context.getSubstTemplateTypeParmPackType( 4860 cast<TemplateTypeParmType>(Parm), 4861 ArgPack); 4862 } 4863 4864 case TYPE_INJECTED_CLASS_NAME: { 4865 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 4866 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 4867 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 4868 // for AST reading, too much interdependencies. 4869 return 4870 QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0); 4871 } 4872 4873 case TYPE_TEMPLATE_TYPE_PARM: { 4874 unsigned Idx = 0; 4875 unsigned Depth = Record[Idx++]; 4876 unsigned Index = Record[Idx++]; 4877 bool Pack = Record[Idx++]; 4878 TemplateTypeParmDecl *D 4879 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 4880 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 4881 } 4882 4883 case TYPE_DEPENDENT_NAME: { 4884 unsigned Idx = 0; 4885 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4886 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4887 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 4888 QualType Canon = readType(*Loc.F, Record, Idx); 4889 if (!Canon.isNull()) 4890 Canon = Context.getCanonicalType(Canon); 4891 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 4892 } 4893 4894 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 4895 unsigned Idx = 0; 4896 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 4897 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 4898 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 4899 unsigned NumArgs = Record[Idx++]; 4900 SmallVector<TemplateArgument, 8> Args; 4901 Args.reserve(NumArgs); 4902 while (NumArgs--) 4903 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 4904 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 4905 Args.size(), Args.data()); 4906 } 4907 4908 case TYPE_DEPENDENT_SIZED_ARRAY: { 4909 unsigned Idx = 0; 4910 4911 // ArrayType 4912 QualType ElementType = readType(*Loc.F, Record, Idx); 4913 ArrayType::ArraySizeModifier ASM 4914 = (ArrayType::ArraySizeModifier)Record[Idx++]; 4915 unsigned IndexTypeQuals = Record[Idx++]; 4916 4917 // DependentSizedArrayType 4918 Expr *NumElts = ReadExpr(*Loc.F); 4919 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 4920 4921 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 4922 IndexTypeQuals, Brackets); 4923 } 4924 4925 case TYPE_TEMPLATE_SPECIALIZATION: { 4926 unsigned Idx = 0; 4927 bool IsDependent = Record[Idx++]; 4928 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 4929 SmallVector<TemplateArgument, 8> Args; 4930 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 4931 QualType Underlying = readType(*Loc.F, Record, Idx); 4932 QualType T; 4933 if (Underlying.isNull()) 4934 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 4935 Args.size()); 4936 else 4937 T = Context.getTemplateSpecializationType(Name, Args.data(), 4938 Args.size(), Underlying); 4939 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 4940 return T; 4941 } 4942 4943 case TYPE_ATOMIC: { 4944 if (Record.size() != 1) { 4945 Error("Incorrect encoding of atomic type"); 4946 return QualType(); 4947 } 4948 QualType ValueType = readType(*Loc.F, Record, Idx); 4949 return Context.getAtomicType(ValueType); 4950 } 4951 } 4952 llvm_unreachable("Invalid TypeCode!"); 4953 } 4954 4955 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 4956 ASTReader &Reader; 4957 ModuleFile &F; 4958 const ASTReader::RecordData &Record; 4959 unsigned &Idx; 4960 4961 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 4962 unsigned &I) { 4963 return Reader.ReadSourceLocation(F, R, I); 4964 } 4965 4966 template<typename T> 4967 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 4968 return Reader.ReadDeclAs<T>(F, Record, Idx); 4969 } 4970 4971 public: 4972 TypeLocReader(ASTReader &Reader, ModuleFile &F, 4973 const ASTReader::RecordData &Record, unsigned &Idx) 4974 : Reader(Reader), F(F), Record(Record), Idx(Idx) 4975 { } 4976 4977 // We want compile-time assurance that we've enumerated all of 4978 // these, so unfortunately we have to declare them first, then 4979 // define them out-of-line. 4980 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4981 #define TYPELOC(CLASS, PARENT) \ 4982 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 4983 #include "clang/AST/TypeLocNodes.def" 4984 4985 void VisitFunctionTypeLoc(FunctionTypeLoc); 4986 void VisitArrayTypeLoc(ArrayTypeLoc); 4987 }; 4988 4989 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 4990 // nothing to do 4991 } 4992 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 4993 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 4994 if (TL.needsExtraLocalData()) { 4995 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 4996 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 4997 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 4998 TL.setModeAttr(Record[Idx++]); 4999 } 5000 } 5001 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 5002 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5003 } 5004 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 5005 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5006 } 5007 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 5008 // nothing to do 5009 } 5010 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 5011 // nothing to do 5012 } 5013 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5014 TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 5015 } 5016 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5017 TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 5018 } 5019 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5020 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 5021 } 5022 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5023 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5024 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5025 } 5026 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5027 TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 5028 TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 5029 if (Record[Idx++]) 5030 TL.setSizeExpr(Reader.ReadExpr(F)); 5031 else 5032 TL.setSizeExpr(0); 5033 } 5034 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 5035 VisitArrayTypeLoc(TL); 5036 } 5037 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 5038 VisitArrayTypeLoc(TL); 5039 } 5040 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 5041 VisitArrayTypeLoc(TL); 5042 } 5043 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 5044 DependentSizedArrayTypeLoc TL) { 5045 VisitArrayTypeLoc(TL); 5046 } 5047 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 5048 DependentSizedExtVectorTypeLoc TL) { 5049 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5050 } 5051 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 5052 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5053 } 5054 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5055 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5056 } 5057 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5058 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 5059 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5060 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5061 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5062 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 5063 TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 5064 } 5065 } 5066 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 5067 VisitFunctionTypeLoc(TL); 5068 } 5069 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 5070 VisitFunctionTypeLoc(TL); 5071 } 5072 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5073 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5074 } 5075 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5076 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5077 } 5078 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5079 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5080 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5081 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5082 } 5083 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5084 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5085 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5086 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5087 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5088 } 5089 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 5090 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5091 } 5092 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 5093 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5094 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5095 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5096 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5097 } 5098 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 5099 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5100 } 5101 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 5102 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5103 } 5104 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 5105 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5106 } 5107 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 5108 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 5109 if (TL.hasAttrOperand()) { 5110 SourceRange range; 5111 range.setBegin(ReadSourceLocation(Record, Idx)); 5112 range.setEnd(ReadSourceLocation(Record, Idx)); 5113 TL.setAttrOperandParensRange(range); 5114 } 5115 if (TL.hasAttrExprOperand()) { 5116 if (Record[Idx++]) 5117 TL.setAttrExprOperand(Reader.ReadExpr(F)); 5118 else 5119 TL.setAttrExprOperand(0); 5120 } else if (TL.hasAttrEnumOperand()) 5121 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 5122 } 5123 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 5124 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5125 } 5126 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 5127 SubstTemplateTypeParmTypeLoc TL) { 5128 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5129 } 5130 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 5131 SubstTemplateTypeParmPackTypeLoc TL) { 5132 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5133 } 5134 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 5135 TemplateSpecializationTypeLoc TL) { 5136 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5137 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5138 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5139 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5140 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 5141 TL.setArgLocInfo(i, 5142 Reader.GetTemplateArgumentLocInfo(F, 5143 TL.getTypePtr()->getArg(i).getKind(), 5144 Record, Idx)); 5145 } 5146 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 5147 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5148 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5149 } 5150 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 5151 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5152 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5153 } 5154 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 5155 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5156 } 5157 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 5158 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5159 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5160 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5161 } 5162 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 5163 DependentTemplateSpecializationTypeLoc TL) { 5164 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5165 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5166 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5167 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5168 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5169 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5170 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 5171 TL.setArgLocInfo(I, 5172 Reader.GetTemplateArgumentLocInfo(F, 5173 TL.getTypePtr()->getArg(I).getKind(), 5174 Record, Idx)); 5175 } 5176 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 5177 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 5178 } 5179 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 5180 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5181 } 5182 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 5183 TL.setHasBaseTypeAsWritten(Record[Idx++]); 5184 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5185 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5186 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 5187 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 5188 } 5189 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 5190 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5191 } 5192 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 5193 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5194 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5195 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5196 } 5197 5198 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 5199 const RecordData &Record, 5200 unsigned &Idx) { 5201 QualType InfoTy = readType(F, Record, Idx); 5202 if (InfoTy.isNull()) 5203 return 0; 5204 5205 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 5206 TypeLocReader TLR(*this, F, Record, Idx); 5207 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 5208 TLR.Visit(TL); 5209 return TInfo; 5210 } 5211 5212 QualType ASTReader::GetType(TypeID ID) { 5213 unsigned FastQuals = ID & Qualifiers::FastMask; 5214 unsigned Index = ID >> Qualifiers::FastWidth; 5215 5216 if (Index < NUM_PREDEF_TYPE_IDS) { 5217 QualType T; 5218 switch ((PredefinedTypeIDs)Index) { 5219 case PREDEF_TYPE_NULL_ID: return QualType(); 5220 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 5221 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 5222 5223 case PREDEF_TYPE_CHAR_U_ID: 5224 case PREDEF_TYPE_CHAR_S_ID: 5225 // FIXME: Check that the signedness of CharTy is correct! 5226 T = Context.CharTy; 5227 break; 5228 5229 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 5230 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 5231 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 5232 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 5233 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 5234 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 5235 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 5236 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 5237 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 5238 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 5239 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 5240 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 5241 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 5242 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 5243 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 5244 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 5245 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 5246 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 5247 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 5248 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 5249 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 5250 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 5251 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 5252 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 5253 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 5254 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 5255 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 5256 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 5257 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 5258 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 5259 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 5260 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 5261 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 5262 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 5263 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 5264 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 5265 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 5266 5267 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 5268 T = Context.getAutoRRefDeductType(); 5269 break; 5270 5271 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 5272 T = Context.ARCUnbridgedCastTy; 5273 break; 5274 5275 case PREDEF_TYPE_VA_LIST_TAG: 5276 T = Context.getVaListTagType(); 5277 break; 5278 5279 case PREDEF_TYPE_BUILTIN_FN: 5280 T = Context.BuiltinFnTy; 5281 break; 5282 } 5283 5284 assert(!T.isNull() && "Unknown predefined type"); 5285 return T.withFastQualifiers(FastQuals); 5286 } 5287 5288 Index -= NUM_PREDEF_TYPE_IDS; 5289 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 5290 if (TypesLoaded[Index].isNull()) { 5291 TypesLoaded[Index] = readTypeRecord(Index); 5292 if (TypesLoaded[Index].isNull()) 5293 return QualType(); 5294 5295 TypesLoaded[Index]->setFromAST(); 5296 if (DeserializationListener) 5297 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 5298 TypesLoaded[Index]); 5299 } 5300 5301 return TypesLoaded[Index].withFastQualifiers(FastQuals); 5302 } 5303 5304 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 5305 return GetType(getGlobalTypeID(F, LocalID)); 5306 } 5307 5308 serialization::TypeID 5309 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 5310 unsigned FastQuals = LocalID & Qualifiers::FastMask; 5311 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 5312 5313 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 5314 return LocalID; 5315 5316 ContinuousRangeMap<uint32_t, int, 2>::iterator I 5317 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 5318 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 5319 5320 unsigned GlobalIndex = LocalIndex + I->second; 5321 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 5322 } 5323 5324 TemplateArgumentLocInfo 5325 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 5326 TemplateArgument::ArgKind Kind, 5327 const RecordData &Record, 5328 unsigned &Index) { 5329 switch (Kind) { 5330 case TemplateArgument::Expression: 5331 return ReadExpr(F); 5332 case TemplateArgument::Type: 5333 return GetTypeSourceInfo(F, Record, Index); 5334 case TemplateArgument::Template: { 5335 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 5336 Index); 5337 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 5338 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 5339 SourceLocation()); 5340 } 5341 case TemplateArgument::TemplateExpansion: { 5342 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 5343 Index); 5344 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 5345 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 5346 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 5347 EllipsisLoc); 5348 } 5349 case TemplateArgument::Null: 5350 case TemplateArgument::Integral: 5351 case TemplateArgument::Declaration: 5352 case TemplateArgument::NullPtr: 5353 case TemplateArgument::Pack: 5354 // FIXME: Is this right? 5355 return TemplateArgumentLocInfo(); 5356 } 5357 llvm_unreachable("unexpected template argument loc"); 5358 } 5359 5360 TemplateArgumentLoc 5361 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 5362 const RecordData &Record, unsigned &Index) { 5363 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 5364 5365 if (Arg.getKind() == TemplateArgument::Expression) { 5366 if (Record[Index++]) // bool InfoHasSameExpr. 5367 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 5368 } 5369 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 5370 Record, Index)); 5371 } 5372 5373 const ASTTemplateArgumentListInfo* 5374 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 5375 const RecordData &Record, 5376 unsigned &Index) { 5377 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 5378 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 5379 unsigned NumArgsAsWritten = Record[Index++]; 5380 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 5381 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 5382 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 5383 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 5384 } 5385 5386 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 5387 return GetDecl(ID); 5388 } 5389 5390 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record, 5391 unsigned &Idx){ 5392 if (Idx >= Record.size()) 5393 return 0; 5394 5395 unsigned LocalID = Record[Idx++]; 5396 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 5397 } 5398 5399 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 5400 RecordLocation Loc = getLocalBitOffset(Offset); 5401 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 5402 SavedStreamPosition SavedPosition(Cursor); 5403 Cursor.JumpToBit(Loc.Offset); 5404 ReadingKindTracker ReadingKind(Read_Decl, *this); 5405 RecordData Record; 5406 unsigned Code = Cursor.ReadCode(); 5407 unsigned RecCode = Cursor.readRecord(Code, Record); 5408 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 5409 Error("Malformed AST file: missing C++ base specifiers"); 5410 return 0; 5411 } 5412 5413 unsigned Idx = 0; 5414 unsigned NumBases = Record[Idx++]; 5415 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 5416 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 5417 for (unsigned I = 0; I != NumBases; ++I) 5418 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 5419 return Bases; 5420 } 5421 5422 serialization::DeclID 5423 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 5424 if (LocalID < NUM_PREDEF_DECL_IDS) 5425 return LocalID; 5426 5427 ContinuousRangeMap<uint32_t, int, 2>::iterator I 5428 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 5429 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 5430 5431 return LocalID + I->second; 5432 } 5433 5434 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 5435 ModuleFile &M) const { 5436 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 5437 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5438 return &M == I->second; 5439 } 5440 5441 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 5442 if (!D->isFromASTFile()) 5443 return 0; 5444 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 5445 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5446 return I->second; 5447 } 5448 5449 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 5450 if (ID < NUM_PREDEF_DECL_IDS) 5451 return SourceLocation(); 5452 5453 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 5454 5455 if (Index > DeclsLoaded.size()) { 5456 Error("declaration ID out-of-range for AST file"); 5457 return SourceLocation(); 5458 } 5459 5460 if (Decl *D = DeclsLoaded[Index]) 5461 return D->getLocation(); 5462 5463 unsigned RawLocation = 0; 5464 RecordLocation Rec = DeclCursorForID(ID, RawLocation); 5465 return ReadSourceLocation(*Rec.F, RawLocation); 5466 } 5467 5468 Decl *ASTReader::GetDecl(DeclID ID) { 5469 if (ID < NUM_PREDEF_DECL_IDS) { 5470 switch ((PredefinedDeclIDs)ID) { 5471 case PREDEF_DECL_NULL_ID: 5472 return 0; 5473 5474 case PREDEF_DECL_TRANSLATION_UNIT_ID: 5475 return Context.getTranslationUnitDecl(); 5476 5477 case PREDEF_DECL_OBJC_ID_ID: 5478 return Context.getObjCIdDecl(); 5479 5480 case PREDEF_DECL_OBJC_SEL_ID: 5481 return Context.getObjCSelDecl(); 5482 5483 case PREDEF_DECL_OBJC_CLASS_ID: 5484 return Context.getObjCClassDecl(); 5485 5486 case PREDEF_DECL_OBJC_PROTOCOL_ID: 5487 return Context.getObjCProtocolDecl(); 5488 5489 case PREDEF_DECL_INT_128_ID: 5490 return Context.getInt128Decl(); 5491 5492 case PREDEF_DECL_UNSIGNED_INT_128_ID: 5493 return Context.getUInt128Decl(); 5494 5495 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 5496 return Context.getObjCInstanceTypeDecl(); 5497 5498 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 5499 return Context.getBuiltinVaListDecl(); 5500 } 5501 } 5502 5503 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 5504 5505 if (Index >= DeclsLoaded.size()) { 5506 assert(0 && "declaration ID out-of-range for AST file"); 5507 Error("declaration ID out-of-range for AST file"); 5508 return 0; 5509 } 5510 5511 if (!DeclsLoaded[Index]) { 5512 ReadDeclRecord(ID); 5513 if (DeserializationListener) 5514 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 5515 } 5516 5517 return DeclsLoaded[Index]; 5518 } 5519 5520 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 5521 DeclID GlobalID) { 5522 if (GlobalID < NUM_PREDEF_DECL_IDS) 5523 return GlobalID; 5524 5525 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 5526 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 5527 ModuleFile *Owner = I->second; 5528 5529 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 5530 = M.GlobalToLocalDeclIDs.find(Owner); 5531 if (Pos == M.GlobalToLocalDeclIDs.end()) 5532 return 0; 5533 5534 return GlobalID - Owner->BaseDeclID + Pos->second; 5535 } 5536 5537 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 5538 const RecordData &Record, 5539 unsigned &Idx) { 5540 if (Idx >= Record.size()) { 5541 Error("Corrupted AST file"); 5542 return 0; 5543 } 5544 5545 return getGlobalDeclID(F, Record[Idx++]); 5546 } 5547 5548 /// \brief Resolve the offset of a statement into a statement. 5549 /// 5550 /// This operation will read a new statement from the external 5551 /// source each time it is called, and is meant to be used via a 5552 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 5553 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 5554 // Switch case IDs are per Decl. 5555 ClearSwitchCaseIDs(); 5556 5557 // Offset here is a global offset across the entire chain. 5558 RecordLocation Loc = getLocalBitOffset(Offset); 5559 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 5560 return ReadStmtFromStream(*Loc.F); 5561 } 5562 5563 namespace { 5564 class FindExternalLexicalDeclsVisitor { 5565 ASTReader &Reader; 5566 const DeclContext *DC; 5567 bool (*isKindWeWant)(Decl::Kind); 5568 5569 SmallVectorImpl<Decl*> &Decls; 5570 bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 5571 5572 public: 5573 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 5574 bool (*isKindWeWant)(Decl::Kind), 5575 SmallVectorImpl<Decl*> &Decls) 5576 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 5577 { 5578 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 5579 PredefsVisited[I] = false; 5580 } 5581 5582 static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 5583 if (Preorder) 5584 return false; 5585 5586 FindExternalLexicalDeclsVisitor *This 5587 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 5588 5589 ModuleFile::DeclContextInfosMap::iterator Info 5590 = M.DeclContextInfos.find(This->DC); 5591 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 5592 return false; 5593 5594 // Load all of the declaration IDs 5595 for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 5596 *IDE = ID + Info->second.NumLexicalDecls; 5597 ID != IDE; ++ID) { 5598 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 5599 continue; 5600 5601 // Don't add predefined declarations to the lexical context more 5602 // than once. 5603 if (ID->second < NUM_PREDEF_DECL_IDS) { 5604 if (This->PredefsVisited[ID->second]) 5605 continue; 5606 5607 This->PredefsVisited[ID->second] = true; 5608 } 5609 5610 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 5611 if (!This->DC->isDeclInLexicalTraversal(D)) 5612 This->Decls.push_back(D); 5613 } 5614 } 5615 5616 return false; 5617 } 5618 }; 5619 } 5620 5621 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 5622 bool (*isKindWeWant)(Decl::Kind), 5623 SmallVectorImpl<Decl*> &Decls) { 5624 // There might be lexical decls in multiple modules, for the TU at 5625 // least. Walk all of the modules in the order they were loaded. 5626 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 5627 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 5628 ++NumLexicalDeclContextsRead; 5629 return ELR_Success; 5630 } 5631 5632 namespace { 5633 5634 class DeclIDComp { 5635 ASTReader &Reader; 5636 ModuleFile &Mod; 5637 5638 public: 5639 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 5640 5641 bool operator()(LocalDeclID L, LocalDeclID R) const { 5642 SourceLocation LHS = getLocation(L); 5643 SourceLocation RHS = getLocation(R); 5644 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5645 } 5646 5647 bool operator()(SourceLocation LHS, LocalDeclID R) const { 5648 SourceLocation RHS = getLocation(R); 5649 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5650 } 5651 5652 bool operator()(LocalDeclID L, SourceLocation RHS) const { 5653 SourceLocation LHS = getLocation(L); 5654 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5655 } 5656 5657 SourceLocation getLocation(LocalDeclID ID) const { 5658 return Reader.getSourceManager().getFileLoc( 5659 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 5660 } 5661 }; 5662 5663 } 5664 5665 void ASTReader::FindFileRegionDecls(FileID File, 5666 unsigned Offset, unsigned Length, 5667 SmallVectorImpl<Decl *> &Decls) { 5668 SourceManager &SM = getSourceManager(); 5669 5670 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 5671 if (I == FileDeclIDs.end()) 5672 return; 5673 5674 FileDeclsInfo &DInfo = I->second; 5675 if (DInfo.Decls.empty()) 5676 return; 5677 5678 SourceLocation 5679 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 5680 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 5681 5682 DeclIDComp DIDComp(*this, *DInfo.Mod); 5683 ArrayRef<serialization::LocalDeclID>::iterator 5684 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 5685 BeginLoc, DIDComp); 5686 if (BeginIt != DInfo.Decls.begin()) 5687 --BeginIt; 5688 5689 // If we are pointing at a top-level decl inside an objc container, we need 5690 // to backtrack until we find it otherwise we will fail to report that the 5691 // region overlaps with an objc container. 5692 while (BeginIt != DInfo.Decls.begin() && 5693 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 5694 ->isTopLevelDeclInObjCContainer()) 5695 --BeginIt; 5696 5697 ArrayRef<serialization::LocalDeclID>::iterator 5698 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 5699 EndLoc, DIDComp); 5700 if (EndIt != DInfo.Decls.end()) 5701 ++EndIt; 5702 5703 for (ArrayRef<serialization::LocalDeclID>::iterator 5704 DIt = BeginIt; DIt != EndIt; ++DIt) 5705 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 5706 } 5707 5708 namespace { 5709 /// \brief ModuleFile visitor used to perform name lookup into a 5710 /// declaration context. 5711 class DeclContextNameLookupVisitor { 5712 ASTReader &Reader; 5713 SmallVectorImpl<const DeclContext *> &Contexts; 5714 DeclarationName Name; 5715 SmallVectorImpl<NamedDecl *> &Decls; 5716 5717 public: 5718 DeclContextNameLookupVisitor(ASTReader &Reader, 5719 SmallVectorImpl<const DeclContext *> &Contexts, 5720 DeclarationName Name, 5721 SmallVectorImpl<NamedDecl *> &Decls) 5722 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { } 5723 5724 static bool visit(ModuleFile &M, void *UserData) { 5725 DeclContextNameLookupVisitor *This 5726 = static_cast<DeclContextNameLookupVisitor *>(UserData); 5727 5728 // Check whether we have any visible declaration information for 5729 // this context in this module. 5730 ModuleFile::DeclContextInfosMap::iterator Info; 5731 bool FoundInfo = false; 5732 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 5733 Info = M.DeclContextInfos.find(This->Contexts[I]); 5734 if (Info != M.DeclContextInfos.end() && 5735 Info->second.NameLookupTableData) { 5736 FoundInfo = true; 5737 break; 5738 } 5739 } 5740 5741 if (!FoundInfo) 5742 return false; 5743 5744 // Look for this name within this module. 5745 ASTDeclContextNameLookupTable *LookupTable = 5746 Info->second.NameLookupTableData; 5747 ASTDeclContextNameLookupTable::iterator Pos 5748 = LookupTable->find(This->Name); 5749 if (Pos == LookupTable->end()) 5750 return false; 5751 5752 bool FoundAnything = false; 5753 ASTDeclContextNameLookupTrait::data_type Data = *Pos; 5754 for (; Data.first != Data.second; ++Data.first) { 5755 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 5756 if (!ND) 5757 continue; 5758 5759 if (ND->getDeclName() != This->Name) { 5760 // A name might be null because the decl's redeclarable part is 5761 // currently read before reading its name. The lookup is triggered by 5762 // building that decl (likely indirectly), and so it is later in the 5763 // sense of "already existing" and can be ignored here. 5764 continue; 5765 } 5766 5767 // Record this declaration. 5768 FoundAnything = true; 5769 This->Decls.push_back(ND); 5770 } 5771 5772 return FoundAnything; 5773 } 5774 }; 5775 } 5776 5777 /// \brief Retrieve the "definitive" module file for the definition of the 5778 /// given declaration context, if there is one. 5779 /// 5780 /// The "definitive" module file is the only place where we need to look to 5781 /// find information about the declarations within the given declaration 5782 /// context. For example, C++ and Objective-C classes, C structs/unions, and 5783 /// Objective-C protocols, categories, and extensions are all defined in a 5784 /// single place in the source code, so they have definitive module files 5785 /// associated with them. C++ namespaces, on the other hand, can have 5786 /// definitions in multiple different module files. 5787 /// 5788 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 5789 /// NDEBUG checking. 5790 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 5791 ASTReader &Reader) { 5792 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 5793 return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 5794 5795 return 0; 5796 } 5797 5798 bool 5799 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 5800 DeclarationName Name) { 5801 assert(DC->hasExternalVisibleStorage() && 5802 "DeclContext has no visible decls in storage"); 5803 if (!Name) 5804 return false; 5805 5806 SmallVector<NamedDecl *, 64> Decls; 5807 5808 // Compute the declaration contexts we need to look into. Multiple such 5809 // declaration contexts occur when two declaration contexts from disjoint 5810 // modules get merged, e.g., when two namespaces with the same name are 5811 // independently defined in separate modules. 5812 SmallVector<const DeclContext *, 2> Contexts; 5813 Contexts.push_back(DC); 5814 5815 if (DC->isNamespace()) { 5816 MergedDeclsMap::iterator Merged 5817 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 5818 if (Merged != MergedDecls.end()) { 5819 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 5820 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 5821 } 5822 } 5823 5824 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls); 5825 5826 // If we can definitively determine which module file to look into, 5827 // only look there. Otherwise, look in all module files. 5828 ModuleFile *Definitive; 5829 if (Contexts.size() == 1 && 5830 (Definitive = getDefinitiveModuleFileFor(DC, *this))) { 5831 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 5832 } else { 5833 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 5834 } 5835 ++NumVisibleDeclContextsRead; 5836 SetExternalVisibleDeclsForName(DC, Name, Decls); 5837 return !Decls.empty(); 5838 } 5839 5840 namespace { 5841 /// \brief ModuleFile visitor used to retrieve all visible names in a 5842 /// declaration context. 5843 class DeclContextAllNamesVisitor { 5844 ASTReader &Reader; 5845 SmallVectorImpl<const DeclContext *> &Contexts; 5846 DeclsMap &Decls; 5847 bool VisitAll; 5848 5849 public: 5850 DeclContextAllNamesVisitor(ASTReader &Reader, 5851 SmallVectorImpl<const DeclContext *> &Contexts, 5852 DeclsMap &Decls, bool VisitAll) 5853 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 5854 5855 static bool visit(ModuleFile &M, void *UserData) { 5856 DeclContextAllNamesVisitor *This 5857 = static_cast<DeclContextAllNamesVisitor *>(UserData); 5858 5859 // Check whether we have any visible declaration information for 5860 // this context in this module. 5861 ModuleFile::DeclContextInfosMap::iterator Info; 5862 bool FoundInfo = false; 5863 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 5864 Info = M.DeclContextInfos.find(This->Contexts[I]); 5865 if (Info != M.DeclContextInfos.end() && 5866 Info->second.NameLookupTableData) { 5867 FoundInfo = true; 5868 break; 5869 } 5870 } 5871 5872 if (!FoundInfo) 5873 return false; 5874 5875 ASTDeclContextNameLookupTable *LookupTable = 5876 Info->second.NameLookupTableData; 5877 bool FoundAnything = false; 5878 for (ASTDeclContextNameLookupTable::data_iterator 5879 I = LookupTable->data_begin(), E = LookupTable->data_end(); 5880 I != E; 5881 ++I) { 5882 ASTDeclContextNameLookupTrait::data_type Data = *I; 5883 for (; Data.first != Data.second; ++Data.first) { 5884 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 5885 *Data.first); 5886 if (!ND) 5887 continue; 5888 5889 // Record this declaration. 5890 FoundAnything = true; 5891 This->Decls[ND->getDeclName()].push_back(ND); 5892 } 5893 } 5894 5895 return FoundAnything && !This->VisitAll; 5896 } 5897 }; 5898 } 5899 5900 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 5901 if (!DC->hasExternalVisibleStorage()) 5902 return; 5903 DeclsMap Decls; 5904 5905 // Compute the declaration contexts we need to look into. Multiple such 5906 // declaration contexts occur when two declaration contexts from disjoint 5907 // modules get merged, e.g., when two namespaces with the same name are 5908 // independently defined in separate modules. 5909 SmallVector<const DeclContext *, 2> Contexts; 5910 Contexts.push_back(DC); 5911 5912 if (DC->isNamespace()) { 5913 MergedDeclsMap::iterator Merged 5914 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 5915 if (Merged != MergedDecls.end()) { 5916 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 5917 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 5918 } 5919 } 5920 5921 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 5922 /*VisitAll=*/DC->isFileContext()); 5923 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 5924 ++NumVisibleDeclContextsRead; 5925 5926 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 5927 SetExternalVisibleDeclsForName(DC, I->first, I->second); 5928 } 5929 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 5930 } 5931 5932 /// \brief Under non-PCH compilation the consumer receives the objc methods 5933 /// before receiving the implementation, and codegen depends on this. 5934 /// We simulate this by deserializing and passing to consumer the methods of the 5935 /// implementation before passing the deserialized implementation decl. 5936 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 5937 ASTConsumer *Consumer) { 5938 assert(ImplD && Consumer); 5939 5940 for (ObjCImplDecl::method_iterator 5941 I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I) 5942 Consumer->HandleInterestingDecl(DeclGroupRef(*I)); 5943 5944 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 5945 } 5946 5947 void ASTReader::PassInterestingDeclsToConsumer() { 5948 assert(Consumer); 5949 while (!InterestingDecls.empty()) { 5950 Decl *D = InterestingDecls.front(); 5951 InterestingDecls.pop_front(); 5952 5953 PassInterestingDeclToConsumer(D); 5954 } 5955 } 5956 5957 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 5958 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 5959 PassObjCImplDeclToConsumer(ImplD, Consumer); 5960 else 5961 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 5962 } 5963 5964 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 5965 this->Consumer = Consumer; 5966 5967 if (!Consumer) 5968 return; 5969 5970 for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) { 5971 // Force deserialization of this decl, which will cause it to be queued for 5972 // passing to the consumer. 5973 GetDecl(ExternalDefinitions[I]); 5974 } 5975 ExternalDefinitions.clear(); 5976 5977 PassInterestingDeclsToConsumer(); 5978 } 5979 5980 void ASTReader::PrintStats() { 5981 std::fprintf(stderr, "*** AST File Statistics:\n"); 5982 5983 unsigned NumTypesLoaded 5984 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 5985 QualType()); 5986 unsigned NumDeclsLoaded 5987 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 5988 (Decl *)0); 5989 unsigned NumIdentifiersLoaded 5990 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 5991 IdentifiersLoaded.end(), 5992 (IdentifierInfo *)0); 5993 unsigned NumMacrosLoaded 5994 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 5995 MacrosLoaded.end(), 5996 (MacroInfo *)0); 5997 unsigned NumSelectorsLoaded 5998 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 5999 SelectorsLoaded.end(), 6000 Selector()); 6001 6002 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 6003 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 6004 NumSLocEntriesRead, TotalNumSLocEntries, 6005 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 6006 if (!TypesLoaded.empty()) 6007 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6008 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6009 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6010 if (!DeclsLoaded.empty()) 6011 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6012 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6013 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6014 if (!IdentifiersLoaded.empty()) 6015 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6016 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6017 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6018 if (!MacrosLoaded.empty()) 6019 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6020 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6021 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6022 if (!SelectorsLoaded.empty()) 6023 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6024 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6025 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6026 if (TotalNumStatements) 6027 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6028 NumStatementsRead, TotalNumStatements, 6029 ((float)NumStatementsRead/TotalNumStatements * 100)); 6030 if (TotalNumMacros) 6031 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6032 NumMacrosRead, TotalNumMacros, 6033 ((float)NumMacrosRead/TotalNumMacros * 100)); 6034 if (TotalLexicalDeclContexts) 6035 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6036 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6037 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6038 * 100)); 6039 if (TotalVisibleDeclContexts) 6040 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6041 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6042 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6043 * 100)); 6044 if (TotalNumMethodPoolEntries) { 6045 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6046 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6047 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6048 * 100)); 6049 } 6050 if (NumMethodPoolLookups) { 6051 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6052 NumMethodPoolHits, NumMethodPoolLookups, 6053 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6054 } 6055 if (NumMethodPoolTableLookups) { 6056 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6057 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6058 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6059 * 100.0)); 6060 } 6061 6062 if (NumIdentifierLookupHits) { 6063 std::fprintf(stderr, 6064 " %u / %u identifier table lookups succeeded (%f%%)\n", 6065 NumIdentifierLookupHits, NumIdentifierLookups, 6066 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6067 } 6068 6069 if (GlobalIndex) { 6070 std::fprintf(stderr, "\n"); 6071 GlobalIndex->printStats(); 6072 } 6073 6074 std::fprintf(stderr, "\n"); 6075 dump(); 6076 std::fprintf(stderr, "\n"); 6077 } 6078 6079 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 6080 static void 6081 dumpModuleIDMap(StringRef Name, 6082 const ContinuousRangeMap<Key, ModuleFile *, 6083 InitialCapacity> &Map) { 6084 if (Map.begin() == Map.end()) 6085 return; 6086 6087 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 6088 llvm::errs() << Name << ":\n"; 6089 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 6090 I != IEnd; ++I) { 6091 llvm::errs() << " " << I->first << " -> " << I->second->FileName 6092 << "\n"; 6093 } 6094 } 6095 6096 void ASTReader::dump() { 6097 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 6098 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 6099 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 6100 dumpModuleIDMap("Global type map", GlobalTypeMap); 6101 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 6102 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 6103 dumpModuleIDMap("Global macro map", GlobalMacroMap); 6104 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 6105 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 6106 dumpModuleIDMap("Global preprocessed entity map", 6107 GlobalPreprocessedEntityMap); 6108 6109 llvm::errs() << "\n*** PCH/Modules Loaded:"; 6110 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 6111 MEnd = ModuleMgr.end(); 6112 M != MEnd; ++M) 6113 (*M)->dump(); 6114 } 6115 6116 /// Return the amount of memory used by memory buffers, breaking down 6117 /// by heap-backed versus mmap'ed memory. 6118 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 6119 for (ModuleConstIterator I = ModuleMgr.begin(), 6120 E = ModuleMgr.end(); I != E; ++I) { 6121 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 6122 size_t bytes = buf->getBufferSize(); 6123 switch (buf->getBufferKind()) { 6124 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 6125 sizes.malloc_bytes += bytes; 6126 break; 6127 case llvm::MemoryBuffer::MemoryBuffer_MMap: 6128 sizes.mmap_bytes += bytes; 6129 break; 6130 } 6131 } 6132 } 6133 } 6134 6135 void ASTReader::InitializeSema(Sema &S) { 6136 SemaObj = &S; 6137 S.addExternalSource(this); 6138 6139 // Makes sure any declarations that were deserialized "too early" 6140 // still get added to the identifier's declaration chains. 6141 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { 6142 pushExternalDeclIntoScope(PreloadedDecls[I], 6143 PreloadedDecls[I]->getDeclName()); 6144 } 6145 PreloadedDecls.clear(); 6146 6147 // FIXME: What happens if these are changed by a module import? 6148 if (!FPPragmaOptions.empty()) { 6149 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 6150 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 6151 } 6152 6153 // FIXME: What happens if these are changed by a module import? 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 UpdateSema(); 6163 } 6164 6165 void ASTReader::UpdateSema() { 6166 assert(SemaObj && "no Sema to update"); 6167 6168 // Load the offsets of the declarations that Sema references. 6169 // They will be lazily deserialized when needed. 6170 if (!SemaDeclRefs.empty()) { 6171 assert(SemaDeclRefs.size() % 2 == 0); 6172 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 6173 if (!SemaObj->StdNamespace) 6174 SemaObj->StdNamespace = SemaDeclRefs[I]; 6175 if (!SemaObj->StdBadAlloc) 6176 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 6177 } 6178 SemaDeclRefs.clear(); 6179 } 6180 } 6181 6182 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 6183 // Note that we are loading an identifier. 6184 Deserializing AnIdentifier(this); 6185 StringRef Name(NameStart, NameEnd - NameStart); 6186 6187 // If there is a global index, look there first to determine which modules 6188 // provably do not have any results for this identifier. 6189 GlobalModuleIndex::HitSet Hits; 6190 GlobalModuleIndex::HitSet *HitsPtr = 0; 6191 if (!loadGlobalIndex()) { 6192 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 6193 HitsPtr = &Hits; 6194 } 6195 } 6196 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 6197 NumIdentifierLookups, 6198 NumIdentifierLookupHits); 6199 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 6200 IdentifierInfo *II = Visitor.getIdentifierInfo(); 6201 markIdentifierUpToDate(II); 6202 return II; 6203 } 6204 6205 namespace clang { 6206 /// \brief An identifier-lookup iterator that enumerates all of the 6207 /// identifiers stored within a set of AST files. 6208 class ASTIdentifierIterator : public IdentifierIterator { 6209 /// \brief The AST reader whose identifiers are being enumerated. 6210 const ASTReader &Reader; 6211 6212 /// \brief The current index into the chain of AST files stored in 6213 /// the AST reader. 6214 unsigned Index; 6215 6216 /// \brief The current position within the identifier lookup table 6217 /// of the current AST file. 6218 ASTIdentifierLookupTable::key_iterator Current; 6219 6220 /// \brief The end position within the identifier lookup table of 6221 /// the current AST file. 6222 ASTIdentifierLookupTable::key_iterator End; 6223 6224 public: 6225 explicit ASTIdentifierIterator(const ASTReader &Reader); 6226 6227 virtual StringRef Next(); 6228 }; 6229 } 6230 6231 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 6232 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 6233 ASTIdentifierLookupTable *IdTable 6234 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 6235 Current = IdTable->key_begin(); 6236 End = IdTable->key_end(); 6237 } 6238 6239 StringRef ASTIdentifierIterator::Next() { 6240 while (Current == End) { 6241 // If we have exhausted all of our AST files, we're done. 6242 if (Index == 0) 6243 return StringRef(); 6244 6245 --Index; 6246 ASTIdentifierLookupTable *IdTable 6247 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 6248 IdentifierLookupTable; 6249 Current = IdTable->key_begin(); 6250 End = IdTable->key_end(); 6251 } 6252 6253 // We have any identifiers remaining in the current AST file; return 6254 // the next one. 6255 StringRef Result = *Current; 6256 ++Current; 6257 return Result; 6258 } 6259 6260 IdentifierIterator *ASTReader::getIdentifiers() { 6261 if (!loadGlobalIndex()) 6262 return GlobalIndex->createIdentifierIterator(); 6263 6264 return new ASTIdentifierIterator(*this); 6265 } 6266 6267 namespace clang { namespace serialization { 6268 class ReadMethodPoolVisitor { 6269 ASTReader &Reader; 6270 Selector Sel; 6271 unsigned PriorGeneration; 6272 unsigned InstanceBits; 6273 unsigned FactoryBits; 6274 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 6275 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 6276 6277 public: 6278 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 6279 unsigned PriorGeneration) 6280 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 6281 InstanceBits(0), FactoryBits(0) { } 6282 6283 static bool visit(ModuleFile &M, void *UserData) { 6284 ReadMethodPoolVisitor *This 6285 = static_cast<ReadMethodPoolVisitor *>(UserData); 6286 6287 if (!M.SelectorLookupTable) 6288 return false; 6289 6290 // If we've already searched this module file, skip it now. 6291 if (M.Generation <= This->PriorGeneration) 6292 return true; 6293 6294 ++This->Reader.NumMethodPoolTableLookups; 6295 ASTSelectorLookupTable *PoolTable 6296 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 6297 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 6298 if (Pos == PoolTable->end()) 6299 return false; 6300 6301 ++This->Reader.NumMethodPoolTableHits; 6302 ++This->Reader.NumSelectorsRead; 6303 // FIXME: Not quite happy with the statistics here. We probably should 6304 // disable this tracking when called via LoadSelector. 6305 // Also, should entries without methods count as misses? 6306 ++This->Reader.NumMethodPoolEntriesRead; 6307 ASTSelectorLookupTrait::data_type Data = *Pos; 6308 if (This->Reader.DeserializationListener) 6309 This->Reader.DeserializationListener->SelectorRead(Data.ID, 6310 This->Sel); 6311 6312 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 6313 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 6314 This->InstanceBits = Data.InstanceBits; 6315 This->FactoryBits = Data.FactoryBits; 6316 return true; 6317 } 6318 6319 /// \brief Retrieve the instance methods found by this visitor. 6320 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 6321 return InstanceMethods; 6322 } 6323 6324 /// \brief Retrieve the instance methods found by this visitor. 6325 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 6326 return FactoryMethods; 6327 } 6328 6329 unsigned getInstanceBits() const { return InstanceBits; } 6330 unsigned getFactoryBits() const { return FactoryBits; } 6331 }; 6332 } } // end namespace clang::serialization 6333 6334 /// \brief Add the given set of methods to the method list. 6335 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 6336 ObjCMethodList &List) { 6337 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 6338 S.addMethodToGlobalList(&List, Methods[I]); 6339 } 6340 } 6341 6342 void ASTReader::ReadMethodPool(Selector Sel) { 6343 // Get the selector generation and update it to the current generation. 6344 unsigned &Generation = SelectorGeneration[Sel]; 6345 unsigned PriorGeneration = Generation; 6346 Generation = CurrentGeneration; 6347 6348 // Search for methods defined with this selector. 6349 ++NumMethodPoolLookups; 6350 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 6351 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 6352 6353 if (Visitor.getInstanceMethods().empty() && 6354 Visitor.getFactoryMethods().empty()) 6355 return; 6356 6357 ++NumMethodPoolHits; 6358 6359 if (!getSema()) 6360 return; 6361 6362 Sema &S = *getSema(); 6363 Sema::GlobalMethodPool::iterator Pos 6364 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 6365 6366 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 6367 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 6368 Pos->second.first.setBits(Visitor.getInstanceBits()); 6369 Pos->second.second.setBits(Visitor.getFactoryBits()); 6370 } 6371 6372 void ASTReader::ReadKnownNamespaces( 6373 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 6374 Namespaces.clear(); 6375 6376 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 6377 if (NamespaceDecl *Namespace 6378 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 6379 Namespaces.push_back(Namespace); 6380 } 6381 } 6382 6383 void ASTReader::ReadUndefinedButUsed( 6384 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 6385 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 6386 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 6387 SourceLocation Loc = 6388 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 6389 Undefined.insert(std::make_pair(D, Loc)); 6390 } 6391 } 6392 6393 void ASTReader::ReadTentativeDefinitions( 6394 SmallVectorImpl<VarDecl *> &TentativeDefs) { 6395 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 6396 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 6397 if (Var) 6398 TentativeDefs.push_back(Var); 6399 } 6400 TentativeDefinitions.clear(); 6401 } 6402 6403 void ASTReader::ReadUnusedFileScopedDecls( 6404 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 6405 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 6406 DeclaratorDecl *D 6407 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 6408 if (D) 6409 Decls.push_back(D); 6410 } 6411 UnusedFileScopedDecls.clear(); 6412 } 6413 6414 void ASTReader::ReadDelegatingConstructors( 6415 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 6416 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 6417 CXXConstructorDecl *D 6418 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 6419 if (D) 6420 Decls.push_back(D); 6421 } 6422 DelegatingCtorDecls.clear(); 6423 } 6424 6425 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 6426 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 6427 TypedefNameDecl *D 6428 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 6429 if (D) 6430 Decls.push_back(D); 6431 } 6432 ExtVectorDecls.clear(); 6433 } 6434 6435 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) { 6436 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) { 6437 CXXRecordDecl *D 6438 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I])); 6439 if (D) 6440 Decls.push_back(D); 6441 } 6442 DynamicClasses.clear(); 6443 } 6444 6445 void 6446 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) { 6447 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) { 6448 NamedDecl *D 6449 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I])); 6450 if (D) 6451 Decls.push_back(D); 6452 } 6453 LocallyScopedExternCDecls.clear(); 6454 } 6455 6456 void ASTReader::ReadReferencedSelectors( 6457 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 6458 if (ReferencedSelectorsData.empty()) 6459 return; 6460 6461 // If there are @selector references added them to its pool. This is for 6462 // implementation of -Wselector. 6463 unsigned int DataSize = ReferencedSelectorsData.size()-1; 6464 unsigned I = 0; 6465 while (I < DataSize) { 6466 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 6467 SourceLocation SelLoc 6468 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 6469 Sels.push_back(std::make_pair(Sel, SelLoc)); 6470 } 6471 ReferencedSelectorsData.clear(); 6472 } 6473 6474 void ASTReader::ReadWeakUndeclaredIdentifiers( 6475 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 6476 if (WeakUndeclaredIdentifiers.empty()) 6477 return; 6478 6479 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 6480 IdentifierInfo *WeakId 6481 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 6482 IdentifierInfo *AliasId 6483 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 6484 SourceLocation Loc 6485 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 6486 bool Used = WeakUndeclaredIdentifiers[I++]; 6487 WeakInfo WI(AliasId, Loc); 6488 WI.setUsed(Used); 6489 WeakIDs.push_back(std::make_pair(WeakId, WI)); 6490 } 6491 WeakUndeclaredIdentifiers.clear(); 6492 } 6493 6494 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 6495 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 6496 ExternalVTableUse VT; 6497 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 6498 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 6499 VT.DefinitionRequired = VTableUses[Idx++]; 6500 VTables.push_back(VT); 6501 } 6502 6503 VTableUses.clear(); 6504 } 6505 6506 void ASTReader::ReadPendingInstantiations( 6507 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 6508 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 6509 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 6510 SourceLocation Loc 6511 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 6512 6513 Pending.push_back(std::make_pair(D, Loc)); 6514 } 6515 PendingInstantiations.clear(); 6516 } 6517 6518 void ASTReader::ReadLateParsedTemplates( 6519 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 6520 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 6521 /* In loop */) { 6522 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 6523 6524 LateParsedTemplate *LT = new LateParsedTemplate; 6525 LT->D = GetDecl(LateParsedTemplates[Idx++]); 6526 6527 ModuleFile *F = getOwningModuleFile(LT->D); 6528 assert(F && "No module"); 6529 6530 unsigned TokN = LateParsedTemplates[Idx++]; 6531 LT->Toks.reserve(TokN); 6532 for (unsigned T = 0; T < TokN; ++T) 6533 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 6534 6535 LPTMap[FD] = LT; 6536 } 6537 6538 LateParsedTemplates.clear(); 6539 } 6540 6541 void ASTReader::LoadSelector(Selector Sel) { 6542 // It would be complicated to avoid reading the methods anyway. So don't. 6543 ReadMethodPool(Sel); 6544 } 6545 6546 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 6547 assert(ID && "Non-zero identifier ID required"); 6548 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 6549 IdentifiersLoaded[ID - 1] = II; 6550 if (DeserializationListener) 6551 DeserializationListener->IdentifierRead(ID, II); 6552 } 6553 6554 /// \brief Set the globally-visible declarations associated with the given 6555 /// identifier. 6556 /// 6557 /// If the AST reader is currently in a state where the given declaration IDs 6558 /// cannot safely be resolved, they are queued until it is safe to resolve 6559 /// them. 6560 /// 6561 /// \param II an IdentifierInfo that refers to one or more globally-visible 6562 /// declarations. 6563 /// 6564 /// \param DeclIDs the set of declaration IDs with the name @p II that are 6565 /// visible at global scope. 6566 /// 6567 /// \param Decls if non-null, this vector will be populated with the set of 6568 /// deserialized declarations. These declarations will not be pushed into 6569 /// scope. 6570 void 6571 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 6572 const SmallVectorImpl<uint32_t> &DeclIDs, 6573 SmallVectorImpl<Decl *> *Decls) { 6574 if (NumCurrentElementsDeserializing && !Decls) { 6575 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 6576 return; 6577 } 6578 6579 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 6580 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 6581 if (SemaObj) { 6582 // If we're simply supposed to record the declarations, do so now. 6583 if (Decls) { 6584 Decls->push_back(D); 6585 continue; 6586 } 6587 6588 // Introduce this declaration into the translation-unit scope 6589 // and add it to the declaration chain for this identifier, so 6590 // that (unqualified) name lookup will find it. 6591 pushExternalDeclIntoScope(D, II); 6592 } else { 6593 // Queue this declaration so that it will be added to the 6594 // translation unit scope and identifier's declaration chain 6595 // once a Sema object is known. 6596 PreloadedDecls.push_back(D); 6597 } 6598 } 6599 } 6600 6601 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 6602 if (ID == 0) 6603 return 0; 6604 6605 if (IdentifiersLoaded.empty()) { 6606 Error("no identifier table in AST file"); 6607 return 0; 6608 } 6609 6610 ID -= 1; 6611 if (!IdentifiersLoaded[ID]) { 6612 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 6613 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 6614 ModuleFile *M = I->second; 6615 unsigned Index = ID - M->BaseIdentifierID; 6616 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 6617 6618 // All of the strings in the AST file are preceded by a 16-bit length. 6619 // Extract that 16-bit length to avoid having to execute strlen(). 6620 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 6621 // unsigned integers. This is important to avoid integer overflow when 6622 // we cast them to 'unsigned'. 6623 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 6624 unsigned StrLen = (((unsigned) StrLenPtr[0]) 6625 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 6626 IdentifiersLoaded[ID] 6627 = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 6628 if (DeserializationListener) 6629 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 6630 } 6631 6632 return IdentifiersLoaded[ID]; 6633 } 6634 6635 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 6636 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 6637 } 6638 6639 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 6640 if (LocalID < NUM_PREDEF_IDENT_IDS) 6641 return LocalID; 6642 6643 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6644 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 6645 assert(I != M.IdentifierRemap.end() 6646 && "Invalid index into identifier index remap"); 6647 6648 return LocalID + I->second; 6649 } 6650 6651 MacroInfo *ASTReader::getMacro(MacroID ID) { 6652 if (ID == 0) 6653 return 0; 6654 6655 if (MacrosLoaded.empty()) { 6656 Error("no macro table in AST file"); 6657 return 0; 6658 } 6659 6660 ID -= NUM_PREDEF_MACRO_IDS; 6661 if (!MacrosLoaded[ID]) { 6662 GlobalMacroMapType::iterator I 6663 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 6664 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 6665 ModuleFile *M = I->second; 6666 unsigned Index = ID - M->BaseMacroID; 6667 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 6668 6669 if (DeserializationListener) 6670 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 6671 MacrosLoaded[ID]); 6672 } 6673 6674 return MacrosLoaded[ID]; 6675 } 6676 6677 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 6678 if (LocalID < NUM_PREDEF_MACRO_IDS) 6679 return LocalID; 6680 6681 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6682 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 6683 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 6684 6685 return LocalID + I->second; 6686 } 6687 6688 serialization::SubmoduleID 6689 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 6690 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 6691 return LocalID; 6692 6693 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6694 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 6695 assert(I != M.SubmoduleRemap.end() 6696 && "Invalid index into submodule index remap"); 6697 6698 return LocalID + I->second; 6699 } 6700 6701 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 6702 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 6703 assert(GlobalID == 0 && "Unhandled global submodule ID"); 6704 return 0; 6705 } 6706 6707 if (GlobalID > SubmodulesLoaded.size()) { 6708 Error("submodule ID out of range in AST file"); 6709 return 0; 6710 } 6711 6712 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 6713 } 6714 6715 Module *ASTReader::getModule(unsigned ID) { 6716 return getSubmodule(ID); 6717 } 6718 6719 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 6720 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 6721 } 6722 6723 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 6724 if (ID == 0) 6725 return Selector(); 6726 6727 if (ID > SelectorsLoaded.size()) { 6728 Error("selector ID out of range in AST file"); 6729 return Selector(); 6730 } 6731 6732 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) { 6733 // Load this selector from the selector table. 6734 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 6735 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 6736 ModuleFile &M = *I->second; 6737 ASTSelectorLookupTrait Trait(*this, M); 6738 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 6739 SelectorsLoaded[ID - 1] = 6740 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 6741 if (DeserializationListener) 6742 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 6743 } 6744 6745 return SelectorsLoaded[ID - 1]; 6746 } 6747 6748 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 6749 return DecodeSelector(ID); 6750 } 6751 6752 uint32_t ASTReader::GetNumExternalSelectors() { 6753 // ID 0 (the null selector) is considered an external selector. 6754 return getTotalNumSelectors() + 1; 6755 } 6756 6757 serialization::SelectorID 6758 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 6759 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 6760 return LocalID; 6761 6762 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6763 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 6764 assert(I != M.SelectorRemap.end() 6765 && "Invalid index into selector index remap"); 6766 6767 return LocalID + I->second; 6768 } 6769 6770 DeclarationName 6771 ASTReader::ReadDeclarationName(ModuleFile &F, 6772 const RecordData &Record, unsigned &Idx) { 6773 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 6774 switch (Kind) { 6775 case DeclarationName::Identifier: 6776 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 6777 6778 case DeclarationName::ObjCZeroArgSelector: 6779 case DeclarationName::ObjCOneArgSelector: 6780 case DeclarationName::ObjCMultiArgSelector: 6781 return DeclarationName(ReadSelector(F, Record, Idx)); 6782 6783 case DeclarationName::CXXConstructorName: 6784 return Context.DeclarationNames.getCXXConstructorName( 6785 Context.getCanonicalType(readType(F, Record, Idx))); 6786 6787 case DeclarationName::CXXDestructorName: 6788 return Context.DeclarationNames.getCXXDestructorName( 6789 Context.getCanonicalType(readType(F, Record, Idx))); 6790 6791 case DeclarationName::CXXConversionFunctionName: 6792 return Context.DeclarationNames.getCXXConversionFunctionName( 6793 Context.getCanonicalType(readType(F, Record, Idx))); 6794 6795 case DeclarationName::CXXOperatorName: 6796 return Context.DeclarationNames.getCXXOperatorName( 6797 (OverloadedOperatorKind)Record[Idx++]); 6798 6799 case DeclarationName::CXXLiteralOperatorName: 6800 return Context.DeclarationNames.getCXXLiteralOperatorName( 6801 GetIdentifierInfo(F, Record, Idx)); 6802 6803 case DeclarationName::CXXUsingDirective: 6804 return DeclarationName::getUsingDirectiveName(); 6805 } 6806 6807 llvm_unreachable("Invalid NameKind!"); 6808 } 6809 6810 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 6811 DeclarationNameLoc &DNLoc, 6812 DeclarationName Name, 6813 const RecordData &Record, unsigned &Idx) { 6814 switch (Name.getNameKind()) { 6815 case DeclarationName::CXXConstructorName: 6816 case DeclarationName::CXXDestructorName: 6817 case DeclarationName::CXXConversionFunctionName: 6818 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 6819 break; 6820 6821 case DeclarationName::CXXOperatorName: 6822 DNLoc.CXXOperatorName.BeginOpNameLoc 6823 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6824 DNLoc.CXXOperatorName.EndOpNameLoc 6825 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6826 break; 6827 6828 case DeclarationName::CXXLiteralOperatorName: 6829 DNLoc.CXXLiteralOperatorName.OpNameLoc 6830 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 6831 break; 6832 6833 case DeclarationName::Identifier: 6834 case DeclarationName::ObjCZeroArgSelector: 6835 case DeclarationName::ObjCOneArgSelector: 6836 case DeclarationName::ObjCMultiArgSelector: 6837 case DeclarationName::CXXUsingDirective: 6838 break; 6839 } 6840 } 6841 6842 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 6843 DeclarationNameInfo &NameInfo, 6844 const RecordData &Record, unsigned &Idx) { 6845 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 6846 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 6847 DeclarationNameLoc DNLoc; 6848 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 6849 NameInfo.setInfo(DNLoc); 6850 } 6851 6852 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 6853 const RecordData &Record, unsigned &Idx) { 6854 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 6855 unsigned NumTPLists = Record[Idx++]; 6856 Info.NumTemplParamLists = NumTPLists; 6857 if (NumTPLists) { 6858 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 6859 for (unsigned i=0; i != NumTPLists; ++i) 6860 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 6861 } 6862 } 6863 6864 TemplateName 6865 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 6866 unsigned &Idx) { 6867 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 6868 switch (Kind) { 6869 case TemplateName::Template: 6870 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 6871 6872 case TemplateName::OverloadedTemplate: { 6873 unsigned size = Record[Idx++]; 6874 UnresolvedSet<8> Decls; 6875 while (size--) 6876 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 6877 6878 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 6879 } 6880 6881 case TemplateName::QualifiedTemplate: { 6882 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 6883 bool hasTemplKeyword = Record[Idx++]; 6884 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 6885 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 6886 } 6887 6888 case TemplateName::DependentTemplate: { 6889 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 6890 if (Record[Idx++]) // isIdentifier 6891 return Context.getDependentTemplateName(NNS, 6892 GetIdentifierInfo(F, Record, 6893 Idx)); 6894 return Context.getDependentTemplateName(NNS, 6895 (OverloadedOperatorKind)Record[Idx++]); 6896 } 6897 6898 case TemplateName::SubstTemplateTemplateParm: { 6899 TemplateTemplateParmDecl *param 6900 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 6901 if (!param) return TemplateName(); 6902 TemplateName replacement = ReadTemplateName(F, Record, Idx); 6903 return Context.getSubstTemplateTemplateParm(param, replacement); 6904 } 6905 6906 case TemplateName::SubstTemplateTemplateParmPack: { 6907 TemplateTemplateParmDecl *Param 6908 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 6909 if (!Param) 6910 return TemplateName(); 6911 6912 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 6913 if (ArgPack.getKind() != TemplateArgument::Pack) 6914 return TemplateName(); 6915 6916 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 6917 } 6918 } 6919 6920 llvm_unreachable("Unhandled template name kind!"); 6921 } 6922 6923 TemplateArgument 6924 ASTReader::ReadTemplateArgument(ModuleFile &F, 6925 const RecordData &Record, unsigned &Idx) { 6926 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 6927 switch (Kind) { 6928 case TemplateArgument::Null: 6929 return TemplateArgument(); 6930 case TemplateArgument::Type: 6931 return TemplateArgument(readType(F, Record, Idx)); 6932 case TemplateArgument::Declaration: { 6933 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 6934 bool ForReferenceParam = Record[Idx++]; 6935 return TemplateArgument(D, ForReferenceParam); 6936 } 6937 case TemplateArgument::NullPtr: 6938 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 6939 case TemplateArgument::Integral: { 6940 llvm::APSInt Value = ReadAPSInt(Record, Idx); 6941 QualType T = readType(F, Record, Idx); 6942 return TemplateArgument(Context, Value, T); 6943 } 6944 case TemplateArgument::Template: 6945 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 6946 case TemplateArgument::TemplateExpansion: { 6947 TemplateName Name = ReadTemplateName(F, Record, Idx); 6948 Optional<unsigned> NumTemplateExpansions; 6949 if (unsigned NumExpansions = Record[Idx++]) 6950 NumTemplateExpansions = NumExpansions - 1; 6951 return TemplateArgument(Name, NumTemplateExpansions); 6952 } 6953 case TemplateArgument::Expression: 6954 return TemplateArgument(ReadExpr(F)); 6955 case TemplateArgument::Pack: { 6956 unsigned NumArgs = Record[Idx++]; 6957 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 6958 for (unsigned I = 0; I != NumArgs; ++I) 6959 Args[I] = ReadTemplateArgument(F, Record, Idx); 6960 return TemplateArgument(Args, NumArgs); 6961 } 6962 } 6963 6964 llvm_unreachable("Unhandled template argument kind!"); 6965 } 6966 6967 TemplateParameterList * 6968 ASTReader::ReadTemplateParameterList(ModuleFile &F, 6969 const RecordData &Record, unsigned &Idx) { 6970 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 6971 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 6972 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 6973 6974 unsigned NumParams = Record[Idx++]; 6975 SmallVector<NamedDecl *, 16> Params; 6976 Params.reserve(NumParams); 6977 while (NumParams--) 6978 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 6979 6980 TemplateParameterList* TemplateParams = 6981 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 6982 Params.data(), Params.size(), RAngleLoc); 6983 return TemplateParams; 6984 } 6985 6986 void 6987 ASTReader:: 6988 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 6989 ModuleFile &F, const RecordData &Record, 6990 unsigned &Idx) { 6991 unsigned NumTemplateArgs = Record[Idx++]; 6992 TemplArgs.reserve(NumTemplateArgs); 6993 while (NumTemplateArgs--) 6994 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 6995 } 6996 6997 /// \brief Read a UnresolvedSet structure. 6998 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 6999 const RecordData &Record, unsigned &Idx) { 7000 unsigned NumDecls = Record[Idx++]; 7001 Set.reserve(Context, NumDecls); 7002 while (NumDecls--) { 7003 DeclID ID = ReadDeclID(F, Record, Idx); 7004 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7005 Set.addLazyDecl(Context, ID, AS); 7006 } 7007 } 7008 7009 CXXBaseSpecifier 7010 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 7011 const RecordData &Record, unsigned &Idx) { 7012 bool isVirtual = static_cast<bool>(Record[Idx++]); 7013 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 7014 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 7015 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 7016 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 7017 SourceRange Range = ReadSourceRange(F, Record, Idx); 7018 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7019 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7020 EllipsisLoc); 7021 Result.setInheritConstructors(inheritConstructors); 7022 return Result; 7023 } 7024 7025 std::pair<CXXCtorInitializer **, unsigned> 7026 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7027 unsigned &Idx) { 7028 CXXCtorInitializer **CtorInitializers = 0; 7029 unsigned NumInitializers = Record[Idx++]; 7030 if (NumInitializers) { 7031 CtorInitializers 7032 = new (Context) CXXCtorInitializer*[NumInitializers]; 7033 for (unsigned i=0; i != NumInitializers; ++i) { 7034 TypeSourceInfo *TInfo = 0; 7035 bool IsBaseVirtual = false; 7036 FieldDecl *Member = 0; 7037 IndirectFieldDecl *IndirectMember = 0; 7038 7039 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7040 switch (Type) { 7041 case CTOR_INITIALIZER_BASE: 7042 TInfo = GetTypeSourceInfo(F, Record, Idx); 7043 IsBaseVirtual = Record[Idx++]; 7044 break; 7045 7046 case CTOR_INITIALIZER_DELEGATING: 7047 TInfo = GetTypeSourceInfo(F, Record, Idx); 7048 break; 7049 7050 case CTOR_INITIALIZER_MEMBER: 7051 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7052 break; 7053 7054 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7055 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7056 break; 7057 } 7058 7059 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7060 Expr *Init = ReadExpr(F); 7061 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7062 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7063 bool IsWritten = Record[Idx++]; 7064 unsigned SourceOrderOrNumArrayIndices; 7065 SmallVector<VarDecl *, 8> Indices; 7066 if (IsWritten) { 7067 SourceOrderOrNumArrayIndices = Record[Idx++]; 7068 } else { 7069 SourceOrderOrNumArrayIndices = Record[Idx++]; 7070 Indices.reserve(SourceOrderOrNumArrayIndices); 7071 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 7072 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 7073 } 7074 7075 CXXCtorInitializer *BOMInit; 7076 if (Type == CTOR_INITIALIZER_BASE) { 7077 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual, 7078 LParenLoc, Init, RParenLoc, 7079 MemberOrEllipsisLoc); 7080 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 7081 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc, 7082 Init, RParenLoc); 7083 } else if (IsWritten) { 7084 if (Member) 7085 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, 7086 LParenLoc, Init, RParenLoc); 7087 else 7088 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7089 MemberOrEllipsisLoc, LParenLoc, 7090 Init, RParenLoc); 7091 } else { 7092 if (IndirectMember) { 7093 assert(Indices.empty() && "Indirect field improperly initialized"); 7094 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7095 MemberOrEllipsisLoc, LParenLoc, 7096 Init, RParenLoc); 7097 } else { 7098 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc, 7099 LParenLoc, Init, RParenLoc, 7100 Indices.data(), Indices.size()); 7101 } 7102 } 7103 7104 if (IsWritten) 7105 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 7106 CtorInitializers[i] = BOMInit; 7107 } 7108 } 7109 7110 return std::make_pair(CtorInitializers, NumInitializers); 7111 } 7112 7113 NestedNameSpecifier * 7114 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 7115 const RecordData &Record, unsigned &Idx) { 7116 unsigned N = Record[Idx++]; 7117 NestedNameSpecifier *NNS = 0, *Prev = 0; 7118 for (unsigned I = 0; I != N; ++I) { 7119 NestedNameSpecifier::SpecifierKind Kind 7120 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 7121 switch (Kind) { 7122 case NestedNameSpecifier::Identifier: { 7123 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 7124 NNS = NestedNameSpecifier::Create(Context, Prev, II); 7125 break; 7126 } 7127 7128 case NestedNameSpecifier::Namespace: { 7129 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 7130 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 7131 break; 7132 } 7133 7134 case NestedNameSpecifier::NamespaceAlias: { 7135 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 7136 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 7137 break; 7138 } 7139 7140 case NestedNameSpecifier::TypeSpec: 7141 case NestedNameSpecifier::TypeSpecWithTemplate: { 7142 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 7143 if (!T) 7144 return 0; 7145 7146 bool Template = Record[Idx++]; 7147 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 7148 break; 7149 } 7150 7151 case NestedNameSpecifier::Global: { 7152 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 7153 // No associated value, and there can't be a prefix. 7154 break; 7155 } 7156 } 7157 Prev = NNS; 7158 } 7159 return NNS; 7160 } 7161 7162 NestedNameSpecifierLoc 7163 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 7164 unsigned &Idx) { 7165 unsigned N = Record[Idx++]; 7166 NestedNameSpecifierLocBuilder Builder; 7167 for (unsigned I = 0; I != N; ++I) { 7168 NestedNameSpecifier::SpecifierKind Kind 7169 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 7170 switch (Kind) { 7171 case NestedNameSpecifier::Identifier: { 7172 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 7173 SourceRange Range = ReadSourceRange(F, Record, Idx); 7174 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 7175 break; 7176 } 7177 7178 case NestedNameSpecifier::Namespace: { 7179 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 7180 SourceRange Range = ReadSourceRange(F, Record, Idx); 7181 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 7182 break; 7183 } 7184 7185 case NestedNameSpecifier::NamespaceAlias: { 7186 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 7187 SourceRange Range = ReadSourceRange(F, Record, Idx); 7188 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 7189 break; 7190 } 7191 7192 case NestedNameSpecifier::TypeSpec: 7193 case NestedNameSpecifier::TypeSpecWithTemplate: { 7194 bool Template = Record[Idx++]; 7195 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 7196 if (!T) 7197 return NestedNameSpecifierLoc(); 7198 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 7199 7200 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 7201 Builder.Extend(Context, 7202 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 7203 T->getTypeLoc(), ColonColonLoc); 7204 break; 7205 } 7206 7207 case NestedNameSpecifier::Global: { 7208 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 7209 Builder.MakeGlobal(Context, ColonColonLoc); 7210 break; 7211 } 7212 } 7213 } 7214 7215 return Builder.getWithLocInContext(Context); 7216 } 7217 7218 SourceRange 7219 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 7220 unsigned &Idx) { 7221 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 7222 SourceLocation end = ReadSourceLocation(F, Record, Idx); 7223 return SourceRange(beg, end); 7224 } 7225 7226 /// \brief Read an integral value 7227 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 7228 unsigned BitWidth = Record[Idx++]; 7229 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 7230 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 7231 Idx += NumWords; 7232 return Result; 7233 } 7234 7235 /// \brief Read a signed integral value 7236 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 7237 bool isUnsigned = Record[Idx++]; 7238 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 7239 } 7240 7241 /// \brief Read a floating-point value 7242 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 7243 const llvm::fltSemantics &Sem, 7244 unsigned &Idx) { 7245 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 7246 } 7247 7248 // \brief Read a string 7249 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 7250 unsigned Len = Record[Idx++]; 7251 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 7252 Idx += Len; 7253 return Result; 7254 } 7255 7256 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 7257 unsigned &Idx) { 7258 unsigned Major = Record[Idx++]; 7259 unsigned Minor = Record[Idx++]; 7260 unsigned Subminor = Record[Idx++]; 7261 if (Minor == 0) 7262 return VersionTuple(Major); 7263 if (Subminor == 0) 7264 return VersionTuple(Major, Minor - 1); 7265 return VersionTuple(Major, Minor - 1, Subminor - 1); 7266 } 7267 7268 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 7269 const RecordData &Record, 7270 unsigned &Idx) { 7271 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 7272 return CXXTemporary::Create(Context, Decl); 7273 } 7274 7275 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 7276 return Diag(CurrentImportLoc, DiagID); 7277 } 7278 7279 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 7280 return Diags.Report(Loc, DiagID); 7281 } 7282 7283 /// \brief Retrieve the identifier table associated with the 7284 /// preprocessor. 7285 IdentifierTable &ASTReader::getIdentifierTable() { 7286 return PP.getIdentifierTable(); 7287 } 7288 7289 /// \brief Record that the given ID maps to the given switch-case 7290 /// statement. 7291 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 7292 assert((*CurrSwitchCaseStmts)[ID] == 0 && 7293 "Already have a SwitchCase with this ID"); 7294 (*CurrSwitchCaseStmts)[ID] = SC; 7295 } 7296 7297 /// \brief Retrieve the switch-case statement with the given ID. 7298 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 7299 assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID"); 7300 return (*CurrSwitchCaseStmts)[ID]; 7301 } 7302 7303 void ASTReader::ClearSwitchCaseIDs() { 7304 CurrSwitchCaseStmts->clear(); 7305 } 7306 7307 void ASTReader::ReadComments() { 7308 std::vector<RawComment *> Comments; 7309 for (SmallVectorImpl<std::pair<BitstreamCursor, 7310 serialization::ModuleFile *> >::iterator 7311 I = CommentsCursors.begin(), 7312 E = CommentsCursors.end(); 7313 I != E; ++I) { 7314 BitstreamCursor &Cursor = I->first; 7315 serialization::ModuleFile &F = *I->second; 7316 SavedStreamPosition SavedPosition(Cursor); 7317 7318 RecordData Record; 7319 while (true) { 7320 llvm::BitstreamEntry Entry = 7321 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 7322 7323 switch (Entry.Kind) { 7324 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 7325 case llvm::BitstreamEntry::Error: 7326 Error("malformed block record in AST file"); 7327 return; 7328 case llvm::BitstreamEntry::EndBlock: 7329 goto NextCursor; 7330 case llvm::BitstreamEntry::Record: 7331 // The interesting case. 7332 break; 7333 } 7334 7335 // Read a record. 7336 Record.clear(); 7337 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 7338 case COMMENTS_RAW_COMMENT: { 7339 unsigned Idx = 0; 7340 SourceRange SR = ReadSourceRange(F, Record, Idx); 7341 RawComment::CommentKind Kind = 7342 (RawComment::CommentKind) Record[Idx++]; 7343 bool IsTrailingComment = Record[Idx++]; 7344 bool IsAlmostTrailingComment = Record[Idx++]; 7345 Comments.push_back(new (Context) RawComment( 7346 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 7347 Context.getLangOpts().CommentOpts.ParseAllComments)); 7348 break; 7349 } 7350 } 7351 } 7352 NextCursor:; 7353 } 7354 Context.Comments.addCommentsToFront(Comments); 7355 } 7356 7357 void ASTReader::finishPendingActions() { 7358 while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() || 7359 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 7360 !PendingOdrMergeChecks.empty()) { 7361 // If any identifiers with corresponding top-level declarations have 7362 // been loaded, load those declarations now. 7363 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 7364 TopLevelDeclsMap; 7365 TopLevelDeclsMap TopLevelDecls; 7366 7367 while (!PendingIdentifierInfos.empty()) { 7368 // FIXME: std::move 7369 IdentifierInfo *II = PendingIdentifierInfos.back().first; 7370 SmallVector<uint32_t, 4> DeclIDs = PendingIdentifierInfos.back().second; 7371 PendingIdentifierInfos.pop_back(); 7372 7373 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 7374 } 7375 7376 // Load pending declaration chains. 7377 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 7378 loadPendingDeclChain(PendingDeclChains[I]); 7379 PendingDeclChainsKnown.erase(PendingDeclChains[I]); 7380 } 7381 PendingDeclChains.clear(); 7382 7383 // Make the most recent of the top-level declarations visible. 7384 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 7385 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 7386 IdentifierInfo *II = TLD->first; 7387 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 7388 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 7389 } 7390 } 7391 7392 // Load any pending macro definitions. 7393 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 7394 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 7395 SmallVector<PendingMacroInfo, 2> GlobalIDs; 7396 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 7397 // Initialize the macro history from chained-PCHs ahead of module imports. 7398 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 7399 ++IDIdx) { 7400 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 7401 if (Info.M->Kind != MK_Module) 7402 resolvePendingMacro(II, Info); 7403 } 7404 // Handle module imports. 7405 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 7406 ++IDIdx) { 7407 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 7408 if (Info.M->Kind == MK_Module) 7409 resolvePendingMacro(II, Info); 7410 } 7411 } 7412 PendingMacroIDs.clear(); 7413 7414 // Wire up the DeclContexts for Decls that we delayed setting until 7415 // recursive loading is completed. 7416 while (!PendingDeclContextInfos.empty()) { 7417 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 7418 PendingDeclContextInfos.pop_front(); 7419 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 7420 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 7421 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 7422 } 7423 7424 // For each declaration from a merged context, check that the canonical 7425 // definition of that context also contains a declaration of the same 7426 // entity. 7427 while (!PendingOdrMergeChecks.empty()) { 7428 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 7429 7430 // FIXME: Skip over implicit declarations for now. This matters for things 7431 // like implicitly-declared special member functions. This isn't entirely 7432 // correct; we can end up with multiple unmerged declarations of the same 7433 // implicit entity. 7434 if (D->isImplicit()) 7435 continue; 7436 7437 DeclContext *CanonDef = D->getDeclContext(); 7438 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName()); 7439 7440 bool Found = false; 7441 const Decl *DCanon = D->getCanonicalDecl(); 7442 7443 llvm::SmallVector<const NamedDecl*, 4> Candidates; 7444 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); 7445 !Found && I != E; ++I) { 7446 for (Decl::redecl_iterator RI = (*I)->redecls_begin(), 7447 RE = (*I)->redecls_end(); 7448 RI != RE; ++RI) { 7449 if ((*RI)->getLexicalDeclContext() == CanonDef) { 7450 // This declaration is present in the canonical definition. If it's 7451 // in the same redecl chain, it's the one we're looking for. 7452 if ((*RI)->getCanonicalDecl() == DCanon) 7453 Found = true; 7454 else 7455 Candidates.push_back(cast<NamedDecl>(*RI)); 7456 break; 7457 } 7458 } 7459 } 7460 7461 if (!Found) { 7462 D->setInvalidDecl(); 7463 7464 Module *CanonDefModule = cast<Decl>(CanonDef)->getOwningModule(); 7465 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 7466 << D << D->getOwningModule()->getFullModuleName() 7467 << CanonDef << !CanonDefModule 7468 << (CanonDefModule ? CanonDefModule->getFullModuleName() : ""); 7469 7470 if (Candidates.empty()) 7471 Diag(cast<Decl>(CanonDef)->getLocation(), 7472 diag::note_module_odr_violation_no_possible_decls) << D; 7473 else { 7474 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 7475 Diag(Candidates[I]->getLocation(), 7476 diag::note_module_odr_violation_possible_decl) 7477 << Candidates[I]; 7478 } 7479 } 7480 } 7481 } 7482 7483 // If we deserialized any C++ or Objective-C class definitions, any 7484 // Objective-C protocol definitions, or any redeclarable templates, make sure 7485 // that all redeclarations point to the definitions. Note that this can only 7486 // happen now, after the redeclaration chains have been fully wired. 7487 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(), 7488 DEnd = PendingDefinitions.end(); 7489 D != DEnd; ++D) { 7490 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) { 7491 if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) { 7492 // Make sure that the TagType points at the definition. 7493 const_cast<TagType*>(TagT)->decl = TD; 7494 } 7495 7496 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) { 7497 for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(), 7498 REnd = RD->redecls_end(); 7499 R != REnd; ++R) 7500 cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData; 7501 7502 } 7503 7504 continue; 7505 } 7506 7507 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) { 7508 // Make sure that the ObjCInterfaceType points at the definition. 7509 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 7510 ->Decl = ID; 7511 7512 for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(), 7513 REnd = ID->redecls_end(); 7514 R != REnd; ++R) 7515 R->Data = ID->Data; 7516 7517 continue; 7518 } 7519 7520 if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) { 7521 for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(), 7522 REnd = PD->redecls_end(); 7523 R != REnd; ++R) 7524 R->Data = PD->Data; 7525 7526 continue; 7527 } 7528 7529 RedeclarableTemplateDecl *RTD 7530 = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl(); 7531 for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(), 7532 REnd = RTD->redecls_end(); 7533 R != REnd; ++R) 7534 R->Common = RTD->Common; 7535 } 7536 PendingDefinitions.clear(); 7537 7538 // Load the bodies of any functions or methods we've encountered. We do 7539 // this now (delayed) so that we can be sure that the declaration chains 7540 // have been fully wired up. 7541 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 7542 PBEnd = PendingBodies.end(); 7543 PB != PBEnd; ++PB) { 7544 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 7545 // FIXME: Check for =delete/=default? 7546 // FIXME: Complain about ODR violations here? 7547 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 7548 FD->setLazyBody(PB->second); 7549 continue; 7550 } 7551 7552 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 7553 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 7554 MD->setLazyBody(PB->second); 7555 } 7556 PendingBodies.clear(); 7557 } 7558 7559 void ASTReader::FinishedDeserializing() { 7560 assert(NumCurrentElementsDeserializing && 7561 "FinishedDeserializing not paired with StartedDeserializing"); 7562 if (NumCurrentElementsDeserializing == 1) { 7563 // We decrease NumCurrentElementsDeserializing only after pending actions 7564 // are finished, to avoid recursively re-calling finishPendingActions(). 7565 finishPendingActions(); 7566 } 7567 --NumCurrentElementsDeserializing; 7568 7569 if (NumCurrentElementsDeserializing == 0 && 7570 Consumer && !PassingDeclsToConsumer) { 7571 // Guard variable to avoid recursively redoing the process of passing 7572 // decls to consumer. 7573 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 7574 true); 7575 7576 while (!InterestingDecls.empty()) { 7577 // We are not in recursive loading, so it's safe to pass the "interesting" 7578 // decls to the consumer. 7579 Decl *D = InterestingDecls.front(); 7580 InterestingDecls.pop_front(); 7581 PassInterestingDeclToConsumer(D); 7582 } 7583 } 7584 } 7585 7586 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 7587 D = D->getMostRecentDecl(); 7588 7589 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 7590 SemaObj->TUScope->AddDecl(D); 7591 } else if (SemaObj->TUScope) { 7592 // Adding the decl to IdResolver may have failed because it was already in 7593 // (even though it was not added in scope). If it is already in, make sure 7594 // it gets in the scope as well. 7595 if (std::find(SemaObj->IdResolver.begin(Name), 7596 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 7597 SemaObj->TUScope->AddDecl(D); 7598 } 7599 } 7600 7601 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, 7602 StringRef isysroot, bool DisableValidation, 7603 bool AllowASTWithCompilerErrors, bool UseGlobalIndex) 7604 : Listener(new PCHValidator(PP, *this)), DeserializationListener(0), 7605 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 7606 Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context), 7607 Consumer(0), ModuleMgr(PP.getFileManager()), 7608 isysroot(isysroot), DisableValidation(DisableValidation), 7609 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 7610 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 7611 CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts), 7612 NumSLocEntriesRead(0), TotalNumSLocEntries(0), 7613 NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), 7614 TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0), 7615 NumSelectorsRead(0), NumMethodPoolEntriesRead(0), 7616 NumMethodPoolLookups(0), NumMethodPoolHits(0), 7617 NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0), 7618 TotalNumMethodPoolEntries(0), 7619 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 7620 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 7621 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 7622 PassingDeclsToConsumer(false), 7623 NumCXXBaseSpecifiersLoaded(0), ReadingKind(Read_None) 7624 { 7625 SourceMgr.setExternalSLocEntrySource(this); 7626 } 7627 7628 ASTReader::~ASTReader() { 7629 for (DeclContextVisibleUpdatesPending::iterator 7630 I = PendingVisibleUpdates.begin(), 7631 E = PendingVisibleUpdates.end(); 7632 I != E; ++I) { 7633 for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 7634 F = I->second.end(); 7635 J != F; ++J) 7636 delete J->first; 7637 } 7638 } 7639