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