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