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