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