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