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