1 //===-- ASTReader.cpp - AST File Reader ----------------------------------===//
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 "ASTCommon.h"
16 #include "ASTReaderInternals.h"
17 #include "clang/AST/ASTConsumer.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/Expr.h"
21 #include "clang/AST/ExprCXX.h"
22 #include "clang/Frontend/PCHContainerOperations.h"
23 #include "clang/AST/ASTMutationListener.h"
24 #include "clang/AST/NestedNameSpecifier.h"
25 #include "clang/AST/Type.h"
26 #include "clang/AST/TypeLocVisitor.h"
27 #include "clang/Basic/DiagnosticOptions.h"
28 #include "clang/Basic/FileManager.h"
29 #include "clang/Basic/SourceManager.h"
30 #include "clang/Basic/SourceManagerInternals.h"
31 #include "clang/Basic/TargetInfo.h"
32 #include "clang/Basic/TargetOptions.h"
33 #include "clang/Basic/Version.h"
34 #include "clang/Basic/VersionTuple.h"
35 #include "clang/Frontend/Utils.h"
36 #include "clang/Lex/HeaderSearch.h"
37 #include "clang/Lex/HeaderSearchOptions.h"
38 #include "clang/Lex/MacroInfo.h"
39 #include "clang/Lex/PreprocessingRecord.h"
40 #include "clang/Lex/Preprocessor.h"
41 #include "clang/Lex/PreprocessorOptions.h"
42 #include "clang/Sema/Scope.h"
43 #include "clang/Sema/Sema.h"
44 #include "clang/Serialization/ASTDeserializationListener.h"
45 #include "clang/Serialization/GlobalModuleIndex.h"
46 #include "clang/Serialization/ModuleManager.h"
47 #include "clang/Serialization/SerializationDiagnostic.h"
48 #include "llvm/ADT/Hashing.h"
49 #include "llvm/ADT/StringExtras.h"
50 #include "llvm/Bitcode/BitstreamReader.h"
51 #include "llvm/Support/ErrorHandling.h"
52 #include "llvm/Support/FileSystem.h"
53 #include "llvm/Support/MemoryBuffer.h"
54 #include "llvm/Support/Path.h"
55 #include "llvm/Support/SaveAndRestore.h"
56 #include "llvm/Support/raw_ostream.h"
57 #include <algorithm>
58 #include <cstdio>
59 #include <iterator>
60 #include <system_error>
61
62 using namespace clang;
63 using namespace clang::serialization;
64 using namespace clang::serialization::reader;
65 using llvm::BitstreamCursor;
66
67
68 //===----------------------------------------------------------------------===//
69 // ChainedASTReaderListener implementation
70 //===----------------------------------------------------------------------===//
71
72 bool
ReadFullVersionInformation(StringRef FullVersion)73 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
74 return First->ReadFullVersionInformation(FullVersion) ||
75 Second->ReadFullVersionInformation(FullVersion);
76 }
ReadModuleName(StringRef ModuleName)77 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
78 First->ReadModuleName(ModuleName);
79 Second->ReadModuleName(ModuleName);
80 }
ReadModuleMapFile(StringRef ModuleMapPath)81 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
82 First->ReadModuleMapFile(ModuleMapPath);
83 Second->ReadModuleMapFile(ModuleMapPath);
84 }
85 bool
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)86 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
87 bool Complain,
88 bool AllowCompatibleDifferences) {
89 return First->ReadLanguageOptions(LangOpts, Complain,
90 AllowCompatibleDifferences) ||
91 Second->ReadLanguageOptions(LangOpts, Complain,
92 AllowCompatibleDifferences);
93 }
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)94 bool ChainedASTReaderListener::ReadTargetOptions(
95 const TargetOptions &TargetOpts, bool Complain,
96 bool AllowCompatibleDifferences) {
97 return First->ReadTargetOptions(TargetOpts, Complain,
98 AllowCompatibleDifferences) ||
99 Second->ReadTargetOptions(TargetOpts, Complain,
100 AllowCompatibleDifferences);
101 }
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)102 bool ChainedASTReaderListener::ReadDiagnosticOptions(
103 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
104 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
105 Second->ReadDiagnosticOptions(DiagOpts, Complain);
106 }
107 bool
ReadFileSystemOptions(const FileSystemOptions & FSOpts,bool Complain)108 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
109 bool Complain) {
110 return First->ReadFileSystemOptions(FSOpts, Complain) ||
111 Second->ReadFileSystemOptions(FSOpts, Complain);
112 }
113
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)114 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
115 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
116 bool Complain) {
117 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
118 Complain) ||
119 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
120 Complain);
121 }
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)122 bool ChainedASTReaderListener::ReadPreprocessorOptions(
123 const PreprocessorOptions &PPOpts, bool Complain,
124 std::string &SuggestedPredefines) {
125 return First->ReadPreprocessorOptions(PPOpts, Complain,
126 SuggestedPredefines) ||
127 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
128 }
ReadCounter(const serialization::ModuleFile & M,unsigned Value)129 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
130 unsigned Value) {
131 First->ReadCounter(M, Value);
132 Second->ReadCounter(M, Value);
133 }
needsInputFileVisitation()134 bool ChainedASTReaderListener::needsInputFileVisitation() {
135 return First->needsInputFileVisitation() ||
136 Second->needsInputFileVisitation();
137 }
needsSystemInputFileVisitation()138 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
139 return First->needsSystemInputFileVisitation() ||
140 Second->needsSystemInputFileVisitation();
141 }
visitModuleFile(StringRef Filename,ModuleKind Kind)142 void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
143 ModuleKind Kind) {
144 First->visitModuleFile(Filename, Kind);
145 Second->visitModuleFile(Filename, Kind);
146 }
visitInputFile(StringRef Filename,bool isSystem,bool isOverridden,bool isExplicitModule)147 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
148 bool isSystem,
149 bool isOverridden,
150 bool isExplicitModule) {
151 bool Continue = false;
152 if (First->needsInputFileVisitation() &&
153 (!isSystem || First->needsSystemInputFileVisitation()))
154 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
155 isExplicitModule);
156 if (Second->needsInputFileVisitation() &&
157 (!isSystem || Second->needsSystemInputFileVisitation()))
158 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
159 isExplicitModule);
160 return Continue;
161 }
162
readModuleFileExtension(const ModuleFileExtensionMetadata & Metadata)163 void ChainedASTReaderListener::readModuleFileExtension(
164 const ModuleFileExtensionMetadata &Metadata) {
165 First->readModuleFileExtension(Metadata);
166 Second->readModuleFileExtension(Metadata);
167 }
168
169 //===----------------------------------------------------------------------===//
170 // PCH validator implementation
171 //===----------------------------------------------------------------------===//
172
~ASTReaderListener()173 ASTReaderListener::~ASTReaderListener() {}
174
175 /// \brief Compare the given set of language options against an existing set of
176 /// language options.
177 ///
178 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
179 /// \param AllowCompatibleDifferences If true, differences between compatible
180 /// language options will be permitted.
181 ///
182 /// \returns true if the languagae options mis-match, false otherwise.
checkLanguageOptions(const LangOptions & LangOpts,const LangOptions & ExistingLangOpts,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)183 static bool checkLanguageOptions(const LangOptions &LangOpts,
184 const LangOptions &ExistingLangOpts,
185 DiagnosticsEngine *Diags,
186 bool AllowCompatibleDifferences = true) {
187 #define LANGOPT(Name, Bits, Default, Description) \
188 if (ExistingLangOpts.Name != LangOpts.Name) { \
189 if (Diags) \
190 Diags->Report(diag::err_pch_langopt_mismatch) \
191 << Description << LangOpts.Name << ExistingLangOpts.Name; \
192 return true; \
193 }
194
195 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
196 if (ExistingLangOpts.Name != LangOpts.Name) { \
197 if (Diags) \
198 Diags->Report(diag::err_pch_langopt_value_mismatch) \
199 << Description; \
200 return true; \
201 }
202
203 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
204 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
205 if (Diags) \
206 Diags->Report(diag::err_pch_langopt_value_mismatch) \
207 << Description; \
208 return true; \
209 }
210
211 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
212 if (!AllowCompatibleDifferences) \
213 LANGOPT(Name, Bits, Default, Description)
214
215 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
216 if (!AllowCompatibleDifferences) \
217 ENUM_LANGOPT(Name, Bits, Default, Description)
218
219 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
220 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
221 #include "clang/Basic/LangOptions.def"
222
223 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
224 if (Diags)
225 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
226 return true;
227 }
228
229 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
230 if (Diags)
231 Diags->Report(diag::err_pch_langopt_value_mismatch)
232 << "target Objective-C runtime";
233 return true;
234 }
235
236 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
237 LangOpts.CommentOpts.BlockCommandNames) {
238 if (Diags)
239 Diags->Report(diag::err_pch_langopt_value_mismatch)
240 << "block command names";
241 return true;
242 }
243
244 return false;
245 }
246
247 /// \brief Compare the given set of target options against an existing set of
248 /// target options.
249 ///
250 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
251 ///
252 /// \returns true if the target options mis-match, false otherwise.
checkTargetOptions(const TargetOptions & TargetOpts,const TargetOptions & ExistingTargetOpts,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)253 static bool checkTargetOptions(const TargetOptions &TargetOpts,
254 const TargetOptions &ExistingTargetOpts,
255 DiagnosticsEngine *Diags,
256 bool AllowCompatibleDifferences = true) {
257 #define CHECK_TARGET_OPT(Field, Name) \
258 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
259 if (Diags) \
260 Diags->Report(diag::err_pch_targetopt_mismatch) \
261 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
262 return true; \
263 }
264
265 // The triple and ABI must match exactly.
266 CHECK_TARGET_OPT(Triple, "target");
267 CHECK_TARGET_OPT(ABI, "target ABI");
268
269 // We can tolerate different CPUs in many cases, notably when one CPU
270 // supports a strict superset of another. When allowing compatible
271 // differences skip this check.
272 if (!AllowCompatibleDifferences)
273 CHECK_TARGET_OPT(CPU, "target CPU");
274
275 #undef CHECK_TARGET_OPT
276
277 // Compare feature sets.
278 SmallVector<StringRef, 4> ExistingFeatures(
279 ExistingTargetOpts.FeaturesAsWritten.begin(),
280 ExistingTargetOpts.FeaturesAsWritten.end());
281 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
282 TargetOpts.FeaturesAsWritten.end());
283 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
284 std::sort(ReadFeatures.begin(), ReadFeatures.end());
285
286 // We compute the set difference in both directions explicitly so that we can
287 // diagnose the differences differently.
288 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
289 std::set_difference(
290 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
291 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
292 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
293 ExistingFeatures.begin(), ExistingFeatures.end(),
294 std::back_inserter(UnmatchedReadFeatures));
295
296 // If we are allowing compatible differences and the read feature set is
297 // a strict subset of the existing feature set, there is nothing to diagnose.
298 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
299 return false;
300
301 if (Diags) {
302 for (StringRef Feature : UnmatchedReadFeatures)
303 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
304 << /* is-existing-feature */ false << Feature;
305 for (StringRef Feature : UnmatchedExistingFeatures)
306 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
307 << /* is-existing-feature */ true << Feature;
308 }
309
310 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
311 }
312
313 bool
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)314 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
315 bool Complain,
316 bool AllowCompatibleDifferences) {
317 const LangOptions &ExistingLangOpts = PP.getLangOpts();
318 return checkLanguageOptions(LangOpts, ExistingLangOpts,
319 Complain ? &Reader.Diags : nullptr,
320 AllowCompatibleDifferences);
321 }
322
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)323 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
324 bool Complain,
325 bool AllowCompatibleDifferences) {
326 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
327 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
328 Complain ? &Reader.Diags : nullptr,
329 AllowCompatibleDifferences);
330 }
331
332 namespace {
333 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
334 MacroDefinitionsMap;
335 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
336 DeclsMap;
337 }
338
checkDiagnosticGroupMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool Complain)339 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
340 DiagnosticsEngine &Diags,
341 bool Complain) {
342 typedef DiagnosticsEngine::Level Level;
343
344 // Check current mappings for new -Werror mappings, and the stored mappings
345 // for cases that were explicitly mapped to *not* be errors that are now
346 // errors because of options like -Werror.
347 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
348
349 for (DiagnosticsEngine *MappingSource : MappingSources) {
350 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
351 diag::kind DiagID = DiagIDMappingPair.first;
352 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
353 if (CurLevel < DiagnosticsEngine::Error)
354 continue; // not significant
355 Level StoredLevel =
356 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
357 if (StoredLevel < DiagnosticsEngine::Error) {
358 if (Complain)
359 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
360 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
361 return true;
362 }
363 }
364 }
365
366 return false;
367 }
368
isExtHandlingFromDiagsError(DiagnosticsEngine & Diags)369 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
370 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
371 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
372 return true;
373 return Ext >= diag::Severity::Error;
374 }
375
checkDiagnosticMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool IsSystem,bool Complain)376 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
377 DiagnosticsEngine &Diags,
378 bool IsSystem, bool Complain) {
379 // Top-level options
380 if (IsSystem) {
381 if (Diags.getSuppressSystemWarnings())
382 return false;
383 // If -Wsystem-headers was not enabled before, be conservative
384 if (StoredDiags.getSuppressSystemWarnings()) {
385 if (Complain)
386 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
387 return true;
388 }
389 }
390
391 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
392 if (Complain)
393 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
394 return true;
395 }
396
397 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
398 !StoredDiags.getEnableAllWarnings()) {
399 if (Complain)
400 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
401 return true;
402 }
403
404 if (isExtHandlingFromDiagsError(Diags) &&
405 !isExtHandlingFromDiagsError(StoredDiags)) {
406 if (Complain)
407 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
408 return true;
409 }
410
411 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
412 }
413
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)414 bool PCHValidator::ReadDiagnosticOptions(
415 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
416 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
417 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
418 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
419 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
420 // This should never fail, because we would have processed these options
421 // before writing them to an ASTFile.
422 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
423
424 ModuleManager &ModuleMgr = Reader.getModuleManager();
425 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
426
427 // If the original import came from a file explicitly generated by the user,
428 // don't check the diagnostic mappings.
429 // FIXME: currently this is approximated by checking whether this is not a
430 // module import of an implicitly-loaded module file.
431 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
432 // the transitive closure of its imports, since unrelated modules cannot be
433 // imported until after this module finishes validation.
434 ModuleFile *TopImport = *ModuleMgr.rbegin();
435 while (!TopImport->ImportedBy.empty())
436 TopImport = TopImport->ImportedBy[0];
437 if (TopImport->Kind != MK_ImplicitModule)
438 return false;
439
440 StringRef ModuleName = TopImport->ModuleName;
441 assert(!ModuleName.empty() && "diagnostic options read before module name");
442
443 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
444 assert(M && "missing module");
445
446 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
447 // contains the union of their flags.
448 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
449 }
450
451 /// \brief Collect the macro definitions provided by the given preprocessor
452 /// options.
453 static void
collectMacroDefinitions(const PreprocessorOptions & PPOpts,MacroDefinitionsMap & Macros,SmallVectorImpl<StringRef> * MacroNames=nullptr)454 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
455 MacroDefinitionsMap &Macros,
456 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
457 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
458 StringRef Macro = PPOpts.Macros[I].first;
459 bool IsUndef = PPOpts.Macros[I].second;
460
461 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
462 StringRef MacroName = MacroPair.first;
463 StringRef MacroBody = MacroPair.second;
464
465 // For an #undef'd macro, we only care about the name.
466 if (IsUndef) {
467 if (MacroNames && !Macros.count(MacroName))
468 MacroNames->push_back(MacroName);
469
470 Macros[MacroName] = std::make_pair("", true);
471 continue;
472 }
473
474 // For a #define'd macro, figure out the actual definition.
475 if (MacroName.size() == Macro.size())
476 MacroBody = "1";
477 else {
478 // Note: GCC drops anything following an end-of-line character.
479 StringRef::size_type End = MacroBody.find_first_of("\n\r");
480 MacroBody = MacroBody.substr(0, End);
481 }
482
483 if (MacroNames && !Macros.count(MacroName))
484 MacroNames->push_back(MacroName);
485 Macros[MacroName] = std::make_pair(MacroBody, false);
486 }
487 }
488
489 /// \brief Check the preprocessor options deserialized from the control block
490 /// against the preprocessor options in an existing preprocessor.
491 ///
492 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
checkPreprocessorOptions(const PreprocessorOptions & PPOpts,const PreprocessorOptions & ExistingPPOpts,DiagnosticsEngine * Diags,FileManager & FileMgr,std::string & SuggestedPredefines,const LangOptions & LangOpts)493 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
494 const PreprocessorOptions &ExistingPPOpts,
495 DiagnosticsEngine *Diags,
496 FileManager &FileMgr,
497 std::string &SuggestedPredefines,
498 const LangOptions &LangOpts) {
499 // Check macro definitions.
500 MacroDefinitionsMap ASTFileMacros;
501 collectMacroDefinitions(PPOpts, ASTFileMacros);
502 MacroDefinitionsMap ExistingMacros;
503 SmallVector<StringRef, 4> ExistingMacroNames;
504 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
505
506 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
507 // Dig out the macro definition in the existing preprocessor options.
508 StringRef MacroName = ExistingMacroNames[I];
509 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
510
511 // Check whether we know anything about this macro name or not.
512 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
513 = ASTFileMacros.find(MacroName);
514 if (Known == ASTFileMacros.end()) {
515 // FIXME: Check whether this identifier was referenced anywhere in the
516 // AST file. If so, we should reject the AST file. Unfortunately, this
517 // information isn't in the control block. What shall we do about it?
518
519 if (Existing.second) {
520 SuggestedPredefines += "#undef ";
521 SuggestedPredefines += MacroName.str();
522 SuggestedPredefines += '\n';
523 } else {
524 SuggestedPredefines += "#define ";
525 SuggestedPredefines += MacroName.str();
526 SuggestedPredefines += ' ';
527 SuggestedPredefines += Existing.first.str();
528 SuggestedPredefines += '\n';
529 }
530 continue;
531 }
532
533 // If the macro was defined in one but undef'd in the other, we have a
534 // conflict.
535 if (Existing.second != Known->second.second) {
536 if (Diags) {
537 Diags->Report(diag::err_pch_macro_def_undef)
538 << MacroName << Known->second.second;
539 }
540 return true;
541 }
542
543 // If the macro was #undef'd in both, or if the macro bodies are identical,
544 // it's fine.
545 if (Existing.second || Existing.first == Known->second.first)
546 continue;
547
548 // The macro bodies differ; complain.
549 if (Diags) {
550 Diags->Report(diag::err_pch_macro_def_conflict)
551 << MacroName << Known->second.first << Existing.first;
552 }
553 return true;
554 }
555
556 // Check whether we're using predefines.
557 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
558 if (Diags) {
559 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
560 }
561 return true;
562 }
563
564 // Detailed record is important since it is used for the module cache hash.
565 if (LangOpts.Modules &&
566 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
567 if (Diags) {
568 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
569 }
570 return true;
571 }
572
573 // Compute the #include and #include_macros lines we need.
574 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
575 StringRef File = ExistingPPOpts.Includes[I];
576 if (File == ExistingPPOpts.ImplicitPCHInclude)
577 continue;
578
579 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
580 != PPOpts.Includes.end())
581 continue;
582
583 SuggestedPredefines += "#include \"";
584 SuggestedPredefines += File;
585 SuggestedPredefines += "\"\n";
586 }
587
588 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
589 StringRef File = ExistingPPOpts.MacroIncludes[I];
590 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
591 File)
592 != PPOpts.MacroIncludes.end())
593 continue;
594
595 SuggestedPredefines += "#__include_macros \"";
596 SuggestedPredefines += File;
597 SuggestedPredefines += "\"\n##\n";
598 }
599
600 return false;
601 }
602
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)603 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
604 bool Complain,
605 std::string &SuggestedPredefines) {
606 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
607
608 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
609 Complain? &Reader.Diags : nullptr,
610 PP.getFileManager(),
611 SuggestedPredefines,
612 PP.getLangOpts());
613 }
614
615 /// Check the header search options deserialized from the control block
616 /// against the header search options in an existing preprocessor.
617 ///
618 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
checkHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,StringRef ExistingModuleCachePath,DiagnosticsEngine * Diags,const LangOptions & LangOpts)619 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
620 StringRef SpecificModuleCachePath,
621 StringRef ExistingModuleCachePath,
622 DiagnosticsEngine *Diags,
623 const LangOptions &LangOpts) {
624 if (LangOpts.Modules) {
625 if (SpecificModuleCachePath != ExistingModuleCachePath) {
626 if (Diags)
627 Diags->Report(diag::err_pch_modulecache_mismatch)
628 << SpecificModuleCachePath << ExistingModuleCachePath;
629 return true;
630 }
631 }
632
633 return false;
634 }
635
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)636 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
637 StringRef SpecificModuleCachePath,
638 bool Complain) {
639 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
640 PP.getHeaderSearchInfo().getModuleCachePath(),
641 Complain ? &Reader.Diags : nullptr,
642 PP.getLangOpts());
643 }
644
ReadCounter(const ModuleFile & M,unsigned Value)645 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
646 PP.setCounterValue(Value);
647 }
648
649 //===----------------------------------------------------------------------===//
650 // AST reader implementation
651 //===----------------------------------------------------------------------===//
652
setDeserializationListener(ASTDeserializationListener * Listener,bool TakeOwnership)653 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
654 bool TakeOwnership) {
655 DeserializationListener = Listener;
656 OwnsDeserializationListener = TakeOwnership;
657 }
658
659
660
ComputeHash(Selector Sel)661 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
662 return serialization::ComputeHash(Sel);
663 }
664
665
666 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)667 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
668 using namespace llvm::support;
669 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
670 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
671 return std::make_pair(KeyLen, DataLen);
672 }
673
674 ASTSelectorLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)675 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
676 using namespace llvm::support;
677 SelectorTable &SelTable = Reader.getContext().Selectors;
678 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
679 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
680 F, endian::readNext<uint32_t, little, unaligned>(d));
681 if (N == 0)
682 return SelTable.getNullarySelector(FirstII);
683 else if (N == 1)
684 return SelTable.getUnarySelector(FirstII);
685
686 SmallVector<IdentifierInfo *, 16> Args;
687 Args.push_back(FirstII);
688 for (unsigned I = 1; I != N; ++I)
689 Args.push_back(Reader.getLocalIdentifier(
690 F, endian::readNext<uint32_t, little, unaligned>(d)));
691
692 return SelTable.getSelector(N, Args.data());
693 }
694
695 ASTSelectorLookupTrait::data_type
ReadData(Selector,const unsigned char * d,unsigned DataLen)696 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
697 unsigned DataLen) {
698 using namespace llvm::support;
699
700 data_type Result;
701
702 Result.ID = Reader.getGlobalSelectorID(
703 F, endian::readNext<uint32_t, little, unaligned>(d));
704 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
705 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
706 Result.InstanceBits = FullInstanceBits & 0x3;
707 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
708 Result.FactoryBits = FullFactoryBits & 0x3;
709 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
710 unsigned NumInstanceMethods = FullInstanceBits >> 3;
711 unsigned NumFactoryMethods = FullFactoryBits >> 3;
712
713 // Load instance methods
714 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
715 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
716 F, endian::readNext<uint32_t, little, unaligned>(d)))
717 Result.Instance.push_back(Method);
718 }
719
720 // Load factory methods
721 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
722 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
723 F, endian::readNext<uint32_t, little, unaligned>(d)))
724 Result.Factory.push_back(Method);
725 }
726
727 return Result;
728 }
729
ComputeHash(const internal_key_type & a)730 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
731 return llvm::HashString(a);
732 }
733
734 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)735 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
736 using namespace llvm::support;
737 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
738 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
739 return std::make_pair(KeyLen, DataLen);
740 }
741
742 ASTIdentifierLookupTraitBase::internal_key_type
ReadKey(const unsigned char * d,unsigned n)743 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
744 assert(n >= 2 && d[n-1] == '\0');
745 return StringRef((const char*) d, n-1);
746 }
747
748 /// \brief Whether the given identifier is "interesting".
isInterestingIdentifier(ASTReader & Reader,IdentifierInfo & II,bool IsModule)749 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
750 bool IsModule) {
751 return II.hadMacroDefinition() ||
752 II.isPoisoned() ||
753 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
754 II.hasRevertedTokenIDToIdentifier() ||
755 (!(IsModule && Reader.getContext().getLangOpts().CPlusPlus) &&
756 II.getFETokenInfo<void>());
757 }
758
readBit(unsigned & Bits)759 static bool readBit(unsigned &Bits) {
760 bool Value = Bits & 0x1;
761 Bits >>= 1;
762 return Value;
763 }
764
ReadIdentifierID(const unsigned char * d)765 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
766 using namespace llvm::support;
767 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
768 return Reader.getGlobalIdentifierID(F, RawID >> 1);
769 }
770
ReadData(const internal_key_type & k,const unsigned char * d,unsigned DataLen)771 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
772 const unsigned char* d,
773 unsigned DataLen) {
774 using namespace llvm::support;
775 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
776 bool IsInteresting = RawID & 0x01;
777
778 // Wipe out the "is interesting" bit.
779 RawID = RawID >> 1;
780
781 // Build the IdentifierInfo and link the identifier ID with it.
782 IdentifierInfo *II = KnownII;
783 if (!II) {
784 II = &Reader.getIdentifierTable().getOwn(k);
785 KnownII = II;
786 }
787 if (!II->isFromAST()) {
788 II->setIsFromAST();
789 bool IsModule = Reader.PP.getCurrentModule() != nullptr;
790 if (isInterestingIdentifier(Reader, *II, IsModule))
791 II->setChangedSinceDeserialization();
792 }
793 Reader.markIdentifierUpToDate(II);
794
795 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
796 if (!IsInteresting) {
797 // For uninteresting identifiers, there's nothing else to do. Just notify
798 // the reader that we've finished loading this identifier.
799 Reader.SetIdentifierInfo(ID, II);
800 return II;
801 }
802
803 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
804 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
805 bool CPlusPlusOperatorKeyword = readBit(Bits);
806 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
807 bool HasRevertedBuiltin = readBit(Bits);
808 bool Poisoned = readBit(Bits);
809 bool ExtensionToken = readBit(Bits);
810 bool HadMacroDefinition = readBit(Bits);
811
812 assert(Bits == 0 && "Extra bits in the identifier?");
813 DataLen -= 8;
814
815 // Set or check the various bits in the IdentifierInfo structure.
816 // Token IDs are read-only.
817 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
818 II->revertTokenIDToIdentifier();
819 if (!F.isModule())
820 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
821 else if (HasRevertedBuiltin && II->getBuiltinID()) {
822 II->revertBuiltin();
823 assert((II->hasRevertedBuiltin() ||
824 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&
825 "Incorrect ObjC keyword or builtin ID");
826 }
827 assert(II->isExtensionToken() == ExtensionToken &&
828 "Incorrect extension token flag");
829 (void)ExtensionToken;
830 if (Poisoned)
831 II->setIsPoisoned(true);
832 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
833 "Incorrect C++ operator keyword flag");
834 (void)CPlusPlusOperatorKeyword;
835
836 // If this identifier is a macro, deserialize the macro
837 // definition.
838 if (HadMacroDefinition) {
839 uint32_t MacroDirectivesOffset =
840 endian::readNext<uint32_t, little, unaligned>(d);
841 DataLen -= 4;
842
843 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
844 }
845
846 Reader.SetIdentifierInfo(ID, II);
847
848 // Read all of the declarations visible at global scope with this
849 // name.
850 if (DataLen > 0) {
851 SmallVector<uint32_t, 4> DeclIDs;
852 for (; DataLen > 0; DataLen -= 4)
853 DeclIDs.push_back(Reader.getGlobalDeclID(
854 F, endian::readNext<uint32_t, little, unaligned>(d)));
855 Reader.SetGloballyVisibleDecls(II, DeclIDs);
856 }
857
858 return II;
859 }
860
DeclarationNameKey(DeclarationName Name)861 DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
862 : Kind(Name.getNameKind()) {
863 switch (Kind) {
864 case DeclarationName::Identifier:
865 Data = (uint64_t)Name.getAsIdentifierInfo();
866 break;
867 case DeclarationName::ObjCZeroArgSelector:
868 case DeclarationName::ObjCOneArgSelector:
869 case DeclarationName::ObjCMultiArgSelector:
870 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
871 break;
872 case DeclarationName::CXXOperatorName:
873 Data = Name.getCXXOverloadedOperator();
874 break;
875 case DeclarationName::CXXLiteralOperatorName:
876 Data = (uint64_t)Name.getCXXLiteralIdentifier();
877 break;
878 case DeclarationName::CXXConstructorName:
879 case DeclarationName::CXXDestructorName:
880 case DeclarationName::CXXConversionFunctionName:
881 case DeclarationName::CXXUsingDirective:
882 Data = 0;
883 break;
884 }
885 }
886
getHash() const887 unsigned DeclarationNameKey::getHash() const {
888 llvm::FoldingSetNodeID ID;
889 ID.AddInteger(Kind);
890
891 switch (Kind) {
892 case DeclarationName::Identifier:
893 case DeclarationName::CXXLiteralOperatorName:
894 ID.AddString(((IdentifierInfo*)Data)->getName());
895 break;
896 case DeclarationName::ObjCZeroArgSelector:
897 case DeclarationName::ObjCOneArgSelector:
898 case DeclarationName::ObjCMultiArgSelector:
899 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
900 break;
901 case DeclarationName::CXXOperatorName:
902 ID.AddInteger((OverloadedOperatorKind)Data);
903 break;
904 case DeclarationName::CXXConstructorName:
905 case DeclarationName::CXXDestructorName:
906 case DeclarationName::CXXConversionFunctionName:
907 case DeclarationName::CXXUsingDirective:
908 break;
909 }
910
911 return ID.ComputeHash();
912 }
913
914 ModuleFile *
ReadFileRef(const unsigned char * & d)915 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
916 using namespace llvm::support;
917 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
918 return Reader.getLocalModuleFile(F, ModuleFileID);
919 }
920
921 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)922 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
923 using namespace llvm::support;
924 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
925 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
926 return std::make_pair(KeyLen, DataLen);
927 }
928
929 ASTDeclContextNameLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)930 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
931 using namespace llvm::support;
932
933 auto Kind = (DeclarationName::NameKind)*d++;
934 uint64_t Data;
935 switch (Kind) {
936 case DeclarationName::Identifier:
937 Data = (uint64_t)Reader.getLocalIdentifier(
938 F, endian::readNext<uint32_t, little, unaligned>(d));
939 break;
940 case DeclarationName::ObjCZeroArgSelector:
941 case DeclarationName::ObjCOneArgSelector:
942 case DeclarationName::ObjCMultiArgSelector:
943 Data =
944 (uint64_t)Reader.getLocalSelector(
945 F, endian::readNext<uint32_t, little, unaligned>(
946 d)).getAsOpaquePtr();
947 break;
948 case DeclarationName::CXXOperatorName:
949 Data = *d++; // OverloadedOperatorKind
950 break;
951 case DeclarationName::CXXLiteralOperatorName:
952 Data = (uint64_t)Reader.getLocalIdentifier(
953 F, endian::readNext<uint32_t, little, unaligned>(d));
954 break;
955 case DeclarationName::CXXConstructorName:
956 case DeclarationName::CXXDestructorName:
957 case DeclarationName::CXXConversionFunctionName:
958 case DeclarationName::CXXUsingDirective:
959 Data = 0;
960 break;
961 }
962
963 return DeclarationNameKey(Kind, Data);
964 }
965
ReadDataInto(internal_key_type,const unsigned char * d,unsigned DataLen,data_type_builder & Val)966 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
967 const unsigned char *d,
968 unsigned DataLen,
969 data_type_builder &Val) {
970 using namespace llvm::support;
971 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
972 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
973 Val.insert(Reader.getGlobalDeclID(F, LocalID));
974 }
975 }
976
ReadLexicalDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,DeclContext * DC)977 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
978 BitstreamCursor &Cursor,
979 uint64_t Offset,
980 DeclContext *DC) {
981 assert(Offset != 0);
982
983 SavedStreamPosition SavedPosition(Cursor);
984 Cursor.JumpToBit(Offset);
985
986 RecordData Record;
987 StringRef Blob;
988 unsigned Code = Cursor.ReadCode();
989 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
990 if (RecCode != DECL_CONTEXT_LEXICAL) {
991 Error("Expected lexical block");
992 return true;
993 }
994
995 assert(!isa<TranslationUnitDecl>(DC) &&
996 "expected a TU_UPDATE_LEXICAL record for TU");
997 // If we are handling a C++ class template instantiation, we can see multiple
998 // lexical updates for the same record. It's important that we select only one
999 // of them, so that field numbering works properly. Just pick the first one we
1000 // see.
1001 auto &Lex = LexicalDecls[DC];
1002 if (!Lex.first) {
1003 Lex = std::make_pair(
1004 &M, llvm::makeArrayRef(
1005 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1006 Blob.data()),
1007 Blob.size() / 4));
1008 }
1009 DC->setHasExternalLexicalStorage(true);
1010 return false;
1011 }
1012
ReadVisibleDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,DeclID ID)1013 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1014 BitstreamCursor &Cursor,
1015 uint64_t Offset,
1016 DeclID ID) {
1017 assert(Offset != 0);
1018
1019 SavedStreamPosition SavedPosition(Cursor);
1020 Cursor.JumpToBit(Offset);
1021
1022 RecordData Record;
1023 StringRef Blob;
1024 unsigned Code = Cursor.ReadCode();
1025 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1026 if (RecCode != DECL_CONTEXT_VISIBLE) {
1027 Error("Expected visible lookup table block");
1028 return true;
1029 }
1030
1031 // We can't safely determine the primary context yet, so delay attaching the
1032 // lookup table until we're done with recursive deserialization.
1033 auto *Data = (const unsigned char*)Blob.data();
1034 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1035 return false;
1036 }
1037
Error(StringRef Msg)1038 void ASTReader::Error(StringRef Msg) {
1039 Error(diag::err_fe_pch_malformed, Msg);
1040 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1041 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1042 Diag(diag::note_module_cache_path)
1043 << PP.getHeaderSearchInfo().getModuleCachePath();
1044 }
1045 }
1046
Error(unsigned DiagID,StringRef Arg1,StringRef Arg2)1047 void ASTReader::Error(unsigned DiagID,
1048 StringRef Arg1, StringRef Arg2) {
1049 if (Diags.isDiagnosticInFlight())
1050 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1051 else
1052 Diag(DiagID) << Arg1 << Arg2;
1053 }
1054
1055 //===----------------------------------------------------------------------===//
1056 // Source Manager Deserialization
1057 //===----------------------------------------------------------------------===//
1058
1059 /// \brief Read the line table in the source manager block.
1060 /// \returns true if there was an error.
ParseLineTable(ModuleFile & F,const RecordData & Record)1061 bool ASTReader::ParseLineTable(ModuleFile &F,
1062 const RecordData &Record) {
1063 unsigned Idx = 0;
1064 LineTableInfo &LineTable = SourceMgr.getLineTable();
1065
1066 // Parse the file names
1067 std::map<int, int> FileIDs;
1068 for (unsigned I = 0; Record[Idx]; ++I) {
1069 // Extract the file name
1070 auto Filename = ReadPath(F, Record, Idx);
1071 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1072 }
1073 ++Idx;
1074
1075 // Parse the line entries
1076 std::vector<LineEntry> Entries;
1077 while (Idx < Record.size()) {
1078 int FID = Record[Idx++];
1079 assert(FID >= 0 && "Serialized line entries for non-local file.");
1080 // Remap FileID from 1-based old view.
1081 FID += F.SLocEntryBaseID - 1;
1082
1083 // Extract the line entries
1084 unsigned NumEntries = Record[Idx++];
1085 assert(NumEntries && "no line entries for file ID");
1086 Entries.clear();
1087 Entries.reserve(NumEntries);
1088 for (unsigned I = 0; I != NumEntries; ++I) {
1089 unsigned FileOffset = Record[Idx++];
1090 unsigned LineNo = Record[Idx++];
1091 int FilenameID = FileIDs[Record[Idx++]];
1092 SrcMgr::CharacteristicKind FileKind
1093 = (SrcMgr::CharacteristicKind)Record[Idx++];
1094 unsigned IncludeOffset = Record[Idx++];
1095 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1096 FileKind, IncludeOffset));
1097 }
1098 LineTable.AddEntry(FileID::get(FID), Entries);
1099 }
1100
1101 return false;
1102 }
1103
1104 /// \brief Read a source manager block
ReadSourceManagerBlock(ModuleFile & F)1105 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1106 using namespace SrcMgr;
1107
1108 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1109
1110 // Set the source-location entry cursor to the current position in
1111 // the stream. This cursor will be used to read the contents of the
1112 // source manager block initially, and then lazily read
1113 // source-location entries as needed.
1114 SLocEntryCursor = F.Stream;
1115
1116 // The stream itself is going to skip over the source manager block.
1117 if (F.Stream.SkipBlock()) {
1118 Error("malformed block record in AST file");
1119 return true;
1120 }
1121
1122 // Enter the source manager block.
1123 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1124 Error("malformed source manager block record in AST file");
1125 return true;
1126 }
1127
1128 RecordData Record;
1129 while (true) {
1130 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1131
1132 switch (E.Kind) {
1133 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1134 case llvm::BitstreamEntry::Error:
1135 Error("malformed block record in AST file");
1136 return true;
1137 case llvm::BitstreamEntry::EndBlock:
1138 return false;
1139 case llvm::BitstreamEntry::Record:
1140 // The interesting case.
1141 break;
1142 }
1143
1144 // Read a record.
1145 Record.clear();
1146 StringRef Blob;
1147 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1148 default: // Default behavior: ignore.
1149 break;
1150
1151 case SM_SLOC_FILE_ENTRY:
1152 case SM_SLOC_BUFFER_ENTRY:
1153 case SM_SLOC_EXPANSION_ENTRY:
1154 // Once we hit one of the source location entries, we're done.
1155 return false;
1156 }
1157 }
1158 }
1159
1160 /// \brief If a header file is not found at the path that we expect it to be
1161 /// and the PCH file was moved from its original location, try to resolve the
1162 /// file by assuming that header+PCH were moved together and the header is in
1163 /// the same place relative to the PCH.
1164 static std::string
resolveFileRelativeToOriginalDir(const std::string & Filename,const std::string & OriginalDir,const std::string & CurrDir)1165 resolveFileRelativeToOriginalDir(const std::string &Filename,
1166 const std::string &OriginalDir,
1167 const std::string &CurrDir) {
1168 assert(OriginalDir != CurrDir &&
1169 "No point trying to resolve the file if the PCH dir didn't change");
1170 using namespace llvm::sys;
1171 SmallString<128> filePath(Filename);
1172 fs::make_absolute(filePath);
1173 assert(path::is_absolute(OriginalDir));
1174 SmallString<128> currPCHPath(CurrDir);
1175
1176 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1177 fileDirE = path::end(path::parent_path(filePath));
1178 path::const_iterator origDirI = path::begin(OriginalDir),
1179 origDirE = path::end(OriginalDir);
1180 // Skip the common path components from filePath and OriginalDir.
1181 while (fileDirI != fileDirE && origDirI != origDirE &&
1182 *fileDirI == *origDirI) {
1183 ++fileDirI;
1184 ++origDirI;
1185 }
1186 for (; origDirI != origDirE; ++origDirI)
1187 path::append(currPCHPath, "..");
1188 path::append(currPCHPath, fileDirI, fileDirE);
1189 path::append(currPCHPath, path::filename(Filename));
1190 return currPCHPath.str();
1191 }
1192
ReadSLocEntry(int ID)1193 bool ASTReader::ReadSLocEntry(int ID) {
1194 if (ID == 0)
1195 return false;
1196
1197 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1198 Error("source location entry ID out-of-range for AST file");
1199 return true;
1200 }
1201
1202 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1203 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1204 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1205 unsigned BaseOffset = F->SLocEntryBaseOffset;
1206
1207 ++NumSLocEntriesRead;
1208 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1209 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1210 Error("incorrectly-formatted source location entry in AST file");
1211 return true;
1212 }
1213
1214 RecordData Record;
1215 StringRef Blob;
1216 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1217 default:
1218 Error("incorrectly-formatted source location entry in AST file");
1219 return true;
1220
1221 case SM_SLOC_FILE_ENTRY: {
1222 // We will detect whether a file changed and return 'Failure' for it, but
1223 // we will also try to fail gracefully by setting up the SLocEntry.
1224 unsigned InputID = Record[4];
1225 InputFile IF = getInputFile(*F, InputID);
1226 const FileEntry *File = IF.getFile();
1227 bool OverriddenBuffer = IF.isOverridden();
1228
1229 // Note that we only check if a File was returned. If it was out-of-date
1230 // we have complained but we will continue creating a FileID to recover
1231 // gracefully.
1232 if (!File)
1233 return true;
1234
1235 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1236 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1237 // This is the module's main file.
1238 IncludeLoc = getImportLocation(F);
1239 }
1240 SrcMgr::CharacteristicKind
1241 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1242 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1243 ID, BaseOffset + Record[0]);
1244 SrcMgr::FileInfo &FileInfo =
1245 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1246 FileInfo.NumCreatedFIDs = Record[5];
1247 if (Record[3])
1248 FileInfo.setHasLineDirectives();
1249
1250 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1251 unsigned NumFileDecls = Record[7];
1252 if (NumFileDecls) {
1253 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1254 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1255 NumFileDecls));
1256 }
1257
1258 const SrcMgr::ContentCache *ContentCache
1259 = SourceMgr.getOrCreateContentCache(File,
1260 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1261 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1262 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1263 !ContentCache->getRawBuffer()) {
1264 unsigned Code = SLocEntryCursor.ReadCode();
1265 Record.clear();
1266 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1267
1268 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1269 Error("AST record has invalid code");
1270 return true;
1271 }
1272
1273 std::unique_ptr<llvm::MemoryBuffer> Buffer
1274 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
1275 SourceMgr.overrideFileContents(File, std::move(Buffer));
1276 }
1277
1278 break;
1279 }
1280
1281 case SM_SLOC_BUFFER_ENTRY: {
1282 const char *Name = Blob.data();
1283 unsigned Offset = Record[0];
1284 SrcMgr::CharacteristicKind
1285 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1286 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1287 if (IncludeLoc.isInvalid() &&
1288 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
1289 IncludeLoc = getImportLocation(F);
1290 }
1291 unsigned Code = SLocEntryCursor.ReadCode();
1292 Record.clear();
1293 unsigned RecCode
1294 = SLocEntryCursor.readRecord(Code, Record, &Blob);
1295
1296 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1297 Error("AST record has invalid code");
1298 return true;
1299 }
1300
1301 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1302 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
1303 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1304 BaseOffset + Offset, IncludeLoc);
1305 break;
1306 }
1307
1308 case SM_SLOC_EXPANSION_ENTRY: {
1309 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1310 SourceMgr.createExpansionLoc(SpellingLoc,
1311 ReadSourceLocation(*F, Record[2]),
1312 ReadSourceLocation(*F, Record[3]),
1313 Record[4],
1314 ID,
1315 BaseOffset + Record[0]);
1316 break;
1317 }
1318 }
1319
1320 return false;
1321 }
1322
getModuleImportLoc(int ID)1323 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1324 if (ID == 0)
1325 return std::make_pair(SourceLocation(), "");
1326
1327 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1328 Error("source location entry ID out-of-range for AST file");
1329 return std::make_pair(SourceLocation(), "");
1330 }
1331
1332 // Find which module file this entry lands in.
1333 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1334 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
1335 return std::make_pair(SourceLocation(), "");
1336
1337 // FIXME: Can we map this down to a particular submodule? That would be
1338 // ideal.
1339 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1340 }
1341
1342 /// \brief Find the location where the module F is imported.
getImportLocation(ModuleFile * F)1343 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1344 if (F->ImportLoc.isValid())
1345 return F->ImportLoc;
1346
1347 // Otherwise we have a PCH. It's considered to be "imported" at the first
1348 // location of its includer.
1349 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1350 // Main file is the importer.
1351 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
1352 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1353 }
1354 return F->ImportedBy[0]->FirstLoc;
1355 }
1356
1357 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1358 /// specified cursor. Read the abbreviations that are at the top of the block
1359 /// and then leave the cursor pointing into the block.
ReadBlockAbbrevs(BitstreamCursor & Cursor,unsigned BlockID)1360 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1361 if (Cursor.EnterSubBlock(BlockID))
1362 return true;
1363
1364 while (true) {
1365 uint64_t Offset = Cursor.GetCurrentBitNo();
1366 unsigned Code = Cursor.ReadCode();
1367
1368 // We expect all abbrevs to be at the start of the block.
1369 if (Code != llvm::bitc::DEFINE_ABBREV) {
1370 Cursor.JumpToBit(Offset);
1371 return false;
1372 }
1373 Cursor.ReadAbbrevRecord();
1374 }
1375 }
1376
ReadToken(ModuleFile & F,const RecordDataImpl & Record,unsigned & Idx)1377 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1378 unsigned &Idx) {
1379 Token Tok;
1380 Tok.startToken();
1381 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1382 Tok.setLength(Record[Idx++]);
1383 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1384 Tok.setIdentifierInfo(II);
1385 Tok.setKind((tok::TokenKind)Record[Idx++]);
1386 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1387 return Tok;
1388 }
1389
ReadMacroRecord(ModuleFile & F,uint64_t Offset)1390 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1391 BitstreamCursor &Stream = F.MacroCursor;
1392
1393 // Keep track of where we are in the stream, then jump back there
1394 // after reading this macro.
1395 SavedStreamPosition SavedPosition(Stream);
1396
1397 Stream.JumpToBit(Offset);
1398 RecordData Record;
1399 SmallVector<IdentifierInfo*, 16> MacroArgs;
1400 MacroInfo *Macro = nullptr;
1401
1402 while (true) {
1403 // Advance to the next record, but if we get to the end of the block, don't
1404 // pop it (removing all the abbreviations from the cursor) since we want to
1405 // be able to reseek within the block and read entries.
1406 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1407 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1408
1409 switch (Entry.Kind) {
1410 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1411 case llvm::BitstreamEntry::Error:
1412 Error("malformed block record in AST file");
1413 return Macro;
1414 case llvm::BitstreamEntry::EndBlock:
1415 return Macro;
1416 case llvm::BitstreamEntry::Record:
1417 // The interesting case.
1418 break;
1419 }
1420
1421 // Read a record.
1422 Record.clear();
1423 PreprocessorRecordTypes RecType =
1424 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1425 switch (RecType) {
1426 case PP_MODULE_MACRO:
1427 case PP_MACRO_DIRECTIVE_HISTORY:
1428 return Macro;
1429
1430 case PP_MACRO_OBJECT_LIKE:
1431 case PP_MACRO_FUNCTION_LIKE: {
1432 // If we already have a macro, that means that we've hit the end
1433 // of the definition of the macro we were looking for. We're
1434 // done.
1435 if (Macro)
1436 return Macro;
1437
1438 unsigned NextIndex = 1; // Skip identifier ID.
1439 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1440 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1441 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1442 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1443 MI->setIsUsed(Record[NextIndex++]);
1444 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1445
1446 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1447 // Decode function-like macro info.
1448 bool isC99VarArgs = Record[NextIndex++];
1449 bool isGNUVarArgs = Record[NextIndex++];
1450 bool hasCommaPasting = Record[NextIndex++];
1451 MacroArgs.clear();
1452 unsigned NumArgs = Record[NextIndex++];
1453 for (unsigned i = 0; i != NumArgs; ++i)
1454 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1455
1456 // Install function-like macro info.
1457 MI->setIsFunctionLike();
1458 if (isC99VarArgs) MI->setIsC99Varargs();
1459 if (isGNUVarArgs) MI->setIsGNUVarargs();
1460 if (hasCommaPasting) MI->setHasCommaPasting();
1461 MI->setArgumentList(MacroArgs, PP.getPreprocessorAllocator());
1462 }
1463
1464 // Remember that we saw this macro last so that we add the tokens that
1465 // form its body to it.
1466 Macro = MI;
1467
1468 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1469 Record[NextIndex]) {
1470 // We have a macro definition. Register the association
1471 PreprocessedEntityID
1472 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1473 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1474 PreprocessingRecord::PPEntityID PPID =
1475 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1476 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1477 PPRec.getPreprocessedEntity(PPID));
1478 if (PPDef)
1479 PPRec.RegisterMacroDefinition(Macro, PPDef);
1480 }
1481
1482 ++NumMacrosRead;
1483 break;
1484 }
1485
1486 case PP_TOKEN: {
1487 // If we see a TOKEN before a PP_MACRO_*, then the file is
1488 // erroneous, just pretend we didn't see this.
1489 if (!Macro) break;
1490
1491 unsigned Idx = 0;
1492 Token Tok = ReadToken(F, Record, Idx);
1493 Macro->AddTokenToBody(Tok);
1494 break;
1495 }
1496 }
1497 }
1498 }
1499
1500 PreprocessedEntityID
getGlobalPreprocessedEntityID(ModuleFile & M,unsigned LocalID) const1501 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1502 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1503 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1504 assert(I != M.PreprocessedEntityRemap.end()
1505 && "Invalid index into preprocessed entity index remap");
1506
1507 return LocalID + I->second;
1508 }
1509
ComputeHash(internal_key_ref ikey)1510 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1511 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1512 }
1513
1514 HeaderFileInfoTrait::internal_key_type
GetInternalKey(const FileEntry * FE)1515 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1516 internal_key_type ikey = {FE->getSize(),
1517 M.HasTimestamps ? FE->getModificationTime() : 0,
1518 FE->getName(), /*Imported*/ false};
1519 return ikey;
1520 }
1521
EqualKey(internal_key_ref a,internal_key_ref b)1522 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1523 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1524 return false;
1525
1526 if (llvm::sys::path::is_absolute(a.Filename) &&
1527 strcmp(a.Filename, b.Filename) == 0)
1528 return true;
1529
1530 // Determine whether the actual files are equivalent.
1531 FileManager &FileMgr = Reader.getFileManager();
1532 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1533 if (!Key.Imported)
1534 return FileMgr.getFile(Key.Filename);
1535
1536 std::string Resolved = Key.Filename;
1537 Reader.ResolveImportedPath(M, Resolved);
1538 return FileMgr.getFile(Resolved);
1539 };
1540
1541 const FileEntry *FEA = GetFile(a);
1542 const FileEntry *FEB = GetFile(b);
1543 return FEA && FEA == FEB;
1544 }
1545
1546 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1547 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1548 using namespace llvm::support;
1549 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1550 unsigned DataLen = (unsigned) *d++;
1551 return std::make_pair(KeyLen, DataLen);
1552 }
1553
1554 HeaderFileInfoTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1555 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1556 using namespace llvm::support;
1557 internal_key_type ikey;
1558 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1559 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1560 ikey.Filename = (const char *)d;
1561 ikey.Imported = true;
1562 return ikey;
1563 }
1564
1565 HeaderFileInfoTrait::data_type
ReadData(internal_key_ref key,const unsigned char * d,unsigned DataLen)1566 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1567 unsigned DataLen) {
1568 const unsigned char *End = d + DataLen;
1569 using namespace llvm::support;
1570 HeaderFileInfo HFI;
1571 unsigned Flags = *d++;
1572 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1573 HFI.isImport |= (Flags >> 4) & 0x01;
1574 HFI.isPragmaOnce |= (Flags >> 3) & 0x01;
1575 HFI.DirInfo = (Flags >> 1) & 0x03;
1576 HFI.IndexHeaderMapHeader = Flags & 0x01;
1577 // FIXME: Find a better way to handle this. Maybe just store a
1578 // "has been included" flag?
1579 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1580 HFI.NumIncludes);
1581 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1582 M, endian::readNext<uint32_t, little, unaligned>(d));
1583 if (unsigned FrameworkOffset =
1584 endian::readNext<uint32_t, little, unaligned>(d)) {
1585 // The framework offset is 1 greater than the actual offset,
1586 // since 0 is used as an indicator for "no framework name".
1587 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1588 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1589 }
1590
1591 assert((End - d) % 4 == 0 &&
1592 "Wrong data length in HeaderFileInfo deserialization");
1593 while (d != End) {
1594 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1595 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1596 LocalSMID >>= 2;
1597
1598 // This header is part of a module. Associate it with the module to enable
1599 // implicit module import.
1600 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1601 Module *Mod = Reader.getSubmodule(GlobalSMID);
1602 FileManager &FileMgr = Reader.getFileManager();
1603 ModuleMap &ModMap =
1604 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1605
1606 std::string Filename = key.Filename;
1607 if (key.Imported)
1608 Reader.ResolveImportedPath(M, Filename);
1609 // FIXME: This is not always the right filename-as-written, but we're not
1610 // going to use this information to rebuild the module, so it doesn't make
1611 // a lot of difference.
1612 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
1613 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1614 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1615 }
1616
1617 // This HeaderFileInfo was externally loaded.
1618 HFI.External = true;
1619 HFI.IsValid = true;
1620 return HFI;
1621 }
1622
addPendingMacro(IdentifierInfo * II,ModuleFile * M,uint64_t MacroDirectivesOffset)1623 void ASTReader::addPendingMacro(IdentifierInfo *II,
1624 ModuleFile *M,
1625 uint64_t MacroDirectivesOffset) {
1626 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1627 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1628 }
1629
ReadDefinedMacros()1630 void ASTReader::ReadDefinedMacros() {
1631 // Note that we are loading defined macros.
1632 Deserializing Macros(this);
1633
1634 for (auto &I : llvm::reverse(ModuleMgr)) {
1635 BitstreamCursor &MacroCursor = I->MacroCursor;
1636
1637 // If there was no preprocessor block, skip this file.
1638 if (!MacroCursor.getBitStreamReader())
1639 continue;
1640
1641 BitstreamCursor Cursor = MacroCursor;
1642 Cursor.JumpToBit(I->MacroStartOffset);
1643
1644 RecordData Record;
1645 while (true) {
1646 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1647
1648 switch (E.Kind) {
1649 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1650 case llvm::BitstreamEntry::Error:
1651 Error("malformed block record in AST file");
1652 return;
1653 case llvm::BitstreamEntry::EndBlock:
1654 goto NextCursor;
1655
1656 case llvm::BitstreamEntry::Record:
1657 Record.clear();
1658 switch (Cursor.readRecord(E.ID, Record)) {
1659 default: // Default behavior: ignore.
1660 break;
1661
1662 case PP_MACRO_OBJECT_LIKE:
1663 case PP_MACRO_FUNCTION_LIKE:
1664 getLocalIdentifier(*I, Record[0]);
1665 break;
1666
1667 case PP_TOKEN:
1668 // Ignore tokens.
1669 break;
1670 }
1671 break;
1672 }
1673 }
1674 NextCursor: ;
1675 }
1676 }
1677
1678 namespace {
1679 /// \brief Visitor class used to look up identifirs in an AST file.
1680 class IdentifierLookupVisitor {
1681 StringRef Name;
1682 unsigned NameHash;
1683 unsigned PriorGeneration;
1684 unsigned &NumIdentifierLookups;
1685 unsigned &NumIdentifierLookupHits;
1686 IdentifierInfo *Found;
1687
1688 public:
IdentifierLookupVisitor(StringRef Name,unsigned PriorGeneration,unsigned & NumIdentifierLookups,unsigned & NumIdentifierLookupHits)1689 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1690 unsigned &NumIdentifierLookups,
1691 unsigned &NumIdentifierLookupHits)
1692 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
1693 PriorGeneration(PriorGeneration),
1694 NumIdentifierLookups(NumIdentifierLookups),
1695 NumIdentifierLookupHits(NumIdentifierLookupHits),
1696 Found()
1697 {
1698 }
1699
operator ()(ModuleFile & M)1700 bool operator()(ModuleFile &M) {
1701 // If we've already searched this module file, skip it now.
1702 if (M.Generation <= PriorGeneration)
1703 return true;
1704
1705 ASTIdentifierLookupTable *IdTable
1706 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1707 if (!IdTable)
1708 return false;
1709
1710 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
1711 Found);
1712 ++NumIdentifierLookups;
1713 ASTIdentifierLookupTable::iterator Pos =
1714 IdTable->find_hashed(Name, NameHash, &Trait);
1715 if (Pos == IdTable->end())
1716 return false;
1717
1718 // Dereferencing the iterator has the effect of building the
1719 // IdentifierInfo node and populating it with the various
1720 // declarations it needs.
1721 ++NumIdentifierLookupHits;
1722 Found = *Pos;
1723 return true;
1724 }
1725
1726 // \brief Retrieve the identifier info found within the module
1727 // files.
getIdentifierInfo() const1728 IdentifierInfo *getIdentifierInfo() const { return Found; }
1729 };
1730 }
1731
updateOutOfDateIdentifier(IdentifierInfo & II)1732 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1733 // Note that we are loading an identifier.
1734 Deserializing AnIdentifier(this);
1735
1736 unsigned PriorGeneration = 0;
1737 if (getContext().getLangOpts().Modules)
1738 PriorGeneration = IdentifierGeneration[&II];
1739
1740 // If there is a global index, look there first to determine which modules
1741 // provably do not have any results for this identifier.
1742 GlobalModuleIndex::HitSet Hits;
1743 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1744 if (!loadGlobalIndex()) {
1745 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1746 HitsPtr = &Hits;
1747 }
1748 }
1749
1750 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1751 NumIdentifierLookups,
1752 NumIdentifierLookupHits);
1753 ModuleMgr.visit(Visitor, HitsPtr);
1754 markIdentifierUpToDate(&II);
1755 }
1756
markIdentifierUpToDate(IdentifierInfo * II)1757 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1758 if (!II)
1759 return;
1760
1761 II->setOutOfDate(false);
1762
1763 // Update the generation for this identifier.
1764 if (getContext().getLangOpts().Modules)
1765 IdentifierGeneration[II] = getGeneration();
1766 }
1767
resolvePendingMacro(IdentifierInfo * II,const PendingMacroInfo & PMInfo)1768 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1769 const PendingMacroInfo &PMInfo) {
1770 ModuleFile &M = *PMInfo.M;
1771
1772 BitstreamCursor &Cursor = M.MacroCursor;
1773 SavedStreamPosition SavedPosition(Cursor);
1774 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
1775
1776 struct ModuleMacroRecord {
1777 SubmoduleID SubModID;
1778 MacroInfo *MI;
1779 SmallVector<SubmoduleID, 8> Overrides;
1780 };
1781 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
1782
1783 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1784 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1785 // macro histroy.
1786 RecordData Record;
1787 while (true) {
1788 llvm::BitstreamEntry Entry =
1789 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1790 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1791 Error("malformed block record in AST file");
1792 return;
1793 }
1794
1795 Record.clear();
1796 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
1797 case PP_MACRO_DIRECTIVE_HISTORY:
1798 break;
1799
1800 case PP_MODULE_MACRO: {
1801 ModuleMacros.push_back(ModuleMacroRecord());
1802 auto &Info = ModuleMacros.back();
1803 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1804 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
1805 for (int I = 2, N = Record.size(); I != N; ++I)
1806 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
1807 continue;
1808 }
1809
1810 default:
1811 Error("malformed block record in AST file");
1812 return;
1813 }
1814
1815 // We found the macro directive history; that's the last record
1816 // for this macro.
1817 break;
1818 }
1819
1820 // Module macros are listed in reverse dependency order.
1821 {
1822 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
1823 llvm::SmallVector<ModuleMacro*, 8> Overrides;
1824 for (auto &MMR : ModuleMacros) {
1825 Overrides.clear();
1826 for (unsigned ModID : MMR.Overrides) {
1827 Module *Mod = getSubmodule(ModID);
1828 auto *Macro = PP.getModuleMacro(Mod, II);
1829 assert(Macro && "missing definition for overridden macro");
1830 Overrides.push_back(Macro);
1831 }
1832
1833 bool Inserted = false;
1834 Module *Owner = getSubmodule(MMR.SubModID);
1835 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
1836 }
1837 }
1838
1839 // Don't read the directive history for a module; we don't have anywhere
1840 // to put it.
1841 if (M.Kind == MK_ImplicitModule || M.Kind == MK_ExplicitModule)
1842 return;
1843
1844 // Deserialize the macro directives history in reverse source-order.
1845 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1846 unsigned Idx = 0, N = Record.size();
1847 while (Idx < N) {
1848 MacroDirective *MD = nullptr;
1849 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1850 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1851 switch (K) {
1852 case MacroDirective::MD_Define: {
1853 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
1854 MD = PP.AllocateDefMacroDirective(MI, Loc);
1855 break;
1856 }
1857 case MacroDirective::MD_Undefine: {
1858 MD = PP.AllocateUndefMacroDirective(Loc);
1859 break;
1860 }
1861 case MacroDirective::MD_Visibility:
1862 bool isPublic = Record[Idx++];
1863 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1864 break;
1865 }
1866
1867 if (!Latest)
1868 Latest = MD;
1869 if (Earliest)
1870 Earliest->setPrevious(MD);
1871 Earliest = MD;
1872 }
1873
1874 if (Latest)
1875 PP.setLoadedMacroDirective(II, Latest);
1876 }
1877
1878 ASTReader::InputFileInfo
readInputFileInfo(ModuleFile & F,unsigned ID)1879 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
1880 // Go find this input file.
1881 BitstreamCursor &Cursor = F.InputFilesCursor;
1882 SavedStreamPosition SavedPosition(Cursor);
1883 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1884
1885 unsigned Code = Cursor.ReadCode();
1886 RecordData Record;
1887 StringRef Blob;
1888
1889 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
1890 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
1891 "invalid record type for input file");
1892 (void)Result;
1893
1894 assert(Record[0] == ID && "Bogus stored ID or offset");
1895 InputFileInfo R;
1896 R.StoredSize = static_cast<off_t>(Record[1]);
1897 R.StoredTime = static_cast<time_t>(Record[2]);
1898 R.Overridden = static_cast<bool>(Record[3]);
1899 R.Transient = static_cast<bool>(Record[4]);
1900 R.Filename = Blob;
1901 ResolveImportedPath(F, R.Filename);
1902 return R;
1903 }
1904
getInputFile(ModuleFile & F,unsigned ID,bool Complain)1905 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
1906 // If this ID is bogus, just return an empty input file.
1907 if (ID == 0 || ID > F.InputFilesLoaded.size())
1908 return InputFile();
1909
1910 // If we've already loaded this input file, return it.
1911 if (F.InputFilesLoaded[ID-1].getFile())
1912 return F.InputFilesLoaded[ID-1];
1913
1914 if (F.InputFilesLoaded[ID-1].isNotFound())
1915 return InputFile();
1916
1917 // Go find this input file.
1918 BitstreamCursor &Cursor = F.InputFilesCursor;
1919 SavedStreamPosition SavedPosition(Cursor);
1920 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1921
1922 InputFileInfo FI = readInputFileInfo(F, ID);
1923 off_t StoredSize = FI.StoredSize;
1924 time_t StoredTime = FI.StoredTime;
1925 bool Overridden = FI.Overridden;
1926 bool Transient = FI.Transient;
1927 StringRef Filename = FI.Filename;
1928
1929 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false);
1930
1931 // If we didn't find the file, resolve it relative to the
1932 // original directory from which this AST file was created.
1933 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
1934 F.OriginalDir != CurrentDir) {
1935 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
1936 F.OriginalDir,
1937 CurrentDir);
1938 if (!Resolved.empty())
1939 File = FileMgr.getFile(Resolved);
1940 }
1941
1942 // For an overridden file, create a virtual file with the stored
1943 // size/timestamp.
1944 if ((Overridden || Transient) && File == nullptr)
1945 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
1946
1947 if (File == nullptr) {
1948 if (Complain) {
1949 std::string ErrorStr = "could not find file '";
1950 ErrorStr += Filename;
1951 ErrorStr += "' referenced by AST file '";
1952 ErrorStr += F.FileName;
1953 ErrorStr += "'";
1954 Error(ErrorStr.c_str());
1955 }
1956 // Record that we didn't find the file.
1957 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
1958 return InputFile();
1959 }
1960
1961 // Check if there was a request to override the contents of the file
1962 // that was part of the precompiled header. Overridding such a file
1963 // can lead to problems when lexing using the source locations from the
1964 // PCH.
1965 SourceManager &SM = getSourceManager();
1966 // FIXME: Reject if the overrides are different.
1967 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
1968 if (Complain)
1969 Error(diag::err_fe_pch_file_overridden, Filename);
1970 // After emitting the diagnostic, recover by disabling the override so
1971 // that the original file will be used.
1972 //
1973 // FIXME: This recovery is just as broken as the original state; there may
1974 // be another precompiled module that's using the overridden contents, or
1975 // we might be half way through parsing it. Instead, we should treat the
1976 // overridden contents as belonging to a separate FileEntry.
1977 SM.disableFileContentsOverride(File);
1978 // The FileEntry is a virtual file entry with the size of the contents
1979 // that would override the original contents. Set it to the original's
1980 // size/time.
1981 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
1982 StoredSize, StoredTime);
1983 }
1984
1985 bool IsOutOfDate = false;
1986
1987 // For an overridden file, there is nothing to validate.
1988 if (!Overridden && //
1989 (StoredSize != File->getSize() ||
1990 #if defined(LLVM_ON_WIN32)
1991 false
1992 #else
1993 // In our regression testing, the Windows file system seems to
1994 // have inconsistent modification times that sometimes
1995 // erroneously trigger this error-handling path.
1996 //
1997 // FIXME: This probably also breaks HeaderFileInfo lookups on Windows.
1998 (StoredTime && StoredTime != File->getModificationTime() &&
1999 !DisableValidation)
2000 #endif
2001 )) {
2002 if (Complain) {
2003 // Build a list of the PCH imports that got us here (in reverse).
2004 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2005 while (ImportStack.back()->ImportedBy.size() > 0)
2006 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2007
2008 // The top-level PCH is stale.
2009 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2010 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2011
2012 // Print the import stack.
2013 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2014 Diag(diag::note_pch_required_by)
2015 << Filename << ImportStack[0]->FileName;
2016 for (unsigned I = 1; I < ImportStack.size(); ++I)
2017 Diag(diag::note_pch_required_by)
2018 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2019 }
2020
2021 if (!Diags.isDiagnosticInFlight())
2022 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2023 }
2024
2025 IsOutOfDate = true;
2026 }
2027 // FIXME: If the file is overridden and we've already opened it,
2028 // issue an error (or split it into a separate FileEntry).
2029
2030 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
2031
2032 // Note that we've loaded this input file.
2033 F.InputFilesLoaded[ID-1] = IF;
2034 return IF;
2035 }
2036
2037 /// \brief If we are loading a relocatable PCH or module file, and the filename
2038 /// is not an absolute path, add the system or module root to the beginning of
2039 /// the file name.
ResolveImportedPath(ModuleFile & M,std::string & Filename)2040 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2041 // Resolve relative to the base directory, if we have one.
2042 if (!M.BaseDirectory.empty())
2043 return ResolveImportedPath(Filename, M.BaseDirectory);
2044 }
2045
ResolveImportedPath(std::string & Filename,StringRef Prefix)2046 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2047 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2048 return;
2049
2050 SmallString<128> Buffer;
2051 llvm::sys::path::append(Buffer, Prefix, Filename);
2052 Filename.assign(Buffer.begin(), Buffer.end());
2053 }
2054
isDiagnosedResult(ASTReader::ASTReadResult ARR,unsigned Caps)2055 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2056 switch (ARR) {
2057 case ASTReader::Failure: return true;
2058 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2059 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2060 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2061 case ASTReader::ConfigurationMismatch:
2062 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2063 case ASTReader::HadErrors: return true;
2064 case ASTReader::Success: return false;
2065 }
2066
2067 llvm_unreachable("unknown ASTReadResult");
2068 }
2069
ReadOptionsBlock(BitstreamCursor & Stream,unsigned ClientLoadCapabilities,bool AllowCompatibleConfigurationMismatch,ASTReaderListener & Listener,std::string & SuggestedPredefines)2070 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2071 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2072 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2073 std::string &SuggestedPredefines) {
2074 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID))
2075 return Failure;
2076
2077 // Read all of the records in the options block.
2078 RecordData Record;
2079 ASTReadResult Result = Success;
2080 while (1) {
2081 llvm::BitstreamEntry Entry = Stream.advance();
2082
2083 switch (Entry.Kind) {
2084 case llvm::BitstreamEntry::Error:
2085 case llvm::BitstreamEntry::SubBlock:
2086 return Failure;
2087
2088 case llvm::BitstreamEntry::EndBlock:
2089 return Result;
2090
2091 case llvm::BitstreamEntry::Record:
2092 // The interesting case.
2093 break;
2094 }
2095
2096 // Read and process a record.
2097 Record.clear();
2098 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) {
2099 case LANGUAGE_OPTIONS: {
2100 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2101 if (ParseLanguageOptions(Record, Complain, Listener,
2102 AllowCompatibleConfigurationMismatch))
2103 Result = ConfigurationMismatch;
2104 break;
2105 }
2106
2107 case TARGET_OPTIONS: {
2108 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2109 if (ParseTargetOptions(Record, Complain, Listener,
2110 AllowCompatibleConfigurationMismatch))
2111 Result = ConfigurationMismatch;
2112 break;
2113 }
2114
2115 case DIAGNOSTIC_OPTIONS: {
2116 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2117 if (!AllowCompatibleConfigurationMismatch &&
2118 ParseDiagnosticOptions(Record, Complain, Listener))
2119 return OutOfDate;
2120 break;
2121 }
2122
2123 case FILE_SYSTEM_OPTIONS: {
2124 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2125 if (!AllowCompatibleConfigurationMismatch &&
2126 ParseFileSystemOptions(Record, Complain, Listener))
2127 Result = ConfigurationMismatch;
2128 break;
2129 }
2130
2131 case HEADER_SEARCH_OPTIONS: {
2132 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2133 if (!AllowCompatibleConfigurationMismatch &&
2134 ParseHeaderSearchOptions(Record, Complain, Listener))
2135 Result = ConfigurationMismatch;
2136 break;
2137 }
2138
2139 case PREPROCESSOR_OPTIONS:
2140 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2141 if (!AllowCompatibleConfigurationMismatch &&
2142 ParsePreprocessorOptions(Record, Complain, Listener,
2143 SuggestedPredefines))
2144 Result = ConfigurationMismatch;
2145 break;
2146 }
2147 }
2148 }
2149
2150 ASTReader::ASTReadResult
ReadControlBlock(ModuleFile & F,SmallVectorImpl<ImportedModule> & Loaded,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)2151 ASTReader::ReadControlBlock(ModuleFile &F,
2152 SmallVectorImpl<ImportedModule> &Loaded,
2153 const ModuleFile *ImportedBy,
2154 unsigned ClientLoadCapabilities) {
2155 BitstreamCursor &Stream = F.Stream;
2156 ASTReadResult Result = Success;
2157
2158 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2159 Error("malformed block record in AST file");
2160 return Failure;
2161 }
2162
2163 // Read all of the records and blocks in the control block.
2164 RecordData Record;
2165 unsigned NumInputs = 0;
2166 unsigned NumUserInputs = 0;
2167 while (1) {
2168 llvm::BitstreamEntry Entry = Stream.advance();
2169
2170 switch (Entry.Kind) {
2171 case llvm::BitstreamEntry::Error:
2172 Error("malformed block record in AST file");
2173 return Failure;
2174 case llvm::BitstreamEntry::EndBlock: {
2175 // Validate input files.
2176 const HeaderSearchOptions &HSOpts =
2177 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2178
2179 // All user input files reside at the index range [0, NumUserInputs), and
2180 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2181 // loaded module files, ignore missing inputs.
2182 if (!DisableValidation && F.Kind != MK_ExplicitModule) {
2183 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2184
2185 // If we are reading a module, we will create a verification timestamp,
2186 // so we verify all input files. Otherwise, verify only user input
2187 // files.
2188
2189 unsigned N = NumUserInputs;
2190 if (ValidateSystemInputs ||
2191 (HSOpts.ModulesValidateOncePerBuildSession &&
2192 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2193 F.Kind == MK_ImplicitModule))
2194 N = NumInputs;
2195
2196 for (unsigned I = 0; I < N; ++I) {
2197 InputFile IF = getInputFile(F, I+1, Complain);
2198 if (!IF.getFile() || IF.isOutOfDate())
2199 return OutOfDate;
2200 }
2201 }
2202
2203 if (Listener)
2204 Listener->visitModuleFile(F.FileName, F.Kind);
2205
2206 if (Listener && Listener->needsInputFileVisitation()) {
2207 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2208 : NumUserInputs;
2209 for (unsigned I = 0; I < N; ++I) {
2210 bool IsSystem = I >= NumUserInputs;
2211 InputFileInfo FI = readInputFileInfo(F, I+1);
2212 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2213 F.Kind == MK_ExplicitModule);
2214 }
2215 }
2216
2217 return Result;
2218 }
2219
2220 case llvm::BitstreamEntry::SubBlock:
2221 switch (Entry.ID) {
2222 case INPUT_FILES_BLOCK_ID:
2223 F.InputFilesCursor = Stream;
2224 if (Stream.SkipBlock() || // Skip with the main cursor
2225 // Read the abbreviations
2226 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2227 Error("malformed block record in AST file");
2228 return Failure;
2229 }
2230 continue;
2231
2232 case OPTIONS_BLOCK_ID:
2233 // If we're reading the first module for this group, check its options
2234 // are compatible with ours. For modules it imports, no further checking
2235 // is required, because we checked them when we built it.
2236 if (Listener && !ImportedBy) {
2237 // Should we allow the configuration of the module file to differ from
2238 // the configuration of the current translation unit in a compatible
2239 // way?
2240 //
2241 // FIXME: Allow this for files explicitly specified with -include-pch.
2242 bool AllowCompatibleConfigurationMismatch =
2243 F.Kind == MK_ExplicitModule;
2244
2245 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2246 AllowCompatibleConfigurationMismatch,
2247 *Listener, SuggestedPredefines);
2248 if (Result == Failure) {
2249 Error("malformed block record in AST file");
2250 return Result;
2251 }
2252
2253 if (DisableValidation ||
2254 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2255 Result = Success;
2256
2257 // If we've diagnosed a problem, we're done.
2258 if (Result != Success &&
2259 isDiagnosedResult(Result, ClientLoadCapabilities))
2260 return Result;
2261 } else if (Stream.SkipBlock()) {
2262 Error("malformed block record in AST file");
2263 return Failure;
2264 }
2265 continue;
2266
2267 default:
2268 if (Stream.SkipBlock()) {
2269 Error("malformed block record in AST file");
2270 return Failure;
2271 }
2272 continue;
2273 }
2274
2275 case llvm::BitstreamEntry::Record:
2276 // The interesting case.
2277 break;
2278 }
2279
2280 // Read and process a record.
2281 Record.clear();
2282 StringRef Blob;
2283 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2284 case METADATA: {
2285 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2286 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2287 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2288 : diag::err_pch_version_too_new);
2289 return VersionMismatch;
2290 }
2291
2292 bool hasErrors = Record[6];
2293 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2294 Diag(diag::err_pch_with_compiler_errors);
2295 return HadErrors;
2296 }
2297
2298 F.RelocatablePCH = Record[4];
2299 // Relative paths in a relocatable PCH are relative to our sysroot.
2300 if (F.RelocatablePCH)
2301 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2302
2303 F.HasTimestamps = Record[5];
2304
2305 const std::string &CurBranch = getClangFullRepositoryVersion();
2306 StringRef ASTBranch = Blob;
2307 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2308 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2309 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2310 return VersionMismatch;
2311 }
2312 break;
2313 }
2314
2315 case SIGNATURE:
2316 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2317 F.Signature = Record[0];
2318 break;
2319
2320 case IMPORTS: {
2321 // Load each of the imported PCH files.
2322 unsigned Idx = 0, N = Record.size();
2323 while (Idx < N) {
2324 // Read information about the AST file.
2325 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2326 // The import location will be the local one for now; we will adjust
2327 // all import locations of module imports after the global source
2328 // location info are setup.
2329 SourceLocation ImportLoc =
2330 SourceLocation::getFromRawEncoding(Record[Idx++]);
2331 off_t StoredSize = (off_t)Record[Idx++];
2332 time_t StoredModTime = (time_t)Record[Idx++];
2333 ASTFileSignature StoredSignature = Record[Idx++];
2334 auto ImportedFile = ReadPath(F, Record, Idx);
2335
2336 // If our client can't cope with us being out of date, we can't cope with
2337 // our dependency being missing.
2338 unsigned Capabilities = ClientLoadCapabilities;
2339 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2340 Capabilities &= ~ARR_Missing;
2341
2342 // Load the AST file.
2343 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2344 Loaded, StoredSize, StoredModTime,
2345 StoredSignature, Capabilities);
2346
2347 // If we diagnosed a problem, produce a backtrace.
2348 if (isDiagnosedResult(Result, Capabilities))
2349 Diag(diag::note_module_file_imported_by)
2350 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2351
2352 switch (Result) {
2353 case Failure: return Failure;
2354 // If we have to ignore the dependency, we'll have to ignore this too.
2355 case Missing:
2356 case OutOfDate: return OutOfDate;
2357 case VersionMismatch: return VersionMismatch;
2358 case ConfigurationMismatch: return ConfigurationMismatch;
2359 case HadErrors: return HadErrors;
2360 case Success: break;
2361 }
2362 }
2363 break;
2364 }
2365
2366 case ORIGINAL_FILE:
2367 F.OriginalSourceFileID = FileID::get(Record[0]);
2368 F.ActualOriginalSourceFileName = Blob;
2369 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2370 ResolveImportedPath(F, F.OriginalSourceFileName);
2371 break;
2372
2373 case ORIGINAL_FILE_ID:
2374 F.OriginalSourceFileID = FileID::get(Record[0]);
2375 break;
2376
2377 case ORIGINAL_PCH_DIR:
2378 F.OriginalDir = Blob;
2379 break;
2380
2381 case MODULE_NAME:
2382 F.ModuleName = Blob;
2383 if (Listener)
2384 Listener->ReadModuleName(F.ModuleName);
2385 break;
2386
2387 case MODULE_DIRECTORY: {
2388 assert(!F.ModuleName.empty() &&
2389 "MODULE_DIRECTORY found before MODULE_NAME");
2390 // If we've already loaded a module map file covering this module, we may
2391 // have a better path for it (relative to the current build).
2392 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2393 if (M && M->Directory) {
2394 // If we're implicitly loading a module, the base directory can't
2395 // change between the build and use.
2396 if (F.Kind != MK_ExplicitModule) {
2397 const DirectoryEntry *BuildDir =
2398 PP.getFileManager().getDirectory(Blob);
2399 if (!BuildDir || BuildDir != M->Directory) {
2400 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2401 Diag(diag::err_imported_module_relocated)
2402 << F.ModuleName << Blob << M->Directory->getName();
2403 return OutOfDate;
2404 }
2405 }
2406 F.BaseDirectory = M->Directory->getName();
2407 } else {
2408 F.BaseDirectory = Blob;
2409 }
2410 break;
2411 }
2412
2413 case MODULE_MAP_FILE:
2414 if (ASTReadResult Result =
2415 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2416 return Result;
2417 break;
2418
2419 case INPUT_FILE_OFFSETS:
2420 NumInputs = Record[0];
2421 NumUserInputs = Record[1];
2422 F.InputFileOffsets =
2423 (const llvm::support::unaligned_uint64_t *)Blob.data();
2424 F.InputFilesLoaded.resize(NumInputs);
2425 break;
2426 }
2427 }
2428 }
2429
2430 ASTReader::ASTReadResult
ReadASTBlock(ModuleFile & F,unsigned ClientLoadCapabilities)2431 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2432 BitstreamCursor &Stream = F.Stream;
2433
2434 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2435 Error("malformed block record in AST file");
2436 return Failure;
2437 }
2438
2439 // Read all of the records and blocks for the AST file.
2440 RecordData Record;
2441 while (1) {
2442 llvm::BitstreamEntry Entry = Stream.advance();
2443
2444 switch (Entry.Kind) {
2445 case llvm::BitstreamEntry::Error:
2446 Error("error at end of module block in AST file");
2447 return Failure;
2448 case llvm::BitstreamEntry::EndBlock: {
2449 // Outside of C++, we do not store a lookup map for the translation unit.
2450 // Instead, mark it as needing a lookup map to be built if this module
2451 // contains any declarations lexically within it (which it always does!).
2452 // This usually has no cost, since we very rarely need the lookup map for
2453 // the translation unit outside C++.
2454 DeclContext *DC = Context.getTranslationUnitDecl();
2455 if (DC->hasExternalLexicalStorage() &&
2456 !getContext().getLangOpts().CPlusPlus)
2457 DC->setMustBuildLookupTable();
2458
2459 return Success;
2460 }
2461 case llvm::BitstreamEntry::SubBlock:
2462 switch (Entry.ID) {
2463 case DECLTYPES_BLOCK_ID:
2464 // We lazily load the decls block, but we want to set up the
2465 // DeclsCursor cursor to point into it. Clone our current bitcode
2466 // cursor to it, enter the block and read the abbrevs in that block.
2467 // With the main cursor, we just skip over it.
2468 F.DeclsCursor = Stream;
2469 if (Stream.SkipBlock() || // Skip with the main cursor.
2470 // Read the abbrevs.
2471 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2472 Error("malformed block record in AST file");
2473 return Failure;
2474 }
2475 break;
2476
2477 case PREPROCESSOR_BLOCK_ID:
2478 F.MacroCursor = Stream;
2479 if (!PP.getExternalSource())
2480 PP.setExternalSource(this);
2481
2482 if (Stream.SkipBlock() ||
2483 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2484 Error("malformed block record in AST file");
2485 return Failure;
2486 }
2487 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2488 break;
2489
2490 case PREPROCESSOR_DETAIL_BLOCK_ID:
2491 F.PreprocessorDetailCursor = Stream;
2492 if (Stream.SkipBlock() ||
2493 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2494 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2495 Error("malformed preprocessor detail record in AST file");
2496 return Failure;
2497 }
2498 F.PreprocessorDetailStartOffset
2499 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2500
2501 if (!PP.getPreprocessingRecord())
2502 PP.createPreprocessingRecord();
2503 if (!PP.getPreprocessingRecord()->getExternalSource())
2504 PP.getPreprocessingRecord()->SetExternalSource(*this);
2505 break;
2506
2507 case SOURCE_MANAGER_BLOCK_ID:
2508 if (ReadSourceManagerBlock(F))
2509 return Failure;
2510 break;
2511
2512 case SUBMODULE_BLOCK_ID:
2513 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2514 return Result;
2515 break;
2516
2517 case COMMENTS_BLOCK_ID: {
2518 BitstreamCursor C = Stream;
2519 if (Stream.SkipBlock() ||
2520 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2521 Error("malformed comments block in AST file");
2522 return Failure;
2523 }
2524 CommentsCursors.push_back(std::make_pair(C, &F));
2525 break;
2526 }
2527
2528 default:
2529 if (Stream.SkipBlock()) {
2530 Error("malformed block record in AST file");
2531 return Failure;
2532 }
2533 break;
2534 }
2535 continue;
2536
2537 case llvm::BitstreamEntry::Record:
2538 // The interesting case.
2539 break;
2540 }
2541
2542 // Read and process a record.
2543 Record.clear();
2544 StringRef Blob;
2545 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2546 default: // Default behavior: ignore.
2547 break;
2548
2549 case TYPE_OFFSET: {
2550 if (F.LocalNumTypes != 0) {
2551 Error("duplicate TYPE_OFFSET record in AST file");
2552 return Failure;
2553 }
2554 F.TypeOffsets = (const uint32_t *)Blob.data();
2555 F.LocalNumTypes = Record[0];
2556 unsigned LocalBaseTypeIndex = Record[1];
2557 F.BaseTypeIndex = getTotalNumTypes();
2558
2559 if (F.LocalNumTypes > 0) {
2560 // Introduce the global -> local mapping for types within this module.
2561 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2562
2563 // Introduce the local -> global mapping for types within this module.
2564 F.TypeRemap.insertOrReplace(
2565 std::make_pair(LocalBaseTypeIndex,
2566 F.BaseTypeIndex - LocalBaseTypeIndex));
2567
2568 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2569 }
2570 break;
2571 }
2572
2573 case DECL_OFFSET: {
2574 if (F.LocalNumDecls != 0) {
2575 Error("duplicate DECL_OFFSET record in AST file");
2576 return Failure;
2577 }
2578 F.DeclOffsets = (const DeclOffset *)Blob.data();
2579 F.LocalNumDecls = Record[0];
2580 unsigned LocalBaseDeclID = Record[1];
2581 F.BaseDeclID = getTotalNumDecls();
2582
2583 if (F.LocalNumDecls > 0) {
2584 // Introduce the global -> local mapping for declarations within this
2585 // module.
2586 GlobalDeclMap.insert(
2587 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2588
2589 // Introduce the local -> global mapping for declarations within this
2590 // module.
2591 F.DeclRemap.insertOrReplace(
2592 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2593
2594 // Introduce the global -> local mapping for declarations within this
2595 // module.
2596 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2597
2598 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2599 }
2600 break;
2601 }
2602
2603 case TU_UPDATE_LEXICAL: {
2604 DeclContext *TU = Context.getTranslationUnitDecl();
2605 LexicalContents Contents(
2606 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2607 Blob.data()),
2608 static_cast<unsigned int>(Blob.size() / 4));
2609 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2610 TU->setHasExternalLexicalStorage(true);
2611 break;
2612 }
2613
2614 case UPDATE_VISIBLE: {
2615 unsigned Idx = 0;
2616 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2617 auto *Data = (const unsigned char*)Blob.data();
2618 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2619 // If we've already loaded the decl, perform the updates when we finish
2620 // loading this block.
2621 if (Decl *D = GetExistingDecl(ID))
2622 PendingUpdateRecords.push_back(std::make_pair(ID, D));
2623 break;
2624 }
2625
2626 case IDENTIFIER_TABLE:
2627 F.IdentifierTableData = Blob.data();
2628 if (Record[0]) {
2629 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2630 (const unsigned char *)F.IdentifierTableData + Record[0],
2631 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2632 (const unsigned char *)F.IdentifierTableData,
2633 ASTIdentifierLookupTrait(*this, F));
2634
2635 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2636 }
2637 break;
2638
2639 case IDENTIFIER_OFFSET: {
2640 if (F.LocalNumIdentifiers != 0) {
2641 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2642 return Failure;
2643 }
2644 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2645 F.LocalNumIdentifiers = Record[0];
2646 unsigned LocalBaseIdentifierID = Record[1];
2647 F.BaseIdentifierID = getTotalNumIdentifiers();
2648
2649 if (F.LocalNumIdentifiers > 0) {
2650 // Introduce the global -> local mapping for identifiers within this
2651 // module.
2652 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2653 &F));
2654
2655 // Introduce the local -> global mapping for identifiers within this
2656 // module.
2657 F.IdentifierRemap.insertOrReplace(
2658 std::make_pair(LocalBaseIdentifierID,
2659 F.BaseIdentifierID - LocalBaseIdentifierID));
2660
2661 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2662 + F.LocalNumIdentifiers);
2663 }
2664 break;
2665 }
2666
2667 case INTERESTING_IDENTIFIERS:
2668 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2669 break;
2670
2671 case EAGERLY_DESERIALIZED_DECLS:
2672 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2673 // about "interesting" decls (for instance, if we're building a module).
2674 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2675 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2676 break;
2677
2678 case SPECIAL_TYPES:
2679 if (SpecialTypes.empty()) {
2680 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2681 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2682 break;
2683 }
2684
2685 if (SpecialTypes.size() != Record.size()) {
2686 Error("invalid special-types record");
2687 return Failure;
2688 }
2689
2690 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2691 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2692 if (!SpecialTypes[I])
2693 SpecialTypes[I] = ID;
2694 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2695 // merge step?
2696 }
2697 break;
2698
2699 case STATISTICS:
2700 TotalNumStatements += Record[0];
2701 TotalNumMacros += Record[1];
2702 TotalLexicalDeclContexts += Record[2];
2703 TotalVisibleDeclContexts += Record[3];
2704 break;
2705
2706 case UNUSED_FILESCOPED_DECLS:
2707 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2708 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2709 break;
2710
2711 case DELEGATING_CTORS:
2712 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2713 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2714 break;
2715
2716 case WEAK_UNDECLARED_IDENTIFIERS:
2717 if (Record.size() % 4 != 0) {
2718 Error("invalid weak identifiers record");
2719 return Failure;
2720 }
2721
2722 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2723 // files. This isn't the way to do it :)
2724 WeakUndeclaredIdentifiers.clear();
2725
2726 // Translate the weak, undeclared identifiers into global IDs.
2727 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2728 WeakUndeclaredIdentifiers.push_back(
2729 getGlobalIdentifierID(F, Record[I++]));
2730 WeakUndeclaredIdentifiers.push_back(
2731 getGlobalIdentifierID(F, Record[I++]));
2732 WeakUndeclaredIdentifiers.push_back(
2733 ReadSourceLocation(F, Record, I).getRawEncoding());
2734 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2735 }
2736 break;
2737
2738 case SELECTOR_OFFSETS: {
2739 F.SelectorOffsets = (const uint32_t *)Blob.data();
2740 F.LocalNumSelectors = Record[0];
2741 unsigned LocalBaseSelectorID = Record[1];
2742 F.BaseSelectorID = getTotalNumSelectors();
2743
2744 if (F.LocalNumSelectors > 0) {
2745 // Introduce the global -> local mapping for selectors within this
2746 // module.
2747 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2748
2749 // Introduce the local -> global mapping for selectors within this
2750 // module.
2751 F.SelectorRemap.insertOrReplace(
2752 std::make_pair(LocalBaseSelectorID,
2753 F.BaseSelectorID - LocalBaseSelectorID));
2754
2755 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2756 }
2757 break;
2758 }
2759
2760 case METHOD_POOL:
2761 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2762 if (Record[0])
2763 F.SelectorLookupTable
2764 = ASTSelectorLookupTable::Create(
2765 F.SelectorLookupTableData + Record[0],
2766 F.SelectorLookupTableData,
2767 ASTSelectorLookupTrait(*this, F));
2768 TotalNumMethodPoolEntries += Record[1];
2769 break;
2770
2771 case REFERENCED_SELECTOR_POOL:
2772 if (!Record.empty()) {
2773 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2774 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2775 Record[Idx++]));
2776 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2777 getRawEncoding());
2778 }
2779 }
2780 break;
2781
2782 case PP_COUNTER_VALUE:
2783 if (!Record.empty() && Listener)
2784 Listener->ReadCounter(F, Record[0]);
2785 break;
2786
2787 case FILE_SORTED_DECLS:
2788 F.FileSortedDecls = (const DeclID *)Blob.data();
2789 F.NumFileSortedDecls = Record[0];
2790 break;
2791
2792 case SOURCE_LOCATION_OFFSETS: {
2793 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2794 F.LocalNumSLocEntries = Record[0];
2795 unsigned SLocSpaceSize = Record[1];
2796 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2797 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2798 SLocSpaceSize);
2799 if (!F.SLocEntryBaseID) {
2800 Error("ran out of source locations");
2801 break;
2802 }
2803 // Make our entry in the range map. BaseID is negative and growing, so
2804 // we invert it. Because we invert it, though, we need the other end of
2805 // the range.
2806 unsigned RangeStart =
2807 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2808 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2809 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2810
2811 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2812 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2813 GlobalSLocOffsetMap.insert(
2814 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2815 - SLocSpaceSize,&F));
2816
2817 // Initialize the remapping table.
2818 // Invalid stays invalid.
2819 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2820 // This module. Base was 2 when being compiled.
2821 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2822 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2823
2824 TotalNumSLocEntries += F.LocalNumSLocEntries;
2825 break;
2826 }
2827
2828 case MODULE_OFFSET_MAP: {
2829 // Additional remapping information.
2830 const unsigned char *Data = (const unsigned char*)Blob.data();
2831 const unsigned char *DataEnd = Data + Blob.size();
2832
2833 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2834 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2835 F.SLocRemap.insert(std::make_pair(0U, 0));
2836 F.SLocRemap.insert(std::make_pair(2U, 1));
2837 }
2838
2839 // Continuous range maps we may be updating in our module.
2840 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2841 RemapBuilder;
2842 RemapBuilder SLocRemap(F.SLocRemap);
2843 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2844 RemapBuilder MacroRemap(F.MacroRemap);
2845 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2846 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2847 RemapBuilder SelectorRemap(F.SelectorRemap);
2848 RemapBuilder DeclRemap(F.DeclRemap);
2849 RemapBuilder TypeRemap(F.TypeRemap);
2850
2851 while (Data < DataEnd) {
2852 using namespace llvm::support;
2853 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2854 StringRef Name = StringRef((const char*)Data, Len);
2855 Data += Len;
2856 ModuleFile *OM = ModuleMgr.lookup(Name);
2857 if (!OM) {
2858 Error("SourceLocation remap refers to unknown module");
2859 return Failure;
2860 }
2861
2862 uint32_t SLocOffset =
2863 endian::readNext<uint32_t, little, unaligned>(Data);
2864 uint32_t IdentifierIDOffset =
2865 endian::readNext<uint32_t, little, unaligned>(Data);
2866 uint32_t MacroIDOffset =
2867 endian::readNext<uint32_t, little, unaligned>(Data);
2868 uint32_t PreprocessedEntityIDOffset =
2869 endian::readNext<uint32_t, little, unaligned>(Data);
2870 uint32_t SubmoduleIDOffset =
2871 endian::readNext<uint32_t, little, unaligned>(Data);
2872 uint32_t SelectorIDOffset =
2873 endian::readNext<uint32_t, little, unaligned>(Data);
2874 uint32_t DeclIDOffset =
2875 endian::readNext<uint32_t, little, unaligned>(Data);
2876 uint32_t TypeIndexOffset =
2877 endian::readNext<uint32_t, little, unaligned>(Data);
2878
2879 uint32_t None = std::numeric_limits<uint32_t>::max();
2880
2881 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2882 RemapBuilder &Remap) {
2883 if (Offset != None)
2884 Remap.insert(std::make_pair(Offset,
2885 static_cast<int>(BaseOffset - Offset)));
2886 };
2887 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2888 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2889 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2890 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2891 PreprocessedEntityRemap);
2892 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2893 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2894 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2895 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
2896
2897 // Global -> local mappings.
2898 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2899 }
2900 break;
2901 }
2902
2903 case SOURCE_MANAGER_LINE_TABLE:
2904 if (ParseLineTable(F, Record))
2905 return Failure;
2906 break;
2907
2908 case SOURCE_LOCATION_PRELOADS: {
2909 // Need to transform from the local view (1-based IDs) to the global view,
2910 // which is based off F.SLocEntryBaseID.
2911 if (!F.PreloadSLocEntries.empty()) {
2912 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2913 return Failure;
2914 }
2915
2916 F.PreloadSLocEntries.swap(Record);
2917 break;
2918 }
2919
2920 case EXT_VECTOR_DECLS:
2921 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2922 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2923 break;
2924
2925 case VTABLE_USES:
2926 if (Record.size() % 3 != 0) {
2927 Error("Invalid VTABLE_USES record");
2928 return Failure;
2929 }
2930
2931 // Later tables overwrite earlier ones.
2932 // FIXME: Modules will have some trouble with this. This is clearly not
2933 // the right way to do this.
2934 VTableUses.clear();
2935
2936 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2937 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2938 VTableUses.push_back(
2939 ReadSourceLocation(F, Record, Idx).getRawEncoding());
2940 VTableUses.push_back(Record[Idx++]);
2941 }
2942 break;
2943
2944 case PENDING_IMPLICIT_INSTANTIATIONS:
2945 if (PendingInstantiations.size() % 2 != 0) {
2946 Error("Invalid existing PendingInstantiations");
2947 return Failure;
2948 }
2949
2950 if (Record.size() % 2 != 0) {
2951 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
2952 return Failure;
2953 }
2954
2955 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2956 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2957 PendingInstantiations.push_back(
2958 ReadSourceLocation(F, Record, I).getRawEncoding());
2959 }
2960 break;
2961
2962 case SEMA_DECL_REFS:
2963 if (Record.size() != 2) {
2964 Error("Invalid SEMA_DECL_REFS block");
2965 return Failure;
2966 }
2967 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2968 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2969 break;
2970
2971 case PPD_ENTITIES_OFFSETS: {
2972 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
2973 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
2974 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
2975
2976 unsigned LocalBasePreprocessedEntityID = Record[0];
2977
2978 unsigned StartingID;
2979 if (!PP.getPreprocessingRecord())
2980 PP.createPreprocessingRecord();
2981 if (!PP.getPreprocessingRecord()->getExternalSource())
2982 PP.getPreprocessingRecord()->SetExternalSource(*this);
2983 StartingID
2984 = PP.getPreprocessingRecord()
2985 ->allocateLoadedEntities(F.NumPreprocessedEntities);
2986 F.BasePreprocessedEntityID = StartingID;
2987
2988 if (F.NumPreprocessedEntities > 0) {
2989 // Introduce the global -> local mapping for preprocessed entities in
2990 // this module.
2991 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
2992
2993 // Introduce the local -> global mapping for preprocessed entities in
2994 // this module.
2995 F.PreprocessedEntityRemap.insertOrReplace(
2996 std::make_pair(LocalBasePreprocessedEntityID,
2997 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
2998 }
2999
3000 break;
3001 }
3002
3003 case DECL_UPDATE_OFFSETS: {
3004 if (Record.size() % 2 != 0) {
3005 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3006 return Failure;
3007 }
3008 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3009 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3010 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3011
3012 // If we've already loaded the decl, perform the updates when we finish
3013 // loading this block.
3014 if (Decl *D = GetExistingDecl(ID))
3015 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3016 }
3017 break;
3018 }
3019
3020 case DECL_REPLACEMENTS: {
3021 if (Record.size() % 3 != 0) {
3022 Error("invalid DECL_REPLACEMENTS block in AST file");
3023 return Failure;
3024 }
3025 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3026 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3027 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3028 break;
3029 }
3030
3031 case OBJC_CATEGORIES_MAP: {
3032 if (F.LocalNumObjCCategoriesInMap != 0) {
3033 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3034 return Failure;
3035 }
3036
3037 F.LocalNumObjCCategoriesInMap = Record[0];
3038 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3039 break;
3040 }
3041
3042 case OBJC_CATEGORIES:
3043 F.ObjCCategories.swap(Record);
3044 break;
3045
3046 case CXX_BASE_SPECIFIER_OFFSETS: {
3047 if (F.LocalNumCXXBaseSpecifiers != 0) {
3048 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
3049 return Failure;
3050 }
3051
3052 F.LocalNumCXXBaseSpecifiers = Record[0];
3053 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
3054 break;
3055 }
3056
3057 case CXX_CTOR_INITIALIZERS_OFFSETS: {
3058 if (F.LocalNumCXXCtorInitializers != 0) {
3059 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file");
3060 return Failure;
3061 }
3062
3063 F.LocalNumCXXCtorInitializers = Record[0];
3064 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data();
3065 break;
3066 }
3067
3068 case DIAG_PRAGMA_MAPPINGS:
3069 if (F.PragmaDiagMappings.empty())
3070 F.PragmaDiagMappings.swap(Record);
3071 else
3072 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3073 Record.begin(), Record.end());
3074 break;
3075
3076 case CUDA_SPECIAL_DECL_REFS:
3077 // Later tables overwrite earlier ones.
3078 // FIXME: Modules will have trouble with this.
3079 CUDASpecialDeclRefs.clear();
3080 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3081 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3082 break;
3083
3084 case HEADER_SEARCH_TABLE: {
3085 F.HeaderFileInfoTableData = Blob.data();
3086 F.LocalNumHeaderFileInfos = Record[1];
3087 if (Record[0]) {
3088 F.HeaderFileInfoTable
3089 = HeaderFileInfoLookupTable::Create(
3090 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3091 (const unsigned char *)F.HeaderFileInfoTableData,
3092 HeaderFileInfoTrait(*this, F,
3093 &PP.getHeaderSearchInfo(),
3094 Blob.data() + Record[2]));
3095
3096 PP.getHeaderSearchInfo().SetExternalSource(this);
3097 if (!PP.getHeaderSearchInfo().getExternalLookup())
3098 PP.getHeaderSearchInfo().SetExternalLookup(this);
3099 }
3100 break;
3101 }
3102
3103 case FP_PRAGMA_OPTIONS:
3104 // Later tables overwrite earlier ones.
3105 FPPragmaOptions.swap(Record);
3106 break;
3107
3108 case OPENCL_EXTENSIONS:
3109 // Later tables overwrite earlier ones.
3110 OpenCLExtensions.swap(Record);
3111 break;
3112
3113 case TENTATIVE_DEFINITIONS:
3114 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3115 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3116 break;
3117
3118 case KNOWN_NAMESPACES:
3119 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3120 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3121 break;
3122
3123 case UNDEFINED_BUT_USED:
3124 if (UndefinedButUsed.size() % 2 != 0) {
3125 Error("Invalid existing UndefinedButUsed");
3126 return Failure;
3127 }
3128
3129 if (Record.size() % 2 != 0) {
3130 Error("invalid undefined-but-used record");
3131 return Failure;
3132 }
3133 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3134 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3135 UndefinedButUsed.push_back(
3136 ReadSourceLocation(F, Record, I).getRawEncoding());
3137 }
3138 break;
3139 case DELETE_EXPRS_TO_ANALYZE:
3140 for (unsigned I = 0, N = Record.size(); I != N;) {
3141 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3142 const uint64_t Count = Record[I++];
3143 DelayedDeleteExprs.push_back(Count);
3144 for (uint64_t C = 0; C < Count; ++C) {
3145 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3146 bool IsArrayForm = Record[I++] == 1;
3147 DelayedDeleteExprs.push_back(IsArrayForm);
3148 }
3149 }
3150 break;
3151
3152 case IMPORTED_MODULES: {
3153 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
3154 // If we aren't loading a module (which has its own exports), make
3155 // all of the imported modules visible.
3156 // FIXME: Deal with macros-only imports.
3157 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3158 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3159 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3160 if (GlobalID)
3161 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3162 }
3163 }
3164 break;
3165 }
3166
3167 case MACRO_OFFSET: {
3168 if (F.LocalNumMacros != 0) {
3169 Error("duplicate MACRO_OFFSET record in AST file");
3170 return Failure;
3171 }
3172 F.MacroOffsets = (const uint32_t *)Blob.data();
3173 F.LocalNumMacros = Record[0];
3174 unsigned LocalBaseMacroID = Record[1];
3175 F.BaseMacroID = getTotalNumMacros();
3176
3177 if (F.LocalNumMacros > 0) {
3178 // Introduce the global -> local mapping for macros within this module.
3179 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3180
3181 // Introduce the local -> global mapping for macros within this module.
3182 F.MacroRemap.insertOrReplace(
3183 std::make_pair(LocalBaseMacroID,
3184 F.BaseMacroID - LocalBaseMacroID));
3185
3186 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3187 }
3188 break;
3189 }
3190
3191 case LATE_PARSED_TEMPLATE: {
3192 LateParsedTemplates.append(Record.begin(), Record.end());
3193 break;
3194 }
3195
3196 case OPTIMIZE_PRAGMA_OPTIONS:
3197 if (Record.size() != 1) {
3198 Error("invalid pragma optimize record");
3199 return Failure;
3200 }
3201 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3202 break;
3203
3204 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3205 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3206 UnusedLocalTypedefNameCandidates.push_back(
3207 getGlobalDeclID(F, Record[I]));
3208 break;
3209 }
3210 }
3211 }
3212
3213 ASTReader::ASTReadResult
ReadModuleMapFileBlock(RecordData & Record,ModuleFile & F,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)3214 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3215 const ModuleFile *ImportedBy,
3216 unsigned ClientLoadCapabilities) {
3217 unsigned Idx = 0;
3218 F.ModuleMapPath = ReadPath(F, Record, Idx);
3219
3220 if (F.Kind == MK_ExplicitModule) {
3221 // For an explicitly-loaded module, we don't care whether the original
3222 // module map file exists or matches.
3223 return Success;
3224 }
3225
3226 // Try to resolve ModuleName in the current header search context and
3227 // verify that it is found in the same module map file as we saved. If the
3228 // top-level AST file is a main file, skip this check because there is no
3229 // usable header search context.
3230 assert(!F.ModuleName.empty() &&
3231 "MODULE_NAME should come before MODULE_MAP_FILE");
3232 if (F.Kind == MK_ImplicitModule &&
3233 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3234 // An implicitly-loaded module file should have its module listed in some
3235 // module map file that we've already loaded.
3236 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3237 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3238 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3239 if (!ModMap) {
3240 assert(ImportedBy && "top-level import should be verified");
3241 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3242 if (auto *ASTFE = M ? M->getASTFile() : nullptr)
3243 // This module was defined by an imported (explicit) module.
3244 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3245 << ASTFE->getName();
3246 else
3247 // This module was built with a different module map.
3248 Diag(diag::err_imported_module_not_found)
3249 << F.ModuleName << F.FileName << ImportedBy->FileName
3250 << F.ModuleMapPath;
3251 }
3252 return OutOfDate;
3253 }
3254
3255 assert(M->Name == F.ModuleName && "found module with different name");
3256
3257 // Check the primary module map file.
3258 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3259 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3260 assert(ModMap && "found module is missing module map file");
3261 assert(ImportedBy && "top-level import should be verified");
3262 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3263 Diag(diag::err_imported_module_modmap_changed)
3264 << F.ModuleName << ImportedBy->FileName
3265 << ModMap->getName() << F.ModuleMapPath;
3266 return OutOfDate;
3267 }
3268
3269 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3270 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3271 // FIXME: we should use input files rather than storing names.
3272 std::string Filename = ReadPath(F, Record, Idx);
3273 const FileEntry *F =
3274 FileMgr.getFile(Filename, false, false);
3275 if (F == nullptr) {
3276 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3277 Error("could not find file '" + Filename +"' referenced by AST file");
3278 return OutOfDate;
3279 }
3280 AdditionalStoredMaps.insert(F);
3281 }
3282
3283 // Check any additional module map files (e.g. module.private.modulemap)
3284 // that are not in the pcm.
3285 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3286 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3287 // Remove files that match
3288 // Note: SmallPtrSet::erase is really remove
3289 if (!AdditionalStoredMaps.erase(ModMap)) {
3290 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3291 Diag(diag::err_module_different_modmap)
3292 << F.ModuleName << /*new*/0 << ModMap->getName();
3293 return OutOfDate;
3294 }
3295 }
3296 }
3297
3298 // Check any additional module map files that are in the pcm, but not
3299 // found in header search. Cases that match are already removed.
3300 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3301 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3302 Diag(diag::err_module_different_modmap)
3303 << F.ModuleName << /*not new*/1 << ModMap->getName();
3304 return OutOfDate;
3305 }
3306 }
3307
3308 if (Listener)
3309 Listener->ReadModuleMapFile(F.ModuleMapPath);
3310 return Success;
3311 }
3312
3313
3314 /// \brief Move the given method to the back of the global list of methods.
moveMethodToBackOfGlobalList(Sema & S,ObjCMethodDecl * Method)3315 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3316 // Find the entry for this selector in the method pool.
3317 Sema::GlobalMethodPool::iterator Known
3318 = S.MethodPool.find(Method->getSelector());
3319 if (Known == S.MethodPool.end())
3320 return;
3321
3322 // Retrieve the appropriate method list.
3323 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3324 : Known->second.second;
3325 bool Found = false;
3326 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3327 if (!Found) {
3328 if (List->getMethod() == Method) {
3329 Found = true;
3330 } else {
3331 // Keep searching.
3332 continue;
3333 }
3334 }
3335
3336 if (List->getNext())
3337 List->setMethod(List->getNext()->getMethod());
3338 else
3339 List->setMethod(Method);
3340 }
3341 }
3342
makeNamesVisible(const HiddenNames & Names,Module * Owner)3343 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3344 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
3345 for (Decl *D : Names) {
3346 bool wasHidden = D->Hidden;
3347 D->Hidden = false;
3348
3349 if (wasHidden && SemaObj) {
3350 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3351 moveMethodToBackOfGlobalList(*SemaObj, Method);
3352 }
3353 }
3354 }
3355 }
3356
makeModuleVisible(Module * Mod,Module::NameVisibilityKind NameVisibility,SourceLocation ImportLoc)3357 void ASTReader::makeModuleVisible(Module *Mod,
3358 Module::NameVisibilityKind NameVisibility,
3359 SourceLocation ImportLoc) {
3360 llvm::SmallPtrSet<Module *, 4> Visited;
3361 SmallVector<Module *, 4> Stack;
3362 Stack.push_back(Mod);
3363 while (!Stack.empty()) {
3364 Mod = Stack.pop_back_val();
3365
3366 if (NameVisibility <= Mod->NameVisibility) {
3367 // This module already has this level of visibility (or greater), so
3368 // there is nothing more to do.
3369 continue;
3370 }
3371
3372 if (!Mod->isAvailable()) {
3373 // Modules that aren't available cannot be made visible.
3374 continue;
3375 }
3376
3377 // Update the module's name visibility.
3378 Mod->NameVisibility = NameVisibility;
3379
3380 // If we've already deserialized any names from this module,
3381 // mark them as visible.
3382 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3383 if (Hidden != HiddenNamesMap.end()) {
3384 auto HiddenNames = std::move(*Hidden);
3385 HiddenNamesMap.erase(Hidden);
3386 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3387 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3388 "making names visible added hidden names");
3389 }
3390
3391 // Push any exported modules onto the stack to be marked as visible.
3392 SmallVector<Module *, 16> Exports;
3393 Mod->getExportedModules(Exports);
3394 for (SmallVectorImpl<Module *>::iterator
3395 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3396 Module *Exported = *I;
3397 if (Visited.insert(Exported).second)
3398 Stack.push_back(Exported);
3399 }
3400 }
3401 }
3402
loadGlobalIndex()3403 bool ASTReader::loadGlobalIndex() {
3404 if (GlobalIndex)
3405 return false;
3406
3407 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3408 !Context.getLangOpts().Modules)
3409 return true;
3410
3411 // Try to load the global index.
3412 TriedLoadingGlobalIndex = true;
3413 StringRef ModuleCachePath
3414 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3415 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3416 = GlobalModuleIndex::readIndex(ModuleCachePath);
3417 if (!Result.first)
3418 return true;
3419
3420 GlobalIndex.reset(Result.first);
3421 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3422 return false;
3423 }
3424
isGlobalIndexUnavailable() const3425 bool ASTReader::isGlobalIndexUnavailable() const {
3426 return Context.getLangOpts().Modules && UseGlobalIndex &&
3427 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3428 }
3429
updateModuleTimestamp(ModuleFile & MF)3430 static void updateModuleTimestamp(ModuleFile &MF) {
3431 // Overwrite the timestamp file contents so that file's mtime changes.
3432 std::string TimestampFilename = MF.getTimestampFilename();
3433 std::error_code EC;
3434 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3435 if (EC)
3436 return;
3437 OS << "Timestamp file\n";
3438 }
3439
3440 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3441 /// cursor into the start of the given block ID, returning false on success and
3442 /// true on failure.
SkipCursorToBlock(BitstreamCursor & Cursor,unsigned BlockID)3443 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3444 while (1) {
3445 llvm::BitstreamEntry Entry = Cursor.advance();
3446 switch (Entry.Kind) {
3447 case llvm::BitstreamEntry::Error:
3448 case llvm::BitstreamEntry::EndBlock:
3449 return true;
3450
3451 case llvm::BitstreamEntry::Record:
3452 // Ignore top-level records.
3453 Cursor.skipRecord(Entry.ID);
3454 break;
3455
3456 case llvm::BitstreamEntry::SubBlock:
3457 if (Entry.ID == BlockID) {
3458 if (Cursor.EnterSubBlock(BlockID))
3459 return true;
3460 // Found it!
3461 return false;
3462 }
3463
3464 if (Cursor.SkipBlock())
3465 return true;
3466 }
3467 }
3468 }
3469
ReadAST(const std::string & FileName,ModuleKind Type,SourceLocation ImportLoc,unsigned ClientLoadCapabilities)3470 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3471 ModuleKind Type,
3472 SourceLocation ImportLoc,
3473 unsigned ClientLoadCapabilities) {
3474 llvm::SaveAndRestore<SourceLocation>
3475 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3476
3477 // Defer any pending actions until we get to the end of reading the AST file.
3478 Deserializing AnASTFile(this);
3479
3480 // Bump the generation number.
3481 unsigned PreviousGeneration = incrementGeneration(Context);
3482
3483 unsigned NumModules = ModuleMgr.size();
3484 SmallVector<ImportedModule, 4> Loaded;
3485 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3486 /*ImportedBy=*/nullptr, Loaded,
3487 0, 0, 0,
3488 ClientLoadCapabilities)) {
3489 case Failure:
3490 case Missing:
3491 case OutOfDate:
3492 case VersionMismatch:
3493 case ConfigurationMismatch:
3494 case HadErrors: {
3495 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3496 for (const ImportedModule &IM : Loaded)
3497 LoadedSet.insert(IM.Mod);
3498
3499 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3500 LoadedSet,
3501 Context.getLangOpts().Modules
3502 ? &PP.getHeaderSearchInfo().getModuleMap()
3503 : nullptr);
3504
3505 // If we find that any modules are unusable, the global index is going
3506 // to be out-of-date. Just remove it.
3507 GlobalIndex.reset();
3508 ModuleMgr.setGlobalIndex(nullptr);
3509 return ReadResult;
3510 }
3511 case Success:
3512 break;
3513 }
3514
3515 // Here comes stuff that we only do once the entire chain is loaded.
3516
3517 // Load the AST blocks of all of the modules that we loaded.
3518 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3519 MEnd = Loaded.end();
3520 M != MEnd; ++M) {
3521 ModuleFile &F = *M->Mod;
3522
3523 // Read the AST block.
3524 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3525 return Result;
3526
3527 // Read the extension blocks.
3528 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3529 if (ASTReadResult Result = ReadExtensionBlock(F))
3530 return Result;
3531 }
3532
3533 // Once read, set the ModuleFile bit base offset and update the size in
3534 // bits of all files we've seen.
3535 F.GlobalBitOffset = TotalModulesSizeInBits;
3536 TotalModulesSizeInBits += F.SizeInBits;
3537 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3538
3539 // Preload SLocEntries.
3540 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3541 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3542 // Load it through the SourceManager and don't call ReadSLocEntry()
3543 // directly because the entry may have already been loaded in which case
3544 // calling ReadSLocEntry() directly would trigger an assertion in
3545 // SourceManager.
3546 SourceMgr.getLoadedSLocEntryByID(Index);
3547 }
3548
3549 // Preload all the pending interesting identifiers by marking them out of
3550 // date.
3551 for (auto Offset : F.PreloadIdentifierOffsets) {
3552 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3553 F.IdentifierTableData + Offset);
3554
3555 ASTIdentifierLookupTrait Trait(*this, F);
3556 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3557 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3558 auto &II = PP.getIdentifierTable().getOwn(Key);
3559 II.setOutOfDate(true);
3560
3561 // Mark this identifier as being from an AST file so that we can track
3562 // whether we need to serialize it.
3563 if (!II.isFromAST()) {
3564 II.setIsFromAST();
3565 bool IsModule = PP.getCurrentModule() != nullptr;
3566 if (isInterestingIdentifier(*this, II, IsModule))
3567 II.setChangedSinceDeserialization();
3568 }
3569
3570 // Associate the ID with the identifier so that the writer can reuse it.
3571 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3572 SetIdentifierInfo(ID, &II);
3573 }
3574 }
3575
3576 // Setup the import locations and notify the module manager that we've
3577 // committed to these module files.
3578 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3579 MEnd = Loaded.end();
3580 M != MEnd; ++M) {
3581 ModuleFile &F = *M->Mod;
3582
3583 ModuleMgr.moduleFileAccepted(&F);
3584
3585 // Set the import location.
3586 F.DirectImportLoc = ImportLoc;
3587 if (!M->ImportedBy)
3588 F.ImportLoc = M->ImportLoc;
3589 else
3590 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3591 M->ImportLoc.getRawEncoding());
3592 }
3593
3594 if (!Context.getLangOpts().CPlusPlus ||
3595 (Type != MK_ImplicitModule && Type != MK_ExplicitModule)) {
3596 // Mark all of the identifiers in the identifier table as being out of date,
3597 // so that various accessors know to check the loaded modules when the
3598 // identifier is used.
3599 //
3600 // For C++ modules, we don't need information on many identifiers (just
3601 // those that provide macros or are poisoned), so we mark all of
3602 // the interesting ones via PreloadIdentifierOffsets.
3603 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3604 IdEnd = PP.getIdentifierTable().end();
3605 Id != IdEnd; ++Id)
3606 Id->second->setOutOfDate(true);
3607 }
3608
3609 // Resolve any unresolved module exports.
3610 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3611 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3612 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3613 Module *ResolvedMod = getSubmodule(GlobalID);
3614
3615 switch (Unresolved.Kind) {
3616 case UnresolvedModuleRef::Conflict:
3617 if (ResolvedMod) {
3618 Module::Conflict Conflict;
3619 Conflict.Other = ResolvedMod;
3620 Conflict.Message = Unresolved.String.str();
3621 Unresolved.Mod->Conflicts.push_back(Conflict);
3622 }
3623 continue;
3624
3625 case UnresolvedModuleRef::Import:
3626 if (ResolvedMod)
3627 Unresolved.Mod->Imports.insert(ResolvedMod);
3628 continue;
3629
3630 case UnresolvedModuleRef::Export:
3631 if (ResolvedMod || Unresolved.IsWildcard)
3632 Unresolved.Mod->Exports.push_back(
3633 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3634 continue;
3635 }
3636 }
3637 UnresolvedModuleRefs.clear();
3638
3639 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3640 // Might be unnecessary as use declarations are only used to build the
3641 // module itself.
3642
3643 InitializeContext();
3644
3645 if (SemaObj)
3646 UpdateSema();
3647
3648 if (DeserializationListener)
3649 DeserializationListener->ReaderInitialized(this);
3650
3651 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3652 if (PrimaryModule.OriginalSourceFileID.isValid()) {
3653 PrimaryModule.OriginalSourceFileID
3654 = FileID::get(PrimaryModule.SLocEntryBaseID
3655 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3656
3657 // If this AST file is a precompiled preamble, then set the
3658 // preamble file ID of the source manager to the file source file
3659 // from which the preamble was built.
3660 if (Type == MK_Preamble) {
3661 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3662 } else if (Type == MK_MainFile) {
3663 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3664 }
3665 }
3666
3667 // For any Objective-C class definitions we have already loaded, make sure
3668 // that we load any additional categories.
3669 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3670 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3671 ObjCClassesLoaded[I],
3672 PreviousGeneration);
3673 }
3674
3675 if (PP.getHeaderSearchInfo()
3676 .getHeaderSearchOpts()
3677 .ModulesValidateOncePerBuildSession) {
3678 // Now we are certain that the module and all modules it depends on are
3679 // up to date. Create or update timestamp files for modules that are
3680 // located in the module cache (not for PCH files that could be anywhere
3681 // in the filesystem).
3682 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3683 ImportedModule &M = Loaded[I];
3684 if (M.Mod->Kind == MK_ImplicitModule) {
3685 updateModuleTimestamp(*M.Mod);
3686 }
3687 }
3688 }
3689
3690 return Success;
3691 }
3692
3693 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3694
3695 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
startsWithASTFileMagic(BitstreamCursor & Stream)3696 static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3697 return Stream.Read(8) == 'C' &&
3698 Stream.Read(8) == 'P' &&
3699 Stream.Read(8) == 'C' &&
3700 Stream.Read(8) == 'H';
3701 }
3702
moduleKindForDiagnostic(ModuleKind Kind)3703 static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
3704 switch (Kind) {
3705 case MK_PCH:
3706 return 0; // PCH
3707 case MK_ImplicitModule:
3708 case MK_ExplicitModule:
3709 return 1; // module
3710 case MK_MainFile:
3711 case MK_Preamble:
3712 return 2; // main source file
3713 }
3714 llvm_unreachable("unknown module kind");
3715 }
3716
3717 ASTReader::ASTReadResult
ReadASTCore(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,ModuleFile * ImportedBy,SmallVectorImpl<ImportedModule> & Loaded,off_t ExpectedSize,time_t ExpectedModTime,ASTFileSignature ExpectedSignature,unsigned ClientLoadCapabilities)3718 ASTReader::ReadASTCore(StringRef FileName,
3719 ModuleKind Type,
3720 SourceLocation ImportLoc,
3721 ModuleFile *ImportedBy,
3722 SmallVectorImpl<ImportedModule> &Loaded,
3723 off_t ExpectedSize, time_t ExpectedModTime,
3724 ASTFileSignature ExpectedSignature,
3725 unsigned ClientLoadCapabilities) {
3726 ModuleFile *M;
3727 std::string ErrorStr;
3728 ModuleManager::AddModuleResult AddResult
3729 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3730 getGeneration(), ExpectedSize, ExpectedModTime,
3731 ExpectedSignature, readASTFileSignature,
3732 M, ErrorStr);
3733
3734 switch (AddResult) {
3735 case ModuleManager::AlreadyLoaded:
3736 return Success;
3737
3738 case ModuleManager::NewlyLoaded:
3739 // Load module file below.
3740 break;
3741
3742 case ModuleManager::Missing:
3743 // The module file was missing; if the client can handle that, return
3744 // it.
3745 if (ClientLoadCapabilities & ARR_Missing)
3746 return Missing;
3747
3748 // Otherwise, return an error.
3749 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
3750 << FileName << ErrorStr.empty()
3751 << ErrorStr;
3752 return Failure;
3753
3754 case ModuleManager::OutOfDate:
3755 // We couldn't load the module file because it is out-of-date. If the
3756 // client can handle out-of-date, return it.
3757 if (ClientLoadCapabilities & ARR_OutOfDate)
3758 return OutOfDate;
3759
3760 // Otherwise, return an error.
3761 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
3762 << FileName << ErrorStr.empty()
3763 << ErrorStr;
3764 return Failure;
3765 }
3766
3767 assert(M && "Missing module file");
3768
3769 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3770 // module?
3771 if (FileName != "-") {
3772 CurrentDir = llvm::sys::path::parent_path(FileName);
3773 if (CurrentDir.empty()) CurrentDir = ".";
3774 }
3775
3776 ModuleFile &F = *M;
3777 BitstreamCursor &Stream = F.Stream;
3778 PCHContainerRdr.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile);
3779 Stream.init(&F.StreamFile);
3780 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3781
3782 // Sniff for the signature.
3783 if (!startsWithASTFileMagic(Stream)) {
3784 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
3785 << FileName;
3786 return Failure;
3787 }
3788
3789 // This is used for compatibility with older PCH formats.
3790 bool HaveReadControlBlock = false;
3791 while (1) {
3792 llvm::BitstreamEntry Entry = Stream.advance();
3793
3794 switch (Entry.Kind) {
3795 case llvm::BitstreamEntry::Error:
3796 case llvm::BitstreamEntry::Record:
3797 case llvm::BitstreamEntry::EndBlock:
3798 Error("invalid record at top-level of AST file");
3799 return Failure;
3800
3801 case llvm::BitstreamEntry::SubBlock:
3802 break;
3803 }
3804
3805 switch (Entry.ID) {
3806 case CONTROL_BLOCK_ID:
3807 HaveReadControlBlock = true;
3808 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3809 case Success:
3810 // Check that we didn't try to load a non-module AST file as a module.
3811 //
3812 // FIXME: Should we also perform the converse check? Loading a module as
3813 // a PCH file sort of works, but it's a bit wonky.
3814 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule) &&
3815 F.ModuleName.empty()) {
3816 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
3817 if (Result != OutOfDate ||
3818 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
3819 Diag(diag::err_module_file_not_module) << FileName;
3820 return Result;
3821 }
3822 break;
3823
3824 case Failure: return Failure;
3825 case Missing: return Missing;
3826 case OutOfDate: return OutOfDate;
3827 case VersionMismatch: return VersionMismatch;
3828 case ConfigurationMismatch: return ConfigurationMismatch;
3829 case HadErrors: return HadErrors;
3830 }
3831 break;
3832
3833 case AST_BLOCK_ID:
3834 if (!HaveReadControlBlock) {
3835 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3836 Diag(diag::err_pch_version_too_old);
3837 return VersionMismatch;
3838 }
3839
3840 // Record that we've loaded this module.
3841 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3842 return Success;
3843
3844 default:
3845 if (Stream.SkipBlock()) {
3846 Error("malformed block record in AST file");
3847 return Failure;
3848 }
3849 break;
3850 }
3851 }
3852
3853 return Success;
3854 }
3855
3856 /// Parse a record and blob containing module file extension metadata.
parseModuleFileExtensionMetadata(const SmallVectorImpl<uint64_t> & Record,StringRef Blob,ModuleFileExtensionMetadata & Metadata)3857 static bool parseModuleFileExtensionMetadata(
3858 const SmallVectorImpl<uint64_t> &Record,
3859 StringRef Blob,
3860 ModuleFileExtensionMetadata &Metadata) {
3861 if (Record.size() < 4) return true;
3862
3863 Metadata.MajorVersion = Record[0];
3864 Metadata.MinorVersion = Record[1];
3865
3866 unsigned BlockNameLen = Record[2];
3867 unsigned UserInfoLen = Record[3];
3868
3869 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
3870
3871 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
3872 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
3873 Blob.data() + BlockNameLen + UserInfoLen);
3874 return false;
3875 }
3876
ReadExtensionBlock(ModuleFile & F)3877 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
3878 BitstreamCursor &Stream = F.Stream;
3879
3880 RecordData Record;
3881 while (true) {
3882 llvm::BitstreamEntry Entry = Stream.advance();
3883 switch (Entry.Kind) {
3884 case llvm::BitstreamEntry::SubBlock:
3885 if (Stream.SkipBlock())
3886 return Failure;
3887
3888 continue;
3889
3890 case llvm::BitstreamEntry::EndBlock:
3891 return Success;
3892
3893 case llvm::BitstreamEntry::Error:
3894 return HadErrors;
3895
3896 case llvm::BitstreamEntry::Record:
3897 break;
3898 }
3899
3900 Record.clear();
3901 StringRef Blob;
3902 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
3903 switch (RecCode) {
3904 case EXTENSION_METADATA: {
3905 ModuleFileExtensionMetadata Metadata;
3906 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
3907 return Failure;
3908
3909 // Find a module file extension with this block name.
3910 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
3911 if (Known == ModuleFileExtensions.end()) break;
3912
3913 // Form a reader.
3914 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
3915 F, Stream)) {
3916 F.ExtensionReaders.push_back(std::move(Reader));
3917 }
3918
3919 break;
3920 }
3921 }
3922 }
3923
3924 return Success;
3925 }
3926
InitializeContext()3927 void ASTReader::InitializeContext() {
3928 // If there's a listener, notify them that we "read" the translation unit.
3929 if (DeserializationListener)
3930 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3931 Context.getTranslationUnitDecl());
3932
3933 // FIXME: Find a better way to deal with collisions between these
3934 // built-in types. Right now, we just ignore the problem.
3935
3936 // Load the special types.
3937 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3938 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3939 if (!Context.CFConstantStringTypeDecl)
3940 Context.setCFConstantStringType(GetType(String));
3941 }
3942
3943 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3944 QualType FileType = GetType(File);
3945 if (FileType.isNull()) {
3946 Error("FILE type is NULL");
3947 return;
3948 }
3949
3950 if (!Context.FILEDecl) {
3951 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3952 Context.setFILEDecl(Typedef->getDecl());
3953 else {
3954 const TagType *Tag = FileType->getAs<TagType>();
3955 if (!Tag) {
3956 Error("Invalid FILE type in AST file");
3957 return;
3958 }
3959 Context.setFILEDecl(Tag->getDecl());
3960 }
3961 }
3962 }
3963
3964 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3965 QualType Jmp_bufType = GetType(Jmp_buf);
3966 if (Jmp_bufType.isNull()) {
3967 Error("jmp_buf type is NULL");
3968 return;
3969 }
3970
3971 if (!Context.jmp_bufDecl) {
3972 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3973 Context.setjmp_bufDecl(Typedef->getDecl());
3974 else {
3975 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3976 if (!Tag) {
3977 Error("Invalid jmp_buf type in AST file");
3978 return;
3979 }
3980 Context.setjmp_bufDecl(Tag->getDecl());
3981 }
3982 }
3983 }
3984
3985 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3986 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3987 if (Sigjmp_bufType.isNull()) {
3988 Error("sigjmp_buf type is NULL");
3989 return;
3990 }
3991
3992 if (!Context.sigjmp_bufDecl) {
3993 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3994 Context.setsigjmp_bufDecl(Typedef->getDecl());
3995 else {
3996 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3997 assert(Tag && "Invalid sigjmp_buf type in AST file");
3998 Context.setsigjmp_bufDecl(Tag->getDecl());
3999 }
4000 }
4001 }
4002
4003 if (unsigned ObjCIdRedef
4004 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4005 if (Context.ObjCIdRedefinitionType.isNull())
4006 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4007 }
4008
4009 if (unsigned ObjCClassRedef
4010 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4011 if (Context.ObjCClassRedefinitionType.isNull())
4012 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4013 }
4014
4015 if (unsigned ObjCSelRedef
4016 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4017 if (Context.ObjCSelRedefinitionType.isNull())
4018 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4019 }
4020
4021 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4022 QualType Ucontext_tType = GetType(Ucontext_t);
4023 if (Ucontext_tType.isNull()) {
4024 Error("ucontext_t type is NULL");
4025 return;
4026 }
4027
4028 if (!Context.ucontext_tDecl) {
4029 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4030 Context.setucontext_tDecl(Typedef->getDecl());
4031 else {
4032 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4033 assert(Tag && "Invalid ucontext_t type in AST file");
4034 Context.setucontext_tDecl(Tag->getDecl());
4035 }
4036 }
4037 }
4038 }
4039
4040 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4041
4042 // If there were any CUDA special declarations, deserialize them.
4043 if (!CUDASpecialDeclRefs.empty()) {
4044 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4045 Context.setcudaConfigureCallDecl(
4046 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4047 }
4048
4049 // Re-export any modules that were imported by a non-module AST file.
4050 // FIXME: This does not make macro-only imports visible again.
4051 for (auto &Import : ImportedModules) {
4052 if (Module *Imported = getSubmodule(Import.ID)) {
4053 makeModuleVisible(Imported, Module::AllVisible,
4054 /*ImportLoc=*/Import.ImportLoc);
4055 PP.makeModuleVisible(Imported, Import.ImportLoc);
4056 }
4057 }
4058 ImportedModules.clear();
4059 }
4060
finalizeForWriting()4061 void ASTReader::finalizeForWriting() {
4062 // Nothing to do for now.
4063 }
4064
4065 /// \brief Reads and return the signature record from \p StreamFile's control
4066 /// block, or else returns 0.
readASTFileSignature(llvm::BitstreamReader & StreamFile)4067 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4068 BitstreamCursor Stream(StreamFile);
4069 if (!startsWithASTFileMagic(Stream))
4070 return 0;
4071
4072 // Scan for the CONTROL_BLOCK_ID block.
4073 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4074 return 0;
4075
4076 // Scan for SIGNATURE inside the control block.
4077 ASTReader::RecordData Record;
4078 while (1) {
4079 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4080 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4081 Entry.Kind != llvm::BitstreamEntry::Record)
4082 return 0;
4083
4084 Record.clear();
4085 StringRef Blob;
4086 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4087 return Record[0];
4088 }
4089 }
4090
4091 /// \brief Retrieve the name of the original source file name
4092 /// directly from the AST file, without actually loading the AST
4093 /// file.
getOriginalSourceFile(const std::string & ASTFileName,FileManager & FileMgr,const PCHContainerReader & PCHContainerRdr,DiagnosticsEngine & Diags)4094 std::string ASTReader::getOriginalSourceFile(
4095 const std::string &ASTFileName, FileManager &FileMgr,
4096 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4097 // Open the AST file.
4098 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4099 if (!Buffer) {
4100 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4101 << ASTFileName << Buffer.getError().message();
4102 return std::string();
4103 }
4104
4105 // Initialize the stream
4106 llvm::BitstreamReader StreamFile;
4107 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
4108 BitstreamCursor Stream(StreamFile);
4109
4110 // Sniff for the signature.
4111 if (!startsWithASTFileMagic(Stream)) {
4112 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4113 return std::string();
4114 }
4115
4116 // Scan for the CONTROL_BLOCK_ID block.
4117 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4118 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4119 return std::string();
4120 }
4121
4122 // Scan for ORIGINAL_FILE inside the control block.
4123 RecordData Record;
4124 while (1) {
4125 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4126 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4127 return std::string();
4128
4129 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4130 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4131 return std::string();
4132 }
4133
4134 Record.clear();
4135 StringRef Blob;
4136 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4137 return Blob.str();
4138 }
4139 }
4140
4141 namespace {
4142 class SimplePCHValidator : public ASTReaderListener {
4143 const LangOptions &ExistingLangOpts;
4144 const TargetOptions &ExistingTargetOpts;
4145 const PreprocessorOptions &ExistingPPOpts;
4146 std::string ExistingModuleCachePath;
4147 FileManager &FileMgr;
4148
4149 public:
SimplePCHValidator(const LangOptions & ExistingLangOpts,const TargetOptions & ExistingTargetOpts,const PreprocessorOptions & ExistingPPOpts,StringRef ExistingModuleCachePath,FileManager & FileMgr)4150 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4151 const TargetOptions &ExistingTargetOpts,
4152 const PreprocessorOptions &ExistingPPOpts,
4153 StringRef ExistingModuleCachePath,
4154 FileManager &FileMgr)
4155 : ExistingLangOpts(ExistingLangOpts),
4156 ExistingTargetOpts(ExistingTargetOpts),
4157 ExistingPPOpts(ExistingPPOpts),
4158 ExistingModuleCachePath(ExistingModuleCachePath),
4159 FileMgr(FileMgr)
4160 {
4161 }
4162
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)4163 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4164 bool AllowCompatibleDifferences) override {
4165 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4166 AllowCompatibleDifferences);
4167 }
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)4168 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4169 bool AllowCompatibleDifferences) override {
4170 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4171 AllowCompatibleDifferences);
4172 }
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)4173 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4174 StringRef SpecificModuleCachePath,
4175 bool Complain) override {
4176 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4177 ExistingModuleCachePath,
4178 nullptr, ExistingLangOpts);
4179 }
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)4180 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4181 bool Complain,
4182 std::string &SuggestedPredefines) override {
4183 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4184 SuggestedPredefines, ExistingLangOpts);
4185 }
4186 };
4187 }
4188
readASTFileControlBlock(StringRef Filename,FileManager & FileMgr,const PCHContainerReader & PCHContainerRdr,bool FindModuleFileExtensions,ASTReaderListener & Listener)4189 bool ASTReader::readASTFileControlBlock(
4190 StringRef Filename, FileManager &FileMgr,
4191 const PCHContainerReader &PCHContainerRdr,
4192 bool FindModuleFileExtensions,
4193 ASTReaderListener &Listener) {
4194 // Open the AST file.
4195 // FIXME: This allows use of the VFS; we do not allow use of the
4196 // VFS when actually loading a module.
4197 auto Buffer = FileMgr.getBufferForFile(Filename);
4198 if (!Buffer) {
4199 return true;
4200 }
4201
4202 // Initialize the stream
4203 llvm::BitstreamReader StreamFile;
4204 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
4205 BitstreamCursor Stream(StreamFile);
4206
4207 // Sniff for the signature.
4208 if (!startsWithASTFileMagic(Stream))
4209 return true;
4210
4211 // Scan for the CONTROL_BLOCK_ID block.
4212 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4213 return true;
4214
4215 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4216 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4217 bool NeedsImports = Listener.needsImportVisitation();
4218 BitstreamCursor InputFilesCursor;
4219
4220 RecordData Record;
4221 std::string ModuleDir;
4222 bool DoneWithControlBlock = false;
4223 while (!DoneWithControlBlock) {
4224 llvm::BitstreamEntry Entry = Stream.advance();
4225
4226 switch (Entry.Kind) {
4227 case llvm::BitstreamEntry::SubBlock: {
4228 switch (Entry.ID) {
4229 case OPTIONS_BLOCK_ID: {
4230 std::string IgnoredSuggestedPredefines;
4231 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4232 /*AllowCompatibleConfigurationMismatch*/ false,
4233 Listener, IgnoredSuggestedPredefines) != Success)
4234 return true;
4235 break;
4236 }
4237
4238 case INPUT_FILES_BLOCK_ID:
4239 InputFilesCursor = Stream;
4240 if (Stream.SkipBlock() ||
4241 (NeedsInputFiles &&
4242 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4243 return true;
4244 break;
4245
4246 default:
4247 if (Stream.SkipBlock())
4248 return true;
4249 break;
4250 }
4251
4252 continue;
4253 }
4254
4255 case llvm::BitstreamEntry::EndBlock:
4256 DoneWithControlBlock = true;
4257 break;
4258
4259 case llvm::BitstreamEntry::Error:
4260 return true;
4261
4262 case llvm::BitstreamEntry::Record:
4263 break;
4264 }
4265
4266 if (DoneWithControlBlock) break;
4267
4268 Record.clear();
4269 StringRef Blob;
4270 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4271 switch ((ControlRecordTypes)RecCode) {
4272 case METADATA: {
4273 if (Record[0] != VERSION_MAJOR)
4274 return true;
4275
4276 if (Listener.ReadFullVersionInformation(Blob))
4277 return true;
4278
4279 break;
4280 }
4281 case MODULE_NAME:
4282 Listener.ReadModuleName(Blob);
4283 break;
4284 case MODULE_DIRECTORY:
4285 ModuleDir = Blob;
4286 break;
4287 case MODULE_MAP_FILE: {
4288 unsigned Idx = 0;
4289 auto Path = ReadString(Record, Idx);
4290 ResolveImportedPath(Path, ModuleDir);
4291 Listener.ReadModuleMapFile(Path);
4292 break;
4293 }
4294 case INPUT_FILE_OFFSETS: {
4295 if (!NeedsInputFiles)
4296 break;
4297
4298 unsigned NumInputFiles = Record[0];
4299 unsigned NumUserFiles = Record[1];
4300 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
4301 for (unsigned I = 0; I != NumInputFiles; ++I) {
4302 // Go find this input file.
4303 bool isSystemFile = I >= NumUserFiles;
4304
4305 if (isSystemFile && !NeedsSystemInputFiles)
4306 break; // the rest are system input files
4307
4308 BitstreamCursor &Cursor = InputFilesCursor;
4309 SavedStreamPosition SavedPosition(Cursor);
4310 Cursor.JumpToBit(InputFileOffs[I]);
4311
4312 unsigned Code = Cursor.ReadCode();
4313 RecordData Record;
4314 StringRef Blob;
4315 bool shouldContinue = false;
4316 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4317 case INPUT_FILE:
4318 bool Overridden = static_cast<bool>(Record[3]);
4319 std::string Filename = Blob;
4320 ResolveImportedPath(Filename, ModuleDir);
4321 shouldContinue = Listener.visitInputFile(
4322 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4323 break;
4324 }
4325 if (!shouldContinue)
4326 break;
4327 }
4328 break;
4329 }
4330
4331 case IMPORTS: {
4332 if (!NeedsImports)
4333 break;
4334
4335 unsigned Idx = 0, N = Record.size();
4336 while (Idx < N) {
4337 // Read information about the AST file.
4338 Idx += 5; // ImportLoc, Size, ModTime, Signature
4339 std::string Filename = ReadString(Record, Idx);
4340 ResolveImportedPath(Filename, ModuleDir);
4341 Listener.visitImport(Filename);
4342 }
4343 break;
4344 }
4345
4346 default:
4347 // No other validation to perform.
4348 break;
4349 }
4350 }
4351
4352 // Look for module file extension blocks, if requested.
4353 if (FindModuleFileExtensions) {
4354 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4355 bool DoneWithExtensionBlock = false;
4356 while (!DoneWithExtensionBlock) {
4357 llvm::BitstreamEntry Entry = Stream.advance();
4358
4359 switch (Entry.Kind) {
4360 case llvm::BitstreamEntry::SubBlock:
4361 if (Stream.SkipBlock())
4362 return true;
4363
4364 continue;
4365
4366 case llvm::BitstreamEntry::EndBlock:
4367 DoneWithExtensionBlock = true;
4368 continue;
4369
4370 case llvm::BitstreamEntry::Error:
4371 return true;
4372
4373 case llvm::BitstreamEntry::Record:
4374 break;
4375 }
4376
4377 Record.clear();
4378 StringRef Blob;
4379 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4380 switch (RecCode) {
4381 case EXTENSION_METADATA: {
4382 ModuleFileExtensionMetadata Metadata;
4383 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4384 return true;
4385
4386 Listener.readModuleFileExtension(Metadata);
4387 break;
4388 }
4389 }
4390 }
4391 }
4392 }
4393
4394 return false;
4395 }
4396
isAcceptableASTFile(StringRef Filename,FileManager & FileMgr,const PCHContainerReader & PCHContainerRdr,const LangOptions & LangOpts,const TargetOptions & TargetOpts,const PreprocessorOptions & PPOpts,std::string ExistingModuleCachePath)4397 bool ASTReader::isAcceptableASTFile(
4398 StringRef Filename, FileManager &FileMgr,
4399 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
4400 const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts,
4401 std::string ExistingModuleCachePath) {
4402 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4403 ExistingModuleCachePath, FileMgr);
4404 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4405 /*FindModuleFileExtensions=*/false,
4406 validator);
4407 }
4408
4409 ASTReader::ASTReadResult
ReadSubmoduleBlock(ModuleFile & F,unsigned ClientLoadCapabilities)4410 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4411 // Enter the submodule block.
4412 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4413 Error("malformed submodule block record in AST file");
4414 return Failure;
4415 }
4416
4417 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4418 bool First = true;
4419 Module *CurrentModule = nullptr;
4420 RecordData Record;
4421 while (true) {
4422 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4423
4424 switch (Entry.Kind) {
4425 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4426 case llvm::BitstreamEntry::Error:
4427 Error("malformed block record in AST file");
4428 return Failure;
4429 case llvm::BitstreamEntry::EndBlock:
4430 return Success;
4431 case llvm::BitstreamEntry::Record:
4432 // The interesting case.
4433 break;
4434 }
4435
4436 // Read a record.
4437 StringRef Blob;
4438 Record.clear();
4439 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4440
4441 if ((Kind == SUBMODULE_METADATA) != First) {
4442 Error("submodule metadata record should be at beginning of block");
4443 return Failure;
4444 }
4445 First = false;
4446
4447 // Submodule information is only valid if we have a current module.
4448 // FIXME: Should we error on these cases?
4449 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4450 Kind != SUBMODULE_DEFINITION)
4451 continue;
4452
4453 switch (Kind) {
4454 default: // Default behavior: ignore.
4455 break;
4456
4457 case SUBMODULE_DEFINITION: {
4458 if (Record.size() < 8) {
4459 Error("malformed module definition");
4460 return Failure;
4461 }
4462
4463 StringRef Name = Blob;
4464 unsigned Idx = 0;
4465 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4466 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4467 bool IsFramework = Record[Idx++];
4468 bool IsExplicit = Record[Idx++];
4469 bool IsSystem = Record[Idx++];
4470 bool IsExternC = Record[Idx++];
4471 bool InferSubmodules = Record[Idx++];
4472 bool InferExplicitSubmodules = Record[Idx++];
4473 bool InferExportWildcard = Record[Idx++];
4474 bool ConfigMacrosExhaustive = Record[Idx++];
4475
4476 Module *ParentModule = nullptr;
4477 if (Parent)
4478 ParentModule = getSubmodule(Parent);
4479
4480 // Retrieve this (sub)module from the module map, creating it if
4481 // necessary.
4482 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
4483 IsExplicit).first;
4484
4485 // FIXME: set the definition loc for CurrentModule, or call
4486 // ModMap.setInferredModuleAllowedBy()
4487
4488 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4489 if (GlobalIndex >= SubmodulesLoaded.size() ||
4490 SubmodulesLoaded[GlobalIndex]) {
4491 Error("too many submodules");
4492 return Failure;
4493 }
4494
4495 if (!ParentModule) {
4496 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4497 if (CurFile != F.File) {
4498 if (!Diags.isDiagnosticInFlight()) {
4499 Diag(diag::err_module_file_conflict)
4500 << CurrentModule->getTopLevelModuleName()
4501 << CurFile->getName()
4502 << F.File->getName();
4503 }
4504 return Failure;
4505 }
4506 }
4507
4508 CurrentModule->setASTFile(F.File);
4509 }
4510
4511 CurrentModule->Signature = F.Signature;
4512 CurrentModule->IsFromModuleFile = true;
4513 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4514 CurrentModule->IsExternC = IsExternC;
4515 CurrentModule->InferSubmodules = InferSubmodules;
4516 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4517 CurrentModule->InferExportWildcard = InferExportWildcard;
4518 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4519 if (DeserializationListener)
4520 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4521
4522 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4523
4524 // Clear out data that will be replaced by what is the module file.
4525 CurrentModule->LinkLibraries.clear();
4526 CurrentModule->ConfigMacros.clear();
4527 CurrentModule->UnresolvedConflicts.clear();
4528 CurrentModule->Conflicts.clear();
4529 break;
4530 }
4531
4532 case SUBMODULE_UMBRELLA_HEADER: {
4533 std::string Filename = Blob;
4534 ResolveImportedPath(F, Filename);
4535 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
4536 if (!CurrentModule->getUmbrellaHeader())
4537 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
4538 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
4539 // This can be a spurious difference caused by changing the VFS to
4540 // point to a different copy of the file, and it is too late to
4541 // to rebuild safely.
4542 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4543 // after input file validation only real problems would remain and we
4544 // could just error. For now, assume it's okay.
4545 break;
4546 }
4547 }
4548 break;
4549 }
4550
4551 case SUBMODULE_HEADER:
4552 case SUBMODULE_EXCLUDED_HEADER:
4553 case SUBMODULE_PRIVATE_HEADER:
4554 // We lazily associate headers with their modules via the HeaderInfo table.
4555 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4556 // of complete filenames or remove it entirely.
4557 break;
4558
4559 case SUBMODULE_TEXTUAL_HEADER:
4560 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4561 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4562 // them here.
4563 break;
4564
4565 case SUBMODULE_TOPHEADER: {
4566 CurrentModule->addTopHeaderFilename(Blob);
4567 break;
4568 }
4569
4570 case SUBMODULE_UMBRELLA_DIR: {
4571 std::string Dirname = Blob;
4572 ResolveImportedPath(F, Dirname);
4573 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
4574 if (!CurrentModule->getUmbrellaDir())
4575 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
4576 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
4577 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4578 Error("mismatched umbrella directories in submodule");
4579 return OutOfDate;
4580 }
4581 }
4582 break;
4583 }
4584
4585 case SUBMODULE_METADATA: {
4586 F.BaseSubmoduleID = getTotalNumSubmodules();
4587 F.LocalNumSubmodules = Record[0];
4588 unsigned LocalBaseSubmoduleID = Record[1];
4589 if (F.LocalNumSubmodules > 0) {
4590 // Introduce the global -> local mapping for submodules within this
4591 // module.
4592 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4593
4594 // Introduce the local -> global mapping for submodules within this
4595 // module.
4596 F.SubmoduleRemap.insertOrReplace(
4597 std::make_pair(LocalBaseSubmoduleID,
4598 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4599
4600 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4601 }
4602 break;
4603 }
4604
4605 case SUBMODULE_IMPORTS: {
4606 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4607 UnresolvedModuleRef Unresolved;
4608 Unresolved.File = &F;
4609 Unresolved.Mod = CurrentModule;
4610 Unresolved.ID = Record[Idx];
4611 Unresolved.Kind = UnresolvedModuleRef::Import;
4612 Unresolved.IsWildcard = false;
4613 UnresolvedModuleRefs.push_back(Unresolved);
4614 }
4615 break;
4616 }
4617
4618 case SUBMODULE_EXPORTS: {
4619 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4620 UnresolvedModuleRef Unresolved;
4621 Unresolved.File = &F;
4622 Unresolved.Mod = CurrentModule;
4623 Unresolved.ID = Record[Idx];
4624 Unresolved.Kind = UnresolvedModuleRef::Export;
4625 Unresolved.IsWildcard = Record[Idx + 1];
4626 UnresolvedModuleRefs.push_back(Unresolved);
4627 }
4628
4629 // Once we've loaded the set of exports, there's no reason to keep
4630 // the parsed, unresolved exports around.
4631 CurrentModule->UnresolvedExports.clear();
4632 break;
4633 }
4634 case SUBMODULE_REQUIRES: {
4635 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4636 Context.getTargetInfo());
4637 break;
4638 }
4639
4640 case SUBMODULE_LINK_LIBRARY:
4641 CurrentModule->LinkLibraries.push_back(
4642 Module::LinkLibrary(Blob, Record[0]));
4643 break;
4644
4645 case SUBMODULE_CONFIG_MACRO:
4646 CurrentModule->ConfigMacros.push_back(Blob.str());
4647 break;
4648
4649 case SUBMODULE_CONFLICT: {
4650 UnresolvedModuleRef Unresolved;
4651 Unresolved.File = &F;
4652 Unresolved.Mod = CurrentModule;
4653 Unresolved.ID = Record[0];
4654 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4655 Unresolved.IsWildcard = false;
4656 Unresolved.String = Blob;
4657 UnresolvedModuleRefs.push_back(Unresolved);
4658 break;
4659 }
4660 }
4661 }
4662 }
4663
4664 /// \brief Parse the record that corresponds to a LangOptions data
4665 /// structure.
4666 ///
4667 /// This routine parses the language options from the AST file and then gives
4668 /// them to the AST listener if one is set.
4669 ///
4670 /// \returns true if the listener deems the file unacceptable, false otherwise.
ParseLanguageOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)4671 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4672 bool Complain,
4673 ASTReaderListener &Listener,
4674 bool AllowCompatibleDifferences) {
4675 LangOptions LangOpts;
4676 unsigned Idx = 0;
4677 #define LANGOPT(Name, Bits, Default, Description) \
4678 LangOpts.Name = Record[Idx++];
4679 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4680 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4681 #include "clang/Basic/LangOptions.def"
4682 #define SANITIZER(NAME, ID) \
4683 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
4684 #include "clang/Basic/Sanitizers.def"
4685
4686 for (unsigned N = Record[Idx++]; N; --N)
4687 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
4688
4689 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4690 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4691 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4692
4693 LangOpts.CurrentModule = ReadString(Record, Idx);
4694
4695 // Comment options.
4696 for (unsigned N = Record[Idx++]; N; --N) {
4697 LangOpts.CommentOpts.BlockCommandNames.push_back(
4698 ReadString(Record, Idx));
4699 }
4700 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4701
4702 return Listener.ReadLanguageOptions(LangOpts, Complain,
4703 AllowCompatibleDifferences);
4704 }
4705
ParseTargetOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)4706 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4707 ASTReaderListener &Listener,
4708 bool AllowCompatibleDifferences) {
4709 unsigned Idx = 0;
4710 TargetOptions TargetOpts;
4711 TargetOpts.Triple = ReadString(Record, Idx);
4712 TargetOpts.CPU = ReadString(Record, Idx);
4713 TargetOpts.ABI = ReadString(Record, Idx);
4714 for (unsigned N = Record[Idx++]; N; --N) {
4715 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4716 }
4717 for (unsigned N = Record[Idx++]; N; --N) {
4718 TargetOpts.Features.push_back(ReadString(Record, Idx));
4719 }
4720
4721 return Listener.ReadTargetOptions(TargetOpts, Complain,
4722 AllowCompatibleDifferences);
4723 }
4724
ParseDiagnosticOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4725 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4726 ASTReaderListener &Listener) {
4727 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4728 unsigned Idx = 0;
4729 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4730 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4731 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4732 #include "clang/Basic/DiagnosticOptions.def"
4733
4734 for (unsigned N = Record[Idx++]; N; --N)
4735 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4736 for (unsigned N = Record[Idx++]; N; --N)
4737 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
4738
4739 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4740 }
4741
ParseFileSystemOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4742 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4743 ASTReaderListener &Listener) {
4744 FileSystemOptions FSOpts;
4745 unsigned Idx = 0;
4746 FSOpts.WorkingDir = ReadString(Record, Idx);
4747 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4748 }
4749
ParseHeaderSearchOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4750 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4751 bool Complain,
4752 ASTReaderListener &Listener) {
4753 HeaderSearchOptions HSOpts;
4754 unsigned Idx = 0;
4755 HSOpts.Sysroot = ReadString(Record, Idx);
4756
4757 // Include entries.
4758 for (unsigned N = Record[Idx++]; N; --N) {
4759 std::string Path = ReadString(Record, Idx);
4760 frontend::IncludeDirGroup Group
4761 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4762 bool IsFramework = Record[Idx++];
4763 bool IgnoreSysRoot = Record[Idx++];
4764 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
4765 IgnoreSysRoot);
4766 }
4767
4768 // System header prefixes.
4769 for (unsigned N = Record[Idx++]; N; --N) {
4770 std::string Prefix = ReadString(Record, Idx);
4771 bool IsSystemHeader = Record[Idx++];
4772 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
4773 }
4774
4775 HSOpts.ResourceDir = ReadString(Record, Idx);
4776 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4777 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4778 HSOpts.DisableModuleHash = Record[Idx++];
4779 HSOpts.UseBuiltinIncludes = Record[Idx++];
4780 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4781 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4782 HSOpts.UseLibcxx = Record[Idx++];
4783 std::string SpecificModuleCachePath = ReadString(Record, Idx);
4784
4785 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4786 Complain);
4787 }
4788
ParsePreprocessorOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,std::string & SuggestedPredefines)4789 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4790 bool Complain,
4791 ASTReaderListener &Listener,
4792 std::string &SuggestedPredefines) {
4793 PreprocessorOptions PPOpts;
4794 unsigned Idx = 0;
4795
4796 // Macro definitions/undefs
4797 for (unsigned N = Record[Idx++]; N; --N) {
4798 std::string Macro = ReadString(Record, Idx);
4799 bool IsUndef = Record[Idx++];
4800 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4801 }
4802
4803 // Includes
4804 for (unsigned N = Record[Idx++]; N; --N) {
4805 PPOpts.Includes.push_back(ReadString(Record, Idx));
4806 }
4807
4808 // Macro Includes
4809 for (unsigned N = Record[Idx++]; N; --N) {
4810 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4811 }
4812
4813 PPOpts.UsePredefines = Record[Idx++];
4814 PPOpts.DetailedRecord = Record[Idx++];
4815 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4816 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4817 PPOpts.ObjCXXARCStandardLibrary =
4818 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4819 SuggestedPredefines.clear();
4820 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4821 SuggestedPredefines);
4822 }
4823
4824 std::pair<ModuleFile *, unsigned>
getModulePreprocessedEntity(unsigned GlobalIndex)4825 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4826 GlobalPreprocessedEntityMapType::iterator
4827 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4828 assert(I != GlobalPreprocessedEntityMap.end() &&
4829 "Corrupted global preprocessed entity map");
4830 ModuleFile *M = I->second;
4831 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4832 return std::make_pair(M, LocalIndex);
4833 }
4834
4835 llvm::iterator_range<PreprocessingRecord::iterator>
getModulePreprocessedEntities(ModuleFile & Mod) const4836 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4837 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4838 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4839 Mod.NumPreprocessedEntities);
4840
4841 return llvm::make_range(PreprocessingRecord::iterator(),
4842 PreprocessingRecord::iterator());
4843 }
4844
4845 llvm::iterator_range<ASTReader::ModuleDeclIterator>
getModuleFileLevelDecls(ModuleFile & Mod)4846 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4847 return llvm::make_range(
4848 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4849 ModuleDeclIterator(this, &Mod,
4850 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4851 }
4852
ReadPreprocessedEntity(unsigned Index)4853 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4854 PreprocessedEntityID PPID = Index+1;
4855 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4856 ModuleFile &M = *PPInfo.first;
4857 unsigned LocalIndex = PPInfo.second;
4858 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4859
4860 if (!PP.getPreprocessingRecord()) {
4861 Error("no preprocessing record");
4862 return nullptr;
4863 }
4864
4865 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4866 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4867
4868 llvm::BitstreamEntry Entry =
4869 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4870 if (Entry.Kind != llvm::BitstreamEntry::Record)
4871 return nullptr;
4872
4873 // Read the record.
4874 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4875 ReadSourceLocation(M, PPOffs.End));
4876 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
4877 StringRef Blob;
4878 RecordData Record;
4879 PreprocessorDetailRecordTypes RecType =
4880 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4881 Entry.ID, Record, &Blob);
4882 switch (RecType) {
4883 case PPD_MACRO_EXPANSION: {
4884 bool isBuiltin = Record[0];
4885 IdentifierInfo *Name = nullptr;
4886 MacroDefinitionRecord *Def = nullptr;
4887 if (isBuiltin)
4888 Name = getLocalIdentifier(M, Record[1]);
4889 else {
4890 PreprocessedEntityID GlobalID =
4891 getGlobalPreprocessedEntityID(M, Record[1]);
4892 Def = cast<MacroDefinitionRecord>(
4893 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
4894 }
4895
4896 MacroExpansion *ME;
4897 if (isBuiltin)
4898 ME = new (PPRec) MacroExpansion(Name, Range);
4899 else
4900 ME = new (PPRec) MacroExpansion(Def, Range);
4901
4902 return ME;
4903 }
4904
4905 case PPD_MACRO_DEFINITION: {
4906 // Decode the identifier info and then check again; if the macro is
4907 // still defined and associated with the identifier,
4908 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4909 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
4910
4911 if (DeserializationListener)
4912 DeserializationListener->MacroDefinitionRead(PPID, MD);
4913
4914 return MD;
4915 }
4916
4917 case PPD_INCLUSION_DIRECTIVE: {
4918 const char *FullFileNameStart = Blob.data() + Record[0];
4919 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4920 const FileEntry *File = nullptr;
4921 if (!FullFileName.empty())
4922 File = PP.getFileManager().getFile(FullFileName);
4923
4924 // FIXME: Stable encoding
4925 InclusionDirective::InclusionKind Kind
4926 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4927 InclusionDirective *ID
4928 = new (PPRec) InclusionDirective(PPRec, Kind,
4929 StringRef(Blob.data(), Record[0]),
4930 Record[1], Record[3],
4931 File,
4932 Range);
4933 return ID;
4934 }
4935 }
4936
4937 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4938 }
4939
4940 /// \brief \arg SLocMapI points at a chunk of a module that contains no
4941 /// preprocessed entities or the entities it contains are not the ones we are
4942 /// looking for. Find the next module that contains entities and return the ID
4943 /// of the first entry.
findNextPreprocessedEntity(GlobalSLocOffsetMapType::const_iterator SLocMapI) const4944 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4945 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4946 ++SLocMapI;
4947 for (GlobalSLocOffsetMapType::const_iterator
4948 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4949 ModuleFile &M = *SLocMapI->second;
4950 if (M.NumPreprocessedEntities)
4951 return M.BasePreprocessedEntityID;
4952 }
4953
4954 return getTotalNumPreprocessedEntities();
4955 }
4956
4957 namespace {
4958
4959 template <unsigned PPEntityOffset::*PPLoc>
4960 struct PPEntityComp {
4961 const ASTReader &Reader;
4962 ModuleFile &M;
4963
PPEntityComp__anon546a9c040611::PPEntityComp4964 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4965
operator ()__anon546a9c040611::PPEntityComp4966 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4967 SourceLocation LHS = getLoc(L);
4968 SourceLocation RHS = getLoc(R);
4969 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4970 }
4971
operator ()__anon546a9c040611::PPEntityComp4972 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4973 SourceLocation LHS = getLoc(L);
4974 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4975 }
4976
operator ()__anon546a9c040611::PPEntityComp4977 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4978 SourceLocation RHS = getLoc(R);
4979 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4980 }
4981
getLoc__anon546a9c040611::PPEntityComp4982 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4983 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4984 }
4985 };
4986
4987 }
4988
findPreprocessedEntity(SourceLocation Loc,bool EndsAfter) const4989 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4990 bool EndsAfter) const {
4991 if (SourceMgr.isLocalSourceLocation(Loc))
4992 return getTotalNumPreprocessedEntities();
4993
4994 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4995 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
4996 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4997 "Corrupted global sloc offset map");
4998
4999 if (SLocMapI->second->NumPreprocessedEntities == 0)
5000 return findNextPreprocessedEntity(SLocMapI);
5001
5002 ModuleFile &M = *SLocMapI->second;
5003 typedef const PPEntityOffset *pp_iterator;
5004 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5005 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5006
5007 size_t Count = M.NumPreprocessedEntities;
5008 size_t Half;
5009 pp_iterator First = pp_begin;
5010 pp_iterator PPI;
5011
5012 if (EndsAfter) {
5013 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5014 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
5015 } else {
5016 // Do a binary search manually instead of using std::lower_bound because
5017 // The end locations of entities may be unordered (when a macro expansion
5018 // is inside another macro argument), but for this case it is not important
5019 // whether we get the first macro expansion or its containing macro.
5020 while (Count > 0) {
5021 Half = Count / 2;
5022 PPI = First;
5023 std::advance(PPI, Half);
5024 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
5025 Loc)) {
5026 First = PPI;
5027 ++First;
5028 Count = Count - Half - 1;
5029 } else
5030 Count = Half;
5031 }
5032 }
5033
5034 if (PPI == pp_end)
5035 return findNextPreprocessedEntity(SLocMapI);
5036
5037 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5038 }
5039
5040 /// \brief Returns a pair of [Begin, End) indices of preallocated
5041 /// preprocessed entities that \arg Range encompasses.
5042 std::pair<unsigned, unsigned>
findPreprocessedEntitiesInRange(SourceRange Range)5043 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5044 if (Range.isInvalid())
5045 return std::make_pair(0,0);
5046 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5047
5048 PreprocessedEntityID BeginID =
5049 findPreprocessedEntity(Range.getBegin(), false);
5050 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5051 return std::make_pair(BeginID, EndID);
5052 }
5053
5054 /// \brief Optionally returns true or false if the preallocated preprocessed
5055 /// entity with index \arg Index came from file \arg FID.
isPreprocessedEntityInFileID(unsigned Index,FileID FID)5056 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5057 FileID FID) {
5058 if (FID.isInvalid())
5059 return false;
5060
5061 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5062 ModuleFile &M = *PPInfo.first;
5063 unsigned LocalIndex = PPInfo.second;
5064 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5065
5066 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5067 if (Loc.isInvalid())
5068 return false;
5069
5070 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5071 return true;
5072 else
5073 return false;
5074 }
5075
5076 namespace {
5077 /// \brief Visitor used to search for information about a header file.
5078 class HeaderFileInfoVisitor {
5079 const FileEntry *FE;
5080
5081 Optional<HeaderFileInfo> HFI;
5082
5083 public:
HeaderFileInfoVisitor(const FileEntry * FE)5084 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5085 : FE(FE) { }
5086
operator ()(ModuleFile & M)5087 bool operator()(ModuleFile &M) {
5088 HeaderFileInfoLookupTable *Table
5089 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5090 if (!Table)
5091 return false;
5092
5093 // Look in the on-disk hash table for an entry for this file name.
5094 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5095 if (Pos == Table->end())
5096 return false;
5097
5098 HFI = *Pos;
5099 return true;
5100 }
5101
getHeaderFileInfo() const5102 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5103 };
5104 }
5105
GetHeaderFileInfo(const FileEntry * FE)5106 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5107 HeaderFileInfoVisitor Visitor(FE);
5108 ModuleMgr.visit(Visitor);
5109 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5110 return *HFI;
5111
5112 return HeaderFileInfo();
5113 }
5114
ReadPragmaDiagnosticMappings(DiagnosticsEngine & Diag)5115 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5116 // FIXME: Make it work properly with modules.
5117 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
5118 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5119 ModuleFile &F = *(*I);
5120 unsigned Idx = 0;
5121 DiagStates.clear();
5122 assert(!Diag.DiagStates.empty());
5123 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5124 while (Idx < F.PragmaDiagMappings.size()) {
5125 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5126 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5127 if (DiagStateID != 0) {
5128 Diag.DiagStatePoints.push_back(
5129 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5130 FullSourceLoc(Loc, SourceMgr)));
5131 continue;
5132 }
5133
5134 assert(DiagStateID == 0);
5135 // A new DiagState was created here.
5136 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5137 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5138 DiagStates.push_back(NewState);
5139 Diag.DiagStatePoints.push_back(
5140 DiagnosticsEngine::DiagStatePoint(NewState,
5141 FullSourceLoc(Loc, SourceMgr)));
5142 while (1) {
5143 assert(Idx < F.PragmaDiagMappings.size() &&
5144 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5145 if (Idx >= F.PragmaDiagMappings.size()) {
5146 break; // Something is messed up but at least avoid infinite loop in
5147 // release build.
5148 }
5149 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5150 if (DiagID == (unsigned)-1) {
5151 break; // no more diag/map pairs for this location.
5152 }
5153 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5154 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5155 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5156 }
5157 }
5158 }
5159 }
5160
5161 /// \brief Get the correct cursor and offset for loading a type.
TypeCursorForIndex(unsigned Index)5162 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5163 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5164 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5165 ModuleFile *M = I->second;
5166 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5167 }
5168
5169 /// \brief Read and return the type with the given index..
5170 ///
5171 /// The index is the type ID, shifted and minus the number of predefs. This
5172 /// routine actually reads the record corresponding to the type at the given
5173 /// location. It is a helper routine for GetType, which deals with reading type
5174 /// IDs.
readTypeRecord(unsigned Index)5175 QualType ASTReader::readTypeRecord(unsigned Index) {
5176 RecordLocation Loc = TypeCursorForIndex(Index);
5177 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5178
5179 // Keep track of where we are in the stream, then jump back there
5180 // after reading this type.
5181 SavedStreamPosition SavedPosition(DeclsCursor);
5182
5183 ReadingKindTracker ReadingKind(Read_Type, *this);
5184
5185 // Note that we are loading a type record.
5186 Deserializing AType(this);
5187
5188 unsigned Idx = 0;
5189 DeclsCursor.JumpToBit(Loc.Offset);
5190 RecordData Record;
5191 unsigned Code = DeclsCursor.ReadCode();
5192 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5193 case TYPE_EXT_QUAL: {
5194 if (Record.size() != 2) {
5195 Error("Incorrect encoding of extended qualifier type");
5196 return QualType();
5197 }
5198 QualType Base = readType(*Loc.F, Record, Idx);
5199 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5200 return Context.getQualifiedType(Base, Quals);
5201 }
5202
5203 case TYPE_COMPLEX: {
5204 if (Record.size() != 1) {
5205 Error("Incorrect encoding of complex type");
5206 return QualType();
5207 }
5208 QualType ElemType = readType(*Loc.F, Record, Idx);
5209 return Context.getComplexType(ElemType);
5210 }
5211
5212 case TYPE_POINTER: {
5213 if (Record.size() != 1) {
5214 Error("Incorrect encoding of pointer type");
5215 return QualType();
5216 }
5217 QualType PointeeType = readType(*Loc.F, Record, Idx);
5218 return Context.getPointerType(PointeeType);
5219 }
5220
5221 case TYPE_DECAYED: {
5222 if (Record.size() != 1) {
5223 Error("Incorrect encoding of decayed type");
5224 return QualType();
5225 }
5226 QualType OriginalType = readType(*Loc.F, Record, Idx);
5227 QualType DT = Context.getAdjustedParameterType(OriginalType);
5228 if (!isa<DecayedType>(DT))
5229 Error("Decayed type does not decay");
5230 return DT;
5231 }
5232
5233 case TYPE_ADJUSTED: {
5234 if (Record.size() != 2) {
5235 Error("Incorrect encoding of adjusted type");
5236 return QualType();
5237 }
5238 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5239 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5240 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5241 }
5242
5243 case TYPE_BLOCK_POINTER: {
5244 if (Record.size() != 1) {
5245 Error("Incorrect encoding of block pointer type");
5246 return QualType();
5247 }
5248 QualType PointeeType = readType(*Loc.F, Record, Idx);
5249 return Context.getBlockPointerType(PointeeType);
5250 }
5251
5252 case TYPE_LVALUE_REFERENCE: {
5253 if (Record.size() != 2) {
5254 Error("Incorrect encoding of lvalue reference type");
5255 return QualType();
5256 }
5257 QualType PointeeType = readType(*Loc.F, Record, Idx);
5258 return Context.getLValueReferenceType(PointeeType, Record[1]);
5259 }
5260
5261 case TYPE_RVALUE_REFERENCE: {
5262 if (Record.size() != 1) {
5263 Error("Incorrect encoding of rvalue reference type");
5264 return QualType();
5265 }
5266 QualType PointeeType = readType(*Loc.F, Record, Idx);
5267 return Context.getRValueReferenceType(PointeeType);
5268 }
5269
5270 case TYPE_MEMBER_POINTER: {
5271 if (Record.size() != 2) {
5272 Error("Incorrect encoding of member pointer type");
5273 return QualType();
5274 }
5275 QualType PointeeType = readType(*Loc.F, Record, Idx);
5276 QualType ClassType = readType(*Loc.F, Record, Idx);
5277 if (PointeeType.isNull() || ClassType.isNull())
5278 return QualType();
5279
5280 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5281 }
5282
5283 case TYPE_CONSTANT_ARRAY: {
5284 QualType ElementType = readType(*Loc.F, Record, Idx);
5285 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5286 unsigned IndexTypeQuals = Record[2];
5287 unsigned Idx = 3;
5288 llvm::APInt Size = ReadAPInt(Record, Idx);
5289 return Context.getConstantArrayType(ElementType, Size,
5290 ASM, IndexTypeQuals);
5291 }
5292
5293 case TYPE_INCOMPLETE_ARRAY: {
5294 QualType ElementType = readType(*Loc.F, Record, Idx);
5295 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5296 unsigned IndexTypeQuals = Record[2];
5297 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5298 }
5299
5300 case TYPE_VARIABLE_ARRAY: {
5301 QualType ElementType = readType(*Loc.F, Record, Idx);
5302 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5303 unsigned IndexTypeQuals = Record[2];
5304 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5305 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5306 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5307 ASM, IndexTypeQuals,
5308 SourceRange(LBLoc, RBLoc));
5309 }
5310
5311 case TYPE_VECTOR: {
5312 if (Record.size() != 3) {
5313 Error("incorrect encoding of vector type in AST file");
5314 return QualType();
5315 }
5316
5317 QualType ElementType = readType(*Loc.F, Record, Idx);
5318 unsigned NumElements = Record[1];
5319 unsigned VecKind = Record[2];
5320 return Context.getVectorType(ElementType, NumElements,
5321 (VectorType::VectorKind)VecKind);
5322 }
5323
5324 case TYPE_EXT_VECTOR: {
5325 if (Record.size() != 3) {
5326 Error("incorrect encoding of extended vector type in AST file");
5327 return QualType();
5328 }
5329
5330 QualType ElementType = readType(*Loc.F, Record, Idx);
5331 unsigned NumElements = Record[1];
5332 return Context.getExtVectorType(ElementType, NumElements);
5333 }
5334
5335 case TYPE_FUNCTION_NO_PROTO: {
5336 if (Record.size() != 6) {
5337 Error("incorrect encoding of no-proto function type");
5338 return QualType();
5339 }
5340 QualType ResultType = readType(*Loc.F, Record, Idx);
5341 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5342 (CallingConv)Record[4], Record[5]);
5343 return Context.getFunctionNoProtoType(ResultType, Info);
5344 }
5345
5346 case TYPE_FUNCTION_PROTO: {
5347 QualType ResultType = readType(*Loc.F, Record, Idx);
5348
5349 FunctionProtoType::ExtProtoInfo EPI;
5350 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5351 /*hasregparm*/ Record[2],
5352 /*regparm*/ Record[3],
5353 static_cast<CallingConv>(Record[4]),
5354 /*produces*/ Record[5]);
5355
5356 unsigned Idx = 6;
5357
5358 EPI.Variadic = Record[Idx++];
5359 EPI.HasTrailingReturn = Record[Idx++];
5360 EPI.TypeQuals = Record[Idx++];
5361 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5362 SmallVector<QualType, 8> ExceptionStorage;
5363 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
5364
5365 unsigned NumParams = Record[Idx++];
5366 SmallVector<QualType, 16> ParamTypes;
5367 for (unsigned I = 0; I != NumParams; ++I)
5368 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5369
5370 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5371 }
5372
5373 case TYPE_UNRESOLVED_USING: {
5374 unsigned Idx = 0;
5375 return Context.getTypeDeclType(
5376 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5377 }
5378
5379 case TYPE_TYPEDEF: {
5380 if (Record.size() != 2) {
5381 Error("incorrect encoding of typedef type");
5382 return QualType();
5383 }
5384 unsigned Idx = 0;
5385 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5386 QualType Canonical = readType(*Loc.F, Record, Idx);
5387 if (!Canonical.isNull())
5388 Canonical = Context.getCanonicalType(Canonical);
5389 return Context.getTypedefType(Decl, Canonical);
5390 }
5391
5392 case TYPE_TYPEOF_EXPR:
5393 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5394
5395 case TYPE_TYPEOF: {
5396 if (Record.size() != 1) {
5397 Error("incorrect encoding of typeof(type) in AST file");
5398 return QualType();
5399 }
5400 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5401 return Context.getTypeOfType(UnderlyingType);
5402 }
5403
5404 case TYPE_DECLTYPE: {
5405 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5406 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5407 }
5408
5409 case TYPE_UNARY_TRANSFORM: {
5410 QualType BaseType = readType(*Loc.F, Record, Idx);
5411 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5412 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5413 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5414 }
5415
5416 case TYPE_AUTO: {
5417 QualType Deduced = readType(*Loc.F, Record, Idx);
5418 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
5419 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5420 return Context.getAutoType(Deduced, Keyword, IsDependent);
5421 }
5422
5423 case TYPE_RECORD: {
5424 if (Record.size() != 2) {
5425 Error("incorrect encoding of record type");
5426 return QualType();
5427 }
5428 unsigned Idx = 0;
5429 bool IsDependent = Record[Idx++];
5430 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5431 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5432 QualType T = Context.getRecordType(RD);
5433 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5434 return T;
5435 }
5436
5437 case TYPE_ENUM: {
5438 if (Record.size() != 2) {
5439 Error("incorrect encoding of enum type");
5440 return QualType();
5441 }
5442 unsigned Idx = 0;
5443 bool IsDependent = Record[Idx++];
5444 QualType T
5445 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5446 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5447 return T;
5448 }
5449
5450 case TYPE_ATTRIBUTED: {
5451 if (Record.size() != 3) {
5452 Error("incorrect encoding of attributed type");
5453 return QualType();
5454 }
5455 QualType modifiedType = readType(*Loc.F, Record, Idx);
5456 QualType equivalentType = readType(*Loc.F, Record, Idx);
5457 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5458 return Context.getAttributedType(kind, modifiedType, equivalentType);
5459 }
5460
5461 case TYPE_PAREN: {
5462 if (Record.size() != 1) {
5463 Error("incorrect encoding of paren type");
5464 return QualType();
5465 }
5466 QualType InnerType = readType(*Loc.F, Record, Idx);
5467 return Context.getParenType(InnerType);
5468 }
5469
5470 case TYPE_PACK_EXPANSION: {
5471 if (Record.size() != 2) {
5472 Error("incorrect encoding of pack expansion type");
5473 return QualType();
5474 }
5475 QualType Pattern = readType(*Loc.F, Record, Idx);
5476 if (Pattern.isNull())
5477 return QualType();
5478 Optional<unsigned> NumExpansions;
5479 if (Record[1])
5480 NumExpansions = Record[1] - 1;
5481 return Context.getPackExpansionType(Pattern, NumExpansions);
5482 }
5483
5484 case TYPE_ELABORATED: {
5485 unsigned Idx = 0;
5486 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5487 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5488 QualType NamedType = readType(*Loc.F, Record, Idx);
5489 return Context.getElaboratedType(Keyword, NNS, NamedType);
5490 }
5491
5492 case TYPE_OBJC_INTERFACE: {
5493 unsigned Idx = 0;
5494 ObjCInterfaceDecl *ItfD
5495 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5496 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5497 }
5498
5499 case TYPE_OBJC_OBJECT: {
5500 unsigned Idx = 0;
5501 QualType Base = readType(*Loc.F, Record, Idx);
5502 unsigned NumTypeArgs = Record[Idx++];
5503 SmallVector<QualType, 4> TypeArgs;
5504 for (unsigned I = 0; I != NumTypeArgs; ++I)
5505 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
5506 unsigned NumProtos = Record[Idx++];
5507 SmallVector<ObjCProtocolDecl*, 4> Protos;
5508 for (unsigned I = 0; I != NumProtos; ++I)
5509 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5510 bool IsKindOf = Record[Idx++];
5511 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
5512 }
5513
5514 case TYPE_OBJC_OBJECT_POINTER: {
5515 unsigned Idx = 0;
5516 QualType Pointee = readType(*Loc.F, Record, Idx);
5517 return Context.getObjCObjectPointerType(Pointee);
5518 }
5519
5520 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5521 unsigned Idx = 0;
5522 QualType Parm = readType(*Loc.F, Record, Idx);
5523 QualType Replacement = readType(*Loc.F, Record, Idx);
5524 return Context.getSubstTemplateTypeParmType(
5525 cast<TemplateTypeParmType>(Parm),
5526 Context.getCanonicalType(Replacement));
5527 }
5528
5529 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5530 unsigned Idx = 0;
5531 QualType Parm = readType(*Loc.F, Record, Idx);
5532 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5533 return Context.getSubstTemplateTypeParmPackType(
5534 cast<TemplateTypeParmType>(Parm),
5535 ArgPack);
5536 }
5537
5538 case TYPE_INJECTED_CLASS_NAME: {
5539 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5540 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5541 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5542 // for AST reading, too much interdependencies.
5543 const Type *T = nullptr;
5544 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5545 if (const Type *Existing = DI->getTypeForDecl()) {
5546 T = Existing;
5547 break;
5548 }
5549 }
5550 if (!T) {
5551 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5552 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5553 DI->setTypeForDecl(T);
5554 }
5555 return QualType(T, 0);
5556 }
5557
5558 case TYPE_TEMPLATE_TYPE_PARM: {
5559 unsigned Idx = 0;
5560 unsigned Depth = Record[Idx++];
5561 unsigned Index = Record[Idx++];
5562 bool Pack = Record[Idx++];
5563 TemplateTypeParmDecl *D
5564 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5565 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5566 }
5567
5568 case TYPE_DEPENDENT_NAME: {
5569 unsigned Idx = 0;
5570 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5571 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5572 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5573 QualType Canon = readType(*Loc.F, Record, Idx);
5574 if (!Canon.isNull())
5575 Canon = Context.getCanonicalType(Canon);
5576 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5577 }
5578
5579 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5580 unsigned Idx = 0;
5581 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5582 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5583 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5584 unsigned NumArgs = Record[Idx++];
5585 SmallVector<TemplateArgument, 8> Args;
5586 Args.reserve(NumArgs);
5587 while (NumArgs--)
5588 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5589 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5590 Args.size(), Args.data());
5591 }
5592
5593 case TYPE_DEPENDENT_SIZED_ARRAY: {
5594 unsigned Idx = 0;
5595
5596 // ArrayType
5597 QualType ElementType = readType(*Loc.F, Record, Idx);
5598 ArrayType::ArraySizeModifier ASM
5599 = (ArrayType::ArraySizeModifier)Record[Idx++];
5600 unsigned IndexTypeQuals = Record[Idx++];
5601
5602 // DependentSizedArrayType
5603 Expr *NumElts = ReadExpr(*Loc.F);
5604 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5605
5606 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5607 IndexTypeQuals, Brackets);
5608 }
5609
5610 case TYPE_TEMPLATE_SPECIALIZATION: {
5611 unsigned Idx = 0;
5612 bool IsDependent = Record[Idx++];
5613 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5614 SmallVector<TemplateArgument, 8> Args;
5615 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5616 QualType Underlying = readType(*Loc.F, Record, Idx);
5617 QualType T;
5618 if (Underlying.isNull())
5619 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5620 Args.size());
5621 else
5622 T = Context.getTemplateSpecializationType(Name, Args.data(),
5623 Args.size(), Underlying);
5624 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5625 return T;
5626 }
5627
5628 case TYPE_ATOMIC: {
5629 if (Record.size() != 1) {
5630 Error("Incorrect encoding of atomic type");
5631 return QualType();
5632 }
5633 QualType ValueType = readType(*Loc.F, Record, Idx);
5634 return Context.getAtomicType(ValueType);
5635 }
5636 }
5637 llvm_unreachable("Invalid TypeCode!");
5638 }
5639
readExceptionSpec(ModuleFile & ModuleFile,SmallVectorImpl<QualType> & Exceptions,FunctionProtoType::ExceptionSpecInfo & ESI,const RecordData & Record,unsigned & Idx)5640 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5641 SmallVectorImpl<QualType> &Exceptions,
5642 FunctionProtoType::ExceptionSpecInfo &ESI,
5643 const RecordData &Record, unsigned &Idx) {
5644 ExceptionSpecificationType EST =
5645 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5646 ESI.Type = EST;
5647 if (EST == EST_Dynamic) {
5648 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
5649 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5650 ESI.Exceptions = Exceptions;
5651 } else if (EST == EST_ComputedNoexcept) {
5652 ESI.NoexceptExpr = ReadExpr(ModuleFile);
5653 } else if (EST == EST_Uninstantiated) {
5654 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5655 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5656 } else if (EST == EST_Unevaluated) {
5657 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5658 }
5659 }
5660
5661 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5662 ASTReader &Reader;
5663 ModuleFile &F;
5664 const ASTReader::RecordData &Record;
5665 unsigned &Idx;
5666
ReadSourceLocation(const ASTReader::RecordData & R,unsigned & I)5667 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5668 unsigned &I) {
5669 return Reader.ReadSourceLocation(F, R, I);
5670 }
5671
5672 template<typename T>
ReadDeclAs(const ASTReader::RecordData & Record,unsigned & Idx)5673 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5674 return Reader.ReadDeclAs<T>(F, Record, Idx);
5675 }
5676
5677 public:
TypeLocReader(ASTReader & Reader,ModuleFile & F,const ASTReader::RecordData & Record,unsigned & Idx)5678 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5679 const ASTReader::RecordData &Record, unsigned &Idx)
5680 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5681 { }
5682
5683 // We want compile-time assurance that we've enumerated all of
5684 // these, so unfortunately we have to declare them first, then
5685 // define them out-of-line.
5686 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5687 #define TYPELOC(CLASS, PARENT) \
5688 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5689 #include "clang/AST/TypeLocNodes.def"
5690
5691 void VisitFunctionTypeLoc(FunctionTypeLoc);
5692 void VisitArrayTypeLoc(ArrayTypeLoc);
5693 };
5694
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)5695 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5696 // nothing to do
5697 }
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)5698 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5699 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5700 if (TL.needsExtraLocalData()) {
5701 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5702 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5703 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5704 TL.setModeAttr(Record[Idx++]);
5705 }
5706 }
VisitComplexTypeLoc(ComplexTypeLoc TL)5707 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5708 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5709 }
VisitPointerTypeLoc(PointerTypeLoc TL)5710 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5711 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5712 }
VisitDecayedTypeLoc(DecayedTypeLoc TL)5713 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5714 // nothing to do
5715 }
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)5716 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5717 // nothing to do
5718 }
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)5719 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5720 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5721 }
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)5722 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5723 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5724 }
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)5725 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5726 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5727 }
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)5728 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5729 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5730 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5731 }
VisitArrayTypeLoc(ArrayTypeLoc TL)5732 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5733 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5734 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5735 if (Record[Idx++])
5736 TL.setSizeExpr(Reader.ReadExpr(F));
5737 else
5738 TL.setSizeExpr(nullptr);
5739 }
VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL)5740 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5741 VisitArrayTypeLoc(TL);
5742 }
VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL)5743 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5744 VisitArrayTypeLoc(TL);
5745 }
VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL)5746 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5747 VisitArrayTypeLoc(TL);
5748 }
VisitDependentSizedArrayTypeLoc(DependentSizedArrayTypeLoc TL)5749 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5750 DependentSizedArrayTypeLoc TL) {
5751 VisitArrayTypeLoc(TL);
5752 }
VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL)5753 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5754 DependentSizedExtVectorTypeLoc TL) {
5755 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5756 }
VisitVectorTypeLoc(VectorTypeLoc TL)5757 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5758 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5759 }
VisitExtVectorTypeLoc(ExtVectorTypeLoc TL)5760 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5761 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5762 }
VisitFunctionTypeLoc(FunctionTypeLoc TL)5763 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5764 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5765 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5766 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5767 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5768 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5769 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5770 }
5771 }
VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL)5772 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5773 VisitFunctionTypeLoc(TL);
5774 }
VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL)5775 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5776 VisitFunctionTypeLoc(TL);
5777 }
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)5778 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5779 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5780 }
VisitTypedefTypeLoc(TypedefTypeLoc TL)5781 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5782 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5783 }
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)5784 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5785 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5786 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5787 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5788 }
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)5789 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5790 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5791 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5792 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5793 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5794 }
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)5795 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5796 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5797 }
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)5798 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5799 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5800 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5801 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5802 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5803 }
VisitAutoTypeLoc(AutoTypeLoc TL)5804 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5805 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5806 }
VisitRecordTypeLoc(RecordTypeLoc TL)5807 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5808 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5809 }
VisitEnumTypeLoc(EnumTypeLoc TL)5810 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5811 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5812 }
VisitAttributedTypeLoc(AttributedTypeLoc TL)5813 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5814 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5815 if (TL.hasAttrOperand()) {
5816 SourceRange range;
5817 range.setBegin(ReadSourceLocation(Record, Idx));
5818 range.setEnd(ReadSourceLocation(Record, Idx));
5819 TL.setAttrOperandParensRange(range);
5820 }
5821 if (TL.hasAttrExprOperand()) {
5822 if (Record[Idx++])
5823 TL.setAttrExprOperand(Reader.ReadExpr(F));
5824 else
5825 TL.setAttrExprOperand(nullptr);
5826 } else if (TL.hasAttrEnumOperand())
5827 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5828 }
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)5829 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5830 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5831 }
VisitSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL)5832 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5833 SubstTemplateTypeParmTypeLoc TL) {
5834 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5835 }
VisitSubstTemplateTypeParmPackTypeLoc(SubstTemplateTypeParmPackTypeLoc TL)5836 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5837 SubstTemplateTypeParmPackTypeLoc TL) {
5838 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5839 }
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)5840 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5841 TemplateSpecializationTypeLoc TL) {
5842 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5843 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5844 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5845 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5846 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5847 TL.setArgLocInfo(i,
5848 Reader.GetTemplateArgumentLocInfo(F,
5849 TL.getTypePtr()->getArg(i).getKind(),
5850 Record, Idx));
5851 }
VisitParenTypeLoc(ParenTypeLoc TL)5852 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5853 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5854 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5855 }
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)5856 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5857 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5858 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5859 }
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)5860 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5861 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5862 }
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)5863 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5864 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5865 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5866 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5867 }
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)5868 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5869 DependentTemplateSpecializationTypeLoc TL) {
5870 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5871 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5872 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5873 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5874 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5875 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5876 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5877 TL.setArgLocInfo(I,
5878 Reader.GetTemplateArgumentLocInfo(F,
5879 TL.getTypePtr()->getArg(I).getKind(),
5880 Record, Idx));
5881 }
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)5882 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5883 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5884 }
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)5885 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5886 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5887 }
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)5888 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5889 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5890 TL.setTypeArgsLAngleLoc(ReadSourceLocation(Record, Idx));
5891 TL.setTypeArgsRAngleLoc(ReadSourceLocation(Record, Idx));
5892 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
5893 TL.setTypeArgTInfo(i, Reader.GetTypeSourceInfo(F, Record, Idx));
5894 TL.setProtocolLAngleLoc(ReadSourceLocation(Record, Idx));
5895 TL.setProtocolRAngleLoc(ReadSourceLocation(Record, Idx));
5896 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5897 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5898 }
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)5899 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5900 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5901 }
VisitAtomicTypeLoc(AtomicTypeLoc TL)5902 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5903 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5904 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5905 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5906 }
5907
GetTypeSourceInfo(ModuleFile & F,const RecordData & Record,unsigned & Idx)5908 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5909 const RecordData &Record,
5910 unsigned &Idx) {
5911 QualType InfoTy = readType(F, Record, Idx);
5912 if (InfoTy.isNull())
5913 return nullptr;
5914
5915 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5916 TypeLocReader TLR(*this, F, Record, Idx);
5917 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5918 TLR.Visit(TL);
5919 return TInfo;
5920 }
5921
GetType(TypeID ID)5922 QualType ASTReader::GetType(TypeID ID) {
5923 unsigned FastQuals = ID & Qualifiers::FastMask;
5924 unsigned Index = ID >> Qualifiers::FastWidth;
5925
5926 if (Index < NUM_PREDEF_TYPE_IDS) {
5927 QualType T;
5928 switch ((PredefinedTypeIDs)Index) {
5929 case PREDEF_TYPE_NULL_ID:
5930 return QualType();
5931 case PREDEF_TYPE_VOID_ID:
5932 T = Context.VoidTy;
5933 break;
5934 case PREDEF_TYPE_BOOL_ID:
5935 T = Context.BoolTy;
5936 break;
5937
5938 case PREDEF_TYPE_CHAR_U_ID:
5939 case PREDEF_TYPE_CHAR_S_ID:
5940 // FIXME: Check that the signedness of CharTy is correct!
5941 T = Context.CharTy;
5942 break;
5943
5944 case PREDEF_TYPE_UCHAR_ID:
5945 T = Context.UnsignedCharTy;
5946 break;
5947 case PREDEF_TYPE_USHORT_ID:
5948 T = Context.UnsignedShortTy;
5949 break;
5950 case PREDEF_TYPE_UINT_ID:
5951 T = Context.UnsignedIntTy;
5952 break;
5953 case PREDEF_TYPE_ULONG_ID:
5954 T = Context.UnsignedLongTy;
5955 break;
5956 case PREDEF_TYPE_ULONGLONG_ID:
5957 T = Context.UnsignedLongLongTy;
5958 break;
5959 case PREDEF_TYPE_UINT128_ID:
5960 T = Context.UnsignedInt128Ty;
5961 break;
5962 case PREDEF_TYPE_SCHAR_ID:
5963 T = Context.SignedCharTy;
5964 break;
5965 case PREDEF_TYPE_WCHAR_ID:
5966 T = Context.WCharTy;
5967 break;
5968 case PREDEF_TYPE_SHORT_ID:
5969 T = Context.ShortTy;
5970 break;
5971 case PREDEF_TYPE_INT_ID:
5972 T = Context.IntTy;
5973 break;
5974 case PREDEF_TYPE_LONG_ID:
5975 T = Context.LongTy;
5976 break;
5977 case PREDEF_TYPE_LONGLONG_ID:
5978 T = Context.LongLongTy;
5979 break;
5980 case PREDEF_TYPE_INT128_ID:
5981 T = Context.Int128Ty;
5982 break;
5983 case PREDEF_TYPE_HALF_ID:
5984 T = Context.HalfTy;
5985 break;
5986 case PREDEF_TYPE_FLOAT_ID:
5987 T = Context.FloatTy;
5988 break;
5989 case PREDEF_TYPE_DOUBLE_ID:
5990 T = Context.DoubleTy;
5991 break;
5992 case PREDEF_TYPE_LONGDOUBLE_ID:
5993 T = Context.LongDoubleTy;
5994 break;
5995 case PREDEF_TYPE_OVERLOAD_ID:
5996 T = Context.OverloadTy;
5997 break;
5998 case PREDEF_TYPE_BOUND_MEMBER:
5999 T = Context.BoundMemberTy;
6000 break;
6001 case PREDEF_TYPE_PSEUDO_OBJECT:
6002 T = Context.PseudoObjectTy;
6003 break;
6004 case PREDEF_TYPE_DEPENDENT_ID:
6005 T = Context.DependentTy;
6006 break;
6007 case PREDEF_TYPE_UNKNOWN_ANY:
6008 T = Context.UnknownAnyTy;
6009 break;
6010 case PREDEF_TYPE_NULLPTR_ID:
6011 T = Context.NullPtrTy;
6012 break;
6013 case PREDEF_TYPE_CHAR16_ID:
6014 T = Context.Char16Ty;
6015 break;
6016 case PREDEF_TYPE_CHAR32_ID:
6017 T = Context.Char32Ty;
6018 break;
6019 case PREDEF_TYPE_OBJC_ID:
6020 T = Context.ObjCBuiltinIdTy;
6021 break;
6022 case PREDEF_TYPE_OBJC_CLASS:
6023 T = Context.ObjCBuiltinClassTy;
6024 break;
6025 case PREDEF_TYPE_OBJC_SEL:
6026 T = Context.ObjCBuiltinSelTy;
6027 break;
6028 case PREDEF_TYPE_IMAGE1D_ID:
6029 T = Context.OCLImage1dTy;
6030 break;
6031 case PREDEF_TYPE_IMAGE1D_ARR_ID:
6032 T = Context.OCLImage1dArrayTy;
6033 break;
6034 case PREDEF_TYPE_IMAGE1D_BUFF_ID:
6035 T = Context.OCLImage1dBufferTy;
6036 break;
6037 case PREDEF_TYPE_IMAGE2D_ID:
6038 T = Context.OCLImage2dTy;
6039 break;
6040 case PREDEF_TYPE_IMAGE2D_ARR_ID:
6041 T = Context.OCLImage2dArrayTy;
6042 break;
6043 case PREDEF_TYPE_IMAGE2D_DEP_ID:
6044 T = Context.OCLImage2dDepthTy;
6045 break;
6046 case PREDEF_TYPE_IMAGE2D_ARR_DEP_ID:
6047 T = Context.OCLImage2dArrayDepthTy;
6048 break;
6049 case PREDEF_TYPE_IMAGE2D_MSAA_ID:
6050 T = Context.OCLImage2dMSAATy;
6051 break;
6052 case PREDEF_TYPE_IMAGE2D_ARR_MSAA_ID:
6053 T = Context.OCLImage2dArrayMSAATy;
6054 break;
6055 case PREDEF_TYPE_IMAGE2D_MSAA_DEP_ID:
6056 T = Context.OCLImage2dMSAADepthTy;
6057 break;
6058 case PREDEF_TYPE_IMAGE2D_ARR_MSAA_DEPTH_ID:
6059 T = Context.OCLImage2dArrayMSAADepthTy;
6060 break;
6061 case PREDEF_TYPE_IMAGE3D_ID:
6062 T = Context.OCLImage3dTy;
6063 break;
6064 case PREDEF_TYPE_SAMPLER_ID:
6065 T = Context.OCLSamplerTy;
6066 break;
6067 case PREDEF_TYPE_EVENT_ID:
6068 T = Context.OCLEventTy;
6069 break;
6070 case PREDEF_TYPE_CLK_EVENT_ID:
6071 T = Context.OCLClkEventTy;
6072 break;
6073 case PREDEF_TYPE_QUEUE_ID:
6074 T = Context.OCLQueueTy;
6075 break;
6076 case PREDEF_TYPE_NDRANGE_ID:
6077 T = Context.OCLNDRangeTy;
6078 break;
6079 case PREDEF_TYPE_RESERVE_ID_ID:
6080 T = Context.OCLReserveIDTy;
6081 break;
6082 case PREDEF_TYPE_AUTO_DEDUCT:
6083 T = Context.getAutoDeductType();
6084 break;
6085
6086 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6087 T = Context.getAutoRRefDeductType();
6088 break;
6089
6090 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6091 T = Context.ARCUnbridgedCastTy;
6092 break;
6093
6094 case PREDEF_TYPE_BUILTIN_FN:
6095 T = Context.BuiltinFnTy;
6096 break;
6097
6098 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6099 T = Context.OMPArraySectionTy;
6100 break;
6101 }
6102
6103 assert(!T.isNull() && "Unknown predefined type");
6104 return T.withFastQualifiers(FastQuals);
6105 }
6106
6107 Index -= NUM_PREDEF_TYPE_IDS;
6108 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6109 if (TypesLoaded[Index].isNull()) {
6110 TypesLoaded[Index] = readTypeRecord(Index);
6111 if (TypesLoaded[Index].isNull())
6112 return QualType();
6113
6114 TypesLoaded[Index]->setFromAST();
6115 if (DeserializationListener)
6116 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6117 TypesLoaded[Index]);
6118 }
6119
6120 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6121 }
6122
getLocalType(ModuleFile & F,unsigned LocalID)6123 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6124 return GetType(getGlobalTypeID(F, LocalID));
6125 }
6126
6127 serialization::TypeID
getGlobalTypeID(ModuleFile & F,unsigned LocalID) const6128 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6129 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6130 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6131
6132 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6133 return LocalID;
6134
6135 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6136 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6137 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6138
6139 unsigned GlobalIndex = LocalIndex + I->second;
6140 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6141 }
6142
6143 TemplateArgumentLocInfo
GetTemplateArgumentLocInfo(ModuleFile & F,TemplateArgument::ArgKind Kind,const RecordData & Record,unsigned & Index)6144 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6145 TemplateArgument::ArgKind Kind,
6146 const RecordData &Record,
6147 unsigned &Index) {
6148 switch (Kind) {
6149 case TemplateArgument::Expression:
6150 return ReadExpr(F);
6151 case TemplateArgument::Type:
6152 return GetTypeSourceInfo(F, Record, Index);
6153 case TemplateArgument::Template: {
6154 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6155 Index);
6156 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6157 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6158 SourceLocation());
6159 }
6160 case TemplateArgument::TemplateExpansion: {
6161 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6162 Index);
6163 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6164 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6165 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6166 EllipsisLoc);
6167 }
6168 case TemplateArgument::Null:
6169 case TemplateArgument::Integral:
6170 case TemplateArgument::Declaration:
6171 case TemplateArgument::NullPtr:
6172 case TemplateArgument::Pack:
6173 // FIXME: Is this right?
6174 return TemplateArgumentLocInfo();
6175 }
6176 llvm_unreachable("unexpected template argument loc");
6177 }
6178
6179 TemplateArgumentLoc
ReadTemplateArgumentLoc(ModuleFile & F,const RecordData & Record,unsigned & Index)6180 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6181 const RecordData &Record, unsigned &Index) {
6182 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6183
6184 if (Arg.getKind() == TemplateArgument::Expression) {
6185 if (Record[Index++]) // bool InfoHasSameExpr.
6186 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6187 }
6188 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6189 Record, Index));
6190 }
6191
6192 const ASTTemplateArgumentListInfo*
ReadASTTemplateArgumentListInfo(ModuleFile & F,const RecordData & Record,unsigned & Index)6193 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6194 const RecordData &Record,
6195 unsigned &Index) {
6196 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6197 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6198 unsigned NumArgsAsWritten = Record[Index++];
6199 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6200 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6201 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6202 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6203 }
6204
GetExternalDecl(uint32_t ID)6205 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6206 return GetDecl(ID);
6207 }
6208
6209 template<typename TemplateSpecializationDecl>
completeRedeclChainForTemplateSpecialization(Decl * D)6210 static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6211 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6212 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6213 }
6214
CompleteRedeclChain(const Decl * D)6215 void ASTReader::CompleteRedeclChain(const Decl *D) {
6216 if (NumCurrentElementsDeserializing) {
6217 // We arrange to not care about the complete redeclaration chain while we're
6218 // deserializing. Just remember that the AST has marked this one as complete
6219 // but that it's not actually complete yet, so we know we still need to
6220 // complete it later.
6221 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6222 return;
6223 }
6224
6225 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6226
6227 // If this is a named declaration, complete it by looking it up
6228 // within its context.
6229 //
6230 // FIXME: Merging a function definition should merge
6231 // all mergeable entities within it.
6232 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6233 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6234 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6235 if (!getContext().getLangOpts().CPlusPlus &&
6236 isa<TranslationUnitDecl>(DC)) {
6237 // Outside of C++, we don't have a lookup table for the TU, so update
6238 // the identifier instead. (For C++ modules, we don't store decls
6239 // in the serialized identifier table, so we do the lookup in the TU.)
6240 auto *II = Name.getAsIdentifierInfo();
6241 assert(II && "non-identifier name in C?");
6242 if (II->isOutOfDate())
6243 updateOutOfDateIdentifier(*II);
6244 } else
6245 DC->lookup(Name);
6246 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6247 // Find all declarations of this kind from the relevant context.
6248 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
6249 auto *DC = cast<DeclContext>(DCDecl);
6250 SmallVector<Decl*, 8> Decls;
6251 FindExternalLexicalDecls(
6252 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
6253 }
6254 }
6255 }
6256
6257 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6258 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6259 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6260 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6261 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6262 if (auto *Template = FD->getPrimaryTemplate())
6263 Template->LoadLazySpecializations();
6264 }
6265 }
6266
ReadCXXCtorInitializersRef(ModuleFile & M,const RecordData & Record,unsigned & Idx)6267 uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M,
6268 const RecordData &Record,
6269 unsigned &Idx) {
6270 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) {
6271 Error("malformed AST file: missing C++ ctor initializers");
6272 return 0;
6273 }
6274
6275 unsigned LocalID = Record[Idx++];
6276 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]);
6277 }
6278
6279 CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)6280 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
6281 RecordLocation Loc = getLocalBitOffset(Offset);
6282 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6283 SavedStreamPosition SavedPosition(Cursor);
6284 Cursor.JumpToBit(Loc.Offset);
6285 ReadingKindTracker ReadingKind(Read_Decl, *this);
6286
6287 RecordData Record;
6288 unsigned Code = Cursor.ReadCode();
6289 unsigned RecCode = Cursor.readRecord(Code, Record);
6290 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
6291 Error("malformed AST file: missing C++ ctor initializers");
6292 return nullptr;
6293 }
6294
6295 unsigned Idx = 0;
6296 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
6297 }
6298
readCXXBaseSpecifiers(ModuleFile & M,const RecordData & Record,unsigned & Idx)6299 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6300 const RecordData &Record,
6301 unsigned &Idx) {
6302 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6303 Error("malformed AST file: missing C++ base specifier");
6304 return 0;
6305 }
6306
6307 unsigned LocalID = Record[Idx++];
6308 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6309 }
6310
GetExternalCXXBaseSpecifiers(uint64_t Offset)6311 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6312 RecordLocation Loc = getLocalBitOffset(Offset);
6313 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6314 SavedStreamPosition SavedPosition(Cursor);
6315 Cursor.JumpToBit(Loc.Offset);
6316 ReadingKindTracker ReadingKind(Read_Decl, *this);
6317 RecordData Record;
6318 unsigned Code = Cursor.ReadCode();
6319 unsigned RecCode = Cursor.readRecord(Code, Record);
6320 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6321 Error("malformed AST file: missing C++ base specifiers");
6322 return nullptr;
6323 }
6324
6325 unsigned Idx = 0;
6326 unsigned NumBases = Record[Idx++];
6327 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6328 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6329 for (unsigned I = 0; I != NumBases; ++I)
6330 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6331 return Bases;
6332 }
6333
6334 serialization::DeclID
getGlobalDeclID(ModuleFile & F,LocalDeclID LocalID) const6335 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6336 if (LocalID < NUM_PREDEF_DECL_IDS)
6337 return LocalID;
6338
6339 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6340 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6341 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6342
6343 return LocalID + I->second;
6344 }
6345
isDeclIDFromModule(serialization::GlobalDeclID ID,ModuleFile & M) const6346 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6347 ModuleFile &M) const {
6348 // Predefined decls aren't from any module.
6349 if (ID < NUM_PREDEF_DECL_IDS)
6350 return false;
6351
6352 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
6353 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
6354 }
6355
getOwningModuleFile(const Decl * D)6356 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6357 if (!D->isFromASTFile())
6358 return nullptr;
6359 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6360 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6361 return I->second;
6362 }
6363
getSourceLocationForDeclID(GlobalDeclID ID)6364 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6365 if (ID < NUM_PREDEF_DECL_IDS)
6366 return SourceLocation();
6367
6368 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6369
6370 if (Index > DeclsLoaded.size()) {
6371 Error("declaration ID out-of-range for AST file");
6372 return SourceLocation();
6373 }
6374
6375 if (Decl *D = DeclsLoaded[Index])
6376 return D->getLocation();
6377
6378 unsigned RawLocation = 0;
6379 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6380 return ReadSourceLocation(*Rec.F, RawLocation);
6381 }
6382
getPredefinedDecl(ASTContext & Context,PredefinedDeclIDs ID)6383 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6384 switch (ID) {
6385 case PREDEF_DECL_NULL_ID:
6386 return nullptr;
6387
6388 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6389 return Context.getTranslationUnitDecl();
6390
6391 case PREDEF_DECL_OBJC_ID_ID:
6392 return Context.getObjCIdDecl();
6393
6394 case PREDEF_DECL_OBJC_SEL_ID:
6395 return Context.getObjCSelDecl();
6396
6397 case PREDEF_DECL_OBJC_CLASS_ID:
6398 return Context.getObjCClassDecl();
6399
6400 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6401 return Context.getObjCProtocolDecl();
6402
6403 case PREDEF_DECL_INT_128_ID:
6404 return Context.getInt128Decl();
6405
6406 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6407 return Context.getUInt128Decl();
6408
6409 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6410 return Context.getObjCInstanceTypeDecl();
6411
6412 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6413 return Context.getBuiltinVaListDecl();
6414
6415 case PREDEF_DECL_VA_LIST_TAG:
6416 return Context.getVaListTagDecl();
6417
6418 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
6419 return Context.getBuiltinMSVaListDecl();
6420
6421 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6422 return Context.getExternCContextDecl();
6423
6424 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
6425 return Context.getMakeIntegerSeqDecl();
6426 }
6427 llvm_unreachable("PredefinedDeclIDs unknown enum value");
6428 }
6429
GetExistingDecl(DeclID ID)6430 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6431 if (ID < NUM_PREDEF_DECL_IDS) {
6432 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6433 if (D) {
6434 // Track that we have merged the declaration with ID \p ID into the
6435 // pre-existing predefined declaration \p D.
6436 auto &Merged = KeyDecls[D->getCanonicalDecl()];
6437 if (Merged.empty())
6438 Merged.push_back(ID);
6439 }
6440 return D;
6441 }
6442
6443 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6444
6445 if (Index >= DeclsLoaded.size()) {
6446 assert(0 && "declaration ID out-of-range for AST file");
6447 Error("declaration ID out-of-range for AST file");
6448 return nullptr;
6449 }
6450
6451 return DeclsLoaded[Index];
6452 }
6453
GetDecl(DeclID ID)6454 Decl *ASTReader::GetDecl(DeclID ID) {
6455 if (ID < NUM_PREDEF_DECL_IDS)
6456 return GetExistingDecl(ID);
6457
6458 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6459
6460 if (Index >= DeclsLoaded.size()) {
6461 assert(0 && "declaration ID out-of-range for AST file");
6462 Error("declaration ID out-of-range for AST file");
6463 return nullptr;
6464 }
6465
6466 if (!DeclsLoaded[Index]) {
6467 ReadDeclRecord(ID);
6468 if (DeserializationListener)
6469 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6470 }
6471
6472 return DeclsLoaded[Index];
6473 }
6474
mapGlobalIDToModuleFileGlobalID(ModuleFile & M,DeclID GlobalID)6475 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6476 DeclID GlobalID) {
6477 if (GlobalID < NUM_PREDEF_DECL_IDS)
6478 return GlobalID;
6479
6480 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6481 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6482 ModuleFile *Owner = I->second;
6483
6484 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6485 = M.GlobalToLocalDeclIDs.find(Owner);
6486 if (Pos == M.GlobalToLocalDeclIDs.end())
6487 return 0;
6488
6489 return GlobalID - Owner->BaseDeclID + Pos->second;
6490 }
6491
ReadDeclID(ModuleFile & F,const RecordData & Record,unsigned & Idx)6492 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6493 const RecordData &Record,
6494 unsigned &Idx) {
6495 if (Idx >= Record.size()) {
6496 Error("Corrupted AST file");
6497 return 0;
6498 }
6499
6500 return getGlobalDeclID(F, Record[Idx++]);
6501 }
6502
6503 /// \brief Resolve the offset of a statement into a statement.
6504 ///
6505 /// This operation will read a new statement from the external
6506 /// source each time it is called, and is meant to be used via a
6507 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
GetExternalDeclStmt(uint64_t Offset)6508 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6509 // Switch case IDs are per Decl.
6510 ClearSwitchCaseIDs();
6511
6512 // Offset here is a global offset across the entire chain.
6513 RecordLocation Loc = getLocalBitOffset(Offset);
6514 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6515 return ReadStmtFromStream(*Loc.F);
6516 }
6517
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Decls)6518 void ASTReader::FindExternalLexicalDecls(
6519 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
6520 SmallVectorImpl<Decl *> &Decls) {
6521 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
6522
6523 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
6524 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
6525 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
6526 auto K = (Decl::Kind)+LexicalDecls[I];
6527 if (!IsKindWeWant(K))
6528 continue;
6529
6530 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
6531
6532 // Don't add predefined declarations to the lexical context more
6533 // than once.
6534 if (ID < NUM_PREDEF_DECL_IDS) {
6535 if (PredefsVisited[ID])
6536 continue;
6537
6538 PredefsVisited[ID] = true;
6539 }
6540
6541 if (Decl *D = GetLocalDecl(*M, ID)) {
6542 assert(D->getKind() == K && "wrong kind for lexical decl");
6543 if (!DC->isDeclInLexicalTraversal(D))
6544 Decls.push_back(D);
6545 }
6546 }
6547 };
6548
6549 if (isa<TranslationUnitDecl>(DC)) {
6550 for (auto Lexical : TULexicalDecls)
6551 Visit(Lexical.first, Lexical.second);
6552 } else {
6553 auto I = LexicalDecls.find(DC);
6554 if (I != LexicalDecls.end())
6555 Visit(I->second.first, I->second.second);
6556 }
6557
6558 ++NumLexicalDeclContextsRead;
6559 }
6560
6561 namespace {
6562
6563 class DeclIDComp {
6564 ASTReader &Reader;
6565 ModuleFile &Mod;
6566
6567 public:
DeclIDComp(ASTReader & Reader,ModuleFile & M)6568 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6569
operator ()(LocalDeclID L,LocalDeclID R) const6570 bool operator()(LocalDeclID L, LocalDeclID R) const {
6571 SourceLocation LHS = getLocation(L);
6572 SourceLocation RHS = getLocation(R);
6573 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6574 }
6575
operator ()(SourceLocation LHS,LocalDeclID R) const6576 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6577 SourceLocation RHS = getLocation(R);
6578 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6579 }
6580
operator ()(LocalDeclID L,SourceLocation RHS) const6581 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6582 SourceLocation LHS = getLocation(L);
6583 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6584 }
6585
getLocation(LocalDeclID ID) const6586 SourceLocation getLocation(LocalDeclID ID) const {
6587 return Reader.getSourceManager().getFileLoc(
6588 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6589 }
6590 };
6591
6592 }
6593
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)6594 void ASTReader::FindFileRegionDecls(FileID File,
6595 unsigned Offset, unsigned Length,
6596 SmallVectorImpl<Decl *> &Decls) {
6597 SourceManager &SM = getSourceManager();
6598
6599 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6600 if (I == FileDeclIDs.end())
6601 return;
6602
6603 FileDeclsInfo &DInfo = I->second;
6604 if (DInfo.Decls.empty())
6605 return;
6606
6607 SourceLocation
6608 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6609 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6610
6611 DeclIDComp DIDComp(*this, *DInfo.Mod);
6612 ArrayRef<serialization::LocalDeclID>::iterator
6613 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6614 BeginLoc, DIDComp);
6615 if (BeginIt != DInfo.Decls.begin())
6616 --BeginIt;
6617
6618 // If we are pointing at a top-level decl inside an objc container, we need
6619 // to backtrack until we find it otherwise we will fail to report that the
6620 // region overlaps with an objc container.
6621 while (BeginIt != DInfo.Decls.begin() &&
6622 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6623 ->isTopLevelDeclInObjCContainer())
6624 --BeginIt;
6625
6626 ArrayRef<serialization::LocalDeclID>::iterator
6627 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6628 EndLoc, DIDComp);
6629 if (EndIt != DInfo.Decls.end())
6630 ++EndIt;
6631
6632 for (ArrayRef<serialization::LocalDeclID>::iterator
6633 DIt = BeginIt; DIt != EndIt; ++DIt)
6634 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6635 }
6636
6637 bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)6638 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6639 DeclarationName Name) {
6640 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
6641 "DeclContext has no visible decls in storage");
6642 if (!Name)
6643 return false;
6644
6645 auto It = Lookups.find(DC);
6646 if (It == Lookups.end())
6647 return false;
6648
6649 Deserializing LookupResults(this);
6650
6651 // Load the list of declarations.
6652 SmallVector<NamedDecl *, 64> Decls;
6653 for (DeclID ID : It->second.Table.find(Name)) {
6654 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6655 if (ND->getDeclName() == Name)
6656 Decls.push_back(ND);
6657 }
6658
6659 ++NumVisibleDeclContextsRead;
6660 SetExternalVisibleDeclsForName(DC, Name, Decls);
6661 return !Decls.empty();
6662 }
6663
completeVisibleDeclsMap(const DeclContext * DC)6664 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6665 if (!DC->hasExternalVisibleStorage())
6666 return;
6667
6668 auto It = Lookups.find(DC);
6669 assert(It != Lookups.end() &&
6670 "have external visible storage but no lookup tables");
6671
6672 DeclsMap Decls;
6673
6674 for (DeclID ID : It->second.Table.findAll()) {
6675 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6676 Decls[ND->getDeclName()].push_back(ND);
6677 }
6678
6679 ++NumVisibleDeclContextsRead;
6680
6681 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6682 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6683 }
6684 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6685 }
6686
6687 const serialization::reader::DeclContextLookupTable *
getLoadedLookupTables(DeclContext * Primary) const6688 ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
6689 auto I = Lookups.find(Primary);
6690 return I == Lookups.end() ? nullptr : &I->second;
6691 }
6692
6693 /// \brief Under non-PCH compilation the consumer receives the objc methods
6694 /// before receiving the implementation, and codegen depends on this.
6695 /// We simulate this by deserializing and passing to consumer the methods of the
6696 /// implementation before passing the deserialized implementation decl.
PassObjCImplDeclToConsumer(ObjCImplDecl * ImplD,ASTConsumer * Consumer)6697 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6698 ASTConsumer *Consumer) {
6699 assert(ImplD && Consumer);
6700
6701 for (auto *I : ImplD->methods())
6702 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6703
6704 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6705 }
6706
PassInterestingDeclsToConsumer()6707 void ASTReader::PassInterestingDeclsToConsumer() {
6708 assert(Consumer);
6709
6710 if (PassingDeclsToConsumer)
6711 return;
6712
6713 // Guard variable to avoid recursively redoing the process of passing
6714 // decls to consumer.
6715 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6716 true);
6717
6718 // Ensure that we've loaded all potentially-interesting declarations
6719 // that need to be eagerly loaded.
6720 for (auto ID : EagerlyDeserializedDecls)
6721 GetDecl(ID);
6722 EagerlyDeserializedDecls.clear();
6723
6724 while (!InterestingDecls.empty()) {
6725 Decl *D = InterestingDecls.front();
6726 InterestingDecls.pop_front();
6727
6728 PassInterestingDeclToConsumer(D);
6729 }
6730 }
6731
PassInterestingDeclToConsumer(Decl * D)6732 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6733 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6734 PassObjCImplDeclToConsumer(ImplD, Consumer);
6735 else
6736 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6737 }
6738
StartTranslationUnit(ASTConsumer * Consumer)6739 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6740 this->Consumer = Consumer;
6741
6742 if (Consumer)
6743 PassInterestingDeclsToConsumer();
6744
6745 if (DeserializationListener)
6746 DeserializationListener->ReaderInitialized(this);
6747 }
6748
PrintStats()6749 void ASTReader::PrintStats() {
6750 std::fprintf(stderr, "*** AST File Statistics:\n");
6751
6752 unsigned NumTypesLoaded
6753 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6754 QualType());
6755 unsigned NumDeclsLoaded
6756 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6757 (Decl *)nullptr);
6758 unsigned NumIdentifiersLoaded
6759 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6760 IdentifiersLoaded.end(),
6761 (IdentifierInfo *)nullptr);
6762 unsigned NumMacrosLoaded
6763 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6764 MacrosLoaded.end(),
6765 (MacroInfo *)nullptr);
6766 unsigned NumSelectorsLoaded
6767 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6768 SelectorsLoaded.end(),
6769 Selector());
6770
6771 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6772 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6773 NumSLocEntriesRead, TotalNumSLocEntries,
6774 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6775 if (!TypesLoaded.empty())
6776 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6777 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6778 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6779 if (!DeclsLoaded.empty())
6780 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6781 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6782 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6783 if (!IdentifiersLoaded.empty())
6784 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6785 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6786 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6787 if (!MacrosLoaded.empty())
6788 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6789 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6790 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6791 if (!SelectorsLoaded.empty())
6792 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6793 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6794 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6795 if (TotalNumStatements)
6796 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6797 NumStatementsRead, TotalNumStatements,
6798 ((float)NumStatementsRead/TotalNumStatements * 100));
6799 if (TotalNumMacros)
6800 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6801 NumMacrosRead, TotalNumMacros,
6802 ((float)NumMacrosRead/TotalNumMacros * 100));
6803 if (TotalLexicalDeclContexts)
6804 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6805 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6806 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6807 * 100));
6808 if (TotalVisibleDeclContexts)
6809 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6810 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6811 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6812 * 100));
6813 if (TotalNumMethodPoolEntries) {
6814 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6815 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6816 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6817 * 100));
6818 }
6819 if (NumMethodPoolLookups) {
6820 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6821 NumMethodPoolHits, NumMethodPoolLookups,
6822 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6823 }
6824 if (NumMethodPoolTableLookups) {
6825 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6826 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6827 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6828 * 100.0));
6829 }
6830
6831 if (NumIdentifierLookupHits) {
6832 std::fprintf(stderr,
6833 " %u / %u identifier table lookups succeeded (%f%%)\n",
6834 NumIdentifierLookupHits, NumIdentifierLookups,
6835 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6836 }
6837
6838 if (GlobalIndex) {
6839 std::fprintf(stderr, "\n");
6840 GlobalIndex->printStats();
6841 }
6842
6843 std::fprintf(stderr, "\n");
6844 dump();
6845 std::fprintf(stderr, "\n");
6846 }
6847
6848 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6849 static void
dumpModuleIDMap(StringRef Name,const ContinuousRangeMap<Key,ModuleFile *,InitialCapacity> & Map)6850 dumpModuleIDMap(StringRef Name,
6851 const ContinuousRangeMap<Key, ModuleFile *,
6852 InitialCapacity> &Map) {
6853 if (Map.begin() == Map.end())
6854 return;
6855
6856 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6857 llvm::errs() << Name << ":\n";
6858 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6859 I != IEnd; ++I) {
6860 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6861 << "\n";
6862 }
6863 }
6864
dump()6865 void ASTReader::dump() {
6866 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6867 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6868 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6869 dumpModuleIDMap("Global type map", GlobalTypeMap);
6870 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6871 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6872 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6873 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6874 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6875 dumpModuleIDMap("Global preprocessed entity map",
6876 GlobalPreprocessedEntityMap);
6877
6878 llvm::errs() << "\n*** PCH/Modules Loaded:";
6879 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6880 MEnd = ModuleMgr.end();
6881 M != MEnd; ++M)
6882 (*M)->dump();
6883 }
6884
6885 /// Return the amount of memory used by memory buffers, breaking down
6886 /// by heap-backed versus mmap'ed memory.
getMemoryBufferSizes(MemoryBufferSizes & sizes) const6887 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6888 for (ModuleConstIterator I = ModuleMgr.begin(),
6889 E = ModuleMgr.end(); I != E; ++I) {
6890 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6891 size_t bytes = buf->getBufferSize();
6892 switch (buf->getBufferKind()) {
6893 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6894 sizes.malloc_bytes += bytes;
6895 break;
6896 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6897 sizes.mmap_bytes += bytes;
6898 break;
6899 }
6900 }
6901 }
6902 }
6903
InitializeSema(Sema & S)6904 void ASTReader::InitializeSema(Sema &S) {
6905 SemaObj = &S;
6906 S.addExternalSource(this);
6907
6908 // Makes sure any declarations that were deserialized "too early"
6909 // still get added to the identifier's declaration chains.
6910 for (uint64_t ID : PreloadedDeclIDs) {
6911 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6912 pushExternalDeclIntoScope(D, D->getDeclName());
6913 }
6914 PreloadedDeclIDs.clear();
6915
6916 // FIXME: What happens if these are changed by a module import?
6917 if (!FPPragmaOptions.empty()) {
6918 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6919 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6920 }
6921
6922 // FIXME: What happens if these are changed by a module import?
6923 if (!OpenCLExtensions.empty()) {
6924 unsigned I = 0;
6925 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6926 #include "clang/Basic/OpenCLExtensions.def"
6927
6928 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6929 }
6930
6931 UpdateSema();
6932 }
6933
UpdateSema()6934 void ASTReader::UpdateSema() {
6935 assert(SemaObj && "no Sema to update");
6936
6937 // Load the offsets of the declarations that Sema references.
6938 // They will be lazily deserialized when needed.
6939 if (!SemaDeclRefs.empty()) {
6940 assert(SemaDeclRefs.size() % 2 == 0);
6941 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6942 if (!SemaObj->StdNamespace)
6943 SemaObj->StdNamespace = SemaDeclRefs[I];
6944 if (!SemaObj->StdBadAlloc)
6945 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6946 }
6947 SemaDeclRefs.clear();
6948 }
6949
6950 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6951 // encountered the pragma in the source.
6952 if(OptimizeOffPragmaLocation.isValid())
6953 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
6954 }
6955
get(StringRef Name)6956 IdentifierInfo *ASTReader::get(StringRef Name) {
6957 // Note that we are loading an identifier.
6958 Deserializing AnIdentifier(this);
6959
6960 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
6961 NumIdentifierLookups,
6962 NumIdentifierLookupHits);
6963
6964 // We don't need to do identifier table lookups in C++ modules (we preload
6965 // all interesting declarations, and don't need to use the scope for name
6966 // lookups). Perform the lookup in PCH files, though, since we don't build
6967 // a complete initial identifier table if we're carrying on from a PCH.
6968 if (Context.getLangOpts().CPlusPlus) {
6969 for (auto F : ModuleMgr.pch_modules())
6970 if (Visitor(*F))
6971 break;
6972 } else {
6973 // If there is a global index, look there first to determine which modules
6974 // provably do not have any results for this identifier.
6975 GlobalModuleIndex::HitSet Hits;
6976 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
6977 if (!loadGlobalIndex()) {
6978 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6979 HitsPtr = &Hits;
6980 }
6981 }
6982
6983 ModuleMgr.visit(Visitor, HitsPtr);
6984 }
6985
6986 IdentifierInfo *II = Visitor.getIdentifierInfo();
6987 markIdentifierUpToDate(II);
6988 return II;
6989 }
6990
6991 namespace clang {
6992 /// \brief An identifier-lookup iterator that enumerates all of the
6993 /// identifiers stored within a set of AST files.
6994 class ASTIdentifierIterator : public IdentifierIterator {
6995 /// \brief The AST reader whose identifiers are being enumerated.
6996 const ASTReader &Reader;
6997
6998 /// \brief The current index into the chain of AST files stored in
6999 /// the AST reader.
7000 unsigned Index;
7001
7002 /// \brief The current position within the identifier lookup table
7003 /// of the current AST file.
7004 ASTIdentifierLookupTable::key_iterator Current;
7005
7006 /// \brief The end position within the identifier lookup table of
7007 /// the current AST file.
7008 ASTIdentifierLookupTable::key_iterator End;
7009
7010 public:
7011 explicit ASTIdentifierIterator(const ASTReader &Reader);
7012
7013 StringRef Next() override;
7014 };
7015 }
7016
ASTIdentifierIterator(const ASTReader & Reader)7017 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7018 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7019 ASTIdentifierLookupTable *IdTable
7020 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7021 Current = IdTable->key_begin();
7022 End = IdTable->key_end();
7023 }
7024
Next()7025 StringRef ASTIdentifierIterator::Next() {
7026 while (Current == End) {
7027 // If we have exhausted all of our AST files, we're done.
7028 if (Index == 0)
7029 return StringRef();
7030
7031 --Index;
7032 ASTIdentifierLookupTable *IdTable
7033 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7034 IdentifierLookupTable;
7035 Current = IdTable->key_begin();
7036 End = IdTable->key_end();
7037 }
7038
7039 // We have any identifiers remaining in the current AST file; return
7040 // the next one.
7041 StringRef Result = *Current;
7042 ++Current;
7043 return Result;
7044 }
7045
getIdentifiers()7046 IdentifierIterator *ASTReader::getIdentifiers() {
7047 if (!loadGlobalIndex())
7048 return GlobalIndex->createIdentifierIterator();
7049
7050 return new ASTIdentifierIterator(*this);
7051 }
7052
7053 namespace clang { namespace serialization {
7054 class ReadMethodPoolVisitor {
7055 ASTReader &Reader;
7056 Selector Sel;
7057 unsigned PriorGeneration;
7058 unsigned InstanceBits;
7059 unsigned FactoryBits;
7060 bool InstanceHasMoreThanOneDecl;
7061 bool FactoryHasMoreThanOneDecl;
7062 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7063 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7064
7065 public:
ReadMethodPoolVisitor(ASTReader & Reader,Selector Sel,unsigned PriorGeneration)7066 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7067 unsigned PriorGeneration)
7068 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7069 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7070 FactoryHasMoreThanOneDecl(false) {}
7071
operator ()(ModuleFile & M)7072 bool operator()(ModuleFile &M) {
7073 if (!M.SelectorLookupTable)
7074 return false;
7075
7076 // If we've already searched this module file, skip it now.
7077 if (M.Generation <= PriorGeneration)
7078 return true;
7079
7080 ++Reader.NumMethodPoolTableLookups;
7081 ASTSelectorLookupTable *PoolTable
7082 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7083 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
7084 if (Pos == PoolTable->end())
7085 return false;
7086
7087 ++Reader.NumMethodPoolTableHits;
7088 ++Reader.NumSelectorsRead;
7089 // FIXME: Not quite happy with the statistics here. We probably should
7090 // disable this tracking when called via LoadSelector.
7091 // Also, should entries without methods count as misses?
7092 ++Reader.NumMethodPoolEntriesRead;
7093 ASTSelectorLookupTrait::data_type Data = *Pos;
7094 if (Reader.DeserializationListener)
7095 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
7096
7097 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7098 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
7099 InstanceBits = Data.InstanceBits;
7100 FactoryBits = Data.FactoryBits;
7101 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7102 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
7103 return true;
7104 }
7105
7106 /// \brief Retrieve the instance methods found by this visitor.
getInstanceMethods() const7107 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7108 return InstanceMethods;
7109 }
7110
7111 /// \brief Retrieve the instance methods found by this visitor.
getFactoryMethods() const7112 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7113 return FactoryMethods;
7114 }
7115
getInstanceBits() const7116 unsigned getInstanceBits() const { return InstanceBits; }
getFactoryBits() const7117 unsigned getFactoryBits() const { return FactoryBits; }
instanceHasMoreThanOneDecl() const7118 bool instanceHasMoreThanOneDecl() const {
7119 return InstanceHasMoreThanOneDecl;
7120 }
factoryHasMoreThanOneDecl() const7121 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
7122 };
7123 } } // end namespace clang::serialization
7124
7125 /// \brief Add the given set of methods to the method list.
addMethodsToPool(Sema & S,ArrayRef<ObjCMethodDecl * > Methods,ObjCMethodList & List)7126 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7127 ObjCMethodList &List) {
7128 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7129 S.addMethodToGlobalList(&List, Methods[I]);
7130 }
7131 }
7132
ReadMethodPool(Selector Sel)7133 void ASTReader::ReadMethodPool(Selector Sel) {
7134 // Get the selector generation and update it to the current generation.
7135 unsigned &Generation = SelectorGeneration[Sel];
7136 unsigned PriorGeneration = Generation;
7137 Generation = getGeneration();
7138
7139 // Search for methods defined with this selector.
7140 ++NumMethodPoolLookups;
7141 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7142 ModuleMgr.visit(Visitor);
7143
7144 if (Visitor.getInstanceMethods().empty() &&
7145 Visitor.getFactoryMethods().empty())
7146 return;
7147
7148 ++NumMethodPoolHits;
7149
7150 if (!getSema())
7151 return;
7152
7153 Sema &S = *getSema();
7154 Sema::GlobalMethodPool::iterator Pos
7155 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7156
7157 Pos->second.first.setBits(Visitor.getInstanceBits());
7158 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
7159 Pos->second.second.setBits(Visitor.getFactoryBits());
7160 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
7161
7162 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7163 // when building a module we keep every method individually and may need to
7164 // update hasMoreThanOneDecl as we add the methods.
7165 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7166 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7167 }
7168
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)7169 void ASTReader::ReadKnownNamespaces(
7170 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7171 Namespaces.clear();
7172
7173 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7174 if (NamespaceDecl *Namespace
7175 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7176 Namespaces.push_back(Namespace);
7177 }
7178 }
7179
ReadUndefinedButUsed(llvm::DenseMap<NamedDecl *,SourceLocation> & Undefined)7180 void ASTReader::ReadUndefinedButUsed(
7181 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
7182 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7183 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7184 SourceLocation Loc =
7185 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7186 Undefined.insert(std::make_pair(D, Loc));
7187 }
7188 }
7189
ReadMismatchingDeleteExpressions(llvm::MapVector<FieldDecl *,llvm::SmallVector<std::pair<SourceLocation,bool>,4>> & Exprs)7190 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
7191 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
7192 Exprs) {
7193 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
7194 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
7195 uint64_t Count = DelayedDeleteExprs[Idx++];
7196 for (uint64_t C = 0; C < Count; ++C) {
7197 SourceLocation DeleteLoc =
7198 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
7199 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
7200 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
7201 }
7202 }
7203 }
7204
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)7205 void ASTReader::ReadTentativeDefinitions(
7206 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7207 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7208 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7209 if (Var)
7210 TentativeDefs.push_back(Var);
7211 }
7212 TentativeDefinitions.clear();
7213 }
7214
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)7215 void ASTReader::ReadUnusedFileScopedDecls(
7216 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7217 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7218 DeclaratorDecl *D
7219 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7220 if (D)
7221 Decls.push_back(D);
7222 }
7223 UnusedFileScopedDecls.clear();
7224 }
7225
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)7226 void ASTReader::ReadDelegatingConstructors(
7227 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7228 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7229 CXXConstructorDecl *D
7230 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7231 if (D)
7232 Decls.push_back(D);
7233 }
7234 DelegatingCtorDecls.clear();
7235 }
7236
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)7237 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7238 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7239 TypedefNameDecl *D
7240 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7241 if (D)
7242 Decls.push_back(D);
7243 }
7244 ExtVectorDecls.clear();
7245 }
7246
ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector<const TypedefNameDecl *,4> & Decls)7247 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7248 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7249 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7250 ++I) {
7251 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7252 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7253 if (D)
7254 Decls.insert(D);
7255 }
7256 UnusedLocalTypedefNameCandidates.clear();
7257 }
7258
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)7259 void ASTReader::ReadReferencedSelectors(
7260 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7261 if (ReferencedSelectorsData.empty())
7262 return;
7263
7264 // If there are @selector references added them to its pool. This is for
7265 // implementation of -Wselector.
7266 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7267 unsigned I = 0;
7268 while (I < DataSize) {
7269 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7270 SourceLocation SelLoc
7271 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7272 Sels.push_back(std::make_pair(Sel, SelLoc));
7273 }
7274 ReferencedSelectorsData.clear();
7275 }
7276
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WeakIDs)7277 void ASTReader::ReadWeakUndeclaredIdentifiers(
7278 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7279 if (WeakUndeclaredIdentifiers.empty())
7280 return;
7281
7282 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7283 IdentifierInfo *WeakId
7284 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7285 IdentifierInfo *AliasId
7286 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7287 SourceLocation Loc
7288 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7289 bool Used = WeakUndeclaredIdentifiers[I++];
7290 WeakInfo WI(AliasId, Loc);
7291 WI.setUsed(Used);
7292 WeakIDs.push_back(std::make_pair(WeakId, WI));
7293 }
7294 WeakUndeclaredIdentifiers.clear();
7295 }
7296
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)7297 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7298 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7299 ExternalVTableUse VT;
7300 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7301 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7302 VT.DefinitionRequired = VTableUses[Idx++];
7303 VTables.push_back(VT);
7304 }
7305
7306 VTableUses.clear();
7307 }
7308
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)7309 void ASTReader::ReadPendingInstantiations(
7310 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7311 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7312 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7313 SourceLocation Loc
7314 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7315
7316 Pending.push_back(std::make_pair(D, Loc));
7317 }
7318 PendingInstantiations.clear();
7319 }
7320
ReadLateParsedTemplates(llvm::MapVector<const FunctionDecl *,LateParsedTemplate * > & LPTMap)7321 void ASTReader::ReadLateParsedTemplates(
7322 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7323 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7324 /* In loop */) {
7325 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7326
7327 LateParsedTemplate *LT = new LateParsedTemplate;
7328 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7329
7330 ModuleFile *F = getOwningModuleFile(LT->D);
7331 assert(F && "No module");
7332
7333 unsigned TokN = LateParsedTemplates[Idx++];
7334 LT->Toks.reserve(TokN);
7335 for (unsigned T = 0; T < TokN; ++T)
7336 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7337
7338 LPTMap.insert(std::make_pair(FD, LT));
7339 }
7340
7341 LateParsedTemplates.clear();
7342 }
7343
LoadSelector(Selector Sel)7344 void ASTReader::LoadSelector(Selector Sel) {
7345 // It would be complicated to avoid reading the methods anyway. So don't.
7346 ReadMethodPool(Sel);
7347 }
7348
SetIdentifierInfo(IdentifierID ID,IdentifierInfo * II)7349 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7350 assert(ID && "Non-zero identifier ID required");
7351 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7352 IdentifiersLoaded[ID - 1] = II;
7353 if (DeserializationListener)
7354 DeserializationListener->IdentifierRead(ID, II);
7355 }
7356
7357 /// \brief Set the globally-visible declarations associated with the given
7358 /// identifier.
7359 ///
7360 /// If the AST reader is currently in a state where the given declaration IDs
7361 /// cannot safely be resolved, they are queued until it is safe to resolve
7362 /// them.
7363 ///
7364 /// \param II an IdentifierInfo that refers to one or more globally-visible
7365 /// declarations.
7366 ///
7367 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7368 /// visible at global scope.
7369 ///
7370 /// \param Decls if non-null, this vector will be populated with the set of
7371 /// deserialized declarations. These declarations will not be pushed into
7372 /// scope.
7373 void
SetGloballyVisibleDecls(IdentifierInfo * II,const SmallVectorImpl<uint32_t> & DeclIDs,SmallVectorImpl<Decl * > * Decls)7374 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7375 const SmallVectorImpl<uint32_t> &DeclIDs,
7376 SmallVectorImpl<Decl *> *Decls) {
7377 if (NumCurrentElementsDeserializing && !Decls) {
7378 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7379 return;
7380 }
7381
7382 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7383 if (!SemaObj) {
7384 // Queue this declaration so that it will be added to the
7385 // translation unit scope and identifier's declaration chain
7386 // once a Sema object is known.
7387 PreloadedDeclIDs.push_back(DeclIDs[I]);
7388 continue;
7389 }
7390
7391 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7392
7393 // If we're simply supposed to record the declarations, do so now.
7394 if (Decls) {
7395 Decls->push_back(D);
7396 continue;
7397 }
7398
7399 // Introduce this declaration into the translation-unit scope
7400 // and add it to the declaration chain for this identifier, so
7401 // that (unqualified) name lookup will find it.
7402 pushExternalDeclIntoScope(D, II);
7403 }
7404 }
7405
DecodeIdentifierInfo(IdentifierID ID)7406 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7407 if (ID == 0)
7408 return nullptr;
7409
7410 if (IdentifiersLoaded.empty()) {
7411 Error("no identifier table in AST file");
7412 return nullptr;
7413 }
7414
7415 ID -= 1;
7416 if (!IdentifiersLoaded[ID]) {
7417 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7418 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7419 ModuleFile *M = I->second;
7420 unsigned Index = ID - M->BaseIdentifierID;
7421 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7422
7423 // All of the strings in the AST file are preceded by a 16-bit length.
7424 // Extract that 16-bit length to avoid having to execute strlen().
7425 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7426 // unsigned integers. This is important to avoid integer overflow when
7427 // we cast them to 'unsigned'.
7428 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7429 unsigned StrLen = (((unsigned) StrLenPtr[0])
7430 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7431 IdentifiersLoaded[ID]
7432 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
7433 if (DeserializationListener)
7434 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7435 }
7436
7437 return IdentifiersLoaded[ID];
7438 }
7439
getLocalIdentifier(ModuleFile & M,unsigned LocalID)7440 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7441 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7442 }
7443
getGlobalIdentifierID(ModuleFile & M,unsigned LocalID)7444 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7445 if (LocalID < NUM_PREDEF_IDENT_IDS)
7446 return LocalID;
7447
7448 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7449 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7450 assert(I != M.IdentifierRemap.end()
7451 && "Invalid index into identifier index remap");
7452
7453 return LocalID + I->second;
7454 }
7455
getMacro(MacroID ID)7456 MacroInfo *ASTReader::getMacro(MacroID ID) {
7457 if (ID == 0)
7458 return nullptr;
7459
7460 if (MacrosLoaded.empty()) {
7461 Error("no macro table in AST file");
7462 return nullptr;
7463 }
7464
7465 ID -= NUM_PREDEF_MACRO_IDS;
7466 if (!MacrosLoaded[ID]) {
7467 GlobalMacroMapType::iterator I
7468 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7469 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7470 ModuleFile *M = I->second;
7471 unsigned Index = ID - M->BaseMacroID;
7472 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7473
7474 if (DeserializationListener)
7475 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7476 MacrosLoaded[ID]);
7477 }
7478
7479 return MacrosLoaded[ID];
7480 }
7481
getGlobalMacroID(ModuleFile & M,unsigned LocalID)7482 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7483 if (LocalID < NUM_PREDEF_MACRO_IDS)
7484 return LocalID;
7485
7486 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7487 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7488 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7489
7490 return LocalID + I->second;
7491 }
7492
7493 serialization::SubmoduleID
getGlobalSubmoduleID(ModuleFile & M,unsigned LocalID)7494 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7495 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7496 return LocalID;
7497
7498 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7499 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7500 assert(I != M.SubmoduleRemap.end()
7501 && "Invalid index into submodule index remap");
7502
7503 return LocalID + I->second;
7504 }
7505
getSubmodule(SubmoduleID GlobalID)7506 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7507 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7508 assert(GlobalID == 0 && "Unhandled global submodule ID");
7509 return nullptr;
7510 }
7511
7512 if (GlobalID > SubmodulesLoaded.size()) {
7513 Error("submodule ID out of range in AST file");
7514 return nullptr;
7515 }
7516
7517 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7518 }
7519
getModule(unsigned ID)7520 Module *ASTReader::getModule(unsigned ID) {
7521 return getSubmodule(ID);
7522 }
7523
getLocalModuleFile(ModuleFile & F,unsigned ID)7524 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
7525 if (ID & 1) {
7526 // It's a module, look it up by submodule ID.
7527 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
7528 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
7529 } else {
7530 // It's a prefix (preamble, PCH, ...). Look it up by index.
7531 unsigned IndexFromEnd = ID >> 1;
7532 assert(IndexFromEnd && "got reference to unknown module file");
7533 return getModuleManager().pch_modules().end()[-IndexFromEnd];
7534 }
7535 }
7536
getModuleFileID(ModuleFile * F)7537 unsigned ASTReader::getModuleFileID(ModuleFile *F) {
7538 if (!F)
7539 return 1;
7540
7541 // For a file representing a module, use the submodule ID of the top-level
7542 // module as the file ID. For any other kind of file, the number of such
7543 // files loaded beforehand will be the same on reload.
7544 // FIXME: Is this true even if we have an explicit module file and a PCH?
7545 if (F->isModule())
7546 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
7547
7548 auto PCHModules = getModuleManager().pch_modules();
7549 auto I = std::find(PCHModules.begin(), PCHModules.end(), F);
7550 assert(I != PCHModules.end() && "emitting reference to unknown file");
7551 return (I - PCHModules.end()) << 1;
7552 }
7553
7554 llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
getSourceDescriptor(unsigned ID)7555 ASTReader::getSourceDescriptor(unsigned ID) {
7556 if (const Module *M = getSubmodule(ID))
7557 return ExternalASTSource::ASTSourceDescriptor(*M);
7558
7559 // If there is only a single PCH, return it instead.
7560 // Chained PCH are not suported.
7561 if (ModuleMgr.size() == 1) {
7562 ModuleFile &MF = ModuleMgr.getPrimaryModule();
7563 return ASTReader::ASTSourceDescriptor(
7564 MF.OriginalSourceFileName, MF.OriginalDir, MF.FileName, MF.Signature);
7565 }
7566 return None;
7567 }
7568
getLocalSelector(ModuleFile & M,unsigned LocalID)7569 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7570 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7571 }
7572
DecodeSelector(serialization::SelectorID ID)7573 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7574 if (ID == 0)
7575 return Selector();
7576
7577 if (ID > SelectorsLoaded.size()) {
7578 Error("selector ID out of range in AST file");
7579 return Selector();
7580 }
7581
7582 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7583 // Load this selector from the selector table.
7584 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7585 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7586 ModuleFile &M = *I->second;
7587 ASTSelectorLookupTrait Trait(*this, M);
7588 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7589 SelectorsLoaded[ID - 1] =
7590 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7591 if (DeserializationListener)
7592 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7593 }
7594
7595 return SelectorsLoaded[ID - 1];
7596 }
7597
GetExternalSelector(serialization::SelectorID ID)7598 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7599 return DecodeSelector(ID);
7600 }
7601
GetNumExternalSelectors()7602 uint32_t ASTReader::GetNumExternalSelectors() {
7603 // ID 0 (the null selector) is considered an external selector.
7604 return getTotalNumSelectors() + 1;
7605 }
7606
7607 serialization::SelectorID
getGlobalSelectorID(ModuleFile & M,unsigned LocalID) const7608 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7609 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7610 return LocalID;
7611
7612 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7613 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7614 assert(I != M.SelectorRemap.end()
7615 && "Invalid index into selector index remap");
7616
7617 return LocalID + I->second;
7618 }
7619
7620 DeclarationName
ReadDeclarationName(ModuleFile & F,const RecordData & Record,unsigned & Idx)7621 ASTReader::ReadDeclarationName(ModuleFile &F,
7622 const RecordData &Record, unsigned &Idx) {
7623 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7624 switch (Kind) {
7625 case DeclarationName::Identifier:
7626 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7627
7628 case DeclarationName::ObjCZeroArgSelector:
7629 case DeclarationName::ObjCOneArgSelector:
7630 case DeclarationName::ObjCMultiArgSelector:
7631 return DeclarationName(ReadSelector(F, Record, Idx));
7632
7633 case DeclarationName::CXXConstructorName:
7634 return Context.DeclarationNames.getCXXConstructorName(
7635 Context.getCanonicalType(readType(F, Record, Idx)));
7636
7637 case DeclarationName::CXXDestructorName:
7638 return Context.DeclarationNames.getCXXDestructorName(
7639 Context.getCanonicalType(readType(F, Record, Idx)));
7640
7641 case DeclarationName::CXXConversionFunctionName:
7642 return Context.DeclarationNames.getCXXConversionFunctionName(
7643 Context.getCanonicalType(readType(F, Record, Idx)));
7644
7645 case DeclarationName::CXXOperatorName:
7646 return Context.DeclarationNames.getCXXOperatorName(
7647 (OverloadedOperatorKind)Record[Idx++]);
7648
7649 case DeclarationName::CXXLiteralOperatorName:
7650 return Context.DeclarationNames.getCXXLiteralOperatorName(
7651 GetIdentifierInfo(F, Record, Idx));
7652
7653 case DeclarationName::CXXUsingDirective:
7654 return DeclarationName::getUsingDirectiveName();
7655 }
7656
7657 llvm_unreachable("Invalid NameKind!");
7658 }
7659
ReadDeclarationNameLoc(ModuleFile & F,DeclarationNameLoc & DNLoc,DeclarationName Name,const RecordData & Record,unsigned & Idx)7660 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7661 DeclarationNameLoc &DNLoc,
7662 DeclarationName Name,
7663 const RecordData &Record, unsigned &Idx) {
7664 switch (Name.getNameKind()) {
7665 case DeclarationName::CXXConstructorName:
7666 case DeclarationName::CXXDestructorName:
7667 case DeclarationName::CXXConversionFunctionName:
7668 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7669 break;
7670
7671 case DeclarationName::CXXOperatorName:
7672 DNLoc.CXXOperatorName.BeginOpNameLoc
7673 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7674 DNLoc.CXXOperatorName.EndOpNameLoc
7675 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7676 break;
7677
7678 case DeclarationName::CXXLiteralOperatorName:
7679 DNLoc.CXXLiteralOperatorName.OpNameLoc
7680 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7681 break;
7682
7683 case DeclarationName::Identifier:
7684 case DeclarationName::ObjCZeroArgSelector:
7685 case DeclarationName::ObjCOneArgSelector:
7686 case DeclarationName::ObjCMultiArgSelector:
7687 case DeclarationName::CXXUsingDirective:
7688 break;
7689 }
7690 }
7691
ReadDeclarationNameInfo(ModuleFile & F,DeclarationNameInfo & NameInfo,const RecordData & Record,unsigned & Idx)7692 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7693 DeclarationNameInfo &NameInfo,
7694 const RecordData &Record, unsigned &Idx) {
7695 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7696 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7697 DeclarationNameLoc DNLoc;
7698 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7699 NameInfo.setInfo(DNLoc);
7700 }
7701
ReadQualifierInfo(ModuleFile & F,QualifierInfo & Info,const RecordData & Record,unsigned & Idx)7702 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7703 const RecordData &Record, unsigned &Idx) {
7704 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7705 unsigned NumTPLists = Record[Idx++];
7706 Info.NumTemplParamLists = NumTPLists;
7707 if (NumTPLists) {
7708 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7709 for (unsigned i=0; i != NumTPLists; ++i)
7710 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7711 }
7712 }
7713
7714 TemplateName
ReadTemplateName(ModuleFile & F,const RecordData & Record,unsigned & Idx)7715 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7716 unsigned &Idx) {
7717 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7718 switch (Kind) {
7719 case TemplateName::Template:
7720 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7721
7722 case TemplateName::OverloadedTemplate: {
7723 unsigned size = Record[Idx++];
7724 UnresolvedSet<8> Decls;
7725 while (size--)
7726 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7727
7728 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7729 }
7730
7731 case TemplateName::QualifiedTemplate: {
7732 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7733 bool hasTemplKeyword = Record[Idx++];
7734 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7735 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7736 }
7737
7738 case TemplateName::DependentTemplate: {
7739 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7740 if (Record[Idx++]) // isIdentifier
7741 return Context.getDependentTemplateName(NNS,
7742 GetIdentifierInfo(F, Record,
7743 Idx));
7744 return Context.getDependentTemplateName(NNS,
7745 (OverloadedOperatorKind)Record[Idx++]);
7746 }
7747
7748 case TemplateName::SubstTemplateTemplateParm: {
7749 TemplateTemplateParmDecl *param
7750 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7751 if (!param) return TemplateName();
7752 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7753 return Context.getSubstTemplateTemplateParm(param, replacement);
7754 }
7755
7756 case TemplateName::SubstTemplateTemplateParmPack: {
7757 TemplateTemplateParmDecl *Param
7758 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7759 if (!Param)
7760 return TemplateName();
7761
7762 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7763 if (ArgPack.getKind() != TemplateArgument::Pack)
7764 return TemplateName();
7765
7766 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7767 }
7768 }
7769
7770 llvm_unreachable("Unhandled template name kind!");
7771 }
7772
ReadTemplateArgument(ModuleFile & F,const RecordData & Record,unsigned & Idx,bool Canonicalize)7773 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
7774 const RecordData &Record,
7775 unsigned &Idx,
7776 bool Canonicalize) {
7777 if (Canonicalize) {
7778 // The caller wants a canonical template argument. Sometimes the AST only
7779 // wants template arguments in canonical form (particularly as the template
7780 // argument lists of template specializations) so ensure we preserve that
7781 // canonical form across serialization.
7782 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
7783 return Context.getCanonicalTemplateArgument(Arg);
7784 }
7785
7786 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7787 switch (Kind) {
7788 case TemplateArgument::Null:
7789 return TemplateArgument();
7790 case TemplateArgument::Type:
7791 return TemplateArgument(readType(F, Record, Idx));
7792 case TemplateArgument::Declaration: {
7793 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7794 return TemplateArgument(D, readType(F, Record, Idx));
7795 }
7796 case TemplateArgument::NullPtr:
7797 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7798 case TemplateArgument::Integral: {
7799 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7800 QualType T = readType(F, Record, Idx);
7801 return TemplateArgument(Context, Value, T);
7802 }
7803 case TemplateArgument::Template:
7804 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7805 case TemplateArgument::TemplateExpansion: {
7806 TemplateName Name = ReadTemplateName(F, Record, Idx);
7807 Optional<unsigned> NumTemplateExpansions;
7808 if (unsigned NumExpansions = Record[Idx++])
7809 NumTemplateExpansions = NumExpansions - 1;
7810 return TemplateArgument(Name, NumTemplateExpansions);
7811 }
7812 case TemplateArgument::Expression:
7813 return TemplateArgument(ReadExpr(F));
7814 case TemplateArgument::Pack: {
7815 unsigned NumArgs = Record[Idx++];
7816 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7817 for (unsigned I = 0; I != NumArgs; ++I)
7818 Args[I] = ReadTemplateArgument(F, Record, Idx);
7819 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
7820 }
7821 }
7822
7823 llvm_unreachable("Unhandled template argument kind!");
7824 }
7825
7826 TemplateParameterList *
ReadTemplateParameterList(ModuleFile & F,const RecordData & Record,unsigned & Idx)7827 ASTReader::ReadTemplateParameterList(ModuleFile &F,
7828 const RecordData &Record, unsigned &Idx) {
7829 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7830 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7831 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7832
7833 unsigned NumParams = Record[Idx++];
7834 SmallVector<NamedDecl *, 16> Params;
7835 Params.reserve(NumParams);
7836 while (NumParams--)
7837 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7838
7839 TemplateParameterList* TemplateParams =
7840 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7841 Params.data(), Params.size(), RAngleLoc);
7842 return TemplateParams;
7843 }
7844
7845 void
7846 ASTReader::
ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> & TemplArgs,ModuleFile & F,const RecordData & Record,unsigned & Idx,bool Canonicalize)7847 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
7848 ModuleFile &F, const RecordData &Record,
7849 unsigned &Idx, bool Canonicalize) {
7850 unsigned NumTemplateArgs = Record[Idx++];
7851 TemplArgs.reserve(NumTemplateArgs);
7852 while (NumTemplateArgs--)
7853 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
7854 }
7855
7856 /// \brief Read a UnresolvedSet structure.
ReadUnresolvedSet(ModuleFile & F,LazyASTUnresolvedSet & Set,const RecordData & Record,unsigned & Idx)7857 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
7858 const RecordData &Record, unsigned &Idx) {
7859 unsigned NumDecls = Record[Idx++];
7860 Set.reserve(Context, NumDecls);
7861 while (NumDecls--) {
7862 DeclID ID = ReadDeclID(F, Record, Idx);
7863 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
7864 Set.addLazyDecl(Context, ID, AS);
7865 }
7866 }
7867
7868 CXXBaseSpecifier
ReadCXXBaseSpecifier(ModuleFile & F,const RecordData & Record,unsigned & Idx)7869 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7870 const RecordData &Record, unsigned &Idx) {
7871 bool isVirtual = static_cast<bool>(Record[Idx++]);
7872 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7873 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7874 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7875 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7876 SourceRange Range = ReadSourceRange(F, Record, Idx);
7877 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7878 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7879 EllipsisLoc);
7880 Result.setInheritConstructors(inheritConstructors);
7881 return Result;
7882 }
7883
7884 CXXCtorInitializer **
ReadCXXCtorInitializers(ModuleFile & F,const RecordData & Record,unsigned & Idx)7885 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7886 unsigned &Idx) {
7887 unsigned NumInitializers = Record[Idx++];
7888 assert(NumInitializers && "wrote ctor initializers but have no inits");
7889 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
7890 for (unsigned i = 0; i != NumInitializers; ++i) {
7891 TypeSourceInfo *TInfo = nullptr;
7892 bool IsBaseVirtual = false;
7893 FieldDecl *Member = nullptr;
7894 IndirectFieldDecl *IndirectMember = nullptr;
7895
7896 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7897 switch (Type) {
7898 case CTOR_INITIALIZER_BASE:
7899 TInfo = GetTypeSourceInfo(F, Record, Idx);
7900 IsBaseVirtual = Record[Idx++];
7901 break;
7902
7903 case CTOR_INITIALIZER_DELEGATING:
7904 TInfo = GetTypeSourceInfo(F, Record, Idx);
7905 break;
7906
7907 case CTOR_INITIALIZER_MEMBER:
7908 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7909 break;
7910
7911 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7912 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7913 break;
7914 }
7915
7916 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7917 Expr *Init = ReadExpr(F);
7918 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7919 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7920 bool IsWritten = Record[Idx++];
7921 unsigned SourceOrderOrNumArrayIndices;
7922 SmallVector<VarDecl *, 8> Indices;
7923 if (IsWritten) {
7924 SourceOrderOrNumArrayIndices = Record[Idx++];
7925 } else {
7926 SourceOrderOrNumArrayIndices = Record[Idx++];
7927 Indices.reserve(SourceOrderOrNumArrayIndices);
7928 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7929 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7930 }
7931
7932 CXXCtorInitializer *BOMInit;
7933 if (Type == CTOR_INITIALIZER_BASE) {
7934 BOMInit = new (Context)
7935 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
7936 RParenLoc, MemberOrEllipsisLoc);
7937 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7938 BOMInit = new (Context)
7939 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
7940 } else if (IsWritten) {
7941 if (Member)
7942 BOMInit = new (Context) CXXCtorInitializer(
7943 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc);
7944 else
7945 BOMInit = new (Context)
7946 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
7947 LParenLoc, Init, RParenLoc);
7948 } else {
7949 if (IndirectMember) {
7950 assert(Indices.empty() && "Indirect field improperly initialized");
7951 BOMInit = new (Context)
7952 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
7953 LParenLoc, Init, RParenLoc);
7954 } else {
7955 BOMInit = CXXCtorInitializer::Create(
7956 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc,
7957 Indices.data(), Indices.size());
7958 }
7959 }
7960
7961 if (IsWritten)
7962 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7963 CtorInitializers[i] = BOMInit;
7964 }
7965
7966 return CtorInitializers;
7967 }
7968
7969 NestedNameSpecifier *
ReadNestedNameSpecifier(ModuleFile & F,const RecordData & Record,unsigned & Idx)7970 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7971 const RecordData &Record, unsigned &Idx) {
7972 unsigned N = Record[Idx++];
7973 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
7974 for (unsigned I = 0; I != N; ++I) {
7975 NestedNameSpecifier::SpecifierKind Kind
7976 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7977 switch (Kind) {
7978 case NestedNameSpecifier::Identifier: {
7979 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7980 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7981 break;
7982 }
7983
7984 case NestedNameSpecifier::Namespace: {
7985 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7986 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7987 break;
7988 }
7989
7990 case NestedNameSpecifier::NamespaceAlias: {
7991 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7992 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7993 break;
7994 }
7995
7996 case NestedNameSpecifier::TypeSpec:
7997 case NestedNameSpecifier::TypeSpecWithTemplate: {
7998 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7999 if (!T)
8000 return nullptr;
8001
8002 bool Template = Record[Idx++];
8003 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8004 break;
8005 }
8006
8007 case NestedNameSpecifier::Global: {
8008 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8009 // No associated value, and there can't be a prefix.
8010 break;
8011 }
8012
8013 case NestedNameSpecifier::Super: {
8014 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8015 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8016 break;
8017 }
8018 }
8019 Prev = NNS;
8020 }
8021 return NNS;
8022 }
8023
8024 NestedNameSpecifierLoc
ReadNestedNameSpecifierLoc(ModuleFile & F,const RecordData & Record,unsigned & Idx)8025 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8026 unsigned &Idx) {
8027 unsigned N = Record[Idx++];
8028 NestedNameSpecifierLocBuilder Builder;
8029 for (unsigned I = 0; I != N; ++I) {
8030 NestedNameSpecifier::SpecifierKind Kind
8031 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8032 switch (Kind) {
8033 case NestedNameSpecifier::Identifier: {
8034 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8035 SourceRange Range = ReadSourceRange(F, Record, Idx);
8036 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8037 break;
8038 }
8039
8040 case NestedNameSpecifier::Namespace: {
8041 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8042 SourceRange Range = ReadSourceRange(F, Record, Idx);
8043 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8044 break;
8045 }
8046
8047 case NestedNameSpecifier::NamespaceAlias: {
8048 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8049 SourceRange Range = ReadSourceRange(F, Record, Idx);
8050 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8051 break;
8052 }
8053
8054 case NestedNameSpecifier::TypeSpec:
8055 case NestedNameSpecifier::TypeSpecWithTemplate: {
8056 bool Template = Record[Idx++];
8057 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8058 if (!T)
8059 return NestedNameSpecifierLoc();
8060 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8061
8062 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8063 Builder.Extend(Context,
8064 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8065 T->getTypeLoc(), ColonColonLoc);
8066 break;
8067 }
8068
8069 case NestedNameSpecifier::Global: {
8070 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8071 Builder.MakeGlobal(Context, ColonColonLoc);
8072 break;
8073 }
8074
8075 case NestedNameSpecifier::Super: {
8076 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8077 SourceRange Range = ReadSourceRange(F, Record, Idx);
8078 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8079 break;
8080 }
8081 }
8082 }
8083
8084 return Builder.getWithLocInContext(Context);
8085 }
8086
8087 SourceRange
ReadSourceRange(ModuleFile & F,const RecordData & Record,unsigned & Idx)8088 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8089 unsigned &Idx) {
8090 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8091 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8092 return SourceRange(beg, end);
8093 }
8094
8095 /// \brief Read an integral value
ReadAPInt(const RecordData & Record,unsigned & Idx)8096 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8097 unsigned BitWidth = Record[Idx++];
8098 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8099 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8100 Idx += NumWords;
8101 return Result;
8102 }
8103
8104 /// \brief Read a signed integral value
ReadAPSInt(const RecordData & Record,unsigned & Idx)8105 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8106 bool isUnsigned = Record[Idx++];
8107 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8108 }
8109
8110 /// \brief Read a floating-point value
ReadAPFloat(const RecordData & Record,const llvm::fltSemantics & Sem,unsigned & Idx)8111 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8112 const llvm::fltSemantics &Sem,
8113 unsigned &Idx) {
8114 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
8115 }
8116
8117 // \brief Read a string
ReadString(const RecordData & Record,unsigned & Idx)8118 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8119 unsigned Len = Record[Idx++];
8120 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8121 Idx += Len;
8122 return Result;
8123 }
8124
ReadPath(ModuleFile & F,const RecordData & Record,unsigned & Idx)8125 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8126 unsigned &Idx) {
8127 std::string Filename = ReadString(Record, Idx);
8128 ResolveImportedPath(F, Filename);
8129 return Filename;
8130 }
8131
ReadVersionTuple(const RecordData & Record,unsigned & Idx)8132 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8133 unsigned &Idx) {
8134 unsigned Major = Record[Idx++];
8135 unsigned Minor = Record[Idx++];
8136 unsigned Subminor = Record[Idx++];
8137 if (Minor == 0)
8138 return VersionTuple(Major);
8139 if (Subminor == 0)
8140 return VersionTuple(Major, Minor - 1);
8141 return VersionTuple(Major, Minor - 1, Subminor - 1);
8142 }
8143
ReadCXXTemporary(ModuleFile & F,const RecordData & Record,unsigned & Idx)8144 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8145 const RecordData &Record,
8146 unsigned &Idx) {
8147 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8148 return CXXTemporary::Create(Context, Decl);
8149 }
8150
Diag(unsigned DiagID)8151 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
8152 return Diag(CurrentImportLoc, DiagID);
8153 }
8154
Diag(SourceLocation Loc,unsigned DiagID)8155 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8156 return Diags.Report(Loc, DiagID);
8157 }
8158
8159 /// \brief Retrieve the identifier table associated with the
8160 /// preprocessor.
getIdentifierTable()8161 IdentifierTable &ASTReader::getIdentifierTable() {
8162 return PP.getIdentifierTable();
8163 }
8164
8165 /// \brief Record that the given ID maps to the given switch-case
8166 /// statement.
RecordSwitchCaseID(SwitchCase * SC,unsigned ID)8167 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
8168 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
8169 "Already have a SwitchCase with this ID");
8170 (*CurrSwitchCaseStmts)[ID] = SC;
8171 }
8172
8173 /// \brief Retrieve the switch-case statement with the given ID.
getSwitchCaseWithID(unsigned ID)8174 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
8175 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
8176 return (*CurrSwitchCaseStmts)[ID];
8177 }
8178
ClearSwitchCaseIDs()8179 void ASTReader::ClearSwitchCaseIDs() {
8180 CurrSwitchCaseStmts->clear();
8181 }
8182
ReadComments()8183 void ASTReader::ReadComments() {
8184 std::vector<RawComment *> Comments;
8185 for (SmallVectorImpl<std::pair<BitstreamCursor,
8186 serialization::ModuleFile *> >::iterator
8187 I = CommentsCursors.begin(),
8188 E = CommentsCursors.end();
8189 I != E; ++I) {
8190 Comments.clear();
8191 BitstreamCursor &Cursor = I->first;
8192 serialization::ModuleFile &F = *I->second;
8193 SavedStreamPosition SavedPosition(Cursor);
8194
8195 RecordData Record;
8196 while (true) {
8197 llvm::BitstreamEntry Entry =
8198 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
8199
8200 switch (Entry.Kind) {
8201 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8202 case llvm::BitstreamEntry::Error:
8203 Error("malformed block record in AST file");
8204 return;
8205 case llvm::BitstreamEntry::EndBlock:
8206 goto NextCursor;
8207 case llvm::BitstreamEntry::Record:
8208 // The interesting case.
8209 break;
8210 }
8211
8212 // Read a record.
8213 Record.clear();
8214 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
8215 case COMMENTS_RAW_COMMENT: {
8216 unsigned Idx = 0;
8217 SourceRange SR = ReadSourceRange(F, Record, Idx);
8218 RawComment::CommentKind Kind =
8219 (RawComment::CommentKind) Record[Idx++];
8220 bool IsTrailingComment = Record[Idx++];
8221 bool IsAlmostTrailingComment = Record[Idx++];
8222 Comments.push_back(new (Context) RawComment(
8223 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8224 Context.getLangOpts().CommentOpts.ParseAllComments));
8225 break;
8226 }
8227 }
8228 }
8229 NextCursor:
8230 Context.Comments.addDeserializedComments(Comments);
8231 }
8232 }
8233
getOwningModuleNameForDiagnostic(const Decl * D)8234 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8235 // If we know the owning module, use it.
8236 if (Module *M = D->getImportedOwningModule())
8237 return M->getFullModuleName();
8238
8239 // Otherwise, use the name of the top-level module the decl is within.
8240 if (ModuleFile *M = getOwningModuleFile(D))
8241 return M->ModuleName;
8242
8243 // Not from a module.
8244 return "";
8245 }
8246
finishPendingActions()8247 void ASTReader::finishPendingActions() {
8248 while (!PendingIdentifierInfos.empty() ||
8249 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8250 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8251 !PendingUpdateRecords.empty()) {
8252 // If any identifiers with corresponding top-level declarations have
8253 // been loaded, load those declarations now.
8254 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8255 TopLevelDeclsMap;
8256 TopLevelDeclsMap TopLevelDecls;
8257
8258 while (!PendingIdentifierInfos.empty()) {
8259 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8260 SmallVector<uint32_t, 4> DeclIDs =
8261 std::move(PendingIdentifierInfos.back().second);
8262 PendingIdentifierInfos.pop_back();
8263
8264 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8265 }
8266
8267 // For each decl chain that we wanted to complete while deserializing, mark
8268 // it as "still needs to be completed".
8269 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8270 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8271 }
8272 PendingIncompleteDeclChains.clear();
8273
8274 // Load pending declaration chains.
8275 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
8276 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second);
8277 PendingDeclChains.clear();
8278
8279 // Make the most recent of the top-level declarations visible.
8280 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8281 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8282 IdentifierInfo *II = TLD->first;
8283 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8284 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8285 }
8286 }
8287
8288 // Load any pending macro definitions.
8289 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8290 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8291 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8292 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8293 // Initialize the macro history from chained-PCHs ahead of module imports.
8294 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8295 ++IDIdx) {
8296 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8297 if (Info.M->Kind != MK_ImplicitModule &&
8298 Info.M->Kind != MK_ExplicitModule)
8299 resolvePendingMacro(II, Info);
8300 }
8301 // Handle module imports.
8302 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8303 ++IDIdx) {
8304 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8305 if (Info.M->Kind == MK_ImplicitModule ||
8306 Info.M->Kind == MK_ExplicitModule)
8307 resolvePendingMacro(II, Info);
8308 }
8309 }
8310 PendingMacroIDs.clear();
8311
8312 // Wire up the DeclContexts for Decls that we delayed setting until
8313 // recursive loading is completed.
8314 while (!PendingDeclContextInfos.empty()) {
8315 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8316 PendingDeclContextInfos.pop_front();
8317 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8318 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8319 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8320 }
8321
8322 // Perform any pending declaration updates.
8323 while (!PendingUpdateRecords.empty()) {
8324 auto Update = PendingUpdateRecords.pop_back_val();
8325 ReadingKindTracker ReadingKind(Read_Decl, *this);
8326 loadDeclUpdateRecords(Update.first, Update.second);
8327 }
8328 }
8329
8330 // At this point, all update records for loaded decls are in place, so any
8331 // fake class definitions should have become real.
8332 assert(PendingFakeDefinitionData.empty() &&
8333 "faked up a class definition but never saw the real one");
8334
8335 // If we deserialized any C++ or Objective-C class definitions, any
8336 // Objective-C protocol definitions, or any redeclarable templates, make sure
8337 // that all redeclarations point to the definitions. Note that this can only
8338 // happen now, after the redeclaration chains have been fully wired.
8339 for (Decl *D : PendingDefinitions) {
8340 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
8341 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8342 // Make sure that the TagType points at the definition.
8343 const_cast<TagType*>(TagT)->decl = TD;
8344 }
8345
8346 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
8347 for (auto *R = getMostRecentExistingDecl(RD); R;
8348 R = R->getPreviousDecl()) {
8349 assert((R == D) ==
8350 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
8351 "declaration thinks it's the definition but it isn't");
8352 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8353 }
8354 }
8355
8356 continue;
8357 }
8358
8359 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
8360 // Make sure that the ObjCInterfaceType points at the definition.
8361 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8362 ->Decl = ID;
8363
8364 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8365 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8366
8367 continue;
8368 }
8369
8370 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
8371 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8372 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8373
8374 continue;
8375 }
8376
8377 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
8378 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8379 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
8380 }
8381 PendingDefinitions.clear();
8382
8383 // Load the bodies of any functions or methods we've encountered. We do
8384 // this now (delayed) so that we can be sure that the declaration chains
8385 // have been fully wired up (hasBody relies on this).
8386 // FIXME: We shouldn't require complete redeclaration chains here.
8387 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8388 PBEnd = PendingBodies.end();
8389 PB != PBEnd; ++PB) {
8390 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8391 // FIXME: Check for =delete/=default?
8392 // FIXME: Complain about ODR violations here?
8393 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8394 FD->setLazyBody(PB->second);
8395 continue;
8396 }
8397
8398 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8399 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8400 MD->setLazyBody(PB->second);
8401 }
8402 PendingBodies.clear();
8403
8404 // Do some cleanup.
8405 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
8406 getContext().deduplicateMergedDefinitonsFor(ND);
8407 PendingMergedDefinitionsToDeduplicate.clear();
8408 }
8409
diagnoseOdrViolations()8410 void ASTReader::diagnoseOdrViolations() {
8411 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8412 return;
8413
8414 // Trigger the import of the full definition of each class that had any
8415 // odr-merging problems, so we can produce better diagnostics for them.
8416 // These updates may in turn find and diagnose some ODR failures, so take
8417 // ownership of the set first.
8418 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8419 PendingOdrMergeFailures.clear();
8420 for (auto &Merge : OdrMergeFailures) {
8421 Merge.first->buildLookup();
8422 Merge.first->decls_begin();
8423 Merge.first->bases_begin();
8424 Merge.first->vbases_begin();
8425 for (auto *RD : Merge.second) {
8426 RD->decls_begin();
8427 RD->bases_begin();
8428 RD->vbases_begin();
8429 }
8430 }
8431
8432 // For each declaration from a merged context, check that the canonical
8433 // definition of that context also contains a declaration of the same
8434 // entity.
8435 //
8436 // Caution: this loop does things that might invalidate iterators into
8437 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8438 while (!PendingOdrMergeChecks.empty()) {
8439 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8440
8441 // FIXME: Skip over implicit declarations for now. This matters for things
8442 // like implicitly-declared special member functions. This isn't entirely
8443 // correct; we can end up with multiple unmerged declarations of the same
8444 // implicit entity.
8445 if (D->isImplicit())
8446 continue;
8447
8448 DeclContext *CanonDef = D->getDeclContext();
8449
8450 bool Found = false;
8451 const Decl *DCanon = D->getCanonicalDecl();
8452
8453 for (auto RI : D->redecls()) {
8454 if (RI->getLexicalDeclContext() == CanonDef) {
8455 Found = true;
8456 break;
8457 }
8458 }
8459 if (Found)
8460 continue;
8461
8462 // Quick check failed, time to do the slow thing. Note, we can't just
8463 // look up the name of D in CanonDef here, because the member that is
8464 // in CanonDef might not be found by name lookup (it might have been
8465 // replaced by a more recent declaration in the lookup table), and we
8466 // can't necessarily find it in the redeclaration chain because it might
8467 // be merely mergeable, not redeclarable.
8468 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8469 for (auto *CanonMember : CanonDef->decls()) {
8470 if (CanonMember->getCanonicalDecl() == DCanon) {
8471 // This can happen if the declaration is merely mergeable and not
8472 // actually redeclarable (we looked for redeclarations earlier).
8473 //
8474 // FIXME: We should be able to detect this more efficiently, without
8475 // pulling in all of the members of CanonDef.
8476 Found = true;
8477 break;
8478 }
8479 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
8480 if (ND->getDeclName() == D->getDeclName())
8481 Candidates.push_back(ND);
8482 }
8483
8484 if (!Found) {
8485 // The AST doesn't like TagDecls becoming invalid after they've been
8486 // completed. We only really need to mark FieldDecls as invalid here.
8487 if (!isa<TagDecl>(D))
8488 D->setInvalidDecl();
8489
8490 // Ensure we don't accidentally recursively enter deserialization while
8491 // we're producing our diagnostic.
8492 Deserializing RecursionGuard(this);
8493
8494 std::string CanonDefModule =
8495 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8496 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8497 << D << getOwningModuleNameForDiagnostic(D)
8498 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8499
8500 if (Candidates.empty())
8501 Diag(cast<Decl>(CanonDef)->getLocation(),
8502 diag::note_module_odr_violation_no_possible_decls) << D;
8503 else {
8504 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8505 Diag(Candidates[I]->getLocation(),
8506 diag::note_module_odr_violation_possible_decl)
8507 << Candidates[I];
8508 }
8509
8510 DiagnosedOdrMergeFailures.insert(CanonDef);
8511 }
8512 }
8513
8514 if (OdrMergeFailures.empty())
8515 return;
8516
8517 // Ensure we don't accidentally recursively enter deserialization while
8518 // we're producing our diagnostics.
8519 Deserializing RecursionGuard(this);
8520
8521 // Issue any pending ODR-failure diagnostics.
8522 for (auto &Merge : OdrMergeFailures) {
8523 // If we've already pointed out a specific problem with this class, don't
8524 // bother issuing a general "something's different" diagnostic.
8525 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
8526 continue;
8527
8528 bool Diagnosed = false;
8529 for (auto *RD : Merge.second) {
8530 // Multiple different declarations got merged together; tell the user
8531 // where they came from.
8532 if (Merge.first != RD) {
8533 // FIXME: Walk the definition, figure out what's different,
8534 // and diagnose that.
8535 if (!Diagnosed) {
8536 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8537 Diag(Merge.first->getLocation(),
8538 diag::err_module_odr_violation_different_definitions)
8539 << Merge.first << Module.empty() << Module;
8540 Diagnosed = true;
8541 }
8542
8543 Diag(RD->getLocation(),
8544 diag::note_module_odr_violation_different_definitions)
8545 << getOwningModuleNameForDiagnostic(RD);
8546 }
8547 }
8548
8549 if (!Diagnosed) {
8550 // All definitions are updates to the same declaration. This happens if a
8551 // module instantiates the declaration of a class template specialization
8552 // and two or more other modules instantiate its definition.
8553 //
8554 // FIXME: Indicate which modules had instantiations of this definition.
8555 // FIXME: How can this even happen?
8556 Diag(Merge.first->getLocation(),
8557 diag::err_module_odr_violation_different_instantiations)
8558 << Merge.first;
8559 }
8560 }
8561 }
8562
StartedDeserializing()8563 void ASTReader::StartedDeserializing() {
8564 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
8565 ReadTimer->startTimer();
8566 }
8567
FinishedDeserializing()8568 void ASTReader::FinishedDeserializing() {
8569 assert(NumCurrentElementsDeserializing &&
8570 "FinishedDeserializing not paired with StartedDeserializing");
8571 if (NumCurrentElementsDeserializing == 1) {
8572 // We decrease NumCurrentElementsDeserializing only after pending actions
8573 // are finished, to avoid recursively re-calling finishPendingActions().
8574 finishPendingActions();
8575 }
8576 --NumCurrentElementsDeserializing;
8577
8578 if (NumCurrentElementsDeserializing == 0) {
8579 // Propagate exception specification updates along redeclaration chains.
8580 while (!PendingExceptionSpecUpdates.empty()) {
8581 auto Updates = std::move(PendingExceptionSpecUpdates);
8582 PendingExceptionSpecUpdates.clear();
8583 for (auto Update : Updates) {
8584 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8585 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
8586 if (auto *Listener = Context.getASTMutationListener())
8587 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
8588 for (auto *Redecl : Update.second->redecls())
8589 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
8590 }
8591 }
8592
8593 if (ReadTimer)
8594 ReadTimer->stopTimer();
8595
8596 diagnoseOdrViolations();
8597
8598 // We are not in recursive loading, so it's safe to pass the "interesting"
8599 // decls to the consumer.
8600 if (Consumer)
8601 PassInterestingDeclsToConsumer();
8602 }
8603 }
8604
pushExternalDeclIntoScope(NamedDecl * D,DeclarationName Name)8605 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8606 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8607 // Remove any fake results before adding any real ones.
8608 auto It = PendingFakeLookupResults.find(II);
8609 if (It != PendingFakeLookupResults.end()) {
8610 for (auto *ND : It->second)
8611 SemaObj->IdResolver.RemoveDecl(ND);
8612 // FIXME: this works around module+PCH performance issue.
8613 // Rather than erase the result from the map, which is O(n), just clear
8614 // the vector of NamedDecls.
8615 It->second.clear();
8616 }
8617 }
8618
8619 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8620 SemaObj->TUScope->AddDecl(D);
8621 } else if (SemaObj->TUScope) {
8622 // Adding the decl to IdResolver may have failed because it was already in
8623 // (even though it was not added in scope). If it is already in, make sure
8624 // it gets in the scope as well.
8625 if (std::find(SemaObj->IdResolver.begin(Name),
8626 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8627 SemaObj->TUScope->AddDecl(D);
8628 }
8629 }
8630
ASTReader(Preprocessor & PP,ASTContext & Context,const PCHContainerReader & PCHContainerRdr,ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,StringRef isysroot,bool DisableValidation,bool AllowASTWithCompilerErrors,bool AllowConfigurationMismatch,bool ValidateSystemInputs,bool UseGlobalIndex,std::unique_ptr<llvm::Timer> ReadTimer)8631 ASTReader::ASTReader(
8632 Preprocessor &PP, ASTContext &Context,
8633 const PCHContainerReader &PCHContainerRdr,
8634 ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
8635 StringRef isysroot, bool DisableValidation,
8636 bool AllowASTWithCompilerErrors,
8637 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8638 bool UseGlobalIndex,
8639 std::unique_ptr<llvm::Timer> ReadTimer)
8640 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8641 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8642 FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr),
8643 Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context),
8644 Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr),
8645 ReadTimer(std::move(ReadTimer)),
8646 isysroot(isysroot), DisableValidation(DisableValidation),
8647 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8648 AllowConfigurationMismatch(AllowConfigurationMismatch),
8649 ValidateSystemInputs(ValidateSystemInputs),
8650 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8651 CurrSwitchCaseStmts(&SwitchCaseStmts), NumSLocEntriesRead(0),
8652 TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0),
8653 NumMacrosRead(0), TotalNumMacros(0), NumIdentifierLookups(0),
8654 NumIdentifierLookupHits(0), NumSelectorsRead(0),
8655 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8656 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8657 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8658 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8659 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8660 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8661 PassingDeclsToConsumer(false), ReadingKind(Read_None) {
8662 SourceMgr.setExternalSLocEntrySource(this);
8663
8664 for (const auto &Ext : Extensions) {
8665 auto BlockName = Ext->getExtensionMetadata().BlockName;
8666 auto Known = ModuleFileExtensions.find(BlockName);
8667 if (Known != ModuleFileExtensions.end()) {
8668 Diags.Report(diag::warn_duplicate_module_file_extension)
8669 << BlockName;
8670 continue;
8671 }
8672
8673 ModuleFileExtensions.insert({BlockName, Ext});
8674 }
8675 }
8676
~ASTReader()8677 ASTReader::~ASTReader() {
8678 if (OwnsDeserializationListener)
8679 delete DeserializationListener;
8680 }
8681