clang 23.0.0git
ASTReader.cpp
Go to the documentation of this file.
1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ASTCommon.h"
14#include "ASTReaderInternals.h"
22#include "clang/AST/Attr.h"
23#include "clang/AST/Decl.h"
24#include "clang/AST/DeclBase.h"
25#include "clang/AST/DeclCXX.h"
27#include "clang/AST/DeclGroup.h"
28#include "clang/AST/DeclObjC.h"
31#include "clang/AST/Expr.h"
32#include "clang/AST/ExprCXX.h"
41#include "clang/AST/Type.h"
42#include "clang/AST/TypeLoc.h"
54#include "clang/Basic/LLVM.h"
56#include "clang/Basic/Module.h"
70#include "clang/Basic/Version.h"
73#include "clang/Lex/MacroInfo.h"
74#include "clang/Lex/ModuleMap.h"
78#include "clang/Lex/Token.h"
80#include "clang/Sema/Scope.h"
81#include "clang/Sema/Sema.h"
82#include "clang/Sema/SemaCUDA.h"
83#include "clang/Sema/SemaObjC.h"
84#include "clang/Sema/Weak.h"
97#include "llvm/ADT/APFloat.h"
98#include "llvm/ADT/APInt.h"
99#include "llvm/ADT/ArrayRef.h"
100#include "llvm/ADT/DenseMap.h"
101#include "llvm/ADT/FoldingSet.h"
102#include "llvm/ADT/IntrusiveRefCntPtr.h"
103#include "llvm/ADT/STLExtras.h"
104#include "llvm/ADT/ScopeExit.h"
105#include "llvm/ADT/Sequence.h"
106#include "llvm/ADT/SmallPtrSet.h"
107#include "llvm/ADT/SmallVector.h"
108#include "llvm/ADT/StringExtras.h"
109#include "llvm/ADT/StringMap.h"
110#include "llvm/ADT/StringRef.h"
111#include "llvm/ADT/iterator_range.h"
112#include "llvm/Bitstream/BitstreamReader.h"
113#include "llvm/Support/Compiler.h"
114#include "llvm/Support/Compression.h"
115#include "llvm/Support/DJB.h"
116#include "llvm/Support/Endian.h"
117#include "llvm/Support/Error.h"
118#include "llvm/Support/ErrorHandling.h"
119#include "llvm/Support/LEB128.h"
120#include "llvm/Support/MemoryBuffer.h"
121#include "llvm/Support/Path.h"
122#include "llvm/Support/SaveAndRestore.h"
123#include "llvm/Support/TimeProfiler.h"
124#include "llvm/Support/Timer.h"
125#include "llvm/Support/VersionTuple.h"
126#include "llvm/Support/raw_ostream.h"
127#include "llvm/TargetParser/Triple.h"
128#include <algorithm>
129#include <cassert>
130#include <cstddef>
131#include <cstdint>
132#include <cstdio>
133#include <ctime>
134#include <iterator>
135#include <limits>
136#include <map>
137#include <memory>
138#include <optional>
139#include <string>
140#include <system_error>
141#include <tuple>
142#include <utility>
143#include <vector>
144
145using namespace clang;
146using namespace clang::serialization;
147using namespace clang::serialization::reader;
148using llvm::BitstreamCursor;
149
150//===----------------------------------------------------------------------===//
151// ChainedASTReaderListener implementation
152//===----------------------------------------------------------------------===//
153
154bool
156 return First->ReadFullVersionInformation(FullVersion) ||
157 Second->ReadFullVersionInformation(FullVersion);
158}
159
161 First->ReadModuleName(ModuleName);
162 Second->ReadModuleName(ModuleName);
163}
164
165void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
166 First->ReadModuleMapFile(ModuleMapPath);
167 Second->ReadModuleMapFile(ModuleMapPath);
168}
169
171 const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain,
172 bool AllowCompatibleDifferences) {
173 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
174 AllowCompatibleDifferences) ||
175 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
176 AllowCompatibleDifferences);
177}
178
180 const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain,
181 bool AllowCompatibleDifferences) {
182 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
183 AllowCompatibleDifferences) ||
184 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
185 AllowCompatibleDifferences);
186}
187
189 const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain,
190 bool AllowCompatibleDifferences) {
191 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
192 AllowCompatibleDifferences) ||
193 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
194 AllowCompatibleDifferences);
195}
196
198 DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) {
199 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
200 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
201}
202
203bool
205 bool Complain) {
206 return First->ReadFileSystemOptions(FSOpts, Complain) ||
207 Second->ReadFileSystemOptions(FSOpts, Complain);
208}
209
211 const HeaderSearchOptions &HSOpts, StringRef ModuleFilename,
212 StringRef ContextHash, bool Complain) {
213 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
214 Complain) ||
215 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
216 Complain);
217}
218
220 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
221 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
222 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
223 Complain, SuggestedPredefines) ||
224 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
225 Complain, SuggestedPredefines);
226}
227
229 uint32_t Value) {
230 First->ReadCounter(M, Value);
231 Second->ReadCounter(M, Value);
232}
233
235 return First->needsInputFileVisitation() ||
236 Second->needsInputFileVisitation();
237}
238
240 return First->needsSystemInputFileVisitation() ||
241 Second->needsSystemInputFileVisitation();
242}
243
245 ModuleKind Kind,
246 bool DirectlyImported) {
247 First->visitModuleFile(Filename, Kind, DirectlyImported);
248 Second->visitModuleFile(Filename, Kind, DirectlyImported);
249}
250
252 bool isSystem,
253 bool isOverridden,
254 bool isExplicitModule) {
255 bool Continue = false;
256 if (First->needsInputFileVisitation() &&
257 (!isSystem || First->needsSystemInputFileVisitation()))
258 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
259 isExplicitModule);
260 if (Second->needsInputFileVisitation() &&
261 (!isSystem || Second->needsSystemInputFileVisitation()))
262 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
263 isExplicitModule);
264 return Continue;
265}
266
268 const ModuleFileExtensionMetadata &Metadata) {
269 First->readModuleFileExtension(Metadata);
270 Second->readModuleFileExtension(Metadata);
271}
272
273//===----------------------------------------------------------------------===//
274// PCH validator implementation
275//===----------------------------------------------------------------------===//
276
278
279static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(
280 DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue,
281 bool CurrentValue, StringRef ModuleFilename) {
282 if (!Diags)
283 return true;
284 return Diags->Report(diag::err_ast_file_langopt_mismatch)
285 << Description << SerializedValue << CurrentValue << ModuleFilename;
286}
287
288static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(
289 DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename) {
290 if (!Diags)
291 return true;
292 return Diags->Report(diag::err_ast_file_langopt_value_mismatch)
293 << Description << ModuleFilename;
294}
295
296/// Compare the given set of language options against an existing set of
297/// language options.
298///
299/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
300/// \param AllowCompatibleDifferences If true, differences between compatible
301/// language options will be permitted.
302///
303/// \returns true if the languagae options mis-match, false otherwise.
304static bool checkLanguageOptions(const LangOptions &LangOpts,
305 const LangOptions &ExistingLangOpts,
306 StringRef ModuleFilename,
307 DiagnosticsEngine *Diags,
308 bool AllowCompatibleDifferences = true) {
309 // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
311
312#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
313 if constexpr (CK::Compatibility != CK::Benign) { \
314 if ((CK::Compatibility == CK::NotCompatible) || \
315 (CK::Compatibility == CK::Compatible && \
316 !AllowCompatibleDifferences)) { \
317 if (ExistingLangOpts.Name != LangOpts.Name) { \
318 if (Bits == 1) \
319 return diagnoseLanguageOptionFlagMismatch( \
320 Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
321 ModuleFilename); \
322 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
323 ModuleFilename); \
324 } \
325 } \
326 }
327
328#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
329 if constexpr (CK::Compatibility != CK::Benign) { \
330 if ((CK::Compatibility == CK::NotCompatible) || \
331 (CK::Compatibility == CK::Compatible && \
332 !AllowCompatibleDifferences)) { \
333 if (ExistingLangOpts.Name != LangOpts.Name) { \
334 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
335 ModuleFilename); \
336 } \
337 } \
338 }
339
340#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
341 if constexpr (CK::Compatibility != CK::Benign) { \
342 if ((CK::Compatibility == CK::NotCompatible) || \
343 (CK::Compatibility == CK::Compatible && \
344 !AllowCompatibleDifferences)) { \
345 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
346 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
347 ModuleFilename); \
348 } \
349 } \
350 }
351
352#include "clang/Basic/LangOptions.def"
353
354 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
355 return diagnoseLanguageOptionValueMismatch(Diags, "module features",
356 ModuleFilename);
357 }
358
359 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
361 Diags, "target Objective-C runtime", ModuleFilename);
362 }
363
364 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
366 return diagnoseLanguageOptionValueMismatch(Diags, "block command names",
367 ModuleFilename);
368 }
369
370 // Sanitizer feature mismatches are treated as compatible differences. If
371 // compatible differences aren't allowed, we still only want to check for
372 // mismatches of non-modular sanitizers (the only ones which can affect AST
373 // generation).
374 if (!AllowCompatibleDifferences) {
375 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
376 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
377 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
378 ExistingSanitizers.clear(ModularSanitizers);
379 ImportedSanitizers.clear(ModularSanitizers);
380 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
381 const std::string Flag = "-fsanitize=";
382 if (Diags) {
383#define SANITIZER(NAME, ID) \
384 { \
385 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
386 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
387 if (InExistingModule != InImportedModule) \
388 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
389 << InExistingModule << ModuleFilename << (Flag + NAME); \
390 }
391#include "clang/Basic/Sanitizers.def"
392 }
393 return true;
394 }
395 }
396
397 return false;
398}
399
400static bool checkCodegenOptions(const CodeGenOptions &CGOpts,
401 const CodeGenOptions &ExistingCGOpts,
402 StringRef ModuleFilename,
403 DiagnosticsEngine *Diags,
404 bool AllowCompatibleDifferences = true) {
405 // FIXME: Specify and print a description for each option instead of the name.
406 // FIXME: Replace with C++20 `using enum CodeGenOptions::CompatibilityKind`.
408#define CODEGENOPT(Name, Bits, Default, Compatibility) \
409 if constexpr (CK::Compatibility != CK::Benign) { \
410 if ((CK::Compatibility == CK::NotCompatible) || \
411 (CK::Compatibility == CK::Compatible && \
412 !AllowCompatibleDifferences)) { \
413 if (ExistingCGOpts.Name != CGOpts.Name) { \
414 if (Diags) { \
415 if (Bits == 1) \
416 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
417 << #Name << CGOpts.Name << ExistingCGOpts.Name \
418 << ModuleFilename; \
419 else \
420 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
421 << #Name << ModuleFilename; \
422 } \
423 return true; \
424 } \
425 } \
426 }
427
428#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
429 if constexpr (CK::Compatibility != CK::Benign) { \
430 if ((CK::Compatibility == CK::NotCompatible) || \
431 (CK::Compatibility == CK::Compatible && \
432 !AllowCompatibleDifferences)) { \
433 if (ExistingCGOpts.Name != CGOpts.Name) { \
434 if (Diags) \
435 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
436 << #Name << ModuleFilename; \
437 return true; \
438 } \
439 } \
440 }
441#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
442 if constexpr (CK::Compatibility != CK::Benign) { \
443 if ((CK::Compatibility == CK::NotCompatible) || \
444 (CK::Compatibility == CK::Compatible && \
445 !AllowCompatibleDifferences)) { \
446 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
447 if (Diags) \
448 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
449 << #Name << ModuleFilename; \
450 return true; \
451 } \
452 } \
453 }
454#define DEBUGOPT(Name, Bits, Default, Compatibility)
455#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
456#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
457#include "clang/Basic/CodeGenOptions.def"
458
459 return false;
460}
461
462static std::vector<std::string>
463accumulateFeaturesAsWritten(std::vector<std::string> FeaturesAsWritten) {
464 llvm::erase_if(FeaturesAsWritten, [](const std::string &S) {
465 return S.empty() || (S[0] != '+' && S[0] != '-');
466 });
467 llvm::stable_sort(FeaturesAsWritten,
468 [](const std::string &A, const std::string &B) {
469 return A.substr(1) < B.substr(1);
470 });
471 auto NewRend =
472 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
473 [](const std::string &A, const std::string &B) {
474 return A.substr(1) == B.substr(1);
475 });
476 // Because we are operating on reverse iterators, the duplicate elements
477 // are actually at the beginning.
478 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
479 return FeaturesAsWritten;
480}
481
482/// Compare the given set of target options against an existing set of
483/// target options.
484///
485/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
486///
487/// \returns true if the target options mis-match, false otherwise.
488static bool checkTargetOptions(const TargetOptions &TargetOpts,
489 const TargetOptions &ExistingTargetOpts,
490 StringRef ModuleFilename,
491 DiagnosticsEngine *Diags,
492 bool AllowCompatibleDifferences = true) {
493#define CHECK_TARGET_OPT(Field, Name) \
494 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
495 if (Diags) \
496 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
497 << ModuleFilename << Name << TargetOpts.Field \
498 << ExistingTargetOpts.Field; \
499 return true; \
500 }
501
502 // The triple and ABI must match exactly.
503 CHECK_TARGET_OPT(Triple, "target");
504 CHECK_TARGET_OPT(ABI, "target ABI");
505
506 // We can tolerate different CPUs in many cases, notably when one CPU
507 // supports a strict superset of another. When allowing compatible
508 // differences skip this check.
509 if (!AllowCompatibleDifferences) {
510 CHECK_TARGET_OPT(CPU, "target CPU");
511 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
512 }
513
514#undef CHECK_TARGET_OPT
515
516 // Compare feature sets.
517 // Alternatively, we could be diffing TargetOpts.Features, but that would
518 // clutter the output with implied features.
519 std::vector<std::string> ExistingFeatures =
521 std::vector<std::string> ReadFeatures =
523
524 // We compute the set difference in both directions explicitly so that we can
525 // diagnose the differences differently.
526 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
527 std::set_difference(
528 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
529 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
530 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
531 ExistingFeatures.begin(), ExistingFeatures.end(),
532 std::back_inserter(UnmatchedReadFeatures));
533
534 // If we are allowing compatible differences and the read feature set is
535 // a strict subset of the existing feature set, there is nothing to diagnose.
536 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
537 return false;
538
539 if (Diags) {
540 for (StringRef Feature : UnmatchedReadFeatures)
541 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
542 << /* is-existing-feature */ false << ModuleFilename << Feature;
543 for (StringRef Feature : UnmatchedExistingFeatures)
544 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
545 << /* is-existing-feature */ true << ModuleFilename << Feature;
546 }
547
548 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
549}
550
552 StringRef ModuleFilename, bool Complain,
553 bool AllowCompatibleDifferences) {
554 const LangOptions &ExistingLangOpts = PP.getLangOpts();
555 return checkLanguageOptions(LangOpts, ExistingLangOpts, ModuleFilename,
556 Complain ? &Reader.Diags : nullptr,
557 AllowCompatibleDifferences);
558}
559
561 StringRef ModuleFilename, bool Complain,
562 bool AllowCompatibleDifferences) {
563 const CodeGenOptions &ExistingCGOpts = Reader.getCodeGenOpts();
564 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
565 Complain ? &Reader.Diags : nullptr,
566 AllowCompatibleDifferences);
567}
568
570 StringRef ModuleFilename, bool Complain,
571 bool AllowCompatibleDifferences) {
572 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
573 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
574 Complain ? &Reader.Diags : nullptr,
575 AllowCompatibleDifferences);
576}
577
578namespace {
579
580using MacroDefinitionsMap =
581 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
582
583class DeclsSet {
586
587public:
588 operator ArrayRef<NamedDecl *>() const { return Decls; }
589
590 bool empty() const { return Decls.empty(); }
591
592 bool insert(NamedDecl *ND) {
593 auto [_, Inserted] = Found.insert(ND);
594 if (Inserted)
595 Decls.push_back(ND);
596 return Inserted;
597 }
598};
599
600using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
601
602} // namespace
603
605 DiagnosticsEngine &Diags,
606 StringRef ModuleFilename,
607 bool Complain) {
608 using Level = DiagnosticsEngine::Level;
609
610 // Check current mappings for new -Werror mappings, and the stored mappings
611 // for cases that were explicitly mapped to *not* be errors that are now
612 // errors because of options like -Werror.
613 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
614
615 for (DiagnosticsEngine *MappingSource : MappingSources) {
616 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
617 diag::kind DiagID = DiagIDMappingPair.first;
618 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
619 if (CurLevel < DiagnosticsEngine::Error)
620 continue; // not significant
621 Level StoredLevel =
622 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
623 if (StoredLevel < DiagnosticsEngine::Error) {
624 if (Complain)
625 Diags.Report(diag::err_ast_file_diagopt_mismatch)
626 << "-Werror=" + Diags.getDiagnosticIDs()
627 ->getWarningOptionForDiag(DiagID)
628 .str()
629 << ModuleFilename;
630 return true;
631 }
632 }
633 }
634
635 return false;
636}
637
640 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
641 return true;
642 return Ext >= diag::Severity::Error;
643}
644
646 DiagnosticsEngine &Diags,
647 StringRef ModuleFilename, bool IsSystem,
648 bool SystemHeaderWarningsInModule,
649 bool Complain) {
650 // Top-level options
651 if (IsSystem) {
652 if (Diags.getSuppressSystemWarnings())
653 return false;
654 // If -Wsystem-headers was not enabled before, and it was not explicit,
655 // be conservative
656 if (StoredDiags.getSuppressSystemWarnings() &&
657 !SystemHeaderWarningsInModule) {
658 if (Complain)
659 Diags.Report(diag::err_ast_file_diagopt_mismatch)
660 << "-Wsystem-headers" << ModuleFilename;
661 return true;
662 }
663 }
664
665 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
666 if (Complain)
667 Diags.Report(diag::err_ast_file_diagopt_mismatch)
668 << "-Werror" << ModuleFilename;
669 return true;
670 }
671
672 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
673 !StoredDiags.getEnableAllWarnings()) {
674 if (Complain)
675 Diags.Report(diag::err_ast_file_diagopt_mismatch)
676 << "-Weverything -Werror" << ModuleFilename;
677 return true;
678 }
679
680 if (isExtHandlingFromDiagsError(Diags) &&
681 !isExtHandlingFromDiagsError(StoredDiags)) {
682 if (Complain)
683 Diags.Report(diag::err_ast_file_diagopt_mismatch)
684 << "-pedantic-errors" << ModuleFilename;
685 return true;
686 }
687
688 return checkDiagnosticGroupMappings(StoredDiags, Diags, ModuleFilename,
689 Complain);
690}
691
692/// Return the top import module if it is implicit, nullptr otherwise.
694 Preprocessor &PP) {
695 // If the original import came from a file explicitly generated by the user,
696 // don't check the diagnostic mappings.
697 // FIXME: currently this is approximated by checking whether this is not a
698 // module import of an implicitly-loaded module file.
699 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
700 // the transitive closure of its imports, since unrelated modules cannot be
701 // imported until after this module finishes validation.
702 ModuleFile *TopImport = &*ModuleMgr.rbegin();
703 while (!TopImport->ImportedBy.empty())
704 TopImport = TopImport->ImportedBy[0];
705 if (TopImport->Kind != MK_ImplicitModule)
706 return nullptr;
707
708 StringRef ModuleName = TopImport->ModuleName;
709 assert(!ModuleName.empty() && "diagnostic options read before module name");
710
711 Module *M =
712 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
713 assert(M && "missing module");
714 return M;
715}
716
718 StringRef ModuleFilename,
719 bool Complain) {
720 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
722 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
723 // This should never fail, because we would have processed these options
724 // before writing them to an ASTFile.
725 ProcessWarningOptions(*Diags, DiagOpts,
726 PP.getFileManager().getVirtualFileSystem(),
727 /*Report*/ false);
728
729 ModuleManager &ModuleMgr = Reader.getModuleManager();
730 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
731
732 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
733 if (!TopM)
734 return false;
735
736 Module *Importer = PP.getCurrentModule();
737
738 DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
739 bool SystemHeaderWarningsInModule =
740 Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
741 Importer->Name);
742
743 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
744 // contains the union of their flags.
745 return checkDiagnosticMappings(*Diags, ExistingDiags, ModuleFilename,
746 TopM->IsSystem, SystemHeaderWarningsInModule,
747 Complain);
748}
749
750/// Collect the macro definitions provided by the given preprocessor
751/// options.
752static void
754 MacroDefinitionsMap &Macros,
755 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
756 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
757 StringRef Macro = PPOpts.Macros[I].first;
758 bool IsUndef = PPOpts.Macros[I].second;
759
760 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
761 StringRef MacroName = MacroPair.first;
762 StringRef MacroBody = MacroPair.second;
763
764 // For an #undef'd macro, we only care about the name.
765 if (IsUndef) {
766 auto [It, Inserted] = Macros.try_emplace(MacroName);
767 if (MacroNames && Inserted)
768 MacroNames->push_back(MacroName);
769
770 It->second = std::make_pair("", true);
771 continue;
772 }
773
774 // For a #define'd macro, figure out the actual definition.
775 if (MacroName.size() == Macro.size())
776 MacroBody = "1";
777 else {
778 // Note: GCC drops anything following an end-of-line character.
779 StringRef::size_type End = MacroBody.find_first_of("\n\r");
780 MacroBody = MacroBody.substr(0, End);
781 }
782
783 auto [It, Inserted] = Macros.try_emplace(MacroName);
784 if (MacroNames && Inserted)
785 MacroNames->push_back(MacroName);
786 It->second = std::make_pair(MacroBody, false);
787 }
788}
789
795
796/// Check the preprocessor options deserialized from the control block
797/// against the preprocessor options in an existing preprocessor.
798///
799/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
800/// \param Validation If set to OptionValidateNone, ignore differences in
801/// preprocessor options. If set to OptionValidateContradictions,
802/// require that options passed both in the AST file and on the command
803/// line (-D or -U) match, but tolerate options missing in one or the
804/// other. If set to OptionValidateContradictions, require that there
805/// are no differences in the options between the two.
807 const PreprocessorOptions &PPOpts,
808 const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename,
809 bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr,
810 std::string &SuggestedPredefines, const LangOptions &LangOpts,
812 if (ReadMacros) {
813 // Check macro definitions.
814 MacroDefinitionsMap ASTFileMacros;
815 collectMacroDefinitions(PPOpts, ASTFileMacros);
816 MacroDefinitionsMap ExistingMacros;
817 SmallVector<StringRef, 4> ExistingMacroNames;
818 collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
819 &ExistingMacroNames);
820
821 // Use a line marker to enter the <command line> file, as the defines and
822 // undefines here will have come from the command line.
823 SuggestedPredefines += "# 1 \"<command line>\" 1\n";
824
825 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
826 // Dig out the macro definition in the existing preprocessor options.
827 StringRef MacroName = ExistingMacroNames[I];
828 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
829
830 // Check whether we know anything about this macro name or not.
831 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
832 ASTFileMacros.find(MacroName);
833 if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
834 if (Validation == OptionValidateStrictMatches) {
835 // If strict matches are requested, don't tolerate any extra defines
836 // on the command line that are missing in the AST file.
837 if (Diags) {
838 Diags->Report(diag::err_ast_file_macro_def_undef)
839 << MacroName << true << ModuleFilename;
840 }
841 return true;
842 }
843 // FIXME: Check whether this identifier was referenced anywhere in the
844 // AST file. If so, we should reject the AST file. Unfortunately, this
845 // information isn't in the control block. What shall we do about it?
846
847 if (Existing.second) {
848 SuggestedPredefines += "#undef ";
849 SuggestedPredefines += MacroName.str();
850 SuggestedPredefines += '\n';
851 } else {
852 SuggestedPredefines += "#define ";
853 SuggestedPredefines += MacroName.str();
854 SuggestedPredefines += ' ';
855 SuggestedPredefines += Existing.first.str();
856 SuggestedPredefines += '\n';
857 }
858 continue;
859 }
860
861 // If the macro was defined in one but undef'd in the other, we have a
862 // conflict.
863 if (Existing.second != Known->second.second) {
864 if (Diags) {
865 Diags->Report(diag::err_ast_file_macro_def_undef)
866 << MacroName << Known->second.second << ModuleFilename;
867 }
868 return true;
869 }
870
871 // If the macro was #undef'd in both, or if the macro bodies are
872 // identical, it's fine.
873 if (Existing.second || Existing.first == Known->second.first) {
874 ASTFileMacros.erase(Known);
875 continue;
876 }
877
878 // The macro bodies differ; complain.
879 if (Diags) {
880 Diags->Report(diag::err_ast_file_macro_def_conflict)
881 << MacroName << Known->second.first << Existing.first
882 << ModuleFilename;
883 }
884 return true;
885 }
886
887 // Leave the <command line> file and return to <built-in>.
888 SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
889
890 if (Validation == OptionValidateStrictMatches) {
891 // If strict matches are requested, don't tolerate any extra defines in
892 // the AST file that are missing on the command line.
893 for (const auto &MacroName : ASTFileMacros.keys()) {
894 if (Diags) {
895 Diags->Report(diag::err_ast_file_macro_def_undef)
896 << MacroName << false << ModuleFilename;
897 }
898 return true;
899 }
900 }
901 }
902
903 // Check whether we're using predefines.
904 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
905 Validation != OptionValidateNone) {
906 if (Diags) {
907 Diags->Report(diag::err_ast_file_undef)
908 << ExistingPPOpts.UsePredefines << ModuleFilename;
909 }
910 return true;
911 }
912
913 // Detailed record is important since it is used for the module cache hash.
914 if (LangOpts.Modules &&
915 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
916 Validation != OptionValidateNone) {
917 if (Diags) {
918 Diags->Report(diag::err_ast_file_pp_detailed_record)
919 << PPOpts.DetailedRecord << ModuleFilename;
920 }
921 return true;
922 }
923
924 // Compute the #include and #include_macros lines we need.
925 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
926 StringRef File = ExistingPPOpts.Includes[I];
927
928 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
929 !ExistingPPOpts.PCHThroughHeader.empty()) {
930 // In case the through header is an include, we must add all the includes
931 // to the predefines so the start point can be determined.
932 SuggestedPredefines += "#include \"";
933 SuggestedPredefines += File;
934 SuggestedPredefines += "\"\n";
935 continue;
936 }
937
938 if (File == ExistingPPOpts.ImplicitPCHInclude)
939 continue;
940
941 if (llvm::is_contained(PPOpts.Includes, File))
942 continue;
943
944 SuggestedPredefines += "#include \"";
945 SuggestedPredefines += File;
946 SuggestedPredefines += "\"\n";
947 }
948
949 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
950 StringRef File = ExistingPPOpts.MacroIncludes[I];
951 if (llvm::is_contained(PPOpts.MacroIncludes, File))
952 continue;
953
954 SuggestedPredefines += "#__include_macros \"";
955 SuggestedPredefines += File;
956 SuggestedPredefines += "\"\n##\n";
957 }
958
959 return false;
960}
961
963 StringRef ModuleFilename,
964 bool ReadMacros, bool Complain,
965 std::string &SuggestedPredefines) {
966 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
967
969 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
970 Complain ? &Reader.Diags : nullptr, PP.getFileManager(),
971 SuggestedPredefines, PP.getLangOpts());
972}
973
975 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
976 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
977 return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(),
978 ModuleFilename, ReadMacros, nullptr,
979 PP.getFileManager(), SuggestedPredefines,
980 PP.getLangOpts(), OptionValidateNone);
981}
982
983/// Check that the specified and the existing module cache paths are equivalent.
984///
985/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
986/// \returns true when the module cache paths differ.
987static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash,
988 StringRef ExistingSpecificModuleCachePath,
989 StringRef ASTFilename,
990 DiagnosticsEngine *Diags,
991 const LangOptions &LangOpts,
992 const PreprocessorOptions &PPOpts,
993 const HeaderSearchOptions &HSOpts,
994 const HeaderSearchOptions &ASTFileHSOpts) {
995 std::string SpecificModuleCachePath = createSpecificModuleCachePath(
996 FileMgr, ASTFileHSOpts.ModuleCachePath, ASTFileHSOpts.DisableModuleHash,
997 std::string(ContextHash));
998
999 if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
1000 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
1001 return false;
1002 auto EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1003 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1004 if (EqualOrErr && *EqualOrErr)
1005 return false;
1006 if (Diags) {
1007 // If the module cache arguments provided from the command line are the
1008 // same, the mismatch must come from other arguments of the configuration
1009 // and not directly the cache path.
1010 EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1011 ASTFileHSOpts.ModuleCachePath, HSOpts.ModuleCachePath);
1012 if (EqualOrErr && *EqualOrErr)
1013 Diags->Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1014 else
1015 Diags->Report(diag::err_ast_file_modulecache_mismatch)
1016 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1017 << ASTFilename;
1018 }
1019 return true;
1020}
1021
1023 StringRef ASTFilename,
1024 StringRef ContextHash,
1025 bool Complain) {
1026 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1027 return checkModuleCachePath(Reader.getFileManager(), ContextHash,
1028 HeaderSearchInfo.getSpecificModuleCachePath(),
1029 ASTFilename, Complain ? &Reader.Diags : nullptr,
1030 PP.getLangOpts(), PP.getPreprocessorOpts(),
1031 HeaderSearchInfo.getHeaderSearchOpts(), HSOpts);
1032}
1033
1035 PP.setCounterValue(Value);
1036}
1037
1038//===----------------------------------------------------------------------===//
1039// AST reader implementation
1040//===----------------------------------------------------------------------===//
1041
1042static uint64_t readULEB(const unsigned char *&P) {
1043 unsigned Length = 0;
1044 const char *Error = nullptr;
1045
1046 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
1047 if (Error)
1048 llvm::report_fatal_error(Error);
1049 P += Length;
1050 return Val;
1051}
1052
1053/// Read ULEB-encoded key length and data length.
1054static std::pair<unsigned, unsigned>
1055readULEBKeyDataLength(const unsigned char *&P) {
1056 unsigned KeyLen = readULEB(P);
1057 if ((unsigned)KeyLen != KeyLen)
1058 llvm::report_fatal_error("key too large");
1059
1060 unsigned DataLen = readULEB(P);
1061 if ((unsigned)DataLen != DataLen)
1062 llvm::report_fatal_error("data too large");
1063
1064 return std::make_pair(KeyLen, DataLen);
1065}
1066
1068 bool TakeOwnership) {
1069 DeserializationListener = Listener;
1070 OwnsDeserializationListener = TakeOwnership;
1071}
1072
1076
1078 LocalDeclID ID(Value);
1079#ifndef NDEBUG
1080 if (!MF.ModuleOffsetMap.empty())
1081 Reader.ReadModuleOffsetMap(MF);
1082
1083 unsigned ModuleFileIndex = ID.getModuleFileIndex();
1084 unsigned LocalDeclID = ID.getLocalDeclIndex();
1085
1086 assert(ModuleFileIndex <= MF.TransitiveImports.size());
1087
1088 ModuleFile *OwningModuleFile =
1089 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
1090 assert(OwningModuleFile);
1091
1092 unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
1093
1094 if (!ModuleFileIndex)
1095 LocalNumDecls += NUM_PREDEF_DECL_IDS;
1096
1097 assert(LocalDeclID < LocalNumDecls);
1098#endif
1099 (void)Reader;
1100 (void)MF;
1101 return ID;
1102}
1103
1104LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
1105 unsigned ModuleFileIndex, unsigned LocalDeclID) {
1106 DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
1107 return LocalDeclID::get(Reader, MF, Value);
1108}
1109
1110std::pair<unsigned, unsigned>
1112 return readULEBKeyDataLength(d);
1113}
1114
1116ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
1117 using namespace llvm::support;
1118
1119 SelectorTable &SelTable = Reader.getContext().Selectors;
1120 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1121 const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
1122 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1123 if (N == 0)
1124 return SelTable.getNullarySelector(FirstII);
1125 else if (N == 1)
1126 return SelTable.getUnarySelector(FirstII);
1127
1129 Args.push_back(FirstII);
1130 for (unsigned I = 1; I != N; ++I)
1131 Args.push_back(Reader.getLocalIdentifier(
1132 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1133
1134 return SelTable.getSelector(N, Args.data());
1135}
1136
1139 unsigned DataLen) {
1140 using namespace llvm::support;
1141
1143
1144 Result.ID = Reader.getGlobalSelectorID(
1145 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1146 unsigned FullInstanceBits =
1147 endian::readNext<uint16_t, llvm::endianness::little>(d);
1148 unsigned FullFactoryBits =
1149 endian::readNext<uint16_t, llvm::endianness::little>(d);
1150 Result.InstanceBits = FullInstanceBits & 0x3;
1151 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1152 Result.FactoryBits = FullFactoryBits & 0x3;
1153 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1154 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1155 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1156
1157 // Load instance methods
1158 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
1159 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1161 Reader, F,
1162 endian::readNext<DeclID, llvm::endianness::little>(d))))
1163 Result.Instance.push_back(Method);
1164 }
1165
1166 // Load factory methods
1167 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1168 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1170 Reader, F,
1171 endian::readNext<DeclID, llvm::endianness::little>(d))))
1172 Result.Factory.push_back(Method);
1173 }
1174
1175 return Result;
1176}
1177
1179 return llvm::djbHash(a);
1180}
1181
1182std::pair<unsigned, unsigned>
1184 return readULEBKeyDataLength(d);
1185}
1186
1188ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1189 assert(n >= 2 && d[n-1] == '\0');
1190 return StringRef((const char*) d, n-1);
1191}
1192
1193/// Whether the given identifier is "interesting".
1194static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1195 bool IsModule) {
1196 bool IsInteresting =
1197 II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1199 II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1200 return II.hadMacroDefinition() || II.isPoisoned() ||
1201 (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1202 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1203 II.getFETokenInfo());
1204}
1205
1206static bool readBit(unsigned &Bits) {
1207 bool Value = Bits & 0x1;
1208 Bits >>= 1;
1209 return Value;
1210}
1211
1213 using namespace llvm::support;
1214
1215 IdentifierID RawID =
1216 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1217 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1218}
1219
1221 bool IsModule) {
1222 if (!II.isFromAST()) {
1223 II.setIsFromAST();
1224 if (isInterestingIdentifier(Reader, II, IsModule))
1226 }
1227}
1228
1230 const unsigned char* d,
1231 unsigned DataLen) {
1232 using namespace llvm::support;
1233
1234 IdentifierID RawID =
1235 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1236 bool IsInteresting = RawID & 0x01;
1237
1238 DataLen -= sizeof(IdentifierID);
1239
1240 // Wipe out the "is interesting" bit.
1241 RawID = RawID >> 1;
1242
1243 // Build the IdentifierInfo and link the identifier ID with it.
1244 IdentifierInfo *II = KnownII;
1245 if (!II) {
1246 II = &Reader.getIdentifierTable().getOwn(k);
1247 KnownII = II;
1248 }
1249 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1250 markIdentifierFromAST(Reader, *II, IsModule);
1251 Reader.markIdentifierUpToDate(II);
1252
1253 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1254 if (!IsInteresting) {
1255 // For uninteresting identifiers, there's nothing else to do. Just notify
1256 // the reader that we've finished loading this identifier.
1257 Reader.SetIdentifierInfo(ID, II);
1258 return II;
1259 }
1260
1261 unsigned ObjCOrBuiltinID =
1262 endian::readNext<uint16_t, llvm::endianness::little>(d);
1263 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1264 bool CPlusPlusOperatorKeyword = readBit(Bits);
1265 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1266 bool Poisoned = readBit(Bits);
1267 bool ExtensionToken = readBit(Bits);
1268 bool HasMacroDefinition = readBit(Bits);
1269
1270 assert(Bits == 0 && "Extra bits in the identifier?");
1271 DataLen -= sizeof(uint16_t) * 2;
1272
1273 // Set or check the various bits in the IdentifierInfo structure.
1274 // Token IDs are read-only.
1275 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1277 if (!F.isModule())
1278 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1279 assert(II->isExtensionToken() == ExtensionToken &&
1280 "Incorrect extension token flag");
1281 (void)ExtensionToken;
1282 if (Poisoned)
1283 II->setIsPoisoned(true);
1284 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1285 "Incorrect C++ operator keyword flag");
1286 (void)CPlusPlusOperatorKeyword;
1287
1288 // If this identifier has a macro definition, deserialize it or notify the
1289 // visitor the actual definition is in a different module.
1290 if (HasMacroDefinition) {
1291 uint32_t MacroDirectivesOffset =
1292 endian::readNext<uint32_t, llvm::endianness::little>(d);
1293 DataLen -= 4;
1294
1295 if (MacroDirectivesOffset)
1296 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1297 else
1298 hasMacroDefinitionInDependencies = true;
1299 }
1300
1301 Reader.SetIdentifierInfo(ID, II);
1302
1303 // Read all of the declarations visible at global scope with this
1304 // name.
1305 if (DataLen > 0) {
1307 for (; DataLen > 0; DataLen -= sizeof(DeclID))
1308 DeclIDs.push_back(Reader.getGlobalDeclID(
1310 Reader, F,
1311 endian::readNext<DeclID, llvm::endianness::little>(d))));
1312 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1313 }
1314
1315 return II;
1316}
1317
1319 : Kind(Name.getNameKind()) {
1320 switch (Kind) {
1322 Data = (uint64_t)Name.getAsIdentifierInfo();
1323 break;
1327 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1328 break;
1330 Data = Name.getCXXOverloadedOperator();
1331 break;
1333 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1334 break;
1336 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1338 break;
1343 Data = 0;
1344 break;
1345 }
1346}
1347
1349 llvm::FoldingSetNodeID ID;
1350 ID.AddInteger(Kind);
1351
1352 switch (Kind) {
1356 ID.AddString(((IdentifierInfo*)Data)->getName());
1357 break;
1361 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1362 break;
1364 ID.AddInteger((OverloadedOperatorKind)Data);
1365 break;
1370 break;
1371 }
1372
1373 return ID.computeStableHash();
1374}
1375
1376ModuleFile *
1378 using namespace llvm::support;
1379
1380 uint32_t ModuleFileID =
1381 endian::readNext<uint32_t, llvm::endianness::little>(d);
1382 return Reader.getLocalModuleFile(F, ModuleFileID);
1383}
1384
1385std::pair<unsigned, unsigned>
1389
1392 using namespace llvm::support;
1393
1394 auto Kind = (DeclarationName::NameKind)*d++;
1395 uint64_t Data;
1396 switch (Kind) {
1400 Data = (uint64_t)Reader.getLocalIdentifier(
1401 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1402 break;
1406 Data = (uint64_t)Reader
1407 .getLocalSelector(
1408 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1409 .getAsOpaquePtr();
1410 break;
1412 Data = *d++; // OverloadedOperatorKind
1413 break;
1418 Data = 0;
1419 break;
1420 }
1421
1422 return DeclarationNameKey(Kind, Data);
1423}
1424
1426ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1427 return ReadKeyBase(d);
1428}
1429
1431 const unsigned char *d, unsigned DataLen, data_type_builder &Val) {
1432 using namespace llvm::support;
1433
1434 for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1436 Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1437 Val.insert(Reader.getGlobalDeclID(F, ID));
1438 }
1439}
1440
1442 const unsigned char *d,
1443 unsigned DataLen,
1444 data_type_builder &Val) {
1445 ReadDataIntoImpl(d, DataLen, Val);
1446}
1447
1450 llvm::FoldingSetNodeID ID;
1451 ID.AddInteger(Key.first.getHash());
1452 ID.AddInteger(Key.second);
1453 return ID.computeStableHash();
1454}
1455
1458 DeclarationNameKey Name(Key.first);
1459
1460 UnsignedOrNone ModuleHash = getPrimaryModuleHash(Key.second);
1461 if (!ModuleHash)
1462 return {Name, 0};
1463
1464 return {Name, *ModuleHash};
1465}
1466
1468ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1470 unsigned PrimaryModuleHash =
1471 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1472 return {Name, PrimaryModuleHash};
1473}
1474
1476 const unsigned char *d,
1477 unsigned DataLen,
1478 data_type_builder &Val) {
1479 ReadDataIntoImpl(d, DataLen, Val);
1480}
1481
1482ModuleFile *
1484 using namespace llvm::support;
1485
1486 uint32_t ModuleFileID =
1487 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1488 return Reader.getLocalModuleFile(F, ModuleFileID);
1489}
1490
1492LazySpecializationInfoLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1493 using namespace llvm::support;
1494 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1495}
1496
1497std::pair<unsigned, unsigned>
1501
1503 const unsigned char *d,
1504 unsigned DataLen,
1505 data_type_builder &Val) {
1506 using namespace llvm::support;
1507
1508 for (unsigned NumDecls =
1510 NumDecls; --NumDecls) {
1511 LocalDeclID LocalID = LocalDeclID::get(
1512 Reader, F,
1513 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1514 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1515 }
1516}
1517
1518bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1519 BitstreamCursor &Cursor,
1520 uint64_t Offset,
1521 DeclContext *DC) {
1522 assert(Offset != 0);
1523
1524 SavedStreamPosition SavedPosition(Cursor);
1525 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1526 Error(std::move(Err));
1527 return true;
1528 }
1529
1530 RecordData Record;
1531 StringRef Blob;
1532 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1533 if (!MaybeCode) {
1534 Error(MaybeCode.takeError());
1535 return true;
1536 }
1537 unsigned Code = MaybeCode.get();
1538
1539 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1540 if (!MaybeRecCode) {
1541 Error(MaybeRecCode.takeError());
1542 return true;
1543 }
1544 unsigned RecCode = MaybeRecCode.get();
1545 if (RecCode != DECL_CONTEXT_LEXICAL) {
1546 Error("Expected lexical block");
1547 return true;
1548 }
1549
1550 assert(!isa<TranslationUnitDecl>(DC) &&
1551 "expected a TU_UPDATE_LEXICAL record for TU");
1552 // If we are handling a C++ class template instantiation, we can see multiple
1553 // lexical updates for the same record. It's important that we select only one
1554 // of them, so that field numbering works properly. Just pick the first one we
1555 // see.
1556 auto &Lex = LexicalDecls[DC];
1557 if (!Lex.first) {
1558 Lex = std::make_pair(
1559 &M, llvm::ArrayRef(
1560 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1561 Blob.size() / sizeof(DeclID)));
1562 }
1564 return false;
1565}
1566
1567bool ASTReader::ReadVisibleDeclContextStorage(
1568 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1569 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1570 assert(Offset != 0);
1571
1572 SavedStreamPosition SavedPosition(Cursor);
1573 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1574 Error(std::move(Err));
1575 return true;
1576 }
1577
1578 RecordData Record;
1579 StringRef Blob;
1580 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1581 if (!MaybeCode) {
1582 Error(MaybeCode.takeError());
1583 return true;
1584 }
1585 unsigned Code = MaybeCode.get();
1586
1587 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1588 if (!MaybeRecCode) {
1589 Error(MaybeRecCode.takeError());
1590 return true;
1591 }
1592 unsigned RecCode = MaybeRecCode.get();
1593 switch (VisibleKind) {
1594 case VisibleDeclContextStorageKind::GenerallyVisible:
1595 if (RecCode != DECL_CONTEXT_VISIBLE) {
1596 Error("Expected visible lookup table block");
1597 return true;
1598 }
1599 break;
1600 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1601 if (RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) {
1602 Error("Expected module local visible lookup table block");
1603 return true;
1604 }
1605 break;
1606 case VisibleDeclContextStorageKind::TULocalVisible:
1607 if (RecCode != DECL_CONTEXT_TU_LOCAL_VISIBLE) {
1608 Error("Expected TU local lookup table block");
1609 return true;
1610 }
1611 break;
1612 }
1613
1614 // We can't safely determine the primary context yet, so delay attaching the
1615 // lookup table until we're done with recursive deserialization.
1616 auto *Data = (const unsigned char*)Blob.data();
1617 switch (VisibleKind) {
1618 case VisibleDeclContextStorageKind::GenerallyVisible:
1619 PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1620 break;
1621 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1622 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1623 break;
1624 case VisibleDeclContextStorageKind::TULocalVisible:
1625 if (M.Kind == MK_MainFile)
1626 TULocalUpdates[ID].push_back(UpdateData{&M, Data});
1627 break;
1628 }
1629 return false;
1630}
1631
1632void ASTReader::AddSpecializations(const Decl *D, const unsigned char *Data,
1633 ModuleFile &M, bool IsPartial) {
1634 D = D->getCanonicalDecl();
1635 auto &SpecLookups =
1636 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1637 SpecLookups[D].Table.add(&M, Data,
1639}
1640
1641bool ASTReader::ReadSpecializations(ModuleFile &M, BitstreamCursor &Cursor,
1642 uint64_t Offset, Decl *D, bool IsPartial) {
1643 assert(Offset != 0);
1644
1645 SavedStreamPosition SavedPosition(Cursor);
1646 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1647 Error(std::move(Err));
1648 return true;
1649 }
1650
1651 RecordData Record;
1652 StringRef Blob;
1653 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1654 if (!MaybeCode) {
1655 Error(MaybeCode.takeError());
1656 return true;
1657 }
1658 unsigned Code = MaybeCode.get();
1659
1660 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1661 if (!MaybeRecCode) {
1662 Error(MaybeRecCode.takeError());
1663 return true;
1664 }
1665 unsigned RecCode = MaybeRecCode.get();
1666 if (RecCode != DECL_SPECIALIZATIONS &&
1667 RecCode != DECL_PARTIAL_SPECIALIZATIONS) {
1668 Error("Expected decl specs block");
1669 return true;
1670 }
1671
1672 auto *Data = (const unsigned char *)Blob.data();
1673 AddSpecializations(D, Data, M, IsPartial);
1674 return false;
1675}
1676
1677void ASTReader::Error(StringRef Msg) const {
1678 Error(diag::err_fe_ast_file_malformed, Msg);
1679 if (PP.getLangOpts().Modules &&
1680 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1681 Diag(diag::note_module_cache_path)
1682 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1683 }
1684}
1685
1686void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1687 StringRef Arg3) const {
1688 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1689}
1690
1691namespace {
1692struct AlreadyReportedDiagnosticError
1693 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1694 static char ID;
1695
1696 void log(raw_ostream &OS) const override {
1697 llvm_unreachable("reporting an already-reported diagnostic error");
1698 }
1699
1700 std::error_code convertToErrorCode() const override {
1701 return llvm::inconvertibleErrorCode();
1702 }
1703};
1704
1705char AlreadyReportedDiagnosticError::ID = 0;
1706} // namespace
1707
1708void ASTReader::Error(llvm::Error &&Err) const {
1709 handleAllErrors(
1710 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1711 [&](llvm::ErrorInfoBase &E) { return Error(E.message()); });
1712}
1713
1714//===----------------------------------------------------------------------===//
1715// Source Manager Deserialization
1716//===----------------------------------------------------------------------===//
1717
1718/// Read the line table in the source manager block.
1719void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1720 unsigned Idx = 0;
1721 LineTableInfo &LineTable = SourceMgr.getLineTable();
1722
1723 // Parse the file names
1724 std::map<int, int> FileIDs;
1725 FileIDs[-1] = -1; // For unspecified filenames.
1726 for (unsigned I = 0; Record[Idx]; ++I) {
1727 // Extract the file name
1728 auto Filename = ReadPath(F, Record, Idx);
1729 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1730 }
1731 ++Idx;
1732
1733 // Parse the line entries
1734 std::vector<LineEntry> Entries;
1735 while (Idx < Record.size()) {
1736 FileID FID = ReadFileID(F, Record, Idx);
1737
1738 // Extract the line entries
1739 unsigned NumEntries = Record[Idx++];
1740 assert(NumEntries && "no line entries for file ID");
1741 Entries.clear();
1742 Entries.reserve(NumEntries);
1743 for (unsigned I = 0; I != NumEntries; ++I) {
1744 unsigned FileOffset = Record[Idx++];
1745 unsigned LineNo = Record[Idx++];
1746 int FilenameID = FileIDs[Record[Idx++]];
1749 unsigned IncludeOffset = Record[Idx++];
1750 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1751 FileKind, IncludeOffset));
1752 }
1753 LineTable.AddEntry(FID, Entries);
1754 }
1755}
1756
1757/// Read a source manager block
1758llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1759 using namespace SrcMgr;
1760
1761 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1762
1763 // Set the source-location entry cursor to the current position in
1764 // the stream. This cursor will be used to read the contents of the
1765 // source manager block initially, and then lazily read
1766 // source-location entries as needed.
1767 SLocEntryCursor = F.Stream;
1768
1769 // The stream itself is going to skip over the source manager block.
1770 if (llvm::Error Err = F.Stream.SkipBlock())
1771 return Err;
1772
1773 // Enter the source manager block.
1774 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1775 return Err;
1776 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1777
1778 RecordData Record;
1779 while (true) {
1780 Expected<llvm::BitstreamEntry> MaybeE =
1781 SLocEntryCursor.advanceSkippingSubblocks();
1782 if (!MaybeE)
1783 return MaybeE.takeError();
1784 llvm::BitstreamEntry E = MaybeE.get();
1785
1786 switch (E.Kind) {
1787 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1788 case llvm::BitstreamEntry::Error:
1789 return llvm::createStringError(std::errc::illegal_byte_sequence,
1790 "malformed block record in AST file");
1791 case llvm::BitstreamEntry::EndBlock:
1792 return llvm::Error::success();
1793 case llvm::BitstreamEntry::Record:
1794 // The interesting case.
1795 break;
1796 }
1797
1798 // Read a record.
1799 Record.clear();
1800 StringRef Blob;
1801 Expected<unsigned> MaybeRecord =
1802 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1803 if (!MaybeRecord)
1804 return MaybeRecord.takeError();
1805 switch (MaybeRecord.get()) {
1806 default: // Default behavior: ignore.
1807 break;
1808
1809 case SM_SLOC_FILE_ENTRY:
1812 // Once we hit one of the source location entries, we're done.
1813 return llvm::Error::success();
1814 }
1815 }
1816}
1817
1818llvm::Expected<SourceLocation::UIntTy>
1820 BitstreamCursor &Cursor = F->SLocEntryCursor;
1821 SavedStreamPosition SavedPosition(Cursor);
1822 if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1823 F->SLocEntryOffsets[Index]))
1824 return std::move(Err);
1825
1826 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1827 if (!MaybeEntry)
1828 return MaybeEntry.takeError();
1829
1830 llvm::BitstreamEntry Entry = MaybeEntry.get();
1831 if (Entry.Kind != llvm::BitstreamEntry::Record)
1832 return llvm::createStringError(
1833 std::errc::illegal_byte_sequence,
1834 "incorrectly-formatted source location entry in AST file");
1835
1837 StringRef Blob;
1838 Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1839 if (!MaybeSLOC)
1840 return MaybeSLOC.takeError();
1841
1842 switch (MaybeSLOC.get()) {
1843 default:
1844 return llvm::createStringError(
1845 std::errc::illegal_byte_sequence,
1846 "incorrectly-formatted source location entry in AST file");
1847 case SM_SLOC_FILE_ENTRY:
1850 return F->SLocEntryBaseOffset + Record[0];
1851 }
1852}
1853
1855 auto SLocMapI =
1856 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1857 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1858 "Corrupted global sloc offset map");
1859 ModuleFile *F = SLocMapI->second;
1860
1861 bool Invalid = false;
1862
1863 auto It = llvm::upper_bound(
1864 llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1865 [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1866 int ID = F->SLocEntryBaseID + LocalIndex;
1867 std::size_t Index = -ID - 2;
1868 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1869 assert(!SourceMgr.SLocEntryLoaded[Index]);
1870 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1871 if (!MaybeEntryOffset) {
1872 Error(MaybeEntryOffset.takeError());
1873 Invalid = true;
1874 return true;
1875 }
1876 SourceMgr.LoadedSLocEntryTable[Index] =
1877 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1878 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1879 }
1880 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1881 });
1882
1883 if (Invalid)
1884 return 0;
1885
1886 // The iterator points to the first entry with start offset greater than the
1887 // offset of interest. The previous entry must contain the offset of interest.
1888 return F->SLocEntryBaseID + *std::prev(It);
1889}
1890
1892 if (ID == 0)
1893 return false;
1894
1895 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1896 Error("source location entry ID out-of-range for AST file");
1897 return true;
1898 }
1899
1900 // Local helper to read the (possibly-compressed) buffer data following the
1901 // entry record.
1902 auto ReadBuffer = [this](
1903 BitstreamCursor &SLocEntryCursor,
1904 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1906 StringRef Blob;
1907 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1908 if (!MaybeCode) {
1909 Error(MaybeCode.takeError());
1910 return nullptr;
1911 }
1912 unsigned Code = MaybeCode.get();
1913
1914 Expected<unsigned> MaybeRecCode =
1915 SLocEntryCursor.readRecord(Code, Record, &Blob);
1916 if (!MaybeRecCode) {
1917 Error(MaybeRecCode.takeError());
1918 return nullptr;
1919 }
1920 unsigned RecCode = MaybeRecCode.get();
1921
1922 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1923 // Inspect the first byte to differentiate zlib (\x78) and zstd
1924 // (little-endian 0xFD2FB528).
1925 const llvm::compression::Format F =
1926 Blob.size() > 0 && Blob.data()[0] == 0x78
1927 ? llvm::compression::Format::Zlib
1928 : llvm::compression::Format::Zstd;
1929 if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1930 Error(Reason);
1931 return nullptr;
1932 }
1933 SmallVector<uint8_t, 0> Decompressed;
1934 if (llvm::Error E = llvm::compression::decompress(
1935 F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1936 Error("could not decompress embedded file contents: " +
1937 llvm::toString(std::move(E)));
1938 return nullptr;
1939 }
1940 return llvm::MemoryBuffer::getMemBufferCopy(
1941 llvm::toStringRef(Decompressed), Name);
1942 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1943 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1944 } else {
1945 Error("AST record has invalid code");
1946 return nullptr;
1947 }
1948 };
1949
1950 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1951 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1953 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1954 Error(std::move(Err));
1955 return true;
1956 }
1957
1958 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1960
1961 ++NumSLocEntriesRead;
1962 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1963 if (!MaybeEntry) {
1964 Error(MaybeEntry.takeError());
1965 return true;
1966 }
1967 llvm::BitstreamEntry Entry = MaybeEntry.get();
1968
1969 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1970 Error("incorrectly-formatted source location entry in AST file");
1971 return true;
1972 }
1973
1975 StringRef Blob;
1976 Expected<unsigned> MaybeSLOC =
1977 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1978 if (!MaybeSLOC) {
1979 Error(MaybeSLOC.takeError());
1980 return true;
1981 }
1982 switch (MaybeSLOC.get()) {
1983 default:
1984 Error("incorrectly-formatted source location entry in AST file");
1985 return true;
1986
1987 case SM_SLOC_FILE_ENTRY: {
1988 // We will detect whether a file changed and return 'Failure' for it, but
1989 // we will also try to fail gracefully by setting up the SLocEntry.
1990 unsigned InputID = Record[4];
1991 InputFile IF = getInputFile(*F, InputID);
1993 bool OverriddenBuffer = IF.isOverridden();
1994
1995 // Note that we only check if a File was returned. If it was out-of-date
1996 // we have complained but we will continue creating a FileID to recover
1997 // gracefully.
1998 if (!File)
1999 return true;
2000
2001 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
2002 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
2003 // This is the module's main file.
2004 IncludeLoc = getImportLocation(F);
2005 }
2007 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2008 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
2009 BaseOffset + Record[0]);
2010 SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2011 FileInfo.NumCreatedFIDs = Record[5];
2012 if (Record[3])
2013 FileInfo.setHasLineDirectives();
2014
2015 unsigned NumFileDecls = Record[7];
2016 if (NumFileDecls && ContextObj) {
2017 const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
2018 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
2019 FileDeclIDs[FID] =
2020 FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
2021 }
2022
2023 const SrcMgr::ContentCache &ContentCache =
2024 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
2025 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
2026 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
2027 !ContentCache.getBufferIfLoaded()) {
2028 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
2029 if (!Buffer)
2030 return true;
2031 SourceMgr.overrideFileContents(*File, std::move(Buffer));
2032 }
2033
2034 break;
2035 }
2036
2037 case SM_SLOC_BUFFER_ENTRY: {
2038 const char *Name = Blob.data();
2039 unsigned Offset = Record[0];
2041 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2042 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
2043 if (IncludeLoc.isInvalid() && F->isModule()) {
2044 IncludeLoc = getImportLocation(F);
2045 }
2046
2047 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2048 if (!Buffer)
2049 return true;
2050 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2051 BaseOffset + Offset, IncludeLoc);
2052 if (Record[3]) {
2053 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2054 FileInfo.setHasLineDirectives();
2055 }
2056 break;
2057 }
2058
2060 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
2061 SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2]);
2062 SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3]);
2063 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2064 Record[5], Record[4], ID,
2065 BaseOffset + Record[0]);
2066 break;
2067 }
2068 }
2069
2070 return false;
2071}
2072
2073std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
2074 if (ID == 0)
2075 return std::make_pair(SourceLocation(), "");
2076
2077 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
2078 Error("source location entry ID out-of-range for AST file");
2079 return std::make_pair(SourceLocation(), "");
2080 }
2081
2082 // Find which module file this entry lands in.
2083 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2084 if (!M->isModule())
2085 return std::make_pair(SourceLocation(), "");
2086
2087 // FIXME: Can we map this down to a particular submodule? That would be
2088 // ideal.
2089 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
2090}
2091
2092/// Find the location where the module F is imported.
2093SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
2094 if (F->ImportLoc.isValid())
2095 return F->ImportLoc;
2096
2097 // Otherwise we have a PCH. It's considered to be "imported" at the first
2098 // location of its includer.
2099 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
2100 // Main file is the importer.
2101 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
2102 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2103 }
2104 return F->ImportedBy[0]->FirstLoc;
2105}
2106
2107/// Enter a subblock of the specified BlockID with the specified cursor. Read
2108/// the abbreviations that are at the top of the block and then leave the cursor
2109/// pointing into the block.
2110llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
2111 unsigned BlockID,
2112 uint64_t *StartOfBlockOffset) {
2113 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2114 return Err;
2115
2116 if (StartOfBlockOffset)
2117 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2118
2119 while (true) {
2120 uint64_t Offset = Cursor.GetCurrentBitNo();
2121 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2122 if (!MaybeCode)
2123 return MaybeCode.takeError();
2124 unsigned Code = MaybeCode.get();
2125
2126 // We expect all abbrevs to be at the start of the block.
2127 if (Code != llvm::bitc::DEFINE_ABBREV) {
2128 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2129 return Err;
2130 return llvm::Error::success();
2131 }
2132 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2133 return Err;
2134 }
2135}
2136
2138 unsigned &Idx) {
2139 Token Tok;
2140 Tok.startToken();
2141 Tok.setLocation(ReadSourceLocation(M, Record, Idx));
2142 Tok.setKind((tok::TokenKind)Record[Idx++]);
2143 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
2144
2145 if (Tok.isAnnotation()) {
2146 Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
2147 switch (Tok.getKind()) {
2148 case tok::annot_pragma_loop_hint: {
2149 auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
2150 Info->PragmaName = ReadToken(M, Record, Idx);
2151 Info->Option = ReadToken(M, Record, Idx);
2152 unsigned NumTokens = Record[Idx++];
2154 Toks.reserve(NumTokens);
2155 for (unsigned I = 0; I < NumTokens; ++I)
2156 Toks.push_back(ReadToken(M, Record, Idx));
2157 Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2158 Tok.setAnnotationValue(static_cast<void *>(Info));
2159 break;
2160 }
2161 case tok::annot_pragma_pack: {
2162 auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
2163 Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
2164 auto SlotLabel = ReadString(Record, Idx);
2165 Info->SlotLabel =
2166 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2167 Info->Alignment = ReadToken(M, Record, Idx);
2168 Tok.setAnnotationValue(static_cast<void *>(Info));
2169 break;
2170 }
2171 // Some annotation tokens do not use the PtrData field.
2172 case tok::annot_pragma_openmp:
2173 case tok::annot_pragma_openmp_end:
2174 case tok::annot_pragma_unused:
2175 case tok::annot_pragma_openacc:
2176 case tok::annot_pragma_openacc_end:
2177 case tok::annot_repl_input_end:
2178 break;
2179 default:
2180 llvm_unreachable("missing deserialization code for annotation token");
2181 }
2182 } else {
2183 Tok.setLength(Record[Idx++]);
2184 if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
2185 Tok.setIdentifierInfo(II);
2186 }
2187 return Tok;
2188}
2189
2191 BitstreamCursor &Stream = F.MacroCursor;
2192
2193 // Keep track of where we are in the stream, then jump back there
2194 // after reading this macro.
2195 SavedStreamPosition SavedPosition(Stream);
2196
2197 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2198 // FIXME this drops errors on the floor.
2199 consumeError(std::move(Err));
2200 return nullptr;
2201 }
2204 MacroInfo *Macro = nullptr;
2205 llvm::MutableArrayRef<Token> MacroTokens;
2206
2207 while (true) {
2208 // Advance to the next record, but if we get to the end of the block, don't
2209 // pop it (removing all the abbreviations from the cursor) since we want to
2210 // be able to reseek within the block and read entries.
2211 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2213 Stream.advanceSkippingSubblocks(Flags);
2214 if (!MaybeEntry) {
2215 Error(MaybeEntry.takeError());
2216 return Macro;
2217 }
2218 llvm::BitstreamEntry Entry = MaybeEntry.get();
2219
2220 switch (Entry.Kind) {
2221 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2222 case llvm::BitstreamEntry::Error:
2223 Error("malformed block record in AST file");
2224 return Macro;
2225 case llvm::BitstreamEntry::EndBlock:
2226 return Macro;
2227 case llvm::BitstreamEntry::Record:
2228 // The interesting case.
2229 break;
2230 }
2231
2232 // Read a record.
2233 Record.clear();
2235 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
2236 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
2237 else {
2238 Error(MaybeRecType.takeError());
2239 return Macro;
2240 }
2241 switch (RecType) {
2242 case PP_MODULE_MACRO:
2244 return Macro;
2245
2248 // If we already have a macro, that means that we've hit the end
2249 // of the definition of the macro we were looking for. We're
2250 // done.
2251 if (Macro)
2252 return Macro;
2253
2254 unsigned NextIndex = 1; // Skip identifier ID.
2255 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
2256 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2257 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
2258 MI->setIsUsed(Record[NextIndex++]);
2259 MI->setUsedForHeaderGuard(Record[NextIndex++]);
2260 MacroTokens = MI->allocateTokens(Record[NextIndex++],
2261 PP.getPreprocessorAllocator());
2262 if (RecType == PP_MACRO_FUNCTION_LIKE) {
2263 // Decode function-like macro info.
2264 bool isC99VarArgs = Record[NextIndex++];
2265 bool isGNUVarArgs = Record[NextIndex++];
2266 bool hasCommaPasting = Record[NextIndex++];
2267 MacroParams.clear();
2268 unsigned NumArgs = Record[NextIndex++];
2269 for (unsigned i = 0; i != NumArgs; ++i)
2270 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
2271
2272 // Install function-like macro info.
2273 MI->setIsFunctionLike();
2274 if (isC99VarArgs) MI->setIsC99Varargs();
2275 if (isGNUVarArgs) MI->setIsGNUVarargs();
2276 if (hasCommaPasting) MI->setHasCommaPasting();
2277 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
2278 }
2279
2280 // Remember that we saw this macro last so that we add the tokens that
2281 // form its body to it.
2282 Macro = MI;
2283
2284 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
2285 Record[NextIndex]) {
2286 // We have a macro definition. Register the association
2288 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
2289 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2290 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
2291 PreprocessingRecord::PPEntityID PPID =
2292 PPRec.getPPEntityID(Index, /*isLoaded=*/true);
2293 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
2294 PPRec.getPreprocessedEntity(PPID));
2295 if (PPDef)
2296 PPRec.RegisterMacroDefinition(Macro, PPDef);
2297 }
2298
2299 ++NumMacrosRead;
2300 break;
2301 }
2302
2303 case PP_TOKEN: {
2304 // If we see a TOKEN before a PP_MACRO_*, then the file is
2305 // erroneous, just pretend we didn't see this.
2306 if (!Macro) break;
2307 if (MacroTokens.empty()) {
2308 Error("unexpected number of macro tokens for a macro in AST file");
2309 return Macro;
2310 }
2311
2312 unsigned Idx = 0;
2313 MacroTokens[0] = ReadToken(F, Record, Idx);
2314 MacroTokens = MacroTokens.drop_front();
2315 break;
2316 }
2317 }
2318 }
2319}
2320
2323 PreprocessedEntityID LocalID) const {
2324 if (!M.ModuleOffsetMap.empty())
2325 ReadModuleOffsetMap(M);
2326
2327 unsigned ModuleFileIndex = LocalID >> 32;
2328 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2329 ModuleFile *MF =
2330 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
2331 assert(MF && "malformed identifier ID encoding?");
2332
2333 if (!ModuleFileIndex) {
2334 assert(LocalID >= NUM_PREDEF_PP_ENTITY_IDS);
2335 LocalID -= NUM_PREDEF_PP_ENTITY_IDS;
2336 }
2337
2338 return (static_cast<PreprocessedEntityID>(MF->Index + 1) << 32) | LocalID;
2339}
2340
2342HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2343 FileManager &FileMgr = Reader.getFileManager();
2344 if (!Key.Imported)
2345 return FileMgr.getOptionalFileRef(Key.Filename);
2346
2347 auto Resolved =
2348 ASTReader::ResolveImportedPath(Reader.getPathBuf(), Key.Filename, M);
2349 return FileMgr.getOptionalFileRef(*Resolved);
2350}
2351
2353 uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2354 memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2355 memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2356 return llvm::xxh3_64bits(buf);
2357}
2358
2361 internal_key_type ikey = {ekey.getSize(),
2362 M.HasTimestamps ? ekey.getModificationTime() : 0,
2363 ekey.getName(), /*Imported*/ false};
2364 return ikey;
2365}
2366
2368 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2369 return false;
2370
2371 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2372 return true;
2373
2374 // Determine whether the actual files are equivalent.
2375 OptionalFileEntryRef FEA = getFile(a);
2376 OptionalFileEntryRef FEB = getFile(b);
2377 return FEA && FEA == FEB;
2378}
2379
2380std::pair<unsigned, unsigned>
2382 return readULEBKeyDataLength(d);
2383}
2384
2386HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2387 using namespace llvm::support;
2388
2389 internal_key_type ikey;
2390 ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2391 ikey.ModTime =
2392 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2393 ikey.Filename = (const char *)d;
2394 ikey.Imported = true;
2395 return ikey;
2396}
2397
2400 unsigned DataLen) {
2401 using namespace llvm::support;
2402
2403 const unsigned char *End = d + DataLen;
2404 HeaderFileInfo HFI;
2405 unsigned Flags = *d++;
2406
2408 bool Included = (Flags >> 6) & 0x01;
2409 if (Included)
2410 if ((FE = getFile(key)))
2411 // Not using \c Preprocessor::markIncluded(), since that would attempt to
2412 // deserialize this header file info again.
2413 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2414
2415 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2416 HFI.isImport |= (Flags >> 5) & 0x01;
2417 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2418 HFI.DirInfo = (Flags >> 1) & 0x07;
2419 HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2420 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2421
2422 assert((End - d) % 4 == 0 &&
2423 "Wrong data length in HeaderFileInfo deserialization");
2424 while (d != End) {
2425 uint32_t LocalSMID =
2426 endian::readNext<uint32_t, llvm::endianness::little>(d);
2427 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2428 LocalSMID >>= 3;
2429
2430 // This header is part of a module. Associate it with the module to enable
2431 // implicit module import.
2432 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2433 Module *Mod = Reader.getSubmodule(GlobalSMID);
2434 ModuleMap &ModMap =
2435 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2436
2437 if (FE || (FE = getFile(key))) {
2438 // FIXME: NameAsWritten
2439 Module::Header H = {std::string(key.Filename), "", *FE};
2440 ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2441 }
2442 HFI.mergeModuleMembership(HeaderRole);
2443 }
2444
2445 // This HeaderFileInfo was externally loaded.
2446 HFI.External = true;
2447 HFI.IsValid = true;
2448 return HFI;
2449}
2450
2452 uint32_t MacroDirectivesOffset) {
2453 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2454 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2455}
2456
2458 // Note that we are loading defined macros.
2459 Deserializing Macros(this);
2460
2461 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2462 BitstreamCursor &MacroCursor = I.MacroCursor;
2463
2464 // If there was no preprocessor block, skip this file.
2465 if (MacroCursor.getBitcodeBytes().empty())
2466 continue;
2467
2468 BitstreamCursor Cursor = MacroCursor;
2469 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2470 Error(std::move(Err));
2471 return;
2472 }
2473
2475 while (true) {
2476 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2477 if (!MaybeE) {
2478 Error(MaybeE.takeError());
2479 return;
2480 }
2481 llvm::BitstreamEntry E = MaybeE.get();
2482
2483 switch (E.Kind) {
2484 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2485 case llvm::BitstreamEntry::Error:
2486 Error("malformed block record in AST file");
2487 return;
2488 case llvm::BitstreamEntry::EndBlock:
2489 goto NextCursor;
2490
2491 case llvm::BitstreamEntry::Record: {
2492 Record.clear();
2493 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2494 if (!MaybeRecord) {
2495 Error(MaybeRecord.takeError());
2496 return;
2497 }
2498 switch (MaybeRecord.get()) {
2499 default: // Default behavior: ignore.
2500 break;
2501
2505 if (II->isOutOfDate())
2507 break;
2508 }
2509
2510 case PP_TOKEN:
2511 // Ignore tokens.
2512 break;
2513 }
2514 break;
2515 }
2516 }
2517 }
2518 NextCursor: ;
2519 }
2520}
2521
2522namespace {
2523
2524 /// Visitor class used to look up identifirs in an AST file.
2525 class IdentifierLookupVisitor {
2526 StringRef Name;
2527 unsigned NameHash;
2528 unsigned PriorGeneration;
2529 unsigned &NumIdentifierLookups;
2530 unsigned &NumIdentifierLookupHits;
2531 IdentifierInfo *Found = nullptr;
2532
2533 public:
2534 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2535 unsigned &NumIdentifierLookups,
2536 unsigned &NumIdentifierLookupHits)
2537 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2538 PriorGeneration(PriorGeneration),
2539 NumIdentifierLookups(NumIdentifierLookups),
2540 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2541
2542 bool operator()(ModuleFile &M) {
2543 // If we've already searched this module file, skip it now.
2544 if (M.Generation <= PriorGeneration)
2545 return true;
2546
2549 if (!IdTable)
2550 return false;
2551
2552 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2553 Found);
2554 ++NumIdentifierLookups;
2555 ASTIdentifierLookupTable::iterator Pos =
2556 IdTable->find_hashed(Name, NameHash, &Trait);
2557 if (Pos == IdTable->end())
2558 return false;
2559
2560 // Dereferencing the iterator has the effect of building the
2561 // IdentifierInfo node and populating it with the various
2562 // declarations it needs.
2563 ++NumIdentifierLookupHits;
2564 Found = *Pos;
2565 if (Trait.hasMoreInformationInDependencies()) {
2566 // Look for the identifier in extra modules as they contain more info.
2567 return false;
2568 }
2569 return true;
2570 }
2571
2572 // Retrieve the identifier info found within the module
2573 // files.
2574 IdentifierInfo *getIdentifierInfo() const { return Found; }
2575 };
2576
2577} // namespace
2578
2580 // Note that we are loading an identifier.
2581 Deserializing AnIdentifier(this);
2582
2583 unsigned PriorGeneration = 0;
2584 if (getContext().getLangOpts().Modules)
2585 PriorGeneration = IdentifierGeneration[&II];
2586
2587 // If there is a global index, look there first to determine which modules
2588 // provably do not have any results for this identifier.
2590 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2591 if (!loadGlobalIndex()) {
2592 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2593 HitsPtr = &Hits;
2594 }
2595 }
2596
2597 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2598 NumIdentifierLookups,
2599 NumIdentifierLookupHits);
2600 ModuleMgr.visit(Visitor, HitsPtr);
2602}
2603
2605 if (!II)
2606 return;
2607
2608 const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2609
2610 // Update the generation for this identifier.
2611 if (getContext().getLangOpts().Modules)
2612 IdentifierGeneration[II] = getGeneration();
2613}
2614
2616 unsigned &Idx) {
2617 uint64_t ModuleFileIndex = Record[Idx++] << 32;
2618 uint64_t LocalIndex = Record[Idx++];
2619 return getGlobalMacroID(F, (ModuleFileIndex | LocalIndex));
2620}
2621
2623 const PendingMacroInfo &PMInfo) {
2624 ModuleFile &M = *PMInfo.M;
2625
2626 BitstreamCursor &Cursor = M.MacroCursor;
2627 SavedStreamPosition SavedPosition(Cursor);
2628 if (llvm::Error Err =
2629 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2630 Error(std::move(Err));
2631 return;
2632 }
2633
2634 struct ModuleMacroRecord {
2635 SubmoduleID SubModID;
2636 MacroInfo *MI;
2638 };
2640
2641 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2642 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2643 // macro histroy.
2645 while (true) {
2647 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2648 if (!MaybeEntry) {
2649 Error(MaybeEntry.takeError());
2650 return;
2651 }
2652 llvm::BitstreamEntry Entry = MaybeEntry.get();
2653
2654 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2655 Error("malformed block record in AST file");
2656 return;
2657 }
2658
2659 Record.clear();
2660 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2661 if (!MaybePP) {
2662 Error(MaybePP.takeError());
2663 return;
2664 }
2665 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2667 break;
2668
2669 case PP_MODULE_MACRO: {
2670 ModuleMacros.push_back(ModuleMacroRecord());
2671 auto &Info = ModuleMacros.back();
2672 unsigned Idx = 0;
2673 Info.SubModID = getGlobalSubmoduleID(M, Record[Idx++]);
2674 Info.MI = getMacro(ReadMacroID(M, Record, Idx));
2675 for (int I = Idx, N = Record.size(); I != N; ++I)
2676 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2677 continue;
2678 }
2679
2680 default:
2681 Error("malformed block record in AST file");
2682 return;
2683 }
2684
2685 // We found the macro directive history; that's the last record
2686 // for this macro.
2687 break;
2688 }
2689
2690 // Module macros are listed in reverse dependency order.
2691 {
2692 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2694 for (auto &MMR : ModuleMacros) {
2695 Overrides.clear();
2696 for (unsigned ModID : MMR.Overrides) {
2697 Module *Mod = getSubmodule(ModID);
2698 auto *Macro = PP.getModuleMacro(Mod, II);
2699 assert(Macro && "missing definition for overridden macro");
2700 Overrides.push_back(Macro);
2701 }
2702
2703 bool Inserted = false;
2704 Module *Owner = getSubmodule(MMR.SubModID);
2705 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2706 }
2707 }
2708
2709 // Don't read the directive history for a module; we don't have anywhere
2710 // to put it.
2711 if (M.isModule())
2712 return;
2713
2714 // Deserialize the macro directives history in reverse source-order.
2715 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2716 unsigned Idx = 0, N = Record.size();
2717 while (Idx < N) {
2718 MacroDirective *MD = nullptr;
2721 switch (K) {
2723 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2724 MD = PP.AllocateDefMacroDirective(MI, Loc);
2725 break;
2726 }
2728 MD = PP.AllocateUndefMacroDirective(Loc);
2729 break;
2731 bool isPublic = Record[Idx++];
2732 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2733 break;
2734 }
2735
2736 if (!Latest)
2737 Latest = MD;
2738 if (Earliest)
2739 Earliest->setPrevious(MD);
2740 Earliest = MD;
2741 }
2742
2743 if (Latest)
2744 PP.setLoadedMacroDirective(II, Earliest, Latest);
2745}
2746
2747bool ASTReader::shouldDisableValidationForFile(
2748 const serialization::ModuleFile &M) const {
2749 if (DisableValidationKind == DisableValidationForModuleKind::None)
2750 return false;
2751
2752 // If a PCH is loaded and validation is disabled for PCH then disable
2753 // validation for the PCH and the modules it loads.
2754 ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2755
2756 switch (K) {
2757 case MK_MainFile:
2758 case MK_Preamble:
2759 case MK_PCH:
2760 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2761 case MK_ImplicitModule:
2762 case MK_ExplicitModule:
2763 case MK_PrebuiltModule:
2764 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2765 }
2766
2767 return false;
2768}
2769
2770static std::pair<StringRef, StringRef>
2772 const StringRef InputBlob) {
2773 uint16_t AsRequestedLength = Record[7];
2774 return {InputBlob.substr(0, AsRequestedLength),
2775 InputBlob.substr(AsRequestedLength)};
2776}
2777
2778InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2779 // If this ID is bogus, just return an empty input file.
2780 if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2781 return InputFileInfo();
2782
2783 // If we've already loaded this input file, return it.
2784 if (F.InputFileInfosLoaded[ID - 1].isValid())
2785 return F.InputFileInfosLoaded[ID - 1];
2786
2787 // Go find this input file.
2788 BitstreamCursor &Cursor = F.InputFilesCursor;
2789 SavedStreamPosition SavedPosition(Cursor);
2790 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2791 F.InputFileOffsets[ID - 1])) {
2792 // FIXME this drops errors on the floor.
2793 consumeError(std::move(Err));
2794 }
2795
2796 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2797 if (!MaybeCode) {
2798 // FIXME this drops errors on the floor.
2799 consumeError(MaybeCode.takeError());
2800 }
2801 unsigned Code = MaybeCode.get();
2802 RecordData Record;
2803 StringRef Blob;
2804
2805 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2806 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2807 "invalid record type for input file");
2808 else {
2809 // FIXME this drops errors on the floor.
2810 consumeError(Maybe.takeError());
2811 }
2812
2813 assert(Record[0] == ID && "Bogus stored ID or offset");
2815 R.StoredSize = static_cast<off_t>(Record[1]);
2816 R.StoredTime = static_cast<time_t>(Record[2]);
2817 R.Overridden = static_cast<bool>(Record[3]);
2818 R.Transient = static_cast<bool>(Record[4]);
2819 R.TopLevel = static_cast<bool>(Record[5]);
2820 R.ModuleMap = static_cast<bool>(Record[6]);
2821 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2823 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2824 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2825 ? UnresolvedFilenameAsRequested
2826 : UnresolvedFilename;
2827
2828 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2829 if (!MaybeEntry) // FIXME this drops errors on the floor.
2830 consumeError(MaybeEntry.takeError());
2831 llvm::BitstreamEntry Entry = MaybeEntry.get();
2832 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2833 "expected record type for input file hash");
2834
2835 Record.clear();
2836 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2837 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2838 "invalid record type for input file hash");
2839 else {
2840 // FIXME this drops errors on the floor.
2841 consumeError(Maybe.takeError());
2842 }
2843 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2844 static_cast<uint64_t>(Record[0]);
2845
2846 // Note that we've loaded this input file info.
2847 F.InputFileInfosLoaded[ID - 1] = R;
2848 return R;
2849}
2850
2851static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2852InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2853 // If this ID is bogus, just return an empty input file.
2854 if (ID == 0 || ID > F.InputFilesLoaded.size())
2855 return InputFile();
2856
2857 // If we've already loaded this input file, return it.
2858 if (F.InputFilesLoaded[ID-1].getFile())
2859 return F.InputFilesLoaded[ID-1];
2860
2861 if (F.InputFilesLoaded[ID-1].isNotFound())
2862 return InputFile();
2863
2864 // Go find this input file.
2865 BitstreamCursor &Cursor = F.InputFilesCursor;
2866 SavedStreamPosition SavedPosition(Cursor);
2867 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2868 F.InputFileOffsets[ID - 1])) {
2869 // FIXME this drops errors on the floor.
2870 consumeError(std::move(Err));
2871 }
2872
2873 InputFileInfo FI = getInputFileInfo(F, ID);
2874 off_t StoredSize = FI.StoredSize;
2875 time_t StoredTime = FI.StoredTime;
2876 bool Overridden = FI.Overridden;
2877 bool Transient = FI.Transient;
2878 auto Filename =
2879 ResolveImportedPath(PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
2880 uint64_t StoredContentHash = FI.ContentHash;
2881
2882 // For standard C++ modules, we don't need to check the inputs.
2883 bool SkipChecks = F.StandardCXXModule;
2884
2885 const HeaderSearchOptions &HSOpts =
2886 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2887
2888 // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2889 // modules.
2891 SkipChecks = false;
2892 Overridden = false;
2893 }
2894
2895 auto File = FileMgr.getOptionalFileRef(*Filename, /*OpenFile=*/false);
2896
2897 // For an overridden file, create a virtual file with the stored
2898 // size/timestamp.
2899 if ((Overridden || Transient || SkipChecks) && !File)
2900 File = FileMgr.getVirtualFileRef(*Filename, StoredSize, StoredTime);
2901
2902 if (!File) {
2903 if (Complain) {
2904 std::string ErrorStr = "could not find file '";
2905 ErrorStr += *Filename;
2906 ErrorStr += "' referenced by AST file '";
2907 ErrorStr += F.FileName.str();
2908 ErrorStr += "'";
2909 Error(ErrorStr);
2910 }
2911 // Record that we didn't find the file.
2913 return InputFile();
2914 }
2915
2916 // Check if there was a request to override the contents of the file
2917 // that was part of the precompiled header. Overriding such a file
2918 // can lead to problems when lexing using the source locations from the
2919 // PCH.
2920 SourceManager &SM = getSourceManager();
2921 // FIXME: Reject if the overrides are different.
2922 if ((!Overridden && !Transient) && !SkipChecks &&
2923 SM.isFileOverridden(*File)) {
2924 if (Complain)
2925 Error(diag::err_fe_pch_file_overridden, *Filename);
2926
2927 // After emitting the diagnostic, bypass the overriding file to recover
2928 // (this creates a separate FileEntry).
2929 File = SM.bypassFileContentsOverride(*File);
2930 if (!File) {
2932 return InputFile();
2933 }
2934 }
2935
2936 auto HasInputContentChanged = [&](Change OriginalChange) {
2937 assert(ValidateASTInputFilesContent &&
2938 "We should only check the content of the inputs with "
2939 "ValidateASTInputFilesContent enabled.");
2940
2941 if (StoredContentHash == 0)
2942 return OriginalChange;
2943
2944 auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2945 if (!MemBuffOrError) {
2946 if (!Complain)
2947 return OriginalChange;
2948 std::string ErrorStr = "could not get buffer for file '";
2949 ErrorStr += File->getName();
2950 ErrorStr += "'";
2951 Error(ErrorStr);
2952 return OriginalChange;
2953 }
2954
2955 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2956 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2957 return Change{Change::None};
2958
2959 return Change{Change::Content};
2960 };
2961 auto HasInputFileChanged = [&]() {
2962 if (StoredSize != File->getSize())
2963 return Change{Change::Size, StoredSize, File->getSize()};
2964 if (!shouldDisableValidationForFile(F) && StoredTime &&
2965 StoredTime != File->getModificationTime()) {
2966 Change MTimeChange = {Change::ModTime, StoredTime,
2967 File->getModificationTime()};
2968
2969 // In case the modification time changes but not the content,
2970 // accept the cached file as legit.
2971 if (ValidateASTInputFilesContent)
2972 return HasInputContentChanged(MTimeChange);
2973
2974 return MTimeChange;
2975 }
2976 return Change{Change::None};
2977 };
2978
2979 bool IsOutOfDate = false;
2980 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2981 // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
2982 // enabled, it is better to check the contents of the inputs. Since we can't
2983 // get correct modified time information for inputs from overriden inputs.
2984 if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
2985 F.StandardCXXModule && FileChange.Kind == Change::None)
2986 FileChange = HasInputContentChanged(FileChange);
2987
2988 // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
2989 // it is better to check the content of the input files because we cannot rely
2990 // on the file modification time, which will be the same (zero) for these
2991 // files.
2992 if (!StoredTime && ValidateASTInputFilesContent &&
2993 FileChange.Kind == Change::None)
2994 FileChange = HasInputContentChanged(FileChange);
2995
2996 // For an overridden file, there is nothing to validate.
2997 if (!Overridden && FileChange.Kind != Change::None) {
2998 if (Complain) {
2999 // Build a list of the PCH imports that got us here (in reverse).
3000 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
3001 while (!ImportStack.back()->ImportedBy.empty())
3002 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3003
3004 // The top-level AST file is stale.
3005 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3006 Diag(diag::err_fe_ast_file_modified)
3007 << *Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
3008 << TopLevelASTFileName;
3009 Diag(diag::note_fe_ast_file_modified)
3010 << FileChange.Kind << (FileChange.Old && FileChange.New)
3011 << llvm::itostr(FileChange.Old.value_or(0))
3012 << llvm::itostr(FileChange.New.value_or(0));
3013
3014 // Print the import stack.
3015 if (ImportStack.size() > 1) {
3016 Diag(diag::note_ast_file_required_by)
3017 << *Filename << ImportStack[0]->FileName;
3018 for (unsigned I = 1; I < ImportStack.size(); ++I)
3019 Diag(diag::note_ast_file_required_by)
3020 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3021 }
3022
3024 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3025 Diag(diag::note_ast_file_input_files_validation_status)
3027 }
3028
3029 IsOutOfDate = true;
3030 }
3031 // FIXME: If the file is overridden and we've already opened it,
3032 // issue an error (or split it into a separate FileEntry).
3033
3034 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
3035
3036 // Note that we've loaded this input file.
3037 F.InputFilesLoaded[ID-1] = IF;
3038 return IF;
3039}
3040
3041ASTReader::TemporarilyOwnedStringRef
3043 ModuleFile &ModF) {
3044 return ResolveImportedPath(Buf, Path, ModF.BaseDirectory);
3045}
3046
3047ASTReader::TemporarilyOwnedStringRef
3049 StringRef Prefix) {
3050 assert(Buf.capacity() != 0 && "Overlapping ResolveImportedPath calls");
3051
3052 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3053 Path == "<built-in>" || Path == "<command line>")
3054 return {Path, Buf};
3055
3056 Buf.clear();
3057 llvm::sys::path::append(Buf, Prefix, Path);
3058 StringRef ResolvedPath{Buf.data(), Buf.size()};
3059 return {ResolvedPath, Buf};
3060}
3061
3063 StringRef P,
3064 ModuleFile &ModF) {
3065 return ResolveImportedPathAndAllocate(Buf, P, ModF.BaseDirectory);
3066}
3067
3069 StringRef P,
3070 StringRef Prefix) {
3071 auto ResolvedPath = ResolveImportedPath(Buf, P, Prefix);
3072 return ResolvedPath->str();
3073}
3074
3075static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
3076 switch (ARR) {
3077 case ASTReader::Failure: return true;
3078 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
3079 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
3082 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
3083 case ASTReader::HadErrors: return true;
3084 case ASTReader::Success: return false;
3085 }
3086
3087 llvm_unreachable("unknown ASTReadResult");
3088}
3089
3090ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
3091 BitstreamCursor &Stream, StringRef Filename,
3092 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
3093 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3094 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
3095 // FIXME this drops errors on the floor.
3096 consumeError(std::move(Err));
3097 return Failure;
3098 }
3099
3100 // Read all of the records in the options block.
3101 RecordData Record;
3102 ASTReadResult Result = Success;
3103 while (true) {
3104 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3105 if (!MaybeEntry) {
3106 // FIXME this drops errors on the floor.
3107 consumeError(MaybeEntry.takeError());
3108 return Failure;
3109 }
3110 llvm::BitstreamEntry Entry = MaybeEntry.get();
3111
3112 switch (Entry.Kind) {
3113 case llvm::BitstreamEntry::Error:
3114 case llvm::BitstreamEntry::SubBlock:
3115 return Failure;
3116
3117 case llvm::BitstreamEntry::EndBlock:
3118 return Result;
3119
3120 case llvm::BitstreamEntry::Record:
3121 // The interesting case.
3122 break;
3123 }
3124
3125 // Read and process a record.
3126 Record.clear();
3127 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
3128 if (!MaybeRecordType) {
3129 // FIXME this drops errors on the floor.
3130 consumeError(MaybeRecordType.takeError());
3131 return Failure;
3132 }
3133 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
3134 case LANGUAGE_OPTIONS: {
3135 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3136 if (ParseLanguageOptions(Record, Filename, Complain, Listener,
3137 AllowCompatibleConfigurationMismatch))
3138 Result = ConfigurationMismatch;
3139 break;
3140 }
3141
3142 case CODEGEN_OPTIONS: {
3143 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3144 if (ParseCodeGenOptions(Record, Filename, Complain, Listener,
3145 AllowCompatibleConfigurationMismatch))
3146 Result = ConfigurationMismatch;
3147 break;
3148 }
3149
3150 case TARGET_OPTIONS: {
3151 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3152 if (ParseTargetOptions(Record, Filename, Complain, Listener,
3153 AllowCompatibleConfigurationMismatch))
3154 Result = ConfigurationMismatch;
3155 break;
3156 }
3157
3158 case FILE_SYSTEM_OPTIONS: {
3159 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3160 if (!AllowCompatibleConfigurationMismatch &&
3161 ParseFileSystemOptions(Record, Complain, Listener))
3162 Result = ConfigurationMismatch;
3163 break;
3164 }
3165
3166 case HEADER_SEARCH_OPTIONS: {
3167 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3168 if (!AllowCompatibleConfigurationMismatch &&
3169 ParseHeaderSearchOptions(Record, Filename, Complain, Listener))
3170 Result = ConfigurationMismatch;
3171 break;
3172 }
3173
3175 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3176 if (!AllowCompatibleConfigurationMismatch &&
3177 ParsePreprocessorOptions(Record, Filename, Complain, Listener,
3178 SuggestedPredefines))
3179 Result = ConfigurationMismatch;
3180 break;
3181 }
3182 }
3183}
3184
3185/// Returns {build-session validation applies, MF was validated this session}.
3186static std::pair<bool, bool>
3188 const HeaderSearchOptions &HSOpts) {
3189 const bool EnablesBSValidation =
3191 const bool WasValidated =
3192 EnablesBSValidation &&
3194 return {EnablesBSValidation, WasValidated};
3195}
3196
3197ASTReader::RelocationResult
3198ASTReader::getModuleForRelocationChecks(ModuleFile &F, bool DirectoryCheck) {
3199 // Don't emit module relocation errors if we have -fno-validate-pch.
3200 const bool IgnoreError =
3201 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3203
3204 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3205 return {std::nullopt, IgnoreError};
3206
3207 const bool IsImplicitModule = F.Kind == MK_ImplicitModule;
3208
3209 if (!DirectoryCheck &&
3210 (!IsImplicitModule || ModuleMgr.begin()->Kind == MK_MainFile))
3211 return {std::nullopt, IgnoreError};
3212
3213 const HeaderSearchOptions &HSOpts =
3214 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3215
3216 // When only validating modules once per build session,
3217 // Skip check if the timestamp is up to date or module was built in same build
3218 // session.
3219 auto [EnablesBSValidation, WasValidated] =
3220 wasValidatedInBuildSession(F, HSOpts);
3221 if (WasValidated)
3222 return {std::nullopt, IgnoreError};
3223 if (EnablesBSValidation &&
3224 static_cast<uint64_t>(F.ModTime) >= HSOpts.BuildSessionTimestamp)
3225 return {std::nullopt, IgnoreError};
3226
3227 Diag(diag::remark_module_check_relocation) << F.ModuleName << F.FileName;
3228
3229 // If we've already loaded a module map file covering this module, we may
3230 // have a better path for it (relative to the current build if doing directory
3231 // check).
3232 Module *M = PP.getHeaderSearchInfo().lookupModule(
3233 F.ModuleName, DirectoryCheck ? SourceLocation() : F.ImportLoc,
3234 /*AllowSearch=*/DirectoryCheck,
3235 /*AllowExtraModuleMapSearch=*/DirectoryCheck);
3236
3237 return {M, IgnoreError};
3238}
3239
3241ASTReader::ReadControlBlock(ModuleFile &F,
3242 SmallVectorImpl<ImportedModule> &Loaded,
3243 const ModuleFile *ImportedBy,
3244 unsigned ClientLoadCapabilities) {
3245 BitstreamCursor &Stream = F.Stream;
3246
3247 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
3248 Error(std::move(Err));
3249 return Failure;
3250 }
3251
3252 // Lambda to read the unhashed control block the first time it's called.
3253 //
3254 // For PCM files, the unhashed control block cannot be read until after the
3255 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
3256 // need to look ahead before reading the IMPORTS record. For consistency,
3257 // this block is always read somehow (see BitstreamEntry::EndBlock).
3258 bool HasReadUnhashedControlBlock = false;
3259 auto readUnhashedControlBlockOnce = [&]() {
3260 if (!HasReadUnhashedControlBlock) {
3261 HasReadUnhashedControlBlock = true;
3262 if (ASTReadResult Result =
3263 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3264 return Result;
3265 }
3266 return Success;
3267 };
3268
3269 bool DisableValidation = shouldDisableValidationForFile(F);
3270
3271 // Read all of the records and blocks in the control block.
3272 RecordData Record;
3273 unsigned NumInputs = 0;
3274 unsigned NumUserInputs = 0;
3275 StringRef BaseDirectoryAsWritten;
3276 while (true) {
3277 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3278 if (!MaybeEntry) {
3279 Error(MaybeEntry.takeError());
3280 return Failure;
3281 }
3282 llvm::BitstreamEntry Entry = MaybeEntry.get();
3283
3284 switch (Entry.Kind) {
3285 case llvm::BitstreamEntry::Error:
3286 Error("malformed block record in AST file");
3287 return Failure;
3288 case llvm::BitstreamEntry::EndBlock: {
3289 // Validate the module before returning. This call catches an AST with
3290 // no module name and no imports.
3291 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3292 return Result;
3293
3294 // Validate input files.
3295 const HeaderSearchOptions &HSOpts =
3296 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3297
3298 // All user input files reside at the index range [0, NumUserInputs), and
3299 // system input files reside at [NumUserInputs, NumInputs). For explicitly
3300 // loaded module files, ignore missing inputs.
3301 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
3302 F.Kind != MK_PrebuiltModule) {
3303 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3304
3305 // If we are reading a module, we will create a verification timestamp,
3306 // so we verify all input files. Otherwise, verify only user input
3307 // files.
3308
3309 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3310 F.InputFilesValidationStatus = ValidateSystemInputs
3313 auto [_, WasValidated] = wasValidatedInBuildSession(F, HSOpts);
3314 if (WasValidated) {
3315 N = ForceValidateUserInputs ? NumUserInputs : 0;
3317 ForceValidateUserInputs
3320 }
3321
3322 if (N != 0)
3323 Diag(diag::remark_module_validation)
3324 << N << F.ModuleName << F.FileName;
3325
3326 for (unsigned I = 0; I < N; ++I) {
3327 InputFile IF = getInputFile(F, I+1, Complain);
3328 if (!IF.getFile() || IF.isOutOfDate())
3329 return OutOfDate;
3330 }
3331 } else {
3333 }
3334
3335 if (Listener)
3336 Listener->visitModuleFile(F.FileName, F.Kind, F.isDirectlyImported());
3337
3338 if (Listener && Listener->needsInputFileVisitation()) {
3339 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
3340 : NumUserInputs;
3341 for (unsigned I = 0; I < N; ++I) {
3342 bool IsSystem = I >= NumUserInputs;
3343 InputFileInfo FI = getInputFileInfo(F, I + 1);
3344 auto FilenameAsRequested = ResolveImportedPath(
3346 Listener->visitInputFile(
3347 *FilenameAsRequested, IsSystem, FI.Overridden,
3349 }
3350 }
3351
3352 return Success;
3353 }
3354
3355 case llvm::BitstreamEntry::SubBlock:
3356 switch (Entry.ID) {
3358 F.InputFilesCursor = Stream;
3359 if (llvm::Error Err = Stream.SkipBlock()) {
3360 Error(std::move(Err));
3361 return Failure;
3362 }
3363 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
3364 Error("malformed block record in AST file");
3365 return Failure;
3366 }
3367 F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
3368 continue;
3369
3370 case OPTIONS_BLOCK_ID:
3371 // If we're reading the first module for this group, check its options
3372 // are compatible with ours. For modules it imports, no further checking
3373 // is required, because we checked them when we built it.
3374 if (Listener && !ImportedBy) {
3375 // Should we allow the configuration of the module file to differ from
3376 // the configuration of the current translation unit in a compatible
3377 // way?
3378 //
3379 // FIXME: Allow this for files explicitly specified with -include-pch.
3380 bool AllowCompatibleConfigurationMismatch =
3382
3383 ASTReadResult Result =
3384 ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities,
3385 AllowCompatibleConfigurationMismatch, *Listener,
3386 SuggestedPredefines);
3387 if (Result == Failure) {
3388 Error("malformed block record in AST file");
3389 return Result;
3390 }
3391
3392 if (DisableValidation ||
3393 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
3394 Result = Success;
3395
3396 // If we can't load the module, exit early since we likely
3397 // will rebuild the module anyway. The stream may be in the
3398 // middle of a block.
3399 if (Result != Success)
3400 return Result;
3401 } else if (llvm::Error Err = Stream.SkipBlock()) {
3402 Error(std::move(Err));
3403 return Failure;
3404 }
3405 continue;
3406
3407 default:
3408 if (llvm::Error Err = Stream.SkipBlock()) {
3409 Error(std::move(Err));
3410 return Failure;
3411 }
3412 continue;
3413 }
3414
3415 case llvm::BitstreamEntry::Record:
3416 // The interesting case.
3417 break;
3418 }
3419
3420 // Read and process a record.
3421 Record.clear();
3422 StringRef Blob;
3423 Expected<unsigned> MaybeRecordType =
3424 Stream.readRecord(Entry.ID, Record, &Blob);
3425 if (!MaybeRecordType) {
3426 Error(MaybeRecordType.takeError());
3427 return Failure;
3428 }
3429 switch ((ControlRecordTypes)MaybeRecordType.get()) {
3430 case METADATA: {
3431 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3432 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3433 Diag(Record[0] < VERSION_MAJOR ? diag::err_ast_file_version_too_old
3434 : diag::err_ast_file_version_too_new)
3436 return VersionMismatch;
3437 }
3438
3439 bool hasErrors = Record[7];
3440 if (hasErrors && !DisableValidation) {
3441 // If requested by the caller and the module hasn't already been read
3442 // or compiled, mark modules on error as out-of-date.
3443 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3444 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3445 return OutOfDate;
3446
3447 if (!AllowASTWithCompilerErrors) {
3448 Diag(diag::err_ast_file_with_compiler_errors)
3450 return HadErrors;
3451 }
3452 }
3453 if (hasErrors) {
3454 Diags.ErrorOccurred = true;
3455 Diags.UncompilableErrorOccurred = true;
3456 Diags.UnrecoverableErrorOccurred = true;
3457 }
3458
3459 F.RelocatablePCH = Record[4];
3460 // Relative paths in a relocatable PCH are relative to our sysroot.
3461 if (F.RelocatablePCH)
3462 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3463
3465
3466 F.HasTimestamps = Record[6];
3467
3468 const std::string &CurBranch = getClangFullRepositoryVersion();
3469 StringRef ASTBranch = Blob;
3470 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3471 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3472 Diag(diag::err_ast_file_different_branch)
3473 << moduleKindForDiagnostic(F.Kind) << F.FileName << ASTBranch
3474 << CurBranch;
3475 return VersionMismatch;
3476 }
3477 break;
3478 }
3479
3480 case IMPORT: {
3481 // Validate the AST before processing any imports (otherwise, untangling
3482 // them can be error-prone and expensive). A module will have a name and
3483 // will already have been validated, but this catches the PCH case.
3484 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3485 return Result;
3486
3487 unsigned Idx = 0;
3488 // Read information about the AST file.
3489 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3490
3491 // The import location will be the local one for now; we will adjust
3492 // all import locations of module imports after the global source
3493 // location info are setup, in ReadAST.
3494 auto [ImportLoc, ImportModuleFileIndex] =
3495 ReadUntranslatedSourceLocation(Record[Idx++]);
3496 // The import location must belong to the current module file itself.
3497 assert(ImportModuleFileIndex == 0);
3498
3499 StringRef ImportedName = ReadStringBlob(Record, Idx, Blob);
3500
3501 bool IsImportingStdCXXModule = Record[Idx++];
3502
3503 off_t StoredSize = 0;
3504 time_t StoredModTime = 0;
3505 unsigned FileNameKind = 0;
3506 ASTFileSignature StoredSignature;
3507 ModuleFileName ImportedFile;
3508 std::string StoredFile;
3509 bool IgnoreImportedByNote = false;
3510
3511 // For prebuilt and explicit modules first consult the file map for
3512 // an override. Note that here we don't search prebuilt module
3513 // directories if we're not importing standard c++ module, only the
3514 // explicit name to file mappings. Also, we will still verify the
3515 // size/signature making sure it is essentially the same file but
3516 // perhaps in a different location.
3517 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3518 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3519 ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3520
3521 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3522 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3523 return Missing;
3524 }
3525
3526 if (!IsImportingStdCXXModule) {
3527 StoredSize = (off_t)Record[Idx++];
3528 StoredModTime = (time_t)Record[Idx++];
3529 FileNameKind = (unsigned)Record[Idx++];
3530
3531 StringRef SignatureBytes = Blob.substr(0, ASTFileSignature::size);
3532 StoredSignature = ASTFileSignature::create(SignatureBytes.begin(),
3533 SignatureBytes.end());
3534 Blob = Blob.substr(ASTFileSignature::size);
3535
3536 StoredFile = ReadPathBlob(BaseDirectoryAsWritten, Record, Idx, Blob);
3537 if (ImportedFile.empty()) {
3538 ImportedFile = ModuleFileName::makeFromRaw(StoredFile, FileNameKind);
3539 } else if (!getDiags().isIgnored(
3540 diag::warn_module_file_mapping_mismatch,
3541 CurrentImportLoc)) {
3542 auto ImportedFileRef =
3543 PP.getFileManager().getOptionalFileRef(ImportedFile);
3544 auto StoredFileRef =
3545 PP.getFileManager().getOptionalFileRef(StoredFile);
3546 if ((ImportedFileRef && StoredFileRef) &&
3547 (*ImportedFileRef != *StoredFileRef)) {
3548 Diag(diag::warn_module_file_mapping_mismatch)
3549 << ImportedFile << StoredFile;
3550 Diag(diag::note_module_file_imported_by)
3551 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3552 IgnoreImportedByNote = true;
3553 }
3554 }
3555 }
3556
3557 // If our client can't cope with us being out of date, we can't cope with
3558 // our dependency being missing.
3559 unsigned Capabilities = ClientLoadCapabilities;
3560 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3561 Capabilities &= ~ARR_Missing;
3562
3563 // Load the AST file.
3564 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3565 Loaded, StoredSize, StoredModTime,
3566 StoredSignature, Capabilities);
3567
3568 // Check the AST we just read from ImportedFile contains a different
3569 // module than we expected (ImportedName). This can occur for C++20
3570 // Modules when given a mismatch via -fmodule-file=<name>=<file>
3571 if (IsImportingStdCXXModule) {
3572 if (const auto *Imported =
3573 getModuleManager().lookupByFileName(ImportedFile);
3574 Imported != nullptr && Imported->ModuleName != ImportedName) {
3575 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3576 Result = Missing;
3577 }
3578 }
3579
3580 // If we diagnosed a problem, produce a backtrace.
3581 bool recompilingFinalized = Result == OutOfDate &&
3582 (Capabilities & ARR_OutOfDate) &&
3583 getModuleManager()
3584 .getModuleCache()
3585 .getInMemoryModuleCache()
3586 .isPCMFinal(F.FileName);
3587 if (!IgnoreImportedByNote &&
3588 (isDiagnosedResult(Result, Capabilities) || recompilingFinalized))
3589 Diag(diag::note_module_file_imported_by)
3590 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3591
3592 switch (Result) {
3593 case Failure: return Failure;
3594 // If we have to ignore the dependency, we'll have to ignore this too.
3595 case Missing:
3596 case OutOfDate: return OutOfDate;
3597 case VersionMismatch: return VersionMismatch;
3598 case ConfigurationMismatch: return ConfigurationMismatch;
3599 case HadErrors: return HadErrors;
3600 case Success: break;
3601 }
3602 break;
3603 }
3604
3605 case ORIGINAL_FILE:
3606 F.OriginalSourceFileID = FileID::get(Record[0]);
3607 F.ActualOriginalSourceFileName = std::string(Blob);
3608 F.OriginalSourceFileName = ResolveImportedPathAndAllocate(
3609 PathBuf, F.ActualOriginalSourceFileName, F);
3610 break;
3611
3612 case ORIGINAL_FILE_ID:
3613 F.OriginalSourceFileID = FileID::get(Record[0]);
3614 break;
3615
3616 case MODULE_NAME:
3617 F.ModuleName = std::string(Blob);
3618 Diag(diag::remark_module_import)
3619 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3620 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3621 if (Listener)
3622 Listener->ReadModuleName(F.ModuleName);
3623
3624 // Validate the AST as soon as we have a name so we can exit early on
3625 // failure.
3626 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3627 return Result;
3628
3629 break;
3630
3631 case MODULE_DIRECTORY: {
3632 // Save the BaseDirectory as written in the PCM for computing the module
3633 // filename for the ModuleCache.
3634 BaseDirectoryAsWritten = Blob;
3635 assert(!F.ModuleName.empty() &&
3636 "MODULE_DIRECTORY found before MODULE_NAME");
3637 F.BaseDirectory = std::string(Blob);
3638
3639 auto [MaybeM, IgnoreError] =
3640 getModuleForRelocationChecks(F, /*DirectoryCheck=*/true);
3641 if (!MaybeM.has_value())
3642 break;
3643
3644 Module *M = MaybeM.value();
3645 if (!M || !M->Directory)
3646 break;
3647 if (IgnoreError) {
3648 F.BaseDirectory = std::string(M->Directory->getName());
3649 break;
3650 }
3651 if ((F.Kind == MK_ExplicitModule) || (F.Kind == MK_PrebuiltModule))
3652 break;
3653
3654 // If we're implicitly loading a module, the base directory can't
3655 // change between the build and use.
3656 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3657 if (BuildDir && (*BuildDir == M->Directory)) {
3658 F.BaseDirectory = std::string(M->Directory->getName());
3659 break;
3660 }
3661 Diag(diag::remark_module_relocated)
3662 << F.ModuleName << Blob << M->Directory->getName();
3663
3664 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3665 Diag(diag::err_imported_module_relocated)
3666 << F.ModuleName << Blob << M->Directory->getName();
3667 return OutOfDate;
3668 }
3669
3670 case MODULE_MAP_FILE:
3671 if (ASTReadResult Result =
3672 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3673 return Result;
3674 break;
3675
3676 case INPUT_FILE_OFFSETS:
3677 NumInputs = Record[0];
3678 NumUserInputs = Record[1];
3680 (const llvm::support::unaligned_uint64_t *)Blob.data();
3681 F.InputFilesLoaded.resize(NumInputs);
3682 F.InputFileInfosLoaded.resize(NumInputs);
3683 F.NumUserInputFiles = NumUserInputs;
3684 break;
3685 }
3686 }
3687}
3688
3689llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3690 unsigned ClientLoadCapabilities) {
3691 BitstreamCursor &Stream = F.Stream;
3692
3693 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3694 return Err;
3695 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3696
3697 // Read all of the records and blocks for the AST file.
3698 RecordData Record;
3699 while (true) {
3700 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3701 if (!MaybeEntry)
3702 return MaybeEntry.takeError();
3703 llvm::BitstreamEntry Entry = MaybeEntry.get();
3704
3705 switch (Entry.Kind) {
3706 case llvm::BitstreamEntry::Error:
3707 return llvm::createStringError(
3708 std::errc::illegal_byte_sequence,
3709 "error at end of module block in AST file");
3710 case llvm::BitstreamEntry::EndBlock:
3711 // Outside of C++, we do not store a lookup map for the translation unit.
3712 // Instead, mark it as needing a lookup map to be built if this module
3713 // contains any declarations lexically within it (which it always does!).
3714 // This usually has no cost, since we very rarely need the lookup map for
3715 // the translation unit outside C++.
3716 if (ASTContext *Ctx = ContextObj) {
3717 DeclContext *DC = Ctx->getTranslationUnitDecl();
3718 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3720 }
3721
3722 return llvm::Error::success();
3723 case llvm::BitstreamEntry::SubBlock:
3724 switch (Entry.ID) {
3725 case DECLTYPES_BLOCK_ID:
3726 // We lazily load the decls block, but we want to set up the
3727 // DeclsCursor cursor to point into it. Clone our current bitcode
3728 // cursor to it, enter the block and read the abbrevs in that block.
3729 // With the main cursor, we just skip over it.
3730 F.DeclsCursor = Stream;
3731 if (llvm::Error Err = Stream.SkipBlock())
3732 return Err;
3733 if (llvm::Error Err = ReadBlockAbbrevs(
3735 return Err;
3736 break;
3737
3739 F.MacroCursor = Stream;
3740 if (!PP.getExternalSource())
3741 PP.setExternalSource(this);
3742
3743 if (llvm::Error Err = Stream.SkipBlock())
3744 return Err;
3745 if (llvm::Error Err =
3746 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3747 return Err;
3748 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3749 break;
3750
3752 F.PreprocessorDetailCursor = Stream;
3753
3754 if (llvm::Error Err = Stream.SkipBlock()) {
3755 return Err;
3756 }
3757 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3759 return Err;
3761 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3762
3763 if (!PP.getPreprocessingRecord())
3764 PP.createPreprocessingRecord();
3765 if (!PP.getPreprocessingRecord()->getExternalSource())
3766 PP.getPreprocessingRecord()->SetExternalSource(*this);
3767 break;
3768
3770 if (llvm::Error Err = ReadSourceManagerBlock(F))
3771 return Err;
3772 break;
3773
3774 case SUBMODULE_BLOCK_ID:
3775 F.SubmodulesCursor = Stream;
3776 if (llvm::Error Err = Stream.SkipBlock())
3777 return Err;
3778 if (llvm::Error Err =
3779 ReadBlockAbbrevs(F.SubmodulesCursor, SUBMODULE_BLOCK_ID))
3780 return Err;
3781 F.SubmodulesOffsetBase = F.SubmodulesCursor.GetCurrentBitNo();
3782 break;
3783
3784 case COMMENTS_BLOCK_ID: {
3785 BitstreamCursor C = Stream;
3786
3787 if (llvm::Error Err = Stream.SkipBlock())
3788 return Err;
3789 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3790 return Err;
3791 CommentsCursors.push_back(std::make_pair(C, &F));
3792 break;
3793 }
3794
3795 default:
3796 if (llvm::Error Err = Stream.SkipBlock())
3797 return Err;
3798 break;
3799 }
3800 continue;
3801
3802 case llvm::BitstreamEntry::Record:
3803 // The interesting case.
3804 break;
3805 }
3806
3807 // Read and process a record.
3808 Record.clear();
3809 StringRef Blob;
3810 Expected<unsigned> MaybeRecordType =
3811 Stream.readRecord(Entry.ID, Record, &Blob);
3812 if (!MaybeRecordType)
3813 return MaybeRecordType.takeError();
3814 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3815
3816 // If we're not loading an AST context, we don't care about most records.
3817 if (!ContextObj) {
3818 switch (RecordType) {
3819 case IDENTIFIER_TABLE:
3820 case IDENTIFIER_OFFSET:
3822 case STATISTICS:
3825 case PP_COUNTER_VALUE:
3827 case MODULE_OFFSET_MAP:
3831 case IMPORTED_MODULES:
3832 case MACRO_OFFSET:
3833 case SUBMODULE_METADATA:
3834 break;
3835 default:
3836 continue;
3837 }
3838 }
3839
3840 switch (RecordType) {
3841 default: // Default behavior: ignore.
3842 break;
3843
3844 case SUBMODULE_METADATA: {
3845 F.BaseSubmoduleID = getTotalNumSubmodules();
3850 (const llvm::support::unaligned_uint64_t *)Blob.data();
3851 if (F.LocalNumSubmodules > 0) {
3852 // Introduce the global -> local mapping for submodules within this
3853 // module.
3854 GlobalSubmoduleMap.insert(
3855 std::make_pair(getTotalNumSubmodules() + 1, &F));
3856
3857 // Introduce the local -> global mapping for submodules within this
3858 // module.
3860 std::make_pair(F.LocalBaseSubmoduleID,
3862
3863 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3864 }
3865
3866 auto ReadSubmodule = [&](unsigned LocalID) -> Module * {
3867 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3868 };
3869
3870 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.ModuleName)) {
3871 // If we already knew about this module, make sure to bring all
3872 // submodules up to date.
3873 for (unsigned Index = 0; Index != F.LocalNumSubmodules; ++Index) {
3874 unsigned LocalID =
3876 ReadSubmodule(LocalID);
3877 }
3878 } else {
3879 // If we didn't know this module, we loaded it transitively. Deserialize
3880 // just the top-level module to register it with ModuleMap, but load the
3881 // rest lazily.
3882 ReadSubmodule(F.LocalTopLevelSubmoduleID);
3883 }
3884
3885 break;
3886 }
3887
3888 case TYPE_OFFSET: {
3889 if (F.LocalNumTypes != 0)
3890 return llvm::createStringError(
3891 std::errc::illegal_byte_sequence,
3892 "duplicate TYPE_OFFSET record in AST file");
3893 F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3894 F.LocalNumTypes = Record[0];
3895 F.BaseTypeIndex = getTotalNumTypes();
3896
3897 if (F.LocalNumTypes > 0)
3898 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3899
3900 break;
3901 }
3902
3903 case DECL_OFFSET: {
3904 if (F.LocalNumDecls != 0)
3905 return llvm::createStringError(
3906 std::errc::illegal_byte_sequence,
3907 "duplicate DECL_OFFSET record in AST file");
3908 F.DeclOffsets = (const DeclOffset *)Blob.data();
3909 F.LocalNumDecls = Record[0];
3910 F.BaseDeclIndex = getTotalNumDecls();
3911
3912 if (F.LocalNumDecls > 0)
3913 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3914
3915 break;
3916 }
3917
3918 case TU_UPDATE_LEXICAL: {
3919 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3920 LexicalContents Contents(
3921 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3922 static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3923 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3925 break;
3926 }
3927
3928 case UPDATE_VISIBLE: {
3929 unsigned Idx = 0;
3930 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3931 auto *Data = (const unsigned char*)Blob.data();
3932 PendingVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3933 // If we've already loaded the decl, perform the updates when we finish
3934 // loading this block.
3935 if (Decl *D = GetExistingDecl(ID))
3936 PendingUpdateRecords.push_back(
3937 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3938 break;
3939 }
3940
3942 unsigned Idx = 0;
3943 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3944 auto *Data = (const unsigned char *)Blob.data();
3945 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3946 // If we've already loaded the decl, perform the updates when we finish
3947 // loading this block.
3948 if (Decl *D = GetExistingDecl(ID))
3949 PendingUpdateRecords.push_back(
3950 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3951 break;
3952 }
3953
3955 if (F.Kind != MK_MainFile)
3956 break;
3957 unsigned Idx = 0;
3958 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3959 auto *Data = (const unsigned char *)Blob.data();
3960 TULocalUpdates[ID].push_back(UpdateData{&F, Data});
3961 // If we've already loaded the decl, perform the updates when we finish
3962 // loading this block.
3963 if (Decl *D = GetExistingDecl(ID))
3964 PendingUpdateRecords.push_back(
3965 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3966 break;
3967 }
3968
3970 unsigned Idx = 0;
3971 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3972 auto *Data = (const unsigned char *)Blob.data();
3973 PendingSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3974 // If we've already loaded the decl, perform the updates when we finish
3975 // loading this block.
3976 if (Decl *D = GetExistingDecl(ID))
3977 PendingUpdateRecords.push_back(
3978 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3979 break;
3980 }
3981
3983 unsigned Idx = 0;
3984 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3985 auto *Data = (const unsigned char *)Blob.data();
3986 PendingPartialSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3987 // If we've already loaded the decl, perform the updates when we finish
3988 // loading this block.
3989 if (Decl *D = GetExistingDecl(ID))
3990 PendingUpdateRecords.push_back(
3991 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3992 break;
3993 }
3994
3995 case IDENTIFIER_TABLE:
3997 reinterpret_cast<const unsigned char *>(Blob.data());
3998 if (Record[0]) {
3999 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
4001 F.IdentifierTableData + sizeof(uint32_t),
4003 ASTIdentifierLookupTrait(*this, F));
4004
4005 PP.getIdentifierTable().setExternalIdentifierLookup(this);
4006 }
4007 break;
4008
4009 case IDENTIFIER_OFFSET: {
4010 if (F.LocalNumIdentifiers != 0)
4011 return llvm::createStringError(
4012 std::errc::illegal_byte_sequence,
4013 "duplicate IDENTIFIER_OFFSET record in AST file");
4014 F.IdentifierOffsets = (const uint32_t *)Blob.data();
4016 F.BaseIdentifierID = getTotalNumIdentifiers();
4017
4018 if (F.LocalNumIdentifiers > 0)
4019 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4021 break;
4022 }
4023
4025 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
4026 break;
4027
4029 // FIXME: Skip reading this record if our ASTConsumer doesn't care
4030 // about "interesting" decls (for instance, if we're building a module).
4031 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4032 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4033 break;
4034
4036 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
4037 // them (ie: if we're not codegenerating this module).
4038 if (F.Kind == MK_MainFile ||
4039 getContext().getLangOpts().BuildingPCHWithObjectFile)
4040 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4041 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4042 break;
4043
4044 case SPECIAL_TYPES:
4045 if (SpecialTypes.empty()) {
4046 for (unsigned I = 0, N = Record.size(); I != N; ++I)
4047 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
4048 break;
4049 }
4050
4051 if (Record.empty())
4052 break;
4053
4054 if (SpecialTypes.size() != Record.size())
4055 return llvm::createStringError(std::errc::illegal_byte_sequence,
4056 "invalid special-types record");
4057
4058 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4059 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
4060 if (!SpecialTypes[I])
4061 SpecialTypes[I] = ID;
4062 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
4063 // merge step?
4064 }
4065 break;
4066
4067 case STATISTICS:
4068 TotalNumStatements += Record[0];
4069 TotalNumMacros += Record[1];
4070 TotalLexicalDeclContexts += Record[2];
4071 TotalVisibleDeclContexts += Record[3];
4072 TotalModuleLocalVisibleDeclContexts += Record[4];
4073 TotalTULocalVisibleDeclContexts += Record[5];
4074 break;
4075
4077 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4078 UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
4079 break;
4080
4081 case DELEGATING_CTORS:
4082 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4083 DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
4084 break;
4085
4087 if (Record.size() % 3 != 0)
4088 return llvm::createStringError(std::errc::illegal_byte_sequence,
4089 "invalid weak identifiers record");
4090
4091 // FIXME: Ignore weak undeclared identifiers from non-original PCH
4092 // files. This isn't the way to do it :)
4093 WeakUndeclaredIdentifiers.clear();
4094
4095 // Translate the weak, undeclared identifiers into global IDs.
4096 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4097 WeakUndeclaredIdentifiers.push_back(
4098 getGlobalIdentifierID(F, Record[I++]));
4099 WeakUndeclaredIdentifiers.push_back(
4100 getGlobalIdentifierID(F, Record[I++]));
4101 WeakUndeclaredIdentifiers.push_back(
4102 ReadSourceLocation(F, Record, I).getRawEncoding());
4103 }
4104 break;
4105
4107 if (Record.size() % 3 != 0)
4108 return llvm::createStringError(std::errc::illegal_byte_sequence,
4109 "invalid extname identifiers record");
4110
4111 // FIXME: Ignore #pragma redefine_extname'd, undeclared identifiers from
4112 // non-original PCH files. This isn't the way to do it :)
4113 ExtnameUndeclaredIdentifiers.clear();
4114
4115 // Translate the #pragma redefine_extname'd, undeclared identifiers into
4116 // global IDs.
4117 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4118 ExtnameUndeclaredIdentifiers.push_back(
4119 getGlobalIdentifierID(F, Record[I++]));
4120 ExtnameUndeclaredIdentifiers.push_back(
4121 getGlobalIdentifierID(F, Record[I++]));
4122 ExtnameUndeclaredIdentifiers.push_back(
4123 ReadSourceLocation(F, Record, I).getRawEncoding());
4124 }
4125 break;
4126
4127 case SELECTOR_OFFSETS: {
4128 F.SelectorOffsets = (const uint32_t *)Blob.data();
4130 unsigned LocalBaseSelectorID = Record[1];
4131 F.BaseSelectorID = getTotalNumSelectors();
4132
4133 if (F.LocalNumSelectors > 0) {
4134 // Introduce the global -> local mapping for selectors within this
4135 // module.
4136 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4137
4138 // Introduce the local -> global mapping for selectors within this
4139 // module.
4141 std::make_pair(LocalBaseSelectorID,
4142 F.BaseSelectorID - LocalBaseSelectorID));
4143
4144 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
4145 }
4146 break;
4147 }
4148
4149 case METHOD_POOL:
4150 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
4151 if (Record[0])
4153 = ASTSelectorLookupTable::Create(
4156 ASTSelectorLookupTrait(*this, F));
4157 TotalNumMethodPoolEntries += Record[1];
4158 break;
4159
4161 if (!Record.empty()) {
4162 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
4163 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4164 Record[Idx++]));
4165 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
4166 getRawEncoding());
4167 }
4168 }
4169 break;
4170
4171 case PP_ASSUME_NONNULL_LOC: {
4172 unsigned Idx = 0;
4173 if (!Record.empty())
4174 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4175 ReadSourceLocation(F, Record, Idx));
4176 break;
4177 }
4178
4180 if (!Record.empty()) {
4181 SmallVector<SourceLocation, 64> SrcLocs;
4182 unsigned Idx = 0;
4183 while (Idx < Record.size())
4184 SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
4185 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4186 }
4187 break;
4188 }
4189
4191 if (!Record.empty()) {
4192 unsigned Idx = 0, End = Record.size() - 1;
4193 bool ReachedEOFWhileSkipping = Record[Idx++];
4194 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4195 if (ReachedEOFWhileSkipping) {
4196 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
4197 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
4198 bool FoundNonSkipPortion = Record[Idx++];
4199 bool FoundElse = Record[Idx++];
4200 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
4201 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4202 FoundElse, ElseLoc);
4203 }
4204 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4205 while (Idx < End) {
4206 auto Loc = ReadSourceLocation(F, Record, Idx);
4207 bool WasSkipping = Record[Idx++];
4208 bool FoundNonSkip = Record[Idx++];
4209 bool FoundElse = Record[Idx++];
4210 ConditionalStack.push_back(
4211 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4212 }
4213 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4214 }
4215 break;
4216
4217 case PP_COUNTER_VALUE:
4218 if (!Record.empty() && Listener)
4219 Listener->ReadCounter(F, Record[0]);
4220 break;
4221
4222 case FILE_SORTED_DECLS:
4223 F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
4225 break;
4226
4228 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
4230 SourceLocation::UIntTy SLocSpaceSize = Record[1];
4232 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
4233 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
4234 SLocSpaceSize);
4235 if (!F.SLocEntryBaseID) {
4236 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4237 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4238 return llvm::createStringError(std::errc::invalid_argument,
4239 "ran out of source locations");
4240 }
4241 // Make our entry in the range map. BaseID is negative and growing, so
4242 // we invert it. Because we invert it, though, we need the other end of
4243 // the range.
4244 unsigned RangeStart =
4245 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
4246 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4248
4249 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
4250 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
4251 GlobalSLocOffsetMap.insert(
4252 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
4253 - SLocSpaceSize,&F));
4254
4255 TotalNumSLocEntries += F.LocalNumSLocEntries;
4256 break;
4257 }
4258
4259 case MODULE_OFFSET_MAP:
4260 F.ModuleOffsetMap = Blob;
4261 break;
4262
4264 ParseLineTable(F, Record);
4265 break;
4266
4267 case EXT_VECTOR_DECLS:
4268 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4269 ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
4270 break;
4271
4272 case VTABLE_USES:
4273 if (Record.size() % 3 != 0)
4274 return llvm::createStringError(std::errc::illegal_byte_sequence,
4275 "Invalid VTABLE_USES record");
4276
4277 // Later tables overwrite earlier ones.
4278 // FIXME: Modules will have some trouble with this. This is clearly not
4279 // the right way to do this.
4280 VTableUses.clear();
4281
4282 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
4283 VTableUses.push_back(
4284 {ReadDeclID(F, Record, Idx),
4285 ReadSourceLocation(F, Record, Idx).getRawEncoding(),
4286 (bool)Record[Idx++]});
4287 }
4288 break;
4289
4291
4292 if (Record.size() % 2 != 0)
4293 return llvm::createStringError(
4294 std::errc::illegal_byte_sequence,
4295 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4296
4297 // For standard C++20 module, we will only reads the instantiations
4298 // if it is the main file.
4299 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
4300 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4301 PendingInstantiations.push_back(
4302 {ReadDeclID(F, Record, I),
4303 ReadSourceLocation(F, Record, I).getRawEncoding()});
4304 }
4305 }
4306 break;
4307
4308 case SEMA_DECL_REFS:
4309 if (Record.size() != 3)
4310 return llvm::createStringError(std::errc::illegal_byte_sequence,
4311 "Invalid SEMA_DECL_REFS block");
4312 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4313 SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
4314 break;
4315
4316 case PPD_ENTITIES_OFFSETS: {
4317 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
4318 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
4319 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
4320
4321 unsigned StartingID;
4322 if (!PP.getPreprocessingRecord())
4323 PP.createPreprocessingRecord();
4324 if (!PP.getPreprocessingRecord()->getExternalSource())
4325 PP.getPreprocessingRecord()->SetExternalSource(*this);
4326 StartingID
4327 = PP.getPreprocessingRecord()
4328 ->allocateLoadedEntities(F.NumPreprocessedEntities);
4329 F.BasePreprocessedEntityID = StartingID;
4330
4331 if (F.NumPreprocessedEntities > 0) {
4332 // Introduce the global -> local mapping for preprocessed entities in
4333 // this module.
4334 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4335 }
4336
4337 break;
4338 }
4339
4340 case PPD_SKIPPED_RANGES: {
4341 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
4342 assert(Blob.size() % sizeof(PPSkippedRange) == 0);
4343 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
4344
4345 if (!PP.getPreprocessingRecord())
4346 PP.createPreprocessingRecord();
4347 if (!PP.getPreprocessingRecord()->getExternalSource())
4348 PP.getPreprocessingRecord()->SetExternalSource(*this);
4349 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
4350 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
4351
4353 GlobalSkippedRangeMap.insert(
4354 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
4355 break;
4356 }
4357
4359 if (Record.size() % 2 != 0)
4360 return llvm::createStringError(
4361 std::errc::illegal_byte_sequence,
4362 "invalid DECL_UPDATE_OFFSETS block in AST file");
4363 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4364 GlobalDeclID ID = ReadDeclID(F, Record, I);
4365 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
4366
4367 // If we've already loaded the decl, perform the updates when we finish
4368 // loading this block.
4369 if (Decl *D = GetExistingDecl(ID))
4370 PendingUpdateRecords.push_back(
4371 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4372 }
4373 break;
4374
4376 if (Record.size() % 5 != 0)
4377 return llvm::createStringError(
4378 std::errc::illegal_byte_sequence,
4379 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4380 "file");
4381 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4382 GlobalDeclID ID = ReadDeclID(F, Record, I);
4383
4384 uint64_t BaseOffset = F.DeclsBlockStartOffset;
4385 assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
4386 uint64_t LocalLexicalOffset = Record[I++];
4387 uint64_t LexicalOffset =
4388 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4389 uint64_t LocalVisibleOffset = Record[I++];
4390 uint64_t VisibleOffset =
4391 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4392 uint64_t LocalModuleLocalOffset = Record[I++];
4393 uint64_t ModuleLocalOffset =
4394 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4395 uint64_t TULocalLocalOffset = Record[I++];
4396 uint64_t TULocalOffset =
4397 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4398
4399 DelayedNamespaceOffsetMap[ID] = {
4400 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4401
4402 assert(!GetExistingDecl(ID) &&
4403 "We shouldn't load the namespace in the front of delayed "
4404 "namespace lexical and visible block");
4405 }
4406 break;
4407 }
4408
4409 case RELATED_DECLS_MAP:
4410 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4411 GlobalDeclID ID = ReadDeclID(F, Record, I);
4412 auto &RelatedDecls = RelatedDeclsMap[ID];
4413 unsigned NN = Record[I++];
4414 RelatedDecls.reserve(NN);
4415 for (unsigned II = 0; II < NN; II++)
4416 RelatedDecls.push_back(ReadDeclID(F, Record, I));
4417 }
4418 break;
4419
4421 if (F.LocalNumObjCCategoriesInMap != 0)
4422 return llvm::createStringError(
4423 std::errc::illegal_byte_sequence,
4424 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4425
4427 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
4428 break;
4429
4430 case OBJC_CATEGORIES:
4431 F.ObjCCategories.swap(Record);
4432 break;
4433
4435 // Later tables overwrite earlier ones.
4436 // FIXME: Modules will have trouble with this.
4437 CUDASpecialDeclRefs.clear();
4438 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4439 CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
4440 break;
4441
4443 F.HeaderFileInfoTableData = Blob.data();
4445 if (Record[0]) {
4446 F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create(
4447 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
4448 (const unsigned char *)F.HeaderFileInfoTableData,
4449 HeaderFileInfoTrait(*this, F));
4450
4451 PP.getHeaderSearchInfo().SetExternalSource(this);
4452 if (!PP.getHeaderSearchInfo().getExternalLookup())
4453 PP.getHeaderSearchInfo().SetExternalLookup(this);
4454 }
4455 break;
4456
4457 case FP_PRAGMA_OPTIONS:
4458 // Later tables overwrite earlier ones.
4459 FPPragmaOptions.swap(Record);
4460 break;
4461
4463 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4464 DeclsWithEffectsToVerify.push_back(ReadDeclID(F, Record, I));
4465 break;
4466
4467 case OPENCL_EXTENSIONS:
4468 for (unsigned I = 0, E = Record.size(); I != E; ) {
4469 auto Name = ReadString(Record, I);
4470 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4471 OptInfo.Supported = Record[I++] != 0;
4472 OptInfo.Enabled = Record[I++] != 0;
4473 OptInfo.WithPragma = Record[I++] != 0;
4474 OptInfo.Avail = Record[I++];
4475 OptInfo.Core = Record[I++];
4476 OptInfo.Opt = Record[I++];
4477 }
4478 break;
4479
4481 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4482 TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
4483 break;
4484
4485 case KNOWN_NAMESPACES:
4486 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4487 KnownNamespaces.push_back(ReadDeclID(F, Record, I));
4488 break;
4489
4490 case UNDEFINED_BUT_USED:
4491 if (Record.size() % 2 != 0)
4492 return llvm::createStringError(std::errc::illegal_byte_sequence,
4493 "invalid undefined-but-used record");
4494 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4495 UndefinedButUsed.push_back(
4496 {ReadDeclID(F, Record, I),
4497 ReadSourceLocation(F, Record, I).getRawEncoding()});
4498 }
4499 break;
4500
4502 for (unsigned I = 0, N = Record.size(); I != N;) {
4503 DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
4504 const uint64_t Count = Record[I++];
4505 DelayedDeleteExprs.push_back(Count);
4506 for (uint64_t C = 0; C < Count; ++C) {
4507 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
4508 bool IsArrayForm = Record[I++] == 1;
4509 DelayedDeleteExprs.push_back(IsArrayForm);
4510 }
4511 }
4512 break;
4513
4514 case VTABLES_TO_EMIT:
4515 if (F.Kind == MK_MainFile ||
4516 getContext().getLangOpts().BuildingPCHWithObjectFile)
4517 for (unsigned I = 0, N = Record.size(); I != N;)
4518 VTablesToEmit.push_back(ReadDeclID(F, Record, I));
4519 break;
4520
4521 case IMPORTED_MODULES:
4522 if (!F.isModule()) {
4523 // If we aren't loading a module (which has its own exports), make
4524 // all of the imported modules visible.
4525 // FIXME: Deal with macros-only imports.
4526 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
4527 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
4528 SourceLocation Loc = ReadSourceLocation(F, Record, I);
4529 if (GlobalID) {
4530 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4531 if (DeserializationListener)
4532 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4533 }
4534 }
4535 }
4536 break;
4537
4538 case MACRO_OFFSET: {
4539 if (F.LocalNumMacros != 0)
4540 return llvm::createStringError(
4541 std::errc::illegal_byte_sequence,
4542 "duplicate MACRO_OFFSET record in AST file");
4543 F.MacroOffsets = (const uint32_t *)Blob.data();
4544 F.LocalNumMacros = Record[0];
4546 F.BaseMacroID = getTotalNumMacros();
4547
4548 if (F.LocalNumMacros > 0)
4549 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
4550 break;
4551 }
4552
4554 LateParsedTemplates.emplace_back(
4555 std::piecewise_construct, std::forward_as_tuple(&F),
4556 std::forward_as_tuple(Record.begin(), Record.end()));
4557 break;
4558
4560 if (Record.size() != 1)
4561 return llvm::createStringError(std::errc::illegal_byte_sequence,
4562 "invalid pragma optimize record");
4563 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
4564 break;
4565
4567 if (Record.size() != 1)
4568 return llvm::createStringError(std::errc::illegal_byte_sequence,
4569 "invalid pragma ms_struct record");
4570 PragmaMSStructState = Record[0];
4571 break;
4572
4574 if (Record.size() != 2)
4575 return llvm::createStringError(
4576 std::errc::illegal_byte_sequence,
4577 "invalid pragma pointers to members record");
4578 PragmaMSPointersToMembersState = Record[0];
4579 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4580 break;
4581
4583 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4584 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4585 break;
4586
4588 if (Record.size() != 1)
4589 return llvm::createStringError(std::errc::illegal_byte_sequence,
4590 "invalid cuda pragma options record");
4591 ForceHostDeviceDepth = Record[0];
4592 break;
4593
4595 if (Record.size() < 3)
4596 return llvm::createStringError(std::errc::illegal_byte_sequence,
4597 "invalid pragma pack record");
4598 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4599 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4600 unsigned NumStackEntries = Record[2];
4601 unsigned Idx = 3;
4602 // Reset the stack when importing a new module.
4603 PragmaAlignPackStack.clear();
4604 for (unsigned I = 0; I < NumStackEntries; ++I) {
4605 PragmaAlignPackStackEntry Entry;
4606 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4607 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4608 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4609 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4610 Entry.SlotLabel = PragmaAlignPackStrings.back();
4611 PragmaAlignPackStack.push_back(Entry);
4612 }
4613 break;
4614 }
4615
4617 if (Record.size() < 3)
4618 return llvm::createStringError(std::errc::illegal_byte_sequence,
4619 "invalid pragma float control record");
4620 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4621 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4622 unsigned NumStackEntries = Record[2];
4623 unsigned Idx = 3;
4624 // Reset the stack when importing a new module.
4625 FpPragmaStack.clear();
4626 for (unsigned I = 0; I < NumStackEntries; ++I) {
4627 FpPragmaStackEntry Entry;
4628 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4629 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4630 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4631 FpPragmaStrings.push_back(ReadString(Record, Idx));
4632 Entry.SlotLabel = FpPragmaStrings.back();
4633 FpPragmaStack.push_back(Entry);
4634 }
4635 break;
4636 }
4637
4639 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4640 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4641 break;
4642
4644 unsigned NumRecords = Record.front();
4645 // Last record which is used to keep number of valid records.
4646 if (Record.size() - 1 != NumRecords)
4647 return llvm::createStringError(std::errc::illegal_byte_sequence,
4648 "invalid rvv intrinsic pragma record");
4649
4650 if (RISCVVecIntrinsicPragma.empty())
4651 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4652 // There might be multiple precompiled modules imported, we need to union
4653 // them all.
4654 for (unsigned i = 0; i < NumRecords; ++i)
4655 RISCVVecIntrinsicPragma[i] |= Record[i + 1];
4656 break;
4657 }
4658 }
4659 }
4660}
4661
4662void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4663 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4664
4665 // Additional remapping information.
4666 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4667 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4668 F.ModuleOffsetMap = StringRef();
4669
4671 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4672 RemapBuilder SelectorRemap(F.SelectorRemap);
4673
4674 auto &ImportedModuleVector = F.TransitiveImports;
4675 assert(ImportedModuleVector.empty());
4676
4677 while (Data < DataEnd) {
4678 // FIXME: Looking up dependency modules by filename is horrible. Let's
4679 // start fixing this with prebuilt, explicit and implicit modules and see
4680 // how it goes...
4681 using namespace llvm::support;
4682 ModuleKind Kind = static_cast<ModuleKind>(
4683 endian::readNext<uint8_t, llvm::endianness::little>(Data));
4684 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4685 StringRef Name = StringRef((const char*)Data, Len);
4686 Data += Len;
4687 ModuleFile *OM =
4690 ? ModuleMgr.lookupByModuleName(Name)
4691 : ModuleMgr.lookupByFileName(ModuleFileName::makeExplicit(Name)));
4692 if (!OM)
4693 OM = ModuleMgr.lookupByFileName(ModuleFileName::makeInMemory(Name));
4694 if (!OM) {
4695 std::string Msg = "refers to unknown module, cannot find ";
4696 Msg.append(std::string(Name));
4697 Error(Msg);
4698 return;
4699 }
4700
4701 ImportedModuleVector.push_back(OM);
4702
4703 uint32_t SubmoduleIDOffset =
4704 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4705 uint32_t SelectorIDOffset =
4706 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4707
4708 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4709 RemapBuilder &Remap) {
4710 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4711 if (Offset != None)
4712 Remap.insert(std::make_pair(Offset,
4713 static_cast<int>(BaseOffset - Offset)));
4714 };
4715
4716 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4717 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4718 }
4719}
4720
4722ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4723 const ModuleFile *ImportedBy,
4724 unsigned ClientLoadCapabilities) {
4725 unsigned Idx = 0;
4726 F.ModuleMapPath = ReadPath(F, Record, Idx);
4727
4728 // Try to resolve ModuleName in the current header search context and
4729 // verify that it is found in the same module map file as we saved. If the
4730 // top-level AST file is a main file, skip this check because there is no
4731 // usable header search context.
4732 assert(!F.ModuleName.empty() &&
4733 "MODULE_NAME should come before MODULE_MAP_FILE");
4734 auto [MaybeM, IgnoreError] =
4735 getModuleForRelocationChecks(F, /*DirectoryCheck=*/false);
4736 if (MaybeM.has_value()) {
4737 // An implicitly-loaded module file should have its module listed in some
4738 // module map file that we've already loaded.
4739 Module *M = MaybeM.value();
4740 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4741 OptionalFileEntryRef ModMap =
4742 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4743 if (!IgnoreError && !ModMap) {
4744 if (M && M->Directory)
4745 Diag(diag::remark_module_relocated)
4746 << F.ModuleName << F.BaseDirectory << M->Directory->getName();
4747
4748 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4749 if (auto ASTFileName = M ? M->getASTFileName() : nullptr) {
4750 // This module was defined by an imported (explicit) module.
4751 Diag(diag::err_module_file_conflict)
4752 << F.ModuleName << F.FileName << *ASTFileName;
4753 // TODO: Add a note with the module map paths if they differ.
4754 } else {
4755 // This module was built with a different module map.
4756 Diag(diag::err_imported_module_not_found)
4757 << F.ModuleName << F.FileName
4758 << (ImportedBy ? ImportedBy->FileName.str() : "")
4759 << F.ModuleMapPath << !ImportedBy;
4760 // In case it was imported by a PCH, there's a chance the user is
4761 // just missing to include the search path to the directory containing
4762 // the modulemap.
4763 if (ImportedBy && ImportedBy->Kind == MK_PCH)
4764 Diag(diag::note_imported_by_pch_module_not_found)
4765 << llvm::sys::path::parent_path(F.ModuleMapPath);
4766 }
4767 }
4768 return OutOfDate;
4769 }
4770
4771 assert(M && M->Name == F.ModuleName && "found module with different name");
4772
4773 // Check the primary module map file.
4774 auto StoredModMap = FileMgr.getOptionalFileRef(F.ModuleMapPath);
4775 if (!StoredModMap || *StoredModMap != ModMap) {
4776 assert(ModMap && "found module is missing module map file");
4777 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4778 "top-level import should be verified");
4779 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4780 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4781 Diag(diag::err_imported_module_modmap_changed)
4782 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4783 << ModMap->getName() << F.ModuleMapPath << NotImported;
4784 return OutOfDate;
4785 }
4786
4787 ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4788 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4789 // FIXME: we should use input files rather than storing names.
4790 std::string Filename = ReadPath(F, Record, Idx);
4791 auto SF = FileMgr.getOptionalFileRef(Filename, false, false);
4792 if (!SF) {
4793 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4794 Error("could not find file '" + Filename +"' referenced by AST file");
4795 return OutOfDate;
4796 }
4797 AdditionalStoredMaps.insert(*SF);
4798 }
4799
4800 // Check any additional module map files (e.g. module.private.modulemap)
4801 // that are not in the pcm.
4802 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4803 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4804 // Remove files that match
4805 // Note: SmallPtrSet::erase is really remove
4806 if (!AdditionalStoredMaps.erase(ModMap)) {
4807 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4808 Diag(diag::err_module_different_modmap)
4809 << F.ModuleName << /*new*/0 << ModMap.getName();
4810 return OutOfDate;
4811 }
4812 }
4813 }
4814
4815 // Check any additional module map files that are in the pcm, but not
4816 // found in header search. Cases that match are already removed.
4817 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4818 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4819 Diag(diag::err_module_different_modmap)
4820 << F.ModuleName << /*not new*/1 << ModMap.getName();
4821 return OutOfDate;
4822 }
4823 }
4824
4825 if (Listener)
4826 Listener->ReadModuleMapFile(F.ModuleMapPath);
4827 return Success;
4828}
4829
4830/// Move the given method to the back of the global list of methods.
4832 // Find the entry for this selector in the method pool.
4833 SemaObjC::GlobalMethodPool::iterator Known =
4834 S.ObjC().MethodPool.find(Method->getSelector());
4835 if (Known == S.ObjC().MethodPool.end())
4836 return;
4837
4838 // Retrieve the appropriate method list.
4839 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4840 : Known->second.second;
4841 bool Found = false;
4842 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4843 if (!Found) {
4844 if (List->getMethod() == Method) {
4845 Found = true;
4846 } else {
4847 // Keep searching.
4848 continue;
4849 }
4850 }
4851
4852 if (List->getNext())
4853 List->setMethod(List->getNext()->getMethod());
4854 else
4855 List->setMethod(Method);
4856 }
4857}
4858
4859void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4860 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4861 for (Decl *D : Names) {
4862 bool wasHidden = !D->isUnconditionallyVisible();
4864
4865 if (wasHidden && SemaObj) {
4866 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4868 }
4869 }
4870 }
4871}
4872
4874 Module::NameVisibilityKind NameVisibility,
4875 SourceLocation ImportLoc) {
4878 Stack.push_back(Mod);
4879 while (!Stack.empty()) {
4880 Mod = Stack.pop_back_val();
4881
4882 if (NameVisibility <= Mod->NameVisibility) {
4883 // This module already has this level of visibility (or greater), so
4884 // there is nothing more to do.
4885 continue;
4886 }
4887
4888 if (Mod->isUnimportable()) {
4889 // Modules that aren't importable cannot be made visible.
4890 continue;
4891 }
4892
4893 // Update the module's name visibility.
4894 Mod->NameVisibility = NameVisibility;
4895
4896 // If we've already deserialized any names from this module,
4897 // mark them as visible.
4898 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4899 if (Hidden != HiddenNamesMap.end()) {
4900 auto HiddenNames = std::move(*Hidden);
4901 HiddenNamesMap.erase(Hidden);
4902 makeNamesVisible(HiddenNames.second, HiddenNames.first);
4903 assert(!HiddenNamesMap.contains(Mod) &&
4904 "making names visible added hidden names");
4905 }
4906
4907 // Push any exported modules onto the stack to be marked as visible.
4909 Mod->getExportedModules(Exports);
4911 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4912 Module *Exported = *I;
4913 if (Visited.insert(Exported).second)
4914 Stack.push_back(Exported);
4915 }
4916 }
4917}
4918
4919/// We've merged the definition \p MergedDef into the existing definition
4920/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4921/// visible.
4923 NamedDecl *MergedDef) {
4924 if (!Def->isUnconditionallyVisible()) {
4925 // If MergedDef is visible or becomes visible, make the definition visible.
4926 if (MergedDef->isUnconditionallyVisible())
4928 else {
4929 getContext().mergeDefinitionIntoModule(
4930 Def, MergedDef->getImportedOwningModule(),
4931 /*NotifyListeners*/ false);
4932 PendingMergedDefinitionsToDeduplicate.insert(Def);
4933 }
4934 }
4935}
4936
4938 if (GlobalIndex)
4939 return false;
4940
4941 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4942 !PP.getLangOpts().Modules)
4943 return true;
4944
4945 // Try to load the global index.
4946 TriedLoadingGlobalIndex = true;
4947 StringRef SpecificModuleCachePath =
4948 getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath();
4949 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4950 GlobalModuleIndex::readIndex(SpecificModuleCachePath);
4951 if (llvm::Error Err = std::move(Result.second)) {
4952 assert(!Result.first);
4953 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4954 return true;
4955 }
4956
4957 GlobalIndex.reset(Result.first);
4958 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4959 return false;
4960}
4961
4963 return PP.getLangOpts().Modules && UseGlobalIndex &&
4964 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4965}
4966
4967/// Given a cursor at the start of an AST file, scan ahead and drop the
4968/// cursor into the start of the given block ID, returning false on success and
4969/// true on failure.
4970static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4971 while (true) {
4972 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4973 if (!MaybeEntry) {
4974 // FIXME this drops errors on the floor.
4975 consumeError(MaybeEntry.takeError());
4976 return true;
4977 }
4978 llvm::BitstreamEntry Entry = MaybeEntry.get();
4979
4980 switch (Entry.Kind) {
4981 case llvm::BitstreamEntry::Error:
4982 case llvm::BitstreamEntry::EndBlock:
4983 return true;
4984
4985 case llvm::BitstreamEntry::Record:
4986 // Ignore top-level records.
4987 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4988 break;
4989 else {
4990 // FIXME this drops errors on the floor.
4991 consumeError(Skipped.takeError());
4992 return true;
4993 }
4994
4995 case llvm::BitstreamEntry::SubBlock:
4996 if (Entry.ID == BlockID) {
4997 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4998 // FIXME this drops the error on the floor.
4999 consumeError(std::move(Err));
5000 return true;
5001 }
5002 // Found it!
5003 return false;
5004 }
5005
5006 if (llvm::Error Err = Cursor.SkipBlock()) {
5007 // FIXME this drops the error on the floor.
5008 consumeError(std::move(Err));
5009 return true;
5010 }
5011 }
5012 }
5013}
5014
5017 SourceLocation ImportLoc,
5018 unsigned ClientLoadCapabilities,
5019 ModuleFile **NewLoadedModuleFile) {
5020 llvm::TimeTraceScope scope("ReadAST", FileName);
5021
5022 llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
5024 CurrentDeserializingModuleKind, Type);
5025
5026 // Defer any pending actions until we get to the end of reading the AST file.
5027 Deserializing AnASTFile(this);
5028
5029 // Bump the generation number.
5030 unsigned PreviousGeneration = 0;
5031 if (ContextObj)
5032 PreviousGeneration = incrementGeneration(*ContextObj);
5033
5034 unsigned NumModules = ModuleMgr.size();
5036 if (ASTReadResult ReadResult =
5037 ReadASTCore(FileName, Type, ImportLoc,
5038 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
5039 ClientLoadCapabilities)) {
5040 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5041
5042 // If we find that any modules are unusable, the global index is going
5043 // to be out-of-date. Just remove it.
5044 GlobalIndex.reset();
5045 ModuleMgr.setGlobalIndex(nullptr);
5046 return ReadResult;
5047 }
5048
5049 if (NewLoadedModuleFile && !Loaded.empty())
5050 *NewLoadedModuleFile = Loaded.back().Mod;
5051
5052 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
5053 // remove modules from this point. Various fields are updated during reading
5054 // the AST block and removing the modules would result in dangling pointers.
5055 // They are generally only incidentally dereferenced, ie. a binary search
5056 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
5057 // be dereferenced but it wouldn't actually be used.
5058
5059 // Load the AST blocks of all of the modules that we loaded. We can still
5060 // hit errors parsing the ASTs at this point.
5061 for (ImportedModule &M : Loaded) {
5062 ModuleFile &F = *M.Mod;
5063 llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
5064
5065 // Read the AST block.
5066 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5067 Error(std::move(Err));
5068 return Failure;
5069 }
5070
5071 // The AST block should always have a definition for the main module.
5072 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
5073 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
5074 return Failure;
5075 }
5076
5077 // Read the extension blocks.
5079 if (llvm::Error Err = ReadExtensionBlock(F)) {
5080 Error(std::move(Err));
5081 return Failure;
5082 }
5083 }
5084
5085 // Once read, set the ModuleFile bit base offset and update the size in
5086 // bits of all files we've seen.
5087 F.GlobalBitOffset = TotalModulesSizeInBits;
5088 TotalModulesSizeInBits += F.SizeInBits;
5089 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
5090 }
5091
5092 // Preload source locations and interesting indentifiers.
5093 for (ImportedModule &M : Loaded) {
5094 ModuleFile &F = *M.Mod;
5095
5096 // Map the original source file ID into the ID space of the current
5097 // compilation.
5100
5101 for (auto Offset : F.PreloadIdentifierOffsets) {
5102 const unsigned char *Data = F.IdentifierTableData + Offset;
5103
5104 ASTIdentifierLookupTrait Trait(*this, F);
5105 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
5106 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
5107
5108 IdentifierInfo *II;
5109 if (!PP.getLangOpts().CPlusPlus) {
5110 // Identifiers present in both the module file and the importing
5111 // instance are marked out-of-date so that they can be deserialized
5112 // on next use via ASTReader::updateOutOfDateIdentifier().
5113 // Identifiers present in the module file but not in the importing
5114 // instance are ignored for now, preventing growth of the identifier
5115 // table. They will be deserialized on first use via ASTReader::get().
5116 auto It = PP.getIdentifierTable().find(Key);
5117 if (It == PP.getIdentifierTable().end())
5118 continue;
5119 II = It->second;
5120 } else {
5121 // With C++ modules, not many identifiers are considered interesting.
5122 // All identifiers in the module file can be placed into the identifier
5123 // table of the importing instance and marked as out-of-date. This makes
5124 // ASTReader::get() a no-op, and deserialization will take place on
5125 // first/next use via ASTReader::updateOutOfDateIdentifier().
5126 II = &PP.getIdentifierTable().getOwn(Key);
5127 }
5128
5129 II->setOutOfDate(true);
5130
5131 // Mark this identifier as being from an AST file so that we can track
5132 // whether we need to serialize it.
5133 markIdentifierFromAST(*this, *II, /*IsModule=*/true);
5134
5135 // Associate the ID with the identifier so that the writer can reuse it.
5136 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
5137 SetIdentifierInfo(ID, II);
5138 }
5139 }
5140
5141 // Builtins and library builtins have already been initialized. Mark all
5142 // identifiers as out-of-date, so that they are deserialized on first use.
5143 if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
5144 for (auto &Id : PP.getIdentifierTable())
5145 Id.second->setOutOfDate(true);
5146
5147 // Mark selectors as out of date.
5148 for (const auto &Sel : SelectorGeneration)
5149 SelectorOutOfDate[Sel.first] = true;
5150
5151 // Setup the import locations and notify the module manager that we've
5152 // committed to these module files.
5153 for (ImportedModule &M : Loaded) {
5154 ModuleFile &F = *M.Mod;
5155
5156 ModuleMgr.moduleFileAccepted(&F);
5157
5158 // Set the import location.
5159 F.DirectImportLoc = ImportLoc;
5160 // FIXME: We assume that locations from PCH / preamble do not need
5161 // any translation.
5162 if (!M.ImportedBy)
5163 F.ImportLoc = M.ImportLoc;
5164 else
5165 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
5166 }
5167
5168 // FIXME: How do we load the 'use'd modules? They may not be submodules.
5169 // Might be unnecessary as use declarations are only used to build the
5170 // module itself.
5171
5172 if (ContextObj)
5174
5175 if (SemaObj)
5176 UpdateSema();
5177
5178 if (DeserializationListener)
5179 DeserializationListener->ReaderInitialized(this);
5180
5181 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5182 if (PrimaryModule.OriginalSourceFileID.isValid()) {
5183 // If this AST file is a precompiled preamble, then set the
5184 // preamble file ID of the source manager to the file source file
5185 // from which the preamble was built.
5186 if (Type == MK_Preamble) {
5187 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
5188 } else if (Type == MK_MainFile) {
5189 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
5190 }
5191 }
5192
5193 // For any Objective-C class definitions we have already loaded, make sure
5194 // that we load any additional categories.
5195 if (ContextObj) {
5196 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5197 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5198 ObjCClassesLoaded[I], PreviousGeneration);
5199 }
5200 }
5201
5202 const HeaderSearchOptions &HSOpts =
5203 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5205 // Now we are certain that the module and all modules it depends on are
5206 // up-to-date. For implicitly-built module files, ensure the corresponding
5207 // timestamp files are up-to-date in this build session.
5208 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5209 ImportedModule &M = Loaded[I];
5210 if (M.Mod->Kind == MK_ImplicitModule &&
5212 getModuleManager().getModuleCache().updateModuleTimestamp(
5213 M.Mod->FileName);
5214 }
5215 }
5216
5217 return Success;
5218}
5219
5220static ASTFileSignature readASTFileSignature(StringRef PCH);
5221
5222/// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
5223static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
5224 // FIXME checking magic headers is done in other places such as
5225 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
5226 // always done the same. Unify it all with a helper.
5227 if (!Stream.canSkipToPos(4))
5228 return llvm::createStringError(
5229 std::errc::illegal_byte_sequence,
5230 "file too small to contain precompiled file magic");
5231 for (unsigned C : {'C', 'P', 'C', 'H'})
5232 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
5233 if (Res.get() != C)
5234 return llvm::createStringError(
5235 std::errc::illegal_byte_sequence,
5236 "file doesn't start with precompiled file magic");
5237 } else
5238 return Res.takeError();
5239 return llvm::Error::success();
5240}
5241
5243 switch (Kind) {
5244 case MK_PCH:
5245 return 0; // PCH
5246 case MK_ImplicitModule:
5247 case MK_ExplicitModule:
5248 case MK_PrebuiltModule:
5249 return 1; // module
5250 case MK_MainFile:
5251 case MK_Preamble:
5252 return 2; // main source file
5253 }
5254 llvm_unreachable("unknown module kind");
5255}
5256
5259 ModuleFile *ImportedBy, SmallVectorImpl<ImportedModule> &Loaded,
5260 off_t ExpectedSize, time_t ExpectedModTime,
5261 ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities) {
5262 auto Result = ModuleMgr.addModule(
5263 FileName, Type, ImportLoc, ImportedBy, getGeneration(), ExpectedSize,
5264 ExpectedModTime, ExpectedSignature, readASTFileSignature);
5265 ModuleFile *M = Result.getModule();
5266
5267 switch (Result.getKind()) {
5269 Diag(diag::remark_module_import)
5270 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5271 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5272 return Success;
5273 }
5274
5276 // Load module file below.
5277 break;
5278
5280 // The module file was missing; if the client can handle that, return
5281 // it.
5282 if (ClientLoadCapabilities & ARR_Missing)
5283 return Missing;
5284
5285 // Otherwise, return an error.
5286 Diag(diag::err_ast_file_not_found)
5288 if (!Result.getBufferError().empty())
5289 Diag(diag::note_ast_file_buffer_failed) << Result.getBufferError();
5290 return Failure;
5291
5293 // We couldn't load the module file because it is out-of-date. If the
5294 // client can handle out-of-date, return it.
5295 if (ClientLoadCapabilities & ARR_OutOfDate)
5296 return OutOfDate;
5297
5298 // Otherwise, return an error.
5299 Diag(diag::err_ast_file_out_of_date)
5301 for (const auto &C : Result.getChanges()) {
5302 Diag(diag::note_fe_ast_file_modified)
5303 << C.Kind << (C.Old && C.New) << llvm::itostr(C.Old.value_or(0))
5304 << llvm::itostr(C.New.value_or(0));
5305 }
5306 Diag(diag::note_ast_file_input_files_validation_status)
5307 << Result.getValidationStatus();
5308 if (!Result.getSignatureError().empty())
5309 Diag(diag::note_ast_file_signature_failed) << Result.getSignatureError();
5310 return Failure;
5311
5313 llvm_unreachable("Unexpected value from adding module.");
5314 }
5315
5316 assert(M && "Missing module file");
5317
5318 bool ShouldFinalizePCM = false;
5319 llvm::scope_exit FinalizeOrDropPCM([&]() {
5320 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5321 if (ShouldFinalizePCM)
5322 MC.finalizePCM(FileName);
5323 else
5324 MC.tryToDropPCM(FileName);
5325 });
5326 ModuleFile &F = *M;
5327 BitstreamCursor &Stream = F.Stream;
5328 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5329 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5330
5331 // Sniff for the signature.
5332 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5333 Diag(diag::err_ast_file_invalid)
5334 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5335 return Failure;
5336 }
5337
5338 // This is used for compatibility with older PCH formats.
5339 bool HaveReadControlBlock = false;
5340 while (true) {
5341 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5342 if (!MaybeEntry) {
5343 Error(MaybeEntry.takeError());
5344 return Failure;
5345 }
5346 llvm::BitstreamEntry Entry = MaybeEntry.get();
5347
5348 switch (Entry.Kind) {
5349 case llvm::BitstreamEntry::Error:
5350 case llvm::BitstreamEntry::Record:
5351 case llvm::BitstreamEntry::EndBlock:
5352 Error("invalid record at top-level of AST file");
5353 return Failure;
5354
5355 case llvm::BitstreamEntry::SubBlock:
5356 break;
5357 }
5358
5359 switch (Entry.ID) {
5360 case CONTROL_BLOCK_ID:
5361 HaveReadControlBlock = true;
5362 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5363 case Success:
5364 // Check that we didn't try to load a non-module AST file as a module.
5365 //
5366 // FIXME: Should we also perform the converse check? Loading a module as
5367 // a PCH file sort of works, but it's a bit wonky.
5369 Type == MK_PrebuiltModule) &&
5370 F.ModuleName.empty()) {
5372 if (Result != OutOfDate ||
5373 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5374 Diag(diag::err_module_file_not_module) << FileName;
5375 return Result;
5376 }
5377 break;
5378
5379 case Failure: return Failure;
5380 case Missing: return Missing;
5381 case OutOfDate: return OutOfDate;
5382 case VersionMismatch: return VersionMismatch;
5384 case HadErrors: return HadErrors;
5385 }
5386 break;
5387
5388 case AST_BLOCK_ID:
5389 if (!HaveReadControlBlock) {
5390 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5391 Diag(diag::err_ast_file_version_too_old)
5393 return VersionMismatch;
5394 }
5395
5396 // Record that we've loaded this module.
5397 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5398 ShouldFinalizePCM = true;
5399 return Success;
5400
5401 default:
5402 if (llvm::Error Err = Stream.SkipBlock()) {
5403 Error(std::move(Err));
5404 return Failure;
5405 }
5406 break;
5407 }
5408 }
5409
5410 llvm_unreachable("unexpected break; expected return");
5411}
5412
5414ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5415 unsigned ClientLoadCapabilities) {
5416 const HeaderSearchOptions &HSOpts =
5417 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5418 bool AllowCompatibleConfigurationMismatch =
5420 bool DisableValidation = shouldDisableValidationForFile(F);
5421
5422 ASTReadResult Result = readUnhashedControlBlockImpl(
5423 &F, F.Data, F.FileName, ClientLoadCapabilities,
5424 AllowCompatibleConfigurationMismatch, Listener.get(),
5425 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5426
5427 // If F was directly imported by another module, it's implicitly validated by
5428 // the importing module.
5429 if (DisableValidation || WasImportedBy ||
5430 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5431 return Success;
5432
5433 if (Result == Failure) {
5434 Error("malformed block record in AST file");
5435 return Failure;
5436 }
5437
5438 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5439 // If this module has already been finalized in the ModuleCache, we're stuck
5440 // with it; we can only load a single version of each module.
5441 //
5442 // This can happen when a module is imported in two contexts: in one, as a
5443 // user module; in another, as a system module (due to an import from
5444 // another module marked with the [system] flag). It usually indicates a
5445 // bug in the module map: this module should also be marked with [system].
5446 //
5447 // If -Wno-system-headers (the default), and the first import is as a
5448 // system module, then validation will fail during the as-user import,
5449 // since -Werror flags won't have been validated. However, it's reasonable
5450 // to treat this consistently as a system module.
5451 //
5452 // If -Wsystem-headers, the PCM on disk was built with
5453 // -Wno-system-headers, and the first import is as a user module, then
5454 // validation will fail during the as-system import since the PCM on disk
5455 // doesn't guarantee that -Werror was respected. However, the -Werror
5456 // flags were checked during the initial as-user import.
5457 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5458 F.FileName)) {
5459 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5460 return Success;
5461 }
5462 }
5463
5464 return Result;
5465}
5466
5467ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5468 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5469 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5470 ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5471 // Initialize a stream.
5472 BitstreamCursor Stream(StreamData);
5473
5474 // Sniff for the signature.
5475 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5476 // FIXME this drops the error on the floor.
5477 consumeError(std::move(Err));
5478 return Failure;
5479 }
5480
5481 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5483 return Failure;
5484
5485 // Read all of the records in the options block.
5486 RecordData Record;
5487 ASTReadResult Result = Success;
5488 while (true) {
5489 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5490 if (!MaybeEntry) {
5491 // FIXME this drops the error on the floor.
5492 consumeError(MaybeEntry.takeError());
5493 return Failure;
5494 }
5495 llvm::BitstreamEntry Entry = MaybeEntry.get();
5496
5497 switch (Entry.Kind) {
5498 case llvm::BitstreamEntry::Error:
5499 case llvm::BitstreamEntry::SubBlock:
5500 return Failure;
5501
5502 case llvm::BitstreamEntry::EndBlock:
5503 return Result;
5504
5505 case llvm::BitstreamEntry::Record:
5506 // The interesting case.
5507 break;
5508 }
5509
5510 // Read and process a record.
5511 Record.clear();
5512 StringRef Blob;
5513 Expected<unsigned> MaybeRecordType =
5514 Stream.readRecord(Entry.ID, Record, &Blob);
5515 if (!MaybeRecordType) {
5516 // FIXME this drops the error.
5517 return Failure;
5518 }
5519 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5520 case SIGNATURE:
5521 if (F) {
5522 F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5524 "Dummy AST file signature not backpatched in ASTWriter.");
5525 }
5526 break;
5527 case AST_BLOCK_HASH:
5528 if (F) {
5529 F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5531 "Dummy AST block hash not backpatched in ASTWriter.");
5532 }
5533 break;
5534 case DIAGNOSTIC_OPTIONS: {
5535 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5536 if (Listener && ValidateDiagnosticOptions &&
5537 !AllowCompatibleConfigurationMismatch &&
5538 ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5539 Result = OutOfDate; // Don't return early. Read the signature.
5540 break;
5541 }
5542 case HEADER_SEARCH_PATHS: {
5543 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5544 if (Listener && !AllowCompatibleConfigurationMismatch &&
5545 ParseHeaderSearchPaths(Record, Complain, *Listener))
5546 Result = ConfigurationMismatch;
5547 break;
5548 }
5550 if (!F)
5551 break;
5552 if (F->PragmaDiagMappings.empty())
5553 F->PragmaDiagMappings.swap(Record);
5554 else
5555 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5556 Record.begin(), Record.end());
5557 break;
5559 if (F)
5560 F->SearchPathUsage = ReadBitVector(Record, Blob);
5561 break;
5562 case VFS_USAGE:
5563 if (F)
5564 F->VFSUsage = ReadBitVector(Record, Blob);
5565 break;
5566 }
5567 }
5568}
5569
5570/// Parse a record and blob containing module file extension metadata.
5573 StringRef Blob,
5574 ModuleFileExtensionMetadata &Metadata) {
5575 if (Record.size() < 4) return true;
5576
5577 Metadata.MajorVersion = Record[0];
5578 Metadata.MinorVersion = Record[1];
5579
5580 unsigned BlockNameLen = Record[2];
5581 unsigned UserInfoLen = Record[3];
5582
5583 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5584
5585 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5586 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5587 Blob.data() + BlockNameLen + UserInfoLen);
5588 return false;
5589}
5590
5591llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5592 BitstreamCursor &Stream = F.Stream;
5593
5594 RecordData Record;
5595 while (true) {
5596 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5597 if (!MaybeEntry)
5598 return MaybeEntry.takeError();
5599 llvm::BitstreamEntry Entry = MaybeEntry.get();
5600
5601 switch (Entry.Kind) {
5602 case llvm::BitstreamEntry::SubBlock:
5603 if (llvm::Error Err = Stream.SkipBlock())
5604 return Err;
5605 continue;
5606 case llvm::BitstreamEntry::EndBlock:
5607 return llvm::Error::success();
5608 case llvm::BitstreamEntry::Error:
5609 return llvm::createStringError(std::errc::illegal_byte_sequence,
5610 "malformed block record in AST file");
5611 case llvm::BitstreamEntry::Record:
5612 break;
5613 }
5614
5615 Record.clear();
5616 StringRef Blob;
5617 Expected<unsigned> MaybeRecCode =
5618 Stream.readRecord(Entry.ID, Record, &Blob);
5619 if (!MaybeRecCode)
5620 return MaybeRecCode.takeError();
5621 switch (MaybeRecCode.get()) {
5622 case EXTENSION_METADATA: {
5623 ModuleFileExtensionMetadata Metadata;
5624 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5625 return llvm::createStringError(
5626 std::errc::illegal_byte_sequence,
5627 "malformed EXTENSION_METADATA in AST file");
5628
5629 // Find a module file extension with this block name.
5630 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5631 if (Known == ModuleFileExtensions.end()) break;
5632
5633 // Form a reader.
5634 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5635 F, Stream)) {
5636 F.ExtensionReaders.push_back(std::move(Reader));
5637 }
5638
5639 break;
5640 }
5641 }
5642 }
5643
5644 llvm_unreachable("ReadExtensionBlock should return from while loop");
5645}
5646
5648 assert(ContextObj && "no context to initialize");
5649 ASTContext &Context = *ContextObj;
5650
5651 // If there's a listener, notify them that we "read" the translation unit.
5652 if (DeserializationListener)
5653 DeserializationListener->DeclRead(
5655 Context.getTranslationUnitDecl());
5656
5657 // FIXME: Find a better way to deal with collisions between these
5658 // built-in types. Right now, we just ignore the problem.
5659
5660 // Load the special types.
5661 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5662 if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5663 if (!Context.CFConstantStringTypeDecl)
5664 Context.setCFConstantStringType(GetType(String));
5665 }
5666
5667 if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5668 QualType FileType = GetType(File);
5669 if (FileType.isNull()) {
5670 Error("FILE type is NULL");
5671 return;
5672 }
5673
5674 if (!Context.FILEDecl) {
5675 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5676 Context.setFILEDecl(Typedef->getDecl());
5677 else {
5678 const TagType *Tag = FileType->getAs<TagType>();
5679 if (!Tag) {
5680 Error("Invalid FILE type in AST file");
5681 return;
5682 }
5683 Context.setFILEDecl(Tag->getDecl());
5684 }
5685 }
5686 }
5687
5688 if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5689 QualType Jmp_bufType = GetType(Jmp_buf);
5690 if (Jmp_bufType.isNull()) {
5691 Error("jmp_buf type is NULL");
5692 return;
5693 }
5694
5695 if (!Context.jmp_bufDecl) {
5696 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5697 Context.setjmp_bufDecl(Typedef->getDecl());
5698 else {
5699 const TagType *Tag = Jmp_bufType->getAs<TagType>();
5700 if (!Tag) {
5701 Error("Invalid jmp_buf type in AST file");
5702 return;
5703 }
5704 Context.setjmp_bufDecl(Tag->getDecl());
5705 }
5706 }
5707 }
5708
5709 if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5710 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5711 if (Sigjmp_bufType.isNull()) {
5712 Error("sigjmp_buf type is NULL");
5713 return;
5714 }
5715
5716 if (!Context.sigjmp_bufDecl) {
5717 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5718 Context.setsigjmp_bufDecl(Typedef->getDecl());
5719 else {
5720 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5721 assert(Tag && "Invalid sigjmp_buf type in AST file");
5722 Context.setsigjmp_bufDecl(Tag->getDecl());
5723 }
5724 }
5725 }
5726
5727 if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5728 if (Context.ObjCIdRedefinitionType.isNull())
5729 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5730 }
5731
5732 if (TypeID ObjCClassRedef =
5734 if (Context.ObjCClassRedefinitionType.isNull())
5735 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5736 }
5737
5738 if (TypeID ObjCSelRedef =
5739 SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5740 if (Context.ObjCSelRedefinitionType.isNull())
5741 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5742 }
5743
5744 if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5745 QualType Ucontext_tType = GetType(Ucontext_t);
5746 if (Ucontext_tType.isNull()) {
5747 Error("ucontext_t type is NULL");
5748 return;
5749 }
5750
5751 if (!Context.ucontext_tDecl) {
5752 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5753 Context.setucontext_tDecl(Typedef->getDecl());
5754 else {
5755 const TagType *Tag = Ucontext_tType->getAs<TagType>();
5756 assert(Tag && "Invalid ucontext_t type in AST file");
5757 Context.setucontext_tDecl(Tag->getDecl());
5758 }
5759 }
5760 }
5761 }
5762
5763 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5764
5765 // If there were any CUDA special declarations, deserialize them.
5766 if (!CUDASpecialDeclRefs.empty()) {
5767 assert(CUDASpecialDeclRefs.size() == 3 && "More decl refs than expected!");
5768 Context.setcudaConfigureCallDecl(
5769 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5770 Context.setcudaGetParameterBufferDecl(
5771 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[1])));
5772 Context.setcudaLaunchDeviceDecl(
5773 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[2])));
5774 }
5775
5776 // Re-export any modules that were imported by a non-module AST file.
5777 // FIXME: This does not make macro-only imports visible again.
5778 for (auto &Import : PendingImportedModules) {
5779 if (Module *Imported = getSubmodule(Import.ID)) {
5781 /*ImportLoc=*/Import.ImportLoc);
5782 if (Import.ImportLoc.isValid())
5783 PP.makeModuleVisible(Imported, Import.ImportLoc);
5784 // This updates visibility for Preprocessor only. For Sema, which can be
5785 // nullptr here, we do the same later, in UpdateSema().
5786 }
5787 }
5788
5789 // Hand off these modules to Sema.
5790 PendingImportedModulesSema.append(PendingImportedModules);
5791 PendingImportedModules.clear();
5792}
5793
5795 // Nothing to do for now.
5796}
5797
5798/// Reads and return the signature record from \p PCH's control block, or
5799/// else returns 0.
5801 BitstreamCursor Stream(PCH);
5802 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5803 // FIXME this drops the error on the floor.
5804 consumeError(std::move(Err));
5805 return ASTFileSignature();
5806 }
5807
5808 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5810 return ASTFileSignature();
5811
5812 // Scan for SIGNATURE inside the diagnostic options block.
5814 while (true) {
5816 Stream.advanceSkippingSubblocks();
5817 if (!MaybeEntry) {
5818 // FIXME this drops the error on the floor.
5819 consumeError(MaybeEntry.takeError());
5820 return ASTFileSignature();
5821 }
5822 llvm::BitstreamEntry Entry = MaybeEntry.get();
5823
5824 if (Entry.Kind != llvm::BitstreamEntry::Record)
5825 return ASTFileSignature();
5826
5827 Record.clear();
5828 StringRef Blob;
5829 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5830 if (!MaybeRecord) {
5831 // FIXME this drops the error on the floor.
5832 consumeError(MaybeRecord.takeError());
5833 return ASTFileSignature();
5834 }
5835 if (SIGNATURE == MaybeRecord.get()) {
5836 auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5837 assert(Signature != ASTFileSignature::createDummy() &&
5838 "Dummy AST file signature not backpatched in ASTWriter.");
5839 return Signature;
5840 }
5841 }
5842}
5843
5844/// Retrieve the name of the original source file name
5845/// directly from the AST file, without actually loading the AST
5846/// file.
5848 const std::string &ASTFileName, FileManager &FileMgr,
5849 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5850 // Open the AST file.
5851 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5852 /*RequiresNullTerminator=*/false,
5853 /*MaybeLimit=*/std::nullopt,
5854 /*IsText=*/false);
5855 if (!Buffer) {
5856 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5857 << ASTFileName << Buffer.getError().message();
5858 return std::string();
5859 }
5860
5861 // Initialize the stream
5862 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5863
5864 // Sniff for the signature.
5865 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5866 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5867 return std::string();
5868 }
5869
5870 // Scan for the CONTROL_BLOCK_ID block.
5871 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5872 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5873 return std::string();
5874 }
5875
5876 // Scan for ORIGINAL_FILE inside the control block.
5878 while (true) {
5880 Stream.advanceSkippingSubblocks();
5881 if (!MaybeEntry) {
5882 // FIXME this drops errors on the floor.
5883 consumeError(MaybeEntry.takeError());
5884 return std::string();
5885 }
5886 llvm::BitstreamEntry Entry = MaybeEntry.get();
5887
5888 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5889 return std::string();
5890
5891 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5892 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5893 return std::string();
5894 }
5895
5896 Record.clear();
5897 StringRef Blob;
5898 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5899 if (!MaybeRecord) {
5900 // FIXME this drops the errors on the floor.
5901 consumeError(MaybeRecord.takeError());
5902 return std::string();
5903 }
5904 if (ORIGINAL_FILE == MaybeRecord.get())
5905 return Blob.str();
5906 }
5907}
5908
5909namespace {
5910
5911 class SimplePCHValidator : public ASTReaderListener {
5912 const LangOptions &ExistingLangOpts;
5913 const CodeGenOptions &ExistingCGOpts;
5914 const TargetOptions &ExistingTargetOpts;
5915 const PreprocessorOptions &ExistingPPOpts;
5916 const HeaderSearchOptions &ExistingHSOpts;
5917 std::string ExistingSpecificModuleCachePath;
5919 bool StrictOptionMatches;
5920
5921 public:
5922 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5923 const CodeGenOptions &ExistingCGOpts,
5924 const TargetOptions &ExistingTargetOpts,
5925 const PreprocessorOptions &ExistingPPOpts,
5926 const HeaderSearchOptions &ExistingHSOpts,
5927 StringRef ExistingSpecificModuleCachePath,
5928 FileManager &FileMgr, bool StrictOptionMatches)
5929 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5930 ExistingTargetOpts(ExistingTargetOpts),
5931 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5932 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5933 FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {}
5934
5935 bool ReadLanguageOptions(const LangOptions &LangOpts,
5936 StringRef ModuleFilename, bool Complain,
5937 bool AllowCompatibleDifferences) override {
5938 return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
5939 nullptr, AllowCompatibleDifferences);
5940 }
5941
5942 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
5943 StringRef ModuleFilename, bool Complain,
5944 bool AllowCompatibleDifferences) override {
5945 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
5946 nullptr, AllowCompatibleDifferences);
5947 }
5948
5949 bool ReadTargetOptions(const TargetOptions &TargetOpts,
5950 StringRef ModuleFilename, bool Complain,
5951 bool AllowCompatibleDifferences) override {
5952 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
5953 nullptr, AllowCompatibleDifferences);
5954 }
5955
5956 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5957 StringRef ASTFilename, StringRef ContextHash,
5958 bool Complain) override {
5959 return checkModuleCachePath(
5960 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5961 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5962 }
5963
5964 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5965 StringRef ModuleFilename, bool ReadMacros,
5966 bool Complain,
5967 std::string &SuggestedPredefines) override {
5969 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
5970 FileMgr, SuggestedPredefines, ExistingLangOpts,
5971 StrictOptionMatches ? OptionValidateStrictMatches
5973 }
5974 };
5975
5976} // namespace
5977
5979 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
5980 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5981 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5982 unsigned ClientLoadCapabilities) {
5983 // Open the AST file.
5984 off_t Size;
5985 time_t ModTime;
5986 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5987 llvm::MemoryBuffer *Buffer =
5988 ModCache.getInMemoryModuleCache().lookupPCM(Filename, Size, ModTime);
5989 if (!Buffer) {
5990 // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5991 // read again later, but we do not have the context here to determine if it
5992 // is safe to change the result of InMemoryModuleCache::getPCMState().
5993
5994 // FIXME: This allows use of the VFS; we do not allow use of the
5995 // VFS when actually loading a module.
5996 auto Entry = Filename == "-" ? FileMgr.getSTDIN()
5997 : FileMgr.getFileRef(Filename,
5998 /*OpenFile=*/false,
5999 /*CacheFailure=*/true,
6000 /*IsText=*/false);
6001 if (!Entry) {
6002 llvm::consumeError(Entry.takeError());
6003 return true;
6004 }
6005 auto BufferOrErr =
6006 FileMgr.getBufferForFile(*Entry,
6007 /*IsVolatile=*/false,
6008 /*RequiresNullTerminator=*/false,
6009 /*MaybeLimit=*/std::nullopt,
6010 /*IsText=*/false);
6011 if (!BufferOrErr)
6012 return true;
6013 OwnedBuffer = std::move(*BufferOrErr);
6014 Buffer = OwnedBuffer.get();
6015 }
6016
6017 // Initialize the stream
6018 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6019 BitstreamCursor Stream(Bytes);
6020
6021 // Sniff for the signature.
6022 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
6023 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
6024 return true;
6025 }
6026
6027 // Scan for the CONTROL_BLOCK_ID block.
6029 return true;
6030
6031 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6032 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6033 bool NeedsImports = Listener.needsImportVisitation();
6034 BitstreamCursor InputFilesCursor;
6035 uint64_t InputFilesOffsetBase = 0;
6036
6038 std::string ModuleDir;
6039 bool DoneWithControlBlock = false;
6040 SmallString<0> PathBuf;
6041 PathBuf.reserve(256);
6042 // Additional path buffer to use when multiple paths need to be resolved.
6043 // For example, when deserializing input files that contains a path that was
6044 // resolved from a vfs overlay and an external location.
6045 SmallString<0> AdditionalPathBuf;
6046 AdditionalPathBuf.reserve(256);
6047 while (!DoneWithControlBlock) {
6048 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6049 if (!MaybeEntry) {
6050 // FIXME this drops the error on the floor.
6051 consumeError(MaybeEntry.takeError());
6052 return true;
6053 }
6054 llvm::BitstreamEntry Entry = MaybeEntry.get();
6055
6056 switch (Entry.Kind) {
6057 case llvm::BitstreamEntry::SubBlock: {
6058 switch (Entry.ID) {
6059 case OPTIONS_BLOCK_ID: {
6060 std::string IgnoredSuggestedPredefines;
6061 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6062 /*AllowCompatibleConfigurationMismatch*/ false,
6063 Listener, IgnoredSuggestedPredefines) != Success)
6064 return true;
6065 break;
6066 }
6067
6069 InputFilesCursor = Stream;
6070 if (llvm::Error Err = Stream.SkipBlock()) {
6071 // FIXME this drops the error on the floor.
6072 consumeError(std::move(Err));
6073 return true;
6074 }
6075 if (NeedsInputFiles &&
6076 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
6077 return true;
6078 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6079 break;
6080
6081 default:
6082 if (llvm::Error Err = Stream.SkipBlock()) {
6083 // FIXME this drops the error on the floor.
6084 consumeError(std::move(Err));
6085 return true;
6086 }
6087 break;
6088 }
6089
6090 continue;
6091 }
6092
6093 case llvm::BitstreamEntry::EndBlock:
6094 DoneWithControlBlock = true;
6095 break;
6096
6097 case llvm::BitstreamEntry::Error:
6098 return true;
6099
6100 case llvm::BitstreamEntry::Record:
6101 break;
6102 }
6103
6104 if (DoneWithControlBlock) break;
6105
6106 Record.clear();
6107 StringRef Blob;
6108 Expected<unsigned> MaybeRecCode =
6109 Stream.readRecord(Entry.ID, Record, &Blob);
6110 if (!MaybeRecCode) {
6111 // FIXME this drops the error.
6112 return Failure;
6113 }
6114 switch ((ControlRecordTypes)MaybeRecCode.get()) {
6115 case METADATA:
6116 if (Record[0] != VERSION_MAJOR)
6117 return true;
6118 if (Listener.ReadFullVersionInformation(Blob))
6119 return true;
6120 break;
6121 case MODULE_NAME:
6122 Listener.ReadModuleName(Blob);
6123 break;
6124 case MODULE_DIRECTORY:
6125 ModuleDir = std::string(Blob);
6126 break;
6127 case MODULE_MAP_FILE: {
6128 unsigned Idx = 0;
6129 std::string PathStr = ReadString(Record, Idx);
6130 auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
6131 Listener.ReadModuleMapFile(*Path);
6132 break;
6133 }
6134 case INPUT_FILE_OFFSETS: {
6135 if (!NeedsInputFiles)
6136 break;
6137
6138 unsigned NumInputFiles = Record[0];
6139 unsigned NumUserFiles = Record[1];
6140 const llvm::support::unaligned_uint64_t *InputFileOffs =
6141 (const llvm::support::unaligned_uint64_t *)Blob.data();
6142 for (unsigned I = 0; I != NumInputFiles; ++I) {
6143 // Go find this input file.
6144 bool isSystemFile = I >= NumUserFiles;
6145
6146 if (isSystemFile && !NeedsSystemInputFiles)
6147 break; // the rest are system input files
6148
6149 BitstreamCursor &Cursor = InputFilesCursor;
6150 SavedStreamPosition SavedPosition(Cursor);
6151 if (llvm::Error Err =
6152 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6153 // FIXME this drops errors on the floor.
6154 consumeError(std::move(Err));
6155 }
6156
6157 Expected<unsigned> MaybeCode = Cursor.ReadCode();
6158 if (!MaybeCode) {
6159 // FIXME this drops errors on the floor.
6160 consumeError(MaybeCode.takeError());
6161 }
6162 unsigned Code = MaybeCode.get();
6163
6165 StringRef Blob;
6166 bool shouldContinue = false;
6167 Expected<unsigned> MaybeRecordType =
6168 Cursor.readRecord(Code, Record, &Blob);
6169 if (!MaybeRecordType) {
6170 // FIXME this drops errors on the floor.
6171 consumeError(MaybeRecordType.takeError());
6172 }
6173 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
6174 case INPUT_FILE_HASH:
6175 break;
6176 case INPUT_FILE:
6177 time_t StoredTime = static_cast<time_t>(Record[2]);
6178 bool Overridden = static_cast<bool>(Record[3]);
6179 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6181 auto FilenameAsRequestedBuf = ResolveImportedPath(
6182 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6183 StringRef Filename;
6184 if (UnresolvedFilename.empty())
6185 Filename = *FilenameAsRequestedBuf;
6186 else {
6187 auto FilenameBuf = ResolveImportedPath(
6188 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6189 Filename = *FilenameBuf;
6190 }
6191 shouldContinue = Listener.visitInputFileAsRequested(
6192 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6193 StoredTime, /*IsExplicitModule=*/false);
6194 break;
6195 }
6196 if (!shouldContinue)
6197 break;
6198 }
6199 break;
6200 }
6201
6202 case IMPORT: {
6203 if (!NeedsImports)
6204 break;
6205
6206 unsigned Idx = 0;
6207 // Read information about the AST file.
6208
6209 // Skip Kind
6210 Idx++;
6211
6212 // Skip ImportLoc
6213 Idx++;
6214
6215 StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
6216
6217 bool IsStandardCXXModule = Record[Idx++];
6218
6219 // In C++20 Modules, we don't record the path to imported
6220 // modules in the BMI files.
6221 if (IsStandardCXXModule) {
6222 Listener.visitImport(ModuleName, /*Filename=*/"");
6223 continue;
6224 }
6225
6226 // Skip Size, ModTime and ImplicitModuleSuffix.
6227 Idx += 1 + 1 + 1;
6228 // Skip signature.
6229 Blob = Blob.substr(ASTFileSignature::size);
6230
6231 StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
6232 auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
6233 Listener.visitImport(ModuleName, *Filename);
6234 break;
6235 }
6236
6237 default:
6238 // No other validation to perform.
6239 break;
6240 }
6241 }
6242
6243 // Look for module file extension blocks, if requested.
6244 if (FindModuleFileExtensions) {
6245 BitstreamCursor SavedStream = Stream;
6246 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
6247 bool DoneWithExtensionBlock = false;
6248 while (!DoneWithExtensionBlock) {
6249 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6250 if (!MaybeEntry) {
6251 // FIXME this drops the error.
6252 return true;
6253 }
6254 llvm::BitstreamEntry Entry = MaybeEntry.get();
6255
6256 switch (Entry.Kind) {
6257 case llvm::BitstreamEntry::SubBlock:
6258 if (llvm::Error Err = Stream.SkipBlock()) {
6259 // FIXME this drops the error on the floor.
6260 consumeError(std::move(Err));
6261 return true;
6262 }
6263 continue;
6264
6265 case llvm::BitstreamEntry::EndBlock:
6266 DoneWithExtensionBlock = true;
6267 continue;
6268
6269 case llvm::BitstreamEntry::Error:
6270 return true;
6271
6272 case llvm::BitstreamEntry::Record:
6273 break;
6274 }
6275
6276 Record.clear();
6277 StringRef Blob;
6278 Expected<unsigned> MaybeRecCode =
6279 Stream.readRecord(Entry.ID, Record, &Blob);
6280 if (!MaybeRecCode) {
6281 // FIXME this drops the error.
6282 return true;
6283 }
6284 switch (MaybeRecCode.get()) {
6285 case EXTENSION_METADATA: {
6287 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
6288 return true;
6289
6290 Listener.readModuleFileExtension(Metadata);
6291 break;
6292 }
6293 }
6294 }
6295 }
6296 Stream = std::move(SavedStream);
6297 }
6298
6299 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6300 if (readUnhashedControlBlockImpl(
6301 nullptr, Bytes, Filename, ClientLoadCapabilities,
6302 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6303 ValidateDiagnosticOptions) != Success)
6304 return true;
6305
6306 return false;
6307}
6308
6310 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6311 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6312 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
6313 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
6314 StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches) {
6315 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6316 SpecificModuleCachePath, FileMgr,
6317 RequireStrictOptionMatches);
6318 return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6319 /*FindModuleFileExtensions=*/false, validator,
6320 /*ValidateDiagnosticOptions=*/true);
6321}
6322
6323Module *ASTReader::getSubmodule(uint32_t GlobalID) {
6324 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6325 assert(GlobalID == 0 && "Unhandled global submodule ID");
6326 return nullptr;
6327 }
6328
6329 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6330 if (GlobalIndex >= SubmodulesLoaded.size()) {
6331 Error("submodule ID out of range in AST file");
6332 return nullptr;
6333 }
6334
6335 if (SubmodulesLoaded[GlobalIndex])
6336 return SubmodulesLoaded[GlobalIndex];
6337
6338 GlobalSubmoduleMapType::iterator It = GlobalSubmoduleMap.find(GlobalID);
6339 assert(It != GlobalSubmoduleMap.end());
6340 ModuleFile &F = *It->second;
6341 unsigned Index = GlobalID - F.BaseSubmoduleID - NUM_PREDEF_SUBMODULE_IDS;
6342 [[maybe_unused]] unsigned LocalID =
6344
6345 BitstreamCursor &Cursor = F.SubmodulesCursor;
6346 SavedStreamPosition SavedPosition(Cursor);
6347 unsigned Offset = F.SubmoduleOffsets[Index];
6348 if (llvm::Error Err = Cursor.JumpToBit(F.SubmodulesOffsetBase + Offset)) {
6349 Error(std::move(Err));
6350 return nullptr;
6351 }
6352
6353 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6354 bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6355 // If we don't know the top-level module, there's no point in doing qualified
6356 // lookup of its submodules; it won't find anything anywhere within this tree.
6357 // Let's skip that and avoid some string lookups.
6358 auto CreateModule = !KnowsTopLevelModule
6361
6362 Module *CurrentModule = nullptr;
6364 while (true) {
6365 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
6366 if (!MaybeEntry) {
6367 Error(MaybeEntry.takeError());
6368 return nullptr;
6369 }
6370 llvm::BitstreamEntry Entry = MaybeEntry.get();
6371
6372 switch (Entry.Kind) {
6373 case llvm::BitstreamEntry::SubBlock:
6374 case llvm::BitstreamEntry::Error:
6375 case llvm::BitstreamEntry::EndBlock: {
6376 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6377 "malformed block record in AST file"));
6378 return nullptr;
6379 }
6380 case llvm::BitstreamEntry::Record:
6381 // The interesting case.
6382 break;
6383 }
6384
6385 // Read a record.
6386 StringRef Blob;
6387 Record.clear();
6388 Expected<unsigned> MaybeKind = Cursor.readRecord(Entry.ID, Record, &Blob);
6389 if (!MaybeKind) {
6390 Error(MaybeKind.takeError());
6391 return nullptr;
6392 }
6393 auto Kind = static_cast<SubmoduleRecordTypes>(MaybeKind.get());
6394
6395 switch (Kind) {
6396 case SUBMODULE_END:
6397 if (!CurrentModule) {
6398 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6399 "malformed module definition"));
6400 return nullptr;
6401 }
6402 return CurrentModule;
6403
6404 case SUBMODULE_DEFINITION: {
6405 if (Record.size() < 13) {
6406 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6407 "malformed module definition"));
6408 return nullptr;
6409 }
6410
6411 StringRef Name = Blob;
6412 unsigned Idx = 0;
6413 [[maybe_unused]] unsigned ReadLocalID = Record[Idx++];
6414 assert(LocalID == ReadLocalID);
6415 assert(GlobalID == getGlobalSubmoduleID(F, ReadLocalID));
6416 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6418 SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6419 FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6420 bool IsFramework = Record[Idx++];
6421 bool IsExplicit = Record[Idx++];
6422 bool IsSystem = Record[Idx++];
6423 bool IsExternC = Record[Idx++];
6424 bool InferSubmodules = Record[Idx++];
6425 bool InferExplicitSubmodules = Record[Idx++];
6426 bool InferExportWildcard = Record[Idx++];
6427 bool ConfigMacrosExhaustive = Record[Idx++];
6428 bool ModuleMapIsPrivate = Record[Idx++];
6429 bool NamedModuleHasInit = Record[Idx++];
6430
6431 Module *ParentModule = nullptr;
6432 if (Parent) {
6433 ParentModule = getSubmodule(Parent);
6434 if (!ParentModule)
6435 return nullptr;
6436 }
6437
6438 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6439 IsFramework, IsExplicit);
6440
6441 if (!ParentModule) {
6442 if ([[maybe_unused]] const ModuleFileKey *CurFileKey =
6443 CurrentModule->getASTFileKey()) {
6444 // Don't emit module relocation error if we have -fno-validate-pch
6445 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6447 assert(*CurFileKey != F.FileKey &&
6448 "ModuleManager did not de-duplicate");
6449
6450 Diag(diag::err_module_file_conflict)
6451 << CurrentModule->getTopLevelModuleName()
6452 << *CurrentModule->getASTFileName() << F.FileName;
6453
6454 auto CurModMapFile =
6455 ModMap.getContainingModuleMapFile(CurrentModule);
6456 auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6457 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6458 Diag(diag::note_module_file_conflict)
6459 << CurModMapFile->getName() << ModMapFile->getName();
6460
6461 return nullptr;
6462 }
6463 }
6464
6465 F.DidReadTopLevelSubmodule = true;
6466 CurrentModule->setASTFileNameAndKey(F.FileName, F.FileKey);
6467 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6468 }
6469
6470 CurrentModule->Kind = Kind;
6471 // Note that we may be rewriting an existing location and it is important
6472 // to keep doing that. In particular, we would like to prefer a
6473 // `DefinitionLoc` loaded from the module file instead of the location
6474 // created in the current source manager, because it allows the new
6475 // location to be marked as "unaffecting" when writing and avoid creating
6476 // duplicate locations for the same module map file.
6477 CurrentModule->DefinitionLoc = DefinitionLoc;
6478 CurrentModule->Signature = F.Signature;
6479 CurrentModule->IsFromModuleFile = true;
6480 if (InferredAllowedBy.isValid())
6481 ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6482 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6483 CurrentModule->IsExternC = IsExternC;
6484 CurrentModule->InferSubmodules = InferSubmodules;
6485 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6486 CurrentModule->InferExportWildcard = InferExportWildcard;
6487 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6488 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6489 CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6490
6491 if (!ParentModule && !F.BaseDirectory.empty()) {
6492 if (auto Dir = FileMgr.getOptionalDirectoryRef(F.BaseDirectory))
6493 CurrentModule->Directory = *Dir;
6494 } else if (ParentModule && ParentModule->Directory) {
6495 // Submodules inherit the directory from their parent.
6496 CurrentModule->Directory = ParentModule->Directory;
6497 }
6498
6499 if (DeserializationListener)
6500 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6501
6502 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6503
6504 // Clear out data that will be replaced by what is in the module file.
6505 CurrentModule->LinkLibraries.clear();
6506 CurrentModule->ConfigMacros.clear();
6507 CurrentModule->UnresolvedConflicts.clear();
6508 CurrentModule->Conflicts.clear();
6509
6510 // The module is available unless it's missing a requirement; relevant
6511 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6512 // Missing headers that were present when the module was built do not
6513 // make it unavailable -- if we got this far, this must be an explicitly
6514 // imported module file.
6515 CurrentModule->Requirements.clear();
6516 CurrentModule->MissingHeaders.clear();
6517 CurrentModule->IsUnimportable =
6518 ParentModule && ParentModule->IsUnimportable;
6519 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6520 break;
6521 }
6522
6524 SmallString<128> RelativePathName;
6525 if (auto Umbrella = ModMap.findUmbrellaHeaderForModule(
6526 CurrentModule, Blob.str(), RelativePathName)) {
6527 if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6528 ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob,
6529 RelativePathName);
6530 }
6531 // Note that it's too late at this point to return out of date if the
6532 // name from the PCM doesn't match up with the one in the module map,
6533 // but also quite unlikely since we will have already checked the
6534 // modification time and size of the module map file itself.
6535 }
6536 break;
6537 }
6538
6539 case SUBMODULE_HEADER:
6542 // We lazily associate headers with their modules via the HeaderInfo table.
6543 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6544 // of complete filenames or remove it entirely.
6545 break;
6546
6549 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6550 // them here.
6551 break;
6552
6553 case SUBMODULE_TOPHEADER: {
6554 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6555 CurrentModule->addTopHeaderFilename(*HeaderName);
6556 break;
6557 }
6558
6560 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6561 if (auto Umbrella =
6562 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6563 if (!CurrentModule->getUmbrellaDirAsWritten()) {
6564 // FIXME: NameAsWritten
6565 ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6566 }
6567 }
6568 break;
6569 }
6570
6571 case SUBMODULE_IMPORTS:
6572 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6573 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6574 CurrentModule->Imports.push_back(ModuleRef(this, GlobalID));
6575 }
6576 break;
6577
6579 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6580 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6581 CurrentModule->AffectingClangModules.push_back(
6582 ModuleRef(this, GlobalID));
6583 }
6584 break;
6585
6586 case SUBMODULE_EXPORTS:
6587 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6588 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6589 bool IsWildcard = Record[Idx + 1];
6590 ModuleRef ExportedMod =
6591 GlobalID ? ModuleRef(this, GlobalID) : ModuleRef();
6592 if (ExportedMod || IsWildcard)
6593 CurrentModule->Exports.push_back({ExportedMod, IsWildcard});
6594 }
6595
6596 // Once we've loaded the set of exports, there's no reason to keep
6597 // the parsed, unresolved exports around.
6598 CurrentModule->UnresolvedExports.clear();
6599 break;
6600
6601 case SUBMODULE_REQUIRES:
6602 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6603 PP.getTargetInfo());
6604 break;
6605
6607 ModMap.resolveLinkAsDependencies(CurrentModule);
6608 CurrentModule->LinkLibraries.push_back(
6609 Module::LinkLibrary(std::string(Blob), Record[0]));
6610 break;
6611
6613 CurrentModule->ConfigMacros.push_back(Blob.str());
6614 break;
6615
6616 case SUBMODULE_CONFLICT: {
6617 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6618 Module::Conflict Conflict;
6619 Conflict.Other = ModuleRef(this, GlobalID);
6620 Conflict.Message = Blob.str();
6621 CurrentModule->Conflicts.push_back(Conflict);
6622 break;
6623 }
6624
6626 if (!ContextObj)
6627 break;
6628 // Standard C++ module has its own way to initialize variables.
6629 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
6631 for (unsigned I = 0; I < Record.size(); /*in loop*/)
6632 Inits.push_back(ReadDeclID(F, Record, I));
6633 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6634 }
6635 break;
6636 }
6637
6639 CurrentModule->ExportAsModule = Blob.str();
6640 ModMap.addLinkAsDependency(CurrentModule);
6641 break;
6642
6643 case SUBMODULE_CHILD: {
6644 // Record a not-yet-loaded direct child for on-demand deserialization.
6645 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6646 CurrentModule->addSubmodule(Blob, this, GlobalID);
6647 break;
6648 }
6649 }
6650 }
6651}
6652
6653/// Parse the record that corresponds to a LangOptions data
6654/// structure.
6655///
6656/// This routine parses the language options from the AST file and then gives
6657/// them to the AST listener if one is set.
6658///
6659/// \returns true if the listener deems the file unacceptable, false otherwise.
6660bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6661 StringRef ModuleFilename, bool Complain,
6662 ASTReaderListener &Listener,
6663 bool AllowCompatibleDifferences) {
6664 LangOptions LangOpts;
6665 unsigned Idx = 0;
6666#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6667 LangOpts.Name = Record[Idx++];
6668#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6669 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6670#include "clang/Basic/LangOptions.def"
6671#define SANITIZER(NAME, ID) \
6672 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6673#include "clang/Basic/Sanitizers.def"
6674
6675 for (unsigned N = Record[Idx++]; N; --N)
6676 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6677
6678 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6679 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6680 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6681
6682 LangOpts.CurrentModule = ReadString(Record, Idx);
6683
6684 // Comment options.
6685 for (unsigned N = Record[Idx++]; N; --N) {
6686 LangOpts.CommentOpts.BlockCommandNames.push_back(
6687 ReadString(Record, Idx));
6688 }
6689 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6690
6691 // OpenMP offloading options.
6692 for (unsigned N = Record[Idx++]; N; --N) {
6693 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6694 }
6695
6696 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6697
6698 return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6699 AllowCompatibleDifferences);
6700}
6701
6702bool ASTReader::ParseCodeGenOptions(const RecordData &Record,
6703 StringRef ModuleFilename, bool Complain,
6704 ASTReaderListener &Listener,
6705 bool AllowCompatibleDifferences) {
6706 unsigned Idx = 0;
6707 CodeGenOptions CGOpts;
6709#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6710 if constexpr (CK::Compatibility != CK::Benign) \
6711 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6712#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6713 if constexpr (CK::Compatibility != CK::Benign) \
6714 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6715#define DEBUGOPT(Name, Bits, Default, Compatibility)
6716#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6717#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6718#include "clang/Basic/CodeGenOptions.def"
6719
6720 return Listener.ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
6721 AllowCompatibleDifferences);
6722}
6723
6724bool ASTReader::ParseTargetOptions(const RecordData &Record,
6725 StringRef ModuleFilename, bool Complain,
6726 ASTReaderListener &Listener,
6727 bool AllowCompatibleDifferences) {
6728 unsigned Idx = 0;
6729 TargetOptions TargetOpts;
6730 TargetOpts.Triple = ReadString(Record, Idx);
6731 TargetOpts.CPU = ReadString(Record, Idx);
6732 TargetOpts.TuneCPU = ReadString(Record, Idx);
6733 TargetOpts.ABI = ReadString(Record, Idx);
6734 for (unsigned N = Record[Idx++]; N; --N) {
6735 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6736 }
6737 for (unsigned N = Record[Idx++]; N; --N) {
6738 TargetOpts.Features.push_back(ReadString(Record, Idx));
6739 }
6740
6741 return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6742 AllowCompatibleDifferences);
6743}
6744
6745bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6746 StringRef ModuleFilename, bool Complain,
6747 ASTReaderListener &Listener) {
6748 DiagnosticOptions DiagOpts;
6749 unsigned Idx = 0;
6750#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6751#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6752 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6753#include "clang/Basic/DiagnosticOptions.def"
6754
6755 for (unsigned N = Record[Idx++]; N; --N)
6756 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6757 for (unsigned N = Record[Idx++]; N; --N)
6758 DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6759
6760 return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6761}
6762
6763bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6764 ASTReaderListener &Listener) {
6765 FileSystemOptions FSOpts;
6766 unsigned Idx = 0;
6767 FSOpts.WorkingDir = ReadString(Record, Idx);
6768 return Listener.ReadFileSystemOptions(FSOpts, Complain);
6769}
6770
6771bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6772 StringRef ModuleFilename,
6773 bool Complain,
6774 ASTReaderListener &Listener) {
6775 HeaderSearchOptions HSOpts;
6776 unsigned Idx = 0;
6777 HSOpts.Sysroot = ReadString(Record, Idx);
6778
6779 HSOpts.ResourceDir = ReadString(Record, Idx);
6780 HSOpts.ModuleCachePath = ReadString(Record, Idx);
6781 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6782 HSOpts.DisableModuleHash = Record[Idx++];
6783 HSOpts.ImplicitModuleMaps = Record[Idx++];
6784 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6785 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6786 HSOpts.UseBuiltinIncludes = Record[Idx++];
6787 HSOpts.UseStandardSystemIncludes = Record[Idx++];
6788 HSOpts.UseStandardCXXIncludes = Record[Idx++];
6789 HSOpts.UseLibcxx = Record[Idx++];
6790 std::string ContextHash = ReadString(Record, Idx);
6791
6792 return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
6793 Complain);
6794}
6795
6796bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6797 ASTReaderListener &Listener) {
6798 HeaderSearchOptions HSOpts;
6799 unsigned Idx = 0;
6800
6801 // Include entries.
6802 for (unsigned N = Record[Idx++]; N; --N) {
6803 std::string Path = ReadString(Record, Idx);
6805 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6806 bool IsFramework = Record[Idx++];
6807 bool IgnoreSysRoot = Record[Idx++];
6808 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6809 IgnoreSysRoot);
6810 }
6811
6812 // System header prefixes.
6813 for (unsigned N = Record[Idx++]; N; --N) {
6814 std::string Prefix = ReadString(Record, Idx);
6815 bool IsSystemHeader = Record[Idx++];
6816 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6817 }
6818
6819 // VFS overlay files.
6820 for (unsigned N = Record[Idx++]; N; --N) {
6821 std::string VFSOverlayFile = ReadString(Record, Idx);
6822 HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6823 }
6824
6825 return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6826}
6827
6828bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6829 StringRef ModuleFilename,
6830 bool Complain,
6831 ASTReaderListener &Listener,
6832 std::string &SuggestedPredefines) {
6833 PreprocessorOptions PPOpts;
6834 unsigned Idx = 0;
6835
6836 // Macro definitions/undefs
6837 bool ReadMacros = Record[Idx++];
6838 if (ReadMacros) {
6839 for (unsigned N = Record[Idx++]; N; --N) {
6840 std::string Macro = ReadString(Record, Idx);
6841 bool IsUndef = Record[Idx++];
6842 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6843 }
6844 }
6845
6846 // Includes
6847 for (unsigned N = Record[Idx++]; N; --N) {
6848 PPOpts.Includes.push_back(ReadString(Record, Idx));
6849 }
6850
6851 // Macro Includes
6852 for (unsigned N = Record[Idx++]; N; --N) {
6853 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6854 }
6855
6856 PPOpts.UsePredefines = Record[Idx++];
6857 PPOpts.DetailedRecord = Record[Idx++];
6858 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6860 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6861 SuggestedPredefines.clear();
6862 return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6863 Complain, SuggestedPredefines);
6864}
6865
6866std::pair<ModuleFile *, unsigned>
6867ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6868 GlobalPreprocessedEntityMapType::iterator
6869 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6870 assert(I != GlobalPreprocessedEntityMap.end() &&
6871 "Corrupted global preprocessed entity map");
6872 ModuleFile *M = I->second;
6873 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6874 return std::make_pair(M, LocalIndex);
6875}
6876
6877llvm::iterator_range<PreprocessingRecord::iterator>
6878ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6879 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6880 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6882
6883 return llvm::make_range(PreprocessingRecord::iterator(),
6884 PreprocessingRecord::iterator());
6885}
6886
6887bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6888 unsigned int ClientLoadCapabilities) {
6889 return ClientLoadCapabilities & ARR_OutOfDate &&
6890 !getModuleManager()
6891 .getModuleCache()
6892 .getInMemoryModuleCache()
6893 .isPCMFinal(ModuleFileName);
6894}
6895
6896llvm::iterator_range<ASTReader::ModuleDeclIterator>
6898 return llvm::make_range(
6899 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
6900 ModuleDeclIterator(this, &Mod,
6902}
6903
6905 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6906 assert(I != GlobalSkippedRangeMap.end() &&
6907 "Corrupted global skipped range map");
6908 ModuleFile *M = I->second;
6909 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
6910 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6911 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
6912 SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
6913 ReadSourceLocation(*M, RawRange.getEnd()));
6914 assert(Range.isValid());
6915 return Range;
6916}
6917
6918unsigned
6919ASTReader::translatePreprocessedEntityIDToIndex(PreprocessedEntityID ID) const {
6920 unsigned ModuleFileIndex = ID >> 32;
6921 assert(ModuleFileIndex && "not translating loaded MacroID?");
6922 assert(getModuleManager().size() > ModuleFileIndex - 1);
6923 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6924
6925 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6926 return MF.BasePreprocessedEntityID + ID;
6927}
6928
6930 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6931 ModuleFile &M = *PPInfo.first;
6932 unsigned LocalIndex = PPInfo.second;
6934 (static_cast<PreprocessedEntityID>(M.Index + 1) << 32) | LocalIndex;
6935 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6936
6937 if (!PP.getPreprocessingRecord()) {
6938 Error("no preprocessing record");
6939 return nullptr;
6940 }
6941
6943 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
6944 M.MacroOffsetsBase + PPOffs.getOffset())) {
6945 Error(std::move(Err));
6946 return nullptr;
6947 }
6948
6950 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
6951 if (!MaybeEntry) {
6952 Error(MaybeEntry.takeError());
6953 return nullptr;
6954 }
6955 llvm::BitstreamEntry Entry = MaybeEntry.get();
6956
6957 if (Entry.Kind != llvm::BitstreamEntry::Record)
6958 return nullptr;
6959
6960 // Read the record.
6961 SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
6962 ReadSourceLocation(M, PPOffs.getEnd()));
6963 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6964 StringRef Blob;
6966 Expected<unsigned> MaybeRecType =
6967 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6968 if (!MaybeRecType) {
6969 Error(MaybeRecType.takeError());
6970 return nullptr;
6971 }
6972 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6973 case PPD_MACRO_EXPANSION: {
6974 bool isBuiltin = Record[0];
6975 IdentifierInfo *Name = nullptr;
6976 MacroDefinitionRecord *Def = nullptr;
6977 if (isBuiltin)
6978 Name = getLocalIdentifier(M, Record[1]);
6979 else {
6980 PreprocessedEntityID GlobalID =
6982 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6983 Def =
6984 cast<MacroDefinitionRecord>(PPRec.getLoadedPreprocessedEntity(Index));
6985 }
6986
6987 MacroExpansion *ME;
6988 if (isBuiltin)
6989 ME = new (PPRec) MacroExpansion(Name, Range);
6990 else
6991 ME = new (PPRec) MacroExpansion(Def, Range);
6992
6993 return ME;
6994 }
6995
6996 case PPD_MACRO_DEFINITION: {
6997 // Decode the identifier info and then check again; if the macro is
6998 // still defined and associated with the identifier,
7000 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
7001
7002 if (DeserializationListener)
7003 DeserializationListener->MacroDefinitionRead(PPID, MD);
7004
7005 return MD;
7006 }
7007
7009 const char *FullFileNameStart = Blob.data() + Record[0];
7010 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
7012 if (!FullFileName.empty())
7013 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7014
7015 // FIXME: Stable encoding
7017 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
7019 = new (PPRec) InclusionDirective(PPRec, Kind,
7020 StringRef(Blob.data(), Record[0]),
7021 Record[1], Record[3],
7022 File,
7023 Range);
7024 return ID;
7025 }
7026 }
7027
7028 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
7029}
7030
7031/// Find the next module that contains entities and return the ID
7032/// of the first entry.
7033///
7034/// \param SLocMapI points at a chunk of a module that contains no
7035/// preprocessed entities or the entities it contains are not the ones we are
7036/// looking for.
7037unsigned ASTReader::findNextPreprocessedEntity(
7038 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
7039 ++SLocMapI;
7040 for (GlobalSLocOffsetMapType::const_iterator
7041 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7042 ModuleFile &M = *SLocMapI->second;
7044 return M.BasePreprocessedEntityID;
7045 }
7046
7047 return getTotalNumPreprocessedEntities();
7048}
7049
7050namespace {
7051
7052struct PPEntityComp {
7053 const ASTReader &Reader;
7054 ModuleFile &M;
7055
7056 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7057
7058 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
7059 SourceLocation LHS = getLoc(L);
7060 SourceLocation RHS = getLoc(R);
7061 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7062 }
7063
7064 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
7065 SourceLocation LHS = getLoc(L);
7066 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7067 }
7068
7069 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
7070 SourceLocation RHS = getLoc(R);
7071 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7072 }
7073
7074 SourceLocation getLoc(const PPEntityOffset &PPE) const {
7075 return Reader.ReadSourceLocation(M, PPE.getBegin());
7076 }
7077};
7078
7079} // namespace
7080
7081unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7082 bool EndsAfter) const {
7083 if (SourceMgr.isLocalSourceLocation(Loc))
7084 return getTotalNumPreprocessedEntities();
7085
7086 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7087 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7088 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7089 "Corrupted global sloc offset map");
7090
7091 if (SLocMapI->second->NumPreprocessedEntities == 0)
7092 return findNextPreprocessedEntity(SLocMapI);
7093
7094 ModuleFile &M = *SLocMapI->second;
7095
7096 using pp_iterator = const PPEntityOffset *;
7097
7098 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
7099 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
7100
7101 size_t Count = M.NumPreprocessedEntities;
7102 size_t Half;
7103 pp_iterator First = pp_begin;
7104 pp_iterator PPI;
7105
7106 if (EndsAfter) {
7107 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7108 PPEntityComp(*this, M));
7109 } else {
7110 // Do a binary search manually instead of using std::lower_bound because
7111 // The end locations of entities may be unordered (when a macro expansion
7112 // is inside another macro argument), but for this case it is not important
7113 // whether we get the first macro expansion or its containing macro.
7114 while (Count > 0) {
7115 Half = Count / 2;
7116 PPI = First;
7117 std::advance(PPI, Half);
7118 if (SourceMgr.isBeforeInTranslationUnit(
7119 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7120 First = PPI;
7121 ++First;
7122 Count = Count - Half - 1;
7123 } else
7124 Count = Half;
7125 }
7126 }
7127
7128 if (PPI == pp_end)
7129 return findNextPreprocessedEntity(SLocMapI);
7130
7131 return M.BasePreprocessedEntityID + (PPI - pp_begin);
7132}
7133
7134/// Returns a pair of [Begin, End) indices of preallocated
7135/// preprocessed entities that \arg Range encompasses.
7136std::pair<unsigned, unsigned>
7138 if (Range.isInvalid())
7139 return std::make_pair(0,0);
7140 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7141
7142 unsigned BeginID = findPreprocessedEntity(Range.getBegin(), false);
7143 unsigned EndID = findPreprocessedEntity(Range.getEnd(), true);
7144 return std::make_pair(BeginID, EndID);
7145}
7146
7147/// Optionally returns true or false if the preallocated preprocessed
7148/// entity with index \arg Index came from file \arg FID.
7149std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
7150 FileID FID) {
7151 if (FID.isInvalid())
7152 return false;
7153
7154 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7155 ModuleFile &M = *PPInfo.first;
7156 unsigned LocalIndex = PPInfo.second;
7157 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7158
7159 SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
7160 if (Loc.isInvalid())
7161 return false;
7162
7163 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7164 return true;
7165 else
7166 return false;
7167}
7168
7169namespace {
7170
7171 /// Visitor used to search for information about a header file.
7172 class HeaderFileInfoVisitor {
7173 FileEntryRef FE;
7174 std::optional<HeaderFileInfo> HFI;
7175
7176 public:
7177 explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
7178
7179 bool operator()(ModuleFile &M) {
7182 if (!Table)
7183 return false;
7184
7185 // Look in the on-disk hash table for an entry for this file name.
7186 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7187 if (Pos == Table->end())
7188 return false;
7189
7190 HFI = *Pos;
7191 return true;
7192 }
7193
7194 std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
7195 };
7196
7197} // namespace
7198
7200 HeaderFileInfoVisitor Visitor(FE);
7201 ModuleMgr.visit(Visitor);
7202 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7203 return *HFI;
7204
7205 return HeaderFileInfo();
7206}
7207
7209 using DiagState = DiagnosticsEngine::DiagState;
7211
7212 for (ModuleFile &F : ModuleMgr) {
7213 unsigned Idx = 0;
7214 auto &Record = F.PragmaDiagMappings;
7215 if (Record.empty())
7216 continue;
7217
7218 DiagStates.clear();
7219
7220 auto ReadDiagState = [&](const DiagState &BasedOn,
7221 bool IncludeNonPragmaStates) {
7222 unsigned BackrefID = Record[Idx++];
7223 if (BackrefID != 0)
7224 return DiagStates[BackrefID - 1];
7225
7226 // A new DiagState was created here.
7227 Diag.DiagStates.push_back(BasedOn);
7228 DiagState *NewState = &Diag.DiagStates.back();
7229 DiagStates.push_back(NewState);
7230 unsigned Size = Record[Idx++];
7231 assert(Idx + Size * 2 <= Record.size() &&
7232 "Invalid data, not enough diag/map pairs");
7233 while (Size--) {
7234 unsigned DiagID = Record[Idx++];
7235 DiagnosticMapping NewMapping =
7237 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
7238 continue;
7239
7240 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
7241
7242 // If this mapping was specified as a warning but the severity was
7243 // upgraded due to diagnostic settings, simulate the current diagnostic
7244 // settings (and use a warning).
7245 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
7247 NewMapping.setUpgradedFromWarning(false);
7248 }
7249
7250 Mapping = NewMapping;
7251 }
7252 return NewState;
7253 };
7254
7255 // Read the first state.
7256 DiagState *FirstState;
7257 if (F.Kind == MK_ImplicitModule) {
7258 // Implicitly-built modules are reused with different diagnostic
7259 // settings. Use the initial diagnostic state from Diag to simulate this
7260 // compilation's diagnostic settings.
7261 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
7262 DiagStates.push_back(FirstState);
7263
7264 // Skip the initial diagnostic state from the serialized module.
7265 assert(Record[1] == 0 &&
7266 "Invalid data, unexpected backref in initial state");
7267 Idx = 3 + Record[2] * 2;
7268 assert(Idx < Record.size() &&
7269 "Invalid data, not enough state change pairs in initial state");
7270 } else if (F.isModule()) {
7271 // For an explicit module, preserve the flags from the module build
7272 // command line (-w, -Weverything, -Werror, ...) along with any explicit
7273 // -Wblah flags.
7274 unsigned Flags = Record[Idx++];
7275 DiagState Initial(*Diag.getDiagnosticIDs());
7276 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7277 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7278 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7279 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7280 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7281 Initial.ExtBehavior = (diag::Severity)Flags;
7282 FirstState = ReadDiagState(Initial, true);
7283
7284 assert(F.OriginalSourceFileID.isValid());
7285
7286 // Set up the root buffer of the module to start with the initial
7287 // diagnostic state of the module itself, to cover files that contain no
7288 // explicit transitions (for which we did not serialize anything).
7289 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
7290 .StateTransitions.push_back({FirstState, 0});
7291 } else {
7292 // For prefix ASTs, start with whatever the user configured on the
7293 // command line.
7294 Idx++; // Skip flags.
7295 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
7296 }
7297
7298 // Read the state transitions.
7299 unsigned NumLocations = Record[Idx++];
7300 while (NumLocations--) {
7301 assert(Idx < Record.size() &&
7302 "Invalid data, missing pragma diagnostic states");
7303 FileID FID = ReadFileID(F, Record, Idx);
7304 assert(FID.isValid() && "invalid FileID for transition");
7305 unsigned Transitions = Record[Idx++];
7306
7307 // Note that we don't need to set up Parent/ParentOffset here, because
7308 // we won't be changing the diagnostic state within imported FileIDs
7309 // (other than perhaps appending to the main source file, which has no
7310 // parent).
7311 auto &F = Diag.DiagStatesByLoc.Files[FID];
7312 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7313 for (unsigned I = 0; I != Transitions; ++I) {
7314 unsigned Offset = Record[Idx++];
7315 auto *State = ReadDiagState(*FirstState, false);
7316 F.StateTransitions.push_back({State, Offset});
7317 }
7318 }
7319
7320 // Read the final state.
7321 assert(Idx < Record.size() &&
7322 "Invalid data, missing final pragma diagnostic state");
7323 SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
7324 auto *CurState = ReadDiagState(*FirstState, false);
7325
7326 if (!F.isModule()) {
7327 Diag.DiagStatesByLoc.CurDiagState = CurState;
7328 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7329
7330 // Preserve the property that the imaginary root file describes the
7331 // current state.
7332 FileID NullFile;
7333 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7334 if (T.empty())
7335 T.push_back({CurState, 0});
7336 else
7337 T[0].State = CurState;
7338 }
7339
7340 // Restore the push stack so that unmatched pushes from a preamble are
7341 // visible when the main file is parsed, allowing the corresponding
7342 // `#pragma diagnostic pop` to succeed.
7343 assert(Idx < Record.size() &&
7344 "Invalid data, missing diagnostic push stack");
7345 unsigned NumPushes = Record[Idx++];
7346 for (unsigned I = 0; I != NumPushes; ++I) {
7347 auto *State = ReadDiagState(*FirstState, false);
7348 if (!F.isModule())
7349 Diag.DiagStateOnPushStack.push_back(State);
7350 }
7351
7352 // Don't try to read these mappings again.
7353 Record.clear();
7354 }
7355}
7356
7357/// Get the correct cursor and offset for loading a type.
7358ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7359 auto [M, Index] = translateTypeIDToIndex(ID);
7360 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7362}
7363
7364static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7365 switch (code) {
7366#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7367 case TYPE_##CODE_ID: return Type::CLASS_ID;
7368#include "clang/Serialization/TypeBitCodes.def"
7369 default:
7370 return std::nullopt;
7371 }
7372}
7373
7374/// Read and return the type with the given index..
7375///
7376/// The index is the type ID, shifted and minus the number of predefs. This
7377/// routine actually reads the record corresponding to the type at the given
7378/// location. It is a helper routine for GetType, which deals with reading type
7379/// IDs.
7380QualType ASTReader::readTypeRecord(TypeID ID) {
7381 assert(ContextObj && "reading type with no AST context");
7382 ASTContext &Context = *ContextObj;
7383 RecordLocation Loc = TypeCursorForIndex(ID);
7384 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7385
7386 // Keep track of where we are in the stream, then jump back there
7387 // after reading this type.
7388 SavedStreamPosition SavedPosition(DeclsCursor);
7389
7390 ReadingKindTracker ReadingKind(Read_Type, *this);
7391
7392 // Note that we are loading a type record.
7393 Deserializing AType(this);
7394
7395 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7396 Error(std::move(Err));
7397 return QualType();
7398 }
7399 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7400 if (!RawCode) {
7401 Error(RawCode.takeError());
7402 return QualType();
7403 }
7404
7405 ASTRecordReader Record(*this, *Loc.F);
7406 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7407 if (!Code) {
7408 Error(Code.takeError());
7409 return QualType();
7410 }
7411 if (Code.get() == TYPE_EXT_QUAL) {
7412 QualType baseType = Record.readQualType();
7413 Qualifiers quals = Record.readQualifiers();
7414 return Context.getQualifiedType(baseType, quals);
7415 }
7416
7417 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7418 if (!maybeClass) {
7419 Error("Unexpected code for type");
7420 return QualType();
7421 }
7422
7423 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7424 return TypeReader.read(*maybeClass);
7425}
7426
7427namespace clang {
7428
7429class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7430 ASTRecordReader &Reader;
7431
7432 SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
7433 SourceRange readSourceRange() { return Reader.readSourceRange(); }
7434
7435 TypeSourceInfo *GetTypeSourceInfo() {
7436 return Reader.readTypeSourceInfo();
7437 }
7438
7439 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7440 return Reader.readNestedNameSpecifierLoc();
7441 }
7442
7443 Attr *ReadAttr() {
7444 return Reader.readAttr();
7445 }
7446
7447public:
7448 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7449
7450 // We want compile-time assurance that we've enumerated all of
7451 // these, so unfortunately we have to declare them first, then
7452 // define them out-of-line.
7453#define ABSTRACT_TYPELOC(CLASS, PARENT)
7454#define TYPELOC(CLASS, PARENT) \
7455 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7456#include "clang/AST/TypeLocNodes.def"
7457
7460 void VisitTagTypeLoc(TagTypeLoc TL);
7461};
7462
7463} // namespace clang
7464
7465void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7466 // nothing to do
7467}
7468
7469void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7470 TL.setBuiltinLoc(readSourceLocation());
7471 if (TL.needsExtraLocalData()) {
7472 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7473 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7474 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7475 TL.setModeAttr(Reader.readInt());
7476 }
7477}
7478
7479void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7480 TL.setNameLoc(readSourceLocation());
7481}
7482
7483void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7484 TL.setStarLoc(readSourceLocation());
7485}
7486
7487void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7488 // nothing to do
7489}
7490
7491void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7492 // nothing to do
7493}
7494
7495void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7496 // nothing to do
7497}
7498
7499void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7500 TL.setExpansionLoc(readSourceLocation());
7501}
7502
7503void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7504 TL.setCaretLoc(readSourceLocation());
7505}
7506
7507void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7508 TL.setAmpLoc(readSourceLocation());
7509}
7510
7511void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7512 TL.setAmpAmpLoc(readSourceLocation());
7513}
7514
7515void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7516 TL.setStarLoc(readSourceLocation());
7517 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7518}
7519
7521 TL.setLBracketLoc(readSourceLocation());
7522 TL.setRBracketLoc(readSourceLocation());
7523 if (Reader.readBool())
7524 TL.setSizeExpr(Reader.readExpr());
7525 else
7526 TL.setSizeExpr(nullptr);
7527}
7528
7529void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7530 VisitArrayTypeLoc(TL);
7531}
7532
7533void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7534 VisitArrayTypeLoc(TL);
7535}
7536
7537void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7538 VisitArrayTypeLoc(TL);
7539}
7540
7541void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7542 DependentSizedArrayTypeLoc TL) {
7543 VisitArrayTypeLoc(TL);
7544}
7545
7546void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7547 DependentAddressSpaceTypeLoc TL) {
7548
7549 TL.setAttrNameLoc(readSourceLocation());
7550 TL.setAttrOperandParensRange(readSourceRange());
7551 TL.setAttrExprOperand(Reader.readExpr());
7552}
7553
7554void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7555 DependentSizedExtVectorTypeLoc TL) {
7556 TL.setNameLoc(readSourceLocation());
7557}
7558
7559void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7560 TL.setNameLoc(readSourceLocation());
7561}
7562
7563void TypeLocReader::VisitDependentVectorTypeLoc(
7564 DependentVectorTypeLoc TL) {
7565 TL.setNameLoc(readSourceLocation());
7566}
7567
7568void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7569 TL.setNameLoc(readSourceLocation());
7570}
7571
7572void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7573 TL.setAttrNameLoc(readSourceLocation());
7574 TL.setAttrOperandParensRange(readSourceRange());
7575 TL.setAttrRowOperand(Reader.readExpr());
7576 TL.setAttrColumnOperand(Reader.readExpr());
7577}
7578
7579void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7580 DependentSizedMatrixTypeLoc TL) {
7581 TL.setAttrNameLoc(readSourceLocation());
7582 TL.setAttrOperandParensRange(readSourceRange());
7583 TL.setAttrRowOperand(Reader.readExpr());
7584 TL.setAttrColumnOperand(Reader.readExpr());
7585}
7586
7588 TL.setLocalRangeBegin(readSourceLocation());
7589 TL.setLParenLoc(readSourceLocation());
7590 TL.setRParenLoc(readSourceLocation());
7591 TL.setExceptionSpecRange(readSourceRange());
7592 TL.setLocalRangeEnd(readSourceLocation());
7593 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7594 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7595 }
7596}
7597
7598void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7599 VisitFunctionTypeLoc(TL);
7600}
7601
7602void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7603 VisitFunctionTypeLoc(TL);
7604}
7605
7606void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7607 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7608 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7609 SourceLocation NameLoc = readSourceLocation();
7610 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7611}
7612
7613void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7614 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7615 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7616 SourceLocation NameLoc = readSourceLocation();
7617 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7618}
7619
7620void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7621 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7622 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7623 SourceLocation NameLoc = readSourceLocation();
7624 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7625}
7626
7627void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7628 TL.setTypeofLoc(readSourceLocation());
7629 TL.setLParenLoc(readSourceLocation());
7630 TL.setRParenLoc(readSourceLocation());
7631}
7632
7633void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7634 TL.setTypeofLoc(readSourceLocation());
7635 TL.setLParenLoc(readSourceLocation());
7636 TL.setRParenLoc(readSourceLocation());
7637 TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7638}
7639
7640void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7641 TL.setDecltypeLoc(readSourceLocation());
7642 TL.setRParenLoc(readSourceLocation());
7643}
7644
7645void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7646 TL.setEllipsisLoc(readSourceLocation());
7647}
7648
7649void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7650 TL.setKWLoc(readSourceLocation());
7651 TL.setLParenLoc(readSourceLocation());
7652 TL.setRParenLoc(readSourceLocation());
7653 TL.setUnderlyingTInfo(GetTypeSourceInfo());
7654}
7655
7657 auto NNS = readNestedNameSpecifierLoc();
7658 auto TemplateKWLoc = readSourceLocation();
7659 auto ConceptNameLoc = readDeclarationNameInfo();
7660 auto FoundDecl = readDeclAs<NamedDecl>();
7661 auto NamedConcept = readDeclAs<ConceptDecl>();
7662 auto *CR = ConceptReference::Create(
7663 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7664 (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7665 return CR;
7666}
7667
7668void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7669 TL.setNameLoc(readSourceLocation());
7670 if (Reader.readBool())
7671 TL.setConceptReference(Reader.readConceptReference());
7672 if (Reader.readBool())
7673 TL.setRParenLoc(readSourceLocation());
7674}
7675
7676void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7678 TL.setElaboratedKeywordLoc(readSourceLocation());
7679 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7680 TL.setTemplateNameLoc(readSourceLocation());
7681}
7682
7684 TL.setElaboratedKeywordLoc(readSourceLocation());
7685 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7686 TL.setNameLoc(readSourceLocation());
7687}
7688
7689void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7690 VisitTagTypeLoc(TL);
7691}
7692
7693void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7694 VisitTagTypeLoc(TL);
7695}
7696
7697void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7698
7699void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7700 TL.setAttr(ReadAttr());
7701}
7702
7703void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7704 // Nothing to do
7705}
7706
7707void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7708 // Nothing to do.
7709}
7710
7711void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7712 TL.setAttrLoc(readSourceLocation());
7713}
7714
7715void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7716 HLSLAttributedResourceTypeLoc TL) {
7717 // Nothing to do.
7718}
7719
7720void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7721 // Nothing to do.
7722}
7723
7724void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7725 TL.setNameLoc(readSourceLocation());
7726}
7727
7728void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7729 SubstTemplateTypeParmTypeLoc TL) {
7730 TL.setNameLoc(readSourceLocation());
7731}
7732
7733void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7734 SubstTemplateTypeParmPackTypeLoc TL) {
7735 TL.setNameLoc(readSourceLocation());
7736}
7737
7738void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7739 SubstBuiltinTemplatePackTypeLoc TL) {
7740 TL.setNameLoc(readSourceLocation());
7741}
7742
7743void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7744 TemplateSpecializationTypeLoc TL) {
7745 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7746 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7747 SourceLocation TemplateKeywordLoc = readSourceLocation();
7748 SourceLocation NameLoc = readSourceLocation();
7749 SourceLocation LAngleLoc = readSourceLocation();
7750 SourceLocation RAngleLoc = readSourceLocation();
7751 TL.set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7752 LAngleLoc, RAngleLoc);
7753 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.getArgLocInfos();
7754 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7755 Args[I] = Reader.readTemplateArgumentLocInfo(
7756 TL.getTypePtr()->template_arguments()[I].getKind());
7757}
7758
7759void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7760 TL.setLParenLoc(readSourceLocation());
7761 TL.setRParenLoc(readSourceLocation());
7762}
7763
7764void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7765 TL.setElaboratedKeywordLoc(readSourceLocation());
7766 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7767 TL.setNameLoc(readSourceLocation());
7768}
7769
7770void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7771 TL.setEllipsisLoc(readSourceLocation());
7772}
7773
7774void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7775 TL.setNameLoc(readSourceLocation());
7776 TL.setNameEndLoc(readSourceLocation());
7777}
7778
7779void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7780 if (TL.getNumProtocols()) {
7781 TL.setProtocolLAngleLoc(readSourceLocation());
7782 TL.setProtocolRAngleLoc(readSourceLocation());
7783 }
7784 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7785 TL.setProtocolLoc(i, readSourceLocation());
7786}
7787
7788void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7789 TL.setHasBaseTypeAsWritten(Reader.readBool());
7790 TL.setTypeArgsLAngleLoc(readSourceLocation());
7791 TL.setTypeArgsRAngleLoc(readSourceLocation());
7792 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7793 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7794 TL.setProtocolLAngleLoc(readSourceLocation());
7795 TL.setProtocolRAngleLoc(readSourceLocation());
7796 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7797 TL.setProtocolLoc(i, readSourceLocation());
7798}
7799
7800void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7801 TL.setStarLoc(readSourceLocation());
7802}
7803
7804void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7805 TL.setKWLoc(readSourceLocation());
7806 TL.setLParenLoc(readSourceLocation());
7807 TL.setRParenLoc(readSourceLocation());
7808}
7809
7810void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7811 TL.setKWLoc(readSourceLocation());
7812}
7813
7814void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7815 TL.setNameLoc(readSourceLocation());
7816}
7817
7818void TypeLocReader::VisitDependentBitIntTypeLoc(
7819 clang::DependentBitIntTypeLoc TL) {
7820 TL.setNameLoc(readSourceLocation());
7821}
7822
7823void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7824 // Nothing to do.
7825}
7826
7828 TypeLocReader TLR(*this);
7829 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7830 TLR.Visit(TL);
7831}
7832
7834 QualType InfoTy = readType();
7835 if (InfoTy.isNull())
7836 return nullptr;
7837
7838 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7839 readTypeLoc(TInfo->getTypeLoc());
7840 return TInfo;
7841}
7842
7844 return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7845}
7846
7848 return ID >> 32;
7849}
7850
7852 // We don't need to erase the higher bits since if these bits are not 0,
7853 // it must be larger than NUM_PREDEF_TYPE_IDS.
7855}
7856
7857std::pair<ModuleFile *, unsigned>
7858ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7859 assert(!isPredefinedType(ID) &&
7860 "Predefined type shouldn't be in TypesLoaded");
7861 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7862 assert(ModuleFileIndex && "Untranslated Local Decl?");
7863
7864 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7865 assert(OwningModuleFile &&
7866 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7867
7868 return {OwningModuleFile,
7869 OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7870}
7871
7873 assert(ContextObj && "reading type with no AST context");
7874 ASTContext &Context = *ContextObj;
7875
7876 unsigned FastQuals = ID & Qualifiers::FastMask;
7877
7878 if (isPredefinedType(ID)) {
7879 QualType T;
7880 unsigned Index = getIndexForTypeID(ID);
7881 switch ((PredefinedTypeIDs)Index) {
7883 // We should never use this one.
7884 llvm_unreachable("Invalid predefined type");
7885 break;
7887 return QualType();
7889 T = Context.VoidTy;
7890 break;
7892 T = Context.BoolTy;
7893 break;
7896 // FIXME: Check that the signedness of CharTy is correct!
7897 T = Context.CharTy;
7898 break;
7900 T = Context.UnsignedCharTy;
7901 break;
7903 T = Context.UnsignedShortTy;
7904 break;
7906 T = Context.UnsignedIntTy;
7907 break;
7909 T = Context.UnsignedLongTy;
7910 break;
7912 T = Context.UnsignedLongLongTy;
7913 break;
7915 T = Context.UnsignedInt128Ty;
7916 break;
7918 T = Context.SignedCharTy;
7919 break;
7921 T = Context.WCharTy;
7922 break;
7924 T = Context.ShortTy;
7925 break;
7926 case PREDEF_TYPE_INT_ID:
7927 T = Context.IntTy;
7928 break;
7930 T = Context.LongTy;
7931 break;
7933 T = Context.LongLongTy;
7934 break;
7936 T = Context.Int128Ty;
7937 break;
7939 T = Context.BFloat16Ty;
7940 break;
7942 T = Context.HalfTy;
7943 break;
7945 T = Context.FloatTy;
7946 break;
7948 T = Context.DoubleTy;
7949 break;
7951 T = Context.LongDoubleTy;
7952 break;
7954 T = Context.ShortAccumTy;
7955 break;
7957 T = Context.AccumTy;
7958 break;
7960 T = Context.LongAccumTy;
7961 break;
7963 T = Context.UnsignedShortAccumTy;
7964 break;
7966 T = Context.UnsignedAccumTy;
7967 break;
7969 T = Context.UnsignedLongAccumTy;
7970 break;
7972 T = Context.ShortFractTy;
7973 break;
7975 T = Context.FractTy;
7976 break;
7978 T = Context.LongFractTy;
7979 break;
7981 T = Context.UnsignedShortFractTy;
7982 break;
7984 T = Context.UnsignedFractTy;
7985 break;
7987 T = Context.UnsignedLongFractTy;
7988 break;
7990 T = Context.SatShortAccumTy;
7991 break;
7993 T = Context.SatAccumTy;
7994 break;
7996 T = Context.SatLongAccumTy;
7997 break;
7999 T = Context.SatUnsignedShortAccumTy;
8000 break;
8002 T = Context.SatUnsignedAccumTy;
8003 break;
8005 T = Context.SatUnsignedLongAccumTy;
8006 break;
8008 T = Context.SatShortFractTy;
8009 break;
8011 T = Context.SatFractTy;
8012 break;
8014 T = Context.SatLongFractTy;
8015 break;
8017 T = Context.SatUnsignedShortFractTy;
8018 break;
8020 T = Context.SatUnsignedFractTy;
8021 break;
8023 T = Context.SatUnsignedLongFractTy;
8024 break;
8026 T = Context.Float16Ty;
8027 break;
8029 T = Context.Float128Ty;
8030 break;
8032 T = Context.Ibm128Ty;
8033 break;
8035 T = Context.OverloadTy;
8036 break;
8038 T = Context.UnresolvedTemplateTy;
8039 break;
8041 T = Context.BoundMemberTy;
8042 break;
8044 T = Context.PseudoObjectTy;
8045 break;
8047 T = Context.DependentTy;
8048 break;
8050 T = Context.UnknownAnyTy;
8051 break;
8053 T = Context.NullPtrTy;
8054 break;
8056 T = Context.Char8Ty;
8057 break;
8059 T = Context.Char16Ty;
8060 break;
8062 T = Context.Char32Ty;
8063 break;
8065 T = Context.ObjCBuiltinIdTy;
8066 break;
8068 T = Context.ObjCBuiltinClassTy;
8069 break;
8071 T = Context.ObjCBuiltinSelTy;
8072 break;
8073#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8074 case PREDEF_TYPE_##Id##_ID: \
8075 T = Context.SingletonId; \
8076 break;
8077#include "clang/Basic/OpenCLImageTypes.def"
8078#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8079 case PREDEF_TYPE_##Id##_ID: \
8080 T = Context.Id##Ty; \
8081 break;
8082#include "clang/Basic/OpenCLExtensionTypes.def"
8084 T = Context.OCLSamplerTy;
8085 break;
8087 T = Context.OCLEventTy;
8088 break;
8090 T = Context.OCLClkEventTy;
8091 break;
8093 T = Context.OCLQueueTy;
8094 break;
8096 T = Context.OCLReserveIDTy;
8097 break;
8099 T = Context.getAutoDeductType();
8100 break;
8102 T = Context.getAutoRRefDeductType();
8103 break;
8105 T = Context.ARCUnbridgedCastTy;
8106 break;
8108 T = Context.BuiltinFnTy;
8109 break;
8111 T = Context.IncompleteMatrixIdxTy;
8112 break;
8114 T = Context.ArraySectionTy;
8115 break;
8117 T = Context.OMPArrayShapingTy;
8118 break;
8120 T = Context.OMPIteratorTy;
8121 break;
8122#define SVE_TYPE(Name, Id, SingletonId) \
8123 case PREDEF_TYPE_##Id##_ID: \
8124 T = Context.SingletonId; \
8125 break;
8126#include "clang/Basic/AArch64ACLETypes.def"
8127#define PPC_VECTOR_TYPE(Name, Id, Size) \
8128 case PREDEF_TYPE_##Id##_ID: \
8129 T = Context.Id##Ty; \
8130 break;
8131#include "clang/Basic/PPCTypes.def"
8132#define RVV_TYPE(Name, Id, SingletonId) \
8133 case PREDEF_TYPE_##Id##_ID: \
8134 T = Context.SingletonId; \
8135 break;
8136#include "clang/Basic/RISCVVTypes.def"
8137#define WASM_TYPE(Name, Id, SingletonId) \
8138 case PREDEF_TYPE_##Id##_ID: \
8139 T = Context.SingletonId; \
8140 break;
8141#include "clang/Basic/WebAssemblyReferenceTypes.def"
8142#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8143 case PREDEF_TYPE_##Id##_ID: \
8144 T = Context.SingletonId; \
8145 break;
8146#include "clang/Basic/AMDGPUTypes.def"
8147#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8148 case PREDEF_TYPE_##Id##_ID: \
8149 T = Context.SingletonId; \
8150 break;
8151#include "clang/Basic/HLSLIntangibleTypes.def"
8152 }
8153
8154 assert(!T.isNull() && "Unknown predefined type");
8155 return T.withFastQualifiers(FastQuals);
8156 }
8157
8158 unsigned Index = translateTypeIDToIndex(ID).second;
8159
8160 assert(Index < TypesLoaded.size() && "Type index out-of-range");
8161 if (TypesLoaded[Index].isNull()) {
8162 TypesLoaded[Index] = readTypeRecord(ID);
8163 if (TypesLoaded[Index].isNull())
8164 return QualType();
8165
8166 TypesLoaded[Index]->setFromAST();
8167 if (DeserializationListener)
8168 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
8169 TypesLoaded[Index]);
8170 }
8171
8172 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8173}
8174
8176 return GetType(getGlobalTypeID(F, LocalID));
8177}
8178
8180 LocalTypeID LocalID) const {
8181 if (isPredefinedType(LocalID))
8182 return LocalID;
8183
8184 if (!F.ModuleOffsetMap.empty())
8185 ReadModuleOffsetMap(F);
8186
8187 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
8188 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8189
8190 if (ModuleFileIndex == 0)
8192
8193 ModuleFile &MF =
8194 ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
8195 ModuleFileIndex = MF.Index + 1;
8196 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8197}
8198
8201 switch (Kind) {
8203 return readExpr();
8205 return readTypeSourceInfo();
8208 SourceLocation TemplateKWLoc = readSourceLocation();
8210 SourceLocation TemplateNameLoc = readSourceLocation();
8213 : SourceLocation();
8214 return TemplateArgumentLocInfo(getASTContext(), TemplateKWLoc, QualifierLoc,
8215 TemplateNameLoc, EllipsisLoc);
8216 }
8223 // FIXME: Is this right?
8224 return TemplateArgumentLocInfo();
8225 }
8226 llvm_unreachable("unexpected template argument loc");
8227}
8228
8238
8241 Result.setLAngleLoc(readSourceLocation());
8242 Result.setRAngleLoc(readSourceLocation());
8243 unsigned NumArgsAsWritten = readInt();
8244 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
8245 Result.addArgument(readTemplateArgumentLoc());
8246}
8247
8254
8256
8258 if (NumCurrentElementsDeserializing) {
8259 // We arrange to not care about the complete redeclaration chain while we're
8260 // deserializing. Just remember that the AST has marked this one as complete
8261 // but that it's not actually complete yet, so we know we still need to
8262 // complete it later.
8263 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
8264 return;
8265 }
8266
8267 if (!D->getDeclContext()) {
8268 assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
8269 return;
8270 }
8271
8272 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
8273
8274 // If this is a named declaration, complete it by looking it up
8275 // within its context.
8276 //
8277 // FIXME: Merging a function definition should merge
8278 // all mergeable entities within it.
8280 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
8281 if (!getContext().getLangOpts().CPlusPlus &&
8283 // Outside of C++, we don't have a lookup table for the TU, so update
8284 // the identifier instead. (For C++ modules, we don't store decls
8285 // in the serialized identifier table, so we do the lookup in the TU.)
8286 auto *II = Name.getAsIdentifierInfo();
8287 assert(II && "non-identifier name in C?");
8288 if (II->isOutOfDate())
8290 } else
8291 DC->lookup(Name);
8293 // Find all declarations of this kind from the relevant context.
8294 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
8295 auto *DC = cast<DeclContext>(DCDecl);
8298 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
8299 }
8300 }
8301 }
8302
8305 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8306 Template = CTSD->getSpecializedTemplate();
8307 Args = CTSD->getTemplateArgs().asArray();
8308 } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8309 Template = VTSD->getSpecializedTemplate();
8310 Args = VTSD->getTemplateArgs().asArray();
8311 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
8312 if (auto *Tmplt = FD->getPrimaryTemplate()) {
8313 Template = Tmplt;
8314 Args = FD->getTemplateSpecializationArgs()->asArray();
8315 }
8316 }
8317
8318 if (Template)
8319 Template->loadLazySpecializationsImpl(Args);
8320}
8321
8324 RecordLocation Loc = getLocalBitOffset(Offset);
8325 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8326 SavedStreamPosition SavedPosition(Cursor);
8327 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8328 Error(std::move(Err));
8329 return nullptr;
8330 }
8331 ReadingKindTracker ReadingKind(Read_Decl, *this);
8332 Deserializing D(this);
8333
8334 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8335 if (!MaybeCode) {
8336 Error(MaybeCode.takeError());
8337 return nullptr;
8338 }
8339 unsigned Code = MaybeCode.get();
8340
8341 ASTRecordReader Record(*this, *Loc.F);
8342 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8343 if (!MaybeRecCode) {
8344 Error(MaybeRecCode.takeError());
8345 return nullptr;
8346 }
8347 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
8348 Error("malformed AST file: missing C++ ctor initializers");
8349 return nullptr;
8350 }
8351
8352 return Record.readCXXCtorInitializers();
8353}
8354
8356 assert(ContextObj && "reading base specifiers with no AST context");
8357 ASTContext &Context = *ContextObj;
8358
8359 RecordLocation Loc = getLocalBitOffset(Offset);
8360 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8361 SavedStreamPosition SavedPosition(Cursor);
8362 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8363 Error(std::move(Err));
8364 return nullptr;
8365 }
8366 ReadingKindTracker ReadingKind(Read_Decl, *this);
8367 Deserializing D(this);
8368
8369 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8370 if (!MaybeCode) {
8371 Error(MaybeCode.takeError());
8372 return nullptr;
8373 }
8374 unsigned Code = MaybeCode.get();
8375
8376 ASTRecordReader Record(*this, *Loc.F);
8377 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8378 if (!MaybeRecCode) {
8379 Error(MaybeCode.takeError());
8380 return nullptr;
8381 }
8382 unsigned RecCode = MaybeRecCode.get();
8383
8384 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8385 Error("malformed AST file: missing C++ base specifiers");
8386 return nullptr;
8387 }
8388
8389 unsigned NumBases = Record.readInt();
8390 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8391 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8392 for (unsigned I = 0; I != NumBases; ++I)
8393 Bases[I] = Record.readCXXBaseSpecifier();
8394 return Bases;
8395}
8396
8398 LocalDeclID LocalID) const {
8399 if (LocalID < NUM_PREDEF_DECL_IDS)
8400 return GlobalDeclID(LocalID.getRawValue());
8401
8402 unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8403 DeclID ID = LocalID.getLocalDeclIndex();
8404
8405 if (!F.ModuleOffsetMap.empty())
8406 ReadModuleOffsetMap(F);
8407
8408 ModuleFile *OwningModuleFile =
8409 OwningModuleFileIndex == 0
8410 ? &F
8411 : F.TransitiveImports[OwningModuleFileIndex - 1];
8412
8413 if (OwningModuleFileIndex == 0)
8414 ID -= NUM_PREDEF_DECL_IDS;
8415
8416 uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8417 return GlobalDeclID(NewModuleFileIndex, ID);
8418}
8419
8421 // Predefined decls aren't from any module.
8422 if (ID < NUM_PREDEF_DECL_IDS)
8423 return false;
8424
8425 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8426 return M.Index == ModuleFileIndex - 1;
8427}
8428
8430 // Predefined decls aren't from any module.
8431 if (ID < NUM_PREDEF_DECL_IDS)
8432 return nullptr;
8433
8434 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8435 assert(ModuleFileIndex && "Untranslated Local Decl?");
8436
8437 return &getModuleManager()[ModuleFileIndex - 1];
8438}
8439
8441 if (!D->isFromASTFile())
8442 return nullptr;
8443
8444 return getOwningModuleFile(D->getGlobalID());
8445}
8446
8448 if (ID < NUM_PREDEF_DECL_IDS)
8449 return SourceLocation();
8450
8451 if (Decl *D = GetExistingDecl(ID))
8452 return D->getLocation();
8453
8454 SourceLocation Loc;
8455 DeclCursorForID(ID, Loc);
8456 return Loc;
8457}
8458
8459Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8460 assert(ContextObj && "reading predefined decl without AST context");
8461 ASTContext &Context = *ContextObj;
8462 Decl *NewLoaded = nullptr;
8463 switch (ID) {
8465 return nullptr;
8466
8468 return Context.getTranslationUnitDecl();
8469
8471 if (Context.ObjCIdDecl)
8472 return Context.ObjCIdDecl;
8473 NewLoaded = Context.getObjCIdDecl();
8474 break;
8475
8477 if (Context.ObjCSelDecl)
8478 return Context.ObjCSelDecl;
8479 NewLoaded = Context.getObjCSelDecl();
8480 break;
8481
8483 if (Context.ObjCClassDecl)
8484 return Context.ObjCClassDecl;
8485 NewLoaded = Context.getObjCClassDecl();
8486 break;
8487
8489 if (Context.ObjCProtocolClassDecl)
8490 return Context.ObjCProtocolClassDecl;
8491 NewLoaded = Context.getObjCProtocolDecl();
8492 break;
8493
8495 if (Context.Int128Decl)
8496 return Context.Int128Decl;
8497 NewLoaded = Context.getInt128Decl();
8498 break;
8499
8501 if (Context.UInt128Decl)
8502 return Context.UInt128Decl;
8503 NewLoaded = Context.getUInt128Decl();
8504 break;
8505
8507 if (Context.ObjCInstanceTypeDecl)
8508 return Context.ObjCInstanceTypeDecl;
8509 NewLoaded = Context.getObjCInstanceTypeDecl();
8510 break;
8511
8513 if (Context.BuiltinVaListDecl)
8514 return Context.BuiltinVaListDecl;
8515 NewLoaded = Context.getBuiltinVaListDecl();
8516 break;
8517
8519 if (Context.VaListTagDecl)
8520 return Context.VaListTagDecl;
8521 NewLoaded = Context.getVaListTagDecl();
8522 break;
8523
8525 if (Context.BuiltinMSVaListDecl)
8526 return Context.BuiltinMSVaListDecl;
8527 NewLoaded = Context.getBuiltinMSVaListDecl();
8528 break;
8529
8531 // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8532 return Context.getMSGuidTagDecl();
8533
8535 if (Context.ExternCContext)
8536 return Context.ExternCContext;
8537 NewLoaded = Context.getExternCContextDecl();
8538 break;
8539
8541 if (Context.CFConstantStringTypeDecl)
8542 return Context.CFConstantStringTypeDecl;
8543 NewLoaded = Context.getCFConstantStringDecl();
8544 break;
8545
8547 if (Context.CFConstantStringTagDecl)
8548 return Context.CFConstantStringTagDecl;
8549 NewLoaded = Context.getCFConstantStringTagDecl();
8550 break;
8551
8553 return Context.getMSTypeInfoTagDecl();
8554
8555#define BuiltinTemplate(BTName) \
8556 case PREDEF_DECL##BTName##_ID: \
8557 if (Context.Decl##BTName) \
8558 return Context.Decl##BTName; \
8559 NewLoaded = Context.get##BTName##Decl(); \
8560 break;
8561#include "clang/Basic/BuiltinTemplates.inc"
8562
8564 llvm_unreachable("Invalid decl ID");
8565 break;
8566 }
8567
8568 assert(NewLoaded && "Failed to load predefined decl?");
8569
8570 if (DeserializationListener)
8571 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8572
8573 return NewLoaded;
8574}
8575
8576unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8577 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8578 if (!OwningModuleFile) {
8579 assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8580 return GlobalID.getRawValue();
8581 }
8582
8583 return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8584}
8585
8587 assert(ContextObj && "reading decl with no AST context");
8588
8589 if (ID < NUM_PREDEF_DECL_IDS) {
8590 Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8591 if (D) {
8592 // Track that we have merged the declaration with ID \p ID into the
8593 // pre-existing predefined declaration \p D.
8594 auto &Merged = KeyDecls[D->getCanonicalDecl()];
8595 if (Merged.empty())
8596 Merged.push_back(ID);
8597 }
8598 return D;
8599 }
8600
8601 unsigned Index = translateGlobalDeclIDToIndex(ID);
8602
8603 if (Index >= DeclsLoaded.size()) {
8604 assert(0 && "declaration ID out-of-range for AST file");
8605 Error("declaration ID out-of-range for AST file");
8606 return nullptr;
8607 }
8608
8609 return DeclsLoaded[Index];
8610}
8611
8613 if (ID < NUM_PREDEF_DECL_IDS)
8614 return GetExistingDecl(ID);
8615
8616 unsigned Index = translateGlobalDeclIDToIndex(ID);
8617
8618 if (Index >= DeclsLoaded.size()) {
8619 assert(0 && "declaration ID out-of-range for AST file");
8620 Error("declaration ID out-of-range for AST file");
8621 return nullptr;
8622 }
8623
8624 if (!DeclsLoaded[Index]) {
8625 ReadDeclRecord(ID);
8626 if (DeserializationListener)
8627 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8628 }
8629
8630 return DeclsLoaded[Index];
8631}
8632
8634 GlobalDeclID GlobalID) {
8635 if (GlobalID < NUM_PREDEF_DECL_IDS)
8636 return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8637
8638 if (!M.ModuleOffsetMap.empty())
8639 ReadModuleOffsetMap(M);
8640
8641 ModuleFile *Owner = getOwningModuleFile(GlobalID);
8642 DeclID ID = GlobalID.getLocalDeclIndex();
8643
8644 if (Owner == &M) {
8645 ID += NUM_PREDEF_DECL_IDS;
8646 return LocalDeclID::get(*this, M, ID);
8647 }
8648
8649 uint64_t OrignalModuleFileIndex = 0;
8650 for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8651 if (M.TransitiveImports[I] == Owner) {
8652 OrignalModuleFileIndex = I + 1;
8653 break;
8654 }
8655
8656 if (!OrignalModuleFileIndex)
8657 return LocalDeclID();
8658
8659 return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8660}
8661
8663 unsigned &Idx) {
8664 if (Idx >= Record.size()) {
8665 Error("Corrupted AST file");
8666 return GlobalDeclID(0);
8667 }
8668
8669 return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8670}
8671
8672/// Resolve the offset of a statement into a statement.
8673///
8674/// This operation will read a new statement from the external
8675/// source each time it is called, and is meant to be used via a
8676/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
8678 // Switch case IDs are per Decl.
8680
8681 // Offset here is a global offset across the entire chain.
8682 RecordLocation Loc = getLocalBitOffset(Offset);
8683 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8684 Error(std::move(Err));
8685 return nullptr;
8686 }
8687 assert(NumCurrentElementsDeserializing == 0 &&
8688 "should not be called while already deserializing");
8689 Deserializing D(this);
8690 return ReadStmtFromStream(*Loc.F);
8691}
8692
8693bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8694 const Decl *D) {
8695 assert(D);
8696
8697 auto It = SpecLookups.find(D);
8698 if (It == SpecLookups.end())
8699 return false;
8700
8701 // Get Decl may violate the iterator from SpecializationsLookups so we store
8702 // the DeclIDs in ahead.
8704 It->second.Table.findAll();
8705
8706 // Since we've loaded all the specializations, we can erase it from
8707 // the lookup table.
8708 SpecLookups.erase(It);
8709
8710 bool NewSpecsFound = false;
8711 Deserializing LookupResults(this);
8712 for (auto &Info : Infos) {
8713 if (GetExistingDecl(Info))
8714 continue;
8715 NewSpecsFound = true;
8716 GetDecl(Info);
8717 }
8718
8719 return NewSpecsFound;
8720}
8721
8723 assert(D);
8724
8726 bool NewSpecsFound =
8727 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8728 if (OnlyPartial)
8729 return NewSpecsFound;
8730
8731 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8732 return NewSpecsFound;
8733}
8734
8735bool ASTReader::LoadExternalSpecializationsImpl(
8736 SpecLookupTableTy &SpecLookups, const Decl *D,
8737 ArrayRef<TemplateArgument> TemplateArgs) {
8738 assert(D);
8739
8740 auto It = SpecLookups.find(D);
8741 if (It == SpecLookups.end())
8742 return false;
8743
8744 Deserializing LookupResults(this);
8745 auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8746
8748 It->second.Table.find(HashValue);
8749
8750 llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8751 std::string Name;
8752 llvm::raw_string_ostream OS(Name);
8753 auto *ND = cast<NamedDecl>(D);
8755 /*Qualified=*/true);
8756 return Name;
8757 });
8758
8759 bool NewSpecsFound = false;
8760 for (auto &Info : Infos) {
8761 if (GetExistingDecl(Info))
8762 continue;
8763 NewSpecsFound = true;
8764 GetDecl(Info);
8765 }
8766
8767 return NewSpecsFound;
8768}
8769
8771 const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8772 assert(D);
8773
8774 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8775 PartialSpecializationsLookups, D, TemplateArgs);
8776 NewDeclsFound |=
8777 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8778
8779 return NewDeclsFound;
8780}
8781
8783 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8784 SmallVectorImpl<Decl *> &Decls) {
8785 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8786
8787 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8788 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8789 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8790 auto K = (Decl::Kind)+LexicalDecls[I];
8791 if (!IsKindWeWant(K))
8792 continue;
8793
8794 auto ID = (DeclID) + LexicalDecls[I + 1];
8795
8796 // Don't add predefined declarations to the lexical context more
8797 // than once.
8798 if (ID < NUM_PREDEF_DECL_IDS) {
8799 if (PredefsVisited[ID])
8800 continue;
8801
8802 PredefsVisited[ID] = true;
8803 }
8804
8805 if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8806 assert(D->getKind() == K && "wrong kind for lexical decl");
8807 if (!DC->isDeclInLexicalTraversal(D))
8808 Decls.push_back(D);
8809 }
8810 }
8811 };
8812
8813 if (isa<TranslationUnitDecl>(DC)) {
8814 for (const auto &Lexical : TULexicalDecls)
8815 Visit(Lexical.first, Lexical.second);
8816 } else {
8817 auto I = LexicalDecls.find(DC);
8818 if (I != LexicalDecls.end())
8819 Visit(I->second.first, I->second.second);
8820 }
8821
8822 ++NumLexicalDeclContextsRead;
8823}
8824
8825namespace {
8826
8827class UnalignedDeclIDComp {
8828 ASTReader &Reader;
8829 ModuleFile &Mod;
8830
8831public:
8832 UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8833 : Reader(Reader), Mod(M) {}
8834
8835 bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8836 SourceLocation LHS = getLocation(L);
8837 SourceLocation RHS = getLocation(R);
8838 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8839 }
8840
8841 bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8842 SourceLocation RHS = getLocation(R);
8843 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8844 }
8845
8846 bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8847 SourceLocation LHS = getLocation(L);
8848 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8849 }
8850
8851 SourceLocation getLocation(unaligned_decl_id_t ID) const {
8852 return Reader.getSourceManager().getFileLoc(
8854 Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8855 }
8856};
8857
8858} // namespace
8859
8861 unsigned Offset, unsigned Length,
8862 SmallVectorImpl<Decl *> &Decls) {
8864
8865 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
8866 if (I == FileDeclIDs.end())
8867 return;
8868
8869 FileDeclsInfo &DInfo = I->second;
8870 if (DInfo.Decls.empty())
8871 return;
8872
8874 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
8875 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
8876
8877 UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
8879 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8880 if (BeginIt != DInfo.Decls.begin())
8881 --BeginIt;
8882
8883 // If we are pointing at a top-level decl inside an objc container, we need
8884 // to backtrack until we find it otherwise we will fail to report that the
8885 // region overlaps with an objc container.
8886 while (BeginIt != DInfo.Decls.begin() &&
8887 GetDecl(getGlobalDeclID(*DInfo.Mod,
8888 LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
8889 ->isTopLevelDeclInObjCContainer())
8890 --BeginIt;
8891
8893 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8894 if (EndIt != DInfo.Decls.end())
8895 ++EndIt;
8896
8897 for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
8898 ++DIt)
8899 Decls.push_back(GetDecl(getGlobalDeclID(
8900 *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
8901}
8902
8904 DeclarationName Name,
8905 const DeclContext *OriginalDC) {
8906 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
8907 "DeclContext has no visible decls in storage");
8908 if (!Name)
8909 return false;
8910
8911 // Load the list of declarations.
8912 DeclsSet DS;
8913
8914 auto Find = [&, this](auto &&Table, auto &&Key) {
8915 for (GlobalDeclID ID : Table.find(Key)) {
8917 if (ND->getDeclName() != Name)
8918 continue;
8919 // Special case for namespaces: There can be a lot of redeclarations of
8920 // some namespaces, and we import a "key declaration" per imported module.
8921 // Since all declarations of a namespace are essentially interchangeable,
8922 // we can optimize namespace look-up by only storing the key declaration
8923 // of the current TU, rather than storing N key declarations where N is
8924 // the # of imported modules that declare that namespace.
8925 // TODO: Try to generalize this optimization to other redeclarable decls.
8926 if (isa<NamespaceDecl>(ND))
8928 DS.insert(ND);
8929 }
8930 };
8931
8932 Deserializing LookupResults(this);
8933
8934 // FIXME: Clear the redundancy with templated lambda in C++20 when that's
8935 // available.
8936 if (auto It = Lookups.find(DC); It != Lookups.end()) {
8937 ++NumVisibleDeclContextsRead;
8938 Find(It->second.Table, Name);
8939 }
8940
8941 auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
8942 if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8943 ++NumModuleLocalVisibleDeclContexts;
8944 Find(It->second.Table, std::make_pair(Name, NamedModule));
8945 }
8946 };
8947 if (auto *NamedModule =
8948 OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8949 : nullptr)
8950 FindModuleLocalLookup(NamedModule);
8951 // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
8952 // We're going to find a decl but the decl context of the lookup is
8953 // unspecified. In this case, the OriginalDC may be the decl context in other
8954 // module.
8955 if (ContextObj && ContextObj->getCurrentNamedModule())
8956 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8957
8958 if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8959 ++NumTULocalVisibleDeclContexts;
8960 Find(It->second.Table, Name);
8961 }
8962
8963 SetExternalVisibleDeclsForName(DC, Name, DS);
8964 return !DS.empty();
8965}
8966
8968 if (!DC->hasExternalVisibleStorage())
8969 return;
8970
8971 DeclsMap Decls;
8972
8973 auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
8974 auto It = LookupTables.find(DC);
8975 if (It == LookupTables.end())
8976 return;
8977
8978 NumRead++;
8979
8980 for (GlobalDeclID ID : It->second.Table.findAll()) {
8982 // Special case for namespaces: There can be a lot of redeclarations of
8983 // some namespaces, and we import a "key declaration" per imported module.
8984 // Since all declarations of a namespace are essentially interchangeable,
8985 // we can optimize namespace look-up by only storing the key declaration
8986 // of the current TU, rather than storing N key declarations where N is
8987 // the # of imported modules that declare that namespace.
8988 // TODO: Try to generalize this optimization to other redeclarable decls.
8989 if (isa<NamespaceDecl>(ND))
8991 Decls[ND->getDeclName()].insert(ND);
8992 }
8993
8994 // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
8995 };
8996
8997 findAll(Lookups, NumVisibleDeclContextsRead);
8998 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8999 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9000
9001 for (auto &[Name, DS] : Decls)
9002 SetExternalVisibleDeclsForName(DC, Name, DS);
9003
9004 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
9005}
9006
9009 auto I = Lookups.find(Primary);
9010 return I == Lookups.end() ? nullptr : &I->second;
9011}
9012
9015 auto I = ModuleLocalLookups.find(Primary);
9016 return I == ModuleLocalLookups.end() ? nullptr : &I->second;
9017}
9018
9021 auto I = TULocalLookups.find(Primary);
9022 return I == TULocalLookups.end() ? nullptr : &I->second;
9023}
9024
9027 assert(D->isCanonicalDecl());
9028 auto &LookupTable =
9029 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9030 auto I = LookupTable.find(D);
9031 return I == LookupTable.end() ? nullptr : &I->second;
9032}
9033
9035 assert(D->isCanonicalDecl());
9036 return PartialSpecializationsLookups.contains(D) ||
9037 SpecializationsLookups.contains(D);
9038}
9039
9040/// Under non-PCH compilation the consumer receives the objc methods
9041/// before receiving the implementation, and codegen depends on this.
9042/// We simulate this by deserializing and passing to consumer the methods of the
9043/// implementation before passing the deserialized implementation decl.
9045 ASTConsumer *Consumer) {
9046 assert(ImplD && Consumer);
9047
9048 for (auto *I : ImplD->methods())
9049 Consumer->HandleInterestingDecl(DeclGroupRef(I));
9050
9051 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
9052}
9053
9054void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9055 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9056 PassObjCImplDeclToConsumer(ImplD, Consumer);
9057 else
9058 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9059}
9060
9061void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9062 Consumer->HandleVTable(RD);
9063}
9064
9066 this->Consumer = Consumer;
9067
9068 if (Consumer)
9069 PassInterestingDeclsToConsumer();
9070
9071 if (DeserializationListener)
9072 DeserializationListener->ReaderInitialized(this);
9073}
9074
9076 std::fprintf(stderr, "*** AST File Statistics:\n");
9077
9078 unsigned NumTypesLoaded =
9079 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
9080 unsigned NumDeclsLoaded =
9081 DeclsLoaded.size() -
9082 llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
9083 unsigned NumIdentifiersLoaded =
9084 IdentifiersLoaded.size() -
9085 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
9086 unsigned NumMacrosLoaded =
9087 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
9088 unsigned NumSelectorsLoaded =
9089 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
9090
9091 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
9092 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
9093 NumSLocEntriesRead, TotalNumSLocEntries,
9094 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9095 if (!TypesLoaded.empty())
9096 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
9097 NumTypesLoaded, (unsigned)TypesLoaded.size(),
9098 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
9099 if (!DeclsLoaded.empty())
9100 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
9101 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
9102 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9103 if (!IdentifiersLoaded.empty())
9104 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
9105 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
9106 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9107 if (!MacrosLoaded.empty())
9108 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9109 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
9110 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9111 if (!SelectorsLoaded.empty())
9112 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
9113 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
9114 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9115 if (TotalNumStatements)
9116 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
9117 NumStatementsRead, TotalNumStatements,
9118 ((float)NumStatementsRead/TotalNumStatements * 100));
9119 if (TotalNumMacros)
9120 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9121 NumMacrosRead, TotalNumMacros,
9122 ((float)NumMacrosRead/TotalNumMacros * 100));
9123 if (TotalLexicalDeclContexts)
9124 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
9125 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9126 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9127 * 100));
9128 if (TotalVisibleDeclContexts)
9129 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
9130 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9131 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9132 * 100));
9133 if (TotalModuleLocalVisibleDeclContexts)
9134 std::fprintf(
9135 stderr, " %u/%u module local visible declcontexts read (%f%%)\n",
9136 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9137 ((float)NumModuleLocalVisibleDeclContexts /
9138 TotalModuleLocalVisibleDeclContexts * 100));
9139 if (TotalTULocalVisibleDeclContexts)
9140 std::fprintf(stderr, " %u/%u visible declcontexts in GMF read (%f%%)\n",
9141 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9142 ((float)NumTULocalVisibleDeclContexts /
9143 TotalTULocalVisibleDeclContexts * 100));
9144 if (TotalNumMethodPoolEntries)
9145 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
9146 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9147 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9148 * 100));
9149 if (NumMethodPoolLookups)
9150 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
9151 NumMethodPoolHits, NumMethodPoolLookups,
9152 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9153 if (NumMethodPoolTableLookups)
9154 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
9155 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9156 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9157 * 100.0));
9158 if (NumIdentifierLookupHits)
9159 std::fprintf(stderr,
9160 " %u / %u identifier table lookups succeeded (%f%%)\n",
9161 NumIdentifierLookupHits, NumIdentifierLookups,
9162 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9163
9164 if (GlobalIndex) {
9165 std::fprintf(stderr, "\n");
9166 GlobalIndex->printStats();
9167 }
9168
9169 std::fprintf(stderr, "\n");
9170 dump();
9171 std::fprintf(stderr, "\n");
9172}
9173
9174template<typename Key, typename ModuleFile, unsigned InitialCapacity>
9175LLVM_DUMP_METHOD static void
9176dumpModuleIDMap(StringRef Name,
9177 const ContinuousRangeMap<Key, ModuleFile *,
9178 InitialCapacity> &Map) {
9179 if (Map.begin() == Map.end())
9180 return;
9181
9183
9184 llvm::errs() << Name << ":\n";
9185 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9186 I != IEnd; ++I)
9187 llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName
9188 << "\n";
9189}
9190
9191LLVM_DUMP_METHOD void ASTReader::dump() {
9192 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
9193 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
9194 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
9195 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
9196 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
9197 dumpModuleIDMap("Global preprocessed entity map",
9198 GlobalPreprocessedEntityMap);
9199
9200 llvm::errs() << "\n*** PCH/Modules Loaded:";
9201 for (ModuleFile &M : ModuleMgr)
9202 M.dump();
9203}
9204
9205/// Return the amount of memory used by memory buffers, breaking down
9206/// by heap-backed versus mmap'ed memory.
9208 for (ModuleFile &I : ModuleMgr) {
9209 if (llvm::MemoryBuffer *buf = I.Buffer) {
9210 size_t bytes = buf->getBufferSize();
9211 switch (buf->getBufferKind()) {
9212 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9213 sizes.malloc_bytes += bytes;
9214 break;
9215 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9216 sizes.mmap_bytes += bytes;
9217 break;
9218 }
9219 }
9220 }
9221}
9222
9224 SemaObj = &S;
9225 S.addExternalSource(this);
9226
9227 // Makes sure any declarations that were deserialized "too early"
9228 // still get added to the identifier's declaration chains.
9229 for (GlobalDeclID ID : PreloadedDeclIDs) {
9231 pushExternalDeclIntoScope(D, D->getDeclName());
9232 }
9233 PreloadedDeclIDs.clear();
9234
9235 // FIXME: What happens if these are changed by a module import?
9236 if (!FPPragmaOptions.empty()) {
9237 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
9238 FPOptionsOverride NewOverrides =
9239 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
9240 SemaObj->CurFPFeatures =
9241 NewOverrides.applyOverrides(SemaObj->getLangOpts());
9242 }
9243
9244 for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
9245 Decl *D = GetDecl(ID);
9246 if (auto *FD = dyn_cast<FunctionDecl>(D))
9247 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9248 else if (auto *BD = dyn_cast<BlockDecl>(D))
9249 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9250 else
9251 llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
9252 }
9253 DeclsWithEffectsToVerify.clear();
9254
9255 SemaObj->OpenCLFeatures = OpenCLExtensions;
9256
9257 UpdateSema();
9258}
9259
9261 assert(SemaObj && "no Sema to update");
9262
9263 // Load the offsets of the declarations that Sema references.
9264 // They will be lazily deserialized when needed.
9265 if (!SemaDeclRefs.empty()) {
9266 assert(SemaDeclRefs.size() % 3 == 0);
9267 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9268 if (!SemaObj->StdNamespace)
9269 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9270 if (!SemaObj->StdBadAlloc)
9271 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9272 if (!SemaObj->StdAlignValT)
9273 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9274 }
9275 SemaDeclRefs.clear();
9276 }
9277
9278 // Update the state of pragmas. Use the same API as if we had encountered the
9279 // pragma in the source.
9280 if(OptimizeOffPragmaLocation.isValid())
9281 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
9282 if (PragmaMSStructState != -1)
9283 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
9284 if (PointersToMembersPragmaLocation.isValid()) {
9285 SemaObj->ActOnPragmaMSPointersToMembers(
9287 PragmaMSPointersToMembersState,
9288 PointersToMembersPragmaLocation);
9289 }
9290 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9291 if (!RISCVVecIntrinsicPragma.empty()) {
9292 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9293 "Wrong number of RISCVVecIntrinsicPragma");
9294 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9295 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9296 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9297 }
9298
9299 if (PragmaAlignPackCurrentValue) {
9300 // The bottom of the stack might have a default value. It must be adjusted
9301 // to the current value to ensure that the packing state is preserved after
9302 // popping entries that were included/imported from a PCH/module.
9303 bool DropFirst = false;
9304 if (!PragmaAlignPackStack.empty() &&
9305 PragmaAlignPackStack.front().Location.isInvalid()) {
9306 assert(PragmaAlignPackStack.front().Value ==
9307 SemaObj->AlignPackStack.DefaultValue &&
9308 "Expected a default alignment value");
9309 SemaObj->AlignPackStack.Stack.emplace_back(
9310 PragmaAlignPackStack.front().SlotLabel,
9311 SemaObj->AlignPackStack.CurrentValue,
9312 SemaObj->AlignPackStack.CurrentPragmaLocation,
9313 PragmaAlignPackStack.front().PushLocation);
9314 DropFirst = true;
9315 }
9316 for (const auto &Entry :
9317 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9318 SemaObj->AlignPackStack.Stack.emplace_back(
9319 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9320 }
9321 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9322 assert(*PragmaAlignPackCurrentValue ==
9323 SemaObj->AlignPackStack.DefaultValue &&
9324 "Expected a default align and pack value");
9325 // Keep the current values.
9326 } else {
9327 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9328 SemaObj->AlignPackStack.CurrentPragmaLocation =
9329 PragmaAlignPackCurrentLocation;
9330 }
9331 }
9332 if (FpPragmaCurrentValue) {
9333 // The bottom of the stack might have a default value. It must be adjusted
9334 // to the current value to ensure that fp-pragma state is preserved after
9335 // popping entries that were included/imported from a PCH/module.
9336 bool DropFirst = false;
9337 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9338 assert(FpPragmaStack.front().Value ==
9339 SemaObj->FpPragmaStack.DefaultValue &&
9340 "Expected a default pragma float_control value");
9341 SemaObj->FpPragmaStack.Stack.emplace_back(
9342 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9343 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9344 FpPragmaStack.front().PushLocation);
9345 DropFirst = true;
9346 }
9347 for (const auto &Entry :
9348 llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
9349 SemaObj->FpPragmaStack.Stack.emplace_back(
9350 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9351 if (FpPragmaCurrentLocation.isInvalid()) {
9352 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9353 "Expected a default pragma float_control value");
9354 // Keep the current values.
9355 } else {
9356 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9357 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9358 }
9359 }
9360
9361 // For non-modular AST files, restore visiblity of modules.
9362 for (auto &Import : PendingImportedModulesSema) {
9363 if (Import.ImportLoc.isInvalid())
9364 continue;
9365 if (Module *Imported = getSubmodule(Import.ID)) {
9366 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9367 }
9368 }
9369 PendingImportedModulesSema.clear();
9370}
9371
9373 // Note that we are loading an identifier.
9374 Deserializing AnIdentifier(this);
9375
9376 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
9377 NumIdentifierLookups,
9378 NumIdentifierLookupHits);
9379
9380 // We don't need to do identifier table lookups in C++ modules (we preload
9381 // all interesting declarations, and don't need to use the scope for name
9382 // lookups). Perform the lookup in PCH files, though, since we don't build
9383 // a complete initial identifier table if we're carrying on from a PCH.
9384 if (PP.getLangOpts().CPlusPlus) {
9385 for (auto *F : ModuleMgr.pch_modules())
9386 if (Visitor(*F))
9387 break;
9388 } else {
9389 // If there is a global index, look there first to determine which modules
9390 // provably do not have any results for this identifier.
9392 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9393 if (!loadGlobalIndex()) {
9394 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9395 HitsPtr = &Hits;
9396 }
9397 }
9398
9399 ModuleMgr.visit(Visitor, HitsPtr);
9400 }
9401
9402 IdentifierInfo *II = Visitor.getIdentifierInfo();
9404 return II;
9405}
9406
9407namespace clang {
9408
9409 /// An identifier-lookup iterator that enumerates all of the
9410 /// identifiers stored within a set of AST files.
9412 /// The AST reader whose identifiers are being enumerated.
9413 const ASTReader &Reader;
9414
9415 /// The current index into the chain of AST files stored in
9416 /// the AST reader.
9417 unsigned Index;
9418
9419 /// The current position within the identifier lookup table
9420 /// of the current AST file.
9421 ASTIdentifierLookupTable::key_iterator Current;
9422
9423 /// The end position within the identifier lookup table of
9424 /// the current AST file.
9425 ASTIdentifierLookupTable::key_iterator End;
9426
9427 /// Whether to skip any modules in the ASTReader.
9428 bool SkipModules;
9429
9430 public:
9431 explicit ASTIdentifierIterator(const ASTReader &Reader,
9432 bool SkipModules = false);
9433
9434 StringRef Next() override;
9435 };
9436
9437} // namespace clang
9438
9440 bool SkipModules)
9441 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9442}
9443
9445 while (Current == End) {
9446 // If we have exhausted all of our AST files, we're done.
9447 if (Index == 0)
9448 return StringRef();
9449
9450 --Index;
9451 ModuleFile &F = Reader.ModuleMgr[Index];
9452 if (SkipModules && F.isModule())
9453 continue;
9454
9455 ASTIdentifierLookupTable *IdTable =
9457 Current = IdTable->key_begin();
9458 End = IdTable->key_end();
9459 }
9460
9461 // We have any identifiers remaining in the current AST file; return
9462 // the next one.
9463 StringRef Result = *Current;
9464 ++Current;
9465 return Result;
9466}
9467
9468namespace {
9469
9470/// A utility for appending two IdentifierIterators.
9471class ChainedIdentifierIterator : public IdentifierIterator {
9472 std::unique_ptr<IdentifierIterator> Current;
9473 std::unique_ptr<IdentifierIterator> Queued;
9474
9475public:
9476 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9477 std::unique_ptr<IdentifierIterator> Second)
9478 : Current(std::move(First)), Queued(std::move(Second)) {}
9479
9480 StringRef Next() override {
9481 if (!Current)
9482 return StringRef();
9483
9484 StringRef result = Current->Next();
9485 if (!result.empty())
9486 return result;
9487
9488 // Try the queued iterator, which may itself be empty.
9489 Current.reset();
9490 std::swap(Current, Queued);
9491 return Next();
9492 }
9493};
9494
9495} // namespace
9496
9498 if (!loadGlobalIndex()) {
9499 std::unique_ptr<IdentifierIterator> ReaderIter(
9500 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9501 std::unique_ptr<IdentifierIterator> ModulesIter(
9502 GlobalIndex->createIdentifierIterator());
9503 return new ChainedIdentifierIterator(std::move(ReaderIter),
9504 std::move(ModulesIter));
9505 }
9506
9507 return new ASTIdentifierIterator(*this);
9508}
9509
9510namespace clang {
9511namespace serialization {
9512
9514 ASTReader &Reader;
9515 Selector Sel;
9516 unsigned PriorGeneration;
9517 unsigned InstanceBits = 0;
9518 unsigned FactoryBits = 0;
9519 bool InstanceHasMoreThanOneDecl = false;
9520 bool FactoryHasMoreThanOneDecl = false;
9521 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9522 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9523
9524 public:
9526 unsigned PriorGeneration)
9527 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9528
9530 if (!M.SelectorLookupTable)
9531 return false;
9532
9533 // If we've already searched this module file, skip it now.
9534 if (M.Generation <= PriorGeneration)
9535 return true;
9536
9537 ++Reader.NumMethodPoolTableLookups;
9538 ASTSelectorLookupTable *PoolTable
9540 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9541 if (Pos == PoolTable->end())
9542 return false;
9543
9544 ++Reader.NumMethodPoolTableHits;
9545 ++Reader.NumSelectorsRead;
9546 // FIXME: Not quite happy with the statistics here. We probably should
9547 // disable this tracking when called via LoadSelector.
9548 // Also, should entries without methods count as misses?
9549 ++Reader.NumMethodPoolEntriesRead;
9551 if (Reader.DeserializationListener)
9552 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9553
9554 // Append methods in the reverse order, so that later we can process them
9555 // in the order they appear in the source code by iterating through
9556 // the vector in the reverse order.
9557 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9558 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9559 InstanceBits = Data.InstanceBits;
9560 FactoryBits = Data.FactoryBits;
9561 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9562 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9563 return false;
9564 }
9565
9566 /// Retrieve the instance methods found by this visitor.
9568 return InstanceMethods;
9569 }
9570
9571 /// Retrieve the instance methods found by this visitor.
9573 return FactoryMethods;
9574 }
9575
9576 unsigned getInstanceBits() const { return InstanceBits; }
9577 unsigned getFactoryBits() const { return FactoryBits; }
9578
9580 return InstanceHasMoreThanOneDecl;
9581 }
9582
9583 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9584 };
9585
9586} // namespace serialization
9587} // namespace clang
9588
9589/// Add the given set of methods to the method list.
9591 ObjCMethodList &List) {
9592 for (ObjCMethodDecl *M : llvm::reverse(Methods))
9593 S.ObjC().addMethodToGlobalList(&List, M);
9594}
9595
9597 // Get the selector generation and update it to the current generation.
9598 unsigned &Generation = SelectorGeneration[Sel];
9599 unsigned PriorGeneration = Generation;
9600 Generation = getGeneration();
9601 SelectorOutOfDate[Sel] = false;
9602
9603 // Search for methods defined with this selector.
9604 ++NumMethodPoolLookups;
9605 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9606 ModuleMgr.visit(Visitor);
9607
9608 if (Visitor.getInstanceMethods().empty() &&
9609 Visitor.getFactoryMethods().empty())
9610 return;
9611
9612 ++NumMethodPoolHits;
9613
9614 if (!getSema())
9615 return;
9616
9617 Sema &S = *getSema();
9618 auto &Methods = S.ObjC().MethodPool[Sel];
9619
9620 Methods.first.setBits(Visitor.getInstanceBits());
9621 Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9622 Methods.second.setBits(Visitor.getFactoryBits());
9623 Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9624
9625 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9626 // when building a module we keep every method individually and may need to
9627 // update hasMoreThanOneDecl as we add the methods.
9628 addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9629 addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9630}
9631
9633 if (SelectorOutOfDate[Sel])
9634 ReadMethodPool(Sel);
9635}
9636
9639 Namespaces.clear();
9640
9641 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9642 if (NamespaceDecl *Namespace
9643 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9644 Namespaces.push_back(Namespace);
9645 }
9646}
9647
9649 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9650 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9651 UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9654 Undefined.insert(std::make_pair(D, Loc));
9655 }
9656 UndefinedButUsed.clear();
9657}
9658
9660 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9661 Exprs) {
9662 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9663 FieldDecl *FD =
9664 cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9665 uint64_t Count = DelayedDeleteExprs[Idx++];
9666 for (uint64_t C = 0; C < Count; ++C) {
9667 SourceLocation DeleteLoc =
9668 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9669 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9670 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9671 }
9672 }
9673}
9674
9676 SmallVectorImpl<VarDecl *> &TentativeDefs) {
9677 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9678 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9679 if (Var)
9680 TentativeDefs.push_back(Var);
9681 }
9682 TentativeDefinitions.clear();
9683}
9684
9687 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9689 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9690 if (D)
9691 Decls.push_back(D);
9692 }
9693 UnusedFileScopedDecls.clear();
9694}
9695
9698 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9700 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9701 if (D)
9702 Decls.push_back(D);
9703 }
9704 DelegatingCtorDecls.clear();
9705}
9706
9708 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9710 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9711 if (D)
9712 Decls.push_back(D);
9713 }
9714 ExtVectorDecls.clear();
9715}
9716
9719 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9720 ++I) {
9721 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9722 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9723 if (D)
9724 Decls.insert(D);
9725 }
9726 UnusedLocalTypedefNameCandidates.clear();
9727}
9728
9731 for (auto I : DeclsToCheckForDeferredDiags) {
9732 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9733 if (D)
9734 Decls.insert(D);
9735 }
9736 DeclsToCheckForDeferredDiags.clear();
9737}
9738
9740 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9741 if (ReferencedSelectorsData.empty())
9742 return;
9743
9744 // If there are @selector references added them to its pool. This is for
9745 // implementation of -Wselector.
9746 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9747 unsigned I = 0;
9748 while (I < DataSize) {
9749 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9750 SourceLocation SelLoc
9751 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9752 Sels.push_back(std::make_pair(Sel, SelLoc));
9753 }
9754 ReferencedSelectorsData.clear();
9755}
9756
9758 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9759 if (WeakUndeclaredIdentifiers.empty())
9760 return;
9761
9762 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9763 IdentifierInfo *WeakId
9764 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9765 IdentifierInfo *AliasId
9766 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9767 SourceLocation Loc =
9768 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9769 WeakInfo WI(AliasId, Loc);
9770 WeakIDs.push_back(std::make_pair(WeakId, WI));
9771 }
9772 WeakUndeclaredIdentifiers.clear();
9773}
9774
9776 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9777 if (ExtnameUndeclaredIdentifiers.empty())
9778 return;
9779
9780 for (unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9781 IdentifierInfo *NameId =
9782 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I]);
9783 IdentifierInfo *ExtnameId =
9784 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I + 1]);
9785 SourceLocation Loc =
9786 SourceLocation::getFromRawEncoding(ExtnameUndeclaredIdentifiers[I + 2]);
9787 AsmLabelAttr *Attr = AsmLabelAttr::CreateImplicit(
9788 getContext(), ExtnameId->getName(),
9789 AttributeCommonInfo(ExtnameId, SourceRange(Loc),
9791 ExtnameIDs.push_back(std::make_pair(NameId, Attr));
9792 }
9793 ExtnameUndeclaredIdentifiers.clear();
9794}
9795
9797 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9799 VTableUse &TableInfo = VTableUses[Idx++];
9800 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9801 VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9802 VT.DefinitionRequired = TableInfo.Used;
9803 VTables.push_back(VT);
9804 }
9805
9806 VTableUses.clear();
9807}
9808
9810 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9811 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9812 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9813 ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9815
9816 Pending.push_back(std::make_pair(D, Loc));
9817 }
9818 PendingInstantiations.clear();
9819}
9820
9822 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9823 &LPTMap) {
9824 for (auto &LPT : LateParsedTemplates) {
9825 ModuleFile *FMod = LPT.first;
9826 RecordDataImpl &LateParsed = LPT.second;
9827 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9828 /* In loop */) {
9829 FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9830
9831 auto LT = std::make_unique<LateParsedTemplate>();
9832 LT->D = ReadDecl(*FMod, LateParsed, Idx);
9833 LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9834
9835 ModuleFile *F = getOwningModuleFile(LT->D);
9836 assert(F && "No module");
9837
9838 unsigned TokN = LateParsed[Idx++];
9839 LT->Toks.reserve(TokN);
9840 for (unsigned T = 0; T < TokN; ++T)
9841 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9842
9843 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9844 }
9845 }
9846
9847 LateParsedTemplates.clear();
9848}
9849
9851 if (!Lambda->getLambdaContextDecl())
9852 return;
9853
9854 auto LambdaInfo =
9855 std::make_pair(Lambda->getLambdaContextDecl()->getCanonicalDecl(),
9856 Lambda->getLambdaIndexInContext());
9857
9858 // Handle the import and then include case for lambdas.
9859 if (auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9860 Iter != LambdaDeclarationsForMerging.end() &&
9861 Iter->second->isFromASTFile() && Lambda->getFirstDecl() == Lambda) {
9863 cast<CXXRecordDecl>(Iter->second)->getMostRecentDecl();
9864 Lambda->setPreviousDecl(Previous);
9865 return;
9866 }
9867
9868 // Keep track of this lambda so it can be merged with another lambda that
9869 // is loaded later.
9870 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9871}
9872
9874 // It would be complicated to avoid reading the methods anyway. So don't.
9875 ReadMethodPool(Sel);
9876}
9877
9879 assert(ID && "Non-zero identifier ID required");
9880 unsigned Index = translateIdentifierIDToIndex(ID).second;
9881 assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
9882 IdentifiersLoaded[Index] = II;
9883 if (DeserializationListener)
9884 DeserializationListener->IdentifierRead(ID, II);
9885}
9886
9887/// Set the globally-visible declarations associated with the given
9888/// identifier.
9889///
9890/// If the AST reader is currently in a state where the given declaration IDs
9891/// cannot safely be resolved, they are queued until it is safe to resolve
9892/// them.
9893///
9894/// \param II an IdentifierInfo that refers to one or more globally-visible
9895/// declarations.
9896///
9897/// \param DeclIDs the set of declaration IDs with the name @p II that are
9898/// visible at global scope.
9899///
9900/// \param Decls if non-null, this vector will be populated with the set of
9901/// deserialized declarations. These declarations will not be pushed into
9902/// scope.
9905 SmallVectorImpl<Decl *> *Decls) {
9906 if (NumCurrentElementsDeserializing && !Decls) {
9907 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9908 return;
9909 }
9910
9911 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9912 if (!SemaObj) {
9913 // Queue this declaration so that it will be added to the
9914 // translation unit scope and identifier's declaration chain
9915 // once a Sema object is known.
9916 PreloadedDeclIDs.push_back(DeclIDs[I]);
9917 continue;
9918 }
9919
9920 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
9921
9922 // If we're simply supposed to record the declarations, do so now.
9923 if (Decls) {
9924 Decls->push_back(D);
9925 continue;
9926 }
9927
9928 // Introduce this declaration into the translation-unit scope
9929 // and add it to the declaration chain for this identifier, so
9930 // that (unqualified) name lookup will find it.
9931 pushExternalDeclIntoScope(D, II);
9932 }
9933}
9934
9935std::pair<ModuleFile *, unsigned>
9936ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
9937 if (ID == 0)
9938 return {nullptr, 0};
9939
9940 unsigned ModuleFileIndex = ID >> 32;
9941 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9942
9943 assert(ModuleFileIndex && "not translating loaded IdentifierID?");
9944 assert(getModuleManager().size() > ModuleFileIndex - 1);
9945
9946 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
9947 assert(LocalID < MF.LocalNumIdentifiers);
9948 return {&MF, MF.BaseIdentifierID + LocalID};
9949}
9950
9952 if (ID == 0)
9953 return nullptr;
9954
9955 if (IdentifiersLoaded.empty()) {
9956 Error("no identifier table in AST file");
9957 return nullptr;
9958 }
9959
9960 auto [M, Index] = translateIdentifierIDToIndex(ID);
9961 if (!IdentifiersLoaded[Index]) {
9962 assert(M != nullptr && "Untranslated Identifier ID?");
9963 assert(Index >= M->BaseIdentifierID);
9964 unsigned LocalIndex = Index - M->BaseIdentifierID;
9965 const unsigned char *Data =
9966 M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
9967
9968 ASTIdentifierLookupTrait Trait(*this, *M);
9969 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
9970 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
9971 auto &II = PP.getIdentifierTable().get(Key);
9972 IdentifiersLoaded[Index] = &II;
9973 bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
9974 markIdentifierFromAST(*this, II, IsModule);
9975 if (DeserializationListener)
9976 DeserializationListener->IdentifierRead(ID, &II);
9977 }
9978
9979 return IdentifiersLoaded[Index];
9980}
9981
9985
9987 if (LocalID < NUM_PREDEF_IDENT_IDS)
9988 return LocalID;
9989
9990 if (!M.ModuleOffsetMap.empty())
9991 ReadModuleOffsetMap(M);
9992
9993 unsigned ModuleFileIndex = LocalID >> 32;
9994 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9995 ModuleFile *MF =
9996 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
9997 assert(MF && "malformed identifier ID encoding?");
9998
9999 if (!ModuleFileIndex)
10000 LocalID -= NUM_PREDEF_IDENT_IDS;
10001
10002 return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
10003}
10004
10005std::pair<ModuleFile *, unsigned>
10006ASTReader::translateMacroIDToIndex(MacroID ID) const {
10007 if (ID == 0)
10008 return {nullptr, 0};
10009
10010 unsigned ModuleFileIndex = ID >> 32;
10011 assert(ModuleFileIndex && "not translating loaded MacroID?");
10012 assert(getModuleManager().size() > ModuleFileIndex - 1);
10013 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10014
10015 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10016 assert(LocalID < MF.LocalNumMacros);
10017 return {&MF, MF.BaseMacroID + LocalID};
10018}
10019
10021 if (ID == 0)
10022 return nullptr;
10023
10024 if (MacrosLoaded.empty()) {
10025 Error("no macro table in AST file");
10026 return nullptr;
10027 }
10028
10029 auto [M, Index] = translateMacroIDToIndex(ID);
10030 if (!MacrosLoaded[Index]) {
10031 assert(M != nullptr && "Untranslated Macro ID?");
10032 assert(Index >= M->BaseMacroID);
10033 unsigned LocalIndex = Index - M->BaseMacroID;
10034 uint64_t DataOffset = M->MacroOffsetsBase + M->MacroOffsets[LocalIndex];
10035 MacrosLoaded[Index] = ReadMacroRecord(*M, DataOffset);
10036
10037 if (DeserializationListener)
10038 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10039 }
10040
10041 return MacrosLoaded[Index];
10042}
10043
10045 if (LocalID < NUM_PREDEF_MACRO_IDS)
10046 return LocalID;
10047
10048 if (!M.ModuleOffsetMap.empty())
10049 ReadModuleOffsetMap(M);
10050
10051 unsigned ModuleFileIndex = LocalID >> 32;
10052 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10053 ModuleFile *MF =
10054 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10055 assert(MF && "malformed identifier ID encoding?");
10056
10057 if (!ModuleFileIndex) {
10058 assert(LocalID >= NUM_PREDEF_MACRO_IDS);
10059 LocalID -= NUM_PREDEF_MACRO_IDS;
10060 }
10061
10062 return (static_cast<MacroID>(MF->Index + 1) << 32) | LocalID;
10063}
10064
10066ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
10067 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
10068 return LocalID;
10069
10070 if (!M.ModuleOffsetMap.empty())
10071 ReadModuleOffsetMap(M);
10072
10075 assert(I != M.SubmoduleRemap.end()
10076 && "Invalid index into submodule index remap");
10077
10078 return LocalID + I->second;
10079}
10080
10082 return getSubmodule(ID);
10083}
10084
10086 if (ID & 1) {
10087 // It's a module, look it up by submodule ID.
10088 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
10089 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
10090 } else {
10091 // It's a prefix (preamble, PCH, ...). Look it up by index.
10092 int IndexFromEnd = static_cast<int>(ID >> 1);
10093 assert(IndexFromEnd && "got reference to unknown module file");
10094 return getModuleManager().pch_modules().end()[-IndexFromEnd];
10095 }
10096}
10097
10099 if (!M)
10100 return 1;
10101
10102 // For a file representing a module, use the submodule ID of the top-level
10103 // module as the file ID. For any other kind of file, the number of such
10104 // files loaded beforehand will be the same on reload.
10105 // FIXME: Is this true even if we have an explicit module file and a PCH?
10106 if (M->isModule())
10107 return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
10108
10109 auto PCHModules = getModuleManager().pch_modules();
10110 auto I = llvm::find(PCHModules, M);
10111 assert(I != PCHModules.end() && "emitting reference to unknown file");
10112 return std::distance(I, PCHModules.end()) << 1;
10113}
10114
10115std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
10116 if (Module *M = getSubmodule(ID))
10117 return ASTSourceDescriptor(*M);
10118
10119 // If there is only a single PCH, return it instead.
10120 // Chained PCH are not supported.
10121 const auto &PCHChain = ModuleMgr.pch_modules();
10122 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10123 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10124 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
10125 StringRef FileName = llvm::sys::path::filename(MF.FileName);
10126 return ASTSourceDescriptor(ModuleName,
10127 llvm::sys::path::parent_path(MF.FileName),
10128 FileName, MF.Signature);
10129 }
10130 return std::nullopt;
10131}
10132
10134 auto I = DefinitionSource.find(FD);
10135 if (I == DefinitionSource.end())
10136 return EK_ReplyHazy;
10137 return I->second ? EK_Never : EK_Always;
10138}
10139
10141 return ThisDeclarationWasADefinitionSet.contains(FD);
10142}
10143
10145 return DecodeSelector(getGlobalSelectorID(M, LocalID));
10146}
10147
10149 if (ID == 0)
10150 return Selector();
10151
10152 if (ID > SelectorsLoaded.size()) {
10153 Error("selector ID out of range in AST file");
10154 return Selector();
10155 }
10156
10157 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
10158 // Load this selector from the selector table.
10159 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
10160 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
10161 ModuleFile &M = *I->second;
10162 ASTSelectorLookupTrait Trait(*this, M);
10163 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
10164 SelectorsLoaded[ID - 1] =
10165 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
10166 if (DeserializationListener)
10167 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10168 }
10169
10170 return SelectorsLoaded[ID - 1];
10171}
10172
10176
10178 // ID 0 (the null selector) is considered an external selector.
10179 return getTotalNumSelectors() + 1;
10180}
10181
10183ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
10184 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
10185 return LocalID;
10186
10187 if (!M.ModuleOffsetMap.empty())
10188 ReadModuleOffsetMap(M);
10189
10192 assert(I != M.SelectorRemap.end()
10193 && "Invalid index into selector index remap");
10194
10195 return LocalID + I->second;
10196}
10197
10223
10225 DeclarationNameInfo NameInfo;
10226 NameInfo.setName(readDeclarationName());
10227 NameInfo.setLoc(readSourceLocation());
10228 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
10229 return NameInfo;
10230}
10231
10235
10237 auto Kind = readInt();
10238 auto ResultType = readQualType();
10239 auto Value = readAPInt();
10240 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
10241 assert(Op.isValid());
10242 return Op;
10243}
10244
10247 unsigned NumTPLists = readInt();
10248 Info.NumTemplParamLists = NumTPLists;
10249 if (NumTPLists) {
10250 Info.TemplParamLists =
10251 new (getContext()) TemplateParameterList *[NumTPLists];
10252 for (unsigned i = 0; i != NumTPLists; ++i)
10254 }
10255}
10256
10259 SourceLocation TemplateLoc = readSourceLocation();
10260 SourceLocation LAngleLoc = readSourceLocation();
10261 SourceLocation RAngleLoc = readSourceLocation();
10262
10263 unsigned NumParams = readInt();
10265 Params.reserve(NumParams);
10266 while (NumParams--)
10267 Params.push_back(readDeclAs<NamedDecl>());
10268
10269 bool HasRequiresClause = readBool();
10270 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
10271
10273 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10274 return TemplateParams;
10275}
10276
10279 bool Canonicalize) {
10280 unsigned NumTemplateArgs = readInt();
10281 TemplArgs.reserve(NumTemplateArgs);
10282 while (NumTemplateArgs--)
10283 TemplArgs.push_back(readTemplateArgument(Canonicalize));
10284}
10285
10286/// Read a UnresolvedSet structure.
10288 unsigned NumDecls = readInt();
10289 Set.reserve(getContext(), NumDecls);
10290 while (NumDecls--) {
10291 GlobalDeclID ID = readDeclID();
10293 Set.addLazyDecl(getContext(), ID, AS);
10294 }
10295}
10296
10299 bool isVirtual = readBool();
10300 bool isBaseOfClass = readBool();
10301 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
10302 bool inheritConstructors = readBool();
10304 SourceRange Range = readSourceRange();
10305 SourceLocation EllipsisLoc = readSourceLocation();
10306 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
10307 EllipsisLoc);
10308 Result.setInheritConstructors(inheritConstructors);
10309 return Result;
10310}
10311
10314 ASTContext &Context = getContext();
10315 unsigned NumInitializers = readInt();
10316 assert(NumInitializers && "wrote ctor initializers but have no inits");
10317 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
10318 for (unsigned i = 0; i != NumInitializers; ++i) {
10319 TypeSourceInfo *TInfo = nullptr;
10320 bool IsBaseVirtual = false;
10321 FieldDecl *Member = nullptr;
10322 IndirectFieldDecl *IndirectMember = nullptr;
10323
10325 switch (Type) {
10327 TInfo = readTypeSourceInfo();
10328 IsBaseVirtual = readBool();
10329 break;
10330
10332 TInfo = readTypeSourceInfo();
10333 break;
10334
10337 break;
10338
10340 IndirectMember = readDeclAs<IndirectFieldDecl>();
10341 break;
10342 }
10343
10344 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
10345 Expr *Init = readExpr();
10346 SourceLocation LParenLoc = readSourceLocation();
10347 SourceLocation RParenLoc = readSourceLocation();
10348
10349 CXXCtorInitializer *BOMInit;
10351 BOMInit = new (Context)
10352 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
10353 RParenLoc, MemberOrEllipsisLoc);
10355 BOMInit = new (Context)
10356 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
10357 else if (Member)
10358 BOMInit = new (Context)
10359 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
10360 Init, RParenLoc);
10361 else
10362 BOMInit = new (Context)
10363 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
10364 LParenLoc, Init, RParenLoc);
10365
10366 if (/*IsWritten*/readBool()) {
10367 unsigned SourceOrder = readInt();
10368 BOMInit->setSourceOrder(SourceOrder);
10369 }
10370
10371 CtorInitializers[i] = BOMInit;
10372 }
10373
10374 return CtorInitializers;
10375}
10376
10379 ASTContext &Context = getContext();
10380 unsigned N = readInt();
10382 for (unsigned I = 0; I != N; ++I) {
10383 auto Kind = readNestedNameSpecifierKind();
10384 switch (Kind) {
10386 auto *NS = readDeclAs<NamespaceBaseDecl>();
10387 SourceRange Range = readSourceRange();
10388 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10389 break;
10390 }
10391
10394 if (!T)
10395 return NestedNameSpecifierLoc();
10396 SourceLocation ColonColonLoc = readSourceLocation();
10397 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10398 break;
10399 }
10400
10402 SourceLocation ColonColonLoc = readSourceLocation();
10403 Builder.MakeGlobal(Context, ColonColonLoc);
10404 break;
10405 }
10406
10409 SourceRange Range = readSourceRange();
10410 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10411 break;
10412 }
10413
10415 llvm_unreachable("unexpected null nested name specifier");
10416 }
10417 }
10418
10419 return Builder.getWithLocInContext(Context);
10420}
10421
10423 unsigned &Idx) {
10426 return SourceRange(beg, end);
10427}
10428
10430 const StringRef Blob) {
10431 unsigned Count = Record[0];
10432 const char *Byte = Blob.data();
10433 llvm::BitVector Ret = llvm::BitVector(Count, false);
10434 for (unsigned I = 0; I < Count; ++Byte)
10435 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10436 if (*Byte & (1 << Bit))
10437 Ret[I] = true;
10438 return Ret;
10439}
10440
10441/// Read a floating-point value
10442llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10443 return llvm::APFloat(Sem, readAPInt());
10444}
10445
10446// Read a string
10447std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10448 unsigned Len = Record[Idx++];
10449 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10450 Idx += Len;
10451 return Result;
10452}
10453
10454StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10455 StringRef &Blob) {
10456 unsigned Len = Record[Idx++];
10457 StringRef Result = Blob.substr(0, Len);
10458 Blob = Blob.substr(Len);
10459 return Result;
10460}
10461
10463 unsigned &Idx) {
10464 return ReadPath(F.BaseDirectory, Record, Idx);
10465}
10466
10467std::string ASTReader::ReadPath(StringRef BaseDirectory,
10468 const RecordData &Record, unsigned &Idx) {
10469 std::string Filename = ReadString(Record, Idx);
10470 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10471}
10472
10473std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10474 const RecordData &Record, unsigned &Idx,
10475 StringRef &Blob) {
10476 StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10477 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10478}
10479
10481 unsigned &Idx) {
10482 unsigned Major = Record[Idx++];
10483 unsigned Minor = Record[Idx++];
10484 unsigned Subminor = Record[Idx++];
10485 if (Minor == 0)
10486 return VersionTuple(Major);
10487 if (Subminor == 0)
10488 return VersionTuple(Major, Minor - 1);
10489 return VersionTuple(Major, Minor - 1, Subminor - 1);
10490}
10491
10498
10499DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10500 return Diag(CurrentImportLoc, DiagID);
10501}
10502
10504 return Diags.Report(Loc, DiagID);
10505}
10506
10508 llvm::function_ref<void()> Fn) {
10509 // When Sema is available, avoid duplicate errors.
10510 if (SemaObj) {
10511 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10512 return;
10513 }
10514
10515 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10516}
10517
10518/// Retrieve the identifier table associated with the
10519/// preprocessor.
10521 return PP.getIdentifierTable();
10522}
10523
10524/// Record that the given ID maps to the given switch-case
10525/// statement.
10527 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10528 "Already have a SwitchCase with this ID");
10529 (*CurrSwitchCaseStmts)[ID] = SC;
10530}
10531
10532/// Retrieve the switch-case statement with the given ID.
10534 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10535 return (*CurrSwitchCaseStmts)[ID];
10536}
10537
10539 CurrSwitchCaseStmts->clear();
10540}
10541
10543 ASTContext &Context = getContext();
10544 std::vector<RawComment *> Comments;
10545 for (SmallVectorImpl<std::pair<BitstreamCursor,
10547 I = CommentsCursors.begin(),
10548 E = CommentsCursors.end();
10549 I != E; ++I) {
10550 Comments.clear();
10551 BitstreamCursor &Cursor = I->first;
10552 serialization::ModuleFile &F = *I->second;
10553 SavedStreamPosition SavedPosition(Cursor);
10554
10556 while (true) {
10558 Cursor.advanceSkippingSubblocks(
10559 BitstreamCursor::AF_DontPopBlockAtEnd);
10560 if (!MaybeEntry) {
10561 Error(MaybeEntry.takeError());
10562 return;
10563 }
10564 llvm::BitstreamEntry Entry = MaybeEntry.get();
10565
10566 switch (Entry.Kind) {
10567 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10568 case llvm::BitstreamEntry::Error:
10569 Error("malformed block record in AST file");
10570 return;
10571 case llvm::BitstreamEntry::EndBlock:
10572 goto NextCursor;
10573 case llvm::BitstreamEntry::Record:
10574 // The interesting case.
10575 break;
10576 }
10577
10578 // Read a record.
10579 Record.clear();
10580 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10581 if (!MaybeComment) {
10582 Error(MaybeComment.takeError());
10583 return;
10584 }
10585 switch ((CommentRecordTypes)MaybeComment.get()) {
10586 case COMMENTS_RAW_COMMENT: {
10587 unsigned Idx = 0;
10588 SourceRange SR = ReadSourceRange(F, Record, Idx);
10591 bool IsTrailingComment = Record[Idx++];
10592 bool IsAlmostTrailingComment = Record[Idx++];
10593 Comments.push_back(new (Context) RawComment(
10594 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10595 break;
10596 }
10597 }
10598 }
10599 NextCursor:
10600 for (RawComment *C : Comments) {
10601 SourceLocation CommentLoc = C->getBeginLoc();
10602 if (CommentLoc.isValid()) {
10603 FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10604 if (Loc.first.isValid())
10605 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10606 }
10607 }
10608 }
10609}
10610
10612 serialization::ModuleFile &MF, bool IncludeSystem,
10613 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10614 bool IsSystem)>
10615 Visitor) {
10616 unsigned NumUserInputs = MF.NumUserInputFiles;
10617 unsigned NumInputs = MF.InputFilesLoaded.size();
10618 assert(NumUserInputs <= NumInputs);
10619 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10620 for (unsigned I = 0; I < N; ++I) {
10621 bool IsSystem = I >= NumUserInputs;
10622 InputFileInfo IFI = getInputFileInfo(MF, I+1);
10623 Visitor(IFI, IsSystem);
10624 }
10625}
10626
10628 bool IncludeSystem, bool Complain,
10629 llvm::function_ref<void(const serialization::InputFile &IF,
10630 bool isSystem)> Visitor) {
10631 unsigned NumUserInputs = MF.NumUserInputFiles;
10632 unsigned NumInputs = MF.InputFilesLoaded.size();
10633 assert(NumUserInputs <= NumInputs);
10634 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10635 for (unsigned I = 0; I < N; ++I) {
10636 bool IsSystem = I >= NumUserInputs;
10637 InputFile IF = getInputFile(MF, I+1, Complain);
10638 Visitor(IF, IsSystem);
10639 }
10640}
10641
10644 llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10645 unsigned NumInputs = MF.InputFilesLoaded.size();
10646 for (unsigned I = 0; I < NumInputs; ++I) {
10647 InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10648 if (IFI.TopLevel && IFI.ModuleMap)
10649 if (auto FE = getInputFile(MF, I + 1).getFile())
10650 Visitor(*FE);
10651 }
10652}
10653
10654void ASTReader::finishPendingActions() {
10655 while (!PendingIdentifierInfos.empty() ||
10656 !PendingDeducedFunctionTypes.empty() ||
10657 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10658 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10659 !PendingUpdateRecords.empty() ||
10660 !PendingObjCExtensionIvarRedeclarations.empty()) {
10661 // If any identifiers with corresponding top-level declarations have
10662 // been loaded, load those declarations now.
10663 using TopLevelDeclsMap =
10664 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10665 TopLevelDeclsMap TopLevelDecls;
10666
10667 while (!PendingIdentifierInfos.empty()) {
10668 IdentifierInfo *II = PendingIdentifierInfos.back().first;
10670 std::move(PendingIdentifierInfos.back().second);
10671 PendingIdentifierInfos.pop_back();
10672
10673 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10674 }
10675
10676 // Load each function type that we deferred loading because it was a
10677 // deduced type that might refer to a local type declared within itself.
10678 for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10679 auto *FD = PendingDeducedFunctionTypes[I].first;
10680 FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10681
10682 if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10683 // If we gave a function a deduced return type, remember that we need to
10684 // propagate that along the redeclaration chain.
10685 if (DT->isDeduced()) {
10686 PendingDeducedTypeUpdates.insert(
10687 {FD->getCanonicalDecl(), FD->getReturnType()});
10688 continue;
10689 }
10690
10691 // The function has undeduced DeduceType return type. We hope we can
10692 // find the deduced type by iterating the redecls in other modules
10693 // later.
10694 PendingUndeducedFunctionDecls.push_back(FD);
10695 continue;
10696 }
10697 }
10698 PendingDeducedFunctionTypes.clear();
10699
10700 // Load each variable type that we deferred loading because it was a
10701 // deduced type that might refer to a local type declared within itself.
10702 for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10703 auto *VD = PendingDeducedVarTypes[I].first;
10704 VD->setType(GetType(PendingDeducedVarTypes[I].second));
10705 }
10706 PendingDeducedVarTypes.clear();
10707
10708 // Load pending declaration chains.
10709 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10710 loadPendingDeclChain(PendingDeclChains[I].first,
10711 PendingDeclChains[I].second);
10712 PendingDeclChains.clear();
10713
10714 // Make the most recent of the top-level declarations visible.
10715 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10716 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10717 IdentifierInfo *II = TLD->first;
10718 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10719 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10720 }
10721 }
10722
10723 // Load any pending macro definitions.
10724 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10725 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10726 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10727 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10728 // Initialize the macro history from chained-PCHs ahead of module imports.
10729 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10730 ++IDIdx) {
10731 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10732 if (!Info.M->isModule())
10733 resolvePendingMacro(II, Info);
10734 }
10735 // Handle module imports.
10736 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10737 ++IDIdx) {
10738 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10739 if (Info.M->isModule())
10740 resolvePendingMacro(II, Info);
10741 }
10742 }
10743 PendingMacroIDs.clear();
10744
10745 // Wire up the DeclContexts for Decls that we delayed setting until
10746 // recursive loading is completed.
10747 while (!PendingDeclContextInfos.empty()) {
10748 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10749 PendingDeclContextInfos.pop_front();
10750 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10751 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10752 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10753 }
10754
10755 // Perform any pending declaration updates.
10756 while (!PendingUpdateRecords.empty()) {
10757 auto Update = PendingUpdateRecords.pop_back_val();
10758 ReadingKindTracker ReadingKind(Read_Decl, *this);
10759 loadDeclUpdateRecords(Update);
10760 }
10761
10762 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10763 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10764 auto DuplicateIvars =
10765 PendingObjCExtensionIvarRedeclarations.back().second;
10767 StructuralEquivalenceContext Ctx(
10768 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10769 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10770 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10771 /*Complain =*/false,
10772 /*ErrorOnTagTypeMismatch =*/true);
10773 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10774 // Merge redeclared ivars with their predecessors.
10775 for (auto IvarPair : DuplicateIvars) {
10776 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10777 // Change semantic DeclContext but keep the lexical one.
10778 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10779 Ivar->getLexicalDeclContext(),
10780 getContext());
10781 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10782 }
10783 // Invalidate duplicate extension and the cached ivar list.
10784 ExtensionsPair.first->setInvalidDecl();
10785 ExtensionsPair.second->getClassInterface()
10786 ->getDefinition()
10787 ->setIvarList(nullptr);
10788 } else {
10789 for (auto IvarPair : DuplicateIvars) {
10790 Diag(IvarPair.first->getLocation(),
10791 diag::err_duplicate_ivar_declaration)
10792 << IvarPair.first->getIdentifier();
10793 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10794 }
10795 }
10796 PendingObjCExtensionIvarRedeclarations.pop_back();
10797 }
10798 }
10799
10800 // At this point, all update records for loaded decls are in place, so any
10801 // fake class definitions should have become real.
10802 assert(PendingFakeDefinitionData.empty() &&
10803 "faked up a class definition but never saw the real one");
10804
10805 // If we deserialized any C++ or Objective-C class definitions, any
10806 // Objective-C protocol definitions, or any redeclarable templates, make sure
10807 // that all redeclarations point to the definitions. Note that this can only
10808 // happen now, after the redeclaration chains have been fully wired.
10809 for (Decl *D : PendingDefinitions) {
10810 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10811 if (auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10812 for (auto *R = getMostRecentExistingDecl(RD); R;
10813 R = R->getPreviousDecl()) {
10814 assert((R == D) ==
10815 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10816 "declaration thinks it's the definition but it isn't");
10817 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10818 }
10819 }
10820
10821 continue;
10822 }
10823
10824 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10825 // Make sure that the ObjCInterfaceType points at the definition.
10826 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10827 ->Decl = ID;
10828
10829 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10830 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10831
10832 continue;
10833 }
10834
10835 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10836 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10837 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10838
10839 continue;
10840 }
10841
10842 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10843 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10844 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10845 }
10846 PendingDefinitions.clear();
10847
10848 for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10849 auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10850 if (auto *VD = dyn_cast<VarDecl>(D))
10851 return VD->isThisDeclarationADefinition() ||
10852 VD->isThisDeclarationADemotedDefinition();
10853
10854 if (auto *TD = dyn_cast<TagDecl>(D))
10855 return TD->isThisDeclarationADefinition() ||
10856 TD->isThisDeclarationADemotedDefinition();
10857
10858 if (auto *FD = dyn_cast<FunctionDecl>(D))
10859 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10860
10861 if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10862 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10863
10864 // Conservatively return false here.
10865 return false;
10866 };
10867
10868 auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10869 return hasDefinitionImpl(D, hasDefinitionImpl);
10870 };
10871
10872 // It is not good to prevent multiple declarations since the forward
10873 // declaration is common. Let's try to avoid duplicated definitions
10874 // only.
10876 continue;
10877
10878 Module *PM = Previous->getOwningModule();
10879 Module *DM = D->getOwningModule();
10880 Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
10882 << (DM ? DM->getTopLevelModuleName() : "global module");
10883 Diag(Previous->getLocation(), diag::note_also_found);
10884 }
10885 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10886
10887 // Load the bodies of any functions or methods we've encountered. We do
10888 // this now (delayed) so that we can be sure that the declaration chains
10889 // have been fully wired up (hasBody relies on this).
10890 // FIXME: We shouldn't require complete redeclaration chains here.
10891 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10892 PBEnd = PendingBodies.end();
10893 PB != PBEnd; ++PB) {
10894 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10895 // FIXME: Check for =delete/=default?
10896 const FunctionDecl *Defn = nullptr;
10897 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10898 FD->setLazyBody(PB->second);
10899 } else {
10900 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
10901 mergeDefinitionVisibility(NonConstDefn, FD);
10902
10903 if (!FD->isLateTemplateParsed() &&
10904 !NonConstDefn->isLateTemplateParsed() &&
10905 // We only perform ODR checks for decls not in the explicit
10906 // global module fragment.
10907 !shouldSkipCheckingODR(FD) &&
10908 !shouldSkipCheckingODR(NonConstDefn) &&
10909 FD->getODRHash() != NonConstDefn->getODRHash()) {
10910 if (!isa<CXXMethodDecl>(FD)) {
10911 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10912 } else if (FD->getLexicalParent()->isFileContext() &&
10913 NonConstDefn->getLexicalParent()->isFileContext()) {
10914 // Only diagnose out-of-line method definitions. If they are
10915 // in class definitions, then an error will be generated when
10916 // processing the class bodies.
10917 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10918 }
10919 }
10920 }
10921 continue;
10922 }
10923
10924 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
10925 if (!getContext().getLangOpts().Modules || !MD->hasBody())
10926 MD->setLazyBody(PB->second);
10927 }
10928 PendingBodies.clear();
10929
10930 // Inform any classes that had members added that they now have more members.
10931 for (auto [RD, MD] : PendingAddedClassMembers) {
10932 RD->addedMember(MD);
10933 }
10934 PendingAddedClassMembers.clear();
10935
10936 // Do some cleanup.
10937 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
10939 PendingMergedDefinitionsToDeduplicate.clear();
10940
10941 // For each decl chain that we wanted to complete while deserializing, mark
10942 // it as "still needs to be completed".
10943 for (Decl *D : PendingIncompleteDeclChains)
10944 markIncompleteDeclChain(D);
10945 PendingIncompleteDeclChains.clear();
10946
10947 assert(PendingIdentifierInfos.empty() &&
10948 "Should be empty at the end of finishPendingActions");
10949 assert(PendingDeducedFunctionTypes.empty() &&
10950 "Should be empty at the end of finishPendingActions");
10951 assert(PendingDeducedVarTypes.empty() &&
10952 "Should be empty at the end of finishPendingActions");
10953 assert(PendingDeclChains.empty() &&
10954 "Should be empty at the end of finishPendingActions");
10955 assert(PendingMacroIDs.empty() &&
10956 "Should be empty at the end of finishPendingActions");
10957 assert(PendingDeclContextInfos.empty() &&
10958 "Should be empty at the end of finishPendingActions");
10959 assert(PendingUpdateRecords.empty() &&
10960 "Should be empty at the end of finishPendingActions");
10961 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10962 "Should be empty at the end of finishPendingActions");
10963 assert(PendingFakeDefinitionData.empty() &&
10964 "Should be empty at the end of finishPendingActions");
10965 assert(PendingDefinitions.empty() &&
10966 "Should be empty at the end of finishPendingActions");
10967 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10968 "Should be empty at the end of finishPendingActions");
10969 assert(PendingBodies.empty() &&
10970 "Should be empty at the end of finishPendingActions");
10971 assert(PendingAddedClassMembers.empty() &&
10972 "Should be empty at the end of finishPendingActions");
10973 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10974 "Should be empty at the end of finishPendingActions");
10975 assert(PendingIncompleteDeclChains.empty() &&
10976 "Should be empty at the end of finishPendingActions");
10977}
10978
10979void ASTReader::diagnoseOdrViolations() {
10980 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10981 PendingRecordOdrMergeFailures.empty() &&
10982 PendingFunctionOdrMergeFailures.empty() &&
10983 PendingEnumOdrMergeFailures.empty() &&
10984 PendingObjCInterfaceOdrMergeFailures.empty() &&
10985 PendingObjCProtocolOdrMergeFailures.empty())
10986 return;
10987
10988 // Trigger the import of the full definition of each class that had any
10989 // odr-merging problems, so we can produce better diagnostics for them.
10990 // These updates may in turn find and diagnose some ODR failures, so take
10991 // ownership of the set first.
10992 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10993 PendingOdrMergeFailures.clear();
10994 for (auto &Merge : OdrMergeFailures) {
10995 Merge.first->buildLookup();
10996 Merge.first->decls_begin();
10997 Merge.first->bases_begin();
10998 Merge.first->vbases_begin();
10999 for (auto &RecordPair : Merge.second) {
11000 auto *RD = RecordPair.first;
11001 RD->decls_begin();
11002 RD->bases_begin();
11003 RD->vbases_begin();
11004 }
11005 }
11006
11007 // Trigger the import of the full definition of each record in C/ObjC.
11008 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11009 PendingRecordOdrMergeFailures.clear();
11010 for (auto &Merge : RecordOdrMergeFailures) {
11011 Merge.first->decls_begin();
11012 for (auto &D : Merge.second)
11013 D->decls_begin();
11014 }
11015
11016 // Trigger the import of the full interface definition.
11017 auto ObjCInterfaceOdrMergeFailures =
11018 std::move(PendingObjCInterfaceOdrMergeFailures);
11019 PendingObjCInterfaceOdrMergeFailures.clear();
11020 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11021 Merge.first->decls_begin();
11022 for (auto &InterfacePair : Merge.second)
11023 InterfacePair.first->decls_begin();
11024 }
11025
11026 // Trigger the import of functions.
11027 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11028 PendingFunctionOdrMergeFailures.clear();
11029 for (auto &Merge : FunctionOdrMergeFailures) {
11030 Merge.first->buildLookup();
11031 Merge.first->decls_begin();
11032 Merge.first->getBody();
11033 for (auto &FD : Merge.second) {
11034 FD->buildLookup();
11035 FD->decls_begin();
11036 FD->getBody();
11037 }
11038 }
11039
11040 // Trigger the import of enums.
11041 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11042 PendingEnumOdrMergeFailures.clear();
11043 for (auto &Merge : EnumOdrMergeFailures) {
11044 Merge.first->decls_begin();
11045 for (auto &Enum : Merge.second) {
11046 Enum->decls_begin();
11047 }
11048 }
11049
11050 // Trigger the import of the full protocol definition.
11051 auto ObjCProtocolOdrMergeFailures =
11052 std::move(PendingObjCProtocolOdrMergeFailures);
11053 PendingObjCProtocolOdrMergeFailures.clear();
11054 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11055 Merge.first->decls_begin();
11056 for (auto &ProtocolPair : Merge.second)
11057 ProtocolPair.first->decls_begin();
11058 }
11059
11060 // For each declaration from a merged context, check that the canonical
11061 // definition of that context also contains a declaration of the same
11062 // entity.
11063 //
11064 // Caution: this loop does things that might invalidate iterators into
11065 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
11066 while (!PendingOdrMergeChecks.empty()) {
11067 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11068
11069 // FIXME: Skip over implicit declarations for now. This matters for things
11070 // like implicitly-declared special member functions. This isn't entirely
11071 // correct; we can end up with multiple unmerged declarations of the same
11072 // implicit entity.
11073 if (D->isImplicit())
11074 continue;
11075
11076 DeclContext *CanonDef = D->getDeclContext();
11077
11078 bool Found = false;
11079 const Decl *DCanon = D->getCanonicalDecl();
11080
11081 for (auto *RI : D->redecls()) {
11082 if (RI->getLexicalDeclContext() == CanonDef) {
11083 Found = true;
11084 break;
11085 }
11086 }
11087 if (Found)
11088 continue;
11089
11090 // Quick check failed, time to do the slow thing. Note, we can't just
11091 // look up the name of D in CanonDef here, because the member that is
11092 // in CanonDef might not be found by name lookup (it might have been
11093 // replaced by a more recent declaration in the lookup table), and we
11094 // can't necessarily find it in the redeclaration chain because it might
11095 // be merely mergeable, not redeclarable.
11096 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11097 for (auto *CanonMember : CanonDef->decls()) {
11098 if (CanonMember->getCanonicalDecl() == DCanon) {
11099 // This can happen if the declaration is merely mergeable and not
11100 // actually redeclarable (we looked for redeclarations earlier).
11101 //
11102 // FIXME: We should be able to detect this more efficiently, without
11103 // pulling in all of the members of CanonDef.
11104 Found = true;
11105 break;
11106 }
11107 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
11108 if (ND->getDeclName() == D->getDeclName())
11109 Candidates.push_back(ND);
11110 }
11111
11112 if (!Found) {
11113 // The AST doesn't like TagDecls becoming invalid after they've been
11114 // completed. We only really need to mark FieldDecls as invalid here.
11115 if (!isa<TagDecl>(D))
11116 D->setInvalidDecl();
11117
11118 // Ensure we don't accidentally recursively enter deserialization while
11119 // we're producing our diagnostic.
11120 Deserializing RecursionGuard(this);
11121
11122 std::string CanonDefModule =
11124 cast<Decl>(CanonDef));
11125 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
11127 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11128
11129 if (Candidates.empty())
11130 Diag(cast<Decl>(CanonDef)->getLocation(),
11131 diag::note_module_odr_violation_no_possible_decls) << D;
11132 else {
11133 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
11134 Diag(Candidates[I]->getLocation(),
11135 diag::note_module_odr_violation_possible_decl)
11136 << Candidates[I];
11137 }
11138
11139 DiagnosedOdrMergeFailures.insert(CanonDef);
11140 }
11141 }
11142
11143 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11144 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11145 ObjCInterfaceOdrMergeFailures.empty() &&
11146 ObjCProtocolOdrMergeFailures.empty())
11147 return;
11148
11149 ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
11150 getPreprocessor().getLangOpts());
11151
11152 // Issue any pending ODR-failure diagnostics.
11153 for (auto &Merge : OdrMergeFailures) {
11154 // If we've already pointed out a specific problem with this class, don't
11155 // bother issuing a general "something's different" diagnostic.
11156 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11157 continue;
11158
11159 bool Diagnosed = false;
11160 CXXRecordDecl *FirstRecord = Merge.first;
11161 for (auto &RecordPair : Merge.second) {
11162 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11163 RecordPair.second)) {
11164 Diagnosed = true;
11165 break;
11166 }
11167 }
11168
11169 if (!Diagnosed) {
11170 // All definitions are updates to the same declaration. This happens if a
11171 // module instantiates the declaration of a class template specialization
11172 // and two or more other modules instantiate its definition.
11173 //
11174 // FIXME: Indicate which modules had instantiations of this definition.
11175 // FIXME: How can this even happen?
11176 Diag(Merge.first->getLocation(),
11177 diag::err_module_odr_violation_different_instantiations)
11178 << Merge.first;
11179 }
11180 }
11181
11182 // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
11183 // that in C++ this is done as a part of CXXRecordDecl ODR checking.
11184 for (auto &Merge : RecordOdrMergeFailures) {
11185 // If we've already pointed out a specific problem with this class, don't
11186 // bother issuing a general "something's different" diagnostic.
11187 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11188 continue;
11189
11190 RecordDecl *FirstRecord = Merge.first;
11191 bool Diagnosed = false;
11192 for (auto *SecondRecord : Merge.second) {
11193 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11194 Diagnosed = true;
11195 break;
11196 }
11197 }
11198 (void)Diagnosed;
11199 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11200 }
11201
11202 // Issue ODR failures diagnostics for functions.
11203 for (auto &Merge : FunctionOdrMergeFailures) {
11204 FunctionDecl *FirstFunction = Merge.first;
11205 bool Diagnosed = false;
11206 for (auto &SecondFunction : Merge.second) {
11207 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11208 Diagnosed = true;
11209 break;
11210 }
11211 }
11212 (void)Diagnosed;
11213 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11214 }
11215
11216 // Issue ODR failures diagnostics for enums.
11217 for (auto &Merge : EnumOdrMergeFailures) {
11218 // If we've already pointed out a specific problem with this enum, don't
11219 // bother issuing a general "something's different" diagnostic.
11220 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11221 continue;
11222
11223 EnumDecl *FirstEnum = Merge.first;
11224 bool Diagnosed = false;
11225 for (auto &SecondEnum : Merge.second) {
11226 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11227 Diagnosed = true;
11228 break;
11229 }
11230 }
11231 (void)Diagnosed;
11232 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11233 }
11234
11235 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11236 // If we've already pointed out a specific problem with this interface,
11237 // don't bother issuing a general "something's different" diagnostic.
11238 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11239 continue;
11240
11241 bool Diagnosed = false;
11242 ObjCInterfaceDecl *FirstID = Merge.first;
11243 for (auto &InterfacePair : Merge.second) {
11244 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11245 InterfacePair.second)) {
11246 Diagnosed = true;
11247 break;
11248 }
11249 }
11250 (void)Diagnosed;
11251 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11252 }
11253
11254 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11255 // If we've already pointed out a specific problem with this protocol,
11256 // don't bother issuing a general "something's different" diagnostic.
11257 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11258 continue;
11259
11260 ObjCProtocolDecl *FirstProtocol = Merge.first;
11261 bool Diagnosed = false;
11262 for (auto &ProtocolPair : Merge.second) {
11263 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11264 ProtocolPair.second)) {
11265 Diagnosed = true;
11266 break;
11267 }
11268 }
11269 (void)Diagnosed;
11270 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11271 }
11272}
11273
11275 if (llvm::Timer *T = ReadTimer.get();
11276 ++NumCurrentElementsDeserializing == 1 && T)
11277 ReadTimeRegion.emplace(T);
11278}
11279
11281 assert(NumCurrentElementsDeserializing &&
11282 "FinishedDeserializing not paired with StartedDeserializing");
11283 if (NumCurrentElementsDeserializing == 1) {
11284 // We decrease NumCurrentElementsDeserializing only after pending actions
11285 // are finished, to avoid recursively re-calling finishPendingActions().
11286 finishPendingActions();
11287 }
11288 --NumCurrentElementsDeserializing;
11289
11290 if (NumCurrentElementsDeserializing == 0) {
11291 {
11292 // Guard variable to avoid recursively entering the process of passing
11293 // decls to consumer.
11294 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11295 /*NewValue=*/false);
11296
11297 // Propagate exception specification and deduced type updates along
11298 // redeclaration chains.
11299 //
11300 // We do this now rather than in finishPendingActions because we want to
11301 // be able to walk the complete redeclaration chains of the updated decls.
11302 while (!PendingExceptionSpecUpdates.empty() ||
11303 !PendingDeducedTypeUpdates.empty() ||
11304 !PendingUndeducedFunctionDecls.empty()) {
11305 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11306 PendingExceptionSpecUpdates.clear();
11307 for (auto Update : ESUpdates) {
11308 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11309 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11310 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11311 if (auto *Listener = getContext().getASTMutationListener())
11312 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11313 for (auto *Redecl : Update.second->redecls())
11315 }
11316
11317 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11318 PendingDeducedTypeUpdates.clear();
11319 for (auto Update : DTUpdates) {
11320 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11321 // FIXME: If the return type is already deduced, check that it
11322 // matches.
11324 Update.second);
11325 }
11326
11327 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11328 PendingUndeducedFunctionDecls.clear();
11329 // We hope we can find the deduced type for the functions by iterating
11330 // redeclarations in other modules.
11331 for (FunctionDecl *UndeducedFD : UDTUpdates)
11332 (void)UndeducedFD->getMostRecentDecl();
11333 }
11334
11335 ReadTimeRegion.reset();
11336
11337 diagnoseOdrViolations();
11338 }
11339
11340 // We are not in recursive loading, so it's safe to pass the "interesting"
11341 // decls to the consumer.
11342 if (Consumer)
11343 PassInterestingDeclsToConsumer();
11344 }
11345}
11346
11347void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11348 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11349 // Remove any fake results before adding any real ones.
11350 auto It = PendingFakeLookupResults.find(II);
11351 if (It != PendingFakeLookupResults.end()) {
11352 for (auto *ND : It->second)
11353 SemaObj->IdResolver.RemoveDecl(ND);
11354 // FIXME: this works around module+PCH performance issue.
11355 // Rather than erase the result from the map, which is O(n), just clear
11356 // the vector of NamedDecls.
11357 It->second.clear();
11358 }
11359 }
11360
11361 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11362 SemaObj->TUScope->AddDecl(D);
11363 } else if (SemaObj->TUScope) {
11364 // Adding the decl to IdResolver may have failed because it was already in
11365 // (even though it was not added in scope). If it is already in, make sure
11366 // it gets in the scope as well.
11367 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11368 SemaObj->TUScope->AddDecl(D);
11369 }
11370}
11371
11373 ASTContext *Context,
11374 const PCHContainerReader &PCHContainerRdr,
11375 const CodeGenOptions &CodeGenOpts,
11376 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11377 StringRef isysroot,
11378 DisableValidationForModuleKind DisableValidationKind,
11379 bool AllowASTWithCompilerErrors,
11380 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11381 bool ForceValidateUserInputs,
11382 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11383 std::unique_ptr<llvm::Timer> ReadTimer)
11384 : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11386 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11387 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11388 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11389 StackHandler(Diags), PP(PP), ContextObj(Context),
11390 CodeGenOpts(CodeGenOpts),
11391 ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11392 PP.getHeaderSearchInfo()),
11393 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11394 DisableValidationKind(DisableValidationKind),
11395 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11396 AllowConfigurationMismatch(AllowConfigurationMismatch),
11397 ValidateSystemInputs(ValidateSystemInputs),
11398 ForceValidateUserInputs(ForceValidateUserInputs),
11399 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11400 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11401 SourceMgr.setExternalSLocEntrySource(this);
11402
11403 PathBuf.reserve(256);
11404
11405 for (const auto &Ext : Extensions) {
11406 auto BlockName = Ext->getExtensionMetadata().BlockName;
11407 auto Known = ModuleFileExtensions.find(BlockName);
11408 if (Known != ModuleFileExtensions.end()) {
11409 Diags.Report(diag::warn_duplicate_module_file_extension)
11410 << BlockName;
11411 continue;
11412 }
11413
11414 ModuleFileExtensions.insert({BlockName, Ext});
11415 }
11416}
11417
11419 if (OwnsDeserializationListener)
11420 delete DeserializationListener;
11421}
11422
11424 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11425}
11426
11428 unsigned AbbrevID) {
11429 Idx = 0;
11430 Record.clear();
11431 return Cursor.readRecord(AbbrevID, Record);
11432}
11433//===----------------------------------------------------------------------===//
11434//// OMPClauseReader implementation
11435////===----------------------------------------------------------------------===//
11436
11437// This has to be in namespace clang because it's friended by all
11438// of the OMP clauses.
11439namespace clang {
11440
11441class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11442 ASTRecordReader &Record;
11443 ASTContext &Context;
11444
11445public:
11447 : Record(Record), Context(Record.getContext()) {}
11448#define GEN_CLANG_CLAUSE_CLASS
11449#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11450#include "llvm/Frontend/OpenMP/OMP.inc"
11454};
11455
11456} // end namespace clang
11457
11461
11463 OMPClause *C = nullptr;
11464 switch (llvm::omp::Clause(Record.readInt())) {
11465 case llvm::omp::OMPC_if:
11466 C = new (Context) OMPIfClause();
11467 break;
11468 case llvm::omp::OMPC_final:
11469 C = new (Context) OMPFinalClause();
11470 break;
11471 case llvm::omp::OMPC_num_threads:
11472 C = new (Context) OMPNumThreadsClause();
11473 break;
11474 case llvm::omp::OMPC_safelen:
11475 C = new (Context) OMPSafelenClause();
11476 break;
11477 case llvm::omp::OMPC_simdlen:
11478 C = new (Context) OMPSimdlenClause();
11479 break;
11480 case llvm::omp::OMPC_sizes: {
11481 unsigned NumSizes = Record.readInt();
11482 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11483 break;
11484 }
11485 case llvm::omp::OMPC_counts: {
11486 unsigned NumCounts = Record.readInt();
11487 C = OMPCountsClause::CreateEmpty(Context, NumCounts);
11488 break;
11489 }
11490 case llvm::omp::OMPC_permutation: {
11491 unsigned NumLoops = Record.readInt();
11492 C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11493 break;
11494 }
11495 case llvm::omp::OMPC_full:
11496 C = OMPFullClause::CreateEmpty(Context);
11497 break;
11498 case llvm::omp::OMPC_partial:
11500 break;
11501 case llvm::omp::OMPC_looprange:
11503 break;
11504 case llvm::omp::OMPC_allocator:
11505 C = new (Context) OMPAllocatorClause();
11506 break;
11507 case llvm::omp::OMPC_collapse:
11508 C = new (Context) OMPCollapseClause();
11509 break;
11510 case llvm::omp::OMPC_default:
11511 C = new (Context) OMPDefaultClause();
11512 break;
11513 case llvm::omp::OMPC_proc_bind:
11514 C = new (Context) OMPProcBindClause();
11515 break;
11516 case llvm::omp::OMPC_schedule:
11517 C = new (Context) OMPScheduleClause();
11518 break;
11519 case llvm::omp::OMPC_ordered:
11520 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11521 break;
11522 case llvm::omp::OMPC_nowait:
11523 C = new (Context) OMPNowaitClause();
11524 break;
11525 case llvm::omp::OMPC_untied:
11526 C = new (Context) OMPUntiedClause();
11527 break;
11528 case llvm::omp::OMPC_mergeable:
11529 C = new (Context) OMPMergeableClause();
11530 break;
11531 case llvm::omp::OMPC_threadset:
11532 C = new (Context) OMPThreadsetClause();
11533 break;
11534 case llvm::omp::OMPC_transparent:
11535 C = new (Context) OMPTransparentClause();
11536 break;
11537 case llvm::omp::OMPC_read:
11538 C = new (Context) OMPReadClause();
11539 break;
11540 case llvm::omp::OMPC_write:
11541 C = new (Context) OMPWriteClause();
11542 break;
11543 case llvm::omp::OMPC_update:
11544 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11545 break;
11546 case llvm::omp::OMPC_capture:
11547 C = new (Context) OMPCaptureClause();
11548 break;
11549 case llvm::omp::OMPC_compare:
11550 C = new (Context) OMPCompareClause();
11551 break;
11552 case llvm::omp::OMPC_fail:
11553 C = new (Context) OMPFailClause();
11554 break;
11555 case llvm::omp::OMPC_seq_cst:
11556 C = new (Context) OMPSeqCstClause();
11557 break;
11558 case llvm::omp::OMPC_acq_rel:
11559 C = new (Context) OMPAcqRelClause();
11560 break;
11561 case llvm::omp::OMPC_absent: {
11562 unsigned NumKinds = Record.readInt();
11563 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11564 break;
11565 }
11566 case llvm::omp::OMPC_holds:
11567 C = new (Context) OMPHoldsClause();
11568 break;
11569 case llvm::omp::OMPC_contains: {
11570 unsigned NumKinds = Record.readInt();
11571 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11572 break;
11573 }
11574 case llvm::omp::OMPC_no_openmp:
11575 C = new (Context) OMPNoOpenMPClause();
11576 break;
11577 case llvm::omp::OMPC_no_openmp_routines:
11578 C = new (Context) OMPNoOpenMPRoutinesClause();
11579 break;
11580 case llvm::omp::OMPC_no_openmp_constructs:
11581 C = new (Context) OMPNoOpenMPConstructsClause();
11582 break;
11583 case llvm::omp::OMPC_no_parallelism:
11584 C = new (Context) OMPNoParallelismClause();
11585 break;
11586 case llvm::omp::OMPC_acquire:
11587 C = new (Context) OMPAcquireClause();
11588 break;
11589 case llvm::omp::OMPC_release:
11590 C = new (Context) OMPReleaseClause();
11591 break;
11592 case llvm::omp::OMPC_relaxed:
11593 C = new (Context) OMPRelaxedClause();
11594 break;
11595 case llvm::omp::OMPC_weak:
11596 C = new (Context) OMPWeakClause();
11597 break;
11598 case llvm::omp::OMPC_threads:
11599 C = new (Context) OMPThreadsClause();
11600 break;
11601 case llvm::omp::OMPC_simd:
11602 C = new (Context) OMPSIMDClause();
11603 break;
11604 case llvm::omp::OMPC_nogroup:
11605 C = new (Context) OMPNogroupClause();
11606 break;
11607 case llvm::omp::OMPC_unified_address:
11608 C = new (Context) OMPUnifiedAddressClause();
11609 break;
11610 case llvm::omp::OMPC_unified_shared_memory:
11611 C = new (Context) OMPUnifiedSharedMemoryClause();
11612 break;
11613 case llvm::omp::OMPC_reverse_offload:
11614 C = new (Context) OMPReverseOffloadClause();
11615 break;
11616 case llvm::omp::OMPC_dynamic_allocators:
11617 C = new (Context) OMPDynamicAllocatorsClause();
11618 break;
11619 case llvm::omp::OMPC_atomic_default_mem_order:
11620 C = new (Context) OMPAtomicDefaultMemOrderClause();
11621 break;
11622 case llvm::omp::OMPC_self_maps:
11623 C = new (Context) OMPSelfMapsClause();
11624 break;
11625 case llvm::omp::OMPC_at:
11626 C = new (Context) OMPAtClause();
11627 break;
11628 case llvm::omp::OMPC_severity:
11629 C = new (Context) OMPSeverityClause();
11630 break;
11631 case llvm::omp::OMPC_message:
11632 C = new (Context) OMPMessageClause();
11633 break;
11634 case llvm::omp::OMPC_private:
11635 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11636 break;
11637 case llvm::omp::OMPC_firstprivate:
11638 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11639 break;
11640 case llvm::omp::OMPC_lastprivate:
11641 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11642 break;
11643 case llvm::omp::OMPC_shared:
11644 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11645 break;
11646 case llvm::omp::OMPC_reduction: {
11647 unsigned N = Record.readInt();
11648 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11649 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11650 break;
11651 }
11652 case llvm::omp::OMPC_task_reduction:
11653 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11654 break;
11655 case llvm::omp::OMPC_in_reduction:
11656 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11657 break;
11658 case llvm::omp::OMPC_linear:
11659 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11660 break;
11661 case llvm::omp::OMPC_aligned:
11662 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11663 break;
11664 case llvm::omp::OMPC_copyin:
11665 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11666 break;
11667 case llvm::omp::OMPC_copyprivate:
11668 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11669 break;
11670 case llvm::omp::OMPC_flush:
11671 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11672 break;
11673 case llvm::omp::OMPC_depobj:
11675 break;
11676 case llvm::omp::OMPC_depend: {
11677 unsigned NumVars = Record.readInt();
11678 unsigned NumLoops = Record.readInt();
11679 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11680 break;
11681 }
11682 case llvm::omp::OMPC_device:
11683 C = new (Context) OMPDeviceClause();
11684 break;
11685 case llvm::omp::OMPC_map: {
11687 Sizes.NumVars = Record.readInt();
11688 Sizes.NumUniqueDeclarations = Record.readInt();
11689 Sizes.NumComponentLists = Record.readInt();
11690 Sizes.NumComponents = Record.readInt();
11691 C = OMPMapClause::CreateEmpty(Context, Sizes);
11692 break;
11693 }
11694 case llvm::omp::OMPC_num_teams:
11695 C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11696 break;
11697 case llvm::omp::OMPC_thread_limit:
11698 C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11699 break;
11700 case llvm::omp::OMPC_priority:
11701 C = new (Context) OMPPriorityClause();
11702 break;
11703 case llvm::omp::OMPC_grainsize:
11704 C = new (Context) OMPGrainsizeClause();
11705 break;
11706 case llvm::omp::OMPC_num_tasks:
11707 C = new (Context) OMPNumTasksClause();
11708 break;
11709 case llvm::omp::OMPC_hint:
11710 C = new (Context) OMPHintClause();
11711 break;
11712 case llvm::omp::OMPC_dist_schedule:
11713 C = new (Context) OMPDistScheduleClause();
11714 break;
11715 case llvm::omp::OMPC_defaultmap:
11716 C = new (Context) OMPDefaultmapClause();
11717 break;
11718 case llvm::omp::OMPC_to: {
11720 Sizes.NumVars = Record.readInt();
11721 Sizes.NumUniqueDeclarations = Record.readInt();
11722 Sizes.NumComponentLists = Record.readInt();
11723 Sizes.NumComponents = Record.readInt();
11724 C = OMPToClause::CreateEmpty(Context, Sizes);
11725 break;
11726 }
11727 case llvm::omp::OMPC_from: {
11729 Sizes.NumVars = Record.readInt();
11730 Sizes.NumUniqueDeclarations = Record.readInt();
11731 Sizes.NumComponentLists = Record.readInt();
11732 Sizes.NumComponents = Record.readInt();
11733 C = OMPFromClause::CreateEmpty(Context, Sizes);
11734 break;
11735 }
11736 case llvm::omp::OMPC_use_device_ptr: {
11738 Sizes.NumVars = Record.readInt();
11739 Sizes.NumUniqueDeclarations = Record.readInt();
11740 Sizes.NumComponentLists = Record.readInt();
11741 Sizes.NumComponents = Record.readInt();
11742 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11743 break;
11744 }
11745 case llvm::omp::OMPC_use_device_addr: {
11747 Sizes.NumVars = Record.readInt();
11748 Sizes.NumUniqueDeclarations = Record.readInt();
11749 Sizes.NumComponentLists = Record.readInt();
11750 Sizes.NumComponents = Record.readInt();
11751 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11752 break;
11753 }
11754 case llvm::omp::OMPC_is_device_ptr: {
11756 Sizes.NumVars = Record.readInt();
11757 Sizes.NumUniqueDeclarations = Record.readInt();
11758 Sizes.NumComponentLists = Record.readInt();
11759 Sizes.NumComponents = Record.readInt();
11760 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11761 break;
11762 }
11763 case llvm::omp::OMPC_has_device_addr: {
11765 Sizes.NumVars = Record.readInt();
11766 Sizes.NumUniqueDeclarations = Record.readInt();
11767 Sizes.NumComponentLists = Record.readInt();
11768 Sizes.NumComponents = Record.readInt();
11769 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11770 break;
11771 }
11772 case llvm::omp::OMPC_allocate:
11773 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11774 break;
11775 case llvm::omp::OMPC_nontemporal:
11776 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11777 break;
11778 case llvm::omp::OMPC_inclusive:
11779 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11780 break;
11781 case llvm::omp::OMPC_exclusive:
11782 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11783 break;
11784 case llvm::omp::OMPC_order:
11785 C = new (Context) OMPOrderClause();
11786 break;
11787 case llvm::omp::OMPC_init: {
11788 unsigned VarListSize = Record.readInt();
11789 unsigned NumAttrs = Record.readInt();
11790 C = OMPInitClause::CreateEmpty(Context, /*NumPrefs=*/VarListSize - 1,
11791 NumAttrs);
11792 break;
11793 }
11794 case llvm::omp::OMPC_use:
11795 C = new (Context) OMPUseClause();
11796 break;
11797 case llvm::omp::OMPC_destroy:
11798 C = new (Context) OMPDestroyClause();
11799 break;
11800 case llvm::omp::OMPC_novariants:
11801 C = new (Context) OMPNovariantsClause();
11802 break;
11803 case llvm::omp::OMPC_nocontext:
11804 C = new (Context) OMPNocontextClause();
11805 break;
11806 case llvm::omp::OMPC_detach:
11807 C = new (Context) OMPDetachClause();
11808 break;
11809 case llvm::omp::OMPC_uses_allocators:
11810 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11811 break;
11812 case llvm::omp::OMPC_affinity:
11813 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11814 break;
11815 case llvm::omp::OMPC_filter:
11816 C = new (Context) OMPFilterClause();
11817 break;
11818 case llvm::omp::OMPC_bind:
11819 C = OMPBindClause::CreateEmpty(Context);
11820 break;
11821 case llvm::omp::OMPC_align:
11822 C = new (Context) OMPAlignClause();
11823 break;
11824 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11825 C = new (Context) OMPXDynCGroupMemClause();
11826 break;
11827 case llvm::omp::OMPC_dyn_groupprivate:
11828 C = new (Context) OMPDynGroupprivateClause();
11829 break;
11830 case llvm::omp::OMPC_doacross: {
11831 unsigned NumVars = Record.readInt();
11832 unsigned NumLoops = Record.readInt();
11833 C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
11834 break;
11835 }
11836 case llvm::omp::OMPC_ompx_attribute:
11837 C = new (Context) OMPXAttributeClause();
11838 break;
11839 case llvm::omp::OMPC_ompx_bare:
11840 C = new (Context) OMPXBareClause();
11841 break;
11842#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11843 case llvm::omp::Enum: \
11844 break;
11845#include "llvm/Frontend/OpenMP/OMPKinds.def"
11846 default:
11847 break;
11848 }
11849 assert(C && "Unknown OMPClause type");
11850
11851 Visit(C);
11852 C->setLocStart(Record.readSourceLocation());
11853 C->setLocEnd(Record.readSourceLocation());
11854
11855 return C;
11856}
11857
11859 C->setPreInitStmt(Record.readSubStmt(),
11860 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11861}
11862
11865 C->setPostUpdateExpr(Record.readSubExpr());
11866}
11867
11868void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11870 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11871 C->setNameModifierLoc(Record.readSourceLocation());
11872 C->setColonLoc(Record.readSourceLocation());
11873 C->setCondition(Record.readSubExpr());
11874 C->setLParenLoc(Record.readSourceLocation());
11875}
11876
11877void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11879 C->setCondition(Record.readSubExpr());
11880 C->setLParenLoc(Record.readSourceLocation());
11881}
11882
11883void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11885 C->setModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
11886 C->setNumThreads(Record.readSubExpr());
11887 C->setModifierLoc(Record.readSourceLocation());
11888 C->setLParenLoc(Record.readSourceLocation());
11889}
11890
11891void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11892 C->setSafelen(Record.readSubExpr());
11893 C->setLParenLoc(Record.readSourceLocation());
11894}
11895
11896void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11897 C->setSimdlen(Record.readSubExpr());
11898 C->setLParenLoc(Record.readSourceLocation());
11899}
11900
11901void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
11902 for (Expr *&E : C->getSizesRefs())
11903 E = Record.readSubExpr();
11904 C->setLParenLoc(Record.readSourceLocation());
11905}
11906
11907void OMPClauseReader::VisitOMPCountsClause(OMPCountsClause *C) {
11908 bool HasFill = Record.readBool();
11909 if (HasFill)
11910 C->setOmpFillIndex(Record.readInt());
11911 C->setOmpFillLoc(Record.readSourceLocation());
11912 for (Expr *&E : C->getCountsRefs())
11913 E = Record.readSubExpr();
11914 C->setLParenLoc(Record.readSourceLocation());
11915}
11916
11917void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
11918 for (Expr *&E : C->getArgsRefs())
11919 E = Record.readSubExpr();
11920 C->setLParenLoc(Record.readSourceLocation());
11921}
11922
11923void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
11924
11925void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
11926 C->setFactor(Record.readSubExpr());
11927 C->setLParenLoc(Record.readSourceLocation());
11928}
11929
11930void OMPClauseReader::VisitOMPLoopRangeClause(OMPLoopRangeClause *C) {
11931 C->setFirst(Record.readSubExpr());
11932 C->setCount(Record.readSubExpr());
11933 C->setLParenLoc(Record.readSourceLocation());
11934 C->setFirstLoc(Record.readSourceLocation());
11935 C->setCountLoc(Record.readSourceLocation());
11936}
11937
11938void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11939 C->setAllocator(Record.readExpr());
11940 C->setLParenLoc(Record.readSourceLocation());
11941}
11942
11943void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11944 C->setNumForLoops(Record.readSubExpr());
11945 C->setLParenLoc(Record.readSourceLocation());
11946}
11947
11948void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11949 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
11950 C->setLParenLoc(Record.readSourceLocation());
11951 C->setDefaultKindKwLoc(Record.readSourceLocation());
11952 C->setDefaultVariableCategory(
11953 Record.readEnum<OpenMPDefaultClauseVariableCategory>());
11954 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11955}
11956
11957// Read the parameter of threadset clause. This will have been saved when
11958// OMPClauseWriter is called.
11959void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) {
11960 C->setLParenLoc(Record.readSourceLocation());
11961 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11962 C->setThreadsetKindLoc(ThreadsetKindLoc);
11963 OpenMPThreadsetKind TKind =
11964 static_cast<OpenMPThreadsetKind>(Record.readInt());
11965 C->setThreadsetKind(TKind);
11966}
11967
11968void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *C) {
11969 C->setLParenLoc(Record.readSourceLocation());
11970 C->setImpexTypeKind(Record.readSubExpr());
11971}
11972
11973void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11974 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
11975 C->setLParenLoc(Record.readSourceLocation());
11976 C->setProcBindKindKwLoc(Record.readSourceLocation());
11977}
11978
11979void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11981 C->setScheduleKind(
11982 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11983 C->setFirstScheduleModifier(
11984 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11985 C->setSecondScheduleModifier(
11986 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11987 C->setChunkSize(Record.readSubExpr());
11988 C->setLParenLoc(Record.readSourceLocation());
11989 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11990 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11991 C->setScheduleKindLoc(Record.readSourceLocation());
11992 C->setCommaLoc(Record.readSourceLocation());
11993}
11994
11995void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11996 C->setNumForLoops(Record.readSubExpr());
11997 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11998 C->setLoopNumIterations(I, Record.readSubExpr());
11999 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12000 C->setLoopCounter(I, Record.readSubExpr());
12001 C->setLParenLoc(Record.readSourceLocation());
12002}
12003
12004void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
12005 C->setEventHandler(Record.readSubExpr());
12006 C->setLParenLoc(Record.readSourceLocation());
12007}
12008
12009void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *C) {
12010 C->setCondition(Record.readSubExpr());
12011 C->setLParenLoc(Record.readSourceLocation());
12012}
12013
12014void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12015
12016void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12017
12018void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12019
12020void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12021
12022void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
12023 if (C->isExtended()) {
12024 C->setLParenLoc(Record.readSourceLocation());
12025 C->setArgumentLoc(Record.readSourceLocation());
12026 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12027 }
12028}
12029
12030void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12031
12032void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12033
12034// Read the parameter of fail clause. This will have been saved when
12035// OMPClauseWriter is called.
12036void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
12037 C->setLParenLoc(Record.readSourceLocation());
12038 SourceLocation FailParameterLoc = Record.readSourceLocation();
12039 C->setFailParameterLoc(FailParameterLoc);
12040 OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
12041 C->setFailParameter(CKind);
12042}
12043
12044void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
12045 unsigned Count = C->getDirectiveKinds().size();
12046 C->setLParenLoc(Record.readSourceLocation());
12047 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12048 DKVec.reserve(Count);
12049 for (unsigned I = 0; I < Count; I++) {
12050 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12051 }
12052 C->setDirectiveKinds(DKVec);
12053}
12054
12055void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
12056 C->setExpr(Record.readExpr());
12057 C->setLParenLoc(Record.readSourceLocation());
12058}
12059
12060void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
12061 unsigned Count = C->getDirectiveKinds().size();
12062 C->setLParenLoc(Record.readSourceLocation());
12063 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12064 DKVec.reserve(Count);
12065 for (unsigned I = 0; I < Count; I++) {
12066 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12067 }
12068 C->setDirectiveKinds(DKVec);
12069}
12070
12071void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12072
12073void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12074 OMPNoOpenMPRoutinesClause *) {}
12075
12076void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12077 OMPNoOpenMPConstructsClause *) {}
12078
12079void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12080
12081void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12082
12083void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12084
12085void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12086
12087void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12088
12089void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12090
12091void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12092
12093void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12094
12095void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12096
12097void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12098
12099void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12100 unsigned NumVars = C->varlist_size();
12101 SmallVector<Expr *, 16> Vars;
12102 Vars.reserve(NumVars);
12103 for (unsigned I = 0; I != NumVars; ++I)
12104 Vars.push_back(Record.readSubExpr());
12105 C->setVarRefs(Vars);
12106 C->setIsTarget(Record.readBool());
12107 C->setIsTargetSync(Record.readBool());
12108 C->setHasPreferAttrs(Record.readBool());
12109
12110 unsigned NumPrefs = C->varlist_size() - 1;
12111 SmallVector<unsigned, 4> Counts;
12112 SmallVector<Expr *, 8> Attrs;
12113 Counts.reserve(NumPrefs);
12114 for (unsigned I = 0; I < NumPrefs; ++I) {
12115 unsigned NA = Record.readInt();
12116 Counts.push_back(NA);
12117 for (unsigned J = 0; J < NA; ++J)
12118 Attrs.push_back(Record.readSubExpr());
12119 }
12120 C->setAttrs(Counts, Attrs);
12121
12122 C->setLParenLoc(Record.readSourceLocation());
12123 C->setVarLoc(Record.readSourceLocation());
12124}
12125
12126void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12127 C->setInteropVar(Record.readSubExpr());
12128 C->setLParenLoc(Record.readSourceLocation());
12129 C->setVarLoc(Record.readSourceLocation());
12130}
12131
12132void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12133 C->setInteropVar(Record.readSubExpr());
12134 C->setLParenLoc(Record.readSourceLocation());
12135 C->setVarLoc(Record.readSourceLocation());
12136}
12137
12138void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12140 C->setCondition(Record.readSubExpr());
12141 C->setLParenLoc(Record.readSourceLocation());
12142}
12143
12144void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12146 C->setCondition(Record.readSubExpr());
12147 C->setLParenLoc(Record.readSourceLocation());
12148}
12149
12150void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12151
12152void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12153 OMPUnifiedSharedMemoryClause *) {}
12154
12155void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12156
12157void
12158OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12159}
12160
12161void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12162 OMPAtomicDefaultMemOrderClause *C) {
12163 C->setAtomicDefaultMemOrderKind(
12164 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12165 C->setLParenLoc(Record.readSourceLocation());
12166 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12167}
12168
12169void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12170
12171void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
12172 C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
12173 C->setLParenLoc(Record.readSourceLocation());
12174 C->setAtKindKwLoc(Record.readSourceLocation());
12175}
12176
12177void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
12178 C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
12179 C->setLParenLoc(Record.readSourceLocation());
12180 C->setSeverityKindKwLoc(Record.readSourceLocation());
12181}
12182
12183void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
12185 C->setMessageString(Record.readSubExpr());
12186 C->setLParenLoc(Record.readSourceLocation());
12187}
12188
12189void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12190 C->setLParenLoc(Record.readSourceLocation());
12191 unsigned NumVars = C->varlist_size();
12192 SmallVector<Expr *, 16> Vars;
12193 Vars.reserve(NumVars);
12194 for (unsigned i = 0; i != NumVars; ++i)
12195 Vars.push_back(Record.readSubExpr());
12196 C->setVarRefs(Vars);
12197 Vars.clear();
12198 for (unsigned i = 0; i != NumVars; ++i)
12199 Vars.push_back(Record.readSubExpr());
12200 C->setPrivateCopies(Vars);
12201}
12202
12203void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12205 C->setLParenLoc(Record.readSourceLocation());
12206 unsigned NumVars = C->varlist_size();
12207 SmallVector<Expr *, 16> Vars;
12208 Vars.reserve(NumVars);
12209 for (unsigned i = 0; i != NumVars; ++i)
12210 Vars.push_back(Record.readSubExpr());
12211 C->setVarRefs(Vars);
12212 Vars.clear();
12213 for (unsigned i = 0; i != NumVars; ++i)
12214 Vars.push_back(Record.readSubExpr());
12215 C->setPrivateCopies(Vars);
12216 Vars.clear();
12217 for (unsigned i = 0; i != NumVars; ++i)
12218 Vars.push_back(Record.readSubExpr());
12219 C->setInits(Vars);
12220}
12221
12222void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12224 C->setLParenLoc(Record.readSourceLocation());
12225 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12226 C->setKindLoc(Record.readSourceLocation());
12227 C->setColonLoc(Record.readSourceLocation());
12228 unsigned NumVars = C->varlist_size();
12229 SmallVector<Expr *, 16> Vars;
12230 Vars.reserve(NumVars);
12231 for (unsigned i = 0; i != NumVars; ++i)
12232 Vars.push_back(Record.readSubExpr());
12233 C->setVarRefs(Vars);
12234 Vars.clear();
12235 for (unsigned i = 0; i != NumVars; ++i)
12236 Vars.push_back(Record.readSubExpr());
12237 C->setPrivateCopies(Vars);
12238 Vars.clear();
12239 for (unsigned i = 0; i != NumVars; ++i)
12240 Vars.push_back(Record.readSubExpr());
12241 C->setSourceExprs(Vars);
12242 Vars.clear();
12243 for (unsigned i = 0; i != NumVars; ++i)
12244 Vars.push_back(Record.readSubExpr());
12245 C->setDestinationExprs(Vars);
12246 Vars.clear();
12247 for (unsigned i = 0; i != NumVars; ++i)
12248 Vars.push_back(Record.readSubExpr());
12249 C->setAssignmentOps(Vars);
12250}
12251
12252void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12253 C->setLParenLoc(Record.readSourceLocation());
12254 unsigned NumVars = C->varlist_size();
12255 SmallVector<Expr *, 16> Vars;
12256 Vars.reserve(NumVars);
12257 for (unsigned i = 0; i != NumVars; ++i)
12258 Vars.push_back(Record.readSubExpr());
12259 C->setVarRefs(Vars);
12260}
12261
12262void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12264 C->setLParenLoc(Record.readSourceLocation());
12265 C->setModifierLoc(Record.readSourceLocation());
12266 C->setColonLoc(Record.readSourceLocation());
12267 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12268 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12269 C->setQualifierLoc(NNSL);
12270 C->setNameInfo(DNI);
12271
12272 unsigned NumVars = C->varlist_size();
12273 SmallVector<Expr *, 16> Vars;
12274 Vars.reserve(NumVars);
12275 for (unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setVarRefs(Vars);
12278 Vars.clear();
12279 for (unsigned i = 0; i != NumVars; ++i)
12280 Vars.push_back(Record.readSubExpr());
12281 C->setPrivates(Vars);
12282 Vars.clear();
12283 for (unsigned i = 0; i != NumVars; ++i)
12284 Vars.push_back(Record.readSubExpr());
12285 C->setLHSExprs(Vars);
12286 Vars.clear();
12287 for (unsigned i = 0; i != NumVars; ++i)
12288 Vars.push_back(Record.readSubExpr());
12289 C->setRHSExprs(Vars);
12290 Vars.clear();
12291 for (unsigned i = 0; i != NumVars; ++i)
12292 Vars.push_back(Record.readSubExpr());
12293 C->setReductionOps(Vars);
12294 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12295 Vars.clear();
12296 for (unsigned i = 0; i != NumVars; ++i)
12297 Vars.push_back(Record.readSubExpr());
12298 C->setInscanCopyOps(Vars);
12299 Vars.clear();
12300 for (unsigned i = 0; i != NumVars; ++i)
12301 Vars.push_back(Record.readSubExpr());
12302 C->setInscanCopyArrayTemps(Vars);
12303 Vars.clear();
12304 for (unsigned i = 0; i != NumVars; ++i)
12305 Vars.push_back(Record.readSubExpr());
12306 C->setInscanCopyArrayElems(Vars);
12307 }
12308 unsigned NumFlags = Record.readInt();
12309 SmallVector<bool, 16> Flags;
12310 Flags.reserve(NumFlags);
12311 for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
12312 Flags.push_back(Record.readInt());
12313 C->setPrivateVariableReductionFlags(Flags);
12314}
12315
12316void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12318 C->setLParenLoc(Record.readSourceLocation());
12319 C->setColonLoc(Record.readSourceLocation());
12320 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12321 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12322 C->setQualifierLoc(NNSL);
12323 C->setNameInfo(DNI);
12324
12325 unsigned NumVars = C->varlist_size();
12326 SmallVector<Expr *, 16> Vars;
12327 Vars.reserve(NumVars);
12328 for (unsigned I = 0; I != NumVars; ++I)
12329 Vars.push_back(Record.readSubExpr());
12330 C->setVarRefs(Vars);
12331 Vars.clear();
12332 for (unsigned I = 0; I != NumVars; ++I)
12333 Vars.push_back(Record.readSubExpr());
12334 C->setPrivates(Vars);
12335 Vars.clear();
12336 for (unsigned I = 0; I != NumVars; ++I)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setLHSExprs(Vars);
12339 Vars.clear();
12340 for (unsigned I = 0; I != NumVars; ++I)
12341 Vars.push_back(Record.readSubExpr());
12342 C->setRHSExprs(Vars);
12343 Vars.clear();
12344 for (unsigned I = 0; I != NumVars; ++I)
12345 Vars.push_back(Record.readSubExpr());
12346 C->setReductionOps(Vars);
12347}
12348
12349void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12351 C->setLParenLoc(Record.readSourceLocation());
12352 C->setColonLoc(Record.readSourceLocation());
12353 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12354 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12355 C->setQualifierLoc(NNSL);
12356 C->setNameInfo(DNI);
12357
12358 unsigned NumVars = C->varlist_size();
12359 SmallVector<Expr *, 16> Vars;
12360 Vars.reserve(NumVars);
12361 for (unsigned I = 0; I != NumVars; ++I)
12362 Vars.push_back(Record.readSubExpr());
12363 C->setVarRefs(Vars);
12364 Vars.clear();
12365 for (unsigned I = 0; I != NumVars; ++I)
12366 Vars.push_back(Record.readSubExpr());
12367 C->setPrivates(Vars);
12368 Vars.clear();
12369 for (unsigned I = 0; I != NumVars; ++I)
12370 Vars.push_back(Record.readSubExpr());
12371 C->setLHSExprs(Vars);
12372 Vars.clear();
12373 for (unsigned I = 0; I != NumVars; ++I)
12374 Vars.push_back(Record.readSubExpr());
12375 C->setRHSExprs(Vars);
12376 Vars.clear();
12377 for (unsigned I = 0; I != NumVars; ++I)
12378 Vars.push_back(Record.readSubExpr());
12379 C->setReductionOps(Vars);
12380 Vars.clear();
12381 for (unsigned I = 0; I != NumVars; ++I)
12382 Vars.push_back(Record.readSubExpr());
12383 C->setTaskgroupDescriptors(Vars);
12384}
12385
12386void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12388 C->setLParenLoc(Record.readSourceLocation());
12389 C->setColonLoc(Record.readSourceLocation());
12390 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12391 C->setModifierLoc(Record.readSourceLocation());
12392 unsigned NumVars = C->varlist_size();
12393 SmallVector<Expr *, 16> Vars;
12394 Vars.reserve(NumVars);
12395 for (unsigned i = 0; i != NumVars; ++i)
12396 Vars.push_back(Record.readSubExpr());
12397 C->setVarRefs(Vars);
12398 Vars.clear();
12399 for (unsigned i = 0; i != NumVars; ++i)
12400 Vars.push_back(Record.readSubExpr());
12401 C->setPrivates(Vars);
12402 Vars.clear();
12403 for (unsigned i = 0; i != NumVars; ++i)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setInits(Vars);
12406 Vars.clear();
12407 for (unsigned i = 0; i != NumVars; ++i)
12408 Vars.push_back(Record.readSubExpr());
12409 C->setUpdates(Vars);
12410 Vars.clear();
12411 for (unsigned i = 0; i != NumVars; ++i)
12412 Vars.push_back(Record.readSubExpr());
12413 C->setFinals(Vars);
12414 C->setStep(Record.readSubExpr());
12415 C->setCalcStep(Record.readSubExpr());
12416 Vars.clear();
12417 for (unsigned I = 0; I != NumVars + 1; ++I)
12418 Vars.push_back(Record.readSubExpr());
12419 C->setUsedExprs(Vars);
12420}
12421
12422void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12423 C->setLParenLoc(Record.readSourceLocation());
12424 C->setColonLoc(Record.readSourceLocation());
12425 unsigned NumVars = C->varlist_size();
12426 SmallVector<Expr *, 16> Vars;
12427 Vars.reserve(NumVars);
12428 for (unsigned i = 0; i != NumVars; ++i)
12429 Vars.push_back(Record.readSubExpr());
12430 C->setVarRefs(Vars);
12431 C->setAlignment(Record.readSubExpr());
12432}
12433
12434void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12435 C->setLParenLoc(Record.readSourceLocation());
12436 unsigned NumVars = C->varlist_size();
12437 SmallVector<Expr *, 16> Exprs;
12438 Exprs.reserve(NumVars);
12439 for (unsigned i = 0; i != NumVars; ++i)
12440 Exprs.push_back(Record.readSubExpr());
12441 C->setVarRefs(Exprs);
12442 Exprs.clear();
12443 for (unsigned i = 0; i != NumVars; ++i)
12444 Exprs.push_back(Record.readSubExpr());
12445 C->setSourceExprs(Exprs);
12446 Exprs.clear();
12447 for (unsigned i = 0; i != NumVars; ++i)
12448 Exprs.push_back(Record.readSubExpr());
12449 C->setDestinationExprs(Exprs);
12450 Exprs.clear();
12451 for (unsigned i = 0; i != NumVars; ++i)
12452 Exprs.push_back(Record.readSubExpr());
12453 C->setAssignmentOps(Exprs);
12454}
12455
12456void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12457 C->setLParenLoc(Record.readSourceLocation());
12458 unsigned NumVars = C->varlist_size();
12459 SmallVector<Expr *, 16> Exprs;
12460 Exprs.reserve(NumVars);
12461 for (unsigned i = 0; i != NumVars; ++i)
12462 Exprs.push_back(Record.readSubExpr());
12463 C->setVarRefs(Exprs);
12464 Exprs.clear();
12465 for (unsigned i = 0; i != NumVars; ++i)
12466 Exprs.push_back(Record.readSubExpr());
12467 C->setSourceExprs(Exprs);
12468 Exprs.clear();
12469 for (unsigned i = 0; i != NumVars; ++i)
12470 Exprs.push_back(Record.readSubExpr());
12471 C->setDestinationExprs(Exprs);
12472 Exprs.clear();
12473 for (unsigned i = 0; i != NumVars; ++i)
12474 Exprs.push_back(Record.readSubExpr());
12475 C->setAssignmentOps(Exprs);
12476}
12477
12478void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12479 C->setLParenLoc(Record.readSourceLocation());
12480 unsigned NumVars = C->varlist_size();
12481 SmallVector<Expr *, 16> Vars;
12482 Vars.reserve(NumVars);
12483 for (unsigned i = 0; i != NumVars; ++i)
12484 Vars.push_back(Record.readSubExpr());
12485 C->setVarRefs(Vars);
12486}
12487
12488void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12489 C->setDepobj(Record.readSubExpr());
12490 C->setLParenLoc(Record.readSourceLocation());
12491}
12492
12493void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12494 C->setLParenLoc(Record.readSourceLocation());
12495 C->setModifier(Record.readSubExpr());
12496 C->setDependencyKind(
12497 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12498 C->setDependencyLoc(Record.readSourceLocation());
12499 C->setColonLoc(Record.readSourceLocation());
12500 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12501 unsigned NumVars = C->varlist_size();
12502 SmallVector<Expr *, 16> Vars;
12503 Vars.reserve(NumVars);
12504 for (unsigned I = 0; I != NumVars; ++I)
12505 Vars.push_back(Record.readSubExpr());
12506 C->setVarRefs(Vars);
12507 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12508 C->setLoopData(I, Record.readSubExpr());
12509}
12510
12511void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12513 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12514 C->setDevice(Record.readSubExpr());
12515 C->setModifierLoc(Record.readSourceLocation());
12516 C->setLParenLoc(Record.readSourceLocation());
12517}
12518
12519void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12520 C->setLParenLoc(Record.readSourceLocation());
12521 bool HasIteratorModifier = false;
12522 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12523 C->setMapTypeModifier(
12524 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12525 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12526 if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12527 HasIteratorModifier = true;
12528 }
12529 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12530 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12531 C->setMapType(
12532 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12533 C->setMapLoc(Record.readSourceLocation());
12534 C->setColonLoc(Record.readSourceLocation());
12535 auto NumVars = C->varlist_size();
12536 auto UniqueDecls = C->getUniqueDeclarationsNum();
12537 auto TotalLists = C->getTotalComponentListNum();
12538 auto TotalComponents = C->getTotalComponentsNum();
12539
12540 SmallVector<Expr *, 16> Vars;
12541 Vars.reserve(NumVars);
12542 for (unsigned i = 0; i != NumVars; ++i)
12543 Vars.push_back(Record.readExpr());
12544 C->setVarRefs(Vars);
12545
12546 SmallVector<Expr *, 16> UDMappers;
12547 UDMappers.reserve(NumVars);
12548 for (unsigned I = 0; I < NumVars; ++I)
12549 UDMappers.push_back(Record.readExpr());
12550 C->setUDMapperRefs(UDMappers);
12551
12552 if (HasIteratorModifier)
12553 C->setIteratorModifier(Record.readExpr());
12554
12555 SmallVector<ValueDecl *, 16> Decls;
12556 Decls.reserve(UniqueDecls);
12557 for (unsigned i = 0; i < UniqueDecls; ++i)
12558 Decls.push_back(Record.readDeclAs<ValueDecl>());
12559 C->setUniqueDecls(Decls);
12560
12561 SmallVector<unsigned, 16> ListsPerDecl;
12562 ListsPerDecl.reserve(UniqueDecls);
12563 for (unsigned i = 0; i < UniqueDecls; ++i)
12564 ListsPerDecl.push_back(Record.readInt());
12565 C->setDeclNumLists(ListsPerDecl);
12566
12567 SmallVector<unsigned, 32> ListSizes;
12568 ListSizes.reserve(TotalLists);
12569 for (unsigned i = 0; i < TotalLists; ++i)
12570 ListSizes.push_back(Record.readInt());
12571 C->setComponentListSizes(ListSizes);
12572
12573 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12574 Components.reserve(TotalComponents);
12575 for (unsigned i = 0; i < TotalComponents; ++i) {
12576 Expr *AssociatedExprPr = Record.readExpr();
12577 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12578 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12579 /*IsNonContiguous=*/false);
12580 }
12581 C->setComponents(Components, ListSizes);
12582}
12583
12584void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12585 C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12586 C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12587 C->setLParenLoc(Record.readSourceLocation());
12588 C->setColonLoc(Record.readSourceLocation());
12589 C->setAllocator(Record.readSubExpr());
12590 C->setAlignment(Record.readSubExpr());
12591 unsigned NumVars = C->varlist_size();
12592 SmallVector<Expr *, 16> Vars;
12593 Vars.reserve(NumVars);
12594 for (unsigned i = 0; i != NumVars; ++i)
12595 Vars.push_back(Record.readSubExpr());
12596 C->setVarRefs(Vars);
12597}
12598
12599void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12600 C->setModifier(Record.readEnum<OpenMPNumTeamsClauseModifier>());
12601 C->setModifierLoc(Record.readSourceLocation());
12602 C->setModifierExpr(Record.readSubExpr());
12604 C->setLParenLoc(Record.readSourceLocation());
12605 unsigned NumVars = C->varlist_size();
12606 SmallVector<Expr *, 16> Vars;
12607 Vars.reserve(NumVars);
12608 for (unsigned I = 0; I != NumVars; ++I)
12609 Vars.push_back(Record.readSubExpr());
12610 C->setVarRefs(Vars);
12611}
12612
12613void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12615 C->setLParenLoc(Record.readSourceLocation());
12616 unsigned NumVars = C->varlist_size();
12617 SmallVector<Expr *, 16> Vars;
12618 Vars.reserve(NumVars);
12619 for (unsigned I = 0; I != NumVars; ++I)
12620 Vars.push_back(Record.readSubExpr());
12621 C->setVarRefs(Vars);
12622}
12623
12624void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12626 C->setPriority(Record.readSubExpr());
12627 C->setLParenLoc(Record.readSourceLocation());
12628}
12629
12630void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12632 C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12633 C->setGrainsize(Record.readSubExpr());
12634 C->setModifierLoc(Record.readSourceLocation());
12635 C->setLParenLoc(Record.readSourceLocation());
12636}
12637
12638void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12640 C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12641 C->setNumTasks(Record.readSubExpr());
12642 C->setModifierLoc(Record.readSourceLocation());
12643 C->setLParenLoc(Record.readSourceLocation());
12644}
12645
12646void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12647 C->setHint(Record.readSubExpr());
12648 C->setLParenLoc(Record.readSourceLocation());
12649}
12650
12651void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12653 C->setDistScheduleKind(
12654 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12655 C->setChunkSize(Record.readSubExpr());
12656 C->setLParenLoc(Record.readSourceLocation());
12657 C->setDistScheduleKindLoc(Record.readSourceLocation());
12658 C->setCommaLoc(Record.readSourceLocation());
12659}
12660
12661void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12662 C->setDefaultmapKind(
12663 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12664 C->setDefaultmapModifier(
12665 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12666 C->setLParenLoc(Record.readSourceLocation());
12667 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12668 C->setDefaultmapKindLoc(Record.readSourceLocation());
12669}
12670
12671void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12672 C->setLParenLoc(Record.readSourceLocation());
12673 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12674 C->setMotionModifier(
12675 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12676 C->setMotionModifierLoc(I, Record.readSourceLocation());
12677 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12678 C->setIteratorModifier(Record.readExpr());
12679 }
12680 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12681 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12682 C->setColonLoc(Record.readSourceLocation());
12683 auto NumVars = C->varlist_size();
12684 auto UniqueDecls = C->getUniqueDeclarationsNum();
12685 auto TotalLists = C->getTotalComponentListNum();
12686 auto TotalComponents = C->getTotalComponentsNum();
12687
12688 SmallVector<Expr *, 16> Vars;
12689 Vars.reserve(NumVars);
12690 for (unsigned i = 0; i != NumVars; ++i)
12691 Vars.push_back(Record.readSubExpr());
12692 C->setVarRefs(Vars);
12693
12694 SmallVector<Expr *, 16> UDMappers;
12695 UDMappers.reserve(NumVars);
12696 for (unsigned I = 0; I < NumVars; ++I)
12697 UDMappers.push_back(Record.readSubExpr());
12698 C->setUDMapperRefs(UDMappers);
12699
12700 SmallVector<ValueDecl *, 16> Decls;
12701 Decls.reserve(UniqueDecls);
12702 for (unsigned i = 0; i < UniqueDecls; ++i)
12703 Decls.push_back(Record.readDeclAs<ValueDecl>());
12704 C->setUniqueDecls(Decls);
12705
12706 SmallVector<unsigned, 16> ListsPerDecl;
12707 ListsPerDecl.reserve(UniqueDecls);
12708 for (unsigned i = 0; i < UniqueDecls; ++i)
12709 ListsPerDecl.push_back(Record.readInt());
12710 C->setDeclNumLists(ListsPerDecl);
12711
12712 SmallVector<unsigned, 32> ListSizes;
12713 ListSizes.reserve(TotalLists);
12714 for (unsigned i = 0; i < TotalLists; ++i)
12715 ListSizes.push_back(Record.readInt());
12716 C->setComponentListSizes(ListSizes);
12717
12718 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12719 Components.reserve(TotalComponents);
12720 for (unsigned i = 0; i < TotalComponents; ++i) {
12721 Expr *AssociatedExprPr = Record.readSubExpr();
12722 bool IsNonContiguous = Record.readBool();
12723 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12724 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12725 }
12726 C->setComponents(Components, ListSizes);
12727}
12728
12729void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12730 C->setLParenLoc(Record.readSourceLocation());
12731 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12732 C->setMotionModifier(
12733 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12734 C->setMotionModifierLoc(I, Record.readSourceLocation());
12735 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12736 C->setIteratorModifier(Record.readExpr());
12737 }
12738 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12739 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12740 C->setColonLoc(Record.readSourceLocation());
12741 auto NumVars = C->varlist_size();
12742 auto UniqueDecls = C->getUniqueDeclarationsNum();
12743 auto TotalLists = C->getTotalComponentListNum();
12744 auto TotalComponents = C->getTotalComponentsNum();
12745
12746 SmallVector<Expr *, 16> Vars;
12747 Vars.reserve(NumVars);
12748 for (unsigned i = 0; i != NumVars; ++i)
12749 Vars.push_back(Record.readSubExpr());
12750 C->setVarRefs(Vars);
12751
12752 SmallVector<Expr *, 16> UDMappers;
12753 UDMappers.reserve(NumVars);
12754 for (unsigned I = 0; I < NumVars; ++I)
12755 UDMappers.push_back(Record.readSubExpr());
12756 C->setUDMapperRefs(UDMappers);
12757
12758 SmallVector<ValueDecl *, 16> Decls;
12759 Decls.reserve(UniqueDecls);
12760 for (unsigned i = 0; i < UniqueDecls; ++i)
12761 Decls.push_back(Record.readDeclAs<ValueDecl>());
12762 C->setUniqueDecls(Decls);
12763
12764 SmallVector<unsigned, 16> ListsPerDecl;
12765 ListsPerDecl.reserve(UniqueDecls);
12766 for (unsigned i = 0; i < UniqueDecls; ++i)
12767 ListsPerDecl.push_back(Record.readInt());
12768 C->setDeclNumLists(ListsPerDecl);
12769
12770 SmallVector<unsigned, 32> ListSizes;
12771 ListSizes.reserve(TotalLists);
12772 for (unsigned i = 0; i < TotalLists; ++i)
12773 ListSizes.push_back(Record.readInt());
12774 C->setComponentListSizes(ListSizes);
12775
12776 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12777 Components.reserve(TotalComponents);
12778 for (unsigned i = 0; i < TotalComponents; ++i) {
12779 Expr *AssociatedExprPr = Record.readSubExpr();
12780 bool IsNonContiguous = Record.readBool();
12781 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12782 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12783 }
12784 C->setComponents(Components, ListSizes);
12785}
12786
12787void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12788 C->setLParenLoc(Record.readSourceLocation());
12789 C->setFallbackModifier(Record.readEnum<OpenMPUseDevicePtrFallbackModifier>());
12790 C->setFallbackModifierLoc(Record.readSourceLocation());
12791 auto NumVars = C->varlist_size();
12792 auto UniqueDecls = C->getUniqueDeclarationsNum();
12793 auto TotalLists = C->getTotalComponentListNum();
12794 auto TotalComponents = C->getTotalComponentsNum();
12795
12796 SmallVector<Expr *, 16> Vars;
12797 Vars.reserve(NumVars);
12798 for (unsigned i = 0; i != NumVars; ++i)
12799 Vars.push_back(Record.readSubExpr());
12800 C->setVarRefs(Vars);
12801 Vars.clear();
12802 for (unsigned i = 0; i != NumVars; ++i)
12803 Vars.push_back(Record.readSubExpr());
12804 C->setPrivateCopies(Vars);
12805 Vars.clear();
12806 for (unsigned i = 0; i != NumVars; ++i)
12807 Vars.push_back(Record.readSubExpr());
12808 C->setInits(Vars);
12809
12810 SmallVector<ValueDecl *, 16> Decls;
12811 Decls.reserve(UniqueDecls);
12812 for (unsigned i = 0; i < UniqueDecls; ++i)
12813 Decls.push_back(Record.readDeclAs<ValueDecl>());
12814 C->setUniqueDecls(Decls);
12815
12816 SmallVector<unsigned, 16> ListsPerDecl;
12817 ListsPerDecl.reserve(UniqueDecls);
12818 for (unsigned i = 0; i < UniqueDecls; ++i)
12819 ListsPerDecl.push_back(Record.readInt());
12820 C->setDeclNumLists(ListsPerDecl);
12821
12822 SmallVector<unsigned, 32> ListSizes;
12823 ListSizes.reserve(TotalLists);
12824 for (unsigned i = 0; i < TotalLists; ++i)
12825 ListSizes.push_back(Record.readInt());
12826 C->setComponentListSizes(ListSizes);
12827
12828 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12829 Components.reserve(TotalComponents);
12830 for (unsigned i = 0; i < TotalComponents; ++i) {
12831 auto *AssociatedExprPr = Record.readSubExpr();
12832 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12833 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12834 /*IsNonContiguous=*/false);
12835 }
12836 C->setComponents(Components, ListSizes);
12837}
12838
12839void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12840 C->setLParenLoc(Record.readSourceLocation());
12841 auto NumVars = C->varlist_size();
12842 auto UniqueDecls = C->getUniqueDeclarationsNum();
12843 auto TotalLists = C->getTotalComponentListNum();
12844 auto TotalComponents = C->getTotalComponentsNum();
12845
12846 SmallVector<Expr *, 16> Vars;
12847 Vars.reserve(NumVars);
12848 for (unsigned i = 0; i != NumVars; ++i)
12849 Vars.push_back(Record.readSubExpr());
12850 C->setVarRefs(Vars);
12851
12852 SmallVector<ValueDecl *, 16> Decls;
12853 Decls.reserve(UniqueDecls);
12854 for (unsigned i = 0; i < UniqueDecls; ++i)
12855 Decls.push_back(Record.readDeclAs<ValueDecl>());
12856 C->setUniqueDecls(Decls);
12857
12858 SmallVector<unsigned, 16> ListsPerDecl;
12859 ListsPerDecl.reserve(UniqueDecls);
12860 for (unsigned i = 0; i < UniqueDecls; ++i)
12861 ListsPerDecl.push_back(Record.readInt());
12862 C->setDeclNumLists(ListsPerDecl);
12863
12864 SmallVector<unsigned, 32> ListSizes;
12865 ListSizes.reserve(TotalLists);
12866 for (unsigned i = 0; i < TotalLists; ++i)
12867 ListSizes.push_back(Record.readInt());
12868 C->setComponentListSizes(ListSizes);
12869
12870 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12871 Components.reserve(TotalComponents);
12872 for (unsigned i = 0; i < TotalComponents; ++i) {
12873 Expr *AssociatedExpr = Record.readSubExpr();
12874 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12875 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12876 /*IsNonContiguous*/ false);
12877 }
12878 C->setComponents(Components, ListSizes);
12879}
12880
12881void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12882 C->setLParenLoc(Record.readSourceLocation());
12883 auto NumVars = C->varlist_size();
12884 auto UniqueDecls = C->getUniqueDeclarationsNum();
12885 auto TotalLists = C->getTotalComponentListNum();
12886 auto TotalComponents = C->getTotalComponentsNum();
12887
12888 SmallVector<Expr *, 16> Vars;
12889 Vars.reserve(NumVars);
12890 for (unsigned i = 0; i != NumVars; ++i)
12891 Vars.push_back(Record.readSubExpr());
12892 C->setVarRefs(Vars);
12893 Vars.clear();
12894
12895 SmallVector<ValueDecl *, 16> Decls;
12896 Decls.reserve(UniqueDecls);
12897 for (unsigned i = 0; i < UniqueDecls; ++i)
12898 Decls.push_back(Record.readDeclAs<ValueDecl>());
12899 C->setUniqueDecls(Decls);
12900
12901 SmallVector<unsigned, 16> ListsPerDecl;
12902 ListsPerDecl.reserve(UniqueDecls);
12903 for (unsigned i = 0; i < UniqueDecls; ++i)
12904 ListsPerDecl.push_back(Record.readInt());
12905 C->setDeclNumLists(ListsPerDecl);
12906
12907 SmallVector<unsigned, 32> ListSizes;
12908 ListSizes.reserve(TotalLists);
12909 for (unsigned i = 0; i < TotalLists; ++i)
12910 ListSizes.push_back(Record.readInt());
12911 C->setComponentListSizes(ListSizes);
12912
12913 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12914 Components.reserve(TotalComponents);
12915 for (unsigned i = 0; i < TotalComponents; ++i) {
12916 Expr *AssociatedExpr = Record.readSubExpr();
12917 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12918 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12919 /*IsNonContiguous=*/false);
12920 }
12921 C->setComponents(Components, ListSizes);
12922}
12923
12924void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
12925 C->setLParenLoc(Record.readSourceLocation());
12926 auto NumVars = C->varlist_size();
12927 auto UniqueDecls = C->getUniqueDeclarationsNum();
12928 auto TotalLists = C->getTotalComponentListNum();
12929 auto TotalComponents = C->getTotalComponentsNum();
12930
12931 SmallVector<Expr *, 16> Vars;
12932 Vars.reserve(NumVars);
12933 for (unsigned I = 0; I != NumVars; ++I)
12934 Vars.push_back(Record.readSubExpr());
12935 C->setVarRefs(Vars);
12936 Vars.clear();
12937
12938 SmallVector<ValueDecl *, 16> Decls;
12939 Decls.reserve(UniqueDecls);
12940 for (unsigned I = 0; I < UniqueDecls; ++I)
12941 Decls.push_back(Record.readDeclAs<ValueDecl>());
12942 C->setUniqueDecls(Decls);
12943
12944 SmallVector<unsigned, 16> ListsPerDecl;
12945 ListsPerDecl.reserve(UniqueDecls);
12946 for (unsigned I = 0; I < UniqueDecls; ++I)
12947 ListsPerDecl.push_back(Record.readInt());
12948 C->setDeclNumLists(ListsPerDecl);
12949
12950 SmallVector<unsigned, 32> ListSizes;
12951 ListSizes.reserve(TotalLists);
12952 for (unsigned i = 0; i < TotalLists; ++i)
12953 ListSizes.push_back(Record.readInt());
12954 C->setComponentListSizes(ListSizes);
12955
12956 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12957 Components.reserve(TotalComponents);
12958 for (unsigned I = 0; I < TotalComponents; ++I) {
12959 Expr *AssociatedExpr = Record.readSubExpr();
12960 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12961 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12962 /*IsNonContiguous=*/false);
12963 }
12964 C->setComponents(Components, ListSizes);
12965}
12966
12967void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12968 C->setLParenLoc(Record.readSourceLocation());
12969 unsigned NumVars = C->varlist_size();
12970 SmallVector<Expr *, 16> Vars;
12971 Vars.reserve(NumVars);
12972 for (unsigned i = 0; i != NumVars; ++i)
12973 Vars.push_back(Record.readSubExpr());
12974 C->setVarRefs(Vars);
12975 Vars.clear();
12976 Vars.reserve(NumVars);
12977 for (unsigned i = 0; i != NumVars; ++i)
12978 Vars.push_back(Record.readSubExpr());
12979 C->setPrivateRefs(Vars);
12980}
12981
12982void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12983 C->setLParenLoc(Record.readSourceLocation());
12984 unsigned NumVars = C->varlist_size();
12985 SmallVector<Expr *, 16> Vars;
12986 Vars.reserve(NumVars);
12987 for (unsigned i = 0; i != NumVars; ++i)
12988 Vars.push_back(Record.readSubExpr());
12989 C->setVarRefs(Vars);
12990}
12991
12992void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12993 C->setLParenLoc(Record.readSourceLocation());
12994 unsigned NumVars = C->varlist_size();
12995 SmallVector<Expr *, 16> Vars;
12996 Vars.reserve(NumVars);
12997 for (unsigned i = 0; i != NumVars; ++i)
12998 Vars.push_back(Record.readSubExpr());
12999 C->setVarRefs(Vars);
13000}
13001
13002void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
13003 C->setLParenLoc(Record.readSourceLocation());
13004 unsigned NumOfAllocators = C->getNumberOfAllocators();
13005 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
13006 Data.reserve(NumOfAllocators);
13007 for (unsigned I = 0; I != NumOfAllocators; ++I) {
13008 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
13009 D.Allocator = Record.readSubExpr();
13010 D.AllocatorTraits = Record.readSubExpr();
13011 D.LParenLoc = Record.readSourceLocation();
13012 D.RParenLoc = Record.readSourceLocation();
13013 }
13014 C->setAllocatorsData(Data);
13015}
13016
13017void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
13018 C->setLParenLoc(Record.readSourceLocation());
13019 C->setModifier(Record.readSubExpr());
13020 C->setColonLoc(Record.readSourceLocation());
13021 unsigned NumOfLocators = C->varlist_size();
13022 SmallVector<Expr *, 4> Locators;
13023 Locators.reserve(NumOfLocators);
13024 for (unsigned I = 0; I != NumOfLocators; ++I)
13025 Locators.push_back(Record.readSubExpr());
13026 C->setVarRefs(Locators);
13027}
13028
13029void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
13030 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
13031 C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
13032 C->setLParenLoc(Record.readSourceLocation());
13033 C->setKindKwLoc(Record.readSourceLocation());
13034 C->setModifierKwLoc(Record.readSourceLocation());
13035}
13036
13037void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
13039 C->setThreadID(Record.readSubExpr());
13040 C->setLParenLoc(Record.readSourceLocation());
13041}
13042
13043void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
13044 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
13045 C->setLParenLoc(Record.readSourceLocation());
13046 C->setBindKindLoc(Record.readSourceLocation());
13047}
13048
13049void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
13050 C->setAlignment(Record.readExpr());
13051 C->setLParenLoc(Record.readSourceLocation());
13052}
13053
13054void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
13056 C->setSize(Record.readSubExpr());
13057 C->setLParenLoc(Record.readSourceLocation());
13058}
13059
13060void OMPClauseReader::VisitOMPDynGroupprivateClause(
13061 OMPDynGroupprivateClause *C) {
13063 C->setDynGroupprivateModifier(
13064 Record.readEnum<OpenMPDynGroupprivateClauseModifier>());
13065 C->setDynGroupprivateFallbackModifier(
13067 C->setSize(Record.readSubExpr());
13068 C->setLParenLoc(Record.readSourceLocation());
13069 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13070 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13071}
13072
13073void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
13074 C->setLParenLoc(Record.readSourceLocation());
13075 C->setDependenceType(
13076 static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
13077 C->setDependenceLoc(Record.readSourceLocation());
13078 C->setColonLoc(Record.readSourceLocation());
13079 unsigned NumVars = C->varlist_size();
13080 SmallVector<Expr *, 16> Vars;
13081 Vars.reserve(NumVars);
13082 for (unsigned I = 0; I != NumVars; ++I)
13083 Vars.push_back(Record.readSubExpr());
13084 C->setVarRefs(Vars);
13085 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
13086 C->setLoopData(I, Record.readSubExpr());
13087}
13088
13089void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
13090 AttrVec Attrs;
13091 Record.readAttributes(Attrs);
13092 C->setAttrs(Attrs);
13093 C->setLocStart(Record.readSourceLocation());
13094 C->setLParenLoc(Record.readSourceLocation());
13095 C->setLocEnd(Record.readSourceLocation());
13096}
13097
13098void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
13099
13102 TI.Sets.resize(readUInt32());
13103 for (auto &Set : TI.Sets) {
13105 Set.Selectors.resize(readUInt32());
13106 for (auto &Selector : Set.Selectors) {
13108 Selector.ScoreOrCondition = nullptr;
13109 if (readBool())
13110 Selector.ScoreOrCondition = readExprRef();
13111 Selector.Properties.resize(readUInt32());
13112 for (auto &Property : Selector.Properties)
13114 }
13115 }
13116 return &TI;
13117}
13118
13120 if (!Data)
13121 return;
13122 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13123 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
13124 skipInts(3);
13125 }
13126 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
13127 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
13128 Clauses[I] = readOMPClause();
13129 Data->setClauses(Clauses);
13130 if (Data->hasAssociatedStmt())
13131 Data->setAssociatedStmt(readStmt());
13132 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
13133 Data->getChildren()[I] = readStmt();
13134}
13135
13137 unsigned NumVars = readInt();
13139 for (unsigned I = 0; I < NumVars; ++I)
13140 VarList.push_back(readExpr());
13141 return VarList;
13142}
13143
13145 unsigned NumExprs = readInt();
13147 for (unsigned I = 0; I < NumExprs; ++I)
13148 ExprList.push_back(readSubExpr());
13149 return ExprList;
13150}
13151
13156
13157 switch (ClauseKind) {
13159 SourceLocation LParenLoc = readSourceLocation();
13161 return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
13162 EndLoc);
13163 }
13164 case OpenACCClauseKind::If: {
13165 SourceLocation LParenLoc = readSourceLocation();
13166 Expr *CondExpr = readSubExpr();
13167 return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
13168 EndLoc);
13169 }
13171 SourceLocation LParenLoc = readSourceLocation();
13172 bool isConditionExprClause = readBool();
13173 if (isConditionExprClause) {
13174 Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
13175 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
13176 CondExpr, EndLoc);
13177 }
13178 unsigned NumVars = readInt();
13180 for (unsigned I = 0; I < NumVars; ++I)
13181 VarList.push_back(readSubExpr());
13182 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13183 EndLoc);
13184 }
13186 SourceLocation LParenLoc = readSourceLocation();
13187 unsigned NumClauses = readInt();
13189 for (unsigned I = 0; I < NumClauses; ++I)
13190 IntExprs.push_back(readSubExpr());
13191 return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
13192 IntExprs, EndLoc);
13193 }
13195 SourceLocation LParenLoc = readSourceLocation();
13196 Expr *IntExpr = readSubExpr();
13197 return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
13198 IntExpr, EndLoc);
13199 }
13201 SourceLocation LParenLoc = readSourceLocation();
13202 Expr *IntExpr = readSubExpr();
13203 return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
13204 IntExpr, EndLoc);
13205 }
13207 SourceLocation LParenLoc = readSourceLocation();
13208 Expr *IntExpr = readSubExpr();
13209 return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13210 IntExpr, EndLoc);
13211 }
13213 SourceLocation LParenLoc = readSourceLocation();
13214 Expr *IntExpr = readSubExpr();
13215 return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
13216 IntExpr, EndLoc);
13217 }
13219 SourceLocation LParenLoc = readSourceLocation();
13221
13223 for (unsigned I = 0; I < VarList.size(); ++I) {
13224 static_assert(sizeof(OpenACCPrivateRecipe) == 1 * sizeof(int *));
13225 VarDecl *Alloca = readDeclAs<VarDecl>();
13226 RecipeList.push_back({Alloca});
13227 }
13228
13229 return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13230 VarList, RecipeList, EndLoc);
13231 }
13233 SourceLocation LParenLoc = readSourceLocation();
13235 return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13236 EndLoc);
13237 }
13239 SourceLocation LParenLoc = readSourceLocation();
13241 return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13242 VarList, EndLoc);
13243 }
13245 SourceLocation LParenLoc = readSourceLocation();
13248 for (unsigned I = 0; I < VarList.size(); ++I) {
13249 static_assert(sizeof(OpenACCFirstPrivateRecipe) == 2 * sizeof(int *));
13250 VarDecl *Recipe = readDeclAs<VarDecl>();
13251 VarDecl *RecipeTemp = readDeclAs<VarDecl>();
13252 RecipeList.push_back({Recipe, RecipeTemp});
13253 }
13254
13255 return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13256 VarList, RecipeList, EndLoc);
13257 }
13259 SourceLocation LParenLoc = readSourceLocation();
13261 return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
13262 VarList, EndLoc);
13263 }
13265 SourceLocation LParenLoc = readSourceLocation();
13267 return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
13268 VarList, EndLoc);
13269 }
13271 SourceLocation LParenLoc = readSourceLocation();
13273 return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
13274 VarList, EndLoc);
13275 }
13277 SourceLocation LParenLoc = readSourceLocation();
13279 return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13280 VarList, EndLoc);
13281 }
13283 SourceLocation LParenLoc = readSourceLocation();
13285 return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
13286 VarList, EndLoc);
13287 }
13289 SourceLocation LParenLoc = readSourceLocation();
13291 return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
13292 VarList, EndLoc);
13293 }
13295 SourceLocation LParenLoc = readSourceLocation();
13297 return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
13298 VarList, EndLoc);
13299 }
13303 SourceLocation LParenLoc = readSourceLocation();
13306 return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
13307 LParenLoc, ModList, VarList, EndLoc);
13308 }
13312 SourceLocation LParenLoc = readSourceLocation();
13315 return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
13316 LParenLoc, ModList, VarList, EndLoc);
13317 }
13321 SourceLocation LParenLoc = readSourceLocation();
13324 return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
13325 LParenLoc, ModList, VarList, EndLoc);
13326 }
13330 SourceLocation LParenLoc = readSourceLocation();
13333 return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
13334 LParenLoc, ModList, VarList, EndLoc);
13335 }
13337 SourceLocation LParenLoc = readSourceLocation();
13338 Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
13339 return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13340 AsyncExpr, EndLoc);
13341 }
13343 SourceLocation LParenLoc = readSourceLocation();
13344 Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
13345 SourceLocation QueuesLoc = readSourceLocation();
13347 return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
13348 DevNumExpr, QueuesLoc, QueueIdExprs,
13349 EndLoc);
13350 }
13353 SourceLocation LParenLoc = readSourceLocation();
13355 unsigned NumArchs = readInt();
13356
13357 for (unsigned I = 0; I < NumArchs; ++I) {
13358 IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
13360 Archs.emplace_back(Loc, Ident);
13361 }
13362
13363 return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
13364 LParenLoc, Archs, EndLoc);
13365 }
13367 SourceLocation LParenLoc = readSourceLocation();
13371
13372 for (unsigned I = 0; I < VarList.size(); ++I) {
13373 VarDecl *Recipe = readDeclAs<VarDecl>();
13374
13375 static_assert(sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
13376 3 * sizeof(int *));
13377
13379 unsigned NumCombiners = readInt();
13380 for (unsigned I = 0; I < NumCombiners; ++I) {
13383 Expr *Op = readExpr();
13384
13385 Combiners.push_back({LHS, RHS, Op});
13386 }
13387
13388 RecipeList.push_back({Recipe, Combiners});
13389 }
13390
13391 return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
13392 VarList, RecipeList, EndLoc);
13393 }
13395 return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
13397 return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
13399 return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
13401 return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
13403 return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
13405 return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
13407 SourceLocation LParenLoc = readSourceLocation();
13408 bool HasForce = readBool();
13409 Expr *LoopCount = readSubExpr();
13410 return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
13411 HasForce, LoopCount, EndLoc);
13412 }
13414 SourceLocation LParenLoc = readSourceLocation();
13415 unsigned NumClauses = readInt();
13416 llvm::SmallVector<Expr *> SizeExprs;
13417 for (unsigned I = 0; I < NumClauses; ++I)
13418 SizeExprs.push_back(readSubExpr());
13419 return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
13420 SizeExprs, EndLoc);
13421 }
13423 SourceLocation LParenLoc = readSourceLocation();
13424 unsigned NumExprs = readInt();
13427 for (unsigned I = 0; I < NumExprs; ++I) {
13428 GangKinds.push_back(readEnum<OpenACCGangKind>());
13429 // Can't use `readSubExpr` because this is usable from a 'decl' construct.
13430 Exprs.push_back(readExpr());
13431 }
13432 return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
13433 GangKinds, Exprs, EndLoc);
13434 }
13436 SourceLocation LParenLoc = readSourceLocation();
13437 Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
13438 return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
13439 WorkerExpr, EndLoc);
13440 }
13442 SourceLocation LParenLoc = readSourceLocation();
13443 Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
13444 return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
13445 VectorExpr, EndLoc);
13446 }
13448 SourceLocation LParenLoc = readSourceLocation();
13450 return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13451 EndLoc);
13452 }
13454 SourceLocation LParenLoc = readSourceLocation();
13457 LParenLoc, VarList, EndLoc);
13458 }
13459
13461 SourceLocation LParenLoc = readSourceLocation();
13462 bool IsString = readBool();
13463 if (IsString)
13464 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13465 cast<StringLiteral>(readExpr()), EndLoc);
13466 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13467 readIdentifier(), EndLoc);
13468 }
13471 llvm_unreachable("Clause serialization not yet implemented");
13472 }
13473 llvm_unreachable("Invalid Clause Kind");
13474}
13475
13478 for (unsigned I = 0; I < Clauses.size(); ++I)
13479 Clauses[I] = readOpenACCClause();
13480}
13481
13482void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
13483 unsigned NumVars = readInt();
13484 A->Clauses.resize(NumVars);
13485 readOpenACCClauseList(A->Clauses);
13486}
13487
13488static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
13489 // TODO: Maybe it is better to check PrimaryModuleName is a valid
13490 // module name?
13491 llvm::FoldingSetNodeID ID;
13492 ID.AddString(PrimaryModuleName);
13493 return ID.computeStableHash();
13494}
13495
13497 if (!M)
13498 return std::nullopt;
13499
13500 if (M->isHeaderLikeModule())
13501 return std::nullopt;
13502
13503 if (M->isGlobalModule())
13504 return std::nullopt;
13505
13506 StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
13507 return getStableHashForModuleName(PrimaryModuleName);
13508}
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static std::vector< std::string > accumulateFeaturesAsWritten(std::vector< std::string > FeaturesAsWritten)
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename)
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static std::pair< bool, bool > wasValidatedInBuildSession(const ModuleFile &MF, const HeaderSearchOptions &HSOpts)
Returns {build-session validation applies, MF was validated this session}.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue, bool CurrentValue, StringRef ModuleFilename)
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
OptionValidation
@ OptionValidateStrictMatches
@ OptionValidateNone
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
Defines the clang::CommentOptions interface.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
#define SM(sm)
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
Definition Template.h:630
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'filter' clause in the 'pragma omp ...' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the 'pragma omp ...' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned NumPrefs, unsigned NumAttrs)
Creates an empty clause sized for NumPrefs pref-specs and NumAttrs total attr() exprs across them.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents the 'use' clause in 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:35
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:858
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
Definition ASTReader.h:117
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
Definition ASTReader.h:186
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
Definition ASTReader.h:130
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
Definition ASTReader.h:232
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
Definition ASTReader.h:164
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
Definition ASTReader.h:154
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
Definition ASTReader.h:244
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
Definition ASTReader.h:201
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
Definition ASTReader.h:173
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
Definition ASTReader.h:226
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
Definition ASTReader.h:214
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
Definition ASTReader.h:135
virtual void ReadModuleName(StringRef ModuleName)
Definition ASTReader.h:129
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
Definition ASTReader.h:222
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
Definition ASTReader.h:236
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Definition ASTReader.h:144
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:427
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
Definition ASTReader.h:443
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
Definition ASTReader.h:1977
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
Definition ASTReader.h:432
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2599
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
Definition ASTReader.h:2170
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1825
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1838
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
Definition ASTReader.h:1829
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
Definition ASTReader.h:1833
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Definition ASTReader.h:2633
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
Definition ASTReader.h:2180
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
friend class LocalDeclID
Definition ASTReader.h:440
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
Definition ASTReader.h:474
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
Definition ASTReader.h:1809
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
Definition ASTReader.h:2611
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
Definition ASTReader.h:2046
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
~ASTReader() override
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
Definition ASTReader.h:436
friend class serialization::ReadMethodPoolVisitor
Definition ASTReader.h:438
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
Definition ASTReader.h:2485
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
Definition ASTReader.h:2076
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
Definition ASTReader.h:2606
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
Definition ASTReader.h:1985
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
Definition ASTReader.h:437
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
Definition ASTReader.h:1476
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
Definition ASTReader.h:447
@ Success
The control block was read successfully.
Definition ASTReader.h:450
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
Definition ASTReader.h:467
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
Definition ASTReader.h:460
@ Failure
The AST file itself appears corrupted.
Definition ASTReader.h:453
@ VersionMismatch
The AST file was written by a different version of Clang.
Definition ASTReader.h:463
@ HadErrors
The AST file has errors.
Definition ASTReader.h:470
@ Missing
The AST file was missing.
Definition ASTReader.h:456
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
Definition ASTReader.h:2513
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
Definition ASTReader.h:2134
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
Definition ASTReader.h:2469
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
Definition ASTReader.h:1981
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
void PrintStats() override
Print some statistics about AST usage.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
Definition ASTReader.h:433
SmallVector< uint64_t, 64 > RecordData
Definition ASTReader.h:442
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
Definition ASTReader.h:2507
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
Definition ASTReader.h:1810
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
Definition ASTReader.h:473
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
Definition ASTReader.h:1946
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
Definition TypeLoc.h:1777
void setLBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1783
void setRBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1791
void setSizeExpr(Expr *Size)
Definition TypeLoc.h:1803
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2689
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2681
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2673
Attr - This represents one attribute.
Definition Attr.h:46
void setAttr(const Attr *A)
Definition TypeLoc.h:1034
void setConceptReference(ConceptReference *CR)
Definition TypeLoc.h:2405
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2399
void setCaretLoc(SourceLocation Loc)
Definition TypeLoc.h:1532
void setWrittenTypeSpec(TypeSpecifierType written)
Definition TypeLoc.h:663
bool needsExtraLocalData() const
Definition TypeLoc.h:606
void setModeAttr(bool written)
Definition TypeLoc.h:675
void setBuiltinLoc(SourceLocation Loc)
Definition TypeLoc.h:583
void setWrittenWidthSpec(TypeSpecifierWidth written)
Definition TypeLoc.h:652
void setWrittenSignSpec(TypeSpecifierSign written)
Definition TypeLoc.h:636
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ constructor within a class.
Definition DeclCXX.h:2633
Represents a C++ base or member initializer.
Definition DeclCXX.h:2398
void setSourceOrder(int Pos)
Set the source order of this initializer.
Definition DeclCXX.h:2585
Represents a C++ destructor within a class.
Definition DeclCXX.h:2898
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
Definition DeclCXX.cpp:1834
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
Definition DeclCXX.h:1812
base_class_iterator bases_begin()
Definition DeclCXX.h:615
base_class_iterator vbases_begin()
Definition DeclCXX.h:632
Represents a C++ temporary.
Definition ExprCXX.h:1463
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition ExprCXX.cpp:1120
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
Definition DeclBase.h:2717
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
Definition DeclBase.h:2690
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2705
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2390
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition DeclBase.h:2711
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
Definition DeclBase.h:2731
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
Definition DeclID.h:125
DeclID getRawValue() const
Definition DeclID.h:115
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Definition DeclID.h:108
TypeSpecifierType TST
Definition DeclSpec.h:250
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:547
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Definition DeclBase.h:871
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:1001
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition DeclBase.h:824
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
SourceLocation getLocation() const
Definition DeclBase.h:447
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition DeclBase.h:1066
DeclContext * getDeclContext()
Definition DeclBase.h:456
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:935
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
Kind getKind() const
Definition DeclBase.h:450
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
Definition DeclBase.cpp:110
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition DeclBase.h:882
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2291
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2288
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2531
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2513
void setTemplateNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2519
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:1977
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:1998
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2601
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2581
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2590
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2096
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2068
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:234
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
Definition Diagnostic.h:604
bool getEnableAllWarnings() const
Definition Diagnostic.h:704
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:239
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Definition Diagnostic.h:976
bool getSuppressSystemWarnings() const
Definition Diagnostic.h:730
bool getWarningsAsErrors() const
Definition Diagnostic.h:712
diag::Severity getExtensionHandlingBehavior() const
Definition Diagnostic.h:820
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
Definition Diagnostic.h:599
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
Definition TypeLoc.h:744
This represents one expression.
Definition Expr.h:112
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
Definition Decl.h:3195
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition FileEntry.h:57
time_t getModificationTime() const
Definition FileEntry.h:325
off_t getSize() const
Definition FileEntry.h:317
StringRef getName() const
The name of this FileEntry.
Definition FileEntry.h:61
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
bool isValid() const
bool isInvalid() const
Implements support for file system lookup, file system caching, and directory search management.
Definition FileManager.h:52
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Definition Decl.h:2027
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5371
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5660
Wrapper for source info for functions.
Definition TypeLoc.h:1644
unsigned getNumParams() const
Definition TypeLoc.h:1716
void setLocalRangeBegin(SourceLocation L)
Definition TypeLoc.h:1664
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1680
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1723
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1688
void setLocalRangeEnd(SourceLocation L)
Definition TypeLoc.h:1672
void setExceptionSpecRange(SourceRange R)
Definition TypeLoc.h:1702
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
uint64_t BuildSessionTimestamp
The time in seconds when the build session started.
unsigned ImplicitModuleMaps
Implicit module maps.
std::vector< SystemHeaderPrefix > SystemHeaderPrefixes
User-specified system header prefixes.
unsigned EnablePrebuiltImplicitModules
Also search for prebuilt implicit modules in the prebuilt module cache path.
unsigned ModuleMapFileHomeIsCwd
Set the 'home directory' of a module map file to the current working directory (or the home directory...
std::string Sysroot
If non-empty, the directory to use as a "virtual system root" for include paths.
std::string ModuleCachePath
The directory used for the module cache.
std::string ModuleUserBuildPath
The directory used for a user build.
std::vector< std::string > VFSOverlayFiles
The set of user-provided virtual filesystem overlay files.
unsigned UseLibcxx
Use libc++ instead of the default libstdc++.
unsigned UseBuiltinIncludes
Include the compiler builtin includes.
unsigned UseStandardCXXIncludes
Include the system standard C++ library include search directories.
std::vector< Entry > UserEntries
User specified include entries.
std::string ResourceDir
The directory which holds the compiler resource files (builtin includes, etc.).
unsigned UseStandardSystemIncludes
Include the system standard include search directories.
unsigned ModulesValidateOncePerBuildSession
If true, skip verifying input files used by modules if the module was already verified during this bu...
unsigned DisableModuleHash
Whether we should disable the use of the hash string within the module cache.
Encapsulates the information needed to find the file referenced by a #include or #include_next,...
Module * lookupModule(StringRef ModuleName, SourceLocation ImportLoc=SourceLocation(), bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
const HeaderSearchOptions & getHeaderSearchOpts() const
Retrieve the header-search options with which this header search was initialized.
StringRef getSpecificModuleCachePath() const
Retrieve the specific module cache path.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3502
Wrapper for source info for injected class names of class templates.
Definition TypeLoc.h:872
void setAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1614
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Definition LangOptions.h:83
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Definition MacroInfo.h:314
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Definition MacroInfo.h:352
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:40
void setUsedForHeaderGuard(bool Val)
Definition MacroInfo.h:297
void setHasCommaPasting()
Definition MacroInfo.h:221
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
Definition MacroInfo.h:129
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
Definition MacroInfo.h:167
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
Definition MacroInfo.h:255
void setIsFunctionLike()
Function/Object-likeness.
Definition MacroInfo.h:201
void setIsGNUVarargs()
Definition MacroInfo.h:207
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
Definition MacroInfo.h:206
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
Definition MacroInfo.h:155
void setExpansionLoc(SourceLocation Loc)
Definition TypeLoc.h:1383
void setAttrRowOperand(Expr *e)
Definition TypeLoc.h:2131
void setAttrColumnOperand(Expr *e)
Definition TypeLoc.h:2137
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2146
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2125
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1550
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:1559
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:38
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
Deduplication key for a loaded module file in ModuleManager.
Definition Module.h:79
Identifies a module file to be loaded.
Definition Module.h:109
bool empty() const
Checks whether the module file name is empty.
Definition Module.h:194
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
Definition Module.h:142
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
Definition Module.h:134
StringRef str() const
Returns the plain module file name.
Definition Module.h:188
static ModuleFileName makeFromRaw(StringRef Name, unsigned RawKind)
Creates a file name from the raw kind value.
Definition Module.h:126
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
Definition ModuleMap.cpp:64
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Definition ModuleMap.h:196
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Definition ModuleMap.h:572
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
Definition ModuleMap.cpp:53
ModuleHeaderRole
Flags describing the role of a module header.
Definition ModuleMap.h:126
Reference to a module that consists of either an existing/materialized Module object,...
Definition Module.h:275
Describes a module or submodule.
Definition Module.h:340
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:950
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
Definition Module.cpp:314
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition Module.h:671
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
Definition Module.h:606
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:728
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:561
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
Definition Module.h:651
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:643
@ Hidden
All of the names in this module are hidden.
Definition Module.h:645
@ AllVisible
All of the names in this module are visible.
Definition Module.h:647
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
Definition Module.h:961
SourceLocation DefinitionLoc
The location of the module definition.
Definition Module.h:346
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
Definition Module.h:541
ModuleKind Kind
The kind of this module.
Definition Module.h:385
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
Definition Module.h:1001
bool isUnimportable() const
Determine whether this module has been declared unimportable.
Definition Module.h:763
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
Definition Module.h:967
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:589
std::string Name
The name of this module.
Definition Module.h:343
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
Definition Module.h:955
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
Definition Module.h:595
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
Definition Module.h:634
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
Definition Module.h:720
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
Definition Module.h:689
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition Module.h:985
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
Definition Module.h:552
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
Definition Module.h:866
OptionalDirectoryEntryRef Directory
The build directory of this module.
Definition Module.h:394
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
Definition Module.h:662
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
Definition Module.h:639
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
Definition Module.h:905
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
Definition Module.h:624
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
Definition Module.h:398
ASTFileSignature Signature
The module signature.
Definition Module.h:407
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:438
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:616
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
Definition Module.cpp:380
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:741
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:576
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
Definition Module.h:977
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
Definition Module.h:417
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:572
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Definition Module.h:611
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
Definition Module.h:849
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:658
std::vector< Conflict > Conflicts
The list of conflicts.
Definition Module.h:753
This represents a decl that may have a name.
Definition Decl.h:274
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Definition Decl.cpp:1847
Represent a C++ namespace.
Definition Decl.h:592
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
method_range methods() const
Definition DeclObjC.h:1016
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:1313
void setNameEndLoc(SourceLocation Loc)
Definition TypeLoc.h:1325
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
bool hasBody() const override
Determine whether this method has a body.
Definition DeclObjC.h:523
void setLazyBody(uint64_t Offset)
Definition DeclObjC.h:528
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1592
void setTypeArgsRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1196
unsigned getNumTypeArgs() const
Definition TypeLoc.h:1200
unsigned getNumProtocols() const
Definition TypeLoc.h:1230
void setTypeArgsLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1188
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
Definition TypeLoc.h:1209
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1218
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1226
void setHasBaseTypeAsWritten(bool HasBaseType)
Definition TypeLoc.h:1258
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:1239
The basic abstraction for the target Objective-C runtime.
Definition ObjCRuntime.h:28
Kind
The basic Objective-C runtimes that we know about.
Definition ObjCRuntime.h:31
unsigned getNumProtocols() const
Definition TypeLoc.h:932
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:941
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:918
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:928
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
Definition TypeLoc.h:1099
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2633
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2316
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1415
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1411
Represents a parameter to a function.
Definition Decl.h:1817
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2725
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1519
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
@ FastWidth
The width of the "fast" qualifier mask.
Definition TypeBase.h:376
@ FastMask
The fast qualifier mask.
Definition TypeBase.h:379
void setAmpAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1628
Wrapper for source info for record types.
Definition TypeLoc.h:855
Declaration of a redeclarable template.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition Decl.h:5365
This table allows us to fully hide how we implement multi-keyword caching.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
void * getAsOpaquePtr() const
void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method)
Add the given method to the list of globally-known methods.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
Definition SemaObjC.h:220
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:869
SemaObjC & ObjC()
Definition Sema.h:1519
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:661
IdentifierResolver IdResolver
Definition Sema.h:3524
PragmaMsStackAction
Definition Sema.h:1850
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
Definition ASTReader.h:360
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
Encodes a location in the source.
static SourceLocation getFromRawEncoding(UIntTy Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
Definition Stmt.h:86
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:816
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:824
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:805
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
Definition TypeLoc.h:1913
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TypeLoc.cpp:648
Token - This structure provides full information about a lexed token.
Definition Token.h:36
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
Definition TypeBase.h:3420
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
Definition TypeLoc.h:171
bool isNull() const
Definition TypeLoc.h:121
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
Definition TypeLoc.h:2265
A container of type source information.
Definition TypeBase.h:8418
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
The base class of the type hierarchy.
Definition TypeBase.h:1875
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9277
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3597
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2208
void setTypeofLoc(SourceLocation Loc)
Definition TypeLoc.h:2200
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2216
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2350
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2344
void setUnderlyingTInfo(TypeSourceInfo *TInfo)
Definition TypeLoc.h:2356
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2347
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
Represents a variable declaration or definition.
Definition Decl.h:932
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2045
Captures information about a #pragma weak directive.
Definition Weak.h:25
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ AlreadyLoaded
The module file had already been loaded.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
The input file that has been loaded from this AST file, along with bools indicating whether this was ...
Definition ModuleFile.h:85
OptionalFileEntryRef getFile() const
Definition ModuleFile.h:114
static InputFile getNotFound()
Definition ModuleFile.h:108
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:158
const PPEntityOffset * PreprocessedEntityOffsets
Definition ModuleFile.h:417
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
Definition ModuleFile.h:372
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
Definition ModuleFile.h:496
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
Definition ModuleFile.h:284
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
Definition ModuleFile.h:274
StringRef Data
The serialized bitstream data for this file.
Definition ModuleFile.h:260
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:524
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
Definition ModuleFile.h:464
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:336
ModuleFileKey FileKey
The key ModuleManager used for the module file.
Definition ModuleFile.h:180
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
Definition ModuleFile.h:362
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
Definition ModuleFile.h:415
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
Definition ModuleFile.h:544
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:527
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
Definition ModuleFile.h:389
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
Definition ModuleFile.h:299
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
Definition ModuleFile.h:376
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
Definition ModuleFile.h:352
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:503
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
Definition ModuleFile.h:467
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
Definition ModuleFile.h:368
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
Definition ModuleFile.h:461
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
Definition ModuleFile.h:343
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
Definition ModuleFile.h:293
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
Definition ModuleFile.h:302
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
Definition ModuleFile.h:481
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
Definition ModuleFile.h:552
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
Definition ModuleFile.h:436
SourceLocation ImportLoc
The source location where this module was first imported.
Definition ModuleFile.h:277
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
Definition ModuleFile.h:519
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
Definition ModuleFile.h:347
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
Definition ModuleFile.h:382
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
Definition ModuleFile.h:203
time_t ModTime
Modification of the module file.
Definition ModuleFile.h:223
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
Definition ModuleFile.h:199
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
Definition ModuleFile.h:411
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
Definition ModuleFile.h:305
unsigned LocalNumSubmodules
The number of submodules in this module.
Definition ModuleFile.h:445
SourceLocation FirstLoc
The first source location in this module.
Definition ModuleFile.h:280
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
Definition ModuleFile.h:455
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
Definition ModuleFile.h:231
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
Definition ModuleFile.h:330
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
Definition ModuleFile.h:217
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
Definition ModuleFile.h:195
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
Definition ModuleFile.h:570
bool HasTimestamps
Whether timestamps are included in this module file.
Definition ModuleFile.h:214
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
Definition ModuleFile.h:296
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
Definition ModuleFile.h:327
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
Definition ModuleFile.h:208
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
Definition ModuleFile.h:478
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
Definition ModuleFile.h:516
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
Definition ModuleFile.h:333
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
Definition ModuleFile.h:440
unsigned Index
The index of this module in the list of modules.
Definition ModuleFile.h:171
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
Definition ModuleFile.h:263
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
Definition ModuleFile.h:448
uint64_t SizeInBits
The size of this file, in bits.
Definition ModuleFile.h:251
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
Definition ModuleFile.h:540
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition ModuleFile.h:254
bool StandardCXXModule
Whether this module file is a standard C++ module.
Definition ModuleFile.h:211
unsigned LocalNumTypes
The number of types in this AST file.
Definition ModuleFile.h:536
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:288
const PPSkippedRange * PreprocessedSkippedRangeOffsets
Definition ModuleFile.h:423
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
Definition ModuleFile.h:315
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
Definition ModuleFile.h:408
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
Definition ModuleFile.h:339
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
Definition ModuleFile.h:567
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
Definition ModuleFile.h:452
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition ModuleFile.h:513
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
Definition ModuleFile.h:402
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
Definition ModuleFile.h:227
unsigned LocalNumMacros
The number of macros in this AST file.
Definition ModuleFile.h:385
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
Definition ModuleFile.h:489
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
Definition ModuleFile.h:509
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
Definition ModuleFile.h:429
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
Definition ModuleFile.h:234
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
Definition ModuleFile.h:322
unsigned Generation
The generation of which this module file is a part.
Definition ModuleFile.h:244
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
Definition ModuleFile.h:359
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
Definition ModuleFile.h:484
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
Definition ModuleFile.h:396
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
Definition ModuleFile.h:257
ModuleFileName FileName
The file name of the module file.
Definition ModuleFile.h:177
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
Definition ModuleFile.h:458
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
Definition ModuleFile.h:237
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:506
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
Definition ModuleFile.h:549
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
Definition ModuleFile.h:421
unsigned LocalNumSelectors
The number of selectors new to this file.
Definition ModuleFile.h:474
ModuleKind Kind
The type of this module.
Definition ModuleFile.h:174
std::string ModuleName
The name of the module.
Definition ModuleFile.h:183
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
Definition ModuleFile.h:399
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:531
std::string BaseDirectory
The base directory of the module.
Definition ModuleFile.h:186
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Definition ModuleFile.h:563
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
RawLocEncoding getBegin() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type GetInternalKey(external_key_type ekey)
bool EqualKey(internal_key_ref a, internal_key_ref b)
static hash_value_type ComputeHash(internal_key_ref ikey)
data_type ReadData(internal_key_ref, const unsigned char *d, unsigned DataLen)
static internal_key_type ReadKey(const unsigned char *d, unsigned)
Class that performs lookup to specialized decls.
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
@ EXTENSION_METADATA
Metadata describing this particular extension.
SubmoduleRecordTypes
Record types used within a submodule description block.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
Definition ModuleFile.h:144
@ AllFiles
When the validation is done both for user files and system files.
Definition ModuleFile.h:148
@ Disabled
When the validation is disabled. For example, for a precompiled header.
Definition ModuleFile.h:141
@ UserFiles
When the validation is done only for user files as an optimization.
Definition ModuleFile.h:146
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
Definition ASTBitCodes.h:66
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
Definition ASTBitCodes.h:70
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
Definition ASTBitCodes.h:47
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition ASTBitCodes.h:88
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
Definition ModuleFile.h:44
@ MK_PCH
File is a PCH file treated as such.
Definition ModuleFile.h:52
@ MK_Preamble
File is a PCH file treated as the preamble.
Definition ModuleFile.h:55
@ MK_MainFile
File is a PCH file treated as the actual main file.
Definition ModuleFile.h:58
@ MK_ExplicitModule
File is an explicitly-loaded module.
Definition ModuleFile.h:49
@ MK_ImplicitModule
File is an implicitly-loaded module.
Definition ModuleFile.h:46
@ MK_PrebuiltModule
File is from a prebuilt module path.
Definition ModuleFile.h:61
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
Definition ASTBitCodes.h:94
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
Definition ASTBitCodes.h:63
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:27
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OpenACCReductionOperator
bool isa(CodeGen::Address addr)
Definition Address.h:330
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:196
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
Definition Sanitizers.h:230
@ CPlusPlus
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenACCModifierKind
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
Definition Format.h:3951
@ Success
Annotation was successful.
Definition Parser.h:65
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
Definition OpenMPKinds.h:39
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:124
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPNumTeamsClauseModifier
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
OpenACCDefaultClauseKind
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
Definition OpenMPKinds.h:88
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
@ Undefined
Keep undefined.
PredefinedDeclIDs
Predefined declaration IDs.
Definition DeclID.h:31
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
Definition DeclID.h:78
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
Definition DeclID.h:36
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
Definition DeclID.h:45
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
Definition DeclID.h:69
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
Definition DeclID.h:81
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
Definition DeclID.h:57
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
Definition DeclID.h:48
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
Definition DeclID.h:54
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
Definition DeclID.h:42
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
Definition DeclID.h:87
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
Definition DeclID.h:51
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
Definition DeclID.h:63
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
Definition DeclID.h:66
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
Definition DeclID.h:75
@ PREDEF_DECL_NULL_ID
The NULL declaration.
Definition DeclID.h:33
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
Definition DeclID.h:60
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
Definition DeclID.h:72
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
Definition DeclID.h:39
@ Property
The type of a property.
Definition TypeBase.h:911
@ Result
The result type of a method or function.
Definition TypeBase.h:905
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
Definition Parser.h:81
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
Definition OpenMPKinds.h:55
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
Definition Warnings.cpp:50
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
Definition Specifiers.h:48
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
Definition OpenMPKinds.h:92
PragmaMSStructKind
Definition PragmaKinds.h:24
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
Definition OpenMPKinds.h:63
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
Definition Specifiers.h:51
OpenMPDynGroupprivateClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2703
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
Definition Version.cpp:68
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
Definition Address.h:327
@ None
The alignment was not explicit in code.
Definition ASTContext.h:176
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
Definition OpenMPKinds.h:48
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
Definition OpenMPKinds.h:79
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5984
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
Definition OpenMPKinds.h:28
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
Definition OpenMPKinds.h:31
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' clause.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
Definition OpenMPKinds.h:71
unsigned long uint64_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
#define true
Definition stdbool.h:25
__LIBC_ATTRS FILE * stderr
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
Definition Module.h:198
static constexpr size_t size
Definition Module.h:201
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
Definition Module.h:221
static ASTFileSignature createDummy()
Definition Module.h:231
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
bool ParseAllComments
Treat ordinary comments as documentation comments.
BlockCommandNamesTy BlockCommandNames
Command names to treat as block commands in comments.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
The preprocessor keeps track of this information for each file that is #included.
void mergeModuleMembership(ModuleMap::ModuleHeaderRole Role)
Update the module membership bits based on the header role.
LazyIdentifierInfoPtr LazyControllingMacro
If this file has a #ifndef XXX (or equivalent) guard that protects the entire contents of the file,...
unsigned DirInfo
Keep track of whether this is a system header, and if so, whether it is C++ clean or not.
unsigned isPragmaOnce
True if this is a #pragma once file.
unsigned IsValid
Whether this file has been looked up as a header.
unsigned isImport
True if this is a #import'd file.
unsigned External
Whether this header file info was supplied by an external source, and has not changed since.
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
Metadata for a module file extension.
unsigned MajorVersion
The major version of the extension data.
std::string UserInfo
A string containing additional user information that will be stored with the metadata.
std::string BlockName
The name used to identify this particular extension block within the resulting module file.
unsigned MinorVersion
The minor version of the extension data.
A conflict between two modules.
Definition Module.h:744
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:749
ModuleRef Other
The module that this module conflicts with.
Definition Module.h:746
Information about a header directive as found in the module map file.
Definition Module.h:487
A library or framework to link against when an entity from this module is used.
Definition Module.h:703
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Definition Decl.h:753
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
Definition Decl.h:767
NestedNameSpecifierLoc QualifierLoc
Definition Decl.h:754
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Definition Decl.h:760
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
Definition Sanitizers.h:195
SanitizerMask Mask
Bitmask of enabled sanitizers.
Definition Sanitizers.h:201
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
Definition Sema.h:1861
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes a single change detected in a module file or input file.
Definition ModuleFile.h:125
The input file info that has been loaded from an AST file.
Definition ModuleFile.h:65
Describes the categories of an Objective-C class.
#define log(__x)
Definition tgmath.h:460