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