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