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