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