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