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