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