clang 24.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"
32#include "clang/AST/Expr.h"
33#include "clang/AST/ExprCXX.h"
42#include "clang/AST/Type.h"
43#include "clang/AST/TypeLoc.h"
55#include "clang/Basic/LLVM.h"
57#include "clang/Basic/Module.h"
71#include "clang/Basic/Version.h"
74#include "clang/Lex/MacroInfo.h"
75#include "clang/Lex/ModuleMap.h"
79#include "clang/Lex/Token.h"
81#include "clang/Sema/Scope.h"
82#include "clang/Sema/Sema.h"
83#include "clang/Sema/SemaCUDA.h"
84#include "clang/Sema/SemaObjC.h"
87#include "clang/Sema/Weak.h"
100#include "llvm/ADT/APFloat.h"
101#include "llvm/ADT/APInt.h"
102#include "llvm/ADT/ArrayRef.h"
103#include "llvm/ADT/DenseMap.h"
104#include "llvm/ADT/FoldingSet.h"
105#include "llvm/ADT/IntrusiveRefCntPtr.h"
106#include "llvm/ADT/STLExtras.h"
107#include "llvm/ADT/ScopeExit.h"
108#include "llvm/ADT/Sequence.h"
109#include "llvm/ADT/SmallPtrSet.h"
110#include "llvm/ADT/SmallVector.h"
111#include "llvm/ADT/StringExtras.h"
112#include "llvm/ADT/StringMap.h"
113#include "llvm/ADT/StringRef.h"
114#include "llvm/ADT/iterator_range.h"
115#include "llvm/Bitstream/BitstreamReader.h"
116#include "llvm/Support/Chrono.h"
117#include "llvm/Support/Compiler.h"
118#include "llvm/Support/Compression.h"
119#include "llvm/Support/DJB.h"
120#include "llvm/Support/Endian.h"
121#include "llvm/Support/Error.h"
122#include "llvm/Support/ErrorHandling.h"
123#include "llvm/Support/LEB128.h"
124#include "llvm/Support/MemoryBuffer.h"
125#include "llvm/Support/Path.h"
126#include "llvm/Support/SaveAndRestore.h"
127#include "llvm/Support/TimeProfiler.h"
128#include "llvm/Support/Timer.h"
129#include "llvm/Support/VersionTuple.h"
130#include "llvm/Support/VirtualFileSystem.h"
131#include "llvm/Support/raw_ostream.h"
132#include "llvm/TargetParser/Triple.h"
133#include <algorithm>
134#include <cassert>
135#include <cstddef>
136#include <cstdint>
137#include <cstdio>
138#include <ctime>
139#include <iterator>
140#include <limits>
141#include <map>
142#include <memory>
143#include <optional>
144#include <string>
145#include <system_error>
146#include <tuple>
147#include <utility>
148#include <vector>
149
150using namespace clang;
151using namespace clang::serialization;
152using namespace clang::serialization::reader;
153using llvm::BitstreamCursor;
154
155//===----------------------------------------------------------------------===//
156// ChainedASTReaderListener implementation
157//===----------------------------------------------------------------------===//
158
159bool
161 return First->ReadFullVersionInformation(FullVersion) ||
162 Second->ReadFullVersionInformation(FullVersion);
163}
164
166 First->ReadModuleName(ModuleName);
167 Second->ReadModuleName(ModuleName);
168}
169
170void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
171 First->ReadModuleMapFile(ModuleMapPath);
172 Second->ReadModuleMapFile(ModuleMapPath);
173}
174
176 const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain,
177 bool AllowCompatibleDifferences) {
178 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
179 AllowCompatibleDifferences) ||
180 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
181 AllowCompatibleDifferences);
182}
183
185 const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain,
186 bool AllowCompatibleDifferences) {
187 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
188 AllowCompatibleDifferences) ||
189 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
190 AllowCompatibleDifferences);
191}
192
194 const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain,
195 bool AllowCompatibleDifferences) {
196 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
197 AllowCompatibleDifferences) ||
198 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
199 AllowCompatibleDifferences);
200}
201
203 DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) {
204 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
205 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
206}
207
208bool
210 bool Complain) {
211 return First->ReadFileSystemOptions(FSOpts, Complain) ||
212 Second->ReadFileSystemOptions(FSOpts, Complain);
213}
214
216 const HeaderSearchOptions &HSOpts, StringRef ModuleFilename,
217 StringRef ContextHash, bool Complain) {
218 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
219 Complain) ||
220 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
221 Complain);
222}
223
225 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
226 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
227 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
228 Complain, SuggestedPredefines) ||
229 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
230 Complain, SuggestedPredefines);
231}
232
234 uint32_t Value) {
235 First->ReadCounter(M, Value);
236 Second->ReadCounter(M, Value);
237}
238
240 return First->needsInputFileVisitation() ||
241 Second->needsInputFileVisitation();
242}
243
245 return First->needsSystemInputFileVisitation() ||
246 Second->needsSystemInputFileVisitation();
247}
248
250 ModuleKind Kind,
251 bool DirectlyImported) {
252 First->visitModuleFile(Filename, Kind, DirectlyImported);
253 Second->visitModuleFile(Filename, Kind, DirectlyImported);
254}
255
257 bool isSystem,
258 bool isOverridden,
259 bool isExplicitModule) {
260 bool Continue = false;
261 if (First->needsInputFileVisitation() &&
262 (!isSystem || First->needsSystemInputFileVisitation()))
263 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
264 isExplicitModule);
265 if (Second->needsInputFileVisitation() &&
266 (!isSystem || Second->needsSystemInputFileVisitation()))
267 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
268 isExplicitModule);
269 return Continue;
270}
271
273 const ModuleFileExtensionMetadata &Metadata) {
274 First->readModuleFileExtension(Metadata);
275 Second->readModuleFileExtension(Metadata);
276}
277
278//===----------------------------------------------------------------------===//
279// PCH validator implementation
280//===----------------------------------------------------------------------===//
281
283
284static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(
285 DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue,
286 bool CurrentValue, StringRef ModuleFilename) {
287 if (!Diags)
288 return true;
289 return Diags->Report(diag::err_ast_file_langopt_mismatch)
290 << Description << SerializedValue << CurrentValue << ModuleFilename;
291}
292
293static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(
294 DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename) {
295 if (!Diags)
296 return true;
297 return Diags->Report(diag::err_ast_file_langopt_value_mismatch)
298 << Description << ModuleFilename;
299}
300
301/// Compare the given set of language options against an existing set of
302/// language options.
303///
304/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
305/// \param AllowCompatibleDifferences If true, differences between compatible
306/// language options will be permitted.
307///
308/// \returns true if the languagae options mis-match, false otherwise.
309static bool checkLanguageOptions(const LangOptions &LangOpts,
310 const LangOptions &ExistingLangOpts,
311 StringRef ModuleFilename,
312 DiagnosticsEngine *Diags,
313 bool AllowCompatibleDifferences = true) {
314 // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
316
317#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
318 if constexpr (CK::Compatibility != CK::Benign) { \
319 if ((CK::Compatibility == CK::NotCompatible) || \
320 (CK::Compatibility == CK::Compatible && \
321 !AllowCompatibleDifferences)) { \
322 if (ExistingLangOpts.Name != LangOpts.Name) { \
323 if (Bits == 1) \
324 return diagnoseLanguageOptionFlagMismatch( \
325 Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
326 ModuleFilename); \
327 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
328 ModuleFilename); \
329 } \
330 } \
331 }
332
333#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
334 if constexpr (CK::Compatibility != CK::Benign) { \
335 if ((CK::Compatibility == CK::NotCompatible) || \
336 (CK::Compatibility == CK::Compatible && \
337 !AllowCompatibleDifferences)) { \
338 if (ExistingLangOpts.Name != LangOpts.Name) { \
339 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
340 ModuleFilename); \
341 } \
342 } \
343 }
344
345#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
346 if constexpr (CK::Compatibility != CK::Benign) { \
347 if ((CK::Compatibility == CK::NotCompatible) || \
348 (CK::Compatibility == CK::Compatible && \
349 !AllowCompatibleDifferences)) { \
350 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
351 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
352 ModuleFilename); \
353 } \
354 } \
355 }
356
357#include "clang/Basic/LangOptions.def"
358
359 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
360 return diagnoseLanguageOptionValueMismatch(Diags, "module features",
361 ModuleFilename);
362 }
363
364 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
366 Diags, "target Objective-C runtime", ModuleFilename);
367 }
368
369 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
371 return diagnoseLanguageOptionValueMismatch(Diags, "block command names",
372 ModuleFilename);
373 }
374
375 // Sanitizer feature mismatches are treated as compatible differences. If
376 // compatible differences aren't allowed, we still only want to check for
377 // mismatches of non-modular sanitizers (the only ones which can affect AST
378 // generation).
379 if (!AllowCompatibleDifferences) {
380 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
381 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
382 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
383 ExistingSanitizers.clear(ModularSanitizers);
384 ImportedSanitizers.clear(ModularSanitizers);
385 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
386 const std::string Flag = "-fsanitize=";
387 if (Diags) {
388#define SANITIZER(NAME, ID) \
389 { \
390 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
391 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
392 if (InExistingModule != InImportedModule) \
393 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
394 << InExistingModule << ModuleFilename << (Flag + NAME); \
395 }
396#include "clang/Basic/Sanitizers.def"
397 }
398 return true;
399 }
400 }
401
402 return false;
403}
404
405static bool checkCodegenOptions(const CodeGenOptions &CGOpts,
406 const CodeGenOptions &ExistingCGOpts,
407 StringRef ModuleFilename,
408 DiagnosticsEngine *Diags,
409 bool AllowCompatibleDifferences = true) {
410 // FIXME: Specify and print a description for each option instead of the name.
411 // FIXME: Replace with C++20 `using enum CodeGenOptions::CompatibilityKind`.
413#define CODEGENOPT(Name, Bits, Default, Compatibility) \
414 if constexpr (CK::Compatibility != CK::Benign) { \
415 if ((CK::Compatibility == CK::NotCompatible) || \
416 (CK::Compatibility == CK::Compatible && \
417 !AllowCompatibleDifferences)) { \
418 if (ExistingCGOpts.Name != CGOpts.Name) { \
419 if (Diags) { \
420 if (Bits == 1) \
421 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
422 << #Name << CGOpts.Name << ExistingCGOpts.Name \
423 << ModuleFilename; \
424 else \
425 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
426 << #Name << ModuleFilename; \
427 } \
428 return true; \
429 } \
430 } \
431 }
432
433#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
434 if constexpr (CK::Compatibility != CK::Benign) { \
435 if ((CK::Compatibility == CK::NotCompatible) || \
436 (CK::Compatibility == CK::Compatible && \
437 !AllowCompatibleDifferences)) { \
438 if (ExistingCGOpts.Name != CGOpts.Name) { \
439 if (Diags) \
440 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
441 << #Name << ModuleFilename; \
442 return true; \
443 } \
444 } \
445 }
446#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
447 if constexpr (CK::Compatibility != CK::Benign) { \
448 if ((CK::Compatibility == CK::NotCompatible) || \
449 (CK::Compatibility == CK::Compatible && \
450 !AllowCompatibleDifferences)) { \
451 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
452 if (Diags) \
453 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
454 << #Name << ModuleFilename; \
455 return true; \
456 } \
457 } \
458 }
459#define DEBUGOPT(Name, Bits, Default, Compatibility)
460#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
461#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
462#include "clang/Basic/CodeGenOptions.def"
463
464 return false;
465}
466
467static std::vector<std::string>
468accumulateFeaturesAsWritten(std::vector<std::string> FeaturesAsWritten) {
469 llvm::erase_if(FeaturesAsWritten, [](const std::string &S) {
470 return S.empty() || (S[0] != '+' && S[0] != '-');
471 });
472 llvm::stable_sort(FeaturesAsWritten,
473 [](const std::string &A, const std::string &B) {
474 return A.substr(1) < B.substr(1);
475 });
476 auto NewRend =
477 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
478 [](const std::string &A, const std::string &B) {
479 return A.substr(1) == B.substr(1);
480 });
481 // Because we are operating on reverse iterators, the duplicate elements
482 // are actually at the beginning.
483 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
484 return FeaturesAsWritten;
485}
486
487/// Compare the given set of target options against an existing set of
488/// target options.
489///
490/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
491///
492/// \returns true if the target options mis-match, false otherwise.
493static bool checkTargetOptions(const TargetOptions &TargetOpts,
494 const TargetOptions &ExistingTargetOpts,
495 StringRef ModuleFilename,
496 DiagnosticsEngine *Diags,
497 bool AllowCompatibleDifferences = true) {
498#define CHECK_TARGET_OPT(Field, Name) \
499 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
500 if (Diags) \
501 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
502 << ModuleFilename << Name << TargetOpts.Field \
503 << ExistingTargetOpts.Field; \
504 return true; \
505 }
506
507 // The triple and ABI must match exactly.
508 CHECK_TARGET_OPT(Triple, "target");
509 CHECK_TARGET_OPT(ABI, "target ABI");
510
511 // We can tolerate different CPUs in many cases, notably when one CPU
512 // supports a strict superset of another. When allowing compatible
513 // differences skip this check.
514 if (!AllowCompatibleDifferences) {
515 CHECK_TARGET_OPT(CPU, "target CPU");
516 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
517 }
518
519#undef CHECK_TARGET_OPT
520
521 // Compare feature sets.
522 // Alternatively, we could be diffing TargetOpts.Features, but that would
523 // clutter the output with implied features.
524 std::vector<std::string> ExistingFeatures =
526 std::vector<std::string> ReadFeatures =
528
529 // We compute the set difference in both directions explicitly so that we can
530 // diagnose the differences differently.
531 auto FeatureLess = [](StringRef A, StringRef B) {
532 return A.substr(1) < B.substr(1);
533 };
534
535 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
536 std::set_difference(ExistingFeatures.begin(), ExistingFeatures.end(),
537 ReadFeatures.begin(), ReadFeatures.end(),
538 std::back_inserter(UnmatchedExistingFeatures),
539 FeatureLess);
540 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
541 ExistingFeatures.begin(), ExistingFeatures.end(),
542 std::back_inserter(UnmatchedReadFeatures), FeatureLess);
543
544 // If we are allowing compatible differences and the read feature set is
545 // a strict subset of the existing feature set, there is nothing to diagnose.
546 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
547 return false;
548
549 if (Diags) {
550 for (StringRef Feature : UnmatchedReadFeatures)
551 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
552 << /* is-existing-feature */ false << ModuleFilename << Feature;
553 for (StringRef Feature : UnmatchedExistingFeatures)
554 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
555 << /* is-existing-feature */ true << ModuleFilename << Feature;
556 }
557
558 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
559}
560
562 StringRef ModuleFilename, bool Complain,
563 bool AllowCompatibleDifferences) {
564 const LangOptions &ExistingLangOpts = PP.getLangOpts();
565 return checkLanguageOptions(LangOpts, ExistingLangOpts, ModuleFilename,
566 Complain ? &Reader.Diags : nullptr,
567 AllowCompatibleDifferences);
568}
569
571 StringRef ModuleFilename, bool Complain,
572 bool AllowCompatibleDifferences) {
573 const CodeGenOptions &ExistingCGOpts = Reader.getCodeGenOpts();
574 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
575 Complain ? &Reader.Diags : nullptr,
576 AllowCompatibleDifferences);
577}
578
580 StringRef ModuleFilename, bool Complain,
581 bool AllowCompatibleDifferences) {
582 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
583 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
584 Complain ? &Reader.Diags : nullptr,
585 AllowCompatibleDifferences);
586}
587
588namespace {
589
590using MacroDefinitionsMap =
591 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
592
593class DeclsSet {
596
597public:
598 operator ArrayRef<NamedDecl *>() const { return Decls; }
599
600 bool empty() const { return Decls.empty(); }
601
602 bool insert(NamedDecl *ND) {
603 auto [_, Inserted] = Found.insert(ND);
604 if (Inserted)
605 Decls.push_back(ND);
606 return Inserted;
607 }
608};
609
610using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
611
612} // namespace
613
615 DiagnosticsEngine &Diags,
616 StringRef ModuleFilename,
617 bool Complain) {
618 using Level = DiagnosticsEngine::Level;
619
620 // Check current mappings for new -Werror mappings, and the stored mappings
621 // for cases that were explicitly mapped to *not* be errors that are now
622 // errors because of options like -Werror.
623 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
624
625 for (DiagnosticsEngine *MappingSource : MappingSources) {
626 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
627 diag::kind DiagID = DiagIDMappingPair.first;
628 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
629 if (CurLevel < DiagnosticsEngine::Error)
630 continue; // not significant
631 Level StoredLevel =
632 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
633 if (StoredLevel < DiagnosticsEngine::Error) {
634 if (Complain)
635 Diags.Report(diag::err_ast_file_diagopt_mismatch)
636 << "-Werror=" + Diags.getDiagnosticIDs()
637 ->getWarningOptionForDiag(DiagID)
638 .str()
639 << ModuleFilename;
640 return true;
641 }
642 }
643 }
644
645 return false;
646}
647
650 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
651 return true;
652 return Ext >= diag::Severity::Error;
653}
654
656 DiagnosticsEngine &Diags,
657 StringRef ModuleFilename, bool IsSystem,
658 bool SystemHeaderWarningsInModule,
659 bool Complain) {
660 // Top-level options
661 if (IsSystem) {
662 if (Diags.getSuppressSystemWarnings())
663 return false;
664 // If -Wsystem-headers was not enabled before, and it was not explicit,
665 // be conservative
666 if (StoredDiags.getSuppressSystemWarnings() &&
667 !SystemHeaderWarningsInModule) {
668 if (Complain)
669 Diags.Report(diag::err_ast_file_diagopt_mismatch)
670 << "-Wsystem-headers" << ModuleFilename;
671 return true;
672 }
673 }
674
675 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
676 if (Complain)
677 Diags.Report(diag::err_ast_file_diagopt_mismatch)
678 << "-Werror" << ModuleFilename;
679 return true;
680 }
681
682 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
683 !StoredDiags.getEnableAllWarnings()) {
684 if (Complain)
685 Diags.Report(diag::err_ast_file_diagopt_mismatch)
686 << "-Weverything -Werror" << ModuleFilename;
687 return true;
688 }
689
690 if (isExtHandlingFromDiagsError(Diags) &&
691 !isExtHandlingFromDiagsError(StoredDiags)) {
692 if (Complain)
693 Diags.Report(diag::err_ast_file_diagopt_mismatch)
694 << "-pedantic-errors" << ModuleFilename;
695 return true;
696 }
697
698 return checkDiagnosticGroupMappings(StoredDiags, Diags, ModuleFilename,
699 Complain);
700}
701
702/// Return the top import module if it is implicit, nullptr otherwise.
704 Preprocessor &PP) {
705 // If the original import came from a file explicitly generated by the user,
706 // don't check the diagnostic mappings.
707 // FIXME: currently this is approximated by checking whether this is not a
708 // module import of an implicitly-loaded module file.
709 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
710 // the transitive closure of its imports, since unrelated modules cannot be
711 // imported until after this module finishes validation.
712 ModuleFile *TopImport = &*ModuleMgr.rbegin();
713 while (!TopImport->ImportedBy.empty())
714 TopImport = TopImport->ImportedBy[0];
715 if (TopImport->Kind != MK_ImplicitModule)
716 return nullptr;
717
718 StringRef ModuleName = TopImport->ModuleName;
719 assert(!ModuleName.empty() && "diagnostic options read before module name");
720
721 Module *M =
722 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
723 assert(M && "missing module");
724 return M;
725}
726
728 StringRef ModuleFilename,
729 bool Complain) {
730 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
732 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
733 // This should never fail, because we would have processed these options
734 // before writing them to an ASTFile.
735 ProcessWarningOptions(*Diags, DiagOpts,
736 PP.getFileManager().getVirtualFileSystem(),
737 /*Report*/ false);
738
739 ModuleManager &ModuleMgr = Reader.getModuleManager();
740 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
741
742 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
743 if (!TopM)
744 return false;
745
746 Module *Importer = PP.getCurrentModule();
747
748 DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
749 bool SystemHeaderWarningsInModule =
750 Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
751 Importer->Name);
752
753 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
754 // contains the union of their flags.
755 return checkDiagnosticMappings(*Diags, ExistingDiags, ModuleFilename,
756 TopM->IsSystem, SystemHeaderWarningsInModule,
757 Complain);
758}
759
760/// Collect the macro definitions provided by the given preprocessor
761/// options.
762static void
764 MacroDefinitionsMap &Macros,
765 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
766 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
767 StringRef Macro = PPOpts.Macros[I].first;
768 bool IsUndef = PPOpts.Macros[I].second;
769
770 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
771 StringRef MacroName = MacroPair.first;
772 StringRef MacroBody = MacroPair.second;
773
774 // For an #undef'd macro, we only care about the name.
775 if (IsUndef) {
776 auto [It, Inserted] = Macros.try_emplace(MacroName);
777 if (MacroNames && Inserted)
778 MacroNames->push_back(MacroName);
779
780 It->second = std::make_pair("", true);
781 continue;
782 }
783
784 // For a #define'd macro, figure out the actual definition.
785 if (MacroName.size() == Macro.size())
786 MacroBody = "1";
787 else {
788 // Note: GCC drops anything following an end-of-line character.
789 StringRef::size_type End = MacroBody.find_first_of("\n\r");
790 MacroBody = MacroBody.substr(0, End);
791 }
792
793 auto [It, Inserted] = Macros.try_emplace(MacroName);
794 if (MacroNames && Inserted)
795 MacroNames->push_back(MacroName);
796 It->second = std::make_pair(MacroBody, false);
797 }
798}
799
805
806/// Check the preprocessor options deserialized from the control block
807/// against the preprocessor options in an existing preprocessor.
808///
809/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
810/// \param Validation If set to OptionValidateNone, ignore differences in
811/// preprocessor options. If set to OptionValidateContradictions,
812/// require that options passed both in the AST file and on the command
813/// line (-D or -U) match, but tolerate options missing in one or the
814/// other. If set to OptionValidateContradictions, require that there
815/// are no differences in the options between the two.
817 const PreprocessorOptions &PPOpts,
818 const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename,
819 bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr,
820 std::string &SuggestedPredefines, const LangOptions &LangOpts,
822 if (ReadMacros) {
823 // Check macro definitions.
824 MacroDefinitionsMap ASTFileMacros;
825 collectMacroDefinitions(PPOpts, ASTFileMacros);
826 MacroDefinitionsMap ExistingMacros;
827 SmallVector<StringRef, 4> ExistingMacroNames;
828 collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
829 &ExistingMacroNames);
830
831 // Use a line marker to enter the <command line> file, as the defines and
832 // undefines here will have come from the command line.
833 SuggestedPredefines += "# 1 \"<command line>\" 1\n";
834
835 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
836 // Dig out the macro definition in the existing preprocessor options.
837 StringRef MacroName = ExistingMacroNames[I];
838 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
839
840 // Check whether we know anything about this macro name or not.
841 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
842 ASTFileMacros.find(MacroName);
843 if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
844 if (Validation == OptionValidateStrictMatches) {
845 // If strict matches are requested, don't tolerate any extra defines
846 // on the command line that are missing in the AST file.
847 if (Diags) {
848 Diags->Report(diag::err_ast_file_macro_def_undef)
849 << MacroName << true << ModuleFilename;
850 }
851 return true;
852 }
853 // FIXME: Check whether this identifier was referenced anywhere in the
854 // AST file. If so, we should reject the AST file. Unfortunately, this
855 // information isn't in the control block. What shall we do about it?
856
857 if (Existing.second) {
858 SuggestedPredefines += "#undef ";
859 SuggestedPredefines += MacroName.str();
860 SuggestedPredefines += '\n';
861 } else {
862 SuggestedPredefines += "#define ";
863 SuggestedPredefines += MacroName.str();
864 SuggestedPredefines += ' ';
865 SuggestedPredefines += Existing.first.str();
866 SuggestedPredefines += '\n';
867 }
868 continue;
869 }
870
871 // If the macro was defined in one but undef'd in the other, we have a
872 // conflict.
873 if (Existing.second != Known->second.second) {
874 if (Diags) {
875 Diags->Report(diag::err_ast_file_macro_def_undef)
876 << MacroName << Known->second.second << ModuleFilename;
877 }
878 return true;
879 }
880
881 // If the macro was #undef'd in both, or if the macro bodies are
882 // identical, it's fine.
883 if (Existing.second || Existing.first == Known->second.first) {
884 ASTFileMacros.erase(Known);
885 continue;
886 }
887
888 // The macro bodies differ; complain.
889 if (Diags) {
890 Diags->Report(diag::err_ast_file_macro_def_conflict)
891 << MacroName << Known->second.first << Existing.first
892 << ModuleFilename;
893 }
894 return true;
895 }
896
897 // Leave the <command line> file and return to <built-in>.
898 SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
899
900 if (Validation == OptionValidateStrictMatches) {
901 // If strict matches are requested, don't tolerate any extra defines in
902 // the AST file that are missing on the command line.
903 for (const auto &MacroName : ASTFileMacros.keys()) {
904 if (Diags) {
905 Diags->Report(diag::err_ast_file_macro_def_undef)
906 << MacroName << false << ModuleFilename;
907 }
908 return true;
909 }
910 }
911 }
912
913 // Check whether we're using predefines.
914 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
915 Validation != OptionValidateNone) {
916 if (Diags) {
917 Diags->Report(diag::err_ast_file_undef)
918 << ExistingPPOpts.UsePredefines << ModuleFilename;
919 }
920 return true;
921 }
922
923 // Detailed record is important since it is used for the module cache hash.
924 if (LangOpts.Modules &&
925 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
926 Validation != OptionValidateNone) {
927 if (Diags) {
928 Diags->Report(diag::err_ast_file_pp_detailed_record)
929 << PPOpts.DetailedRecord << ModuleFilename;
930 }
931 return true;
932 }
933
934 // Compute the #include and #include_macros lines we need.
935 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
936 StringRef File = ExistingPPOpts.MacroIncludes[I];
937 if (llvm::is_contained(PPOpts.MacroIncludes, File))
938 continue;
939
940 SuggestedPredefines += "#__include_macros \"";
941 SuggestedPredefines += File;
942 SuggestedPredefines += "\"\n##\n";
943 }
944
945 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
946 StringRef File = ExistingPPOpts.Includes[I];
947
948 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
949 !ExistingPPOpts.PCHThroughHeader.empty()) {
950 // In case the through header is an include, we must add all the includes
951 // to the predefines so the start point can be determined.
952 SuggestedPredefines += "#include \"";
953 SuggestedPredefines += File;
954 SuggestedPredefines += "\"\n";
955 continue;
956 }
957
958 if (File == ExistingPPOpts.ImplicitPCHInclude)
959 continue;
960
961 if (llvm::is_contained(PPOpts.Includes, File))
962 continue;
963
964 SuggestedPredefines += "#include \"";
965 SuggestedPredefines += File;
966 SuggestedPredefines += "\"\n";
967 }
968
969 return false;
970}
971
973 StringRef ModuleFilename,
974 bool ReadMacros, bool Complain,
975 std::string &SuggestedPredefines) {
976 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
977
979 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
980 Complain ? &Reader.Diags : nullptr, PP.getFileManager(),
981 SuggestedPredefines, PP.getLangOpts());
982}
983
985 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
986 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
987 return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(),
988 ModuleFilename, ReadMacros, nullptr,
989 PP.getFileManager(), SuggestedPredefines,
990 PP.getLangOpts(), OptionValidateNone);
991}
992
993/// Check that the specified and the existing module cache paths are equivalent.
994///
995/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
996/// \returns true when the module cache paths differ.
997static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash,
998 StringRef ExistingSpecificModuleCachePath,
999 StringRef ASTFilename,
1000 DiagnosticsEngine *Diags,
1001 const LangOptions &LangOpts,
1002 const PreprocessorOptions &PPOpts,
1003 const HeaderSearchOptions &HSOpts,
1004 const HeaderSearchOptions &ASTFileHSOpts) {
1005 std::string SpecificModuleCachePath = createSpecificModuleCachePath(
1006 FileMgr, ASTFileHSOpts.ModuleCachePath, ASTFileHSOpts.DisableModuleHash,
1007 std::string(ContextHash));
1008
1009 if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
1010 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
1011 return false;
1012 auto EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1013 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1014 if (EqualOrErr && *EqualOrErr)
1015 return false;
1016 if (Diags) {
1017 // If the module cache arguments provided from the command line are the
1018 // same, the mismatch must come from other arguments of the configuration
1019 // and not directly the cache path.
1020 EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1021 ASTFileHSOpts.ModuleCachePath, HSOpts.ModuleCachePath);
1022 if (EqualOrErr && *EqualOrErr)
1023 Diags->Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1024 else
1025 Diags->Report(diag::err_ast_file_modulecache_mismatch)
1026 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1027 << ASTFilename;
1028 }
1029 return true;
1030}
1031
1033 StringRef ASTFilename,
1034 StringRef ContextHash,
1035 bool Complain) {
1036 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1037 return checkModuleCachePath(Reader.getFileManager(), ContextHash,
1038 HeaderSearchInfo.getSpecificModuleCachePath(),
1039 ASTFilename, Complain ? &Reader.Diags : nullptr,
1040 PP.getLangOpts(), PP.getPreprocessorOpts(),
1041 HeaderSearchInfo.getHeaderSearchOpts(), HSOpts);
1042}
1043
1045 PP.setCounterValue(Value);
1046}
1047
1048//===----------------------------------------------------------------------===//
1049// AST reader implementation
1050//===----------------------------------------------------------------------===//
1051
1052static uint64_t readULEB(const unsigned char *&P) {
1053 unsigned Length = 0;
1054 const char *Error = nullptr;
1055
1056 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
1057 if (Error)
1058 llvm::report_fatal_error(Error);
1059 P += Length;
1060 return Val;
1061}
1062
1063/// Read ULEB-encoded key length and data length.
1064static std::pair<unsigned, unsigned>
1065readULEBKeyDataLength(const unsigned char *&P) {
1066 unsigned KeyLen = readULEB(P);
1067 if ((unsigned)KeyLen != KeyLen)
1068 llvm::report_fatal_error("key too large");
1069
1070 unsigned DataLen = readULEB(P);
1071 if ((unsigned)DataLen != DataLen)
1072 llvm::report_fatal_error("data too large");
1073
1074 return std::make_pair(KeyLen, DataLen);
1075}
1076
1078 bool TakeOwnership) {
1079 DeserializationListener = Listener;
1080 OwnsDeserializationListener = TakeOwnership;
1081}
1082
1086
1088 LocalDeclID ID(Value);
1089#ifndef NDEBUG
1090 if (!MF.ModuleOffsetMap.empty())
1091 Reader.ReadModuleOffsetMap(MF);
1092
1093 unsigned ModuleFileIndex = ID.getModuleFileIndex();
1094 unsigned LocalDeclID = ID.getLocalDeclIndex();
1095
1096 assert(ModuleFileIndex <= MF.TransitiveImports.size());
1097
1098 ModuleFile *OwningModuleFile =
1099 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
1100 assert(OwningModuleFile);
1101
1102 unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
1103
1104 if (!ModuleFileIndex)
1105 LocalNumDecls += NUM_PREDEF_DECL_IDS;
1106
1107 assert(LocalDeclID < LocalNumDecls);
1108#endif
1109 (void)Reader;
1110 (void)MF;
1111 return ID;
1112}
1113
1114LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
1115 unsigned ModuleFileIndex, unsigned LocalDeclID) {
1116 DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
1117 return LocalDeclID::get(Reader, MF, Value);
1118}
1119
1120std::pair<unsigned, unsigned>
1122 return readULEBKeyDataLength(d);
1123}
1124
1126ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
1127 using namespace llvm::support;
1128
1129 SelectorTable &SelTable = Reader.getContext().Selectors;
1130 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1131 const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
1132 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1133 if (N == 0)
1134 return SelTable.getNullarySelector(FirstII);
1135 else if (N == 1)
1136 return SelTable.getUnarySelector(FirstII);
1137
1139 Args.push_back(FirstII);
1140 for (unsigned I = 1; I != N; ++I)
1141 Args.push_back(Reader.getLocalIdentifier(
1142 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1143
1144 return SelTable.getSelector(N, Args.data());
1145}
1146
1149 unsigned DataLen) {
1150 using namespace llvm::support;
1151
1153
1154 Result.ID = Reader.getGlobalSelectorID(
1155 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1156 unsigned FullInstanceBits =
1157 endian::readNext<uint16_t, llvm::endianness::little>(d);
1158 unsigned FullFactoryBits =
1159 endian::readNext<uint16_t, llvm::endianness::little>(d);
1160 Result.InstanceBits = FullInstanceBits & 0x3;
1161 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1162 Result.FactoryBits = FullFactoryBits & 0x3;
1163 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1164 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1165 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1166
1167 // Load instance methods
1168 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
1169 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1171 Reader, F,
1172 endian::readNext<DeclID, llvm::endianness::little>(d))))
1173 Result.Instance.push_back(Method);
1174 }
1175
1176 // Load factory methods
1177 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1178 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1180 Reader, F,
1181 endian::readNext<DeclID, llvm::endianness::little>(d))))
1182 Result.Factory.push_back(Method);
1183 }
1184
1185 return Result;
1186}
1187
1189 return llvm::djbHash(a);
1190}
1191
1192std::pair<unsigned, unsigned>
1194 return readULEBKeyDataLength(d);
1195}
1196
1198ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1199 assert(n >= 2 && d[n-1] == '\0');
1200 return StringRef((const char*) d, n-1);
1201}
1202
1203/// Whether the given identifier is "interesting".
1204static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1205 bool IsModule) {
1206 bool IsInteresting =
1207 II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1209 II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1210 return II.hadMacroDefinition() || II.isPoisoned() ||
1211 (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1212 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1213 II.getFETokenInfo());
1214}
1215
1216static bool readBit(unsigned &Bits) {
1217 bool Value = Bits & 0x1;
1218 Bits >>= 1;
1219 return Value;
1220}
1221
1223 using namespace llvm::support;
1224
1225 IdentifierID RawID =
1226 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1227 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1228}
1229
1231 bool IsModule) {
1232 if (!II.isFromAST()) {
1233 II.setIsFromAST();
1234 if (isInterestingIdentifier(Reader, II, IsModule))
1236 }
1237}
1238
1240 const unsigned char* d,
1241 unsigned DataLen) {
1242 using namespace llvm::support;
1243
1244 IdentifierID RawID =
1245 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1246 bool IsInteresting = RawID & 0x01;
1247
1248 DataLen -= sizeof(IdentifierID);
1249
1250 // Wipe out the "is interesting" bit.
1251 RawID = RawID >> 1;
1252
1253 // Build the IdentifierInfo and link the identifier ID with it.
1254 IdentifierInfo *II = KnownII;
1255 if (!II) {
1256 II = &Reader.getIdentifierTable().getOwn(k);
1257 KnownII = II;
1258 }
1259 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1260 markIdentifierFromAST(Reader, *II, IsModule);
1261 Reader.markIdentifierUpToDate(II);
1262
1263 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1264 if (!IsInteresting) {
1265 // For uninteresting identifiers, there's nothing else to do. Just notify
1266 // the reader that we've finished loading this identifier.
1267 Reader.SetIdentifierInfo(ID, II);
1268 return II;
1269 }
1270
1271 unsigned ObjCOrBuiltinID =
1272 endian::readNext<uint16_t, llvm::endianness::little>(d);
1273 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1274 bool CPlusPlusOperatorKeyword = readBit(Bits);
1275 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1276 bool Poisoned = readBit(Bits);
1277 bool ExtensionToken = readBit(Bits);
1278 bool HasMacroDefinition = readBit(Bits);
1279
1280 assert(Bits == 0 && "Extra bits in the identifier?");
1281 DataLen -= sizeof(uint16_t) * 2;
1282
1283 // Set or check the various bits in the IdentifierInfo structure.
1284 // Token IDs are read-only.
1285 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1287 if (!F.isModule())
1288 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1289 assert(II->isExtensionToken() == ExtensionToken &&
1290 "Incorrect extension token flag");
1291 (void)ExtensionToken;
1292 if (Poisoned)
1293 II->setIsPoisoned(true);
1294 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1295 "Incorrect C++ operator keyword flag");
1296 (void)CPlusPlusOperatorKeyword;
1297
1298 // If this identifier has a macro definition, deserialize it or notify the
1299 // visitor the actual definition is in a different module.
1300 if (HasMacroDefinition) {
1301 uint32_t MacroDirectivesOffset =
1302 endian::readNext<uint32_t, llvm::endianness::little>(d);
1303 DataLen -= 4;
1304
1305 if (MacroDirectivesOffset)
1306 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1307 else
1308 hasMacroDefinitionInDependencies = true;
1309 }
1310
1311 Reader.SetIdentifierInfo(ID, II);
1312
1313 // Read all of the declarations visible at global scope with this
1314 // name.
1315 if (DataLen > 0) {
1317 for (; DataLen > 0; DataLen -= sizeof(DeclID))
1318 DeclIDs.push_back(Reader.getGlobalDeclID(
1320 Reader, F,
1321 endian::readNext<DeclID, llvm::endianness::little>(d))));
1322 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1323 }
1324
1325 return II;
1326}
1327
1329 : Kind(Name.getNameKind()) {
1330 switch (Kind) {
1332 Data = (uint64_t)Name.getAsIdentifierInfo();
1333 break;
1337 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1338 break;
1340 Data = Name.getCXXOverloadedOperator();
1341 break;
1343 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1344 break;
1346 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1348 break;
1353 Data = 0;
1354 break;
1355 }
1356}
1357
1359 llvm::FoldingSetNodeID ID;
1360 ID.AddInteger(Kind);
1361
1362 switch (Kind) {
1366 ID.AddString(((IdentifierInfo*)Data)->getName());
1367 break;
1371 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1372 break;
1374 ID.AddInteger((OverloadedOperatorKind)Data);
1375 break;
1380 break;
1381 }
1382
1383 return ID.computeStableHash();
1384}
1385
1386ModuleFile *
1388 using namespace llvm::support;
1389
1390 uint32_t ModuleFileID =
1391 endian::readNext<uint32_t, llvm::endianness::little>(d);
1392 return Reader.getLocalModuleFile(F, ModuleFileID);
1393}
1394
1395std::pair<unsigned, unsigned>
1399
1402 using namespace llvm::support;
1403
1404 auto Kind = (DeclarationName::NameKind)*d++;
1405 uint64_t Data;
1406 switch (Kind) {
1410 Data = (uint64_t)Reader.getLocalIdentifier(
1411 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1412 break;
1416 Data = (uint64_t)Reader
1417 .getLocalSelector(
1418 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1419 .getAsOpaquePtr();
1420 break;
1422 Data = *d++; // OverloadedOperatorKind
1423 break;
1428 Data = 0;
1429 break;
1430 }
1431
1432 return DeclarationNameKey(Kind, Data);
1433}
1434
1436ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1437 return ReadKeyBase(d);
1438}
1439
1441 const unsigned char *d, unsigned DataLen, data_type_builder &Val) {
1442 using namespace llvm::support;
1443
1444 for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1446 Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1447 Val.insert(Reader.getGlobalDeclID(F, ID));
1448 }
1449}
1450
1452 const unsigned char *d,
1453 unsigned DataLen,
1454 data_type_builder &Val) {
1455 ReadDataIntoImpl(d, DataLen, Val);
1456}
1457
1460 llvm::FoldingSetNodeID ID;
1461 ID.AddInteger(Key.first.getHash());
1462 ID.AddInteger(Key.second);
1463 return ID.computeStableHash();
1464}
1465
1468 DeclarationNameKey Name(Key.first);
1469
1470 UnsignedOrNone ModuleHash = getPrimaryModuleHash(Key.second);
1471 if (!ModuleHash)
1472 return {Name, 0};
1473
1474 return {Name, *ModuleHash};
1475}
1476
1478ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1480 unsigned PrimaryModuleHash =
1481 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1482 return {Name, PrimaryModuleHash};
1483}
1484
1486 const unsigned char *d,
1487 unsigned DataLen,
1488 data_type_builder &Val) {
1489 ReadDataIntoImpl(d, DataLen, Val);
1490}
1491
1492ModuleFile *
1494 using namespace llvm::support;
1495
1496 uint32_t ModuleFileID =
1497 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1498 return Reader.getLocalModuleFile(F, ModuleFileID);
1499}
1500
1502LazySpecializationInfoLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1503 using namespace llvm::support;
1504 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1505}
1506
1507std::pair<unsigned, unsigned>
1511
1513 const unsigned char *d,
1514 unsigned DataLen,
1515 data_type_builder &Val) {
1516 using namespace llvm::support;
1517
1518 for (unsigned NumDecls =
1520 NumDecls; --NumDecls) {
1521 LocalDeclID LocalID = LocalDeclID::get(
1522 Reader, F,
1523 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1524 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1525 }
1526}
1527
1528bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1529 BitstreamCursor &Cursor,
1530 uint64_t Offset,
1531 DeclContext *DC) {
1532 assert(Offset != 0);
1533
1534 SavedStreamPosition SavedPosition(Cursor);
1535 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1536 Error(std::move(Err));
1537 return true;
1538 }
1539
1540 RecordData Record;
1541 StringRef Blob;
1542 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1543 if (!MaybeCode) {
1544 Error(MaybeCode.takeError());
1545 return true;
1546 }
1547 unsigned Code = MaybeCode.get();
1548
1549 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1550 if (!MaybeRecCode) {
1551 Error(MaybeRecCode.takeError());
1552 return true;
1553 }
1554 unsigned RecCode = MaybeRecCode.get();
1555 if (RecCode != DECL_CONTEXT_LEXICAL) {
1556 Error("Expected lexical block");
1557 return true;
1558 }
1559
1560 assert(!isa<TranslationUnitDecl>(DC) &&
1561 "expected a TU_UPDATE_LEXICAL record for TU");
1562 // If we are handling a C++ class template instantiation, we can see multiple
1563 // lexical updates for the same record. It's important that we select only one
1564 // of them, so that field numbering works properly. Just pick the first one we
1565 // see.
1566 auto &Lex = LexicalDecls[DC];
1567 if (!Lex.first) {
1568 Lex = std::make_pair(
1569 &M, llvm::ArrayRef(
1570 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1571 Blob.size() / sizeof(DeclID)));
1572 }
1574 return false;
1575}
1576
1577bool ASTReader::ReadVisibleDeclContextStorage(
1578 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1579 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1580 assert(Offset != 0);
1581
1582 SavedStreamPosition SavedPosition(Cursor);
1583 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1584 Error(std::move(Err));
1585 return true;
1586 }
1587
1588 RecordData Record;
1589 StringRef Blob;
1590 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1591 if (!MaybeCode) {
1592 Error(MaybeCode.takeError());
1593 return true;
1594 }
1595 unsigned Code = MaybeCode.get();
1596
1597 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1598 if (!MaybeRecCode) {
1599 Error(MaybeRecCode.takeError());
1600 return true;
1601 }
1602 unsigned RecCode = MaybeRecCode.get();
1603 switch (VisibleKind) {
1604 case VisibleDeclContextStorageKind::GenerallyVisible:
1605 if (RecCode != DECL_CONTEXT_VISIBLE) {
1606 Error("Expected visible lookup table block");
1607 return true;
1608 }
1609 break;
1610 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1611 if (RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) {
1612 Error("Expected module local visible lookup table block");
1613 return true;
1614 }
1615 break;
1616 case VisibleDeclContextStorageKind::TULocalVisible:
1617 if (RecCode != DECL_CONTEXT_TU_LOCAL_VISIBLE) {
1618 Error("Expected TU local lookup table block");
1619 return true;
1620 }
1621 break;
1622 }
1623
1624 // We can't safely determine the primary context yet, so delay attaching the
1625 // lookup table until we're done with recursive deserialization.
1626 auto *Data = (const unsigned char*)Blob.data();
1627 switch (VisibleKind) {
1628 case VisibleDeclContextStorageKind::GenerallyVisible:
1629 PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1630 break;
1631 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1632 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1633 break;
1634 case VisibleDeclContextStorageKind::TULocalVisible:
1635 if (M.Kind == MK_MainFile)
1636 TULocalUpdates[ID].push_back(UpdateData{&M, Data});
1637 break;
1638 }
1639 return false;
1640}
1641
1642void ASTReader::AddSpecializations(const Decl *D, const unsigned char *Data,
1643 ModuleFile &M, bool IsPartial) {
1644 D = D->getCanonicalDecl();
1645 auto &SpecLookups =
1646 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1647 SpecLookups[D].Table.add(&M, Data,
1649}
1650
1651bool ASTReader::ReadSpecializations(ModuleFile &M, BitstreamCursor &Cursor,
1652 uint64_t Offset, Decl *D, bool IsPartial) {
1653 assert(Offset != 0);
1654
1655 SavedStreamPosition SavedPosition(Cursor);
1656 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1657 Error(std::move(Err));
1658 return true;
1659 }
1660
1661 RecordData Record;
1662 StringRef Blob;
1663 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1664 if (!MaybeCode) {
1665 Error(MaybeCode.takeError());
1666 return true;
1667 }
1668 unsigned Code = MaybeCode.get();
1669
1670 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1671 if (!MaybeRecCode) {
1672 Error(MaybeRecCode.takeError());
1673 return true;
1674 }
1675 unsigned RecCode = MaybeRecCode.get();
1676 if (RecCode != DECL_SPECIALIZATIONS &&
1677 RecCode != DECL_PARTIAL_SPECIALIZATIONS) {
1678 Error("Expected decl specs block");
1679 return true;
1680 }
1681
1682 auto *Data = (const unsigned char *)Blob.data();
1683 AddSpecializations(D, Data, M, IsPartial);
1684 return false;
1685}
1686
1687void ASTReader::Error(StringRef Msg) const {
1688 Error(diag::err_fe_ast_file_malformed, Msg);
1689 if (PP.getLangOpts().Modules &&
1690 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1691 Diag(diag::note_module_cache_path)
1692 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1693 }
1694}
1695
1696void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1697 StringRef Arg3) const {
1698 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1699}
1700
1701namespace {
1702struct AlreadyReportedDiagnosticError
1703 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1704 static char ID;
1705
1706 void log(raw_ostream &OS) const override {
1707 llvm_unreachable("reporting an already-reported diagnostic error");
1708 }
1709
1710 std::error_code convertToErrorCode() const override {
1711 return llvm::inconvertibleErrorCode();
1712 }
1713};
1714
1715char AlreadyReportedDiagnosticError::ID = 0;
1716} // namespace
1717
1718void ASTReader::Error(llvm::Error &&Err) const {
1719 handleAllErrors(
1720 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1721 [&](llvm::ErrorInfoBase &E) { return Error(E.message()); });
1722}
1723
1724//===----------------------------------------------------------------------===//
1725// Source Manager Deserialization
1726//===----------------------------------------------------------------------===//
1727
1728/// Read the line table in the source manager block.
1729void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1730 unsigned Idx = 0;
1731 LineTableInfo &LineTable = SourceMgr.getLineTable();
1732
1733 // Parse the file names
1734 std::map<int, int> FileIDs;
1735 FileIDs[-1] = -1; // For unspecified filenames.
1736 for (unsigned I = 0; Record[Idx]; ++I) {
1737 // Extract the file name
1738 auto Filename = ReadPath(F, Record, Idx);
1739 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1740 }
1741 ++Idx;
1742
1743 // Parse the line entries
1744 std::vector<LineEntry> Entries;
1745 while (Idx < Record.size()) {
1746 FileID FID = ReadFileID(F, Record, Idx);
1747
1748 // Extract the line entries
1749 unsigned NumEntries = Record[Idx++];
1750 assert(NumEntries && "no line entries for file ID");
1751 Entries.clear();
1752 Entries.reserve(NumEntries);
1753 for (unsigned I = 0; I != NumEntries; ++I) {
1754 unsigned FileOffset = Record[Idx++];
1755 unsigned LineNo = Record[Idx++];
1756 int FilenameID = FileIDs[Record[Idx++]];
1759 unsigned IncludeOffset = Record[Idx++];
1760 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1761 FileKind, IncludeOffset));
1762 }
1763 LineTable.AddEntry(FID, Entries);
1764 }
1765}
1766
1767/// Read a source manager block
1768llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1769 using namespace SrcMgr;
1770
1771 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1772
1773 // Set the source-location entry cursor to the current position in
1774 // the stream. This cursor will be used to read the contents of the
1775 // source manager block initially, and then lazily read
1776 // source-location entries as needed.
1777 SLocEntryCursor = F.Stream;
1778
1779 // The stream itself is going to skip over the source manager block.
1780 if (llvm::Error Err = F.Stream.SkipBlock())
1781 return Err;
1782
1783 // Enter the source manager block.
1784 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1785 return Err;
1786 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1787
1788 RecordData Record;
1789 while (true) {
1790 Expected<llvm::BitstreamEntry> MaybeE =
1791 SLocEntryCursor.advanceSkippingSubblocks();
1792 if (!MaybeE)
1793 return MaybeE.takeError();
1794 llvm::BitstreamEntry E = MaybeE.get();
1795
1796 switch (E.Kind) {
1797 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1798 case llvm::BitstreamEntry::Error:
1799 return llvm::createStringError(std::errc::illegal_byte_sequence,
1800 "malformed block record in AST file");
1801 case llvm::BitstreamEntry::EndBlock:
1802 return llvm::Error::success();
1803 case llvm::BitstreamEntry::Record:
1804 // The interesting case.
1805 break;
1806 }
1807
1808 // Read a record.
1809 Record.clear();
1810 StringRef Blob;
1811 Expected<unsigned> MaybeRecord =
1812 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1813 if (!MaybeRecord)
1814 return MaybeRecord.takeError();
1815 switch (MaybeRecord.get()) {
1816 default: // Default behavior: ignore.
1817 break;
1818
1819 case SM_SLOC_FILE_ENTRY:
1822 // Once we hit one of the source location entries, we're done.
1823 return llvm::Error::success();
1824 }
1825 }
1826}
1827
1828llvm::Expected<SourceLocation::UIntTy>
1830 BitstreamCursor &Cursor = F->SLocEntryCursor;
1831 SavedStreamPosition SavedPosition(Cursor);
1832 if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1833 F->SLocEntryOffsets[Index]))
1834 return std::move(Err);
1835
1836 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1837 if (!MaybeEntry)
1838 return MaybeEntry.takeError();
1839
1840 llvm::BitstreamEntry Entry = MaybeEntry.get();
1841 if (Entry.Kind != llvm::BitstreamEntry::Record)
1842 return llvm::createStringError(
1843 std::errc::illegal_byte_sequence,
1844 "incorrectly-formatted source location entry in AST file");
1845
1847 StringRef Blob;
1848 Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1849 if (!MaybeSLOC)
1850 return MaybeSLOC.takeError();
1851
1852 switch (MaybeSLOC.get()) {
1853 default:
1854 return llvm::createStringError(
1855 std::errc::illegal_byte_sequence,
1856 "incorrectly-formatted source location entry in AST file");
1857 case SM_SLOC_FILE_ENTRY:
1860 return F->SLocEntryBaseOffset + Record[0];
1861 }
1862}
1863
1865 auto SLocMapI =
1866 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1867 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1868 "Corrupted global sloc offset map");
1869 ModuleFile *F = SLocMapI->second;
1870
1871 bool Invalid = false;
1872
1873 auto It = llvm::upper_bound(
1874 llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1875 [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1876 int ID = F->SLocEntryBaseID + LocalIndex;
1877 std::size_t Index = -ID - 2;
1878 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1879 assert(!SourceMgr.SLocEntryLoaded[Index]);
1880 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1881 if (!MaybeEntryOffset) {
1882 Error(MaybeEntryOffset.takeError());
1883 Invalid = true;
1884 return true;
1885 }
1886 SourceMgr.LoadedSLocEntryTable[Index] =
1887 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1888 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1889 }
1890 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1891 });
1892
1893 if (Invalid)
1894 return 0;
1895
1896 // The iterator points to the first entry with start offset greater than the
1897 // offset of interest. The previous entry must contain the offset of interest.
1898 return F->SLocEntryBaseID + *std::prev(It);
1899}
1900
1901std::pair<SourceLocation::UIntTy, SourceLocationEncoding::Chain>
1903 SourceLocation::UIntTy InitialDelta) {
1904 SourceLocation::UIntTy Offset = Record[Idx];
1905 return {Offset, SourceLocationEncoding::Chain(Offset + InitialDelta)};
1906}
1907
1908std::pair<SourceLocation::UIntTy, SourceLocationEncoding::Chain>
1910 // Anchor the chain at the entry's own local offset, deriving it exactly as
1911 // the writer does -- see ASTWriter::EmitEntryOffset. The field has the dummy
1912 // entry subtracted out, so add it back. The anchor stays in the writing
1913 // module's local space, which is the space the deltas are differences in;
1914 // deltaDecode therefore runs before the locations are translated into ours.
1915 return ReadSourceLocationOffset(Record, 0, 2);
1916}
1917
1919 if (ID == 0)
1920 return false;
1921
1922 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1923 Error("source location entry ID out-of-range for AST file");
1924 return true;
1925 }
1926
1927 // Local helper to read the (possibly-compressed) buffer data following the
1928 // entry record.
1929 auto ReadBuffer = [this](
1930 BitstreamCursor &SLocEntryCursor,
1931 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1933 StringRef Blob;
1934 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1935 if (!MaybeCode) {
1936 Error(MaybeCode.takeError());
1937 return nullptr;
1938 }
1939 unsigned Code = MaybeCode.get();
1940
1941 Expected<unsigned> MaybeRecCode =
1942 SLocEntryCursor.readRecord(Code, Record, &Blob);
1943 if (!MaybeRecCode) {
1944 Error(MaybeRecCode.takeError());
1945 return nullptr;
1946 }
1947 unsigned RecCode = MaybeRecCode.get();
1948
1949 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1950 SmallVector<uint8_t, 0> Decompressed;
1951 if (llvm::Error E = llvm::compression::decompress(
1952 llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1953 Error("could not decompress embedded file contents: " +
1954 llvm::toString(std::move(E)));
1955 return nullptr;
1956 }
1957 return llvm::MemoryBuffer::getMemBufferCopy(
1958 llvm::toStringRef(Decompressed), Name);
1959 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1960 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1961 } else {
1962 Error("AST record has invalid code");
1963 return nullptr;
1964 }
1965 };
1966
1967 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1968 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1970 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1971 Error(std::move(Err));
1972 return true;
1973 }
1974
1975 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1977
1978 ++NumSLocEntriesRead;
1979 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1980 if (!MaybeEntry) {
1981 Error(MaybeEntry.takeError());
1982 return true;
1983 }
1984 llvm::BitstreamEntry Entry = MaybeEntry.get();
1985
1986 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1987 Error("incorrectly-formatted source location entry in AST file");
1988 return true;
1989 }
1990
1992 StringRef Blob;
1993 Expected<unsigned> MaybeSLOC =
1994 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1995 if (!MaybeSLOC) {
1996 Error(MaybeSLOC.takeError());
1997 return true;
1998 }
1999 switch (MaybeSLOC.get()) {
2000 default:
2001 Error("incorrectly-formatted source location entry in AST file");
2002 return true;
2003
2004 case SM_SLOC_FILE_ENTRY: {
2005 // We will detect whether a file changed and return 'Failure' for it, but
2006 // we will also try to fail gracefully by setting up the SLocEntry.
2007 unsigned InputID = Record[4];
2008 InputFile IF = getInputFile(*F, InputID);
2010 bool OverriddenBuffer = IF.isOverridden();
2011
2012 // Note that we only check if a File was returned. If it was out-of-date
2013 // we have complained but we will continue creating a FileID to recover
2014 // gracefully.
2015 if (!File)
2016 return true;
2017
2018 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
2019 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
2020 // This is the module's main file.
2021 IncludeLoc = getImportLocation(F);
2022 }
2024 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2025 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
2026 BaseOffset + Record[0]);
2027 SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2028 FileInfo.NumCreatedFIDs = Record[5];
2029 if (Record[3])
2030 FileInfo.setHasLineDirectives();
2031
2032 unsigned NumFileDecls = Record[7];
2033 if (NumFileDecls && ContextObj) {
2034 const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
2035 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
2036 FileDeclIDs[FID] =
2037 FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
2038 }
2039
2040 const SrcMgr::ContentCache &ContentCache =
2041 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
2042 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
2043 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
2044 !ContentCache.getBufferIfLoaded()) {
2045 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
2046 if (!Buffer)
2047 return true;
2048 SourceMgr.overrideFileContents(*File, std::move(Buffer));
2049 }
2050
2051 break;
2052 }
2053
2054 case SM_SLOC_BUFFER_ENTRY: {
2055 const char *Name = Blob.data();
2056 unsigned Offset = Record[0];
2058 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2059 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
2060 if (IncludeLoc.isInvalid() && F->isModule()) {
2061 IncludeLoc = getImportLocation(F);
2062 }
2063
2064 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2065 if (!Buffer)
2066 return true;
2067 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2068 BaseOffset + Offset, IncludeLoc);
2069 if (Record[3]) {
2070 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2071 FileInfo.setHasLineDirectives();
2072 }
2073 break;
2074 }
2075
2077 auto [EntryOffset, Chain] = ReadEntryOffset(Record);
2078 // The chain is stateful: decode in the same order the writer emitted, each
2079 // in its own statement. See CreateSLocExpansionAbbrev for the field order.
2080 SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[1], Chain);
2081 SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2], Chain);
2082 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[3], Chain);
2083 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2084 Record[5], Record[4], ID,
2085 BaseOffset + EntryOffset);
2086 break;
2087 }
2088 }
2089
2090 return false;
2091}
2092
2093std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
2094 if (ID == 0)
2095 return std::make_pair(SourceLocation(), "");
2096
2097 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
2098 Error("source location entry ID out-of-range for AST file");
2099 return std::make_pair(SourceLocation(), "");
2100 }
2101
2102 // Find which module file this entry lands in.
2103 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2104 if (!M->isModule())
2105 return std::make_pair(SourceLocation(), "");
2106
2107 // FIXME: Can we map this down to a particular submodule? That would be
2108 // ideal.
2109 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
2110}
2111
2112/// Find the location where the module F is imported.
2113SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
2114 if (F->ImportLoc.isValid())
2115 return F->ImportLoc;
2116
2117 // Otherwise we have a PCH. It's considered to be "imported" at the first
2118 // location of its includer.
2119 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
2120 // Main file is the importer.
2121 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
2122 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2123 }
2124 return F->ImportedBy[0]->FirstLoc;
2125}
2126
2127/// Enter a subblock of the specified BlockID with the specified cursor. Read
2128/// the abbreviations that are at the top of the block and then leave the cursor
2129/// pointing into the block.
2130llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
2131 unsigned BlockID,
2132 uint64_t *StartOfBlockOffset) {
2133 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2134 return Err;
2135
2136 if (StartOfBlockOffset)
2137 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2138
2139 while (true) {
2140 uint64_t Offset = Cursor.GetCurrentBitNo();
2141 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2142 if (!MaybeCode)
2143 return MaybeCode.takeError();
2144 unsigned Code = MaybeCode.get();
2145
2146 // We expect all abbrevs to be at the start of the block.
2147 if (Code != llvm::bitc::DEFINE_ABBREV) {
2148 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2149 return Err;
2150 return llvm::Error::success();
2151 }
2152 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2153 return Err;
2154 }
2155}
2156
2158 unsigned &Idx) {
2159 Token Tok;
2160 Tok.startToken();
2161 Tok.setLocation(ReadSourceLocation(M, Record, Idx));
2162 Tok.setKind((tok::TokenKind)Record[Idx++]);
2163 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
2164
2165 if (Tok.isAnnotation()) {
2166 Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
2167 switch (Tok.getKind()) {
2168 case tok::annot_pragma_loop_hint: {
2169 auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
2170 Info->PragmaName = ReadToken(M, Record, Idx);
2171 Info->Option = ReadToken(M, Record, Idx);
2172 unsigned NumTokens = Record[Idx++];
2174 Toks.reserve(NumTokens);
2175 for (unsigned I = 0; I < NumTokens; ++I)
2176 Toks.push_back(ReadToken(M, Record, Idx));
2177 Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2178 Tok.setAnnotationValue(static_cast<void *>(Info));
2179 break;
2180 }
2181 case tok::annot_pragma_pack: {
2182 auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
2183 Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
2184 auto SlotLabel = ReadString(Record, Idx);
2185 Info->SlotLabel =
2186 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2187 Info->Alignment = ReadToken(M, Record, Idx);
2188 Tok.setAnnotationValue(static_cast<void *>(Info));
2189 break;
2190 }
2191 // Some annotation tokens do not use the PtrData field.
2192 case tok::annot_pragma_openmp:
2193 case tok::annot_pragma_openmp_end:
2194 case tok::annot_pragma_unused:
2195 case tok::annot_pragma_openacc:
2196 case tok::annot_pragma_openacc_end:
2197 case tok::annot_repl_input_end:
2198 break;
2199 default:
2200 llvm_unreachable("missing deserialization code for annotation token");
2201 }
2202 } else {
2203 Tok.setLength(Record[Idx++]);
2204 if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
2205 Tok.setIdentifierInfo(II);
2206 }
2207 return Tok;
2208}
2209
2211 BitstreamCursor &Stream = F.MacroCursor;
2212
2213 // Keep track of where we are in the stream, then jump back there
2214 // after reading this macro.
2215 SavedStreamPosition SavedPosition(Stream);
2216
2217 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2218 // FIXME this drops errors on the floor.
2219 consumeError(std::move(Err));
2220 return nullptr;
2221 }
2224 MacroInfo *Macro = nullptr;
2225 llvm::MutableArrayRef<Token> MacroTokens;
2226
2227 while (true) {
2228 // Advance to the next record, but if we get to the end of the block, don't
2229 // pop it (removing all the abbreviations from the cursor) since we want to
2230 // be able to reseek within the block and read entries.
2231 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2233 Stream.advanceSkippingSubblocks(Flags);
2234 if (!MaybeEntry) {
2235 Error(MaybeEntry.takeError());
2236 return Macro;
2237 }
2238 llvm::BitstreamEntry Entry = MaybeEntry.get();
2239
2240 switch (Entry.Kind) {
2241 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2242 case llvm::BitstreamEntry::Error:
2243 Error("malformed block record in AST file");
2244 return Macro;
2245 case llvm::BitstreamEntry::EndBlock:
2246 return Macro;
2247 case llvm::BitstreamEntry::Record:
2248 // The interesting case.
2249 break;
2250 }
2251
2252 // Read a record.
2253 Record.clear();
2255 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
2256 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
2257 else {
2258 Error(MaybeRecType.takeError());
2259 return Macro;
2260 }
2261 switch (RecType) {
2262 case PP_MODULE_MACRO:
2264 return Macro;
2265
2268 // If we already have a macro, that means that we've hit the end
2269 // of the definition of the macro we were looking for. We're
2270 // done.
2271 if (Macro)
2272 return Macro;
2273
2274 unsigned NextIndex = 1; // Skip identifier ID.
2275 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
2276 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2277 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
2278 MI->setIsUsed(Record[NextIndex++]);
2279 MI->setUsedForHeaderGuard(Record[NextIndex++]);
2280 MacroTokens = MI->allocateTokens(Record[NextIndex++],
2281 PP.getPreprocessorAllocator());
2282 if (RecType == PP_MACRO_FUNCTION_LIKE) {
2283 // Decode function-like macro info.
2284 bool isC99VarArgs = Record[NextIndex++];
2285 bool isGNUVarArgs = Record[NextIndex++];
2286 bool hasCommaPasting = Record[NextIndex++];
2287 MacroParams.clear();
2288 unsigned NumArgs = Record[NextIndex++];
2289 for (unsigned i = 0; i != NumArgs; ++i)
2290 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
2291
2292 // Install function-like macro info.
2293 MI->setIsFunctionLike();
2294 if (isC99VarArgs) MI->setIsC99Varargs();
2295 if (isGNUVarArgs) MI->setIsGNUVarargs();
2296 if (hasCommaPasting) MI->setHasCommaPasting();
2297 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
2298 }
2299
2300 // Remember that we saw this macro last so that we add the tokens that
2301 // form its body to it.
2302 Macro = MI;
2303
2304 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
2305 Record[NextIndex]) {
2306 // We have a macro definition. Register the association
2308 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
2309 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2310 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
2311 PreprocessingRecord::PPEntityID PPID =
2312 PPRec.getPPEntityID(Index, /*isLoaded=*/true);
2313 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
2314 PPRec.getPreprocessedEntity(PPID));
2315 if (PPDef)
2316 PPRec.RegisterMacroDefinition(Macro, PPDef);
2317 }
2318
2319 ++NumMacrosRead;
2320 break;
2321 }
2322
2323 case PP_TOKEN: {
2324 // If we see a TOKEN before a PP_MACRO_*, then the file is
2325 // erroneous, just pretend we didn't see this.
2326 if (!Macro) break;
2327 if (MacroTokens.empty()) {
2328 Error("unexpected number of macro tokens for a macro in AST file");
2329 return Macro;
2330 }
2331
2332 unsigned Idx = 0;
2333 MacroTokens[0] = ReadToken(F, Record, Idx);
2334 MacroTokens = MacroTokens.drop_front();
2335 break;
2336 }
2337 }
2338 }
2339}
2340
2343 PreprocessedEntityID LocalID) const {
2344 if (!M.ModuleOffsetMap.empty())
2345 ReadModuleOffsetMap(M);
2346
2347 unsigned ModuleFileIndex = LocalID >> 32;
2348 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2349 ModuleFile *MF =
2350 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
2351 assert(MF && "malformed identifier ID encoding?");
2352
2353 if (!ModuleFileIndex) {
2354 assert(LocalID >= NUM_PREDEF_PP_ENTITY_IDS);
2355 LocalID -= NUM_PREDEF_PP_ENTITY_IDS;
2356 }
2357
2358 return (static_cast<PreprocessedEntityID>(MF->Index + 1) << 32) | LocalID;
2359}
2360
2362HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2363 FileManager &FileMgr = Reader.getFileManager();
2364 if (!Key.Imported)
2365 return FileMgr.getOptionalFileRef(Key.Filename);
2366
2367 auto Resolved =
2368 ASTReader::ResolveImportedPath(Reader.getPathBuf(), Key.Filename, M);
2369 return FileMgr.getOptionalFileRef(*Resolved);
2370}
2371
2373 uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2374 memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2375 memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2376 return llvm::xxh3_64bits(buf);
2377}
2378
2381 internal_key_type ikey = {ekey.getSize(),
2382 M.HasTimestamps ? ekey.getModificationTime() : 0,
2383 ekey.getName(), /*Imported*/ false};
2384 return ikey;
2385}
2386
2388 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2389 return false;
2390
2391 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2392 return true;
2393
2394 // Determine whether the actual files are equivalent.
2395 OptionalFileEntryRef FEA = getFile(a);
2396 OptionalFileEntryRef FEB = getFile(b);
2397 return FEA && FEA == FEB;
2398}
2399
2400std::pair<unsigned, unsigned>
2402 return readULEBKeyDataLength(d);
2403}
2404
2406HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2407 using namespace llvm::support;
2408
2409 internal_key_type ikey;
2410 ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2411 ikey.ModTime =
2412 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2413 ikey.Filename = (const char *)d;
2414 ikey.Imported = true;
2415 return ikey;
2416}
2417
2420 unsigned DataLen) {
2421 using namespace llvm::support;
2422
2423 const unsigned char *End = d + DataLen;
2424 HeaderFileInfo HFI;
2425 unsigned Flags = *d++;
2426
2428 bool Included = (Flags >> 6) & 0x01;
2429 if (Included)
2430 if ((FE = getFile(key)))
2431 // Not using \c Preprocessor::markIncluded(), since that would attempt to
2432 // deserialize this header file info again.
2433 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2434
2435 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2436 HFI.isImport |= (Flags >> 5) & 0x01;
2437 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2438 HFI.DirInfo = (Flags >> 1) & 0x07;
2439 HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2440 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2441
2442 assert((End - d) % 4 == 0 &&
2443 "Wrong data length in HeaderFileInfo deserialization");
2444 while (d != End) {
2445 uint32_t LocalSMID =
2446 endian::readNext<uint32_t, llvm::endianness::little>(d);
2447 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2448 LocalSMID >>= 3;
2449
2450 // This header is part of a module. Associate it with the module to enable
2451 // implicit module import.
2452 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2453 Module *Mod = Reader.getSubmodule(GlobalSMID);
2454 ModuleMap &ModMap =
2455 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2456
2457 if (FE || (FE = getFile(key))) {
2458 // FIXME: NameAsWritten
2459 Module::Header H = {std::string(key.Filename), "", *FE};
2460 ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2461 }
2462 HFI.mergeModuleMembership(HeaderRole);
2463 }
2464
2465 // This HeaderFileInfo was externally loaded.
2466 HFI.External = true;
2467 HFI.IsValid = true;
2468 return HFI;
2469}
2470
2472 uint32_t MacroDirectivesOffset) {
2473 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2474 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2475}
2476
2478 // Note that we are loading defined macros.
2479 Deserializing Macros(this);
2480
2481 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2482 BitstreamCursor &MacroCursor = I.MacroCursor;
2483
2484 // If there was no preprocessor block, skip this file.
2485 if (MacroCursor.getBitcodeBytes().empty())
2486 continue;
2487
2488 BitstreamCursor Cursor = MacroCursor;
2489 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2490 Error(std::move(Err));
2491 return;
2492 }
2493
2495 while (true) {
2496 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2497 if (!MaybeE) {
2498 Error(MaybeE.takeError());
2499 return;
2500 }
2501 llvm::BitstreamEntry E = MaybeE.get();
2502
2503 switch (E.Kind) {
2504 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2505 case llvm::BitstreamEntry::Error:
2506 Error("malformed block record in AST file");
2507 return;
2508 case llvm::BitstreamEntry::EndBlock:
2509 goto NextCursor;
2510
2511 case llvm::BitstreamEntry::Record: {
2512 Record.clear();
2513 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2514 if (!MaybeRecord) {
2515 Error(MaybeRecord.takeError());
2516 return;
2517 }
2518 switch (MaybeRecord.get()) {
2519 default: // Default behavior: ignore.
2520 break;
2521
2525 if (II->isOutOfDate())
2527 break;
2528 }
2529
2530 case PP_TOKEN:
2531 // Ignore tokens.
2532 break;
2533 }
2534 break;
2535 }
2536 }
2537 }
2538 NextCursor: ;
2539 }
2540}
2541
2542namespace {
2543
2544 /// Visitor class used to look up identifirs in an AST file.
2545 class IdentifierLookupVisitor {
2546 StringRef Name;
2547 unsigned NameHash;
2548 unsigned PriorGeneration;
2549 unsigned &NumIdentifierLookups;
2550 unsigned &NumIdentifierLookupHits;
2551 IdentifierInfo *Found = nullptr;
2552
2553 public:
2554 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2555 unsigned &NumIdentifierLookups,
2556 unsigned &NumIdentifierLookupHits)
2557 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2558 PriorGeneration(PriorGeneration),
2559 NumIdentifierLookups(NumIdentifierLookups),
2560 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2561
2562 bool operator()(ModuleFile &M) {
2563 // If we've already searched this module file, skip it now.
2564 if (M.Generation <= PriorGeneration)
2565 return true;
2566
2569 if (!IdTable)
2570 return false;
2571
2572 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2573 Found);
2574 ++NumIdentifierLookups;
2575 ASTIdentifierLookupTable::iterator Pos =
2576 IdTable->find_hashed(Name, NameHash, &Trait);
2577 if (Pos == IdTable->end())
2578 return false;
2579
2580 // Dereferencing the iterator has the effect of building the
2581 // IdentifierInfo node and populating it with the various
2582 // declarations it needs.
2583 ++NumIdentifierLookupHits;
2584 Found = *Pos;
2585 if (Trait.hasMoreInformationInDependencies()) {
2586 // Look for the identifier in extra modules as they contain more info.
2587 return false;
2588 }
2589 return true;
2590 }
2591
2592 // Retrieve the identifier info found within the module
2593 // files.
2594 IdentifierInfo *getIdentifierInfo() const { return Found; }
2595 };
2596
2597} // namespace
2598
2600 // Note that we are loading an identifier.
2601 Deserializing AnIdentifier(this);
2602
2603 unsigned PriorGeneration = 0;
2604 if (getContext().getLangOpts().Modules)
2605 PriorGeneration = IdentifierGeneration[&II];
2606
2607 // If there is a global index, look there first to determine which modules
2608 // provably do not have any results for this identifier.
2610 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2611 if (!loadGlobalIndex()) {
2612 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2613 HitsPtr = &Hits;
2614 }
2615 }
2616
2617 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2618 NumIdentifierLookups,
2619 NumIdentifierLookupHits);
2620 ModuleMgr.visit(Visitor, HitsPtr);
2622}
2623
2625 if (!II)
2626 return;
2627
2628 const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2629
2630 // Update the generation for this identifier.
2631 if (getContext().getLangOpts().Modules)
2632 IdentifierGeneration[II] = getGeneration();
2633}
2634
2636 unsigned &Idx) {
2637 uint64_t ModuleFileIndex = Record[Idx++] << 32;
2638 uint64_t LocalIndex = Record[Idx++];
2639 return getGlobalMacroID(F, (ModuleFileIndex | LocalIndex));
2640}
2641
2643 const PendingMacroInfo &PMInfo) {
2644 ModuleFile &M = *PMInfo.M;
2645
2646 BitstreamCursor &Cursor = M.MacroCursor;
2647 SavedStreamPosition SavedPosition(Cursor);
2648 if (llvm::Error Err =
2649 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2650 Error(std::move(Err));
2651 return;
2652 }
2653
2654 struct ModuleMacroRecord {
2655 SubmoduleID SubModID;
2656 MacroInfo *MI;
2658 };
2660
2661 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2662 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2663 // macro histroy.
2665 while (true) {
2667 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2668 if (!MaybeEntry) {
2669 Error(MaybeEntry.takeError());
2670 return;
2671 }
2672 llvm::BitstreamEntry Entry = MaybeEntry.get();
2673
2674 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2675 Error("malformed block record in AST file");
2676 return;
2677 }
2678
2679 Record.clear();
2680 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2681 if (!MaybePP) {
2682 Error(MaybePP.takeError());
2683 return;
2684 }
2685 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2687 break;
2688
2689 case PP_MODULE_MACRO: {
2690 ModuleMacros.push_back(ModuleMacroRecord());
2691 auto &Info = ModuleMacros.back();
2692 unsigned Idx = 0;
2693 Info.SubModID = getGlobalSubmoduleID(M, Record[Idx++]);
2694 Info.MI = getMacro(ReadMacroID(M, Record, Idx));
2695 for (int I = Idx, N = Record.size(); I != N; ++I)
2696 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2697 continue;
2698 }
2699
2700 default:
2701 Error("malformed block record in AST file");
2702 return;
2703 }
2704
2705 // We found the macro directive history; that's the last record
2706 // for this macro.
2707 break;
2708 }
2709
2710 // Module macros are listed in reverse dependency order.
2711 {
2712 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2714 for (auto &MMR : ModuleMacros) {
2715 Overrides.clear();
2716 for (unsigned ModID : MMR.Overrides) {
2717 Module *Mod = getSubmodule(ModID);
2718 auto *Macro = PP.getModuleMacro(Mod, II);
2719 assert(Macro && "missing definition for overridden macro");
2720 Overrides.push_back(Macro);
2721 }
2722
2723 bool Inserted = false;
2724 Module *Owner = getSubmodule(MMR.SubModID);
2725 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2726 }
2727 }
2728
2729 // Don't read the directive history for a module; we don't have anywhere
2730 // to put it.
2731 if (M.isModule())
2732 return;
2733
2734 // Deserialize the macro directives history in reverse source-order.
2735 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2736 unsigned Idx = 0, N = Record.size();
2737 while (Idx < N) {
2738 MacroDirective *MD = nullptr;
2741 switch (K) {
2743 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2744 MD = PP.AllocateDefMacroDirective(MI, Loc);
2745 break;
2746 }
2748 MD = PP.AllocateUndefMacroDirective(Loc);
2749 break;
2751 bool isPublic = Record[Idx++];
2752 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2753 break;
2754 }
2755
2756 if (!Latest)
2757 Latest = MD;
2758 if (Earliest)
2759 Earliest->setPrevious(MD);
2760 Earliest = MD;
2761 }
2762
2763 if (Latest)
2764 PP.setLoadedMacroDirective(II, Earliest, Latest);
2765}
2766
2767bool ASTReader::shouldDisableValidationForFile(
2768 const serialization::ModuleFile &M) const {
2769 if (DisableValidationKind == DisableValidationForModuleKind::None)
2770 return false;
2771
2772 // If a PCH is loaded and validation is disabled for PCH then disable
2773 // validation for the PCH and the modules it loads.
2774 ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2775
2776 switch (K) {
2777 case MK_MainFile:
2778 case MK_Preamble:
2779 case MK_PCH:
2780 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2781 case MK_ImplicitModule:
2782 case MK_ExplicitModule:
2783 case MK_PrebuiltModule:
2784 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2785 }
2786
2787 return false;
2788}
2789
2790static std::pair<StringRef, StringRef>
2792 const StringRef InputBlob) {
2793 uint16_t AsRequestedLength = Record[7];
2794 return {InputBlob.substr(0, AsRequestedLength),
2795 InputBlob.substr(AsRequestedLength)};
2796}
2797
2798InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2799 // If this ID is bogus, just return an empty input file.
2800 if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2801 return InputFileInfo();
2802
2803 // If we've already loaded this input file, return it.
2804 if (F.InputFileInfosLoaded[ID - 1].isValid())
2805 return F.InputFileInfosLoaded[ID - 1];
2806
2807 // Go find this input file.
2808 BitstreamCursor &Cursor = F.InputFilesCursor;
2809 SavedStreamPosition SavedPosition(Cursor);
2810 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2811 F.InputFileOffsets[ID - 1])) {
2812 // FIXME this drops errors on the floor.
2813 consumeError(std::move(Err));
2814 }
2815
2816 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2817 if (!MaybeCode) {
2818 // FIXME this drops errors on the floor.
2819 consumeError(MaybeCode.takeError());
2820 }
2821 unsigned Code = MaybeCode.get();
2822 RecordData Record;
2823 StringRef Blob;
2824
2825 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2826 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2827 "invalid record type for input file");
2828 else {
2829 // FIXME this drops errors on the floor.
2830 consumeError(Maybe.takeError());
2831 }
2832
2833 assert(Record[0] == ID && "Bogus stored ID or offset");
2835 R.StoredSize = static_cast<off_t>(Record[1]);
2836 R.StoredTime = static_cast<time_t>(Record[2]);
2837 R.Overridden = static_cast<bool>(Record[3]);
2838 R.Transient = static_cast<bool>(Record[4]);
2839 R.TopLevel = static_cast<bool>(Record[5]);
2840 R.ModuleMap = static_cast<bool>(Record[6]);
2841 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2843 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2844 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2845 ? UnresolvedFilenameAsRequested
2846 : UnresolvedFilename;
2847
2848 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2849 if (!MaybeEntry) // FIXME this drops errors on the floor.
2850 consumeError(MaybeEntry.takeError());
2851 llvm::BitstreamEntry Entry = MaybeEntry.get();
2852 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2853 "expected record type for input file hash");
2854
2855 Record.clear();
2856 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2857 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2858 "invalid record type for input file hash");
2859 else {
2860 // FIXME this drops errors on the floor.
2861 consumeError(Maybe.takeError());
2862 }
2863 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2864 static_cast<uint64_t>(Record[0]);
2865
2866 // Note that we've loaded this input file info.
2867 F.InputFileInfosLoaded[ID - 1] = R;
2868 return R;
2869}
2870
2871static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2872InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2873 // If this ID is bogus, just return an empty input file.
2874 if (ID == 0 || ID > F.InputFilesLoaded.size())
2875 return InputFile();
2876
2877 // If we've already loaded this input file, return it.
2878 if (F.InputFilesLoaded[ID-1].getFile())
2879 return F.InputFilesLoaded[ID-1];
2880
2881 if (F.InputFilesLoaded[ID-1].isNotFound())
2882 return InputFile();
2883
2884 // Go find this input file.
2885 BitstreamCursor &Cursor = F.InputFilesCursor;
2886 SavedStreamPosition SavedPosition(Cursor);
2887 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2888 F.InputFileOffsets[ID - 1])) {
2889 // FIXME this drops errors on the floor.
2890 consumeError(std::move(Err));
2891 }
2892
2893 InputFileInfo FI = getInputFileInfo(F, ID);
2894 off_t StoredSize = FI.StoredSize;
2895 time_t StoredTime = FI.StoredTime;
2896 bool Overridden = FI.Overridden;
2897 bool Transient = FI.Transient;
2898 auto Filename =
2899 ResolveImportedPath(PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
2900 uint64_t StoredContentHash = FI.ContentHash;
2901
2902 // For standard C++ modules, we don't need to check the inputs.
2903 bool SkipChecks = F.StandardCXXModule;
2904
2905 const HeaderSearchOptions &HSOpts =
2906 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2907
2908 // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2909 // modules.
2911 SkipChecks = false;
2912 Overridden = false;
2913 }
2914
2915 auto File = FileMgr.getOptionalFileRef(*Filename, /*OpenFile=*/false);
2916
2917 // For an overridden file, create a virtual file with the stored
2918 // size/timestamp.
2919 if ((Overridden || Transient || SkipChecks) && !File)
2920 File = FileMgr.getVirtualFileRef(*Filename, StoredSize, StoredTime);
2921
2922 if (!File) {
2923 if (Complain) {
2924 std::string ErrorStr = "could not find file '";
2925 ErrorStr += *Filename;
2926 ErrorStr += "' referenced by AST file '";
2927 ErrorStr += F.FileName.str();
2928 ErrorStr += "'";
2929 Error(ErrorStr);
2930 }
2931 // Record that we didn't find the file.
2933 return InputFile();
2934 }
2935
2936 // Check if there was a request to override the contents of the file
2937 // that was part of the precompiled header. Overriding such a file
2938 // can lead to problems when lexing using the source locations from the
2939 // PCH.
2940 SourceManager &SM = getSourceManager();
2941 // FIXME: Reject if the overrides are different.
2942 if ((!Overridden && !Transient) && !SkipChecks &&
2943 SM.isFileOverridden(*File)) {
2944 if (Complain)
2945 Error(diag::err_fe_pch_file_overridden, *Filename);
2946
2947 // After emitting the diagnostic, bypass the overriding file to recover
2948 // (this creates a separate FileEntry).
2950 if (!File) {
2952 return InputFile();
2953 }
2954 }
2955
2956 auto HasInputContentChanged = [&](Change OriginalChange) {
2957 assert(ValidateASTInputFilesContent &&
2958 "We should only check the content of the inputs with "
2959 "ValidateASTInputFilesContent enabled.");
2960
2961 if (StoredContentHash == 0)
2962 return OriginalChange;
2963
2964 auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2965 if (!MemBuffOrError) {
2966 if (!Complain)
2967 return OriginalChange;
2968 std::string ErrorStr = "could not get buffer for file '";
2969 ErrorStr += File->getName();
2970 ErrorStr += "'";
2971 Error(ErrorStr);
2972 return OriginalChange;
2973 }
2974
2975 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2976 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2977 return Change{Change::None};
2978
2979 return Change{Change::Content};
2980 };
2981 auto HasInputFileChanged = [&]() {
2982 if (StoredSize != File->getSize())
2983 return Change{Change::Size, StoredSize, File->getSize()};
2984 if (!shouldDisableValidationForFile(F) && StoredTime &&
2985 StoredTime != File->getModificationTime()) {
2986 Change MTimeChange = {Change::ModTime, StoredTime,
2987 File->getModificationTime()};
2988
2989 // In case the modification time changes but not the content,
2990 // accept the cached file as legit.
2991 if (ValidateASTInputFilesContent)
2992 return HasInputContentChanged(MTimeChange);
2993
2994 return MTimeChange;
2995 }
2996 return Change{Change::None};
2997 };
2998
2999 bool IsOutOfDate = false;
3000 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
3001 // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
3002 // enabled, it is better to check the contents of the inputs. Since we can't
3003 // get correct modified time information for inputs from overriden inputs.
3004 if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
3005 F.StandardCXXModule && FileChange.Kind == Change::None)
3006 FileChange = HasInputContentChanged(FileChange);
3007
3008 // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
3009 // it is better to check the content of the input files because we cannot rely
3010 // on the file modification time, which will be the same (zero) for these
3011 // files.
3012 if (!StoredTime && ValidateASTInputFilesContent &&
3013 FileChange.Kind == Change::None)
3014 FileChange = HasInputContentChanged(FileChange);
3015
3016 // For an overridden file, there is nothing to validate.
3017 if (!Overridden && FileChange.Kind != Change::None) {
3018 if (Complain) {
3019 // Build a list of the PCH imports that got us here (in reverse).
3020 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
3021 while (!ImportStack.back()->ImportedBy.empty())
3022 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3023
3024 // The top-level AST file is stale.
3025 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3026 Diag(diag::err_fe_ast_file_modified)
3027 << *Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
3028 << TopLevelASTFileName;
3029 Diag(diag::note_fe_ast_file_modified)
3030 << FileChange.Kind << (FileChange.Old && FileChange.New)
3031 << llvm::itostr(FileChange.Old.value_or(0))
3032 << llvm::itostr(FileChange.New.value_or(0));
3033 if (getModuleManager()
3034 .getModuleCache()
3035 .getInMemoryModuleCache()
3036 .isPCMFinal(F.FileName))
3037 Diag(diag::note_fe_ast_file_modified_finalized) << F.ModuleName;
3038
3039 // Print the import stack.
3040 if (ImportStack.size() > 1) {
3041 Diag(diag::note_ast_file_required_by)
3042 << *Filename << ImportStack[0]->FileName;
3043 for (unsigned I = 1; I < ImportStack.size(); ++I)
3044 Diag(diag::note_ast_file_required_by)
3045 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3046 }
3047
3049 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3050 Diag(diag::note_ast_file_input_files_validation_status)
3052 }
3053
3054 IsOutOfDate = true;
3055 }
3056 // FIXME: If the file is overridden and we've already opened it,
3057 // issue an error (or split it into a separate FileEntry).
3058
3059 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
3060
3061 // Note that we've loaded this input file.
3062 F.InputFilesLoaded[ID-1] = IF;
3063 return IF;
3064}
3065
3066ASTReader::TemporarilyOwnedStringRef
3068 ModuleFile &ModF) {
3069 return ResolveImportedPath(Buf, Path, ModF.BaseDirectory);
3070}
3071
3072ASTReader::TemporarilyOwnedStringRef
3074 StringRef Prefix) {
3075 assert(Buf.capacity() != 0 && "Overlapping ResolveImportedPath calls");
3076
3077 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3078 Path == "<built-in>" || Path == "<command line>")
3079 return {Path, Buf};
3080
3081 // The writer makes the base directory itself relative as ".".
3082 if (Path == ".")
3083 return {Prefix, Buf};
3084
3085 Buf.clear();
3086 llvm::sys::path::append(Buf, Prefix, Path);
3087 StringRef ResolvedPath{Buf.data(), Buf.size()};
3088 return {ResolvedPath, Buf};
3089}
3090
3092 StringRef P,
3093 ModuleFile &ModF) {
3094 return ResolveImportedPathAndAllocate(Buf, P, ModF.BaseDirectory);
3095}
3096
3098 StringRef P,
3099 StringRef Prefix) {
3100 auto ResolvedPath = ResolveImportedPath(Buf, P, Prefix);
3101 return ResolvedPath->str();
3102}
3103
3104static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
3105 switch (ARR) {
3106 case ASTReader::Failure: return true;
3107 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
3108 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
3111 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
3112 case ASTReader::HadErrors: return true;
3113 case ASTReader::Success: return false;
3114 }
3115
3116 llvm_unreachable("unknown ASTReadResult");
3117}
3118
3119ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
3120 BitstreamCursor &Stream, StringRef Filename,
3121 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
3122 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3123 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
3124 // FIXME this drops errors on the floor.
3125 consumeError(std::move(Err));
3126 return Failure;
3127 }
3128
3129 // Read all of the records in the options block.
3130 RecordData Record;
3131 ASTReadResult Result = Success;
3132 while (true) {
3133 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3134 if (!MaybeEntry) {
3135 // FIXME this drops errors on the floor.
3136 consumeError(MaybeEntry.takeError());
3137 return Failure;
3138 }
3139 llvm::BitstreamEntry Entry = MaybeEntry.get();
3140
3141 switch (Entry.Kind) {
3142 case llvm::BitstreamEntry::Error:
3143 case llvm::BitstreamEntry::SubBlock:
3144 return Failure;
3145
3146 case llvm::BitstreamEntry::EndBlock:
3147 return Result;
3148
3149 case llvm::BitstreamEntry::Record:
3150 // The interesting case.
3151 break;
3152 }
3153
3154 // Read and process a record.
3155 Record.clear();
3156 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
3157 if (!MaybeRecordType) {
3158 // FIXME this drops errors on the floor.
3159 consumeError(MaybeRecordType.takeError());
3160 return Failure;
3161 }
3162 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
3163 case LANGUAGE_OPTIONS: {
3164 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3165 if (ParseLanguageOptions(Record, Filename, Complain, Listener,
3166 AllowCompatibleConfigurationMismatch))
3167 Result = ConfigurationMismatch;
3168 break;
3169 }
3170
3171 case CODEGEN_OPTIONS: {
3172 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3173 if (ParseCodeGenOptions(Record, Filename, Complain, Listener,
3174 AllowCompatibleConfigurationMismatch))
3175 Result = ConfigurationMismatch;
3176 break;
3177 }
3178
3179 case TARGET_OPTIONS: {
3180 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3181 if (ParseTargetOptions(Record, Filename, Complain, Listener,
3182 AllowCompatibleConfigurationMismatch))
3183 Result = ConfigurationMismatch;
3184 break;
3185 }
3186
3187 case FILE_SYSTEM_OPTIONS: {
3188 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3189 if (!AllowCompatibleConfigurationMismatch &&
3190 ParseFileSystemOptions(Record, Complain, Listener))
3191 Result = ConfigurationMismatch;
3192 break;
3193 }
3194
3195 case HEADER_SEARCH_OPTIONS: {
3196 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3197 if (!AllowCompatibleConfigurationMismatch &&
3198 ParseHeaderSearchOptions(Record, Filename, Complain, Listener))
3199 Result = ConfigurationMismatch;
3200 break;
3201 }
3202
3204 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3205 if (!AllowCompatibleConfigurationMismatch &&
3206 ParsePreprocessorOptions(Record, Filename, Complain, Listener,
3207 SuggestedPredefines))
3208 Result = ConfigurationMismatch;
3209 break;
3210 }
3211 }
3212}
3213
3214/// Returns {build-session validation applies, MF was validated this session}.
3215static std::pair<bool, bool>
3217 const HeaderSearchOptions &HSOpts) {
3218 const bool EnablesBSValidation =
3220 const bool WasValidated =
3221 EnablesBSValidation &&
3223 return {EnablesBSValidation, WasValidated};
3224}
3225
3226ASTReader::RelocationResult
3227ASTReader::getModuleForRelocationChecks(ModuleFile &F, bool DirectoryCheck) {
3228 // Don't emit module relocation errors if we have -fno-validate-pch.
3229 const bool IgnoreError =
3230 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3232
3233 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3234 return {std::nullopt, IgnoreError};
3235
3236 const bool IsImplicitModule = F.Kind == MK_ImplicitModule;
3237
3238 if (!DirectoryCheck &&
3239 (!IsImplicitModule || ModuleMgr.begin()->Kind == MK_MainFile))
3240 return {std::nullopt, IgnoreError};
3241
3242 const HeaderSearchOptions &HSOpts =
3243 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3244
3245 // When only validating modules once per build session,
3246 // Skip check if the timestamp is up to date or module was built in same build
3247 // session.
3248 auto [EnablesBSValidation, WasValidated] =
3249 wasValidatedInBuildSession(F, HSOpts);
3250 const bool SkipModuleLookup =
3251 !PP.getPreprocessorOpts().ModulesForceRedundantLookup &&
3252 (WasValidated ||
3253 (EnablesBSValidation &&
3254 static_cast<uint64_t>(F.ModTime) >= HSOpts.BuildSessionTimestamp));
3255
3256 if (SkipModuleLookup)
3257 return {std::nullopt, IgnoreError};
3258
3259 Diag(diag::remark_module_check_relocation) << F.ModuleName << F.FileName;
3260
3261 // If we've already loaded a module map file covering this module, we may
3262 // have a better path for it (relative to the current build if doing directory
3263 // check).
3264 Module *M = PP.getHeaderSearchInfo().lookupModule(
3265 F.ModuleName, DirectoryCheck ? SourceLocation() : F.ImportLoc,
3266 /*AllowSearch=*/true,
3267 /*AllowExtraModuleMapSearch=*/DirectoryCheck);
3268
3269 return {M, IgnoreError};
3270}
3271
3273ASTReader::ReadControlBlock(ModuleFile &F,
3274 SmallVectorImpl<ImportedModule> &Loaded,
3275 const ModuleFile *ImportedBy,
3276 unsigned ClientLoadCapabilities) {
3277 BitstreamCursor &Stream = F.Stream;
3278
3279 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
3280 Error(std::move(Err));
3281 return Failure;
3282 }
3283
3284 // Lambda to read the unhashed control block the first time it's called.
3285 //
3286 // For PCM files, the unhashed control block cannot be read until after the
3287 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
3288 // need to look ahead before reading the IMPORTS record. For consistency,
3289 // this block is always read somehow (see BitstreamEntry::EndBlock).
3290 bool HasReadUnhashedControlBlock = false;
3291 auto readUnhashedControlBlockOnce = [&]() {
3292 if (!HasReadUnhashedControlBlock) {
3293 HasReadUnhashedControlBlock = true;
3294 if (ASTReadResult Result =
3295 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3296 return Result;
3297 }
3298 return Success;
3299 };
3300
3301 bool DisableValidation = shouldDisableValidationForFile(F);
3302
3303 // Read all of the records and blocks in the control block.
3304 RecordData Record;
3305 unsigned NumInputs = 0;
3306 unsigned NumUserInputs = 0;
3307 StringRef BaseDirectoryAsWritten;
3308 while (true) {
3309 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3310 if (!MaybeEntry) {
3311 Error(MaybeEntry.takeError());
3312 return Failure;
3313 }
3314 llvm::BitstreamEntry Entry = MaybeEntry.get();
3315
3316 switch (Entry.Kind) {
3317 case llvm::BitstreamEntry::Error:
3318 Error("malformed block record in AST file");
3319 return Failure;
3320 case llvm::BitstreamEntry::EndBlock: {
3321 // Validate the module before returning. This call catches an AST with
3322 // no module name and no imports.
3323 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3324 return Result;
3325
3326 // Validate input files.
3327 const HeaderSearchOptions &HSOpts =
3328 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3329
3330 // All user input files reside at the index range [0, NumUserInputs), and
3331 // system input files reside at [NumUserInputs, NumInputs). For explicitly
3332 // loaded module files, ignore missing inputs.
3333 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
3334 F.Kind != MK_PrebuiltModule) {
3335 bool Complain =
3336 !canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities);
3337
3338 // If we are reading a module, we will create a verification timestamp,
3339 // so we verify all input files. Otherwise, verify only user input
3340 // files.
3341
3342 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3343 F.InputFilesValidationStatus = ValidateSystemInputs
3346 auto [_, WasValidated] = wasValidatedInBuildSession(F, HSOpts);
3347 if (WasValidated) {
3348 N = ForceValidateUserInputs ? NumUserInputs : 0;
3350 ForceValidateUserInputs
3353 }
3354
3355 if (N != 0)
3356 Diag(diag::remark_module_validation)
3357 << N << F.ModuleName << F.FileName;
3358
3359 for (unsigned I = 0; I < N; ++I) {
3360 InputFile IF = getInputFile(F, I+1, Complain);
3361 if (!IF.getFile() || IF.isOutOfDate())
3362 return OutOfDate;
3363 }
3364
3365 // A header added to a directory the module enumerated was never
3366 // recorded as an input file, so the check above misses it.
3367 if (!WasValidated && F.Kind == MK_ImplicitModule &&
3369 isDirectoryDependencyOutOfDate(F, Complain))
3370 return OutOfDate;
3371 } else {
3373 }
3374
3375 if (Listener)
3376 Listener->visitModuleFile(F.FileName, F.Kind, F.isDirectlyImported());
3377
3378 if (Listener && Listener->needsInputFileVisitation()) {
3379 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
3380 : NumUserInputs;
3381 for (unsigned I = 0; I < N; ++I) {
3382 bool IsSystem = I >= NumUserInputs;
3383 InputFileInfo FI = getInputFileInfo(F, I + 1);
3384 auto FilenameAsRequested = ResolveImportedPath(
3386 Listener->visitInputFile(
3387 *FilenameAsRequested, IsSystem, FI.Overridden,
3389 }
3390 }
3391
3392 return Success;
3393 }
3394
3395 case llvm::BitstreamEntry::SubBlock:
3396 switch (Entry.ID) {
3398 F.InputFilesCursor = Stream;
3399 if (llvm::Error Err = Stream.SkipBlock()) {
3400 Error(std::move(Err));
3401 return Failure;
3402 }
3403 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
3404 Error("malformed block record in AST file");
3405 return Failure;
3406 }
3407 F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
3408 continue;
3409
3410 case OPTIONS_BLOCK_ID:
3411 // If we're reading the first module for this group, check its options
3412 // are compatible with ours. For modules it imports, no further checking
3413 // is required, because we checked them when we built it.
3414 if (Listener && !ImportedBy) {
3415 // Should we allow the configuration of the module file to differ from
3416 // the configuration of the current translation unit in a compatible
3417 // way?
3418 //
3419 // FIXME: Allow this for files explicitly specified with -include-pch.
3420 bool AllowCompatibleConfigurationMismatch =
3422
3423 ASTReadResult Result =
3424 ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities,
3425 AllowCompatibleConfigurationMismatch, *Listener,
3426 SuggestedPredefines);
3427 if (Result == Failure) {
3428 Error("malformed block record in AST file");
3429 return Result;
3430 }
3431
3432 if (DisableValidation ||
3433 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
3434 Result = Success;
3435
3436 // If we can't load the module, exit early since we likely
3437 // will rebuild the module anyway. The stream may be in the
3438 // middle of a block.
3439 if (Result != Success)
3440 return Result;
3441 } else if (llvm::Error Err = Stream.SkipBlock()) {
3442 Error(std::move(Err));
3443 return Failure;
3444 }
3445 continue;
3446
3447 default:
3448 if (llvm::Error Err = Stream.SkipBlock()) {
3449 Error(std::move(Err));
3450 return Failure;
3451 }
3452 continue;
3453 }
3454
3455 case llvm::BitstreamEntry::Record:
3456 // The interesting case.
3457 break;
3458 }
3459
3460 // Read and process a record.
3461 Record.clear();
3462 StringRef Blob;
3463 Expected<unsigned> MaybeRecordType =
3464 Stream.readRecord(Entry.ID, Record, &Blob);
3465 if (!MaybeRecordType) {
3466 Error(MaybeRecordType.takeError());
3467 return Failure;
3468 }
3469 switch ((ControlRecordTypes)MaybeRecordType.get()) {
3470 case METADATA: {
3471 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3472 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3473 Diag(Record[0] < VERSION_MAJOR ? diag::err_ast_file_version_too_old
3474 : diag::err_ast_file_version_too_new)
3476 return VersionMismatch;
3477 }
3478
3479 bool hasErrors = Record[7];
3480 if (hasErrors && !DisableValidation) {
3481 // If requested by the caller and the module hasn't already been read
3482 // or compiled, mark modules on error as out-of-date.
3483 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3484 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3485 return OutOfDate;
3486
3487 if (!AllowASTWithCompilerErrors) {
3488 Diag(diag::err_ast_file_with_compiler_errors)
3490 return HadErrors;
3491 }
3492 }
3493 if (hasErrors) {
3494 Diags.ErrorOccurred = true;
3495 Diags.UncompilableErrorOccurred = true;
3496 Diags.UnrecoverableErrorOccurred = true;
3497 }
3498
3499 F.RelocatablePCH = Record[4];
3500 // Relative paths in a relocatable PCH are relative to our sysroot.
3501 if (F.RelocatablePCH)
3502 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3503
3505
3506 F.HasTimestamps = Record[6];
3507
3508 const std::string &CurBranch = getClangFullRepositoryVersion();
3509 StringRef ASTBranch = Blob;
3510 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3511 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3512 Diag(diag::err_ast_file_different_branch)
3513 << moduleKindForDiagnostic(F.Kind) << F.FileName << ASTBranch
3514 << CurBranch;
3515 return VersionMismatch;
3516 }
3517 break;
3518 }
3519
3520 case IMPORT: {
3521 // Validate the AST before processing any imports (otherwise, untangling
3522 // them can be error-prone and expensive). A module will have a name and
3523 // will already have been validated, but this catches the PCH case.
3524 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3525 return Result;
3526
3527 unsigned Idx = 0;
3528 // Read information about the AST file.
3529 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3530
3531 // The import location will be the local one for now; we will adjust
3532 // all import locations of module imports after the global source
3533 // location info are setup, in ReadAST.
3534 auto [ImportLoc, ImportModuleFileIndex] =
3535 ReadUntranslatedSourceLocation(Record[Idx++]);
3536 // The import location must belong to the current module file itself.
3537 assert(ImportModuleFileIndex == 0);
3538
3539 StringRef ImportedName = ReadStringBlob(Record, Idx, Blob);
3540
3541 bool IsImportingStdCXXModule = Record[Idx++];
3542
3543 off_t StoredSize = 0;
3544 time_t StoredModTime = 0;
3545 unsigned FileNameKind = 0;
3546 ASTFileSignature StoredSignature;
3547 ModuleFileName ImportedFile;
3548 std::string StoredFile;
3549 bool IgnoreImportedByNote = false;
3550
3551 // For prebuilt and explicit modules first consult the file map for
3552 // an override. Note that here we don't search prebuilt module
3553 // directories if we're not importing standard c++ module, only the
3554 // explicit name to file mappings. Also, we will still verify the
3555 // size/signature making sure it is essentially the same file but
3556 // perhaps in a different location.
3557 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3558 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3559 ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3560
3561 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3562 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3563 return Missing;
3564 }
3565
3566 if (!IsImportingStdCXXModule) {
3567 StoredSize = (off_t)Record[Idx++];
3568 StoredModTime = (time_t)Record[Idx++];
3569 FileNameKind = (unsigned)Record[Idx++];
3570
3571 StringRef SignatureBytes = Blob.substr(0, ASTFileSignature::size);
3572 StoredSignature = ASTFileSignature::create(SignatureBytes.begin(),
3573 SignatureBytes.end());
3574 Blob = Blob.substr(ASTFileSignature::size);
3575
3576 StoredFile = ReadPathBlob(BaseDirectoryAsWritten, Record, Idx, Blob);
3577 if (ImportedFile.empty()) {
3578 ImportedFile = ModuleFileName::makeFromRaw(StoredFile, FileNameKind);
3579 } else if (!getDiags().isIgnored(
3580 diag::warn_module_file_mapping_mismatch,
3581 CurrentImportLoc)) {
3582 auto ImportedFileRef =
3583 PP.getFileManager().getOptionalFileRef(ImportedFile);
3584 auto StoredFileRef =
3585 PP.getFileManager().getOptionalFileRef(StoredFile);
3586 if ((ImportedFileRef && StoredFileRef) &&
3587 (*ImportedFileRef != *StoredFileRef)) {
3588 Diag(diag::warn_module_file_mapping_mismatch)
3589 << ImportedFile << StoredFile;
3590 Diag(diag::note_module_file_imported_by)
3591 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3592 IgnoreImportedByNote = true;
3593 }
3594 }
3595 }
3596
3597 // If our client can't cope with us being out of date, we can't cope with
3598 // our dependency being missing.
3599 unsigned Capabilities = ClientLoadCapabilities;
3600 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3601 Capabilities &= ~ARR_Missing;
3602
3603 // Load the AST file.
3604 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3605 Loaded, StoredSize, StoredModTime,
3606 StoredSignature, Capabilities);
3607
3608 // Check the AST we just read from ImportedFile contains a different
3609 // module than we expected (ImportedName). This can occur for C++20
3610 // Modules when given a mismatch via -fmodule-file=<name>=<file>
3611 if (IsImportingStdCXXModule) {
3612 if (const auto *Imported =
3613 getModuleManager().lookupByFileName(ImportedFile);
3614 Imported != nullptr && Imported->ModuleName != ImportedName) {
3615 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3616 Result = Missing;
3617 }
3618 }
3619
3620 // If we diagnosed a problem, produce a backtrace.
3621 bool recompilingFinalized = Result == OutOfDate &&
3622 (Capabilities & ARR_OutOfDate) &&
3623 getModuleManager()
3624 .getModuleCache()
3625 .getInMemoryModuleCache()
3626 .isPCMFinal(F.FileName);
3627 if (!IgnoreImportedByNote &&
3628 (isDiagnosedResult(Result, Capabilities) || recompilingFinalized))
3629 Diag(diag::note_module_file_imported_by)
3630 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3631
3632 switch (Result) {
3633 case Failure: return Failure;
3634 // If we have to ignore the dependency, we'll have to ignore this too.
3635 case Missing:
3636 case OutOfDate: return OutOfDate;
3637 case VersionMismatch: return VersionMismatch;
3638 case ConfigurationMismatch: return ConfigurationMismatch;
3639 case HadErrors: return HadErrors;
3640 case Success: break;
3641 }
3642 break;
3643 }
3644
3645 case ORIGINAL_FILE:
3646 F.OriginalSourceFileID = FileID::get(Record[0]);
3647 F.ActualOriginalSourceFileName = std::string(Blob);
3648 F.OriginalSourceFileName = ResolveImportedPathAndAllocate(
3649 PathBuf, F.ActualOriginalSourceFileName, F);
3650 break;
3651
3652 case ORIGINAL_FILE_ID:
3653 F.OriginalSourceFileID = FileID::get(Record[0]);
3654 break;
3655
3656 case MODULE_NAME:
3657 F.ModuleName = std::string(Blob);
3658 Diag(diag::remark_module_import)
3659 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3660 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3661 if (Listener)
3662 Listener->ReadModuleName(F.ModuleName);
3663
3664 // Validate the AST as soon as we have a name so we can exit early on
3665 // failure.
3666 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3667 return Result;
3668
3669 break;
3670
3671 case MODULE_DIRECTORY: {
3672 // Save the BaseDirectory as written in the PCM for computing the module
3673 // filename for the ModuleCache.
3674 BaseDirectoryAsWritten = Blob;
3675 assert(!F.ModuleName.empty() &&
3676 "MODULE_DIRECTORY found before MODULE_NAME");
3677 F.BaseDirectory = std::string(Blob);
3678
3679 auto [MaybeM, IgnoreError] =
3680 getModuleForRelocationChecks(F, /*DirectoryCheck=*/true);
3681 if (!MaybeM.has_value())
3682 break;
3683
3684 Module *M = MaybeM.value();
3685 if (!M || !M->Directory)
3686 break;
3687 if (IgnoreError) {
3688 F.BaseDirectory = std::string(M->Directory->getName());
3689 break;
3690 }
3691 if ((F.Kind == MK_ExplicitModule) || (F.Kind == MK_PrebuiltModule))
3692 break;
3693
3694 // If we're implicitly loading a module, the base directory can't
3695 // change between the build and use.
3696 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3697 if (BuildDir && (*BuildDir == M->Directory)) {
3698 F.BaseDirectory = std::string(M->Directory->getName());
3699 break;
3700 }
3701 Diag(diag::remark_module_relocated)
3702 << F.ModuleName << Blob << M->Directory->getName();
3703
3704 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3705 Diag(diag::err_imported_module_relocated)
3706 << F.ModuleName << Blob << M->Directory->getName();
3707 return OutOfDate;
3708 }
3709
3710 case MODULE_MAP_FILE:
3711 if (ASTReadResult Result =
3712 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3713 return Result;
3714 break;
3715
3717 ReadDirectoryDependencies(Record, F);
3718 break;
3719
3720 case INPUT_FILE_OFFSETS:
3721 NumInputs = Record[0];
3722 NumUserInputs = Record[1];
3724 (const llvm::support::unaligned_uint64_t *)Blob.data();
3725 F.InputFilesLoaded.resize(NumInputs);
3726 F.InputFileInfosLoaded.resize(NumInputs);
3727 F.NumUserInputFiles = NumUserInputs;
3728 break;
3729 }
3730 }
3731}
3732
3733llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3734 unsigned ClientLoadCapabilities) {
3735 BitstreamCursor &Stream = F.Stream;
3736
3737 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3738 return Err;
3739 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3740
3741 // Read all of the records and blocks for the AST file.
3742 RecordData Record;
3743 while (true) {
3744 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3745 if (!MaybeEntry)
3746 return MaybeEntry.takeError();
3747 llvm::BitstreamEntry Entry = MaybeEntry.get();
3748
3749 switch (Entry.Kind) {
3750 case llvm::BitstreamEntry::Error:
3751 return llvm::createStringError(
3752 std::errc::illegal_byte_sequence,
3753 "error at end of module block in AST file");
3754 case llvm::BitstreamEntry::EndBlock:
3755 // Outside of C++, we do not store a lookup map for the translation unit.
3756 // Instead, mark it as needing a lookup map to be built if this module
3757 // contains any declarations lexically within it (which it always does!).
3758 // This usually has no cost, since we very rarely need the lookup map for
3759 // the translation unit outside C++.
3760 if (ASTContext *Ctx = ContextObj) {
3761 DeclContext *DC = Ctx->getTranslationUnitDecl();
3762 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3764 }
3765
3766 return llvm::Error::success();
3767 case llvm::BitstreamEntry::SubBlock:
3768 switch (Entry.ID) {
3769 case DECLTYPES_BLOCK_ID:
3770 // We lazily load the decls block, but we want to set up the
3771 // DeclsCursor cursor to point into it. Clone our current bitcode
3772 // cursor to it, enter the block and read the abbrevs in that block.
3773 // With the main cursor, we just skip over it.
3774 F.DeclsCursor = Stream;
3775 if (llvm::Error Err = Stream.SkipBlock())
3776 return Err;
3777 if (llvm::Error Err = ReadBlockAbbrevs(
3779 return Err;
3780 break;
3781
3783 F.MacroCursor = Stream;
3784 if (!PP.getExternalSource())
3785 PP.setExternalSource(this);
3786
3787 if (llvm::Error Err = Stream.SkipBlock())
3788 return Err;
3789 if (llvm::Error Err =
3790 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3791 return Err;
3792 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3793 break;
3794
3796 F.PreprocessorDetailCursor = Stream;
3797
3798 if (llvm::Error Err = Stream.SkipBlock()) {
3799 return Err;
3800 }
3801 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3803 return Err;
3805 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3806
3807 if (!PP.getPreprocessingRecord())
3808 PP.createPreprocessingRecord();
3809 if (!PP.getPreprocessingRecord()->getExternalSource())
3810 PP.getPreprocessingRecord()->SetExternalSource(*this);
3811 break;
3812
3814 if (llvm::Error Err = ReadSourceManagerBlock(F))
3815 return Err;
3816 break;
3817
3818 case SUBMODULE_BLOCK_ID:
3819 F.SubmodulesCursor = Stream;
3820 if (llvm::Error Err = Stream.SkipBlock())
3821 return Err;
3822 if (llvm::Error Err =
3823 ReadBlockAbbrevs(F.SubmodulesCursor, SUBMODULE_BLOCK_ID))
3824 return Err;
3825 F.SubmodulesOffsetBase = F.SubmodulesCursor.GetCurrentBitNo();
3826 break;
3827
3828 case COMMENTS_BLOCK_ID: {
3829 BitstreamCursor C = Stream;
3830
3831 if (llvm::Error Err = Stream.SkipBlock())
3832 return Err;
3833 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3834 return Err;
3835 CommentsCursors.push_back(std::make_pair(C, &F));
3836 break;
3837 }
3838
3839 default:
3840 if (llvm::Error Err = Stream.SkipBlock())
3841 return Err;
3842 break;
3843 }
3844 continue;
3845
3846 case llvm::BitstreamEntry::Record:
3847 // The interesting case.
3848 break;
3849 }
3850
3851 // Read and process a record.
3852 Record.clear();
3853 StringRef Blob;
3854 Expected<unsigned> MaybeRecordType =
3855 Stream.readRecord(Entry.ID, Record, &Blob);
3856 if (!MaybeRecordType)
3857 return MaybeRecordType.takeError();
3858 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3859
3860 // If we're not loading an AST context, we don't care about most records.
3861 if (!ContextObj) {
3862 switch (RecordType) {
3863 case IDENTIFIER_TABLE:
3864 case IDENTIFIER_OFFSET:
3866 case STATISTICS:
3869 case PP_COUNTER_VALUE:
3871 case MODULE_OFFSET_MAP:
3875 case IMPORTED_MODULES:
3876 case MACRO_OFFSET:
3877 case SUBMODULE_METADATA:
3878 break;
3879 default:
3880 continue;
3881 }
3882 }
3883
3884 switch (RecordType) {
3885 default: // Default behavior: ignore.
3886 break;
3887
3888 case SUBMODULE_METADATA: {
3889 F.BaseSubmoduleID = getTotalNumSubmodules();
3894 (const llvm::support::unaligned_uint64_t *)Blob.data();
3895 if (F.LocalNumSubmodules > 0) {
3896 // Introduce the global -> local mapping for submodules within this
3897 // module.
3898 GlobalSubmoduleMap.insert(
3899 std::make_pair(getTotalNumSubmodules() + 1, &F));
3900
3901 // Introduce the local -> global mapping for submodules within this
3902 // module.
3904 std::make_pair(F.LocalBaseSubmoduleID,
3906
3907 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3908 }
3909
3910 auto ReadSubmodule = [&](unsigned LocalID) -> Module * {
3911 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3912 };
3913
3914 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.ModuleName)) {
3915 // If we already knew about this module, make sure to bring all
3916 // submodules up to date.
3917 for (unsigned Index = 0; Index != F.LocalNumSubmodules; ++Index) {
3918 unsigned LocalID =
3920 ReadSubmodule(LocalID);
3921 }
3922 } else {
3923 // If we didn't know this module, we loaded it transitively. Deserialize
3924 // just the top-level module to register it with ModuleMap, but load the
3925 // rest lazily.
3926 ReadSubmodule(F.LocalTopLevelSubmoduleID);
3927 }
3928
3929 break;
3930 }
3931
3932 case TYPE_OFFSET: {
3933 if (F.LocalNumTypes != 0)
3934 return llvm::createStringError(
3935 std::errc::illegal_byte_sequence,
3936 "duplicate TYPE_OFFSET record in AST file");
3937 F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3938 F.LocalNumTypes = Record[0];
3939 F.BaseTypeIndex = getTotalNumTypes();
3940
3941 if (F.LocalNumTypes > 0)
3942 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3943
3944 break;
3945 }
3946
3947 case DECL_OFFSET: {
3948 if (F.LocalNumDecls != 0)
3949 return llvm::createStringError(
3950 std::errc::illegal_byte_sequence,
3951 "duplicate DECL_OFFSET record in AST file");
3952 F.DeclOffsets = (const DeclOffset *)Blob.data();
3953 F.LocalNumDecls = Record[0];
3954 F.BaseDeclIndex = getTotalNumDecls();
3955
3956 if (F.LocalNumDecls > 0)
3957 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3958
3959 break;
3960 }
3961
3962 case TU_UPDATE_LEXICAL: {
3963 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3964 LexicalContents Contents(
3965 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3966 static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3967 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3969 break;
3970 }
3971
3972 case UPDATE_VISIBLE: {
3973 unsigned Idx = 0;
3974 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3975 auto *Data = (const unsigned char*)Blob.data();
3976 PendingVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3977 // If we've already loaded the decl, perform the updates when we finish
3978 // loading this block.
3979 if (Decl *D = GetExistingDecl(ID))
3980 PendingUpdateRecords.push_back(
3981 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3982 break;
3983 }
3984
3986 unsigned Idx = 0;
3987 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3988 auto *Data = (const unsigned char *)Blob.data();
3989 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3990 // If we've already loaded the decl, perform the updates when we finish
3991 // loading this block.
3992 if (Decl *D = GetExistingDecl(ID))
3993 PendingUpdateRecords.push_back(
3994 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3995 break;
3996 }
3997
3999 if (F.Kind != MK_MainFile)
4000 break;
4001 unsigned Idx = 0;
4002 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
4003 auto *Data = (const unsigned char *)Blob.data();
4004 TULocalUpdates[ID].push_back(UpdateData{&F, Data});
4005 // If we've already loaded the decl, perform the updates when we finish
4006 // loading this block.
4007 if (Decl *D = GetExistingDecl(ID))
4008 PendingUpdateRecords.push_back(
4009 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4010 break;
4011 }
4012
4014 unsigned Idx = 0;
4015 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
4016 auto *Data = (const unsigned char *)Blob.data();
4017 PendingSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
4018 // If we've already loaded the decl, perform the updates when we finish
4019 // loading this block.
4020 if (Decl *D = GetExistingDecl(ID))
4021 PendingUpdateRecords.push_back(
4022 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4023 break;
4024 }
4025
4027 unsigned Idx = 0;
4028 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
4029 auto *Data = (const unsigned char *)Blob.data();
4030 PendingPartialSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
4031 // If we've already loaded the decl, perform the updates when we finish
4032 // loading this block.
4033 if (Decl *D = GetExistingDecl(ID))
4034 PendingUpdateRecords.push_back(
4035 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4036 break;
4037 }
4038
4039 case IDENTIFIER_TABLE:
4041 reinterpret_cast<const unsigned char *>(Blob.data());
4042 if (Record[0]) {
4043 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
4045 F.IdentifierTableData + sizeof(uint32_t),
4047 ASTIdentifierLookupTrait(*this, F));
4048
4049 PP.getIdentifierTable().setExternalIdentifierLookup(this);
4050 }
4051 break;
4052
4053 case IDENTIFIER_OFFSET: {
4054 if (F.LocalNumIdentifiers != 0)
4055 return llvm::createStringError(
4056 std::errc::illegal_byte_sequence,
4057 "duplicate IDENTIFIER_OFFSET record in AST file");
4058 F.IdentifierOffsets = (const uint32_t *)Blob.data();
4060 F.BaseIdentifierID = getTotalNumIdentifiers();
4061
4062 if (F.LocalNumIdentifiers > 0)
4063 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4065 break;
4066 }
4067
4069 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
4070 break;
4071
4073 // FIXME: Skip reading this record if our ASTConsumer doesn't care
4074 // about "interesting" decls (for instance, if we're building a module).
4075 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4076 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4077 break;
4078
4080 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
4081 // them (ie: if we're not codegenerating this module).
4082 if (F.Kind == MK_MainFile ||
4083 getContext().getLangOpts().BuildingPCHWithObjectFile)
4084 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4085 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4086 break;
4087
4088 case SPECIAL_TYPES:
4089 if (SpecialTypes.empty()) {
4090 for (unsigned I = 0, N = Record.size(); I != N; ++I)
4091 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
4092 break;
4093 }
4094
4095 if (Record.empty())
4096 break;
4097
4098 if (SpecialTypes.size() != Record.size())
4099 return llvm::createStringError(std::errc::illegal_byte_sequence,
4100 "invalid special-types record");
4101
4102 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4103 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
4104 if (!SpecialTypes[I])
4105 SpecialTypes[I] = ID;
4106 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
4107 // merge step?
4108 }
4109 break;
4110
4111 case STATISTICS:
4112 TotalNumStatements += Record[0];
4113 TotalNumMacros += Record[1];
4114 TotalLexicalDeclContexts += Record[2];
4115 TotalVisibleDeclContexts += Record[3];
4116 TotalModuleLocalVisibleDeclContexts += Record[4];
4117 TotalTULocalVisibleDeclContexts += Record[5];
4118 break;
4119
4121 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4122 UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
4123 break;
4124
4125 case DELEGATING_CTORS:
4126 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4127 DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
4128 break;
4129
4131 if (Record.size() % 3 != 0)
4132 return llvm::createStringError(std::errc::illegal_byte_sequence,
4133 "invalid weak identifiers record");
4134
4135 // FIXME: Ignore weak undeclared identifiers from non-original PCH
4136 // files. This isn't the way to do it :)
4137 WeakUndeclaredIdentifiers.clear();
4138
4139 // Translate the weak, undeclared identifiers into global IDs.
4140 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4141 WeakUndeclaredIdentifiers.push_back(
4142 getGlobalIdentifierID(F, Record[I++]));
4143 WeakUndeclaredIdentifiers.push_back(
4144 getGlobalIdentifierID(F, Record[I++]));
4145 WeakUndeclaredIdentifiers.push_back(
4146 ReadSourceLocation(F, Record, I).getRawEncoding());
4147 }
4148 break;
4149
4151 if (Record.size() % 3 != 0)
4152 return llvm::createStringError(std::errc::illegal_byte_sequence,
4153 "invalid extname identifiers record");
4154
4155 // FIXME: Ignore #pragma redefine_extname'd, undeclared identifiers from
4156 // non-original PCH files. This isn't the way to do it :)
4157 ExtnameUndeclaredIdentifiers.clear();
4158
4159 // Translate the #pragma redefine_extname'd, undeclared identifiers into
4160 // global IDs.
4161 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4162 ExtnameUndeclaredIdentifiers.push_back(
4163 getGlobalIdentifierID(F, Record[I++]));
4164 ExtnameUndeclaredIdentifiers.push_back(
4165 getGlobalIdentifierID(F, Record[I++]));
4166 ExtnameUndeclaredIdentifiers.push_back(
4167 ReadSourceLocation(F, Record, I).getRawEncoding());
4168 }
4169 break;
4170
4171 case SELECTOR_OFFSETS: {
4172 F.SelectorOffsets = (const uint32_t *)Blob.data();
4174 unsigned LocalBaseSelectorID = Record[1];
4175 F.BaseSelectorID = getTotalNumSelectors();
4176
4177 if (F.LocalNumSelectors > 0) {
4178 // Introduce the global -> local mapping for selectors within this
4179 // module.
4180 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4181
4182 // Introduce the local -> global mapping for selectors within this
4183 // module.
4185 std::make_pair(LocalBaseSelectorID,
4186 F.BaseSelectorID - LocalBaseSelectorID));
4187
4188 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
4189 }
4190 break;
4191 }
4192
4193 case METHOD_POOL:
4194 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
4195 if (Record[0])
4197 = ASTSelectorLookupTable::Create(
4200 ASTSelectorLookupTrait(*this, F));
4201 TotalNumMethodPoolEntries += Record[1];
4202 break;
4203
4205 if (!Record.empty()) {
4206 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
4207 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4208 Record[Idx++]));
4209 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
4210 getRawEncoding());
4211 }
4212 }
4213 break;
4214
4215 case PP_ASSUME_NONNULL_LOC: {
4216 unsigned Idx = 0;
4217 if (!Record.empty())
4218 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4219 ReadSourceLocation(F, Record, Idx));
4220 break;
4221 }
4222
4224 if (!Record.empty()) {
4225 SmallVector<SourceLocation, 64> SrcLocs;
4226 unsigned Idx = 0;
4227 while (Idx < Record.size())
4228 SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
4229 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4230 }
4231 break;
4232 }
4233
4235 if (!Record.empty()) {
4236 unsigned Idx = 0, End = Record.size() - 1;
4237 bool ReachedEOFWhileSkipping = Record[Idx++];
4238 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4239 if (ReachedEOFWhileSkipping) {
4240 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
4241 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
4242 bool FoundNonSkipPortion = Record[Idx++];
4243 bool FoundElse = Record[Idx++];
4244 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
4245 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4246 FoundElse, ElseLoc);
4247 }
4248 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4249 while (Idx < End) {
4250 auto Loc = ReadSourceLocation(F, Record, Idx);
4251 bool WasSkipping = Record[Idx++];
4252 bool FoundNonSkip = Record[Idx++];
4253 bool FoundElse = Record[Idx++];
4254 ConditionalStack.push_back(
4255 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4256 }
4257 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4258 }
4259 break;
4260
4261 case PP_COUNTER_VALUE:
4262 if (!Record.empty() && Listener)
4263 Listener->ReadCounter(F, Record[0]);
4264 break;
4265
4266 case FILE_SORTED_DECLS:
4267 F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
4269 break;
4270
4272 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
4274 SourceLocation::UIntTy SLocSpaceSize = Record[1];
4276 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
4277 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
4278 SLocSpaceSize);
4279 if (!F.SLocEntryBaseID) {
4280 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4281 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4282 return llvm::createStringError(std::errc::invalid_argument,
4283 "ran out of source locations");
4284 }
4285 // Make our entry in the range map. BaseID is negative and growing, so
4286 // we invert it. Because we invert it, though, we need the other end of
4287 // the range.
4288 unsigned RangeStart =
4289 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
4290 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4292
4293 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
4294 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
4295 GlobalSLocOffsetMap.insert(
4296 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
4297 - SLocSpaceSize,&F));
4298
4299 TotalNumSLocEntries += F.LocalNumSLocEntries;
4300 break;
4301 }
4302
4303 case MODULE_OFFSET_MAP:
4304 F.ModuleOffsetMap = Blob;
4305 break;
4306
4308 ParseLineTable(F, Record);
4309 break;
4310
4311 case EXT_VECTOR_DECLS:
4312 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4313 ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
4314 break;
4315
4316 case VTABLE_USES:
4317 if (Record.size() % 3 != 0)
4318 return llvm::createStringError(std::errc::illegal_byte_sequence,
4319 "Invalid VTABLE_USES record");
4320
4321 // Later tables overwrite earlier ones.
4322 // FIXME: Modules will have some trouble with this. This is clearly not
4323 // the right way to do this.
4324 VTableUses.clear();
4325
4326 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
4327 VTableUses.push_back(
4328 {ReadDeclID(F, Record, Idx),
4329 ReadSourceLocation(F, Record, Idx).getRawEncoding(),
4330 (bool)Record[Idx++]});
4331 }
4332 break;
4333
4335
4336 if (Record.size() % 2 != 0)
4337 return llvm::createStringError(
4338 std::errc::illegal_byte_sequence,
4339 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4340
4341 // For standard C++20 module, we will only reads the instantiations
4342 // if it is the main file.
4343 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
4344 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4345 PendingInstantiations.push_back(
4346 {ReadDeclID(F, Record, I),
4347 ReadSourceLocation(F, Record, I).getRawEncoding()});
4348 }
4349 }
4350 break;
4351
4352 case SEMA_DECL_REFS:
4353 if (Record.size() != 3)
4354 return llvm::createStringError(std::errc::illegal_byte_sequence,
4355 "Invalid SEMA_DECL_REFS block");
4356 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4357 SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
4358 break;
4359
4360 case PPD_ENTITIES_OFFSETS: {
4361 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
4362 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
4363 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
4364
4365 unsigned StartingID;
4366 if (!PP.getPreprocessingRecord())
4367 PP.createPreprocessingRecord();
4368 if (!PP.getPreprocessingRecord()->getExternalSource())
4369 PP.getPreprocessingRecord()->SetExternalSource(*this);
4370 StartingID
4371 = PP.getPreprocessingRecord()
4372 ->allocateLoadedEntities(F.NumPreprocessedEntities);
4373 F.BasePreprocessedEntityID = StartingID;
4374
4375 if (F.NumPreprocessedEntities > 0) {
4376 // Introduce the global -> local mapping for preprocessed entities in
4377 // this module.
4378 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4379 }
4380
4381 break;
4382 }
4383
4384 case PPD_SKIPPED_RANGES: {
4385 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
4386 assert(Blob.size() % sizeof(PPSkippedRange) == 0);
4387 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
4388
4389 if (!PP.getPreprocessingRecord())
4390 PP.createPreprocessingRecord();
4391 if (!PP.getPreprocessingRecord()->getExternalSource())
4392 PP.getPreprocessingRecord()->SetExternalSource(*this);
4393 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
4394 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
4395
4397 GlobalSkippedRangeMap.insert(
4398 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
4399 break;
4400 }
4401
4403 if (Record.size() % 2 != 0)
4404 return llvm::createStringError(
4405 std::errc::illegal_byte_sequence,
4406 "invalid DECL_UPDATE_OFFSETS block in AST file");
4407 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4408 GlobalDeclID ID = ReadDeclID(F, Record, I);
4409 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
4410
4411 // If we've already loaded the decl, perform the updates when we finish
4412 // loading this block.
4413 if (Decl *D = GetExistingDecl(ID))
4414 PendingUpdateRecords.push_back(
4415 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4416 }
4417 break;
4418
4420 if (Record.size() % 5 != 0)
4421 return llvm::createStringError(
4422 std::errc::illegal_byte_sequence,
4423 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4424 "file");
4425 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4426 GlobalDeclID ID = ReadDeclID(F, Record, I);
4427
4428 uint64_t BaseOffset = F.DeclsBlockStartOffset;
4429 assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
4430 uint64_t LocalLexicalOffset = Record[I++];
4431 uint64_t LexicalOffset =
4432 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4433 uint64_t LocalVisibleOffset = Record[I++];
4434 uint64_t VisibleOffset =
4435 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4436 uint64_t LocalModuleLocalOffset = Record[I++];
4437 uint64_t ModuleLocalOffset =
4438 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4439 uint64_t TULocalLocalOffset = Record[I++];
4440 uint64_t TULocalOffset =
4441 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4442
4443 DelayedNamespaceOffsetMap[ID] = {
4444 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4445
4446 assert(!GetExistingDecl(ID) &&
4447 "We shouldn't load the namespace in the front of delayed "
4448 "namespace lexical and visible block");
4449 }
4450 break;
4451 }
4452
4453 case RELATED_DECLS_MAP:
4454 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4455 GlobalDeclID ID = ReadDeclID(F, Record, I);
4456 auto &RelatedDecls = RelatedDeclsMap[ID];
4457 unsigned NN = Record[I++];
4458 RelatedDecls.reserve(NN);
4459 for (unsigned II = 0; II < NN; II++)
4460 RelatedDecls.push_back(ReadDeclID(F, Record, I));
4461 }
4462 break;
4463
4465 if (F.LocalNumObjCCategoriesInMap != 0)
4466 return llvm::createStringError(
4467 std::errc::illegal_byte_sequence,
4468 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4469
4471 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
4472 break;
4473
4474 case OBJC_CATEGORIES:
4475 F.ObjCCategories.swap(Record);
4476 break;
4477
4479 // Later tables overwrite earlier ones.
4480 // FIXME: Modules will have trouble with this.
4481 CUDASpecialDeclRefs.clear();
4482 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4483 CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
4484 break;
4485
4487 F.HeaderFileInfoTableData = Blob.data();
4489 if (Record[0]) {
4490 F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create(
4491 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
4492 (const unsigned char *)F.HeaderFileInfoTableData,
4493 HeaderFileInfoTrait(*this, F));
4494
4495 PP.getHeaderSearchInfo().SetExternalSource(this);
4496 if (!PP.getHeaderSearchInfo().getExternalLookup())
4497 PP.getHeaderSearchInfo().SetExternalLookup(this);
4498 }
4499 break;
4500
4501 case FP_PRAGMA_OPTIONS:
4502 // Later tables overwrite earlier ones.
4503 FPPragmaOptions.swap(Record);
4504 break;
4505
4507 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4508 DeclsWithEffectsToVerify.push_back(ReadDeclID(F, Record, I));
4509 break;
4510
4511 case OMP_REQUIRES_DECLS:
4512 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4513 OpenMPRequiresDecls.push_back(ReadDeclID(F, Record, I));
4514 break;
4515
4516 case OPENCL_EXTENSIONS:
4517 for (unsigned I = 0, E = Record.size(); I != E; ) {
4518 auto Name = ReadString(Record, I);
4519 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4520 OptInfo.Supported = Record[I++] != 0;
4521 OptInfo.Enabled = Record[I++] != 0;
4522 OptInfo.WithPragma = Record[I++] != 0;
4523 OptInfo.Avail = Record[I++];
4524 OptInfo.Core = Record[I++];
4525 OptInfo.Opt = Record[I++];
4526 }
4527 break;
4528
4530 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4531 TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
4532 break;
4533
4534 case KNOWN_NAMESPACES:
4535 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4536 KnownNamespaces.push_back(ReadDeclID(F, Record, I));
4537 break;
4538
4539 case UNDEFINED_BUT_USED:
4540 if (Record.size() % 2 != 0)
4541 return llvm::createStringError(std::errc::illegal_byte_sequence,
4542 "invalid undefined-but-used record");
4543 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4544 UndefinedButUsed.push_back(
4545 {ReadDeclID(F, Record, I),
4546 ReadSourceLocation(F, Record, I).getRawEncoding()});
4547 }
4548 break;
4549
4551 for (unsigned I = 0, N = Record.size(); I != N;) {
4552 DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
4553 const uint64_t Count = Record[I++];
4554 DelayedDeleteExprs.push_back(Count);
4555 for (uint64_t C = 0; C < Count; ++C) {
4556 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
4557 bool IsArrayForm = Record[I++] == 1;
4558 DelayedDeleteExprs.push_back(IsArrayForm);
4559 }
4560 }
4561 break;
4562
4563 case VTABLES_TO_EMIT:
4564 if (F.Kind == MK_MainFile ||
4565 getContext().getLangOpts().BuildingPCHWithObjectFile)
4566 for (unsigned I = 0, N = Record.size(); I != N;)
4567 VTablesToEmit.push_back(ReadDeclID(F, Record, I));
4568 break;
4569
4570 case IMPORTED_MODULES:
4571 if (!F.isModule()) {
4572 // If we aren't loading a module (which has its own exports), make
4573 // all of the imported modules visible.
4574 // FIXME: Deal with macros-only imports.
4575 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
4576 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
4577 SourceLocation Loc = ReadSourceLocation(F, Record, I);
4578 if (GlobalID) {
4579 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4580 if (DeserializationListener)
4581 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4582 }
4583 }
4584 }
4585 break;
4586
4587 case MACRO_OFFSET: {
4588 if (F.LocalNumMacros != 0)
4589 return llvm::createStringError(
4590 std::errc::illegal_byte_sequence,
4591 "duplicate MACRO_OFFSET record in AST file");
4592 F.MacroOffsets = (const uint32_t *)Blob.data();
4593 F.LocalNumMacros = Record[0];
4595 F.BaseMacroID = getTotalNumMacros();
4596
4597 if (F.LocalNumMacros > 0)
4598 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
4599 break;
4600 }
4601
4603 LateParsedTemplates.emplace_back(
4604 std::piecewise_construct, std::forward_as_tuple(&F),
4605 std::forward_as_tuple(Record.begin(), Record.end()));
4606 break;
4607
4609 if (Record.size() != 1)
4610 return llvm::createStringError(std::errc::illegal_byte_sequence,
4611 "invalid pragma optimize record");
4612 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
4613 break;
4614
4616 if (Record.size() != 1)
4617 return llvm::createStringError(std::errc::illegal_byte_sequence,
4618 "invalid pragma ms_struct record");
4619 PragmaMSStructState = Record[0];
4620 break;
4621
4623 if (Record.size() != 2)
4624 return llvm::createStringError(
4625 std::errc::illegal_byte_sequence,
4626 "invalid pragma pointers to members record");
4627 PragmaMSPointersToMembersState = Record[0];
4628 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4629 break;
4630
4632 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4633 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4634 break;
4635
4637 if (Record.size() != 1)
4638 return llvm::createStringError(std::errc::illegal_byte_sequence,
4639 "invalid cuda pragma options record");
4640 ForceHostDeviceDepth = Record[0];
4641 break;
4642
4644 if (Record.size() < 3)
4645 return llvm::createStringError(std::errc::illegal_byte_sequence,
4646 "invalid pragma pack record");
4647 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4648 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4649 unsigned NumStackEntries = Record[2];
4650 unsigned Idx = 3;
4651 // Reset the stack when importing a new module.
4652 PragmaAlignPackStack.clear();
4653 for (unsigned I = 0; I < NumStackEntries; ++I) {
4654 PragmaAlignPackStackEntry Entry;
4655 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4656 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4657 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4658 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4659 Entry.SlotLabel = PragmaAlignPackStrings.back();
4660 PragmaAlignPackStack.push_back(Entry);
4661 }
4662 break;
4663 }
4664
4666 if (Record.size() < 3)
4667 return llvm::createStringError(std::errc::illegal_byte_sequence,
4668 "invalid pragma float control record");
4669 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4670 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4671 unsigned NumStackEntries = Record[2];
4672 unsigned Idx = 3;
4673 // Reset the stack when importing a new module.
4674 FpPragmaStack.clear();
4675 for (unsigned I = 0; I < NumStackEntries; ++I) {
4676 FpPragmaStackEntry Entry;
4677 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4678 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4679 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4680 FpPragmaStrings.push_back(ReadString(Record, Idx));
4681 Entry.SlotLabel = FpPragmaStrings.back();
4682 FpPragmaStack.push_back(Entry);
4683 }
4684 break;
4685 }
4686
4688 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4689 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4690 break;
4691
4693 unsigned NumRecords = Record.front();
4694 // Last record which is used to keep number of valid records.
4695 if (Record.size() - 1 != NumRecords)
4696 return llvm::createStringError(std::errc::illegal_byte_sequence,
4697 "invalid rvv intrinsic pragma record");
4698
4699 if (RISCVVecIntrinsicPragma.empty())
4700 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4701 // There might be multiple precompiled modules imported, we need to union
4702 // them all.
4703 for (unsigned i = 0; i < NumRecords; ++i)
4704 RISCVVecIntrinsicPragma[i] |= Record[i + 1];
4705 break;
4706 }
4707 }
4708 }
4709}
4710
4711void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4712 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4713
4714 // Additional remapping information.
4715 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4716 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4717 F.ModuleOffsetMap = StringRef();
4718
4720 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4721 RemapBuilder SelectorRemap(F.SelectorRemap);
4722
4723 auto &ImportedModuleVector = F.TransitiveImports;
4724 assert(ImportedModuleVector.empty());
4725
4726 while (Data < DataEnd) {
4727 // FIXME: Looking up dependency modules by filename is horrible. Let's
4728 // start fixing this with prebuilt, explicit and implicit modules and see
4729 // how it goes...
4730 using namespace llvm::support;
4731 ModuleKind Kind = static_cast<ModuleKind>(
4732 endian::readNext<uint8_t, llvm::endianness::little>(Data));
4733 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4734 StringRef Name = StringRef((const char*)Data, Len);
4735 Data += Len;
4736 ModuleFile *OM =
4739 ? ModuleMgr.lookupByModuleName(Name)
4740 : ModuleMgr.lookupByFileName(ModuleFileName::makeExplicit(Name)));
4741 if (!OM)
4742 OM = ModuleMgr.lookupByFileName(ModuleFileName::makeInMemory(Name));
4743 if (!OM) {
4744 std::string Msg = "refers to unknown module, cannot find ";
4745 Msg.append(std::string(Name));
4746 Error(Msg);
4747 return;
4748 }
4749
4750 ImportedModuleVector.push_back(OM);
4751
4752 uint32_t SubmoduleIDOffset =
4753 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4754 uint32_t SelectorIDOffset =
4755 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4756
4757 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4758 RemapBuilder &Remap) {
4759 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4760 if (Offset != None)
4761 Remap.insert(std::make_pair(Offset,
4762 static_cast<int>(BaseOffset - Offset)));
4763 };
4764
4765 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4766 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4767 }
4768}
4769
4771ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4772 const ModuleFile *ImportedBy,
4773 unsigned ClientLoadCapabilities) {
4774 unsigned Idx = 0;
4775 F.ModuleMapPath = ReadPath(F, Record, Idx);
4776
4777 // Try to resolve ModuleName in the current header search context and
4778 // verify that it is found in the same module map file as we saved. If the
4779 // top-level AST file is a main file, skip this check because there is no
4780 // usable header search context.
4781 assert(!F.ModuleName.empty() &&
4782 "MODULE_NAME should come before MODULE_MAP_FILE");
4783 auto [MaybeM, IgnoreError] =
4784 getModuleForRelocationChecks(F, /*DirectoryCheck=*/false);
4785 if (MaybeM.has_value()) {
4786 // An implicitly-loaded module file should have its module listed in some
4787 // module map file that we've already loaded.
4788 Module *M = MaybeM.value();
4789 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4790 OptionalFileEntryRef ModMap =
4791 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4792 if (!IgnoreError && !ModMap) {
4793 if (M && M->Directory)
4794 Diag(diag::remark_module_relocated)
4795 << F.ModuleName << F.BaseDirectory << M->Directory->getName();
4796
4797 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4798 if (auto ASTFileName = M ? M->getASTFileName() : nullptr) {
4799 // This module was defined by an imported (explicit) module.
4800 Diag(diag::err_module_file_conflict)
4801 << F.ModuleName << F.FileName << *ASTFileName;
4802 // TODO: Add a note with the module map paths if they differ.
4803 } else {
4804 // This module was built with a different module map.
4805 Diag(diag::err_imported_module_not_found)
4806 << F.ModuleName << F.FileName
4807 << (ImportedBy ? ImportedBy->FileName.str() : "")
4808 << F.ModuleMapPath << !ImportedBy;
4809 // In case it was imported by a PCH, there's a chance the user is
4810 // just missing to include the search path to the directory containing
4811 // the modulemap.
4812 if (ImportedBy && ImportedBy->Kind == MK_PCH)
4813 Diag(diag::note_imported_by_pch_module_not_found)
4814 << llvm::sys::path::parent_path(F.ModuleMapPath);
4815 }
4816 }
4817 return OutOfDate;
4818 }
4819
4820 assert(M && M->Name == F.ModuleName && "found module with different name");
4821
4822 // Check the primary module map file.
4823 auto StoredModMap = FileMgr.getOptionalFileRef(F.ModuleMapPath);
4824 if (!StoredModMap || *StoredModMap != ModMap) {
4825 assert(ModMap && "found module is missing module map file");
4826 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4827 "top-level import should be verified");
4828 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4829 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4830 Diag(diag::err_imported_module_modmap_changed)
4831 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4832 << ModMap->getName() << F.ModuleMapPath << NotImported;
4833 return OutOfDate;
4834 }
4835
4836 ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4837 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4838 // FIXME: we should use input files rather than storing names.
4839 std::string Filename = ReadPath(F, Record, Idx);
4840 auto SF = FileMgr.getOptionalFileRef(Filename);
4841 if (!SF) {
4842 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4843 Error("could not find file '" + Filename +"' referenced by AST file");
4844 return OutOfDate;
4845 }
4846 AdditionalStoredMaps.insert(*SF);
4847 }
4848
4849 // Check any additional module map files (e.g. module.private.modulemap)
4850 // that are not in the pcm.
4851 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4852 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4853 // Remove files that match
4854 // Note: SmallPtrSet::erase is really remove
4855 if (!AdditionalStoredMaps.erase(ModMap)) {
4856 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4857 Diag(diag::err_module_different_modmap)
4858 << F.ModuleName << /*new*/0 << ModMap.getName();
4859 return OutOfDate;
4860 }
4861 }
4862 }
4863
4864 // Check any additional module map files that are in the pcm, but not
4865 // found in header search. Cases that match are already removed.
4866 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4867 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4868 Diag(diag::err_module_different_modmap)
4869 << F.ModuleName << /*not new*/1 << ModMap.getName();
4870 return OutOfDate;
4871 }
4872 }
4873
4874 if (Listener)
4875 Listener->ReadModuleMapFile(F.ModuleMapPath);
4876 return Success;
4877}
4878
4879void ASTReader::ReadDirectoryDependencies(const RecordData &Record,
4880 ModuleFile &F) {
4881 unsigned Idx = 0;
4882 unsigned N = Record[Idx++];
4883 F.DirectoryDependencies.reserve(N);
4884 for (unsigned I = 0; I != N; ++I)
4885 F.DirectoryDependencies.push_back(ReadPath(F, Record, Idx));
4886}
4887
4888bool ASTReader::isDirectoryDependencyOutOfDate(ModuleFile &F, bool Complain) {
4889 llvm::vfs::FileSystem &FS = PP.getFileManager().getVirtualFileSystem();
4890 // Adding or removing an entry updates the modification time of the directory
4891 // holding it, so comparing every directory in the tree against the module
4892 // file catches a header that was added, even one whose own modification time
4893 // is older. A directory that doesn't exist has no listing to depend on.
4894 auto IsNewer = [&](StringRef Dir) {
4895 llvm::ErrorOr<llvm::vfs::Status> Status = FS.status(Dir);
4896 return Status && Status->isDirectory() &&
4897 llvm::sys::toTimeT(Status->getLastModificationTime()) > F.ModTime;
4898 };
4899
4900 ModuleCache &ModCache = getModuleManager().getModuleCache();
4901 const HeaderSearchOptions &HSOpts =
4902 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4903 for (StringRef Dir : F.DirectoryDependencies) {
4904 if (std::optional<bool> Invalidated =
4905 ModCache.isDirectoryInvalidated(Dir)) {
4906 // The build system reports paths as changed before the build session
4907 // started, so a module built during it is newer than them.
4908 if (!*Invalidated ||
4909 static_cast<uint64_t>(F.ModTime) >= HSOpts.BuildSessionTimestamp)
4910 continue;
4911 Diag(diag::remark_module_path_invalidated) << F.ModuleName << Dir;
4912 if (Complain)
4913 Diag(diag::err_module_path_invalidated) << F.ModuleName << Dir;
4914 return true;
4915 }
4916
4917 std::optional<std::string> Changed;
4918 if (IsNewer(Dir)) {
4919 Changed = Dir.str();
4920 } else {
4921 std::error_code EC;
4922 for (llvm::vfs::recursive_directory_iterator I(FS, Dir, EC), E;
4923 I != E && !EC; I.increment(EC)) {
4924 if (I->type() == llvm::sys::fs::file_type::directory_file &&
4925 IsNewer(I->path())) {
4926 Changed = I->path().str();
4927 break;
4928 }
4929 }
4930 }
4931 if (!Changed)
4932 continue;
4933 Diag(diag::remark_module_directory_dep_changed) << F.ModuleName << *Changed;
4934 if (Complain)
4935 Diag(diag::err_module_directory_dep_changed) << F.ModuleName << *Changed;
4936 return true;
4937 }
4938 return false;
4939}
4940
4941/// Move the given method to the back of the global list of methods.
4943 // Find the entry for this selector in the method pool.
4944 SemaObjC::GlobalMethodPool::iterator Known =
4945 S.ObjC().MethodPool.find(Method->getSelector());
4946 if (Known == S.ObjC().MethodPool.end())
4947 return;
4948
4949 // Retrieve the appropriate method list.
4950 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4951 : Known->second.second;
4952 bool Found = false;
4953 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4954 if (!Found) {
4955 if (List->getMethod() == Method) {
4956 Found = true;
4957 } else {
4958 // Keep searching.
4959 continue;
4960 }
4961 }
4962
4963 if (List->getNext())
4964 List->setMethod(List->getNext()->getMethod());
4965 else
4966 List->setMethod(Method);
4967 }
4968}
4969
4970void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4971 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4972 for (Decl *D : Names) {
4973 bool wasHidden = !D->isUnconditionallyVisible();
4975
4976 if (wasHidden && SemaObj) {
4977 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4979 }
4980 }
4981 }
4982}
4983
4985 Module::NameVisibilityKind NameVisibility,
4986 SourceLocation ImportLoc) {
4989 Stack.push_back(Mod);
4990 while (!Stack.empty()) {
4991 Mod = Stack.pop_back_val();
4992
4993 if (NameVisibility <= Mod->NameVisibility) {
4994 // This module already has this level of visibility (or greater), so
4995 // there is nothing more to do.
4996 continue;
4997 }
4998
4999 if (Mod->isUnimportable()) {
5000 // Modules that aren't importable cannot be made visible.
5001 continue;
5002 }
5003
5004 // Update the module's name visibility.
5005 Mod->NameVisibility = NameVisibility;
5006
5007 // If we've already deserialized any names from this module,
5008 // mark them as visible.
5009 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
5010 if (Hidden != HiddenNamesMap.end()) {
5011 auto HiddenNames = std::move(*Hidden);
5012 HiddenNamesMap.erase(Hidden);
5013 makeNamesVisible(HiddenNames.second, HiddenNames.first);
5014 assert(!HiddenNamesMap.contains(Mod) &&
5015 "making names visible added hidden names");
5016 }
5017
5018 // Push any exported modules onto the stack to be marked as visible.
5020 Mod->getExportedModules(Exports);
5022 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
5023 Module *Exported = *I;
5024 if (Visited.insert(Exported).second)
5025 Stack.push_back(Exported);
5026 }
5027 }
5028}
5029
5030/// We've merged the definition \p MergedDef into the existing definition
5031/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
5032/// visible.
5034 NamedDecl *MergedDef) {
5035 if (!Def->isUnconditionallyVisible()) {
5036 // If MergedDef is visible or becomes visible, make the definition visible.
5037 if (MergedDef->isUnconditionallyVisible())
5039 else {
5040 getContext().mergeDefinitionIntoModule(
5041 Def, MergedDef->getImportedOwningModule(),
5042 /*NotifyListeners*/ false);
5043 PendingMergedDefinitionsToDeduplicate.insert(Def);
5044 }
5045 }
5046}
5047
5049 if (GlobalIndex)
5050 return false;
5051
5052 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
5053 !PP.getLangOpts().Modules)
5054 return true;
5055
5056 // Try to load the global index.
5057 TriedLoadingGlobalIndex = true;
5058 StringRef SpecificModuleCachePath =
5059 getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath();
5060 std::pair<GlobalModuleIndex *, llvm::Error> Result =
5061 GlobalModuleIndex::readIndex(SpecificModuleCachePath);
5062 if (llvm::Error Err = std::move(Result.second)) {
5063 assert(!Result.first);
5064 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5065 return true;
5066 }
5067
5068 GlobalIndex.reset(Result.first);
5069 ModuleMgr.setGlobalIndex(GlobalIndex.get());
5070 return false;
5071}
5072
5074 return PP.getLangOpts().Modules && UseGlobalIndex &&
5075 !hasGlobalIndex() && TriedLoadingGlobalIndex;
5076}
5077
5078/// Given a cursor at the start of an AST file, scan ahead and drop the
5079/// cursor into the start of the given block ID, returning false on success and
5080/// true on failure.
5081static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
5082 while (true) {
5083 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
5084 if (!MaybeEntry) {
5085 // FIXME this drops errors on the floor.
5086 consumeError(MaybeEntry.takeError());
5087 return true;
5088 }
5089 llvm::BitstreamEntry Entry = MaybeEntry.get();
5090
5091 switch (Entry.Kind) {
5092 case llvm::BitstreamEntry::Error:
5093 case llvm::BitstreamEntry::EndBlock:
5094 return true;
5095
5096 case llvm::BitstreamEntry::Record:
5097 // Ignore top-level records.
5098 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
5099 break;
5100 else {
5101 // FIXME this drops errors on the floor.
5102 consumeError(Skipped.takeError());
5103 return true;
5104 }
5105
5106 case llvm::BitstreamEntry::SubBlock:
5107 if (Entry.ID == BlockID) {
5108 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5109 // FIXME this drops the error on the floor.
5110 consumeError(std::move(Err));
5111 return true;
5112 }
5113 // Found it!
5114 return false;
5115 }
5116
5117 if (llvm::Error Err = Cursor.SkipBlock()) {
5118 // FIXME this drops the error on the floor.
5119 consumeError(std::move(Err));
5120 return true;
5121 }
5122 }
5123 }
5124}
5125
5128 SourceLocation ImportLoc,
5129 unsigned ClientLoadCapabilities,
5130 ModuleFile **NewLoadedModuleFile) {
5131 llvm::TimeTraceScope scope("ReadAST", FileName);
5132
5133 llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
5135 CurrentDeserializingModuleKind, Type);
5136
5137 // Defer any pending actions until we get to the end of reading the AST file.
5138 Deserializing AnASTFile(this);
5139
5140 // Bump the generation number.
5141 unsigned PreviousGeneration = 0;
5142 if (ContextObj)
5143 PreviousGeneration = incrementGeneration(*ContextObj);
5144
5145 unsigned NumModules = ModuleMgr.size();
5147 if (ASTReadResult ReadResult =
5148 ReadASTCore(FileName, Type, ImportLoc,
5149 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
5150 ClientLoadCapabilities)) {
5151 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5152
5153 // If we find that any modules are unusable, the global index is going
5154 // to be out-of-date. Just remove it.
5155 GlobalIndex.reset();
5156 ModuleMgr.setGlobalIndex(nullptr);
5157 return ReadResult;
5158 }
5159
5160 if (NewLoadedModuleFile && !Loaded.empty())
5161 *NewLoadedModuleFile = Loaded.back().Mod;
5162
5163 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
5164 // remove modules from this point. Various fields are updated during reading
5165 // the AST block and removing the modules would result in dangling pointers.
5166 // They are generally only incidentally dereferenced, ie. a binary search
5167 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
5168 // be dereferenced but it wouldn't actually be used.
5169
5170 // Load the AST blocks of all of the modules that we loaded. We can still
5171 // hit errors parsing the ASTs at this point.
5172 for (ImportedModule &M : Loaded) {
5173 ModuleFile &F = *M.Mod;
5174 llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
5175
5176 // Read the AST block.
5177 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5178 Error(std::move(Err));
5179 return Failure;
5180 }
5181
5182 // The AST block should always have a definition for the main module.
5183 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
5184 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
5185 return Failure;
5186 }
5187
5188 // Read the extension blocks.
5190 if (llvm::Error Err = ReadExtensionBlock(F)) {
5191 Error(std::move(Err));
5192 return Failure;
5193 }
5194 }
5195
5196 // Once read, set the ModuleFile bit base offset and update the size in
5197 // bits of all files we've seen.
5198 F.GlobalBitOffset = TotalModulesSizeInBits;
5199 TotalModulesSizeInBits += F.SizeInBits;
5200 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
5201 }
5202
5203 // Preload source locations and interesting indentifiers.
5204 for (ImportedModule &M : Loaded) {
5205 ModuleFile &F = *M.Mod;
5206
5207 // Map the original source file ID into the ID space of the current
5208 // compilation.
5211
5212 for (auto Offset : F.PreloadIdentifierOffsets) {
5213 const unsigned char *Data = F.IdentifierTableData + Offset;
5214
5215 ASTIdentifierLookupTrait Trait(*this, F);
5216 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
5217 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
5218
5219 IdentifierInfo *II;
5220 if (!PP.getLangOpts().CPlusPlus) {
5221 // Identifiers present in both the module file and the importing
5222 // instance are marked out-of-date so that they can be deserialized
5223 // on next use via ASTReader::updateOutOfDateIdentifier().
5224 // Identifiers present in the module file but not in the importing
5225 // instance are ignored for now, preventing growth of the identifier
5226 // table. They will be deserialized on first use via ASTReader::get().
5227 auto It = PP.getIdentifierTable().find(Key);
5228 if (It == PP.getIdentifierTable().end())
5229 continue;
5230 II = It->second;
5231 } else {
5232 // With C++ modules, not many identifiers are considered interesting.
5233 // All identifiers in the module file can be placed into the identifier
5234 // table of the importing instance and marked as out-of-date. This makes
5235 // ASTReader::get() a no-op, and deserialization will take place on
5236 // first/next use via ASTReader::updateOutOfDateIdentifier().
5237 II = &PP.getIdentifierTable().getOwn(Key);
5238 }
5239
5240 II->setOutOfDate(true);
5241
5242 // Mark this identifier as being from an AST file so that we can track
5243 // whether we need to serialize it.
5244 markIdentifierFromAST(*this, *II, /*IsModule=*/true);
5245
5246 // Associate the ID with the identifier so that the writer can reuse it.
5247 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
5248 SetIdentifierInfo(ID, II);
5249 }
5250 }
5251
5252 // Builtins and library builtins have already been initialized. Mark all
5253 // identifiers as out-of-date, so that they are deserialized on first use.
5254 if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
5255 for (auto &Id : PP.getIdentifierTable())
5256 Id.second->setOutOfDate(true);
5257
5258 // Mark selectors as out of date.
5259 for (const auto &Sel : SelectorGeneration)
5260 SelectorOutOfDate[Sel.first] = true;
5261
5262 // Setup the import locations and notify the module manager that we've
5263 // committed to these module files.
5264 for (ImportedModule &M : Loaded) {
5265 ModuleFile &F = *M.Mod;
5266
5267 ModuleMgr.moduleFileAccepted(&F);
5268
5269 // Set the import location.
5270 F.DirectImportLoc = ImportLoc;
5271 // FIXME: We assume that locations from PCH / preamble do not need
5272 // any translation.
5273 if (!M.ImportedBy)
5274 F.ImportLoc = M.ImportLoc;
5275 else
5276 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
5277 }
5278
5279 // FIXME: How do we load the 'use'd modules? They may not be submodules.
5280 // Might be unnecessary as use declarations are only used to build the
5281 // module itself.
5282
5283 if (ContextObj)
5285
5286 if (SemaObj)
5287 UpdateSema();
5288
5289 if (DeserializationListener)
5290 DeserializationListener->ReaderInitialized(this);
5291
5292 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5293 if (PrimaryModule.OriginalSourceFileID.isValid()) {
5294 // If this AST file is a precompiled preamble, then set the
5295 // preamble file ID of the source manager to the file source file
5296 // from which the preamble was built.
5297 if (Type == MK_Preamble) {
5298 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
5299 } else if (Type == MK_MainFile) {
5300 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
5301 }
5302 }
5303
5304 // For any Objective-C class definitions we have already loaded, make sure
5305 // that we load any additional categories.
5306 if (ContextObj) {
5307 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5308 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5309 ObjCClassesLoaded[I], PreviousGeneration);
5310 }
5311 }
5312
5313 const HeaderSearchOptions &HSOpts =
5314 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5316 // Now we are certain that the module and all modules it depends on are
5317 // up-to-date. For implicitly-built module files, ensure the corresponding
5318 // timestamp files are up-to-date in this build session.
5319 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5320 ImportedModule &M = Loaded[I];
5321 if (M.Mod->Kind == MK_ImplicitModule &&
5323 getModuleManager().getModuleCache().updateModuleTimestamp(
5324 M.Mod->FileName);
5325 }
5326 }
5327
5328 return Success;
5329}
5330
5331static ASTFileSignature readASTFileSignature(StringRef PCH);
5332
5333/// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
5334static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
5335 // FIXME checking magic headers is done in other places such as
5336 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
5337 // always done the same. Unify it all with a helper.
5338 if (!Stream.canSkipToPos(4))
5339 return llvm::createStringError(
5340 std::errc::illegal_byte_sequence,
5341 "file too small to contain precompiled file magic");
5342 for (unsigned C : {'C', 'P', 'C', 'H'})
5343 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
5344 if (Res.get() != C)
5345 return llvm::createStringError(
5346 std::errc::illegal_byte_sequence,
5347 "file doesn't start with precompiled file magic");
5348 } else
5349 return Res.takeError();
5350 return llvm::Error::success();
5351}
5352
5354 switch (Kind) {
5355 case MK_PCH:
5356 return 0; // PCH
5357 case MK_ImplicitModule:
5358 case MK_ExplicitModule:
5359 case MK_PrebuiltModule:
5360 return 1; // module
5361 case MK_MainFile:
5362 case MK_Preamble:
5363 return 2; // main source file
5364 }
5365 llvm_unreachable("unknown module kind");
5366}
5367
5370 ModuleFile *ImportedBy, SmallVectorImpl<ImportedModule> &Loaded,
5371 off_t ExpectedSize, time_t ExpectedModTime,
5372 ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities) {
5373 auto Result = ModuleMgr.addModule(
5374 FileName, Type, ImportLoc, ImportedBy, getGeneration(), ExpectedSize,
5375 ExpectedModTime, ExpectedSignature, readASTFileSignature);
5376 ModuleFile *M = Result.getModule();
5377
5378 switch (Result.getKind()) {
5380 Diag(diag::remark_module_import)
5381 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5382 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5383 return Success;
5384 }
5385
5387 // Load module file below.
5388 break;
5389
5391 // The module file was missing; if the client can handle that, return
5392 // it.
5393 if (ClientLoadCapabilities & ARR_Missing)
5394 return Missing;
5395
5396 // Otherwise, return an error.
5397 Diag(diag::err_ast_file_not_found)
5399 if (!Result.getBufferError().empty())
5400 Diag(diag::note_ast_file_buffer_failed) << Result.getBufferError();
5401 return Failure;
5402
5404 // We couldn't load the module file because it is out-of-date. If the
5405 // client can handle out-of-date, return it.
5406 if (ClientLoadCapabilities & ARR_OutOfDate)
5407 return OutOfDate;
5408
5409 // Otherwise, return an error.
5410 Diag(diag::err_ast_file_out_of_date)
5412 for (const auto &C : Result.getChanges()) {
5413 Diag(diag::note_fe_ast_file_modified)
5414 << C.Kind << (C.Old && C.New) << llvm::itostr(C.Old.value_or(0))
5415 << llvm::itostr(C.New.value_or(0));
5416 }
5417 Diag(diag::note_ast_file_input_files_validation_status)
5418 << Result.getValidationStatus();
5419 if (!Result.getSignatureError().empty())
5420 Diag(diag::note_ast_file_signature_failed) << Result.getSignatureError();
5421 return Failure;
5422
5424 llvm_unreachable("Unexpected value from adding module.");
5425 }
5426
5427 assert(M && "Missing module file");
5428
5429 bool ShouldFinalizePCM = false;
5430 llvm::scope_exit FinalizeOrDropPCM([&]() {
5431 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5432 if (ShouldFinalizePCM)
5433 MC.finalizePCM(FileName);
5434 else
5435 MC.tryToDropPCM(FileName);
5436 });
5437 ModuleFile &F = *M;
5438 BitstreamCursor &Stream = F.Stream;
5439 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5440 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5441
5442 // Sniff for the signature.
5443 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5444 Diag(diag::err_ast_file_invalid)
5445 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5446 return Failure;
5447 }
5448
5449 // This is used for compatibility with older PCH formats.
5450 bool HaveReadControlBlock = false;
5451 while (true) {
5452 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5453 if (!MaybeEntry) {
5454 Error(MaybeEntry.takeError());
5455 return Failure;
5456 }
5457 llvm::BitstreamEntry Entry = MaybeEntry.get();
5458
5459 switch (Entry.Kind) {
5460 case llvm::BitstreamEntry::Error:
5461 case llvm::BitstreamEntry::Record:
5462 case llvm::BitstreamEntry::EndBlock:
5463 Error("invalid record at top-level of AST file");
5464 return Failure;
5465
5466 case llvm::BitstreamEntry::SubBlock:
5467 break;
5468 }
5469
5470 switch (Entry.ID) {
5471 case CONTROL_BLOCK_ID:
5472 HaveReadControlBlock = true;
5473 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5474 case Success:
5475 // Check that we didn't try to load a non-module AST file as a module.
5476 //
5477 // FIXME: Should we also perform the converse check? Loading a module as
5478 // a PCH file sort of works, but it's a bit wonky.
5480 Type == MK_PrebuiltModule) &&
5481 F.ModuleName.empty()) {
5483 if (Result != OutOfDate ||
5484 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5485 Diag(diag::err_module_file_not_module) << FileName;
5486 return Result;
5487 }
5488 break;
5489
5490 case Failure: return Failure;
5491 case Missing: return Missing;
5492 case OutOfDate: return OutOfDate;
5493 case VersionMismatch: return VersionMismatch;
5495 case HadErrors: return HadErrors;
5496 }
5497 break;
5498
5499 case AST_BLOCK_ID:
5500 if (!HaveReadControlBlock) {
5501 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5502 Diag(diag::err_ast_file_version_too_old)
5504 return VersionMismatch;
5505 }
5506
5507 // Record that we've loaded this module.
5508 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5509 ShouldFinalizePCM = true;
5510 return Success;
5511
5512 default:
5513 if (llvm::Error Err = Stream.SkipBlock()) {
5514 Error(std::move(Err));
5515 return Failure;
5516 }
5517 break;
5518 }
5519 }
5520
5521 llvm_unreachable("unexpected break; expected return");
5522}
5523
5525ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5526 unsigned ClientLoadCapabilities) {
5527 const HeaderSearchOptions &HSOpts =
5528 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5529 bool AllowCompatibleConfigurationMismatch =
5531 bool DisableValidation = shouldDisableValidationForFile(F);
5532
5533 ASTReadResult Result = readUnhashedControlBlockImpl(
5534 &F, F.Data, F.FileName, ClientLoadCapabilities,
5535 AllowCompatibleConfigurationMismatch, Listener.get(),
5536 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5537
5538 // If F was directly imported by another module, it's implicitly validated by
5539 // the importing module.
5540 if (DisableValidation || WasImportedBy ||
5541 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5542 return Success;
5543
5544 if (Result == Failure) {
5545 Error("malformed block record in AST file");
5546 return Failure;
5547 }
5548
5549 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5550 // If this module has already been finalized in the ModuleCache, we're stuck
5551 // with it; we can only load a single version of each module.
5552 //
5553 // This can happen when a module is imported in two contexts: in one, as a
5554 // user module; in another, as a system module (due to an import from
5555 // another module marked with the [system] flag). It usually indicates a
5556 // bug in the module map: this module should also be marked with [system].
5557 //
5558 // If -Wno-system-headers (the default), and the first import is as a
5559 // system module, then validation will fail during the as-user import,
5560 // since -Werror flags won't have been validated. However, it's reasonable
5561 // to treat this consistently as a system module.
5562 //
5563 // If -Wsystem-headers, the PCM on disk was built with
5564 // -Wno-system-headers, and the first import is as a user module, then
5565 // validation will fail during the as-system import since the PCM on disk
5566 // doesn't guarantee that -Werror was respected. However, the -Werror
5567 // flags were checked during the initial as-user import.
5568 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5569 F.FileName)) {
5570 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5571 return Success;
5572 }
5573 }
5574
5575 return Result;
5576}
5577
5578ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5579 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5580 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5581 ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5582 // Initialize a stream.
5583 BitstreamCursor Stream(StreamData);
5584
5585 // Sniff for the signature.
5586 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5587 // FIXME this drops the error on the floor.
5588 consumeError(std::move(Err));
5589 return Failure;
5590 }
5591
5592 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5594 return Failure;
5595
5596 // Read all of the records in the options block.
5597 RecordData Record;
5598 ASTReadResult Result = Success;
5599 while (true) {
5600 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5601 if (!MaybeEntry) {
5602 // FIXME this drops the error on the floor.
5603 consumeError(MaybeEntry.takeError());
5604 return Failure;
5605 }
5606 llvm::BitstreamEntry Entry = MaybeEntry.get();
5607
5608 switch (Entry.Kind) {
5609 case llvm::BitstreamEntry::Error:
5610 case llvm::BitstreamEntry::SubBlock:
5611 return Failure;
5612
5613 case llvm::BitstreamEntry::EndBlock:
5614 return Result;
5615
5616 case llvm::BitstreamEntry::Record:
5617 // The interesting case.
5618 break;
5619 }
5620
5621 // Read and process a record.
5622 Record.clear();
5623 StringRef Blob;
5624 Expected<unsigned> MaybeRecordType =
5625 Stream.readRecord(Entry.ID, Record, &Blob);
5626 if (!MaybeRecordType) {
5627 // FIXME this drops the error.
5628 return Failure;
5629 }
5630 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5631 case SIGNATURE:
5632 if (F) {
5633 F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5635 "Dummy AST file signature not backpatched in ASTWriter.");
5636 }
5637 break;
5638 case AST_BLOCK_HASH:
5639 if (F) {
5640 F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5642 "Dummy AST block hash not backpatched in ASTWriter.");
5643 }
5644 break;
5645 case DIAGNOSTIC_OPTIONS: {
5646 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5647 if (Listener && ValidateDiagnosticOptions &&
5648 !AllowCompatibleConfigurationMismatch &&
5649 ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5650 Result = OutOfDate; // Don't return early. Read the signature.
5651 break;
5652 }
5653 case HEADER_SEARCH_PATHS: {
5654 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5655 if (Listener && !AllowCompatibleConfigurationMismatch &&
5656 ParseHeaderSearchPaths(Record, Complain, *Listener))
5657 Result = ConfigurationMismatch;
5658 break;
5659 }
5661 if (!F)
5662 break;
5663 if (F->PragmaDiagMappings.empty())
5664 F->PragmaDiagMappings.swap(Record);
5665 else
5666 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5667 Record.begin(), Record.end());
5668 break;
5670 if (F)
5671 F->SearchPathUsage = ReadBitVector(Record, Blob);
5672 break;
5673 case VFS_USAGE:
5674 if (F)
5675 F->VFSUsage = ReadBitVector(Record, Blob);
5676 break;
5677 }
5678 }
5679}
5680
5681/// Parse a record and blob containing module file extension metadata.
5684 StringRef Blob,
5685 ModuleFileExtensionMetadata &Metadata) {
5686 if (Record.size() < 4) return true;
5687
5688 Metadata.MajorVersion = Record[0];
5689 Metadata.MinorVersion = Record[1];
5690
5691 unsigned BlockNameLen = Record[2];
5692 unsigned UserInfoLen = Record[3];
5693
5694 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5695
5696 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5697 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5698 Blob.data() + BlockNameLen + UserInfoLen);
5699 return false;
5700}
5701
5702llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5703 BitstreamCursor &Stream = F.Stream;
5704
5705 RecordData Record;
5706 while (true) {
5707 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5708 if (!MaybeEntry)
5709 return MaybeEntry.takeError();
5710 llvm::BitstreamEntry Entry = MaybeEntry.get();
5711
5712 switch (Entry.Kind) {
5713 case llvm::BitstreamEntry::SubBlock:
5714 if (llvm::Error Err = Stream.SkipBlock())
5715 return Err;
5716 continue;
5717 case llvm::BitstreamEntry::EndBlock:
5718 return llvm::Error::success();
5719 case llvm::BitstreamEntry::Error:
5720 return llvm::createStringError(std::errc::illegal_byte_sequence,
5721 "malformed block record in AST file");
5722 case llvm::BitstreamEntry::Record:
5723 break;
5724 }
5725
5726 Record.clear();
5727 StringRef Blob;
5728 Expected<unsigned> MaybeRecCode =
5729 Stream.readRecord(Entry.ID, Record, &Blob);
5730 if (!MaybeRecCode)
5731 return MaybeRecCode.takeError();
5732 switch (MaybeRecCode.get()) {
5733 case EXTENSION_METADATA: {
5734 ModuleFileExtensionMetadata Metadata;
5735 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5736 return llvm::createStringError(
5737 std::errc::illegal_byte_sequence,
5738 "malformed EXTENSION_METADATA in AST file");
5739
5740 // Find a module file extension with this block name.
5741 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5742 if (Known == ModuleFileExtensions.end()) break;
5743
5744 // Form a reader.
5745 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5746 F, Stream)) {
5747 F.ExtensionReaders.push_back(std::move(Reader));
5748 }
5749
5750 break;
5751 }
5752 }
5753 }
5754
5755 llvm_unreachable("ReadExtensionBlock should return from while loop");
5756}
5757
5759 assert(ContextObj && "no context to initialize");
5760 ASTContext &Context = *ContextObj;
5761
5762 // If there's a listener, notify them that we "read" the translation unit.
5763 if (DeserializationListener)
5764 DeserializationListener->DeclRead(
5766 Context.getTranslationUnitDecl());
5767
5768 // FIXME: Find a better way to deal with collisions between these
5769 // built-in types. Right now, we just ignore the problem.
5770
5771 // Load the special types.
5772 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5773 if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5774 if (!Context.CFConstantStringTypeDecl)
5775 Context.setCFConstantStringType(GetType(String));
5776 }
5777
5778 if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5779 QualType FileType = GetType(File);
5780 if (FileType.isNull()) {
5781 Error("FILE type is NULL");
5782 return;
5783 }
5784
5785 if (!Context.FILEDecl) {
5786 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5787 Context.setFILEDecl(Typedef->getDecl());
5788 else {
5789 const TagType *Tag = FileType->getAs<TagType>();
5790 if (!Tag) {
5791 Error("Invalid FILE type in AST file");
5792 return;
5793 }
5794 Context.setFILEDecl(Tag->getDecl());
5795 }
5796 }
5797 }
5798
5799 if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5800 QualType Jmp_bufType = GetType(Jmp_buf);
5801 if (Jmp_bufType.isNull()) {
5802 Error("jmp_buf type is NULL");
5803 return;
5804 }
5805
5806 if (!Context.jmp_bufDecl) {
5807 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5808 Context.setjmp_bufDecl(Typedef->getDecl());
5809 else {
5810 const TagType *Tag = Jmp_bufType->getAs<TagType>();
5811 if (!Tag) {
5812 Error("Invalid jmp_buf type in AST file");
5813 return;
5814 }
5815 Context.setjmp_bufDecl(Tag->getDecl());
5816 }
5817 }
5818 }
5819
5820 if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5821 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5822 if (Sigjmp_bufType.isNull()) {
5823 Error("sigjmp_buf type is NULL");
5824 return;
5825 }
5826
5827 if (!Context.sigjmp_bufDecl) {
5828 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5829 Context.setsigjmp_bufDecl(Typedef->getDecl());
5830 else {
5831 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5832 assert(Tag && "Invalid sigjmp_buf type in AST file");
5833 Context.setsigjmp_bufDecl(Tag->getDecl());
5834 }
5835 }
5836 }
5837
5838 if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5839 if (Context.ObjCIdRedefinitionType.isNull())
5840 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5841 }
5842
5843 if (TypeID ObjCClassRedef =
5845 if (Context.ObjCClassRedefinitionType.isNull())
5846 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5847 }
5848
5849 if (TypeID ObjCSelRedef =
5850 SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5851 if (Context.ObjCSelRedefinitionType.isNull())
5852 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5853 }
5854
5855 if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5856 QualType Ucontext_tType = GetType(Ucontext_t);
5857 if (Ucontext_tType.isNull()) {
5858 Error("ucontext_t type is NULL");
5859 return;
5860 }
5861
5862 if (!Context.ucontext_tDecl) {
5863 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5864 Context.setucontext_tDecl(Typedef->getDecl());
5865 else {
5866 const TagType *Tag = Ucontext_tType->getAs<TagType>();
5867 assert(Tag && "Invalid ucontext_t type in AST file");
5868 Context.setucontext_tDecl(Tag->getDecl());
5869 }
5870 }
5871 }
5872 }
5873
5874 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5875
5876 // If there were any CUDA special declarations, deserialize them.
5877 if (!CUDASpecialDeclRefs.empty()) {
5878 assert(CUDASpecialDeclRefs.size() == 3 && "More decl refs than expected!");
5879 Context.setcudaConfigureCallDecl(
5880 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5881 Context.setcudaGetParameterBufferDecl(
5882 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[1])));
5883 Context.setcudaLaunchDeviceDecl(
5884 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[2])));
5885 }
5886
5887 // Re-export any modules that were imported by a non-module AST file.
5888 // FIXME: This does not make macro-only imports visible again.
5889 for (auto &Import : PendingImportedModules) {
5890 if (Module *Imported = getSubmodule(Import.ID)) {
5892 /*ImportLoc=*/Import.ImportLoc);
5893 if (Import.ImportLoc.isValid())
5894 PP.makeModuleVisible(Imported, Import.ImportLoc);
5895 // This updates visibility for Preprocessor only. For Sema, which can be
5896 // nullptr here, we do the same later, in UpdateSema().
5897 }
5898 }
5899
5900 // Hand off these modules to Sema.
5901 PendingImportedModulesSema.append(PendingImportedModules);
5902 PendingImportedModules.clear();
5903}
5904
5906 // Nothing to do for now.
5907}
5908
5909/// Reads and return the signature record from \p PCH's control block, or
5910/// else returns 0.
5912 BitstreamCursor Stream(PCH);
5913 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5914 // FIXME this drops the error on the floor.
5915 consumeError(std::move(Err));
5916 return ASTFileSignature();
5917 }
5918
5919 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5921 return ASTFileSignature();
5922
5923 // Scan for SIGNATURE inside the diagnostic options block.
5925 while (true) {
5927 Stream.advanceSkippingSubblocks();
5928 if (!MaybeEntry) {
5929 // FIXME this drops the error on the floor.
5930 consumeError(MaybeEntry.takeError());
5931 return ASTFileSignature();
5932 }
5933 llvm::BitstreamEntry Entry = MaybeEntry.get();
5934
5935 if (Entry.Kind != llvm::BitstreamEntry::Record)
5936 return ASTFileSignature();
5937
5938 Record.clear();
5939 StringRef Blob;
5940 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5941 if (!MaybeRecord) {
5942 // FIXME this drops the error on the floor.
5943 consumeError(MaybeRecord.takeError());
5944 return ASTFileSignature();
5945 }
5946 if (SIGNATURE == MaybeRecord.get()) {
5947 auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5948 assert(Signature != ASTFileSignature::createDummy() &&
5949 "Dummy AST file signature not backpatched in ASTWriter.");
5950 return Signature;
5951 }
5952 }
5953}
5954
5955/// Retrieve the name of the original source file name
5956/// directly from the AST file, without actually loading the AST
5957/// file.
5959 const std::string &ASTFileName, FileManager &FileMgr,
5960 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5961 // Open the AST file.
5962 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5963 /*RequiresNullTerminator=*/false,
5964 /*MaybeLimit=*/std::nullopt,
5965 /*IsText=*/false);
5966 if (!Buffer) {
5967 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5968 << ASTFileName << Buffer.getError().message();
5969 return std::string();
5970 }
5971
5972 // Initialize the stream
5973 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5974
5975 // Sniff for the signature.
5976 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5977 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5978 return std::string();
5979 }
5980
5981 // Scan for the CONTROL_BLOCK_ID block.
5982 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5983 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5984 return std::string();
5985 }
5986
5987 // Scan for ORIGINAL_FILE inside the control block.
5989 while (true) {
5991 Stream.advanceSkippingSubblocks();
5992 if (!MaybeEntry) {
5993 // FIXME this drops errors on the floor.
5994 consumeError(MaybeEntry.takeError());
5995 return std::string();
5996 }
5997 llvm::BitstreamEntry Entry = MaybeEntry.get();
5998
5999 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
6000 return std::string();
6001
6002 if (Entry.Kind != llvm::BitstreamEntry::Record) {
6003 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
6004 return std::string();
6005 }
6006
6007 Record.clear();
6008 StringRef Blob;
6009 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
6010 if (!MaybeRecord) {
6011 // FIXME this drops the errors on the floor.
6012 consumeError(MaybeRecord.takeError());
6013 return std::string();
6014 }
6015 if (ORIGINAL_FILE == MaybeRecord.get())
6016 return Blob.str();
6017 }
6018}
6019
6020namespace {
6021
6022 class SimplePCHValidator : public ASTReaderListener {
6023 const LangOptions &ExistingLangOpts;
6024 const CodeGenOptions &ExistingCGOpts;
6025 const TargetOptions &ExistingTargetOpts;
6026 const PreprocessorOptions &ExistingPPOpts;
6027 const HeaderSearchOptions &ExistingHSOpts;
6028 std::string ExistingSpecificModuleCachePath;
6030 bool StrictOptionMatches;
6031
6032 public:
6033 SimplePCHValidator(const LangOptions &ExistingLangOpts,
6034 const CodeGenOptions &ExistingCGOpts,
6035 const TargetOptions &ExistingTargetOpts,
6036 const PreprocessorOptions &ExistingPPOpts,
6037 const HeaderSearchOptions &ExistingHSOpts,
6038 StringRef ExistingSpecificModuleCachePath,
6039 FileManager &FileMgr, bool StrictOptionMatches)
6040 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
6041 ExistingTargetOpts(ExistingTargetOpts),
6042 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
6043 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
6044 FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {}
6045
6046 bool ReadLanguageOptions(const LangOptions &LangOpts,
6047 StringRef ModuleFilename, bool Complain,
6048 bool AllowCompatibleDifferences) override {
6049 return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
6050 nullptr, AllowCompatibleDifferences);
6051 }
6052
6053 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
6054 StringRef ModuleFilename, bool Complain,
6055 bool AllowCompatibleDifferences) override {
6056 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
6057 nullptr, AllowCompatibleDifferences);
6058 }
6059
6060 bool ReadTargetOptions(const TargetOptions &TargetOpts,
6061 StringRef ModuleFilename, bool Complain,
6062 bool AllowCompatibleDifferences) override {
6063 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
6064 nullptr, AllowCompatibleDifferences);
6065 }
6066
6067 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
6068 StringRef ASTFilename, StringRef ContextHash,
6069 bool Complain) override {
6070 return checkModuleCachePath(
6071 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
6072 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
6073 }
6074
6075 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
6076 StringRef ModuleFilename, bool ReadMacros,
6077 bool Complain,
6078 std::string &SuggestedPredefines) override {
6080 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
6081 FileMgr, SuggestedPredefines, ExistingLangOpts,
6082 StrictOptionMatches ? OptionValidateStrictMatches
6084 }
6085 };
6086
6087} // namespace
6088
6090 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6091 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
6092 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
6093 unsigned ClientLoadCapabilities) {
6094 // Open the AST file.
6095 off_t Size;
6096 time_t ModTime;
6097 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
6098 llvm::MemoryBuffer *Buffer =
6099 ModCache.getInMemoryModuleCache().lookupPCM(Filename, Size, ModTime);
6100 if (!Buffer) {
6101 // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
6102 // read again later, but we do not have the context here to determine if it
6103 // is safe to change the result of InMemoryModuleCache::getPCMState().
6104
6105 // FIXME: This allows use of the VFS; we do not allow use of the
6106 // VFS when actually loading a module.
6107 auto Entry = Filename == "-" ? FileMgr.getSTDIN()
6108 : FileMgr.getFileRef(Filename,
6109 /*OpenFile=*/false,
6110 /*CacheFailure=*/true,
6111 /*IsText=*/false);
6112 if (!Entry) {
6113 llvm::consumeError(Entry.takeError());
6114 return true;
6115 }
6116 auto BufferOrErr =
6117 FileMgr.getBufferForFile(*Entry,
6118 /*IsVolatile=*/false,
6119 /*RequiresNullTerminator=*/false,
6120 /*MaybeLimit=*/std::nullopt,
6121 /*IsText=*/false);
6122 if (!BufferOrErr)
6123 return true;
6124 OwnedBuffer = std::move(*BufferOrErr);
6125 Buffer = OwnedBuffer.get();
6126 }
6127
6128 // Initialize the stream
6129 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6130 BitstreamCursor Stream(Bytes);
6131
6132 // Sniff for the signature.
6133 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
6134 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
6135 return true;
6136 }
6137
6138 // Scan for the CONTROL_BLOCK_ID block.
6140 return true;
6141
6142 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6143 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6144 bool NeedsImports = Listener.needsImportVisitation();
6145 BitstreamCursor InputFilesCursor;
6146 uint64_t InputFilesOffsetBase = 0;
6147
6149 std::string ModuleDir;
6150 bool DoneWithControlBlock = false;
6151 SmallString<0> PathBuf;
6152 PathBuf.reserve(256);
6153 // Additional path buffer to use when multiple paths need to be resolved.
6154 // For example, when deserializing input files that contains a path that was
6155 // resolved from a vfs overlay and an external location.
6156 SmallString<0> AdditionalPathBuf;
6157 AdditionalPathBuf.reserve(256);
6158 while (!DoneWithControlBlock) {
6159 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6160 if (!MaybeEntry) {
6161 // FIXME this drops the error on the floor.
6162 consumeError(MaybeEntry.takeError());
6163 return true;
6164 }
6165 llvm::BitstreamEntry Entry = MaybeEntry.get();
6166
6167 switch (Entry.Kind) {
6168 case llvm::BitstreamEntry::SubBlock: {
6169 switch (Entry.ID) {
6170 case OPTIONS_BLOCK_ID: {
6171 std::string IgnoredSuggestedPredefines;
6172 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6173 /*AllowCompatibleConfigurationMismatch*/ false,
6174 Listener, IgnoredSuggestedPredefines) != Success)
6175 return true;
6176 break;
6177 }
6178
6180 InputFilesCursor = Stream;
6181 if (llvm::Error Err = Stream.SkipBlock()) {
6182 // FIXME this drops the error on the floor.
6183 consumeError(std::move(Err));
6184 return true;
6185 }
6186 if (NeedsInputFiles &&
6187 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
6188 return true;
6189 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6190 break;
6191
6192 default:
6193 if (llvm::Error Err = Stream.SkipBlock()) {
6194 // FIXME this drops the error on the floor.
6195 consumeError(std::move(Err));
6196 return true;
6197 }
6198 break;
6199 }
6200
6201 continue;
6202 }
6203
6204 case llvm::BitstreamEntry::EndBlock:
6205 DoneWithControlBlock = true;
6206 break;
6207
6208 case llvm::BitstreamEntry::Error:
6209 return true;
6210
6211 case llvm::BitstreamEntry::Record:
6212 break;
6213 }
6214
6215 if (DoneWithControlBlock) break;
6216
6217 Record.clear();
6218 StringRef Blob;
6219 Expected<unsigned> MaybeRecCode =
6220 Stream.readRecord(Entry.ID, Record, &Blob);
6221 if (!MaybeRecCode) {
6222 // FIXME this drops the error.
6223 return Failure;
6224 }
6225 switch ((ControlRecordTypes)MaybeRecCode.get()) {
6226 case METADATA:
6227 if (Record[0] != VERSION_MAJOR)
6228 return true;
6229 if (Listener.ReadFullVersionInformation(Blob))
6230 return true;
6231 break;
6232 case MODULE_NAME:
6233 Listener.ReadModuleName(Blob);
6234 break;
6235 case MODULE_DIRECTORY:
6236 ModuleDir = std::string(Blob);
6237 break;
6238 case MODULE_MAP_FILE: {
6239 unsigned Idx = 0;
6240 std::string PathStr = ReadString(Record, Idx);
6241 auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
6242 Listener.ReadModuleMapFile(*Path);
6243 break;
6244 }
6245 case INPUT_FILE_OFFSETS: {
6246 if (!NeedsInputFiles)
6247 break;
6248
6249 unsigned NumInputFiles = Record[0];
6250 unsigned NumUserFiles = Record[1];
6251 const llvm::support::unaligned_uint64_t *InputFileOffs =
6252 (const llvm::support::unaligned_uint64_t *)Blob.data();
6253 for (unsigned I = 0; I != NumInputFiles; ++I) {
6254 // Go find this input file.
6255 bool isSystemFile = I >= NumUserFiles;
6256
6257 if (isSystemFile && !NeedsSystemInputFiles)
6258 break; // the rest are system input files
6259
6260 BitstreamCursor &Cursor = InputFilesCursor;
6261 SavedStreamPosition SavedPosition(Cursor);
6262 if (llvm::Error Err =
6263 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6264 // FIXME this drops errors on the floor.
6265 consumeError(std::move(Err));
6266 }
6267
6268 Expected<unsigned> MaybeCode = Cursor.ReadCode();
6269 if (!MaybeCode) {
6270 // FIXME this drops errors on the floor.
6271 consumeError(MaybeCode.takeError());
6272 }
6273 unsigned Code = MaybeCode.get();
6274
6276 StringRef Blob;
6277 bool shouldContinue = false;
6278 Expected<unsigned> MaybeRecordType =
6279 Cursor.readRecord(Code, Record, &Blob);
6280 if (!MaybeRecordType) {
6281 // FIXME this drops errors on the floor.
6282 consumeError(MaybeRecordType.takeError());
6283 }
6284 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
6285 case INPUT_FILE_HASH:
6286 break;
6287 case INPUT_FILE:
6288 time_t StoredTime = static_cast<time_t>(Record[2]);
6289 bool Overridden = static_cast<bool>(Record[3]);
6290 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6292 auto FilenameAsRequestedBuf = ResolveImportedPath(
6293 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6294 StringRef Filename;
6295 if (UnresolvedFilename.empty())
6296 Filename = *FilenameAsRequestedBuf;
6297 else {
6298 auto FilenameBuf = ResolveImportedPath(
6299 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6300 Filename = *FilenameBuf;
6301 }
6302 shouldContinue = Listener.visitInputFileAsRequested(
6303 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6304 StoredTime, /*IsExplicitModule=*/false);
6305 break;
6306 }
6307 if (!shouldContinue)
6308 break;
6309 }
6310 break;
6311 }
6312
6313 case IMPORT: {
6314 if (!NeedsImports)
6315 break;
6316
6317 unsigned Idx = 0;
6318 // Read information about the AST file.
6319
6320 // Skip Kind
6321 Idx++;
6322
6323 // Skip ImportLoc
6324 Idx++;
6325
6326 StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
6327
6328 bool IsStandardCXXModule = Record[Idx++];
6329
6330 // In C++20 Modules, we don't record the path to imported
6331 // modules in the BMI files.
6332 if (IsStandardCXXModule) {
6333 Listener.visitImport(ModuleName, /*Filename=*/"");
6334 continue;
6335 }
6336
6337 // Skip Size, ModTime and ImplicitModuleSuffix.
6338 Idx += 1 + 1 + 1;
6339 // Skip signature.
6340 Blob = Blob.substr(ASTFileSignature::size);
6341
6342 StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
6343 auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
6344 Listener.visitImport(ModuleName, *Filename);
6345 break;
6346 }
6347
6348 default:
6349 // No other validation to perform.
6350 break;
6351 }
6352 }
6353
6354 // Look for module file extension blocks, if requested.
6355 if (FindModuleFileExtensions) {
6356 BitstreamCursor SavedStream = Stream;
6357 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
6358 bool DoneWithExtensionBlock = false;
6359 while (!DoneWithExtensionBlock) {
6360 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6361 if (!MaybeEntry) {
6362 // FIXME this drops the error.
6363 return true;
6364 }
6365 llvm::BitstreamEntry Entry = MaybeEntry.get();
6366
6367 switch (Entry.Kind) {
6368 case llvm::BitstreamEntry::SubBlock:
6369 if (llvm::Error Err = Stream.SkipBlock()) {
6370 // FIXME this drops the error on the floor.
6371 consumeError(std::move(Err));
6372 return true;
6373 }
6374 continue;
6375
6376 case llvm::BitstreamEntry::EndBlock:
6377 DoneWithExtensionBlock = true;
6378 continue;
6379
6380 case llvm::BitstreamEntry::Error:
6381 return true;
6382
6383 case llvm::BitstreamEntry::Record:
6384 break;
6385 }
6386
6387 Record.clear();
6388 StringRef Blob;
6389 Expected<unsigned> MaybeRecCode =
6390 Stream.readRecord(Entry.ID, Record, &Blob);
6391 if (!MaybeRecCode) {
6392 // FIXME this drops the error.
6393 return true;
6394 }
6395 switch (MaybeRecCode.get()) {
6396 case EXTENSION_METADATA: {
6398 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
6399 return true;
6400
6401 Listener.readModuleFileExtension(Metadata);
6402 break;
6403 }
6404 }
6405 }
6406 }
6407 Stream = std::move(SavedStream);
6408 }
6409
6410 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6411 if (readUnhashedControlBlockImpl(
6412 nullptr, Bytes, Filename, ClientLoadCapabilities,
6413 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6414 ValidateDiagnosticOptions) != Success)
6415 return true;
6416
6417 return false;
6418}
6419
6421 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6422 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6423 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
6424 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
6425 StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches) {
6426 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6427 SpecificModuleCachePath, FileMgr,
6428 RequireStrictOptionMatches);
6429 return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6430 /*FindModuleFileExtensions=*/false, validator,
6431 /*ValidateDiagnosticOptions=*/true);
6432}
6433
6434Module *ASTReader::getSubmodule(uint32_t GlobalID) {
6435 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6436 assert(GlobalID == 0 && "Unhandled global submodule ID");
6437 return nullptr;
6438 }
6439
6440 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6441 if (GlobalIndex >= SubmodulesLoaded.size()) {
6442 Error("submodule ID out of range in AST file");
6443 return nullptr;
6444 }
6445
6446 if (SubmodulesLoaded[GlobalIndex])
6447 return SubmodulesLoaded[GlobalIndex];
6448
6449 GlobalSubmoduleMapType::iterator It = GlobalSubmoduleMap.find(GlobalID);
6450 assert(It != GlobalSubmoduleMap.end());
6451 ModuleFile &F = *It->second;
6452 unsigned Index = GlobalID - F.BaseSubmoduleID - NUM_PREDEF_SUBMODULE_IDS;
6453 [[maybe_unused]] unsigned LocalID =
6455
6456 BitstreamCursor &Cursor = F.SubmodulesCursor;
6457 SavedStreamPosition SavedPosition(Cursor);
6458 unsigned Offset = F.SubmoduleOffsets[Index];
6459 if (llvm::Error Err = Cursor.JumpToBit(F.SubmodulesOffsetBase + Offset)) {
6460 Error(std::move(Err));
6461 return nullptr;
6462 }
6463
6464 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6465 bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6466 // If we don't know the top-level module, there's no point in doing qualified
6467 // lookup of its submodules; it won't find anything anywhere within this tree.
6468 // Let's skip that and avoid some string lookups.
6469 auto CreateModule = !KnowsTopLevelModule
6472
6473 Module *CurrentModule = nullptr;
6475 while (true) {
6476 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
6477 if (!MaybeEntry) {
6478 Error(MaybeEntry.takeError());
6479 return nullptr;
6480 }
6481 llvm::BitstreamEntry Entry = MaybeEntry.get();
6482
6483 switch (Entry.Kind) {
6484 case llvm::BitstreamEntry::SubBlock:
6485 case llvm::BitstreamEntry::Error:
6486 case llvm::BitstreamEntry::EndBlock: {
6487 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6488 "malformed block record in AST file"));
6489 return nullptr;
6490 }
6491 case llvm::BitstreamEntry::Record:
6492 // The interesting case.
6493 break;
6494 }
6495
6496 // Read a record.
6497 StringRef Blob;
6498 Record.clear();
6499 Expected<unsigned> MaybeKind = Cursor.readRecord(Entry.ID, Record, &Blob);
6500 if (!MaybeKind) {
6501 Error(MaybeKind.takeError());
6502 return nullptr;
6503 }
6504 auto Kind = static_cast<SubmoduleRecordTypes>(MaybeKind.get());
6505
6506 switch (Kind) {
6507 case SUBMODULE_END:
6508 if (!CurrentModule) {
6509 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6510 "malformed module definition"));
6511 return nullptr;
6512 }
6513 return CurrentModule;
6514
6515 case SUBMODULE_DEFINITION: {
6516 if (Record.size() < 13) {
6517 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6518 "malformed module definition"));
6519 return nullptr;
6520 }
6521
6522 StringRef Name = Blob;
6523 unsigned Idx = 0;
6524 [[maybe_unused]] unsigned ReadLocalID = Record[Idx++];
6525 assert(LocalID == ReadLocalID);
6526 assert(GlobalID == getGlobalSubmoduleID(F, ReadLocalID));
6527 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6529 SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6530 FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6531 bool IsFramework = Record[Idx++];
6532 bool IsExplicit = Record[Idx++];
6533 bool IsSystem = Record[Idx++];
6534 bool IsExternC = Record[Idx++];
6535 bool InferSubmodules = Record[Idx++];
6536 bool InferExplicitSubmodules = Record[Idx++];
6537 bool InferExportWildcard = Record[Idx++];
6538 bool ConfigMacrosExhaustive = Record[Idx++];
6539 bool ModuleMapIsPrivate = Record[Idx++];
6540 bool NamedModuleHasInit = Record[Idx++];
6541
6542 Module *ParentModule = nullptr;
6543 if (Parent) {
6544 ParentModule = getSubmodule(Parent);
6545 if (!ParentModule)
6546 return nullptr;
6547 }
6548
6549 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6550 IsFramework, IsExplicit);
6551
6552 if (!ParentModule) {
6553 if ([[maybe_unused]] const ModuleFileKey *CurFileKey =
6554 CurrentModule->getASTFileKey()) {
6555 // Don't emit module relocation error if we have -fno-validate-pch
6556 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6558 assert(*CurFileKey != F.FileKey &&
6559 "ModuleManager did not de-duplicate");
6560
6561 Diag(diag::err_module_file_conflict)
6562 << CurrentModule->getTopLevelModuleName()
6563 << *CurrentModule->getASTFileName() << F.FileName;
6564
6565 auto CurModMapFile =
6566 ModMap.getContainingModuleMapFile(CurrentModule);
6567 auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6568 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6569 Diag(diag::note_module_file_conflict)
6570 << CurModMapFile->getName() << ModMapFile->getName();
6571
6572 return nullptr;
6573 }
6574 }
6575
6576 F.DidReadTopLevelSubmodule = true;
6577 CurrentModule->setASTFileNameAndKey(F.FileName, F.FileKey);
6578 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6579 }
6580
6581 CurrentModule->Kind = Kind;
6582 // Note that we may be rewriting an existing location and it is important
6583 // to keep doing that. In particular, we would like to prefer a
6584 // `DefinitionLoc` loaded from the module file instead of the location
6585 // created in the current source manager, because it allows the new
6586 // location to be marked as "unaffecting" when writing and avoid creating
6587 // duplicate locations for the same module map file.
6588 CurrentModule->DefinitionLoc = DefinitionLoc;
6589 CurrentModule->Signature = F.Signature;
6590 CurrentModule->IsFromModuleFile = true;
6591 if (InferredAllowedBy.isValid())
6592 ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6593 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6594 CurrentModule->IsExternC = IsExternC;
6595 CurrentModule->InferSubmodules = InferSubmodules;
6596 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6597 CurrentModule->InferExportWildcard = InferExportWildcard;
6598 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6599 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6600 CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6601
6602 if (!ParentModule && !F.BaseDirectory.empty()) {
6603 if (auto Dir = FileMgr.getOptionalDirectoryRef(F.BaseDirectory))
6604 CurrentModule->Directory = *Dir;
6605 } else if (ParentModule && ParentModule->Directory) {
6606 // Submodules inherit the directory from their parent.
6607 CurrentModule->Directory = ParentModule->Directory;
6608 }
6609
6610 if (DeserializationListener)
6611 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6612
6613 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6614
6615 // Clear out data that will be replaced by what is in the module file.
6616 CurrentModule->LinkLibraries.clear();
6617 CurrentModule->ConfigMacros.clear();
6618 CurrentModule->UnresolvedConflicts.clear();
6619 CurrentModule->Conflicts.clear();
6620
6621 // The module is available unless it's missing a requirement; relevant
6622 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6623 // Missing headers that were present when the module was built do not
6624 // make it unavailable -- if we got this far, this must be an explicitly
6625 // imported module file.
6626 CurrentModule->Requirements.clear();
6627 CurrentModule->MissingHeaders.clear();
6628 CurrentModule->IsUnimportable =
6629 ParentModule && ParentModule->IsUnimportable;
6630 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6631 break;
6632 }
6633
6635 SmallString<128> RelativePathName;
6636 if (auto Umbrella = ModMap.findUmbrellaHeaderForModule(
6637 CurrentModule, Blob.str(), RelativePathName)) {
6638 if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6639 ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob,
6640 RelativePathName);
6641 }
6642 // Note that it's too late at this point to return out of date if the
6643 // name from the PCM doesn't match up with the one in the module map,
6644 // but also quite unlikely since we will have already checked the
6645 // modification time and size of the module map file itself.
6646 }
6647 break;
6648 }
6649
6650 case SUBMODULE_HEADER:
6653 // We lazily associate headers with their modules via the HeaderInfo table.
6654 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6655 // of complete filenames or remove it entirely.
6656 break;
6657
6660 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6661 // them here.
6662 break;
6663
6664 case SUBMODULE_TOPHEADER: {
6665 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6666 CurrentModule->addTopHeaderFilename(*HeaderName);
6667 break;
6668 }
6669
6671 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6672 if (auto Umbrella =
6673 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6674 if (!CurrentModule->getUmbrellaDirAsWritten()) {
6675 // FIXME: NameAsWritten
6676 ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6677 }
6678 }
6679 break;
6680 }
6681
6682 case SUBMODULE_IMPORTS:
6683 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6684 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6685 CurrentModule->Imports.push_back(ModuleRef(this, GlobalID));
6686 }
6687 break;
6688
6690 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6691 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6692 CurrentModule->AffectingClangModules.push_back(
6693 ModuleRef(this, GlobalID));
6694 }
6695 break;
6696
6697 case SUBMODULE_EXPORTS:
6698 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6699 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6700 bool IsWildcard = Record[Idx + 1];
6701 ModuleRef ExportedMod =
6702 GlobalID ? ModuleRef(this, GlobalID) : ModuleRef();
6703 if (ExportedMod || IsWildcard)
6704 CurrentModule->Exports.push_back({ExportedMod, IsWildcard});
6705 }
6706
6707 // Once we've loaded the set of exports, there's no reason to keep
6708 // the parsed, unresolved exports around.
6709 CurrentModule->UnresolvedExports.clear();
6710 break;
6711
6712 case SUBMODULE_REQUIRES:
6713 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6714 PP.getTargetInfo());
6715 break;
6716
6718 ModMap.resolveLinkAsDependencies(CurrentModule);
6719 CurrentModule->LinkLibraries.push_back(
6720 Module::LinkLibrary(std::string(Blob), Record[0]));
6721 break;
6722
6724 CurrentModule->ConfigMacros.push_back(Blob.str());
6725 break;
6726
6727 case SUBMODULE_CONFLICT: {
6728 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6729 Module::Conflict Conflict;
6730 Conflict.Other = ModuleRef(this, GlobalID);
6731 Conflict.Message = Blob.str();
6732 CurrentModule->Conflicts.push_back(Conflict);
6733 break;
6734 }
6735
6737 if (!ContextObj)
6738 break;
6739 // Standard C++ module has its own way to initialize variables.
6740 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
6742 for (unsigned I = 0; I < Record.size(); /*in loop*/)
6743 Inits.push_back(ReadDeclID(F, Record, I));
6744 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6745 }
6746 break;
6747 }
6748
6750 CurrentModule->ExportAsModule = Blob.str();
6751 ModMap.addLinkAsDependency(CurrentModule);
6752 break;
6753
6754 case SUBMODULE_CHILD: {
6755 // Record a not-yet-loaded direct child for on-demand deserialization.
6756 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6757 CurrentModule->addSubmodule(Blob, this, GlobalID);
6758 break;
6759 }
6760 }
6761 }
6762}
6763
6764/// Parse the record that corresponds to a LangOptions data
6765/// structure.
6766///
6767/// This routine parses the language options from the AST file and then gives
6768/// them to the AST listener if one is set.
6769///
6770/// \returns true if the listener deems the file unacceptable, false otherwise.
6771bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6772 StringRef ModuleFilename, bool Complain,
6773 ASTReaderListener &Listener,
6774 bool AllowCompatibleDifferences) {
6775 LangOptions LangOpts;
6776 unsigned Idx = 0;
6777 LangOpts.LangStd = static_cast<LangStandard::Kind>(Record[Idx++]);
6778#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6779 LangOpts.Name = Record[Idx++];
6780#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6781 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6782#include "clang/Basic/LangOptions.def"
6783#define SANITIZER(NAME, ID) \
6784 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6785#include "clang/Basic/Sanitizers.def"
6786
6787 for (unsigned N = Record[Idx++]; N; --N)
6788 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6789
6790 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6791 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6792 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6793
6794 LangOpts.CurrentModule = ReadString(Record, Idx);
6795
6796 // Comment options.
6797 for (unsigned N = Record[Idx++]; N; --N) {
6798 LangOpts.CommentOpts.BlockCommandNames.push_back(
6799 ReadString(Record, Idx));
6800 }
6801 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6802
6803 // OpenMP offloading options.
6804 for (unsigned N = Record[Idx++]; N; --N) {
6805 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6806 }
6807
6808 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6809
6810 return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6811 AllowCompatibleDifferences);
6812}
6813
6814bool ASTReader::ParseCodeGenOptions(const RecordData &Record,
6815 StringRef ModuleFilename, bool Complain,
6816 ASTReaderListener &Listener,
6817 bool AllowCompatibleDifferences) {
6818 unsigned Idx = 0;
6819 CodeGenOptions CGOpts;
6821#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6822 if constexpr (CK::Compatibility != CK::Benign) \
6823 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6824#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6825 if constexpr (CK::Compatibility != CK::Benign) \
6826 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6827#define DEBUGOPT(Name, Bits, Default, Compatibility)
6828#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6829#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6830#include "clang/Basic/CodeGenOptions.def"
6831
6832 return Listener.ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
6833 AllowCompatibleDifferences);
6834}
6835
6836bool ASTReader::ParseTargetOptions(const RecordData &Record,
6837 StringRef ModuleFilename, bool Complain,
6838 ASTReaderListener &Listener,
6839 bool AllowCompatibleDifferences) {
6840 unsigned Idx = 0;
6841 TargetOptions TargetOpts;
6842 TargetOpts.Triple = ReadString(Record, Idx);
6843 TargetOpts.CPU = ReadString(Record, Idx);
6844 TargetOpts.TuneCPU = ReadString(Record, Idx);
6845 TargetOpts.ABI = ReadString(Record, Idx);
6846 for (unsigned N = Record[Idx++]; N; --N) {
6847 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6848 }
6849 for (unsigned N = Record[Idx++]; N; --N) {
6850 TargetOpts.Features.push_back(ReadString(Record, Idx));
6851 }
6852
6853 return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6854 AllowCompatibleDifferences);
6855}
6856
6857bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6858 StringRef ModuleFilename, bool Complain,
6859 ASTReaderListener &Listener) {
6860 DiagnosticOptions DiagOpts;
6861 unsigned Idx = 0;
6862#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6863#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6864 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6865#include "clang/Basic/DiagnosticOptions.def"
6866
6867 for (unsigned N = Record[Idx++]; N; --N)
6868 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6869 for (unsigned N = Record[Idx++]; N; --N)
6870 DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6871
6872 return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6873}
6874
6875bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6876 ASTReaderListener &Listener) {
6877 FileSystemOptions FSOpts;
6878 unsigned Idx = 0;
6879 FSOpts.WorkingDir = ReadString(Record, Idx);
6880 return Listener.ReadFileSystemOptions(FSOpts, Complain);
6881}
6882
6883bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6884 StringRef ModuleFilename,
6885 bool Complain,
6886 ASTReaderListener &Listener) {
6887 HeaderSearchOptions HSOpts;
6888 unsigned Idx = 0;
6889 HSOpts.Sysroot = ReadString(Record, Idx);
6890
6891 HSOpts.ResourceDir = ReadString(Record, Idx);
6892 HSOpts.ModuleCachePath = ReadString(Record, Idx);
6893 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6894 HSOpts.DisableModuleHash = Record[Idx++];
6895 HSOpts.ImplicitModuleMaps = Record[Idx++];
6896 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6897 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6898 HSOpts.UseBuiltinIncludes = Record[Idx++];
6899 HSOpts.UseStandardSystemIncludes = Record[Idx++];
6900 HSOpts.UseStandardCXXIncludes = Record[Idx++];
6901 HSOpts.UseLibcxx = Record[Idx++];
6902 std::string ContextHash = ReadString(Record, Idx);
6903
6904 return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
6905 Complain);
6906}
6907
6908bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6909 ASTReaderListener &Listener) {
6910 HeaderSearchOptions HSOpts;
6911 unsigned Idx = 0;
6912
6913 // Include entries.
6914 for (unsigned N = Record[Idx++]; N; --N) {
6915 std::string Path = ReadString(Record, Idx);
6917 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6918 bool IsFramework = Record[Idx++];
6919 bool IgnoreSysRoot = Record[Idx++];
6920 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6921 IgnoreSysRoot);
6922 }
6923
6924 // System header prefixes.
6925 for (unsigned N = Record[Idx++]; N; --N) {
6926 std::string Prefix = ReadString(Record, Idx);
6927 bool IsSystemHeader = Record[Idx++];
6928 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6929 }
6930
6931 // VFS overlay files.
6932 for (unsigned N = Record[Idx++]; N; --N) {
6933 std::string VFSOverlayFile = ReadString(Record, Idx);
6934 HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6935 }
6936
6937 return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6938}
6939
6940bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6941 StringRef ModuleFilename,
6942 bool Complain,
6943 ASTReaderListener &Listener,
6944 std::string &SuggestedPredefines) {
6945 PreprocessorOptions PPOpts;
6946 unsigned Idx = 0;
6947
6948 // Macro definitions/undefs
6949 bool ReadMacros = Record[Idx++];
6950 if (ReadMacros) {
6951 for (unsigned N = Record[Idx++]; N; --N) {
6952 std::string Macro = ReadString(Record, Idx);
6953 bool IsUndef = Record[Idx++];
6954 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6955 }
6956 }
6957
6958 // Includes
6959 for (unsigned N = Record[Idx++]; N; --N) {
6960 PPOpts.Includes.push_back(ReadString(Record, Idx));
6961 }
6962
6963 // Macro Includes
6964 for (unsigned N = Record[Idx++]; N; --N) {
6965 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6966 }
6967
6968 PPOpts.UsePredefines = Record[Idx++];
6969 PPOpts.DetailedRecord = Record[Idx++];
6970 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6972 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6973 SuggestedPredefines.clear();
6974 return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6975 Complain, SuggestedPredefines);
6976}
6977
6978std::pair<ModuleFile *, unsigned>
6979ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6980 GlobalPreprocessedEntityMapType::iterator
6981 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6982 assert(I != GlobalPreprocessedEntityMap.end() &&
6983 "Corrupted global preprocessed entity map");
6984 ModuleFile *M = I->second;
6985 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6986 return std::make_pair(M, LocalIndex);
6987}
6988
6989llvm::iterator_range<PreprocessingRecord::iterator>
6990ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6991 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6992 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6994
6995 return llvm::make_range(PreprocessingRecord::iterator(),
6996 PreprocessingRecord::iterator());
6997}
6998
6999bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
7000 unsigned int ClientLoadCapabilities) {
7001 return ClientLoadCapabilities & ARR_OutOfDate &&
7002 !getModuleManager()
7003 .getModuleCache()
7004 .getInMemoryModuleCache()
7005 .isPCMFinal(ModuleFileName);
7006}
7007
7008llvm::iterator_range<ASTReader::ModuleDeclIterator>
7010 return llvm::make_range(
7011 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
7012 ModuleDeclIterator(this, &Mod,
7014}
7015
7017 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
7018 assert(I != GlobalSkippedRangeMap.end() &&
7019 "Corrupted global skipped range map");
7020 ModuleFile *M = I->second;
7021 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
7022 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
7023 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
7024 SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
7025 ReadSourceLocation(*M, RawRange.getEnd()));
7026 assert(Range.isValid());
7027 return Range;
7028}
7029
7030unsigned
7031ASTReader::translatePreprocessedEntityIDToIndex(PreprocessedEntityID ID) const {
7032 unsigned ModuleFileIndex = ID >> 32;
7033 assert(ModuleFileIndex && "not translating loaded MacroID?");
7034 assert(getModuleManager().size() > ModuleFileIndex - 1);
7035 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
7036
7037 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
7038 return MF.BasePreprocessedEntityID + ID;
7039}
7040
7042 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7043 ModuleFile &M = *PPInfo.first;
7044 unsigned LocalIndex = PPInfo.second;
7046 (static_cast<PreprocessedEntityID>(M.Index + 1) << 32) | LocalIndex;
7047 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7048
7049 if (!PP.getPreprocessingRecord()) {
7050 Error("no preprocessing record");
7051 return nullptr;
7052 }
7053
7055 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
7056 M.MacroOffsetsBase + PPOffs.getOffset())) {
7057 Error(std::move(Err));
7058 return nullptr;
7059 }
7060
7062 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
7063 if (!MaybeEntry) {
7064 Error(MaybeEntry.takeError());
7065 return nullptr;
7066 }
7067 llvm::BitstreamEntry Entry = MaybeEntry.get();
7068
7069 if (Entry.Kind != llvm::BitstreamEntry::Record)
7070 return nullptr;
7071
7072 // Read the record.
7073 SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
7074 ReadSourceLocation(M, PPOffs.getEnd()));
7075 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
7076 StringRef Blob;
7078 Expected<unsigned> MaybeRecType =
7079 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
7080 if (!MaybeRecType) {
7081 Error(MaybeRecType.takeError());
7082 return nullptr;
7083 }
7084 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
7085 case PPD_MACRO_EXPANSION: {
7086 bool isBuiltin = Record[0];
7087 IdentifierInfo *Name = nullptr;
7088 MacroDefinitionRecord *Def = nullptr;
7089 if (isBuiltin)
7090 Name = getLocalIdentifier(M, Record[1]);
7091 else {
7092 PreprocessedEntityID GlobalID =
7094 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7095 Def =
7096 cast<MacroDefinitionRecord>(PPRec.getLoadedPreprocessedEntity(Index));
7097 }
7098
7099 MacroExpansion *ME;
7100 if (isBuiltin)
7101 ME = new (PPRec) MacroExpansion(Name, Range);
7102 else
7103 ME = new (PPRec) MacroExpansion(Def, Range);
7104
7105 return ME;
7106 }
7107
7108 case PPD_MACRO_DEFINITION: {
7109 // Decode the identifier info and then check again; if the macro is
7110 // still defined and associated with the identifier,
7112 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
7113
7114 if (DeserializationListener)
7115 DeserializationListener->MacroDefinitionRead(PPID, MD);
7116
7117 return MD;
7118 }
7119
7121 const char *FullFileNameStart = Blob.data() + Record[0];
7122 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
7124 if (!FullFileName.empty())
7125 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7126
7127 // FIXME: Stable encoding
7129 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
7131 = new (PPRec) InclusionDirective(PPRec, Kind,
7132 StringRef(Blob.data(), Record[0]),
7133 Record[1], Record[3],
7134 File,
7135 Range);
7136 return ID;
7137 }
7138 }
7139
7140 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
7141}
7142
7143/// Find the next module that contains entities and return the ID
7144/// of the first entry.
7145///
7146/// \param SLocMapI points at a chunk of a module that contains no
7147/// preprocessed entities or the entities it contains are not the ones we are
7148/// looking for.
7149unsigned ASTReader::findNextPreprocessedEntity(
7150 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
7151 ++SLocMapI;
7152 for (GlobalSLocOffsetMapType::const_iterator
7153 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7154 ModuleFile &M = *SLocMapI->second;
7156 return M.BasePreprocessedEntityID;
7157 }
7158
7159 return getTotalNumPreprocessedEntities();
7160}
7161
7162namespace {
7163
7164struct PPEntityComp {
7165 const ASTReader &Reader;
7166 ModuleFile &M;
7167
7168 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7169
7170 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
7171 SourceLocation LHS = getLoc(L);
7172 SourceLocation RHS = getLoc(R);
7173 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7174 }
7175
7176 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
7177 SourceLocation LHS = getLoc(L);
7178 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7179 }
7180
7181 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
7182 SourceLocation RHS = getLoc(R);
7183 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7184 }
7185
7186 SourceLocation getLoc(const PPEntityOffset &PPE) const {
7187 return Reader.ReadSourceLocation(M, PPE.getBegin());
7188 }
7189};
7190
7191} // namespace
7192
7193unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7194 bool EndsAfter) const {
7195 if (SourceMgr.isLocalSourceLocation(Loc))
7196 return getTotalNumPreprocessedEntities();
7197
7198 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7199 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7200 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7201 "Corrupted global sloc offset map");
7202
7203 if (SLocMapI->second->NumPreprocessedEntities == 0)
7204 return findNextPreprocessedEntity(SLocMapI);
7205
7206 ModuleFile &M = *SLocMapI->second;
7207
7208 using pp_iterator = const PPEntityOffset *;
7209
7210 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
7211 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
7212
7213 size_t Count = M.NumPreprocessedEntities;
7214 size_t Half;
7215 pp_iterator First = pp_begin;
7216 pp_iterator PPI;
7217
7218 if (EndsAfter) {
7219 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7220 PPEntityComp(*this, M));
7221 } else {
7222 // Do a binary search manually instead of using std::lower_bound because
7223 // The end locations of entities may be unordered (when a macro expansion
7224 // is inside another macro argument), but for this case it is not important
7225 // whether we get the first macro expansion or its containing macro.
7226 while (Count > 0) {
7227 Half = Count / 2;
7228 PPI = First;
7229 std::advance(PPI, Half);
7230 if (SourceMgr.isBeforeInTranslationUnit(
7231 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7232 First = PPI;
7233 ++First;
7234 Count = Count - Half - 1;
7235 } else
7236 Count = Half;
7237 }
7238 }
7239
7240 if (PPI == pp_end)
7241 return findNextPreprocessedEntity(SLocMapI);
7242
7243 return M.BasePreprocessedEntityID + (PPI - pp_begin);
7244}
7245
7246/// Returns a pair of [Begin, End) indices of preallocated
7247/// preprocessed entities that \arg Range encompasses.
7248std::pair<unsigned, unsigned>
7250 if (Range.isInvalid())
7251 return std::make_pair(0,0);
7252 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7253
7254 unsigned BeginID = findPreprocessedEntity(Range.getBegin(), false);
7255 unsigned EndID = findPreprocessedEntity(Range.getEnd(), true);
7256 return std::make_pair(BeginID, EndID);
7257}
7258
7259/// Optionally returns true or false if the preallocated preprocessed
7260/// entity with index \arg Index came from file \arg FID.
7261std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
7262 FileID FID) {
7263 if (FID.isInvalid())
7264 return false;
7265
7266 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7267 ModuleFile &M = *PPInfo.first;
7268 unsigned LocalIndex = PPInfo.second;
7269 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7270
7271 SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
7272 if (Loc.isInvalid())
7273 return false;
7274
7275 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7276 return true;
7277 else
7278 return false;
7279}
7280
7281namespace {
7282
7283 /// Visitor used to search for information about a header file.
7284 class HeaderFileInfoVisitor {
7285 FileEntryRef FE;
7286 std::optional<HeaderFileInfo> HFI;
7287
7288 public:
7289 explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
7290
7291 bool operator()(ModuleFile &M) {
7294 if (!Table)
7295 return false;
7296
7297 // Look in the on-disk hash table for an entry for this file name.
7298 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7299 if (Pos == Table->end())
7300 return false;
7301
7302 HFI = *Pos;
7303 return true;
7304 }
7305
7306 std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
7307 };
7308
7309} // namespace
7310
7312 HeaderFileInfoVisitor Visitor(FE);
7313 ModuleMgr.visit(Visitor);
7314 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7315 return *HFI;
7316
7317 return HeaderFileInfo();
7318}
7319
7321 using DiagState = DiagnosticsEngine::DiagState;
7323
7324 for (ModuleFile &F : ModuleMgr) {
7325 unsigned Idx = 0;
7326 auto &Record = F.PragmaDiagMappings;
7327 if (Record.empty())
7328 continue;
7329
7330 DiagStates.clear();
7331
7332 auto ReadDiagState = [&](const DiagState &BasedOn,
7333 bool IncludeNonPragmaStates) {
7334 unsigned BackrefID = Record[Idx++];
7335 if (BackrefID != 0)
7336 return DiagStates[BackrefID - 1];
7337
7338 // A new DiagState was created here.
7339 Diag.DiagStates.push_back(BasedOn);
7340 DiagState *NewState = &Diag.DiagStates.back();
7341 DiagStates.push_back(NewState);
7342 unsigned Size = Record[Idx++];
7343 assert(Idx + Size * 2 <= Record.size() &&
7344 "Invalid data, not enough diag/map pairs");
7345 while (Size--) {
7346 unsigned DiagID = Record[Idx++];
7347 DiagnosticMapping NewMapping =
7349 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
7350 continue;
7351
7352 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
7353
7354 // If this mapping was specified as a warning but the severity was
7355 // upgraded due to diagnostic settings, simulate the current diagnostic
7356 // settings (and use a warning).
7357 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
7359 NewMapping.setUpgradedFromWarning(false);
7360 }
7361
7362 Mapping = NewMapping;
7363 }
7364 return NewState;
7365 };
7366
7367 // Read the first state.
7368 DiagState *FirstState;
7369 if (F.Kind == MK_ImplicitModule) {
7370 // Implicitly-built modules are reused with different diagnostic
7371 // settings. Use the initial diagnostic state from Diag to simulate this
7372 // compilation's diagnostic settings.
7373 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
7374 DiagStates.push_back(FirstState);
7375
7376 // Skip the initial diagnostic state from the serialized module.
7377 assert(Record[1] == 0 &&
7378 "Invalid data, unexpected backref in initial state");
7379 Idx = 3 + Record[2] * 2;
7380 assert(Idx < Record.size() &&
7381 "Invalid data, not enough state change pairs in initial state");
7382 } else if (F.isModule()) {
7383 // For an explicit module, preserve the flags from the module build
7384 // command line (-w, -Weverything, -Werror, ...) along with any explicit
7385 // -Wblah flags.
7386 unsigned Flags = Record[Idx++];
7387 DiagState Initial(*Diag.getDiagnosticIDs());
7388 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7389 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7390 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7391 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7392 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7393 Initial.ExtBehavior = (diag::Severity)Flags;
7394 FirstState = ReadDiagState(Initial, true);
7395
7396 assert(F.OriginalSourceFileID.isValid());
7397
7398 // Set up the root buffer of the module to start with the initial
7399 // diagnostic state of the module itself, to cover files that contain no
7400 // explicit transitions (for which we did not serialize anything).
7401 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
7402 .StateTransitions.push_back({FirstState, 0});
7403 } else {
7404 // For prefix ASTs, start with whatever the user configured on the
7405 // command line.
7406 Idx++; // Skip flags.
7407 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
7408 }
7409
7410 // Read the state transitions.
7411 unsigned NumLocations = Record[Idx++];
7412 while (NumLocations--) {
7413 assert(Idx < Record.size() &&
7414 "Invalid data, missing pragma diagnostic states");
7415 FileID FID = ReadFileID(F, Record, Idx);
7416 assert(FID.isValid() && "invalid FileID for transition");
7417 unsigned Transitions = Record[Idx++];
7418
7419 // Note that we don't need to set up Parent/ParentOffset here, because
7420 // we won't be changing the diagnostic state within imported FileIDs
7421 // (other than perhaps appending to the main source file, which has no
7422 // parent).
7423 auto &F = Diag.DiagStatesByLoc.Files[FID];
7424 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7425 for (unsigned I = 0; I != Transitions; ++I) {
7426 unsigned Offset = Record[Idx++];
7427 auto *State = ReadDiagState(*FirstState, false);
7428 F.StateTransitions.push_back({State, Offset});
7429 }
7430 }
7431
7432 // Read the final state.
7433 assert(Idx < Record.size() &&
7434 "Invalid data, missing final pragma diagnostic state");
7435 SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
7436 auto *CurState = ReadDiagState(*FirstState, false);
7437
7438 if (!F.isModule()) {
7439 Diag.DiagStatesByLoc.CurDiagState = CurState;
7440 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7441
7442 // Preserve the property that the imaginary root file describes the
7443 // current state.
7444 FileID NullFile;
7445 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7446 if (T.empty())
7447 T.push_back({CurState, 0});
7448 else
7449 T[0].State = CurState;
7450 }
7451
7452 // Restore the push stack so that unmatched pushes from a preamble are
7453 // visible when the main file is parsed, allowing the corresponding
7454 // `#pragma diagnostic pop` to succeed.
7455 assert(Idx < Record.size() &&
7456 "Invalid data, missing diagnostic push stack");
7457 unsigned NumPushes = Record[Idx++];
7458 for (unsigned I = 0; I != NumPushes; ++I) {
7459 auto *State = ReadDiagState(*FirstState, false);
7460 if (!F.isModule())
7461 Diag.DiagStateOnPushStack.push_back(State);
7462 }
7463
7464 // Don't try to read these mappings again.
7465 Record.clear();
7466 }
7467}
7468
7469/// Get the correct cursor and offset for loading a type.
7470ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7471 auto [M, Index] = translateTypeIDToIndex(ID);
7472 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7474}
7475
7476static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7477 switch (code) {
7478#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7479 case TYPE_##CODE_ID: return Type::CLASS_ID;
7480#include "clang/Serialization/TypeBitCodes.def"
7481 default:
7482 return std::nullopt;
7483 }
7484}
7485
7486/// Read and return the type with the given index..
7487///
7488/// The index is the type ID, shifted and minus the number of predefs. This
7489/// routine actually reads the record corresponding to the type at the given
7490/// location. It is a helper routine for GetType, which deals with reading type
7491/// IDs.
7492QualType ASTReader::readTypeRecord(TypeID ID) {
7493 assert(ContextObj && "reading type with no AST context");
7494 ASTContext &Context = *ContextObj;
7495 RecordLocation Loc = TypeCursorForIndex(ID);
7496 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7497
7498 // Keep track of where we are in the stream, then jump back there
7499 // after reading this type.
7500 SavedStreamPosition SavedPosition(DeclsCursor);
7501
7502 ReadingKindTracker ReadingKind(Read_Type, *this);
7503
7504 // Note that we are loading a type record.
7505 Deserializing AType(this);
7506
7507 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7508 Error(std::move(Err));
7509 return QualType();
7510 }
7511 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7512 if (!RawCode) {
7513 Error(RawCode.takeError());
7514 return QualType();
7515 }
7516
7517 ASTRecordReader Record(*this, *Loc.F);
7518 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7519 if (!Code) {
7520 Error(Code.takeError());
7521 return QualType();
7522 }
7523 if (Code.get() == TYPE_EXT_QUAL) {
7524 QualType baseType = Record.readQualType();
7525 Qualifiers quals = Record.readQualifiers();
7526 return Context.getQualifiedType(baseType, quals);
7527 }
7528
7529 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7530 if (!maybeClass) {
7531 Error("Unexpected code for type");
7532 return QualType();
7533 }
7534
7535 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7536 return TypeReader.read(*maybeClass);
7537}
7538
7539namespace clang {
7540
7541class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7542 ASTRecordReader &Reader;
7543
7544 SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
7545 SourceRange readSourceRange() { return Reader.readSourceRange(); }
7546
7547 TypeSourceInfo *GetTypeSourceInfo() {
7548 return Reader.readTypeSourceInfo();
7549 }
7550
7551 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7552 return Reader.readNestedNameSpecifierLoc();
7553 }
7554
7555 Attr *ReadAttr() {
7556 return Reader.readAttr();
7557 }
7558
7559public:
7560 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7561
7562 // We want compile-time assurance that we've enumerated all of
7563 // these, so unfortunately we have to declare them first, then
7564 // define them out-of-line.
7565#define ABSTRACT_TYPELOC(CLASS, PARENT)
7566#define TYPELOC(CLASS, PARENT) \
7567 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7568#include "clang/AST/TypeLocNodes.def"
7569
7572 void VisitTagTypeLoc(TagTypeLoc TL);
7573};
7574
7575} // namespace clang
7576
7577void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7578 // nothing to do
7579}
7580
7581void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7582 TL.setBuiltinLoc(readSourceLocation());
7583 if (TL.needsExtraLocalData()) {
7584 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7585 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7586 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7587 TL.setModeAttr(Reader.readInt());
7588 }
7589}
7590
7591void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7592 TL.setNameLoc(readSourceLocation());
7593}
7594
7595void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7596 TL.setStarLoc(readSourceLocation());
7597}
7598
7599void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7600 // nothing to do
7601}
7602
7603void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7604 // nothing to do
7605}
7606
7607void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7608 // nothing to do
7609}
7610
7611void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7612 TL.setExpansionLoc(readSourceLocation());
7613}
7614
7615void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7616 TL.setCaretLoc(readSourceLocation());
7617}
7618
7619void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7620 TL.setAmpLoc(readSourceLocation());
7621}
7622
7623void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7624 TL.setAmpAmpLoc(readSourceLocation());
7625}
7626
7627void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7628 TL.setStarLoc(readSourceLocation());
7629 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7630}
7631
7633 TL.setLBracketLoc(readSourceLocation());
7634 TL.setRBracketLoc(readSourceLocation());
7635 if (Reader.readBool())
7636 TL.setSizeExpr(Reader.readExpr());
7637 else
7638 TL.setSizeExpr(nullptr);
7639}
7640
7641void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7642 VisitArrayTypeLoc(TL);
7643}
7644
7645void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7646 VisitArrayTypeLoc(TL);
7647}
7648
7649void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7650 VisitArrayTypeLoc(TL);
7651}
7652
7653void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7654 DependentSizedArrayTypeLoc TL) {
7655 VisitArrayTypeLoc(TL);
7656}
7657
7658void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7659 DependentAddressSpaceTypeLoc TL) {
7660
7661 TL.setAttrNameLoc(readSourceLocation());
7662 TL.setAttrOperandParensRange(readSourceRange());
7663 TL.setAttrExprOperand(Reader.readExpr());
7664}
7665
7666void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7667 DependentSizedExtVectorTypeLoc TL) {
7668 TL.setNameLoc(readSourceLocation());
7669}
7670
7671void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7672 TL.setNameLoc(readSourceLocation());
7673}
7674
7675void TypeLocReader::VisitDependentVectorTypeLoc(
7676 DependentVectorTypeLoc TL) {
7677 TL.setNameLoc(readSourceLocation());
7678}
7679
7680void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7681 TL.setNameLoc(readSourceLocation());
7682}
7683
7684void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7685 TL.setAttrNameLoc(readSourceLocation());
7686 TL.setAttrOperandParensRange(readSourceRange());
7687 TL.setAttrRowOperand(Reader.readExpr());
7688 TL.setAttrColumnOperand(Reader.readExpr());
7689}
7690
7691void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7692 DependentSizedMatrixTypeLoc TL) {
7693 TL.setAttrNameLoc(readSourceLocation());
7694 TL.setAttrOperandParensRange(readSourceRange());
7695 TL.setAttrRowOperand(Reader.readExpr());
7696 TL.setAttrColumnOperand(Reader.readExpr());
7697}
7698
7700 TL.setLocalRangeBegin(readSourceLocation());
7701 TL.setLParenLoc(readSourceLocation());
7702 TL.setRParenLoc(readSourceLocation());
7703 TL.setExceptionSpecRange(readSourceRange());
7704 TL.setLocalRangeEnd(readSourceLocation());
7705 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7706 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7707 }
7708}
7709
7710void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7711 VisitFunctionTypeLoc(TL);
7712}
7713
7714void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7715 VisitFunctionTypeLoc(TL);
7716}
7717
7718void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7719 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7720 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7721 SourceLocation NameLoc = readSourceLocation();
7722 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7723}
7724
7725void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7726 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7727 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7728 SourceLocation NameLoc = readSourceLocation();
7729 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7730}
7731
7732void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7733 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7734 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7735 SourceLocation NameLoc = readSourceLocation();
7736 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7737}
7738
7739void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7740 TL.setTypeofLoc(readSourceLocation());
7741 TL.setLParenLoc(readSourceLocation());
7742 TL.setRParenLoc(readSourceLocation());
7743}
7744
7745void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7746 TL.setTypeofLoc(readSourceLocation());
7747 TL.setLParenLoc(readSourceLocation());
7748 TL.setRParenLoc(readSourceLocation());
7749 TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7750}
7751
7752void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7753 TL.setDecltypeLoc(readSourceLocation());
7754 TL.setRParenLoc(readSourceLocation());
7755}
7756
7757void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7758 TL.setEllipsisLoc(readSourceLocation());
7759}
7760
7761void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7762 TL.setKWLoc(readSourceLocation());
7763 TL.setLParenLoc(readSourceLocation());
7764 TL.setRParenLoc(readSourceLocation());
7765 TL.setUnderlyingTInfo(GetTypeSourceInfo());
7766}
7767
7769 auto NNS = readNestedNameSpecifierLoc();
7770 auto TemplateKWLoc = readSourceLocation();
7771 auto ConceptNameLoc = readDeclarationNameInfo();
7772 auto FoundDecl = readDeclAs<NamedDecl>();
7773 auto NamedConcept = readTemplateName();
7774 auto *CR = ConceptReference::Create(
7775 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7776 (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7777 return CR;
7778}
7779
7780void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7781 TL.setNameLoc(readSourceLocation());
7782 if (Reader.readBool())
7783 TL.setConceptReference(Reader.readConceptReference());
7784 if (Reader.readBool())
7785 TL.setRParenLoc(readSourceLocation());
7786}
7787
7788void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7790 TL.setElaboratedKeywordLoc(readSourceLocation());
7791 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7792 TL.setTemplateNameLoc(readSourceLocation());
7793}
7794
7796 TL.setElaboratedKeywordLoc(readSourceLocation());
7797 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7798 TL.setNameLoc(readSourceLocation());
7799}
7800
7801void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7802 VisitTagTypeLoc(TL);
7803}
7804
7805void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7806 VisitTagTypeLoc(TL);
7807}
7808
7809void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7810
7811void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7812 TL.setAttr(ReadAttr());
7813}
7814
7815void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7816 // Nothing to do
7817}
7818
7819void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7820 llvm_unreachable(
7821 "should be replaced with a concrete type before serialization");
7822}
7823
7824void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7825 // Nothing to do.
7826}
7827
7828void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7829 TL.setAttrLoc(readSourceLocation());
7830}
7831
7832void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7833 HLSLAttributedResourceTypeLoc TL) {
7834 // Nothing to do.
7835}
7836
7837void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7838 // Nothing to do.
7839}
7840
7841void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7842 TL.setNameLoc(readSourceLocation());
7843}
7844
7845void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7846 SubstTemplateTypeParmTypeLoc TL) {
7847 TL.setNameLoc(readSourceLocation());
7848}
7849
7850void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7851 SubstTemplateTypeParmPackTypeLoc TL) {
7852 TL.setNameLoc(readSourceLocation());
7853}
7854
7855void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7856 SubstBuiltinTemplatePackTypeLoc TL) {
7857 TL.setNameLoc(readSourceLocation());
7858}
7859
7860void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7861 TemplateSpecializationTypeLoc TL) {
7862 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7863 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7864 SourceLocation TemplateKeywordLoc = readSourceLocation();
7865 SourceLocation NameLoc = readSourceLocation();
7866 SourceLocation LAngleLoc = readSourceLocation();
7867 SourceLocation RAngleLoc = readSourceLocation();
7868 TL.set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7869 LAngleLoc, RAngleLoc);
7870 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.getArgLocInfos();
7871 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7872 Args[I] = Reader.readTemplateArgumentLocInfo(
7873 TL.getTypePtr()->template_arguments()[I].getKind());
7874}
7875
7876void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7877 TL.setLParenLoc(readSourceLocation());
7878 TL.setRParenLoc(readSourceLocation());
7879}
7880
7881void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7882 TL.setElaboratedKeywordLoc(readSourceLocation());
7883 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7884 TL.setNameLoc(readSourceLocation());
7885}
7886
7887void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7888 TL.setEllipsisLoc(readSourceLocation());
7889}
7890
7891void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7892 TL.setNameLoc(readSourceLocation());
7893 TL.setNameEndLoc(readSourceLocation());
7894}
7895
7896void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7897 if (TL.getNumProtocols()) {
7898 TL.setProtocolLAngleLoc(readSourceLocation());
7899 TL.setProtocolRAngleLoc(readSourceLocation());
7900 }
7901 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7902 TL.setProtocolLoc(i, readSourceLocation());
7903}
7904
7905void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7906 TL.setHasBaseTypeAsWritten(Reader.readBool());
7907 TL.setTypeArgsLAngleLoc(readSourceLocation());
7908 TL.setTypeArgsRAngleLoc(readSourceLocation());
7909 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7910 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7911 TL.setProtocolLAngleLoc(readSourceLocation());
7912 TL.setProtocolRAngleLoc(readSourceLocation());
7913 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7914 TL.setProtocolLoc(i, readSourceLocation());
7915}
7916
7917void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7918 TL.setStarLoc(readSourceLocation());
7919}
7920
7921void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7922 TL.setKWLoc(readSourceLocation());
7923 TL.setLParenLoc(readSourceLocation());
7924 TL.setRParenLoc(readSourceLocation());
7925}
7926
7927void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7928 TL.setKWLoc(readSourceLocation());
7929}
7930
7931void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7932 TL.setNameLoc(readSourceLocation());
7933}
7934
7935void TypeLocReader::VisitDependentBitIntTypeLoc(
7936 clang::DependentBitIntTypeLoc TL) {
7937 TL.setNameLoc(readSourceLocation());
7938}
7939
7940void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7941 // Nothing to do.
7942}
7943
7945 TypeLocReader TLR(*this);
7946 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7947 TLR.Visit(TL);
7948}
7949
7951 QualType InfoTy = readType();
7952 if (InfoTy.isNull())
7953 return nullptr;
7954
7955 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7956 readTypeLoc(TInfo->getTypeLoc());
7957 return TInfo;
7958}
7959
7961 return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7962}
7963
7965 return ID >> 32;
7966}
7967
7969 // We don't need to erase the higher bits since if these bits are not 0,
7970 // it must be larger than NUM_PREDEF_TYPE_IDS.
7972}
7973
7974std::pair<ModuleFile *, unsigned>
7975ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7976 assert(!isPredefinedType(ID) &&
7977 "Predefined type shouldn't be in TypesLoaded");
7978 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7979 assert(ModuleFileIndex && "Untranslated Local Decl?");
7980
7981 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7982 assert(OwningModuleFile &&
7983 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7984
7985 return {OwningModuleFile,
7986 OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7987}
7988
7990 assert(ContextObj && "reading type with no AST context");
7991 ASTContext &Context = *ContextObj;
7992
7993 unsigned FastQuals = ID & Qualifiers::FastMask;
7994
7995 if (isPredefinedType(ID)) {
7996 QualType T;
7997 unsigned Index = getIndexForTypeID(ID);
7998 switch ((PredefinedTypeIDs)Index) {
8000 // We should never use this one.
8001 llvm_unreachable("Invalid predefined type");
8002 break;
8004 return QualType();
8006 T = Context.VoidTy;
8007 break;
8009 T = Context.BoolTy;
8010 break;
8013 // FIXME: Check that the signedness of CharTy is correct!
8014 T = Context.CharTy;
8015 break;
8017 T = Context.UnsignedCharTy;
8018 break;
8020 T = Context.UnsignedShortTy;
8021 break;
8023 T = Context.UnsignedIntTy;
8024 break;
8026 T = Context.UnsignedLongTy;
8027 break;
8029 T = Context.UnsignedLongLongTy;
8030 break;
8032 T = Context.UnsignedInt128Ty;
8033 break;
8035 T = Context.SignedCharTy;
8036 break;
8038 T = Context.WCharTy;
8039 break;
8041 T = Context.ShortTy;
8042 break;
8043 case PREDEF_TYPE_INT_ID:
8044 T = Context.IntTy;
8045 break;
8047 T = Context.LongTy;
8048 break;
8050 T = Context.LongLongTy;
8051 break;
8053 T = Context.Int128Ty;
8054 break;
8056 T = Context.BFloat16Ty;
8057 break;
8059 T = Context.HalfTy;
8060 break;
8062 T = Context.FloatTy;
8063 break;
8065 T = Context.DoubleTy;
8066 break;
8068 T = Context.LongDoubleTy;
8069 break;
8071 T = Context.ShortAccumTy;
8072 break;
8074 T = Context.AccumTy;
8075 break;
8077 T = Context.LongAccumTy;
8078 break;
8080 T = Context.UnsignedShortAccumTy;
8081 break;
8083 T = Context.UnsignedAccumTy;
8084 break;
8086 T = Context.UnsignedLongAccumTy;
8087 break;
8089 T = Context.ShortFractTy;
8090 break;
8092 T = Context.FractTy;
8093 break;
8095 T = Context.LongFractTy;
8096 break;
8098 T = Context.UnsignedShortFractTy;
8099 break;
8101 T = Context.UnsignedFractTy;
8102 break;
8104 T = Context.UnsignedLongFractTy;
8105 break;
8107 T = Context.SatShortAccumTy;
8108 break;
8110 T = Context.SatAccumTy;
8111 break;
8113 T = Context.SatLongAccumTy;
8114 break;
8116 T = Context.SatUnsignedShortAccumTy;
8117 break;
8119 T = Context.SatUnsignedAccumTy;
8120 break;
8122 T = Context.SatUnsignedLongAccumTy;
8123 break;
8125 T = Context.SatShortFractTy;
8126 break;
8128 T = Context.SatFractTy;
8129 break;
8131 T = Context.SatLongFractTy;
8132 break;
8134 T = Context.SatUnsignedShortFractTy;
8135 break;
8137 T = Context.SatUnsignedFractTy;
8138 break;
8140 T = Context.SatUnsignedLongFractTy;
8141 break;
8143 T = Context.Float16Ty;
8144 break;
8146 T = Context.Float128Ty;
8147 break;
8149 T = Context.Ibm128Ty;
8150 break;
8152 T = Context.OverloadTy;
8153 break;
8155 T = Context.UnresolvedTemplateTy;
8156 break;
8158 T = Context.BoundMemberTy;
8159 break;
8161 T = Context.PseudoObjectTy;
8162 break;
8164 T = Context.DependentTy;
8165 break;
8167 T = Context.UnknownAnyTy;
8168 break;
8170 T = Context.NullPtrTy;
8171 break;
8173 T = Context.MetaInfoTy;
8174 break;
8176 T = Context.Char8Ty;
8177 break;
8179 T = Context.Char16Ty;
8180 break;
8182 T = Context.Char32Ty;
8183 break;
8185 T = Context.ObjCBuiltinIdTy;
8186 break;
8188 T = Context.ObjCBuiltinClassTy;
8189 break;
8191 T = Context.ObjCBuiltinSelTy;
8192 break;
8193#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8194 case PREDEF_TYPE_##Id##_ID: \
8195 T = Context.SingletonId; \
8196 break;
8197#include "clang/Basic/OpenCLImageTypes.def"
8198#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8199 case PREDEF_TYPE_##Id##_ID: \
8200 T = Context.Id##Ty; \
8201 break;
8202#include "clang/Basic/OpenCLExtensionTypes.def"
8204 T = Context.OCLSamplerTy;
8205 break;
8207 T = Context.OCLEventTy;
8208 break;
8210 T = Context.OCLClkEventTy;
8211 break;
8213 T = Context.OCLQueueTy;
8214 break;
8216 T = Context.OCLReserveIDTy;
8217 break;
8219 T = Context.getAutoDeductType();
8220 break;
8222 T = Context.getAutoRRefDeductType();
8223 break;
8225 T = Context.ARCUnbridgedCastTy;
8226 break;
8228 T = Context.BuiltinFnTy;
8229 break;
8231 T = Context.IncompleteMatrixIdxTy;
8232 break;
8234 T = Context.ArraySectionTy;
8235 break;
8237 T = Context.OMPArrayShapingTy;
8238 break;
8240 T = Context.OMPIteratorTy;
8241 break;
8242#define SVE_TYPE(Name, Id, SingletonId) \
8243 case PREDEF_TYPE_##Id##_ID: \
8244 T = Context.SingletonId; \
8245 break;
8246#include "clang/Basic/AArch64ACLETypes.def"
8247#define PPC_VECTOR_TYPE(Name, Id, Size) \
8248 case PREDEF_TYPE_##Id##_ID: \
8249 T = Context.Id##Ty; \
8250 break;
8251#include "clang/Basic/PPCTypes.def"
8252#define RVV_TYPE(Name, Id, SingletonId) \
8253 case PREDEF_TYPE_##Id##_ID: \
8254 T = Context.SingletonId; \
8255 break;
8256#include "clang/Basic/RISCVVTypes.def"
8257#define WASM_TYPE(Name, Id, SingletonId) \
8258 case PREDEF_TYPE_##Id##_ID: \
8259 T = Context.SingletonId; \
8260 break;
8261#include "clang/Basic/WebAssemblyReferenceTypes.def"
8262#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8263 case PREDEF_TYPE_##Id##_ID: \
8264 T = Context.SingletonId; \
8265 break;
8266#include "clang/Basic/AMDGPUTypes.def"
8267#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8268 case PREDEF_TYPE_##Id##_ID: \
8269 T = Context.SingletonId; \
8270 break;
8271#include "clang/Basic/HLSLIntangibleTypes.def"
8272#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
8273 case PREDEF_TYPE_##Id##_ID: \
8274 T = Context.SingletonId; \
8275 break;
8276#include "clang/Basic/HLSLPackedTypes.def"
8277#define SPIRV_TYPE(Name, Id, SingletonId) \
8278 case PREDEF_TYPE_##Id##_ID: \
8279 T = Context.SingletonId; \
8280 break;
8281#include "clang/Basic/SPIRVTypes.def"
8282 }
8283
8284 assert(!T.isNull() && "Unknown predefined type");
8285 return T.withFastQualifiers(FastQuals);
8286 }
8287
8288 unsigned Index = translateTypeIDToIndex(ID).second;
8289
8290 assert(Index < TypesLoaded.size() && "Type index out-of-range");
8291 if (TypesLoaded[Index].isNull()) {
8292 TypesLoaded[Index] = readTypeRecord(ID);
8293 if (TypesLoaded[Index].isNull())
8294 return QualType();
8295
8296 TypesLoaded[Index]->setFromAST();
8297 if (DeserializationListener)
8298 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
8299 TypesLoaded[Index]);
8300 }
8301
8302 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8303}
8304
8306 return GetType(getGlobalTypeID(F, LocalID));
8307}
8308
8310 LocalTypeID LocalID) const {
8311 if (isPredefinedType(LocalID))
8312 return LocalID;
8313
8314 if (!F.ModuleOffsetMap.empty())
8315 ReadModuleOffsetMap(F);
8316
8317 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
8318 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8319
8320 if (ModuleFileIndex == 0)
8322
8323 ModuleFile &MF =
8324 ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
8325 ModuleFileIndex = MF.Index + 1;
8326 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8327}
8328
8331 switch (Kind) {
8333 return readExpr();
8335 return readTypeSourceInfo();
8338 SourceLocation TemplateKWLoc = readSourceLocation();
8340 SourceLocation TemplateNameLoc = readSourceLocation();
8343 : SourceLocation();
8344 return TemplateArgumentLocInfo(getASTContext(), TemplateKWLoc, QualifierLoc,
8345 TemplateNameLoc, EllipsisLoc);
8346 }
8353 // FIXME: Is this right?
8354 return TemplateArgumentLocInfo();
8355 }
8356 llvm_unreachable("unexpected template argument loc");
8357}
8358
8368
8371 Result.setLAngleLoc(readSourceLocation());
8372 Result.setRAngleLoc(readSourceLocation());
8373 unsigned NumArgsAsWritten = readInt();
8374 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
8375 Result.addArgument(readTemplateArgumentLoc());
8376}
8377
8384
8386
8388 if (NumCurrentElementsDeserializing) {
8389 // We arrange to not care about the complete redeclaration chain while we're
8390 // deserializing. Just remember that the AST has marked this one as complete
8391 // but that it's not actually complete yet, so we know we still need to
8392 // complete it later.
8393 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
8394 return;
8395 }
8396
8397 if (!D->getDeclContext()) {
8398 assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
8399 return;
8400 }
8401
8402 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
8403
8404 // If this is a named declaration, complete it by looking it up
8405 // within its context.
8406 //
8407 // FIXME: Merging a function definition should merge
8408 // all mergeable entities within it.
8410 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
8411 if (!getContext().getLangOpts().CPlusPlus &&
8413 // Outside of C++, we don't have a lookup table for the TU, so update
8414 // the identifier instead. (For C++ modules, we don't store decls
8415 // in the serialized identifier table, so we do the lookup in the TU.)
8416 auto *II = Name.getAsIdentifierInfo();
8417 assert(II && "non-identifier name in C?");
8418 if (II->isOutOfDate())
8420 } else
8421 DC->lookup(Name);
8423 // Find all declarations of this kind from the relevant context.
8424 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
8425 auto *DC = cast<DeclContext>(DCDecl);
8428 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
8429 }
8430 }
8431 }
8432
8435 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8436 Template = CTSD->getSpecializedTemplate();
8437 Args = CTSD->getTemplateArgs().asArray();
8438 } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8439 Template = VTSD->getSpecializedTemplate();
8440 Args = VTSD->getTemplateArgs().asArray();
8441 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
8442 if (auto *Tmplt = FD->getPrimaryTemplate()) {
8443 Template = Tmplt;
8444 Args = FD->getTemplateSpecializationArgs()->asArray();
8445 }
8446 }
8447
8448 if (Template)
8449 Template->loadLazySpecializationsImpl(Args);
8450}
8451
8454 RecordLocation Loc = getLocalBitOffset(Offset);
8455 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8456 SavedStreamPosition SavedPosition(Cursor);
8457 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8458 Error(std::move(Err));
8459 return nullptr;
8460 }
8461 ReadingKindTracker ReadingKind(Read_Decl, *this);
8462 Deserializing D(this);
8463
8464 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8465 if (!MaybeCode) {
8466 Error(MaybeCode.takeError());
8467 return nullptr;
8468 }
8469 unsigned Code = MaybeCode.get();
8470
8471 ASTRecordReader Record(*this, *Loc.F);
8472 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8473 if (!MaybeRecCode) {
8474 Error(MaybeRecCode.takeError());
8475 return nullptr;
8476 }
8477 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
8478 Error("malformed AST file: missing C++ ctor initializers");
8479 return nullptr;
8480 }
8481
8482 return Record.readCXXCtorInitializers();
8483}
8484
8486 assert(ContextObj && "reading base specifiers with no AST context");
8487 ASTContext &Context = *ContextObj;
8488
8489 RecordLocation Loc = getLocalBitOffset(Offset);
8490 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8491 SavedStreamPosition SavedPosition(Cursor);
8492 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8493 Error(std::move(Err));
8494 return nullptr;
8495 }
8496 ReadingKindTracker ReadingKind(Read_Decl, *this);
8497 Deserializing D(this);
8498
8499 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8500 if (!MaybeCode) {
8501 Error(MaybeCode.takeError());
8502 return nullptr;
8503 }
8504 unsigned Code = MaybeCode.get();
8505
8506 ASTRecordReader Record(*this, *Loc.F);
8507 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8508 if (!MaybeRecCode) {
8509 Error(MaybeCode.takeError());
8510 return nullptr;
8511 }
8512 unsigned RecCode = MaybeRecCode.get();
8513
8514 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8515 Error("malformed AST file: missing C++ base specifiers");
8516 return nullptr;
8517 }
8518
8519 unsigned NumBases = Record.readInt();
8520 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8521 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8522 for (unsigned I = 0; I != NumBases; ++I)
8523 Bases[I] = Record.readCXXBaseSpecifier();
8524 return Bases;
8525}
8526
8528 LocalDeclID LocalID) const {
8529 if (LocalID < NUM_PREDEF_DECL_IDS)
8530 return GlobalDeclID(LocalID.getRawValue());
8531
8532 unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8533 DeclID ID = LocalID.getLocalDeclIndex();
8534
8535 if (!F.ModuleOffsetMap.empty())
8536 ReadModuleOffsetMap(F);
8537
8538 ModuleFile *OwningModuleFile =
8539 OwningModuleFileIndex == 0
8540 ? &F
8541 : F.TransitiveImports[OwningModuleFileIndex - 1];
8542
8543 if (OwningModuleFileIndex == 0)
8544 ID -= NUM_PREDEF_DECL_IDS;
8545
8546 uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8547 return GlobalDeclID(NewModuleFileIndex, ID);
8548}
8549
8551 // Predefined decls aren't from any module.
8552 if (ID < NUM_PREDEF_DECL_IDS)
8553 return false;
8554
8555 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8556 return M.Index == ModuleFileIndex - 1;
8557}
8558
8560 // Predefined decls aren't from any module.
8561 if (ID < NUM_PREDEF_DECL_IDS)
8562 return nullptr;
8563
8564 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8565 assert(ModuleFileIndex && "Untranslated Local Decl?");
8566
8567 return &getModuleManager()[ModuleFileIndex - 1];
8568}
8569
8571 if (!D->isFromASTFile())
8572 return nullptr;
8573
8574 return getOwningModuleFile(D->getGlobalID());
8575}
8576
8578 if (ID < NUM_PREDEF_DECL_IDS)
8579 return SourceLocation();
8580
8581 if (Decl *D = GetExistingDecl(ID))
8582 return D->getLocation();
8583
8584 SourceLocation Loc;
8585 DeclCursorForID(ID, Loc);
8586 return Loc;
8587}
8588
8589Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8590 assert(ContextObj && "reading predefined decl without AST context");
8591 ASTContext &Context = *ContextObj;
8592 Decl *NewLoaded = nullptr;
8593 switch (ID) {
8595 return nullptr;
8596
8598 return Context.getTranslationUnitDecl();
8599
8601 if (Context.ObjCIdDecl)
8602 return Context.ObjCIdDecl;
8603 NewLoaded = Context.getObjCIdDecl();
8604 break;
8605
8607 if (Context.ObjCSelDecl)
8608 return Context.ObjCSelDecl;
8609 NewLoaded = Context.getObjCSelDecl();
8610 break;
8611
8613 if (Context.ObjCClassDecl)
8614 return Context.ObjCClassDecl;
8615 NewLoaded = Context.getObjCClassDecl();
8616 break;
8617
8619 if (Context.ObjCProtocolClassDecl)
8620 return Context.ObjCProtocolClassDecl;
8621 NewLoaded = Context.getObjCProtocolDecl();
8622 break;
8623
8625 if (Context.Int128Decl)
8626 return Context.Int128Decl;
8627 NewLoaded = Context.getInt128Decl();
8628 break;
8629
8631 if (Context.UInt128Decl)
8632 return Context.UInt128Decl;
8633 NewLoaded = Context.getUInt128Decl();
8634 break;
8635
8637 if (Context.ObjCInstanceTypeDecl)
8638 return Context.ObjCInstanceTypeDecl;
8639 NewLoaded = Context.getObjCInstanceTypeDecl();
8640 break;
8641
8643 if (Context.BuiltinVaListDecl)
8644 return Context.BuiltinVaListDecl;
8645 NewLoaded = Context.getBuiltinVaListDecl();
8646 break;
8647
8649 if (Context.VaListTagDecl)
8650 return Context.VaListTagDecl;
8651 NewLoaded = Context.getVaListTagDecl();
8652 break;
8653
8655 if (Context.BuiltinMSVaListDecl)
8656 return Context.BuiltinMSVaListDecl;
8657 NewLoaded = Context.getBuiltinMSVaListDecl();
8658 break;
8659
8661 if (Context.BuiltinZOSVaListDecl)
8662 return Context.BuiltinZOSVaListDecl;
8663 NewLoaded = Context.getBuiltinZOSVaListDecl();
8664 break;
8665
8667 // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8668 return Context.getMSGuidTagDecl();
8669
8671 if (Context.ExternCContext)
8672 return Context.ExternCContext;
8673 NewLoaded = Context.getExternCContextDecl();
8674 break;
8675
8677 if (Context.CFConstantStringTypeDecl)
8678 return Context.CFConstantStringTypeDecl;
8679 NewLoaded = Context.getCFConstantStringDecl();
8680 break;
8681
8683 if (Context.CFConstantStringTagDecl)
8684 return Context.CFConstantStringTagDecl;
8685 NewLoaded = Context.getCFConstantStringTagDecl();
8686 break;
8687
8689 return Context.getMSTypeInfoTagDecl();
8690
8691#define BuiltinTemplate(BTName) \
8692 case PREDEF_DECL##BTName##_ID: \
8693 if (Context.Decl##BTName) \
8694 return Context.Decl##BTName; \
8695 NewLoaded = Context.get##BTName##Decl(); \
8696 break;
8697#include "clang/Basic/BuiltinTemplates.inc"
8698
8700 llvm_unreachable("Invalid decl ID");
8701 break;
8702 }
8703
8704 assert(NewLoaded && "Failed to load predefined decl?");
8705
8706 if (DeserializationListener)
8707 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8708
8709 return NewLoaded;
8710}
8711
8712unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8713 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8714 if (!OwningModuleFile) {
8715 assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8716 return GlobalID.getRawValue();
8717 }
8718
8719 return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8720}
8721
8723 assert(ContextObj && "reading decl with no AST context");
8724
8725 if (ID < NUM_PREDEF_DECL_IDS) {
8726 Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8727 if (D) {
8728 // Track that we have merged the declaration with ID \p ID into the
8729 // pre-existing predefined declaration \p D.
8730 auto &Merged = KeyDecls[D->getCanonicalDecl()];
8731 if (Merged.empty())
8732 Merged.push_back(ID);
8733 }
8734 return D;
8735 }
8736
8737 unsigned Index = translateGlobalDeclIDToIndex(ID);
8738
8739 if (Index >= DeclsLoaded.size()) {
8740 assert(0 && "declaration ID out-of-range for AST file");
8741 Error("declaration ID out-of-range for AST file");
8742 return nullptr;
8743 }
8744
8745 return DeclsLoaded[Index];
8746}
8747
8749 if (ID < NUM_PREDEF_DECL_IDS)
8750 return GetExistingDecl(ID);
8751
8752 unsigned Index = translateGlobalDeclIDToIndex(ID);
8753
8754 if (Index >= DeclsLoaded.size()) {
8755 assert(0 && "declaration ID out-of-range for AST file");
8756 Error("declaration ID out-of-range for AST file");
8757 return nullptr;
8758 }
8759
8760 if (!DeclsLoaded[Index]) {
8761 ReadDeclRecord(ID);
8762 if (DeserializationListener)
8763 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8764 }
8765
8766 return DeclsLoaded[Index];
8767}
8768
8770 GlobalDeclID GlobalID) {
8771 if (GlobalID < NUM_PREDEF_DECL_IDS)
8772 return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8773
8774 if (!M.ModuleOffsetMap.empty())
8775 ReadModuleOffsetMap(M);
8776
8777 ModuleFile *Owner = getOwningModuleFile(GlobalID);
8778 DeclID ID = GlobalID.getLocalDeclIndex();
8779
8780 if (Owner == &M) {
8781 ID += NUM_PREDEF_DECL_IDS;
8782 return LocalDeclID::get(*this, M, ID);
8783 }
8784
8785 uint64_t OrignalModuleFileIndex = 0;
8786 for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8787 if (M.TransitiveImports[I] == Owner) {
8788 OrignalModuleFileIndex = I + 1;
8789 break;
8790 }
8791
8792 if (!OrignalModuleFileIndex)
8793 return LocalDeclID();
8794
8795 return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8796}
8797
8799 unsigned &Idx) {
8800 if (Idx >= Record.size()) {
8801 Error("Corrupted AST file");
8802 return GlobalDeclID(0);
8803 }
8804
8805 return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8806}
8807
8808/// Resolve the offset of a statement into a statement.
8809///
8810/// This operation will read a new statement from the external
8811/// source each time it is called, and is meant to be used via a
8812/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
8814 // Switch case IDs are per Decl.
8816
8817 // Offset here is a global offset across the entire chain.
8818 RecordLocation Loc = getLocalBitOffset(Offset);
8819 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8820 Error(std::move(Err));
8821 return nullptr;
8822 }
8823 assert(NumCurrentElementsDeserializing == 0 &&
8824 "should not be called while already deserializing");
8825 Deserializing D(this);
8826 return ReadStmtFromStream(*Loc.F);
8827}
8828
8829bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8830 const Decl *D) {
8831 assert(D);
8832
8833 auto It = SpecLookups.find(D);
8834 if (It == SpecLookups.end())
8835 return false;
8836
8837 // Get Decl may violate the iterator from SpecializationsLookups so we store
8838 // the DeclIDs in ahead.
8840 It->second.Table.findAll();
8841
8842 // Since we've loaded all the specializations, we can erase it from
8843 // the lookup table.
8844 SpecLookups.erase(It);
8845
8846 bool NewSpecsFound = false;
8847 Deserializing LookupResults(this);
8848 for (auto &Info : Infos) {
8849 if (GetExistingDecl(Info))
8850 continue;
8851 NewSpecsFound = true;
8852 GetDecl(Info);
8853 }
8854
8855 return NewSpecsFound;
8856}
8857
8859 assert(D);
8860
8862 bool NewSpecsFound =
8863 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8864 if (OnlyPartial)
8865 return NewSpecsFound;
8866
8867 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8868 return NewSpecsFound;
8869}
8870
8871bool ASTReader::LoadExternalSpecializationsImpl(
8872 SpecLookupTableTy &SpecLookups, const Decl *D,
8873 ArrayRef<TemplateArgument> TemplateArgs) {
8874 assert(D);
8875
8876 auto It = SpecLookups.find(D);
8877 if (It == SpecLookups.end())
8878 return false;
8879
8880 Deserializing LookupResults(this);
8881 auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8882
8884 It->second.Table.find(HashValue);
8885
8886 llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8887 std::string Name;
8888 llvm::raw_string_ostream OS(Name);
8889 auto *ND = cast<NamedDecl>(D);
8891 /*Qualified=*/true);
8892 return Name;
8893 });
8894
8895 bool NewSpecsFound = false;
8896 for (auto &Info : Infos) {
8897 if (GetExistingDecl(Info))
8898 continue;
8899 NewSpecsFound = true;
8900 GetDecl(Info);
8901 }
8902
8903 return NewSpecsFound;
8904}
8905
8907 const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8908 assert(D);
8909
8910 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8911 PartialSpecializationsLookups, D, TemplateArgs);
8912 NewDeclsFound |=
8913 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8914
8915 return NewDeclsFound;
8916}
8917
8919 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8920 SmallVectorImpl<Decl *> &Decls) {
8921 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8922
8923 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8924 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8925 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8926 auto K = (Decl::Kind)+LexicalDecls[I];
8927 if (!IsKindWeWant(K))
8928 continue;
8929
8930 auto ID = (DeclID) + LexicalDecls[I + 1];
8931
8932 // Don't add predefined declarations to the lexical context more
8933 // than once.
8934 if (ID < NUM_PREDEF_DECL_IDS) {
8935 if (PredefsVisited[ID])
8936 continue;
8937
8938 PredefsVisited[ID] = true;
8939 }
8940
8941 if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8942 assert(D->getKind() == K && "wrong kind for lexical decl");
8943 if (!DC->isDeclInLexicalTraversal(D))
8944 Decls.push_back(D);
8945 }
8946 }
8947 };
8948
8949 if (isa<TranslationUnitDecl>(DC)) {
8950 for (const auto &Lexical : TULexicalDecls)
8951 Visit(Lexical.first, Lexical.second);
8952 } else {
8953 auto I = LexicalDecls.find(DC);
8954 if (I != LexicalDecls.end())
8955 Visit(I->second.first, I->second.second);
8956 }
8957
8958 ++NumLexicalDeclContextsRead;
8959}
8960
8961namespace {
8962
8963class UnalignedDeclIDComp {
8964 ASTReader &Reader;
8965 ModuleFile &Mod;
8966
8967public:
8968 UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8969 : Reader(Reader), Mod(M) {}
8970
8971 bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8972 SourceLocation LHS = getLocation(L);
8973 SourceLocation RHS = getLocation(R);
8974 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8975 }
8976
8977 bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8978 SourceLocation RHS = getLocation(R);
8979 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8980 }
8981
8982 bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8983 SourceLocation LHS = getLocation(L);
8984 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8985 }
8986
8987 SourceLocation getLocation(unaligned_decl_id_t ID) const {
8988 return Reader.getSourceManager().getFileLoc(
8990 Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8991 }
8992};
8993
8994} // namespace
8995
8997 unsigned Offset, unsigned Length,
8998 SmallVectorImpl<Decl *> &Decls) {
9000
9001 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
9002 if (I == FileDeclIDs.end())
9003 return;
9004
9005 FileDeclsInfo &DInfo = I->second;
9006 if (DInfo.Decls.empty())
9007 return;
9008
9010 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
9011 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
9012
9013 UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
9015 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
9016 if (BeginIt != DInfo.Decls.begin())
9017 --BeginIt;
9018
9019 // If we are pointing at a top-level decl inside an objc container, we need
9020 // to backtrack until we find it otherwise we will fail to report that the
9021 // region overlaps with an objc container.
9022 while (BeginIt != DInfo.Decls.begin() &&
9023 GetDecl(getGlobalDeclID(*DInfo.Mod,
9024 LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
9025 ->isTopLevelDeclInObjCContainer())
9026 --BeginIt;
9027
9029 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
9030 if (EndIt != DInfo.Decls.end())
9031 ++EndIt;
9032
9033 for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
9034 ++DIt)
9035 Decls.push_back(GetDecl(getGlobalDeclID(
9036 *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
9037}
9038
9040 DeclarationName Name,
9041 const DeclContext *OriginalDC) {
9042 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
9043 "DeclContext has no visible decls in storage");
9044 if (!Name)
9045 return false;
9046
9047 // Load the list of declarations.
9048 DeclsSet DS;
9049
9050 auto Find = [&, this](auto &&Table, auto &&Key) {
9051 for (GlobalDeclID ID : Table.find(Key)) {
9053 if (ND->getDeclName() != Name)
9054 continue;
9055 // Special case for namespaces: There can be a lot of redeclarations of
9056 // some namespaces, and we import a "key declaration" per imported module.
9057 // Since all declarations of a namespace are essentially interchangeable,
9058 // we can optimize namespace look-up by only storing the key declaration
9059 // of the current TU, rather than storing N key declarations where N is
9060 // the # of imported modules that declare that namespace.
9061 // TODO: Try to generalize this optimization to other redeclarable decls.
9062 if (isa<NamespaceDecl>(ND))
9064 DS.insert(ND);
9065 }
9066 };
9067
9068 Deserializing LookupResults(this);
9069
9070 // FIXME: Clear the redundancy with templated lambda in C++20 when that's
9071 // available.
9072 if (auto It = Lookups.find(DC); It != Lookups.end()) {
9073 ++NumVisibleDeclContextsRead;
9074 Find(It->second.Table, Name);
9075 }
9076
9077 auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
9078 if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
9079 ++NumModuleLocalVisibleDeclContexts;
9080 Find(It->second.Table, std::make_pair(Name, NamedModule));
9081 }
9082 };
9083 if (auto *NamedModule =
9084 OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
9085 : nullptr)
9086 FindModuleLocalLookup(NamedModule);
9087 // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
9088 // We're going to find a decl but the decl context of the lookup is
9089 // unspecified. In this case, the OriginalDC may be the decl context in other
9090 // module.
9091 if (ContextObj && ContextObj->getCurrentNamedModule())
9092 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
9093
9094 if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
9095 ++NumTULocalVisibleDeclContexts;
9096 Find(It->second.Table, Name);
9097 }
9098
9099 SetExternalVisibleDeclsForName(DC, Name, DS);
9100 return !DS.empty();
9101}
9102
9104 if (!DC->hasExternalVisibleStorage())
9105 return;
9106
9107 DeclsMap Decls;
9108
9109 auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
9110 auto It = LookupTables.find(DC);
9111 if (It == LookupTables.end())
9112 return;
9113
9114 NumRead++;
9115
9116 for (GlobalDeclID ID : It->second.Table.findAll()) {
9118 // Special case for namespaces: There can be a lot of redeclarations of
9119 // some namespaces, and we import a "key declaration" per imported module.
9120 // Since all declarations of a namespace are essentially interchangeable,
9121 // we can optimize namespace look-up by only storing the key declaration
9122 // of the current TU, rather than storing N key declarations where N is
9123 // the # of imported modules that declare that namespace.
9124 // TODO: Try to generalize this optimization to other redeclarable decls.
9125 if (isa<NamespaceDecl>(ND))
9127 Decls[ND->getDeclName()].insert(ND);
9128 }
9129
9130 // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
9131 };
9132
9133 findAll(Lookups, NumVisibleDeclContextsRead);
9134 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9135 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9136
9137 for (auto &[Name, DS] : Decls)
9138 SetExternalVisibleDeclsForName(DC, Name, DS);
9139
9140 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
9141}
9142
9145 auto I = Lookups.find(Primary);
9146 return I == Lookups.end() ? nullptr : &I->second;
9147}
9148
9151 auto I = ModuleLocalLookups.find(Primary);
9152 return I == ModuleLocalLookups.end() ? nullptr : &I->second;
9153}
9154
9157 auto I = TULocalLookups.find(Primary);
9158 return I == TULocalLookups.end() ? nullptr : &I->second;
9159}
9160
9163 assert(D->isCanonicalDecl());
9164 auto &LookupTable =
9165 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9166 auto I = LookupTable.find(D);
9167 return I == LookupTable.end() ? nullptr : &I->second;
9168}
9169
9171 assert(D->isCanonicalDecl());
9172 return PartialSpecializationsLookups.contains(D) ||
9173 SpecializationsLookups.contains(D);
9174}
9175
9176/// Under non-PCH compilation the consumer receives the objc methods
9177/// before receiving the implementation, and codegen depends on this.
9178/// We simulate this by deserializing and passing to consumer the methods of the
9179/// implementation before passing the deserialized implementation decl.
9181 ASTConsumer *Consumer) {
9182 assert(ImplD && Consumer);
9183
9184 for (auto *I : ImplD->methods())
9185 Consumer->HandleInterestingDecl(DeclGroupRef(I));
9186
9187 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
9188}
9189
9190void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9191 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9192 PassObjCImplDeclToConsumer(ImplD, Consumer);
9193 else
9194 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9195}
9196
9197void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9198 Consumer->HandleVTable(RD);
9199}
9200
9202 this->Consumer = Consumer;
9203
9204 if (Consumer)
9205 PassInterestingDeclsToConsumer();
9206
9207 if (DeserializationListener)
9208 DeserializationListener->ReaderInitialized(this);
9209}
9210
9212 std::fprintf(stderr, "*** AST File Statistics:\n");
9213
9214 unsigned NumTypesLoaded =
9215 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
9216 unsigned NumDeclsLoaded =
9217 DeclsLoaded.size() -
9218 llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
9219 unsigned NumIdentifiersLoaded =
9220 IdentifiersLoaded.size() -
9221 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
9222 unsigned NumMacrosLoaded =
9223 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
9224 unsigned NumSelectorsLoaded =
9225 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
9226
9227 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
9228 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
9229 NumSLocEntriesRead, TotalNumSLocEntries,
9230 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9231 if (!TypesLoaded.empty())
9232 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
9233 NumTypesLoaded, (unsigned)TypesLoaded.size(),
9234 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
9235 if (!DeclsLoaded.empty())
9236 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
9237 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
9238 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9239 if (!IdentifiersLoaded.empty())
9240 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
9241 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
9242 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9243 if (!MacrosLoaded.empty())
9244 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9245 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
9246 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9247 if (!SelectorsLoaded.empty())
9248 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
9249 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
9250 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9251 if (TotalNumStatements)
9252 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
9253 NumStatementsRead, TotalNumStatements,
9254 ((float)NumStatementsRead/TotalNumStatements * 100));
9255 if (TotalNumMacros)
9256 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9257 NumMacrosRead, TotalNumMacros,
9258 ((float)NumMacrosRead/TotalNumMacros * 100));
9259 if (TotalLexicalDeclContexts)
9260 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
9261 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9262 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9263 * 100));
9264 if (TotalVisibleDeclContexts)
9265 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
9266 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9267 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9268 * 100));
9269 if (TotalModuleLocalVisibleDeclContexts)
9270 std::fprintf(
9271 stderr, " %u/%u module local visible declcontexts read (%f%%)\n",
9272 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9273 ((float)NumModuleLocalVisibleDeclContexts /
9274 TotalModuleLocalVisibleDeclContexts * 100));
9275 if (TotalTULocalVisibleDeclContexts)
9276 std::fprintf(stderr, " %u/%u visible declcontexts in GMF read (%f%%)\n",
9277 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9278 ((float)NumTULocalVisibleDeclContexts /
9279 TotalTULocalVisibleDeclContexts * 100));
9280 if (TotalNumMethodPoolEntries)
9281 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
9282 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9283 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9284 * 100));
9285 if (NumMethodPoolLookups)
9286 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
9287 NumMethodPoolHits, NumMethodPoolLookups,
9288 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9289 if (NumMethodPoolTableLookups)
9290 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
9291 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9292 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9293 * 100.0));
9294 if (NumIdentifierLookupHits)
9295 std::fprintf(stderr,
9296 " %u / %u identifier table lookups succeeded (%f%%)\n",
9297 NumIdentifierLookupHits, NumIdentifierLookups,
9298 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9299
9300 if (GlobalIndex) {
9301 std::fprintf(stderr, "\n");
9302 GlobalIndex->printStats();
9303 }
9304
9305 std::fprintf(stderr, "\n");
9306 dump();
9307 std::fprintf(stderr, "\n");
9308}
9309
9310template<typename Key, typename ModuleFile, unsigned InitialCapacity>
9311LLVM_DUMP_METHOD static void
9312dumpModuleIDMap(StringRef Name,
9313 const ContinuousRangeMap<Key, ModuleFile *,
9314 InitialCapacity> &Map) {
9315 if (Map.begin() == Map.end())
9316 return;
9317
9319
9320 llvm::errs() << Name << ":\n";
9321 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9322 I != IEnd; ++I)
9323 llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName
9324 << "\n";
9325}
9326
9327LLVM_DUMP_METHOD void ASTReader::dump() {
9328 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
9329 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
9330 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
9331 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
9332 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
9333 dumpModuleIDMap("Global preprocessed entity map",
9334 GlobalPreprocessedEntityMap);
9335
9336 llvm::errs() << "\n*** PCH/Modules Loaded:";
9337 for (ModuleFile &M : ModuleMgr)
9338 M.dump();
9339}
9340
9341/// Return the amount of memory used by memory buffers, breaking down
9342/// by heap-backed versus mmap'ed memory.
9344 for (ModuleFile &I : ModuleMgr) {
9345 if (llvm::MemoryBuffer *buf = I.Buffer) {
9346 size_t bytes = buf->getBufferSize();
9347 switch (buf->getBufferKind()) {
9348 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9349 sizes.malloc_bytes += bytes;
9350 break;
9351 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9352 sizes.mmap_bytes += bytes;
9353 break;
9354 }
9355 }
9356 }
9357}
9358
9360 SemaObj = &S;
9361 S.addExternalSource(this);
9362
9363 // Makes sure any declarations that were deserialized "too early"
9364 // still get added to the identifier's declaration chains.
9365 for (GlobalDeclID ID : PreloadedDeclIDs) {
9367 pushExternalDeclIntoScope(D, D->getDeclName());
9368 }
9369 PreloadedDeclIDs.clear();
9370
9371 // FIXME: What happens if these are changed by a module import?
9372 if (!FPPragmaOptions.empty()) {
9373 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
9374 FPOptionsOverride NewOverrides =
9375 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
9376 SemaObj->CurFPFeatures =
9377 NewOverrides.applyOverrides(SemaObj->getLangOpts());
9378 }
9379
9380 for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
9381 Decl *D = GetDecl(ID);
9382 if (auto *FD = dyn_cast<FunctionDecl>(D))
9383 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9384 else if (auto *BD = dyn_cast<BlockDecl>(D))
9385 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9386 else
9387 llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
9388 }
9389 DeclsWithEffectsToVerify.clear();
9390
9391 SemaObj->OpenCLFeatures = OpenCLExtensions;
9392
9393 UpdateSema();
9394}
9395
9397 assert(SemaObj && "no Sema to update");
9398
9399 // UpdateSema() runs after each AST file is loaded, not only the first, so a
9400 // 'requires' directive from a module is registered too.
9401 for (GlobalDeclID ID : OpenMPRequiresDecls)
9402 SemaObj->OpenMP().addRequiresDecl(cast<OMPRequiresDecl>(GetDecl(ID)));
9403 OpenMPRequiresDecls.clear();
9404
9405 // Load the offsets of the declarations that Sema references.
9406 // They will be lazily deserialized when needed.
9407 if (!SemaDeclRefs.empty()) {
9408 assert(SemaDeclRefs.size() % 3 == 0);
9409 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9410 if (!SemaObj->StdNamespace)
9411 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9412 if (!SemaObj->StdBadAlloc)
9413 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9414 if (!SemaObj->StdAlignValT)
9415 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9416 }
9417 SemaDeclRefs.clear();
9418 }
9419
9420 // Update the state of pragmas. Use the same API as if we had encountered the
9421 // pragma in the source.
9422 if(OptimizeOffPragmaLocation.isValid())
9423 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
9424 if (PragmaMSStructState != -1)
9425 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
9426 if (PointersToMembersPragmaLocation.isValid()) {
9427 SemaObj->ActOnPragmaMSPointersToMembers(
9429 PragmaMSPointersToMembersState,
9430 PointersToMembersPragmaLocation);
9431 }
9432 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9433 if (!RISCVVecIntrinsicPragma.empty()) {
9434 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9435 "Wrong number of RISCVVecIntrinsicPragma");
9436 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9437 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9438 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9439 }
9440
9441 if (PragmaAlignPackCurrentValue) {
9442 // The bottom of the stack might have a default value. It must be adjusted
9443 // to the current value to ensure that the packing state is preserved after
9444 // popping entries that were included/imported from a PCH/module.
9445 bool DropFirst = false;
9446 if (!PragmaAlignPackStack.empty() &&
9447 PragmaAlignPackStack.front().Location.isInvalid()) {
9448 assert(PragmaAlignPackStack.front().Value ==
9449 SemaObj->AlignPackStack.DefaultValue &&
9450 "Expected a default alignment value");
9451 SemaObj->AlignPackStack.Stack.emplace_back(
9452 PragmaAlignPackStack.front().SlotLabel,
9453 SemaObj->AlignPackStack.CurrentValue,
9454 SemaObj->AlignPackStack.CurrentPragmaLocation,
9455 PragmaAlignPackStack.front().PushLocation);
9456 DropFirst = true;
9457 }
9458 for (const auto &Entry :
9459 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9460 SemaObj->AlignPackStack.Stack.emplace_back(
9461 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9462 }
9463 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9464 assert(*PragmaAlignPackCurrentValue ==
9465 SemaObj->AlignPackStack.DefaultValue &&
9466 "Expected a default align and pack value");
9467 // Keep the current values.
9468 } else {
9469 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9470 SemaObj->AlignPackStack.CurrentPragmaLocation =
9471 PragmaAlignPackCurrentLocation;
9472 }
9473 }
9474 if (FpPragmaCurrentValue) {
9475 // The bottom of the stack might have a default value. It must be adjusted
9476 // to the current value to ensure that fp-pragma state is preserved after
9477 // popping entries that were included/imported from a PCH/module.
9478 bool DropFirst = false;
9479 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9480 assert(FpPragmaStack.front().Value ==
9481 SemaObj->FpPragmaStack.DefaultValue &&
9482 "Expected a default pragma float_control value");
9483 SemaObj->FpPragmaStack.Stack.emplace_back(
9484 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9485 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9486 FpPragmaStack.front().PushLocation);
9487 DropFirst = true;
9488 }
9489 for (const auto &Entry :
9490 llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
9491 SemaObj->FpPragmaStack.Stack.emplace_back(
9492 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9493 if (FpPragmaCurrentLocation.isInvalid()) {
9494 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9495 "Expected a default pragma float_control value");
9496 // Keep the current values.
9497 } else {
9498 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9499 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9500 }
9501 }
9502
9503 // For non-modular AST files, restore visiblity of modules.
9504 for (auto &Import : PendingImportedModulesSema) {
9505 if (Import.ImportLoc.isInvalid())
9506 continue;
9507 if (Module *Imported = getSubmodule(Import.ID)) {
9508 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9509 }
9510 }
9511 PendingImportedModulesSema.clear();
9512}
9513
9515 // Note that we are loading an identifier.
9516 Deserializing AnIdentifier(this);
9517
9518 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
9519 NumIdentifierLookups,
9520 NumIdentifierLookupHits);
9521
9522 // We don't need to do identifier table lookups in C++ modules (we preload
9523 // all interesting declarations, and don't need to use the scope for name
9524 // lookups). Perform the lookup in PCH files, though, since we don't build
9525 // a complete initial identifier table if we're carrying on from a PCH.
9526 if (PP.getLangOpts().CPlusPlus) {
9527 for (auto *F : ModuleMgr.pch_modules())
9528 if (Visitor(*F))
9529 break;
9530 } else {
9531 // If there is a global index, look there first to determine which modules
9532 // provably do not have any results for this identifier.
9534 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9535 if (!loadGlobalIndex()) {
9536 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9537 HitsPtr = &Hits;
9538 }
9539 }
9540
9541 ModuleMgr.visit(Visitor, HitsPtr);
9542 }
9543
9544 IdentifierInfo *II = Visitor.getIdentifierInfo();
9546 return II;
9547}
9548
9549namespace clang {
9550
9551 /// An identifier-lookup iterator that enumerates all of the
9552 /// identifiers stored within a set of AST files.
9554 /// The AST reader whose identifiers are being enumerated.
9555 const ASTReader &Reader;
9556
9557 /// The current index into the chain of AST files stored in
9558 /// the AST reader.
9559 unsigned Index;
9560
9561 /// The current position within the identifier lookup table
9562 /// of the current AST file.
9563 ASTIdentifierLookupTable::key_iterator Current;
9564
9565 /// The end position within the identifier lookup table of
9566 /// the current AST file.
9567 ASTIdentifierLookupTable::key_iterator End;
9568
9569 /// Whether to skip any modules in the ASTReader.
9570 bool SkipModules;
9571
9572 public:
9573 explicit ASTIdentifierIterator(const ASTReader &Reader,
9574 bool SkipModules = false);
9575
9576 StringRef Next() override;
9577 };
9578
9579} // namespace clang
9580
9582 bool SkipModules)
9583 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9584}
9585
9587 while (Current == End) {
9588 // If we have exhausted all of our AST files, we're done.
9589 if (Index == 0)
9590 return StringRef();
9591
9592 --Index;
9593 ModuleFile &F = Reader.ModuleMgr[Index];
9594 if (SkipModules && F.isModule())
9595 continue;
9596
9597 ASTIdentifierLookupTable *IdTable =
9599 Current = IdTable->key_begin();
9600 End = IdTable->key_end();
9601 }
9602
9603 // We have any identifiers remaining in the current AST file; return
9604 // the next one.
9605 StringRef Result = *Current;
9606 ++Current;
9607 return Result;
9608}
9609
9610namespace {
9611
9612/// A utility for appending two IdentifierIterators.
9613class ChainedIdentifierIterator : public IdentifierIterator {
9614 std::unique_ptr<IdentifierIterator> Current;
9615 std::unique_ptr<IdentifierIterator> Queued;
9616
9617public:
9618 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9619 std::unique_ptr<IdentifierIterator> Second)
9620 : Current(std::move(First)), Queued(std::move(Second)) {}
9621
9622 StringRef Next() override {
9623 if (!Current)
9624 return StringRef();
9625
9626 StringRef result = Current->Next();
9627 if (!result.empty())
9628 return result;
9629
9630 // Try the queued iterator, which may itself be empty.
9631 Current.reset();
9632 std::swap(Current, Queued);
9633 return Next();
9634 }
9635};
9636
9637} // namespace
9638
9640 if (!loadGlobalIndex()) {
9641 std::unique_ptr<IdentifierIterator> ReaderIter(
9642 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9643 std::unique_ptr<IdentifierIterator> ModulesIter(
9644 GlobalIndex->createIdentifierIterator());
9645 return new ChainedIdentifierIterator(std::move(ReaderIter),
9646 std::move(ModulesIter));
9647 }
9648
9649 return new ASTIdentifierIterator(*this);
9650}
9651
9652namespace clang {
9653namespace serialization {
9654
9656 ASTReader &Reader;
9657 Selector Sel;
9658 unsigned PriorGeneration;
9659 unsigned InstanceBits = 0;
9660 unsigned FactoryBits = 0;
9661 bool InstanceHasMoreThanOneDecl = false;
9662 bool FactoryHasMoreThanOneDecl = false;
9663 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9664 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9665
9666 public:
9668 unsigned PriorGeneration)
9669 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9670
9672 if (!M.SelectorLookupTable)
9673 return false;
9674
9675 // If we've already searched this module file, skip it now.
9676 if (M.Generation <= PriorGeneration)
9677 return true;
9678
9679 ++Reader.NumMethodPoolTableLookups;
9680 ASTSelectorLookupTable *PoolTable
9682 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9683 if (Pos == PoolTable->end())
9684 return false;
9685
9686 ++Reader.NumMethodPoolTableHits;
9687 ++Reader.NumSelectorsRead;
9688 // FIXME: Not quite happy with the statistics here. We probably should
9689 // disable this tracking when called via LoadSelector.
9690 // Also, should entries without methods count as misses?
9691 ++Reader.NumMethodPoolEntriesRead;
9693 if (Reader.DeserializationListener)
9694 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9695
9696 // Append methods in the reverse order, so that later we can process them
9697 // in the order they appear in the source code by iterating through
9698 // the vector in the reverse order.
9699 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9700 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9701 InstanceBits = Data.InstanceBits;
9702 FactoryBits = Data.FactoryBits;
9703 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9704 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9705 return false;
9706 }
9707
9708 /// Retrieve the instance methods found by this visitor.
9710 return InstanceMethods;
9711 }
9712
9713 /// Retrieve the instance methods found by this visitor.
9715 return FactoryMethods;
9716 }
9717
9718 unsigned getInstanceBits() const { return InstanceBits; }
9719 unsigned getFactoryBits() const { return FactoryBits; }
9720
9722 return InstanceHasMoreThanOneDecl;
9723 }
9724
9725 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9726 };
9727
9728} // namespace serialization
9729} // namespace clang
9730
9731/// Add the given set of methods to the method list.
9733 ObjCMethodList &List) {
9734 for (ObjCMethodDecl *M : llvm::reverse(Methods))
9735 S.ObjC().addMethodToGlobalList(&List, M);
9736}
9737
9739 // Get the selector generation and update it to the current generation.
9740 unsigned &Generation = SelectorGeneration[Sel];
9741 unsigned PriorGeneration = Generation;
9742 Generation = getGeneration();
9743 SelectorOutOfDate[Sel] = false;
9744
9745 // Search for methods defined with this selector.
9746 ++NumMethodPoolLookups;
9747 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9748 ModuleMgr.visit(Visitor);
9749
9750 if (Visitor.getInstanceMethods().empty() &&
9751 Visitor.getFactoryMethods().empty())
9752 return;
9753
9754 ++NumMethodPoolHits;
9755
9756 if (!getSema())
9757 return;
9758
9759 Sema &S = *getSema();
9760 auto &Methods = S.ObjC().MethodPool[Sel];
9761
9762 Methods.first.setBits(Visitor.getInstanceBits());
9763 Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9764 Methods.second.setBits(Visitor.getFactoryBits());
9765 Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9766
9767 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9768 // when building a module we keep every method individually and may need to
9769 // update hasMoreThanOneDecl as we add the methods.
9770 addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9771 addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9772}
9773
9775 if (SelectorOutOfDate[Sel])
9776 ReadMethodPool(Sel);
9777}
9778
9781 Namespaces.clear();
9782
9783 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9784 if (NamespaceDecl *Namespace
9785 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9786 Namespaces.push_back(Namespace);
9787 }
9788}
9789
9791 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9792 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9793 UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9796 Undefined.insert(std::make_pair(D, Loc));
9797 }
9798 UndefinedButUsed.clear();
9799}
9800
9802 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9803 Exprs) {
9804 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9805 FieldDecl *FD =
9806 cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9807 uint64_t Count = DelayedDeleteExprs[Idx++];
9808 for (uint64_t C = 0; C < Count; ++C) {
9809 SourceLocation DeleteLoc =
9810 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9811 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9812 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9813 }
9814 }
9815}
9816
9818 SmallVectorImpl<VarDecl *> &TentativeDefs) {
9819 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9820 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9821 if (Var)
9822 TentativeDefs.push_back(Var);
9823 }
9824 TentativeDefinitions.clear();
9825}
9826
9829 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9831 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9832 if (D)
9833 Decls.push_back(D);
9834 }
9835 UnusedFileScopedDecls.clear();
9836}
9837
9840 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9842 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9843 if (D)
9844 Decls.push_back(D);
9845 }
9846 DelegatingCtorDecls.clear();
9847}
9848
9850 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9852 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9853 if (D)
9854 Decls.push_back(D);
9855 }
9856 ExtVectorDecls.clear();
9857}
9858
9860 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9861 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9862 ++I) {
9863 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9864 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9865 if (D)
9866 Decls.insert(D);
9867 }
9868 UnusedLocalTypedefNameCandidates.clear();
9869}
9870
9873 for (auto I : DeclsToCheckForDeferredDiags) {
9874 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9875 if (D)
9876 Decls.insert(D);
9877 }
9878 DeclsToCheckForDeferredDiags.clear();
9879}
9880
9882 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9883 if (ReferencedSelectorsData.empty())
9884 return;
9885
9886 // If there are @selector references added them to its pool. This is for
9887 // implementation of -Wselector.
9888 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9889 unsigned I = 0;
9890 while (I < DataSize) {
9891 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9892 SourceLocation SelLoc
9893 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9894 Sels.push_back(std::make_pair(Sel, SelLoc));
9895 }
9896 ReferencedSelectorsData.clear();
9897}
9898
9900 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9901 if (WeakUndeclaredIdentifiers.empty())
9902 return;
9903
9904 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9905 IdentifierInfo *WeakId
9906 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9907 IdentifierInfo *AliasId
9908 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9909 SourceLocation Loc =
9910 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9911 WeakInfo WI(AliasId, Loc);
9912 WeakIDs.push_back(std::make_pair(WeakId, WI));
9913 }
9914 WeakUndeclaredIdentifiers.clear();
9915}
9916
9918 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9919 if (ExtnameUndeclaredIdentifiers.empty())
9920 return;
9921
9922 for (unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9923 IdentifierInfo *NameId =
9924 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I]);
9925 IdentifierInfo *ExtnameId =
9926 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I + 1]);
9927 SourceLocation Loc =
9928 SourceLocation::getFromRawEncoding(ExtnameUndeclaredIdentifiers[I + 2]);
9929 AsmLabelAttr *Attr = AsmLabelAttr::CreateImplicit(
9930 getContext(), ExtnameId->getName(),
9931 AttributeCommonInfo(ExtnameId, SourceRange(Loc),
9933 ExtnameIDs.push_back(std::make_pair(NameId, Attr));
9934 }
9935 ExtnameUndeclaredIdentifiers.clear();
9936}
9937
9939 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9941 VTableUse &TableInfo = VTableUses[Idx++];
9942 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9943 VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9944 VT.DefinitionRequired = TableInfo.Used;
9945 VTables.push_back(VT);
9946 }
9947
9948 VTableUses.clear();
9949}
9950
9952 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9953 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9954 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9955 ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9957
9958 Pending.push_back(std::make_pair(D, Loc));
9959 }
9960 PendingInstantiations.clear();
9961}
9962
9964 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9965 &LPTMap) {
9966 for (auto &LPT : LateParsedTemplates) {
9967 ModuleFile *FMod = LPT.first;
9968 RecordDataImpl &LateParsed = LPT.second;
9969 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9970 /* In loop */) {
9971 FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9972
9973 auto LT = std::make_unique<LateParsedTemplate>();
9974 LT->D = ReadDecl(*FMod, LateParsed, Idx);
9975 LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9976
9977 ModuleFile *F = getOwningModuleFile(LT->D);
9978 assert(F && "No module");
9979
9980 unsigned TokN = LateParsed[Idx++];
9981 LT->Toks.reserve(TokN);
9982 for (unsigned T = 0; T < TokN; ++T)
9983 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9984
9985 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9986 }
9987 }
9988
9989 LateParsedTemplates.clear();
9990}
9991
9993 // It would be complicated to avoid reading the methods anyway. So don't.
9994 ReadMethodPool(Sel);
9995}
9996
9998 assert(ID && "Non-zero identifier ID required");
9999 unsigned Index = translateIdentifierIDToIndex(ID).second;
10000 assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
10001 IdentifiersLoaded[Index] = II;
10002 if (DeserializationListener)
10003 DeserializationListener->IdentifierRead(ID, II);
10004}
10005
10006/// Set the globally-visible declarations associated with the given
10007/// identifier.
10008///
10009/// If the AST reader is currently in a state where the given declaration IDs
10010/// cannot safely be resolved, they are queued until it is safe to resolve
10011/// them.
10012///
10013/// \param II an IdentifierInfo that refers to one or more globally-visible
10014/// declarations.
10015///
10016/// \param DeclIDs the set of declaration IDs with the name @p II that are
10017/// visible at global scope.
10018///
10019/// \param Decls if non-null, this vector will be populated with the set of
10020/// deserialized declarations. These declarations will not be pushed into
10021/// scope.
10024 SmallVectorImpl<Decl *> *Decls) {
10025 if (NumCurrentElementsDeserializing && !Decls) {
10026 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
10027 return;
10028 }
10029
10030 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
10031 if (!SemaObj) {
10032 // Queue this declaration so that it will be added to the
10033 // translation unit scope and identifier's declaration chain
10034 // once a Sema object is known.
10035 PreloadedDeclIDs.push_back(DeclIDs[I]);
10036 continue;
10037 }
10038
10039 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
10040
10041 // If we're simply supposed to record the declarations, do so now.
10042 if (Decls) {
10043 Decls->push_back(D);
10044 continue;
10045 }
10046
10047 // Introduce this declaration into the translation-unit scope
10048 // and add it to the declaration chain for this identifier, so
10049 // that (unqualified) name lookup will find it.
10050 pushExternalDeclIntoScope(D, II);
10051 }
10052}
10053
10054std::pair<ModuleFile *, unsigned>
10055ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
10056 if (ID == 0)
10057 return {nullptr, 0};
10058
10059 unsigned ModuleFileIndex = ID >> 32;
10060 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
10061
10062 assert(ModuleFileIndex && "not translating loaded IdentifierID?");
10063 assert(getModuleManager().size() > ModuleFileIndex - 1);
10064
10065 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10066 assert(LocalID < MF.LocalNumIdentifiers);
10067 return {&MF, MF.BaseIdentifierID + LocalID};
10068}
10069
10071 if (ID == 0)
10072 return nullptr;
10073
10074 if (IdentifiersLoaded.empty()) {
10075 Error("no identifier table in AST file");
10076 return nullptr;
10077 }
10078
10079 auto [M, Index] = translateIdentifierIDToIndex(ID);
10080 if (!IdentifiersLoaded[Index]) {
10081 assert(M != nullptr && "Untranslated Identifier ID?");
10082 assert(Index >= M->BaseIdentifierID);
10083 unsigned LocalIndex = Index - M->BaseIdentifierID;
10084 const unsigned char *Data =
10085 M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
10086
10087 ASTIdentifierLookupTrait Trait(*this, *M);
10088 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
10089 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
10090 auto &II = PP.getIdentifierTable().get(Key);
10091 IdentifiersLoaded[Index] = &II;
10092 bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
10093 markIdentifierFromAST(*this, II, IsModule);
10094 if (DeserializationListener)
10095 DeserializationListener->IdentifierRead(ID, &II);
10096 }
10097
10098 return IdentifiersLoaded[Index];
10099}
10100
10104
10106 if (LocalID < NUM_PREDEF_IDENT_IDS)
10107 return LocalID;
10108
10109 if (!M.ModuleOffsetMap.empty())
10110 ReadModuleOffsetMap(M);
10111
10112 unsigned ModuleFileIndex = LocalID >> 32;
10113 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10114 ModuleFile *MF =
10115 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10116 assert(MF && "malformed identifier ID encoding?");
10117
10118 if (!ModuleFileIndex)
10119 LocalID -= NUM_PREDEF_IDENT_IDS;
10120
10121 return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
10122}
10123
10124std::pair<ModuleFile *, unsigned>
10125ASTReader::translateMacroIDToIndex(MacroID ID) const {
10126 if (ID == 0)
10127 return {nullptr, 0};
10128
10129 unsigned ModuleFileIndex = ID >> 32;
10130 assert(ModuleFileIndex && "not translating loaded MacroID?");
10131 assert(getModuleManager().size() > ModuleFileIndex - 1);
10132 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10133
10134 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10135 assert(LocalID < MF.LocalNumMacros);
10136 return {&MF, MF.BaseMacroID + LocalID};
10137}
10138
10140 if (ID == 0)
10141 return nullptr;
10142
10143 if (MacrosLoaded.empty()) {
10144 Error("no macro table in AST file");
10145 return nullptr;
10146 }
10147
10148 auto [M, Index] = translateMacroIDToIndex(ID);
10149 if (!MacrosLoaded[Index]) {
10150 assert(M != nullptr && "Untranslated Macro ID?");
10151 assert(Index >= M->BaseMacroID);
10152 unsigned LocalIndex = Index - M->BaseMacroID;
10153 uint64_t DataOffset = M->MacroOffsetsBase + M->MacroOffsets[LocalIndex];
10154 MacrosLoaded[Index] = ReadMacroRecord(*M, DataOffset);
10155
10156 if (DeserializationListener)
10157 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10158 }
10159
10160 return MacrosLoaded[Index];
10161}
10162
10164 if (LocalID < NUM_PREDEF_MACRO_IDS)
10165 return LocalID;
10166
10167 if (!M.ModuleOffsetMap.empty())
10168 ReadModuleOffsetMap(M);
10169
10170 unsigned ModuleFileIndex = LocalID >> 32;
10171 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10172 ModuleFile *MF =
10173 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10174 assert(MF && "malformed identifier ID encoding?");
10175
10176 if (!ModuleFileIndex) {
10177 assert(LocalID >= NUM_PREDEF_MACRO_IDS);
10178 LocalID -= NUM_PREDEF_MACRO_IDS;
10179 }
10180
10181 return (static_cast<MacroID>(MF->Index + 1) << 32) | LocalID;
10182}
10183
10185ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
10186 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
10187 return LocalID;
10188
10189 if (!M.ModuleOffsetMap.empty())
10190 ReadModuleOffsetMap(M);
10191
10194 assert(I != M.SubmoduleRemap.end()
10195 && "Invalid index into submodule index remap");
10196
10197 return LocalID + I->second;
10198}
10199
10201 return getSubmodule(ID);
10202}
10203
10205 if (ID & 1) {
10206 // It's a module, look it up by submodule ID.
10207 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
10208 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
10209 } else {
10210 // It's a prefix (preamble, PCH, ...). Look it up by index.
10211 int IndexFromEnd = static_cast<int>(ID >> 1);
10212 assert(IndexFromEnd && "got reference to unknown module file");
10213 return getModuleManager().pch_modules().end()[-IndexFromEnd];
10214 }
10215}
10216
10218 if (!M)
10219 return 1;
10220
10221 // For a file representing a module, use the submodule ID of the top-level
10222 // module as the file ID. For any other kind of file, the number of such
10223 // files loaded beforehand will be the same on reload.
10224 // FIXME: Is this true even if we have an explicit module file and a PCH?
10225 if (M->isModule())
10226 return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
10227
10228 auto PCHModules = getModuleManager().pch_modules();
10229 auto I = llvm::find(PCHModules, M);
10230 assert(I != PCHModules.end() && "emitting reference to unknown file");
10231 return std::distance(I, PCHModules.end()) << 1;
10232}
10233
10234std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
10235 if (Module *M = getSubmodule(ID))
10236 return ASTSourceDescriptor(*M);
10237
10238 // If there is only a single PCH, return it instead.
10239 // Chained PCH are not supported.
10240 const auto &PCHChain = ModuleMgr.pch_modules();
10241 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10242 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10243 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
10244 StringRef FileName = llvm::sys::path::filename(MF.FileName);
10245 return ASTSourceDescriptor(ModuleName,
10246 llvm::sys::path::parent_path(MF.FileName),
10247 FileName, MF.Signature);
10248 }
10249 return std::nullopt;
10250}
10251
10253 auto I = DefinitionSource.find(FD);
10254 if (I == DefinitionSource.end())
10255 return EK_ReplyHazy;
10256 return I->second ? EK_Never : EK_Always;
10257}
10258
10260 return ThisDeclarationWasADefinitionSet.contains(FD);
10261}
10262
10264 return DecodeSelector(getGlobalSelectorID(M, LocalID));
10265}
10266
10268 if (ID == 0)
10269 return Selector();
10270
10271 if (ID > SelectorsLoaded.size()) {
10272 Error("selector ID out of range in AST file");
10273 return Selector();
10274 }
10275
10276 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
10277 // Load this selector from the selector table.
10278 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
10279 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
10280 ModuleFile &M = *I->second;
10281 ASTSelectorLookupTrait Trait(*this, M);
10282 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
10283 SelectorsLoaded[ID - 1] =
10284 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
10285 if (DeserializationListener)
10286 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10287 }
10288
10289 return SelectorsLoaded[ID - 1];
10290}
10291
10295
10297 // ID 0 (the null selector) is considered an external selector.
10298 return getTotalNumSelectors() + 1;
10299}
10300
10302ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
10303 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
10304 return LocalID;
10305
10306 if (!M.ModuleOffsetMap.empty())
10307 ReadModuleOffsetMap(M);
10308
10311 assert(I != M.SelectorRemap.end()
10312 && "Invalid index into selector index remap");
10313
10314 return LocalID + I->second;
10315}
10316
10342
10344 DeclarationNameInfo NameInfo;
10345 NameInfo.setName(readDeclarationName());
10346 NameInfo.setLoc(readSourceLocation());
10347 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
10348 return NameInfo;
10349}
10350
10354
10356 auto Kind = readInt();
10357 auto ResultType = readQualType();
10358 auto Value = readAPInt();
10359 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
10360 assert(Op.isValid());
10361 return Op;
10362}
10363
10366 unsigned NumTPLists = readInt();
10367 Info.NumTemplParamLists = NumTPLists;
10368 if (NumTPLists) {
10369 Info.TemplParamLists =
10370 new (getContext()) TemplateParameterList *[NumTPLists];
10371 for (unsigned i = 0; i != NumTPLists; ++i)
10373 }
10374}
10375
10378 SourceLocation TemplateLoc = readSourceLocation();
10379 SourceLocation LAngleLoc = readSourceLocation();
10380 SourceLocation RAngleLoc = readSourceLocation();
10381
10382 unsigned NumParams = readInt();
10384 Params.reserve(NumParams);
10385 while (NumParams--)
10386 Params.push_back(readDeclAs<NamedDecl>());
10387
10388 bool HasRequiresClause = readBool();
10389 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
10390
10392 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10393 return TemplateParams;
10394}
10395
10398 bool Canonicalize) {
10399 unsigned NumTemplateArgs = readInt();
10400 TemplArgs.reserve(NumTemplateArgs);
10401 while (NumTemplateArgs--)
10402 TemplArgs.push_back(readTemplateArgument(Canonicalize));
10403}
10404
10405/// Read a UnresolvedSet structure.
10407 unsigned NumDecls = readInt();
10408 Set.reserve(getContext(), NumDecls);
10409 while (NumDecls--) {
10410 GlobalDeclID ID = readDeclID();
10412 Set.addLazyDecl(getContext(), ID, AS);
10413 }
10414}
10415
10418 bool isVirtual = readBool();
10419 bool isBaseOfClass = readBool();
10420 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
10421 bool inheritConstructors = readBool();
10423 SourceRange Range = readSourceRange();
10424 SourceLocation EllipsisLoc = readSourceLocation();
10425 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
10426 EllipsisLoc);
10427 Result.setInheritConstructors(inheritConstructors);
10428 return Result;
10429}
10430
10433 ASTContext &Context = getContext();
10434 unsigned NumInitializers = readInt();
10435 assert(NumInitializers && "wrote ctor initializers but have no inits");
10436 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
10437 for (unsigned i = 0; i != NumInitializers; ++i) {
10438 TypeSourceInfo *TInfo = nullptr;
10439 bool IsBaseVirtual = false;
10440 FieldDecl *Member = nullptr;
10441 IndirectFieldDecl *IndirectMember = nullptr;
10442
10444 switch (Type) {
10446 TInfo = readTypeSourceInfo();
10447 IsBaseVirtual = readBool();
10448 break;
10449
10451 TInfo = readTypeSourceInfo();
10452 break;
10453
10456 break;
10457
10459 IndirectMember = readDeclAs<IndirectFieldDecl>();
10460 break;
10461 }
10462
10463 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
10464 Expr *Init = readExpr();
10465 SourceLocation LParenLoc = readSourceLocation();
10466 SourceLocation RParenLoc = readSourceLocation();
10467
10468 CXXCtorInitializer *BOMInit;
10470 BOMInit = new (Context)
10471 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
10472 RParenLoc, MemberOrEllipsisLoc);
10474 BOMInit = new (Context)
10475 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
10476 else if (Member)
10477 BOMInit = new (Context)
10478 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
10479 Init, RParenLoc);
10480 else
10481 BOMInit = new (Context)
10482 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
10483 LParenLoc, Init, RParenLoc);
10484
10485 if (/*IsWritten*/readBool()) {
10486 unsigned SourceOrder = readInt();
10487 BOMInit->setSourceOrder(SourceOrder);
10488 }
10489
10490 CtorInitializers[i] = BOMInit;
10491 }
10492
10493 return CtorInitializers;
10494}
10495
10498 ASTContext &Context = getContext();
10499 unsigned N = readInt();
10501 for (unsigned I = 0; I != N; ++I) {
10502 auto Kind = readNestedNameSpecifierKind();
10503 switch (Kind) {
10505 auto *NS = readDeclAs<NamespaceBaseDecl>();
10506 SourceRange Range = readSourceRange();
10507 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10508 break;
10509 }
10510
10513 if (!T)
10514 return NestedNameSpecifierLoc();
10515 SourceLocation ColonColonLoc = readSourceLocation();
10516 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10517 break;
10518 }
10519
10521 SourceLocation ColonColonLoc = readSourceLocation();
10522 Builder.MakeGlobal(Context, ColonColonLoc);
10523 break;
10524 }
10525
10528 SourceRange Range = readSourceRange();
10529 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10530 break;
10531 }
10532
10534 llvm_unreachable("unexpected null nested name specifier");
10535 }
10536 }
10537
10538 return Builder.getWithLocInContext(Context);
10539}
10540
10542 unsigned &Idx) {
10545 return SourceRange(beg, end);
10546}
10547
10549 const StringRef Blob) {
10550 unsigned Count = Record[0];
10551 const char *Byte = Blob.data();
10552 llvm::BitVector Ret = llvm::BitVector(Count, false);
10553 for (unsigned I = 0; I < Count; ++Byte)
10554 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10555 if (*Byte & (1 << Bit))
10556 Ret[I] = true;
10557 return Ret;
10558}
10559
10560/// Read a floating-point value
10561llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10562 return llvm::APFloat(Sem, readAPInt());
10563}
10564
10565// Read a string
10566std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10567 unsigned Len = Record[Idx++];
10568 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10569 Idx += Len;
10570 return Result;
10571}
10572
10573StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10574 StringRef &Blob) {
10575 unsigned Len = Record[Idx++];
10576 StringRef Result = Blob.substr(0, Len);
10577 Blob = Blob.substr(Len);
10578 return Result;
10579}
10580
10582 unsigned &Idx) {
10583 return ReadPath(F.BaseDirectory, Record, Idx);
10584}
10585
10586std::string ASTReader::ReadPath(StringRef BaseDirectory,
10587 const RecordData &Record, unsigned &Idx) {
10588 std::string Filename = ReadString(Record, Idx);
10589 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10590}
10591
10592std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10593 const RecordData &Record, unsigned &Idx,
10594 StringRef &Blob) {
10595 StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10596 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10597}
10598
10600 unsigned &Idx) {
10601 unsigned Major = Record[Idx++];
10602 unsigned Minor = Record[Idx++];
10603 unsigned Subminor = Record[Idx++];
10604 if (Minor == 0)
10605 return VersionTuple(Major);
10606 if (Subminor == 0)
10607 return VersionTuple(Major, Minor - 1);
10608 return VersionTuple(Major, Minor - 1, Subminor - 1);
10609}
10610
10617
10618DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10619 return Diag(CurrentImportLoc, DiagID);
10620}
10621
10623 return Diags.Report(Loc, DiagID);
10624}
10625
10627 llvm::function_ref<void()> Fn) {
10628 // When Sema is available, avoid duplicate errors.
10629 if (SemaObj) {
10630 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10631 return;
10632 }
10633
10634 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10635}
10636
10637/// Retrieve the identifier table associated with the
10638/// preprocessor.
10640 return PP.getIdentifierTable();
10641}
10642
10643/// Record that the given ID maps to the given switch-case
10644/// statement.
10646 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10647 "Already have a SwitchCase with this ID");
10648 (*CurrSwitchCaseStmts)[ID] = SC;
10649}
10650
10651/// Retrieve the switch-case statement with the given ID.
10653 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10654 return (*CurrSwitchCaseStmts)[ID];
10655}
10656
10658 CurrSwitchCaseStmts->clear();
10659}
10660
10662 ASTContext &Context = getContext();
10663 std::vector<RawComment *> Comments;
10664 for (SmallVectorImpl<std::pair<BitstreamCursor,
10666 I = CommentsCursors.begin(),
10667 E = CommentsCursors.end();
10668 I != E; ++I) {
10669 Comments.clear();
10670 BitstreamCursor &Cursor = I->first;
10671 serialization::ModuleFile &F = *I->second;
10672 SavedStreamPosition SavedPosition(Cursor);
10673
10675 while (true) {
10677 Cursor.advanceSkippingSubblocks(
10678 BitstreamCursor::AF_DontPopBlockAtEnd);
10679 if (!MaybeEntry) {
10680 Error(MaybeEntry.takeError());
10681 return;
10682 }
10683 llvm::BitstreamEntry Entry = MaybeEntry.get();
10684
10685 switch (Entry.Kind) {
10686 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10687 case llvm::BitstreamEntry::Error:
10688 Error("malformed block record in AST file");
10689 return;
10690 case llvm::BitstreamEntry::EndBlock:
10691 goto NextCursor;
10692 case llvm::BitstreamEntry::Record:
10693 // The interesting case.
10694 break;
10695 }
10696
10697 // Read a record.
10698 Record.clear();
10699 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10700 if (!MaybeComment) {
10701 Error(MaybeComment.takeError());
10702 return;
10703 }
10704 switch ((CommentRecordTypes)MaybeComment.get()) {
10705 case COMMENTS_RAW_COMMENT: {
10706 unsigned Idx = 0;
10707 SourceRange SR = ReadSourceRange(F, Record, Idx);
10710 bool IsTrailingComment = Record[Idx++];
10711 bool IsAlmostTrailingComment = Record[Idx++];
10712 Comments.push_back(new (Context) RawComment(
10713 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10714 break;
10715 }
10716 }
10717 }
10718 NextCursor:
10719 for (RawComment *C : Comments) {
10720 SourceLocation CommentLoc = C->getBeginLoc();
10721 if (CommentLoc.isValid()) {
10722 FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10723 if (Loc.first.isValid())
10724 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10725 }
10726 }
10727 }
10728}
10729
10731 serialization::ModuleFile &MF, bool IncludeSystem,
10732 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10733 bool IsSystem)>
10734 Visitor) {
10735 unsigned NumUserInputs = MF.NumUserInputFiles;
10736 unsigned NumInputs = MF.InputFilesLoaded.size();
10737 assert(NumUserInputs <= NumInputs);
10738 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10739 for (unsigned I = 0; I < N; ++I) {
10740 bool IsSystem = I >= NumUserInputs;
10741 InputFileInfo IFI = getInputFileInfo(MF, I+1);
10742 Visitor(IFI, IsSystem);
10743 }
10744}
10745
10747 bool IncludeSystem, bool Complain,
10748 llvm::function_ref<void(const serialization::InputFile &IF,
10749 bool isSystem)> Visitor) {
10750 unsigned NumUserInputs = MF.NumUserInputFiles;
10751 unsigned NumInputs = MF.InputFilesLoaded.size();
10752 assert(NumUserInputs <= NumInputs);
10753 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10754 for (unsigned I = 0; I < N; ++I) {
10755 bool IsSystem = I >= NumUserInputs;
10756 InputFile IF = getInputFile(MF, I+1, Complain);
10757 Visitor(IF, IsSystem);
10758 }
10759}
10760
10763 llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10764 unsigned NumInputs = MF.InputFilesLoaded.size();
10765 for (unsigned I = 0; I < NumInputs; ++I) {
10766 InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10767 if (IFI.TopLevel && IFI.ModuleMap)
10768 if (auto FE = getInputFile(MF, I + 1).getFile())
10769 Visitor(*FE);
10770 }
10771}
10772
10773void ASTReader::finishPendingActions() {
10774 while (!PendingIdentifierInfos.empty() ||
10775 !PendingDeducedFunctionTypes.empty() ||
10776 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10777 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10778 !PendingUpdateRecords.empty() ||
10779 !PendingObjCExtensionIvarRedeclarations.empty()) {
10780 // If any identifiers with corresponding top-level declarations have
10781 // been loaded, load those declarations now.
10782 using TopLevelDeclsMap =
10783 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10784 TopLevelDeclsMap TopLevelDecls;
10785
10786 while (!PendingIdentifierInfos.empty()) {
10787 IdentifierInfo *II = PendingIdentifierInfos.back().first;
10789 std::move(PendingIdentifierInfos.back().second);
10790 PendingIdentifierInfos.pop_back();
10791
10792 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10793 }
10794
10795 // Load each function type that we deferred loading because it was a
10796 // deduced type that might refer to a local type declared within itself.
10797 for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10798 auto *FD = PendingDeducedFunctionTypes[I].first;
10799 FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10800
10801 if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10802 // If we gave a function a deduced return type, remember that we need to
10803 // propagate that along the redeclaration chain.
10804 if (DT->isDeduced()) {
10805 PendingDeducedTypeUpdates.insert(
10806 {FD->getCanonicalDecl(), FD->getReturnType()});
10807 continue;
10808 }
10809
10810 // The function has undeduced DeduceType return type. We hope we can
10811 // find the deduced type by iterating the redecls in other modules
10812 // later.
10813 PendingUndeducedFunctionDecls.push_back(FD);
10814 continue;
10815 }
10816 }
10817 PendingDeducedFunctionTypes.clear();
10818
10819 // Load each variable type that we deferred loading because it was a
10820 // deduced type that might refer to a local type declared within itself.
10821 for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10822 auto *VD = PendingDeducedVarTypes[I].first;
10823 VD->setType(GetType(PendingDeducedVarTypes[I].second));
10824 }
10825 PendingDeducedVarTypes.clear();
10826
10827 // Load pending declaration chains.
10828 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10829 loadPendingDeclChain(PendingDeclChains[I].first,
10830 PendingDeclChains[I].second);
10831 PendingDeclChains.clear();
10832
10833 // Make the most recent of the top-level declarations visible.
10834 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10835 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10836 IdentifierInfo *II = TLD->first;
10837 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10838 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10839 }
10840 }
10841
10842 // Load any pending macro definitions.
10843 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10844 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10845 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10846 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10847 // Initialize the macro history from chained-PCHs ahead of module imports.
10848 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10849 ++IDIdx) {
10850 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10851 if (!Info.M->isModule())
10852 resolvePendingMacro(II, Info);
10853 }
10854 // Handle module imports.
10855 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10856 ++IDIdx) {
10857 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10858 if (Info.M->isModule())
10859 resolvePendingMacro(II, Info);
10860 }
10861 }
10862 PendingMacroIDs.clear();
10863
10864 // Wire up the DeclContexts for Decls that we delayed setting until
10865 // recursive loading is completed.
10866 while (!PendingDeclContextInfos.empty()) {
10867 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10868 PendingDeclContextInfos.pop_front();
10869 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10870 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10871 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10872 }
10873
10874 // Perform any pending declaration updates.
10875 while (!PendingUpdateRecords.empty()) {
10876 auto Update = PendingUpdateRecords.pop_back_val();
10877 ReadingKindTracker ReadingKind(Read_Decl, *this);
10878 loadDeclUpdateRecords(Update);
10879 }
10880
10881 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10882 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10883 auto DuplicateIvars =
10884 PendingObjCExtensionIvarRedeclarations.back().second;
10886 StructuralEquivalenceContext Ctx(
10887 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10888 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10889 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10890 /*Complain =*/false,
10891 /*ErrorOnTagTypeMismatch =*/true);
10892 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10893 // Merge redeclared ivars with their predecessors.
10894 for (auto IvarPair : DuplicateIvars) {
10895 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10896 // Change semantic DeclContext but keep the lexical one.
10897 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10898 Ivar->getLexicalDeclContext(),
10899 getContext());
10900 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10901 }
10902 // Invalidate duplicate extension and the cached ivar list.
10903 ExtensionsPair.first->setInvalidDecl();
10904 ExtensionsPair.second->getClassInterface()
10905 ->getDefinition()
10906 ->setIvarList(nullptr);
10907 } else {
10908 for (auto IvarPair : DuplicateIvars) {
10909 Diag(IvarPair.first->getLocation(),
10910 diag::err_duplicate_ivar_declaration)
10911 << IvarPair.first->getIdentifier();
10912 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10913 }
10914 }
10915 PendingObjCExtensionIvarRedeclarations.pop_back();
10916 }
10917 }
10918
10919 // At this point, all update records for loaded decls are in place, so any
10920 // fake class definitions should have become real.
10921 assert(PendingFakeDefinitionData.empty() &&
10922 "faked up a class definition but never saw the real one");
10923
10924 // If we deserialized any C++ or Objective-C class definitions, any
10925 // Objective-C protocol definitions, or any redeclarable templates, make sure
10926 // that all redeclarations point to the definitions. Note that this can only
10927 // happen now, after the redeclaration chains have been fully wired.
10928 for (Decl *D : PendingDefinitions) {
10929 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10930 if (auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10931 for (auto *R = getMostRecentExistingDecl(RD); R;
10932 R = R->getPreviousDecl()) {
10933 assert((R == D) ==
10934 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10935 "declaration thinks it's the definition but it isn't");
10936 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10937 }
10938 }
10939
10940 continue;
10941 }
10942
10943 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10944 // Make sure that the ObjCInterfaceType points at the definition.
10945 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10946 ->Decl = ID;
10947
10948 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10949 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10950
10951 continue;
10952 }
10953
10954 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10955 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10956 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10957
10958 continue;
10959 }
10960
10961 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10962 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10963 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10964 }
10965 PendingDefinitions.clear();
10966
10967 for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10968 auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10969 if (auto *VD = dyn_cast<VarDecl>(D))
10970 return VD->isThisDeclarationADefinition() ||
10971 VD->isThisDeclarationADemotedDefinition();
10972
10973 if (auto *TD = dyn_cast<TagDecl>(D))
10974 return TD->isThisDeclarationADefinition() ||
10975 TD->isThisDeclarationADemotedDefinition();
10976
10977 if (auto *FD = dyn_cast<FunctionDecl>(D))
10978 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10979
10980 if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10981 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10982
10983 // Conservatively return false here.
10984 return false;
10985 };
10986
10987 auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10988 return hasDefinitionImpl(D, hasDefinitionImpl);
10989 };
10990
10991 // It is not good to prevent multiple declarations since the forward
10992 // declaration is common. Let's try to avoid duplicated definitions
10993 // only.
10995 continue;
10996
10997 Module *PM = Previous->getOwningModule();
10998 Module *DM = D->getOwningModule();
10999 Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
11001 << (DM ? DM->getTopLevelModuleName() : "global module");
11002 Diag(Previous->getLocation(), diag::note_also_found);
11003 }
11004 PendingWarningForDuplicatedDefsInModuleUnits.clear();
11005
11006 // Load the bodies of any functions or methods we've encountered. We do
11007 // this now (delayed) so that we can be sure that the declaration chains
11008 // have been fully wired up (hasBody relies on this).
11009 // FIXME: We shouldn't require complete redeclaration chains here.
11010 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
11011 PBEnd = PendingBodies.end();
11012 PB != PBEnd; ++PB) {
11013 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
11014 // FIXME: Check for =delete/=default?
11015 const FunctionDecl *Defn = nullptr;
11016 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
11017 FD->setLazyBody(PB->second);
11018 } else {
11019 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
11020 mergeDefinitionVisibility(NonConstDefn, FD);
11021
11022 if (!FD->isLateTemplateParsed() &&
11023 !NonConstDefn->isLateTemplateParsed() &&
11024 // We only perform ODR checks for decls not in the explicit
11025 // global module fragment.
11026 !shouldSkipCheckingODR(FD) &&
11027 !shouldSkipCheckingODR(NonConstDefn) &&
11028 FD->getODRHash() != NonConstDefn->getODRHash()) {
11029 if (!isa<CXXMethodDecl>(FD)) {
11030 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11031 } else if (FD->getLexicalParent()->isFileContext() &&
11032 NonConstDefn->getLexicalParent()->isFileContext()) {
11033 // Only diagnose out-of-line method definitions. If they are
11034 // in class definitions, then an error will be generated when
11035 // processing the class bodies.
11036 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11037 }
11038 }
11039 }
11040 continue;
11041 }
11042
11043 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
11044 if (!getContext().getLangOpts().Modules || !MD->hasBody())
11045 MD->setLazyBody(PB->second);
11046 }
11047 PendingBodies.clear();
11048
11049 // Inform any classes that had members added that they now have more members.
11050 for (auto [RD, MD] : PendingAddedClassMembers) {
11051 RD->addedMember(MD);
11052 }
11053 PendingAddedClassMembers.clear();
11054
11055 // Do some cleanup.
11056 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
11058 PendingMergedDefinitionsToDeduplicate.clear();
11059
11060 // For each decl chain that we wanted to complete while deserializing, mark
11061 // it as "still needs to be completed".
11062 for (Decl *D : PendingIncompleteDeclChains)
11063 markIncompleteDeclChain(D);
11064 PendingIncompleteDeclChains.clear();
11065
11066 assert(PendingIdentifierInfos.empty() &&
11067 "Should be empty at the end of finishPendingActions");
11068 assert(PendingDeducedFunctionTypes.empty() &&
11069 "Should be empty at the end of finishPendingActions");
11070 assert(PendingDeducedVarTypes.empty() &&
11071 "Should be empty at the end of finishPendingActions");
11072 assert(PendingDeclChains.empty() &&
11073 "Should be empty at the end of finishPendingActions");
11074 assert(PendingMacroIDs.empty() &&
11075 "Should be empty at the end of finishPendingActions");
11076 assert(PendingDeclContextInfos.empty() &&
11077 "Should be empty at the end of finishPendingActions");
11078 assert(PendingUpdateRecords.empty() &&
11079 "Should be empty at the end of finishPendingActions");
11080 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
11081 "Should be empty at the end of finishPendingActions");
11082 assert(PendingFakeDefinitionData.empty() &&
11083 "Should be empty at the end of finishPendingActions");
11084 assert(PendingDefinitions.empty() &&
11085 "Should be empty at the end of finishPendingActions");
11086 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
11087 "Should be empty at the end of finishPendingActions");
11088 assert(PendingBodies.empty() &&
11089 "Should be empty at the end of finishPendingActions");
11090 assert(PendingAddedClassMembers.empty() &&
11091 "Should be empty at the end of finishPendingActions");
11092 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
11093 "Should be empty at the end of finishPendingActions");
11094 assert(PendingIncompleteDeclChains.empty() &&
11095 "Should be empty at the end of finishPendingActions");
11096}
11097
11098void ASTReader::diagnoseOdrViolations() {
11099 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
11100 PendingRecordOdrMergeFailures.empty() &&
11101 PendingFunctionOdrMergeFailures.empty() &&
11102 PendingEnumOdrMergeFailures.empty() &&
11103 PendingObjCInterfaceOdrMergeFailures.empty() &&
11104 PendingObjCProtocolOdrMergeFailures.empty())
11105 return;
11106
11107 // Trigger the import of the full definition of each class that had any
11108 // odr-merging problems, so we can produce better diagnostics for them.
11109 // These updates may in turn find and diagnose some ODR failures, so take
11110 // ownership of the set first.
11111 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11112 PendingOdrMergeFailures.clear();
11113 for (auto &Merge : OdrMergeFailures) {
11114 Merge.first->buildLookup();
11115 Merge.first->decls_begin();
11116 Merge.first->bases_begin();
11117 Merge.first->vbases_begin();
11118 for (auto &RecordPair : Merge.second) {
11119 auto *RD = RecordPair.first;
11120 RD->decls_begin();
11121 RD->bases_begin();
11122 RD->vbases_begin();
11123 }
11124 }
11125
11126 // Trigger the import of the full definition of each record in C/ObjC.
11127 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11128 PendingRecordOdrMergeFailures.clear();
11129 for (auto &Merge : RecordOdrMergeFailures) {
11130 Merge.first->decls_begin();
11131 for (auto &D : Merge.second)
11132 D->decls_begin();
11133 }
11134
11135 // Trigger the import of the full interface definition.
11136 auto ObjCInterfaceOdrMergeFailures =
11137 std::move(PendingObjCInterfaceOdrMergeFailures);
11138 PendingObjCInterfaceOdrMergeFailures.clear();
11139 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11140 Merge.first->decls_begin();
11141 for (auto &InterfacePair : Merge.second)
11142 InterfacePair.first->decls_begin();
11143 }
11144
11145 // Trigger the import of functions.
11146 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11147 PendingFunctionOdrMergeFailures.clear();
11148 for (auto &Merge : FunctionOdrMergeFailures) {
11149 Merge.first->buildLookup();
11150 Merge.first->decls_begin();
11151 Merge.first->getBody();
11152 for (auto &FD : Merge.second) {
11153 FD->buildLookup();
11154 FD->decls_begin();
11155 FD->getBody();
11156 }
11157 }
11158
11159 // Trigger the import of enums.
11160 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11161 PendingEnumOdrMergeFailures.clear();
11162 for (auto &Merge : EnumOdrMergeFailures) {
11163 Merge.first->decls_begin();
11164 for (auto &Enum : Merge.second) {
11165 Enum->decls_begin();
11166 }
11167 }
11168
11169 // Trigger the import of the full protocol definition.
11170 auto ObjCProtocolOdrMergeFailures =
11171 std::move(PendingObjCProtocolOdrMergeFailures);
11172 PendingObjCProtocolOdrMergeFailures.clear();
11173 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11174 Merge.first->decls_begin();
11175 for (auto &ProtocolPair : Merge.second)
11176 ProtocolPair.first->decls_begin();
11177 }
11178
11179 // For each declaration from a merged context, check that the canonical
11180 // definition of that context also contains a declaration of the same
11181 // entity.
11182 //
11183 // Caution: this loop does things that might invalidate iterators into
11184 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
11185 while (!PendingOdrMergeChecks.empty()) {
11186 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11187
11188 // FIXME: Skip over implicit declarations for now. This matters for things
11189 // like implicitly-declared special member functions. This isn't entirely
11190 // correct; we can end up with multiple unmerged declarations of the same
11191 // implicit entity.
11192 if (D->isImplicit())
11193 continue;
11194
11195 DeclContext *CanonDef = D->getDeclContext();
11196
11197 bool Found = false;
11198 const Decl *DCanon = D->getCanonicalDecl();
11199
11200 for (auto *RI : D->redecls()) {
11201 if (RI->getLexicalDeclContext() == CanonDef) {
11202 Found = true;
11203 break;
11204 }
11205 }
11206 if (Found)
11207 continue;
11208
11209 // Quick check failed, time to do the slow thing. Note, we can't just
11210 // look up the name of D in CanonDef here, because the member that is
11211 // in CanonDef might not be found by name lookup (it might have been
11212 // replaced by a more recent declaration in the lookup table), and we
11213 // can't necessarily find it in the redeclaration chain because it might
11214 // be merely mergeable, not redeclarable.
11215 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11216 for (auto *CanonMember : CanonDef->decls()) {
11217 if (CanonMember->getCanonicalDecl() == DCanon) {
11218 // This can happen if the declaration is merely mergeable and not
11219 // actually redeclarable (we looked for redeclarations earlier).
11220 //
11221 // FIXME: We should be able to detect this more efficiently, without
11222 // pulling in all of the members of CanonDef.
11223 Found = true;
11224 break;
11225 }
11226 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
11227 if (ND->getDeclName() == D->getDeclName())
11228 Candidates.push_back(ND);
11229 }
11230
11231 if (!Found) {
11232 // The AST doesn't like TagDecls becoming invalid after they've been
11233 // completed. We only really need to mark FieldDecls as invalid here.
11234 if (!isa<TagDecl>(D))
11235 D->setInvalidDecl();
11236
11237 // Ensure we don't accidentally recursively enter deserialization while
11238 // we're producing our diagnostic.
11239 Deserializing RecursionGuard(this);
11240
11241 std::string CanonDefModule =
11243 cast<Decl>(CanonDef));
11244 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
11246 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11247
11248 if (Candidates.empty())
11249 Diag(cast<Decl>(CanonDef)->getLocation(),
11250 diag::note_module_odr_violation_no_possible_decls) << D;
11251 else {
11252 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
11253 Diag(Candidates[I]->getLocation(),
11254 diag::note_module_odr_violation_possible_decl)
11255 << Candidates[I];
11256 }
11257
11258 DiagnosedOdrMergeFailures.insert(CanonDef);
11259 }
11260 }
11261
11262 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11263 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11264 ObjCInterfaceOdrMergeFailures.empty() &&
11265 ObjCProtocolOdrMergeFailures.empty())
11266 return;
11267
11268 ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
11269 getPreprocessor().getLangOpts());
11270
11271 // Issue any pending ODR-failure diagnostics.
11272 for (auto &Merge : OdrMergeFailures) {
11273 // If we've already pointed out a specific problem with this class, don't
11274 // bother issuing a general "something's different" diagnostic.
11275 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11276 continue;
11277
11278 bool Diagnosed = false;
11279 CXXRecordDecl *FirstRecord = Merge.first;
11280 for (auto &RecordPair : Merge.second) {
11281 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11282 RecordPair.second)) {
11283 Diagnosed = true;
11284 break;
11285 }
11286 }
11287
11288 if (!Diagnosed) {
11289 // All definitions are updates to the same declaration. This happens if a
11290 // module instantiates the declaration of a class template specialization
11291 // and two or more other modules instantiate its definition.
11292 //
11293 // FIXME: Indicate which modules had instantiations of this definition.
11294 // FIXME: How can this even happen?
11295 Diag(Merge.first->getLocation(),
11296 diag::err_module_odr_violation_different_instantiations)
11297 << Merge.first;
11298 }
11299 }
11300
11301 // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
11302 // that in C++ this is done as a part of CXXRecordDecl ODR checking.
11303 for (auto &Merge : RecordOdrMergeFailures) {
11304 // If we've already pointed out a specific problem with this class, don't
11305 // bother issuing a general "something's different" diagnostic.
11306 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11307 continue;
11308
11309 RecordDecl *FirstRecord = Merge.first;
11310 bool Diagnosed = false;
11311 for (auto *SecondRecord : Merge.second) {
11312 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11313 Diagnosed = true;
11314 break;
11315 }
11316 }
11317 (void)Diagnosed;
11318 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11319 }
11320
11321 // Issue ODR failures diagnostics for functions.
11322 for (auto &Merge : FunctionOdrMergeFailures) {
11323 FunctionDecl *FirstFunction = Merge.first;
11324 bool Diagnosed = false;
11325 for (auto &SecondFunction : Merge.second) {
11326 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11327 Diagnosed = true;
11328 break;
11329 }
11330 }
11331 (void)Diagnosed;
11332 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11333 }
11334
11335 // Issue ODR failures diagnostics for enums.
11336 for (auto &Merge : EnumOdrMergeFailures) {
11337 // If we've already pointed out a specific problem with this enum, don't
11338 // bother issuing a general "something's different" diagnostic.
11339 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11340 continue;
11341
11342 EnumDecl *FirstEnum = Merge.first;
11343 bool Diagnosed = false;
11344 for (auto &SecondEnum : Merge.second) {
11345 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11346 Diagnosed = true;
11347 break;
11348 }
11349 }
11350 (void)Diagnosed;
11351 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11352 }
11353
11354 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11355 // If we've already pointed out a specific problem with this interface,
11356 // don't bother issuing a general "something's different" diagnostic.
11357 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11358 continue;
11359
11360 bool Diagnosed = false;
11361 ObjCInterfaceDecl *FirstID = Merge.first;
11362 for (auto &InterfacePair : Merge.second) {
11363 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11364 InterfacePair.second)) {
11365 Diagnosed = true;
11366 break;
11367 }
11368 }
11369 (void)Diagnosed;
11370 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11371 }
11372
11373 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11374 // If we've already pointed out a specific problem with this protocol,
11375 // don't bother issuing a general "something's different" diagnostic.
11376 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11377 continue;
11378
11379 ObjCProtocolDecl *FirstProtocol = Merge.first;
11380 bool Diagnosed = false;
11381 for (auto &ProtocolPair : Merge.second) {
11382 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11383 ProtocolPair.second)) {
11384 Diagnosed = true;
11385 break;
11386 }
11387 }
11388 (void)Diagnosed;
11389 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11390 }
11391}
11392
11394 if (llvm::Timer *T = ReadTimer.get();
11395 ++NumCurrentElementsDeserializing == 1 && T)
11396 ReadTimeRegion.emplace(T);
11397}
11398
11400 assert(NumCurrentElementsDeserializing &&
11401 "FinishedDeserializing not paired with StartedDeserializing");
11402 if (NumCurrentElementsDeserializing == 1) {
11403 // We decrease NumCurrentElementsDeserializing only after pending actions
11404 // are finished, to avoid recursively re-calling finishPendingActions().
11405 finishPendingActions();
11406 }
11407 --NumCurrentElementsDeserializing;
11408
11409 if (NumCurrentElementsDeserializing == 0) {
11410 {
11411 // Guard variable to avoid recursively entering the process of passing
11412 // decls to consumer.
11413 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11414 /*NewValue=*/false);
11415
11416 // Propagate exception specification and deduced type updates along
11417 // redeclaration chains.
11418 //
11419 // We do this now rather than in finishPendingActions because we want to
11420 // be able to walk the complete redeclaration chains of the updated decls.
11421 while (!PendingExceptionSpecUpdates.empty() ||
11422 !PendingDeducedTypeUpdates.empty() ||
11423 !PendingUndeducedFunctionDecls.empty()) {
11424 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11425 PendingExceptionSpecUpdates.clear();
11426 for (auto Update : ESUpdates) {
11427 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11428 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11429 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11430 if (auto *Listener = getContext().getASTMutationListener())
11431 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11432 for (auto *Redecl : Update.second->redecls())
11434 }
11435
11436 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11437 PendingDeducedTypeUpdates.clear();
11438 for (auto Update : DTUpdates) {
11439 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11440 // FIXME: If the return type is already deduced, check that it
11441 // matches.
11443 Update.second);
11444 }
11445
11446 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11447 PendingUndeducedFunctionDecls.clear();
11448 // We hope we can find the deduced type for the functions by iterating
11449 // redeclarations in other modules.
11450 for (FunctionDecl *UndeducedFD : UDTUpdates)
11451 (void)UndeducedFD->getMostRecentDecl();
11452 }
11453
11454 ReadTimeRegion.reset();
11455
11456 diagnoseOdrViolations();
11457 }
11458
11459 // We are not in recursive loading, so it's safe to pass the "interesting"
11460 // decls to the consumer.
11461 if (Consumer)
11462 PassInterestingDeclsToConsumer();
11463 }
11464}
11465
11466void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11467 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11468 // Remove any fake results before adding any real ones.
11469 auto It = PendingFakeLookupResults.find(II);
11470 if (It != PendingFakeLookupResults.end()) {
11471 for (auto *ND : It->second)
11472 SemaObj->IdResolver.RemoveDecl(ND);
11473 // FIXME: this works around module+PCH performance issue.
11474 // Rather than erase the result from the map, which is O(n), just clear
11475 // the vector of NamedDecls.
11476 It->second.clear();
11477 }
11478 }
11479
11480 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11481 SemaObj->TUScope->AddDecl(D);
11482 } else if (SemaObj->TUScope) {
11483 // Adding the decl to IdResolver may have failed because it was already in
11484 // (even though it was not added in scope). If it is already in, make sure
11485 // it gets in the scope as well.
11486 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11487 SemaObj->TUScope->AddDecl(D);
11488 }
11489}
11490
11492 ASTContext *Context,
11493 const PCHContainerReader &PCHContainerRdr,
11494 const CodeGenOptions &CodeGenOpts,
11495 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11496 StringRef isysroot,
11497 DisableValidationForModuleKind DisableValidationKind,
11498 bool AllowASTWithCompilerErrors,
11499 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11500 bool ForceValidateUserInputs,
11501 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11502 std::unique_ptr<llvm::Timer> ReadTimer)
11503 : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11505 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11506 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11507 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11508 StackHandler(Diags), PP(PP), ContextObj(Context),
11509 CodeGenOpts(CodeGenOpts),
11510 ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11511 PP.getHeaderSearchInfo()),
11512 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11513 DisableValidationKind(DisableValidationKind),
11514 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11515 AllowConfigurationMismatch(AllowConfigurationMismatch),
11516 ValidateSystemInputs(ValidateSystemInputs),
11517 ForceValidateUserInputs(ForceValidateUserInputs),
11518 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11519 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11520 SourceMgr.setExternalSLocEntrySource(this);
11521
11522 PathBuf.reserve(256);
11523
11524 for (const auto &Ext : Extensions) {
11525 auto BlockName = Ext->getExtensionMetadata().BlockName;
11526 auto Known = ModuleFileExtensions.find(BlockName);
11527 if (Known != ModuleFileExtensions.end()) {
11528 Diags.Report(diag::warn_duplicate_module_file_extension)
11529 << BlockName;
11530 continue;
11531 }
11532
11533 ModuleFileExtensions.insert({BlockName, Ext});
11534 }
11535}
11536
11538 if (OwnsDeserializationListener)
11539 delete DeserializationListener;
11540}
11541
11543 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11544}
11545
11547 unsigned AbbrevID) {
11548 Idx = 0;
11549 Record.clear();
11550 return Cursor.readRecord(AbbrevID, Record);
11551}
11552//===----------------------------------------------------------------------===//
11553//// OMPClauseReader implementation
11554////===----------------------------------------------------------------------===//
11555
11556// This has to be in namespace clang because it's friended by all
11557// of the OMP clauses.
11558namespace clang {
11559
11560class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11561 ASTRecordReader &Record;
11562 ASTContext &Context;
11563
11564public:
11566 : Record(Record), Context(Record.getContext()) {}
11567#define GEN_CLANG_CLAUSE_CLASS
11568#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11569#include "llvm/Frontend/OpenMP/OMP.inc"
11573};
11574
11575} // end namespace clang
11576
11580
11582 OMPClause *C = nullptr;
11583 switch (llvm::omp::Clause(Record.readInt())) {
11584 case llvm::omp::OMPC_if:
11585 C = new (Context) OMPIfClause();
11586 break;
11587 case llvm::omp::OMPC_final:
11588 C = new (Context) OMPFinalClause();
11589 break;
11590 case llvm::omp::OMPC_num_threads:
11591 C = OMPNumThreadsClause::CreateEmpty(Context, Record.readInt());
11592 break;
11593 case llvm::omp::OMPC_safelen:
11594 C = new (Context) OMPSafelenClause();
11595 break;
11596 case llvm::omp::OMPC_simdlen:
11597 C = new (Context) OMPSimdlenClause();
11598 break;
11599 case llvm::omp::OMPC_sizes: {
11600 unsigned NumSizes = Record.readInt();
11601 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11602 break;
11603 }
11604 case llvm::omp::OMPC_counts: {
11605 unsigned NumCounts = Record.readInt();
11606 C = OMPCountsClause::CreateEmpty(Context, NumCounts);
11607 break;
11608 }
11609 case llvm::omp::OMPC_permutation: {
11610 unsigned NumLoops = Record.readInt();
11611 C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11612 break;
11613 }
11614 case llvm::omp::OMPC_full:
11615 C = new (Context) OMPFullClause();
11616 break;
11617 case llvm::omp::OMPC_partial:
11618 C = new (Context) OMPPartialClause();
11619 break;
11620 case llvm::omp::OMPC_depth:
11621 C = new (Context) OMPDepthClause();
11622 break;
11623 case llvm::omp::OMPC_looprange:
11624 C = new (Context) OMPLoopRangeClause();
11625 break;
11626 case llvm::omp::OMPC_allocator:
11627 C = new (Context) OMPAllocatorClause();
11628 break;
11629 case llvm::omp::OMPC_collapse:
11630 C = new (Context) OMPCollapseClause();
11631 break;
11632 case llvm::omp::OMPC_default:
11633 C = new (Context) OMPDefaultClause();
11634 break;
11635 case llvm::omp::OMPC_proc_bind:
11636 C = new (Context) OMPProcBindClause();
11637 break;
11638 case llvm::omp::OMPC_schedule:
11639 C = new (Context) OMPScheduleClause();
11640 break;
11641 case llvm::omp::OMPC_ordered:
11642 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11643 break;
11644 case llvm::omp::OMPC_nowait:
11645 C = new (Context) OMPNowaitClause();
11646 break;
11647 case llvm::omp::OMPC_untied:
11648 C = new (Context) OMPUntiedClause();
11649 break;
11650 case llvm::omp::OMPC_mergeable:
11651 C = new (Context) OMPMergeableClause();
11652 break;
11653 case llvm::omp::OMPC_threadset:
11654 C = new (Context) OMPThreadsetClause();
11655 break;
11656 case llvm::omp::OMPC_transparent:
11657 C = new (Context) OMPTransparentClause();
11658 break;
11659 case llvm::omp::OMPC_read:
11660 C = new (Context) OMPReadClause();
11661 break;
11662 case llvm::omp::OMPC_write:
11663 C = new (Context) OMPWriteClause();
11664 break;
11665 case llvm::omp::OMPC_update:
11666 C = new (Context) OMPUpdateClause();
11667 break;
11668 case llvm::omp::OMPC_update_depend_objects:
11669 C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
11670 break;
11671 case llvm::omp::OMPC_capture:
11672 C = new (Context) OMPCaptureClause();
11673 break;
11674 case llvm::omp::OMPC_compare:
11675 C = new (Context) OMPCompareClause();
11676 break;
11677 case llvm::omp::OMPC_fail:
11678 C = new (Context) OMPFailClause();
11679 break;
11680 case llvm::omp::OMPC_seq_cst:
11681 C = new (Context) OMPSeqCstClause();
11682 break;
11683 case llvm::omp::OMPC_acq_rel:
11684 C = new (Context) OMPAcqRelClause();
11685 break;
11686 case llvm::omp::OMPC_absent: {
11687 unsigned NumKinds = Record.readInt();
11688 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11689 break;
11690 }
11691 case llvm::omp::OMPC_holds:
11692 C = new (Context) OMPHoldsClause();
11693 break;
11694 case llvm::omp::OMPC_contains: {
11695 unsigned NumKinds = Record.readInt();
11696 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11697 break;
11698 }
11699 case llvm::omp::OMPC_no_openmp:
11700 C = new (Context) OMPNoOpenMPClause();
11701 break;
11702 case llvm::omp::OMPC_no_openmp_routines:
11703 C = new (Context) OMPNoOpenMPRoutinesClause();
11704 break;
11705 case llvm::omp::OMPC_no_openmp_constructs:
11706 C = new (Context) OMPNoOpenMPConstructsClause();
11707 break;
11708 case llvm::omp::OMPC_no_parallelism:
11709 C = new (Context) OMPNoParallelismClause();
11710 break;
11711 case llvm::omp::OMPC_acquire:
11712 C = new (Context) OMPAcquireClause();
11713 break;
11714 case llvm::omp::OMPC_release:
11715 C = new (Context) OMPReleaseClause();
11716 break;
11717 case llvm::omp::OMPC_relaxed:
11718 C = new (Context) OMPRelaxedClause();
11719 break;
11720 case llvm::omp::OMPC_weak:
11721 C = new (Context) OMPWeakClause();
11722 break;
11723 case llvm::omp::OMPC_threads:
11724 C = new (Context) OMPThreadsClause();
11725 break;
11726 case llvm::omp::OMPC_simd:
11727 C = new (Context) OMPSIMDClause();
11728 break;
11729 case llvm::omp::OMPC_nogroup:
11730 C = new (Context) OMPNogroupClause();
11731 break;
11732 case llvm::omp::OMPC_unified_address:
11733 C = new (Context) OMPUnifiedAddressClause();
11734 break;
11735 case llvm::omp::OMPC_unified_shared_memory:
11736 C = new (Context) OMPUnifiedSharedMemoryClause();
11737 break;
11738 case llvm::omp::OMPC_reverse_offload:
11739 C = new (Context) OMPReverseOffloadClause();
11740 break;
11741 case llvm::omp::OMPC_dynamic_allocators:
11742 C = new (Context) OMPDynamicAllocatorsClause();
11743 break;
11744 case llvm::omp::OMPC_atomic_default_mem_order:
11745 C = new (Context) OMPAtomicDefaultMemOrderClause();
11746 break;
11747 case llvm::omp::OMPC_self_maps:
11748 C = new (Context) OMPSelfMapsClause();
11749 break;
11750 case llvm::omp::OMPC_at:
11751 C = new (Context) OMPAtClause();
11752 break;
11753 case llvm::omp::OMPC_severity:
11754 C = new (Context) OMPSeverityClause();
11755 break;
11756 case llvm::omp::OMPC_message:
11757 C = new (Context) OMPMessageClause();
11758 break;
11759 case llvm::omp::OMPC_private:
11760 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11761 break;
11762 case llvm::omp::OMPC_firstprivate:
11763 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11764 break;
11765 case llvm::omp::OMPC_lastprivate:
11766 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11767 break;
11768 case llvm::omp::OMPC_shared:
11769 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11770 break;
11771 case llvm::omp::OMPC_reduction: {
11772 unsigned N = Record.readInt();
11773 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11774 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11775 break;
11776 }
11777 case llvm::omp::OMPC_task_reduction:
11778 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11779 break;
11780 case llvm::omp::OMPC_in_reduction:
11781 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11782 break;
11783 case llvm::omp::OMPC_linear:
11784 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11785 break;
11786 case llvm::omp::OMPC_aligned:
11787 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11788 break;
11789 case llvm::omp::OMPC_copyin:
11790 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11791 break;
11792 case llvm::omp::OMPC_copyprivate:
11793 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11794 break;
11795 case llvm::omp::OMPC_flush:
11796 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11797 break;
11798 case llvm::omp::OMPC_depobj:
11799 C = new (Context) OMPDepobjClause();
11800 break;
11801 case llvm::omp::OMPC_depend: {
11802 unsigned NumVars = Record.readInt();
11803 unsigned NumLoops = Record.readInt();
11804 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11805 break;
11806 }
11807 case llvm::omp::OMPC_device:
11808 C = new (Context) OMPDeviceClause();
11809 break;
11810 case llvm::omp::OMPC_map: {
11812 Sizes.NumVars = Record.readInt();
11813 Sizes.NumUniqueDeclarations = Record.readInt();
11814 Sizes.NumComponentLists = Record.readInt();
11815 Sizes.NumComponents = Record.readInt();
11816 C = OMPMapClause::CreateEmpty(Context, Sizes);
11817 break;
11818 }
11819 case llvm::omp::OMPC_num_teams:
11820 C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11821 break;
11822 case llvm::omp::OMPC_thread_limit:
11823 C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11824 break;
11825 case llvm::omp::OMPC_priority:
11826 C = new (Context) OMPPriorityClause();
11827 break;
11828 case llvm::omp::OMPC_grainsize:
11829 C = new (Context) OMPGrainsizeClause();
11830 break;
11831 case llvm::omp::OMPC_num_tasks:
11832 C = new (Context) OMPNumTasksClause();
11833 break;
11834 case llvm::omp::OMPC_hint:
11835 C = new (Context) OMPHintClause();
11836 break;
11837 case llvm::omp::OMPC_dist_schedule:
11838 C = new (Context) OMPDistScheduleClause();
11839 break;
11840 case llvm::omp::OMPC_defaultmap:
11841 C = new (Context) OMPDefaultmapClause();
11842 break;
11843 case llvm::omp::OMPC_to: {
11845 Sizes.NumVars = Record.readInt();
11846 Sizes.NumUniqueDeclarations = Record.readInt();
11847 Sizes.NumComponentLists = Record.readInt();
11848 Sizes.NumComponents = Record.readInt();
11849 C = OMPToClause::CreateEmpty(Context, Sizes);
11850 break;
11851 }
11852 case llvm::omp::OMPC_from: {
11854 Sizes.NumVars = Record.readInt();
11855 Sizes.NumUniqueDeclarations = Record.readInt();
11856 Sizes.NumComponentLists = Record.readInt();
11857 Sizes.NumComponents = Record.readInt();
11858 C = OMPFromClause::CreateEmpty(Context, Sizes);
11859 break;
11860 }
11861 case llvm::omp::OMPC_use_device_ptr: {
11863 Sizes.NumVars = Record.readInt();
11864 Sizes.NumUniqueDeclarations = Record.readInt();
11865 Sizes.NumComponentLists = Record.readInt();
11866 Sizes.NumComponents = Record.readInt();
11867 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11868 break;
11869 }
11870 case llvm::omp::OMPC_use_device_addr: {
11872 Sizes.NumVars = Record.readInt();
11873 Sizes.NumUniqueDeclarations = Record.readInt();
11874 Sizes.NumComponentLists = Record.readInt();
11875 Sizes.NumComponents = Record.readInt();
11876 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11877 break;
11878 }
11879 case llvm::omp::OMPC_is_device_ptr: {
11881 Sizes.NumVars = Record.readInt();
11882 Sizes.NumUniqueDeclarations = Record.readInt();
11883 Sizes.NumComponentLists = Record.readInt();
11884 Sizes.NumComponents = Record.readInt();
11885 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11886 break;
11887 }
11888 case llvm::omp::OMPC_has_device_addr: {
11890 Sizes.NumVars = Record.readInt();
11891 Sizes.NumUniqueDeclarations = Record.readInt();
11892 Sizes.NumComponentLists = Record.readInt();
11893 Sizes.NumComponents = Record.readInt();
11894 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11895 break;
11896 }
11897 case llvm::omp::OMPC_allocate:
11898 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11899 break;
11900 case llvm::omp::OMPC_nontemporal:
11901 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11902 break;
11903 case llvm::omp::OMPC_inclusive:
11904 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11905 break;
11906 case llvm::omp::OMPC_exclusive:
11907 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11908 break;
11909 case llvm::omp::OMPC_order:
11910 C = new (Context) OMPOrderClause();
11911 break;
11912 case llvm::omp::OMPC_init: {
11913 unsigned VarListSize = Record.readInt();
11914 unsigned NumAttrs = Record.readInt();
11915 C = OMPInitClause::CreateEmpty(Context, /*NumPrefs=*/VarListSize - 1,
11916 NumAttrs);
11917 break;
11918 }
11919 case llvm::omp::OMPC_use:
11920 C = new (Context) OMPUseClause();
11921 break;
11922 case llvm::omp::OMPC_destroy:
11923 C = new (Context) OMPDestroyClause();
11924 break;
11925 case llvm::omp::OMPC_novariants:
11926 C = new (Context) OMPNovariantsClause();
11927 break;
11928 case llvm::omp::OMPC_nocontext:
11929 C = new (Context) OMPNocontextClause();
11930 break;
11931 case llvm::omp::OMPC_detach:
11932 C = new (Context) OMPDetachClause();
11933 break;
11934 case llvm::omp::OMPC_uses_allocators:
11935 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11936 break;
11937 case llvm::omp::OMPC_affinity:
11938 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11939 break;
11940 case llvm::omp::OMPC_filter:
11941 C = new (Context) OMPFilterClause();
11942 break;
11943 case llvm::omp::OMPC_bind:
11944 C = new (Context) OMPBindClause();
11945 break;
11946 case llvm::omp::OMPC_align:
11947 C = new (Context) OMPAlignClause();
11948 break;
11949 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11950 C = new (Context) OMPXDynCGroupMemClause();
11951 break;
11952 case llvm::omp::OMPC_dyn_groupprivate:
11953 C = new (Context) OMPDynGroupprivateClause();
11954 break;
11955 case llvm::omp::OMPC_doacross: {
11956 unsigned NumVars = Record.readInt();
11957 unsigned NumLoops = Record.readInt();
11958 C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
11959 break;
11960 }
11961 case llvm::omp::OMPC_ompx_attribute:
11962 C = new (Context) OMPXAttributeClause();
11963 break;
11964 case llvm::omp::OMPC_ompx_bare:
11965 C = new (Context) OMPXBareClause();
11966 break;
11967#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11968 case llvm::omp::Enum: \
11969 break;
11970#include "llvm/Frontend/OpenMP/OMPKinds.def"
11971 default:
11972 break;
11973 }
11974 assert(C && "Unknown OMPClause type");
11975
11976 Visit(C);
11977 C->setLocStart(Record.readSourceLocation());
11978 C->setLocEnd(Record.readSourceLocation());
11979
11980 return C;
11981}
11982
11984 C->setPreInitStmt(Record.readSubStmt(),
11985 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11986}
11987
11990 C->setPostUpdateExpr(Record.readSubExpr());
11991}
11992
11993void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11995 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11996 C->setNameModifierLoc(Record.readSourceLocation());
11997 C->setColonLoc(Record.readSourceLocation());
11998 C->setCondition(Record.readSubExpr());
11999 C->setLParenLoc(Record.readSourceLocation());
12000}
12001
12002void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
12004 C->setCondition(Record.readSubExpr());
12005 C->setLParenLoc(Record.readSourceLocation());
12006}
12007
12008void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
12009 C->setPrescriptivenessModifier(
12010 Record.readEnum<OpenMPNumThreadsClauseModifier>());
12011 C->setPrescriptivenessModifierLoc(Record.readSourceLocation());
12012 C->setDimsModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
12013 C->setDimsModifierLoc(Record.readSourceLocation());
12014 C->setDimsModifierExpr(Record.readSubExpr());
12016 C->setLParenLoc(Record.readSourceLocation());
12017 unsigned NumVars = C->varlist_size();
12018 SmallVector<Expr *, 16> Vars;
12019 Vars.reserve(NumVars);
12020 for (unsigned I = 0; I != NumVars; ++I)
12021 Vars.push_back(Record.readSubExpr());
12022 C->setVarRefs(Vars);
12023}
12024
12025void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
12026 C->setSafelen(Record.readSubExpr());
12027 C->setLParenLoc(Record.readSourceLocation());
12028}
12029
12030void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
12031 C->setSimdlen(Record.readSubExpr());
12032 C->setLParenLoc(Record.readSourceLocation());
12033}
12034
12035void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
12036 for (Expr *&E : C->getSizesRefs())
12037 E = Record.readSubExpr();
12038 C->setLParenLoc(Record.readSourceLocation());
12039}
12040
12041void OMPClauseReader::VisitOMPCountsClause(OMPCountsClause *C) {
12042 bool HasFill = Record.readBool();
12043 if (HasFill)
12044 C->setOmpFillIndex(Record.readInt());
12045 C->setOmpFillLoc(Record.readSourceLocation());
12046 for (Expr *&E : C->getCountsRefs())
12047 E = Record.readSubExpr();
12048 C->setLParenLoc(Record.readSourceLocation());
12049}
12050
12051void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
12052 for (Expr *&E : C->getArgsRefs())
12053 E = Record.readSubExpr();
12054 C->setLParenLoc(Record.readSourceLocation());
12055}
12056
12057void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
12058
12059void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
12060 C->setFactor(Record.readSubExpr());
12061 C->setLParenLoc(Record.readSourceLocation());
12062}
12063
12064void OMPClauseReader::VisitOMPDepthClause(OMPDepthClause *C) {
12065 C->setDepth(Record.readSubExpr());
12066 C->setLParenLoc(Record.readSourceLocation());
12067}
12068
12069void OMPClauseReader::VisitOMPLoopRangeClause(OMPLoopRangeClause *C) {
12070 C->setFirst(Record.readSubExpr());
12071 C->setCount(Record.readSubExpr());
12072 C->setLParenLoc(Record.readSourceLocation());
12073 C->setFirstLoc(Record.readSourceLocation());
12074 C->setCountLoc(Record.readSourceLocation());
12075}
12076
12077void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
12078 C->setAllocator(Record.readExpr());
12079 C->setLParenLoc(Record.readSourceLocation());
12080}
12081
12082void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
12083 C->setNumForLoops(Record.readSubExpr());
12084 C->setLParenLoc(Record.readSourceLocation());
12085}
12086
12087void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
12088 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
12089 C->setLParenLoc(Record.readSourceLocation());
12090 C->setDefaultKindKwLoc(Record.readSourceLocation());
12091 C->setDefaultVariableCategory(
12092 Record.readEnum<OpenMPDefaultClauseVariableCategory>());
12093 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
12094}
12095
12096// Read the parameter of threadset clause. This will have been saved when
12097// OMPClauseWriter is called.
12098void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) {
12099 C->setLParenLoc(Record.readSourceLocation());
12100 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
12101 C->setThreadsetKindLoc(ThreadsetKindLoc);
12102 OpenMPThreadsetKind TKind =
12103 static_cast<OpenMPThreadsetKind>(Record.readInt());
12104 C->setThreadsetKind(TKind);
12105}
12106
12107void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *C) {
12108 C->setLParenLoc(Record.readSourceLocation());
12109 C->setImpexTypeKind(Record.readSubExpr());
12110}
12111
12112void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
12113 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
12114 C->setLParenLoc(Record.readSourceLocation());
12115 C->setProcBindKindKwLoc(Record.readSourceLocation());
12116}
12117
12118void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
12120 C->setScheduleKind(
12121 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
12122 C->setFirstScheduleModifier(
12123 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12124 C->setSecondScheduleModifier(
12125 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12126 C->setChunkSize(Record.readSubExpr());
12127 C->setLParenLoc(Record.readSourceLocation());
12128 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12129 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12130 C->setScheduleKindLoc(Record.readSourceLocation());
12131 C->setCommaLoc(Record.readSourceLocation());
12132}
12133
12134void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
12135 C->setNumForLoops(Record.readSubExpr());
12136 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12137 C->setLoopNumIterations(I, Record.readSubExpr());
12138 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12139 C->setLoopCounter(I, Record.readSubExpr());
12140 C->setLParenLoc(Record.readSourceLocation());
12141}
12142
12143void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
12144 C->setEventHandler(Record.readSubExpr());
12145 C->setLParenLoc(Record.readSourceLocation());
12146}
12147
12148void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *C) {
12149 C->setCondition(Record.readSubExpr());
12150 C->setLParenLoc(Record.readSourceLocation());
12151}
12152
12153void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12154
12155void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12156
12157void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12158
12159void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12160
12161void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12162
12163void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
12164 OMPUpdateDependObjectsClause *C) {
12165 C->setLParenLoc(Record.readSourceLocation());
12166 C->setArgumentLoc(Record.readSourceLocation());
12167 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12168}
12169
12170void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12171
12172void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12173
12174// Read the parameter of fail clause. This will have been saved when
12175// OMPClauseWriter is called.
12176void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
12177 C->setLParenLoc(Record.readSourceLocation());
12178 SourceLocation FailParameterLoc = Record.readSourceLocation();
12179 C->setFailParameterLoc(FailParameterLoc);
12180 OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
12181 C->setFailParameter(CKind);
12182}
12183
12184void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
12185 unsigned Count = C->getDirectiveKinds().size();
12186 C->setLParenLoc(Record.readSourceLocation());
12187 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12188 DKVec.reserve(Count);
12189 for (unsigned I = 0; I < Count; I++) {
12190 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12191 }
12192 C->setDirectiveKinds(DKVec);
12193}
12194
12195void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
12196 C->setExpr(Record.readExpr());
12197 C->setLParenLoc(Record.readSourceLocation());
12198}
12199
12200void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
12201 unsigned Count = C->getDirectiveKinds().size();
12202 C->setLParenLoc(Record.readSourceLocation());
12203 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12204 DKVec.reserve(Count);
12205 for (unsigned I = 0; I < Count; I++) {
12206 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12207 }
12208 C->setDirectiveKinds(DKVec);
12209}
12210
12211void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12212
12213void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12214 OMPNoOpenMPRoutinesClause *) {}
12215
12216void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12217 OMPNoOpenMPConstructsClause *) {}
12218
12219void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12220
12221void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12222
12223void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12224
12225void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12226
12227void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12228
12229void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12230
12231void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12232
12233void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12234
12235void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12236
12237void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12238
12239void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12240 unsigned NumVars = C->varlist_size();
12241 SmallVector<Expr *, 16> Vars;
12242 Vars.reserve(NumVars);
12243 for (unsigned I = 0; I != NumVars; ++I)
12244 Vars.push_back(Record.readSubExpr());
12245 C->setVarRefs(Vars);
12246 C->setIsTarget(Record.readBool());
12247 C->setIsTargetSync(Record.readBool());
12248 C->setHasPreferAttrs(Record.readBool());
12249
12250 unsigned NumPrefs = C->varlist_size() - 1;
12251 SmallVector<unsigned, 4> Counts;
12252 SmallVector<Expr *, 8> Attrs;
12253 Counts.reserve(NumPrefs);
12254 for (unsigned I = 0; I < NumPrefs; ++I) {
12255 unsigned NA = Record.readInt();
12256 Counts.push_back(NA);
12257 for (unsigned J = 0; J < NA; ++J)
12258 Attrs.push_back(Record.readSubExpr());
12259 }
12260 C->setAttrs(Counts, Attrs);
12261
12262 C->setLParenLoc(Record.readSourceLocation());
12263 C->setVarLoc(Record.readSourceLocation());
12264}
12265
12266void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12267 C->setInteropVar(Record.readSubExpr());
12268 C->setLParenLoc(Record.readSourceLocation());
12269 C->setVarLoc(Record.readSourceLocation());
12270}
12271
12272void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12273 C->setInteropVar(Record.readSubExpr());
12274 C->setLParenLoc(Record.readSourceLocation());
12275 C->setVarLoc(Record.readSourceLocation());
12276}
12277
12278void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12280 C->setCondition(Record.readSubExpr());
12281 C->setLParenLoc(Record.readSourceLocation());
12282}
12283
12284void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12286 C->setCondition(Record.readSubExpr());
12287 C->setLParenLoc(Record.readSourceLocation());
12288}
12289
12290void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12291
12292void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12293 OMPUnifiedSharedMemoryClause *) {}
12294
12295void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12296
12297void
12298OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12299}
12300
12301void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12302 OMPAtomicDefaultMemOrderClause *C) {
12303 C->setAtomicDefaultMemOrderKind(
12304 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12305 C->setLParenLoc(Record.readSourceLocation());
12306 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12307}
12308
12309void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12310
12311void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
12312 C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
12313 C->setLParenLoc(Record.readSourceLocation());
12314 C->setAtKindKwLoc(Record.readSourceLocation());
12315}
12316
12317void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
12318 C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
12319 C->setLParenLoc(Record.readSourceLocation());
12320 C->setSeverityKindKwLoc(Record.readSourceLocation());
12321}
12322
12323void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
12325 C->setMessageString(Record.readSubExpr());
12326 C->setLParenLoc(Record.readSourceLocation());
12327}
12328
12329void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12330 C->setLParenLoc(Record.readSourceLocation());
12331 unsigned NumVars = C->varlist_size();
12332 SmallVector<Expr *, 16> Vars;
12333 Vars.reserve(NumVars);
12334 for (unsigned i = 0; i != NumVars; ++i)
12335 Vars.push_back(Record.readSubExpr());
12336 C->setVarRefs(Vars);
12337 Vars.clear();
12338 for (unsigned i = 0; i != NumVars; ++i)
12339 Vars.push_back(Record.readSubExpr());
12340 C->setPrivateCopies(Vars);
12341}
12342
12343void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12345 C->setLParenLoc(Record.readSourceLocation());
12346 unsigned NumVars = C->varlist_size();
12347 SmallVector<Expr *, 16> Vars;
12348 Vars.reserve(NumVars);
12349 for (unsigned i = 0; i != NumVars; ++i)
12350 Vars.push_back(Record.readSubExpr());
12351 C->setVarRefs(Vars);
12352 Vars.clear();
12353 for (unsigned i = 0; i != NumVars; ++i)
12354 Vars.push_back(Record.readSubExpr());
12355 C->setPrivateCopies(Vars);
12356 Vars.clear();
12357 for (unsigned i = 0; i != NumVars; ++i)
12358 Vars.push_back(Record.readSubExpr());
12359 C->setInits(Vars);
12360}
12361
12362void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12364 C->setLParenLoc(Record.readSourceLocation());
12365 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12366 C->setKindLoc(Record.readSourceLocation());
12367 C->setColonLoc(Record.readSourceLocation());
12368 unsigned NumVars = C->varlist_size();
12369 SmallVector<Expr *, 16> Vars;
12370 Vars.reserve(NumVars);
12371 for (unsigned i = 0; i != NumVars; ++i)
12372 Vars.push_back(Record.readSubExpr());
12373 C->setVarRefs(Vars);
12374 Vars.clear();
12375 for (unsigned i = 0; i != NumVars; ++i)
12376 Vars.push_back(Record.readSubExpr());
12377 C->setPrivateCopies(Vars);
12378 Vars.clear();
12379 for (unsigned i = 0; i != NumVars; ++i)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setSourceExprs(Vars);
12382 Vars.clear();
12383 for (unsigned i = 0; i != NumVars; ++i)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setDestinationExprs(Vars);
12386 Vars.clear();
12387 for (unsigned i = 0; i != NumVars; ++i)
12388 Vars.push_back(Record.readSubExpr());
12389 C->setAssignmentOps(Vars);
12390}
12391
12392void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12393 C->setLParenLoc(Record.readSourceLocation());
12394 unsigned NumVars = C->varlist_size();
12395 SmallVector<Expr *, 16> Vars;
12396 Vars.reserve(NumVars);
12397 for (unsigned i = 0; i != NumVars; ++i)
12398 Vars.push_back(Record.readSubExpr());
12399 C->setVarRefs(Vars);
12400}
12401
12402void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12404 C->setLParenLoc(Record.readSourceLocation());
12405 C->setModifierLoc(Record.readSourceLocation());
12406 C->setColonLoc(Record.readSourceLocation());
12407 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12408 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12409 C->setQualifierLoc(NNSL);
12410 C->setNameInfo(DNI);
12411
12412 unsigned NumVars = C->varlist_size();
12413 SmallVector<Expr *, 16> Vars;
12414 Vars.reserve(NumVars);
12415 for (unsigned i = 0; i != NumVars; ++i)
12416 Vars.push_back(Record.readSubExpr());
12417 C->setVarRefs(Vars);
12418 Vars.clear();
12419 for (unsigned i = 0; i != NumVars; ++i)
12420 Vars.push_back(Record.readSubExpr());
12421 C->setPrivates(Vars);
12422 Vars.clear();
12423 for (unsigned i = 0; i != NumVars; ++i)
12424 Vars.push_back(Record.readSubExpr());
12425 C->setLHSExprs(Vars);
12426 Vars.clear();
12427 for (unsigned i = 0; i != NumVars; ++i)
12428 Vars.push_back(Record.readSubExpr());
12429 C->setRHSExprs(Vars);
12430 Vars.clear();
12431 for (unsigned i = 0; i != NumVars; ++i)
12432 Vars.push_back(Record.readSubExpr());
12433 C->setReductionOps(Vars);
12434 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12435 Vars.clear();
12436 for (unsigned i = 0; i != NumVars; ++i)
12437 Vars.push_back(Record.readSubExpr());
12438 C->setInscanCopyOps(Vars);
12439 Vars.clear();
12440 for (unsigned i = 0; i != NumVars; ++i)
12441 Vars.push_back(Record.readSubExpr());
12442 C->setInscanCopyArrayTemps(Vars);
12443 Vars.clear();
12444 for (unsigned i = 0; i != NumVars; ++i)
12445 Vars.push_back(Record.readSubExpr());
12446 C->setInscanCopyArrayElems(Vars);
12447 }
12448 unsigned NumFlags = Record.readInt();
12449 SmallVector<bool, 16> Flags;
12450 Flags.reserve(NumFlags);
12451 for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
12452 Flags.push_back(Record.readInt());
12453 C->setPrivateVariableReductionFlags(Flags);
12454}
12455
12456void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12458 C->setLParenLoc(Record.readSourceLocation());
12459 C->setColonLoc(Record.readSourceLocation());
12460 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12461 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12462 C->setQualifierLoc(NNSL);
12463 C->setNameInfo(DNI);
12464
12465 unsigned NumVars = C->varlist_size();
12466 SmallVector<Expr *, 16> Vars;
12467 Vars.reserve(NumVars);
12468 for (unsigned I = 0; I != NumVars; ++I)
12469 Vars.push_back(Record.readSubExpr());
12470 C->setVarRefs(Vars);
12471 Vars.clear();
12472 for (unsigned I = 0; I != NumVars; ++I)
12473 Vars.push_back(Record.readSubExpr());
12474 C->setPrivates(Vars);
12475 Vars.clear();
12476 for (unsigned I = 0; I != NumVars; ++I)
12477 Vars.push_back(Record.readSubExpr());
12478 C->setLHSExprs(Vars);
12479 Vars.clear();
12480 for (unsigned I = 0; I != NumVars; ++I)
12481 Vars.push_back(Record.readSubExpr());
12482 C->setRHSExprs(Vars);
12483 Vars.clear();
12484 for (unsigned I = 0; I != NumVars; ++I)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setReductionOps(Vars);
12487}
12488
12489void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12491 C->setLParenLoc(Record.readSourceLocation());
12492 C->setColonLoc(Record.readSourceLocation());
12493 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12494 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12495 C->setQualifierLoc(NNSL);
12496 C->setNameInfo(DNI);
12497
12498 unsigned NumVars = C->varlist_size();
12499 SmallVector<Expr *, 16> Vars;
12500 Vars.reserve(NumVars);
12501 for (unsigned I = 0; I != NumVars; ++I)
12502 Vars.push_back(Record.readSubExpr());
12503 C->setVarRefs(Vars);
12504 Vars.clear();
12505 for (unsigned I = 0; I != NumVars; ++I)
12506 Vars.push_back(Record.readSubExpr());
12507 C->setPrivates(Vars);
12508 Vars.clear();
12509 for (unsigned I = 0; I != NumVars; ++I)
12510 Vars.push_back(Record.readSubExpr());
12511 C->setLHSExprs(Vars);
12512 Vars.clear();
12513 for (unsigned I = 0; I != NumVars; ++I)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setRHSExprs(Vars);
12516 Vars.clear();
12517 for (unsigned I = 0; I != NumVars; ++I)
12518 Vars.push_back(Record.readSubExpr());
12519 C->setReductionOps(Vars);
12520 Vars.clear();
12521 for (unsigned I = 0; I != NumVars; ++I)
12522 Vars.push_back(Record.readSubExpr());
12523 C->setTaskgroupDescriptors(Vars);
12524}
12525
12526void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12528 C->setLParenLoc(Record.readSourceLocation());
12529 C->setColonLoc(Record.readSourceLocation());
12530 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12531 C->setModifierLoc(Record.readSourceLocation());
12532 unsigned NumVars = C->varlist_size();
12533 SmallVector<Expr *, 16> Vars;
12534 Vars.reserve(NumVars);
12535 for (unsigned i = 0; i != NumVars; ++i)
12536 Vars.push_back(Record.readSubExpr());
12537 C->setVarRefs(Vars);
12538 Vars.clear();
12539 for (unsigned i = 0; i != NumVars; ++i)
12540 Vars.push_back(Record.readSubExpr());
12541 C->setPrivates(Vars);
12542 Vars.clear();
12543 for (unsigned i = 0; i != NumVars; ++i)
12544 Vars.push_back(Record.readSubExpr());
12545 C->setInits(Vars);
12546 Vars.clear();
12547 for (unsigned i = 0; i != NumVars; ++i)
12548 Vars.push_back(Record.readSubExpr());
12549 C->setUpdates(Vars);
12550 Vars.clear();
12551 for (unsigned i = 0; i != NumVars; ++i)
12552 Vars.push_back(Record.readSubExpr());
12553 C->setFinals(Vars);
12554 C->setStep(Record.readSubExpr());
12555 C->setCalcStep(Record.readSubExpr());
12556 Vars.clear();
12557 for (unsigned I = 0; I != NumVars + 1; ++I)
12558 Vars.push_back(Record.readSubExpr());
12559 C->setUsedExprs(Vars);
12560}
12561
12562void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12563 C->setLParenLoc(Record.readSourceLocation());
12564 C->setColonLoc(Record.readSourceLocation());
12565 unsigned NumVars = C->varlist_size();
12566 SmallVector<Expr *, 16> Vars;
12567 Vars.reserve(NumVars);
12568 for (unsigned i = 0; i != NumVars; ++i)
12569 Vars.push_back(Record.readSubExpr());
12570 C->setVarRefs(Vars);
12571 C->setAlignment(Record.readSubExpr());
12572}
12573
12574void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12575 C->setLParenLoc(Record.readSourceLocation());
12576 unsigned NumVars = C->varlist_size();
12577 SmallVector<Expr *, 16> Exprs;
12578 Exprs.reserve(NumVars);
12579 for (unsigned i = 0; i != NumVars; ++i)
12580 Exprs.push_back(Record.readSubExpr());
12581 C->setVarRefs(Exprs);
12582 Exprs.clear();
12583 for (unsigned i = 0; i != NumVars; ++i)
12584 Exprs.push_back(Record.readSubExpr());
12585 C->setSourceExprs(Exprs);
12586 Exprs.clear();
12587 for (unsigned i = 0; i != NumVars; ++i)
12588 Exprs.push_back(Record.readSubExpr());
12589 C->setDestinationExprs(Exprs);
12590 Exprs.clear();
12591 for (unsigned i = 0; i != NumVars; ++i)
12592 Exprs.push_back(Record.readSubExpr());
12593 C->setAssignmentOps(Exprs);
12594}
12595
12596void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12597 C->setLParenLoc(Record.readSourceLocation());
12598 unsigned NumVars = C->varlist_size();
12599 SmallVector<Expr *, 16> Exprs;
12600 Exprs.reserve(NumVars);
12601 for (unsigned i = 0; i != NumVars; ++i)
12602 Exprs.push_back(Record.readSubExpr());
12603 C->setVarRefs(Exprs);
12604 Exprs.clear();
12605 for (unsigned i = 0; i != NumVars; ++i)
12606 Exprs.push_back(Record.readSubExpr());
12607 C->setSourceExprs(Exprs);
12608 Exprs.clear();
12609 for (unsigned i = 0; i != NumVars; ++i)
12610 Exprs.push_back(Record.readSubExpr());
12611 C->setDestinationExprs(Exprs);
12612 Exprs.clear();
12613 for (unsigned i = 0; i != NumVars; ++i)
12614 Exprs.push_back(Record.readSubExpr());
12615 C->setAssignmentOps(Exprs);
12616}
12617
12618void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12619 C->setLParenLoc(Record.readSourceLocation());
12620 unsigned NumVars = C->varlist_size();
12621 SmallVector<Expr *, 16> Vars;
12622 Vars.reserve(NumVars);
12623 for (unsigned i = 0; i != NumVars; ++i)
12624 Vars.push_back(Record.readSubExpr());
12625 C->setVarRefs(Vars);
12626}
12627
12628void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12629 C->setDepobj(Record.readSubExpr());
12630 C->setLParenLoc(Record.readSourceLocation());
12631}
12632
12633void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12634 C->setLParenLoc(Record.readSourceLocation());
12635 C->setModifier(Record.readSubExpr());
12636 C->setDependencyKind(
12637 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12638 C->setDependencyLoc(Record.readSourceLocation());
12639 C->setColonLoc(Record.readSourceLocation());
12640 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12641 unsigned NumVars = C->varlist_size();
12642 SmallVector<Expr *, 16> Vars;
12643 Vars.reserve(NumVars);
12644 for (unsigned I = 0; I != NumVars; ++I)
12645 Vars.push_back(Record.readSubExpr());
12646 C->setVarRefs(Vars);
12647 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12648 C->setLoopData(I, Record.readSubExpr());
12649}
12650
12651void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12653 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12654 C->setDevice(Record.readSubExpr());
12655 C->setModifierLoc(Record.readSourceLocation());
12656 C->setLParenLoc(Record.readSourceLocation());
12657}
12658
12659void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12660 C->setLParenLoc(Record.readSourceLocation());
12661 bool HasIteratorModifier = false;
12662 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12663 C->setMapTypeModifier(
12664 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12665 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12666 if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12667 HasIteratorModifier = true;
12668 }
12669 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12670 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12671 C->setMapType(
12672 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12673 C->setMapLoc(Record.readSourceLocation());
12674 C->setColonLoc(Record.readSourceLocation());
12675 auto NumVars = C->varlist_size();
12676 auto UniqueDecls = C->getUniqueDeclarationsNum();
12677 auto TotalLists = C->getTotalComponentListNum();
12678 auto TotalComponents = C->getTotalComponentsNum();
12679
12680 SmallVector<Expr *, 16> Vars;
12681 Vars.reserve(NumVars);
12682 for (unsigned i = 0; i != NumVars; ++i)
12683 Vars.push_back(Record.readExpr());
12684 C->setVarRefs(Vars);
12685
12686 SmallVector<Expr *, 16> UDMappers;
12687 UDMappers.reserve(NumVars);
12688 for (unsigned I = 0; I < NumVars; ++I)
12689 UDMappers.push_back(Record.readExpr());
12690 C->setUDMapperRefs(UDMappers);
12691
12692 if (HasIteratorModifier)
12693 C->setIteratorModifier(Record.readExpr());
12694
12695 SmallVector<ValueDecl *, 16> Decls;
12696 Decls.reserve(UniqueDecls);
12697 for (unsigned i = 0; i < UniqueDecls; ++i)
12698 Decls.push_back(Record.readDeclAs<ValueDecl>());
12699 C->setUniqueDecls(Decls);
12700
12701 SmallVector<unsigned, 16> ListsPerDecl;
12702 ListsPerDecl.reserve(UniqueDecls);
12703 for (unsigned i = 0; i < UniqueDecls; ++i)
12704 ListsPerDecl.push_back(Record.readInt());
12705 C->setDeclNumLists(ListsPerDecl);
12706
12707 SmallVector<unsigned, 32> ListSizes;
12708 ListSizes.reserve(TotalLists);
12709 for (unsigned i = 0; i < TotalLists; ++i)
12710 ListSizes.push_back(Record.readInt());
12711 C->setComponentListSizes(ListSizes);
12712
12713 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12714 Components.reserve(TotalComponents);
12715 for (unsigned i = 0; i < TotalComponents; ++i) {
12716 Expr *AssociatedExprPr = Record.readExpr();
12717 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12718 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12719 /*IsNonContiguous=*/false);
12720 }
12721 C->setComponents(Components, ListSizes);
12722}
12723
12724void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12725 C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12726 C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12727 C->setLParenLoc(Record.readSourceLocation());
12728 C->setColonLoc(Record.readSourceLocation());
12729 C->setAllocator(Record.readSubExpr());
12730 C->setAlignment(Record.readSubExpr());
12731 unsigned NumVars = C->varlist_size();
12732 SmallVector<Expr *, 16> Vars;
12733 Vars.reserve(NumVars);
12734 for (unsigned i = 0; i != NumVars; ++i)
12735 Vars.push_back(Record.readSubExpr());
12736 C->setVarRefs(Vars);
12737}
12738
12739void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12740 C->setModifier(Record.readEnum<OpenMPNumTeamsClauseModifier>());
12741 C->setModifierLoc(Record.readSourceLocation());
12742 C->setModifierExpr(Record.readSubExpr());
12744 C->setLParenLoc(Record.readSourceLocation());
12745 unsigned NumVars = C->varlist_size();
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
12753void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12754 C->setModifier(Record.readEnum<OpenMPThreadLimitClauseModifier>());
12755 C->setModifierLoc(Record.readSourceLocation());
12756 C->setModifierExpr(Record.readSubExpr());
12758 C->setLParenLoc(Record.readSourceLocation());
12759 unsigned NumVars = C->varlist_size();
12760 SmallVector<Expr *, 16> Vars;
12761 Vars.reserve(NumVars);
12762 for (unsigned I = 0; I != NumVars; ++I)
12763 Vars.push_back(Record.readSubExpr());
12764 C->setVarRefs(Vars);
12765}
12766
12767void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12769 C->setPriority(Record.readSubExpr());
12770 C->setLParenLoc(Record.readSourceLocation());
12771}
12772
12773void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12775 C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12776 C->setGrainsize(Record.readSubExpr());
12777 C->setModifierLoc(Record.readSourceLocation());
12778 C->setLParenLoc(Record.readSourceLocation());
12779}
12780
12781void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12783 C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12784 C->setNumTasks(Record.readSubExpr());
12785 C->setModifierLoc(Record.readSourceLocation());
12786 C->setLParenLoc(Record.readSourceLocation());
12787}
12788
12789void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12790 C->setHint(Record.readSubExpr());
12791 C->setLParenLoc(Record.readSourceLocation());
12792}
12793
12794void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12796 C->setDistScheduleKind(
12797 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12798 C->setChunkSize(Record.readSubExpr());
12799 C->setLParenLoc(Record.readSourceLocation());
12800 C->setDistScheduleKindLoc(Record.readSourceLocation());
12801 C->setCommaLoc(Record.readSourceLocation());
12802}
12803
12804void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12805 C->setDefaultmapKind(
12806 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12807 C->setDefaultmapModifier(
12808 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12809 C->setLParenLoc(Record.readSourceLocation());
12810 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12811 C->setDefaultmapKindLoc(Record.readSourceLocation());
12812}
12813
12814void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12815 C->setLParenLoc(Record.readSourceLocation());
12816 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12817 C->setMotionModifier(
12818 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12819 C->setMotionModifierLoc(I, Record.readSourceLocation());
12820 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12821 C->setIteratorModifier(Record.readExpr());
12822 }
12823 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12824 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12825 C->setColonLoc(Record.readSourceLocation());
12826 auto NumVars = C->varlist_size();
12827 auto UniqueDecls = C->getUniqueDeclarationsNum();
12828 auto TotalLists = C->getTotalComponentListNum();
12829 auto TotalComponents = C->getTotalComponentsNum();
12830
12831 SmallVector<Expr *, 16> Vars;
12832 Vars.reserve(NumVars);
12833 for (unsigned i = 0; i != NumVars; ++i)
12834 Vars.push_back(Record.readSubExpr());
12835 C->setVarRefs(Vars);
12836
12837 SmallVector<Expr *, 16> UDMappers;
12838 UDMappers.reserve(NumVars);
12839 for (unsigned I = 0; I < NumVars; ++I)
12840 UDMappers.push_back(Record.readSubExpr());
12841 C->setUDMapperRefs(UDMappers);
12842
12843 SmallVector<ValueDecl *, 16> Decls;
12844 Decls.reserve(UniqueDecls);
12845 for (unsigned i = 0; i < UniqueDecls; ++i)
12846 Decls.push_back(Record.readDeclAs<ValueDecl>());
12847 C->setUniqueDecls(Decls);
12848
12849 SmallVector<unsigned, 16> ListsPerDecl;
12850 ListsPerDecl.reserve(UniqueDecls);
12851 for (unsigned i = 0; i < UniqueDecls; ++i)
12852 ListsPerDecl.push_back(Record.readInt());
12853 C->setDeclNumLists(ListsPerDecl);
12854
12855 SmallVector<unsigned, 32> ListSizes;
12856 ListSizes.reserve(TotalLists);
12857 for (unsigned i = 0; i < TotalLists; ++i)
12858 ListSizes.push_back(Record.readInt());
12859 C->setComponentListSizes(ListSizes);
12860
12861 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12862 Components.reserve(TotalComponents);
12863 for (unsigned i = 0; i < TotalComponents; ++i) {
12864 Expr *AssociatedExprPr = Record.readSubExpr();
12865 bool IsNonContiguous = Record.readBool();
12866 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12867 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12868 }
12869 C->setComponents(Components, ListSizes);
12870}
12871
12872void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12873 C->setLParenLoc(Record.readSourceLocation());
12874 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12875 C->setMotionModifier(
12876 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12877 C->setMotionModifierLoc(I, Record.readSourceLocation());
12878 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12879 C->setIteratorModifier(Record.readExpr());
12880 }
12881 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12882 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12883 C->setColonLoc(Record.readSourceLocation());
12884 auto NumVars = C->varlist_size();
12885 auto UniqueDecls = C->getUniqueDeclarationsNum();
12886 auto TotalLists = C->getTotalComponentListNum();
12887 auto TotalComponents = C->getTotalComponentsNum();
12888
12889 SmallVector<Expr *, 16> Vars;
12890 Vars.reserve(NumVars);
12891 for (unsigned i = 0; i != NumVars; ++i)
12892 Vars.push_back(Record.readSubExpr());
12893 C->setVarRefs(Vars);
12894
12895 SmallVector<Expr *, 16> UDMappers;
12896 UDMappers.reserve(NumVars);
12897 for (unsigned I = 0; I < NumVars; ++I)
12898 UDMappers.push_back(Record.readSubExpr());
12899 C->setUDMapperRefs(UDMappers);
12900
12901 SmallVector<ValueDecl *, 16> Decls;
12902 Decls.reserve(UniqueDecls);
12903 for (unsigned i = 0; i < UniqueDecls; ++i)
12904 Decls.push_back(Record.readDeclAs<ValueDecl>());
12905 C->setUniqueDecls(Decls);
12906
12907 SmallVector<unsigned, 16> ListsPerDecl;
12908 ListsPerDecl.reserve(UniqueDecls);
12909 for (unsigned i = 0; i < UniqueDecls; ++i)
12910 ListsPerDecl.push_back(Record.readInt());
12911 C->setDeclNumLists(ListsPerDecl);
12912
12913 SmallVector<unsigned, 32> ListSizes;
12914 ListSizes.reserve(TotalLists);
12915 for (unsigned i = 0; i < TotalLists; ++i)
12916 ListSizes.push_back(Record.readInt());
12917 C->setComponentListSizes(ListSizes);
12918
12919 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12920 Components.reserve(TotalComponents);
12921 for (unsigned i = 0; i < TotalComponents; ++i) {
12922 Expr *AssociatedExprPr = Record.readSubExpr();
12923 bool IsNonContiguous = Record.readBool();
12924 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12925 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12926 }
12927 C->setComponents(Components, ListSizes);
12928}
12929
12930void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12931 C->setLParenLoc(Record.readSourceLocation());
12932 C->setFallbackModifier(Record.readEnum<OpenMPUseDevicePtrFallbackModifier>());
12933 C->setFallbackModifierLoc(Record.readSourceLocation());
12934 auto NumVars = C->varlist_size();
12935 auto UniqueDecls = C->getUniqueDeclarationsNum();
12936 auto TotalLists = C->getTotalComponentListNum();
12937 auto TotalComponents = C->getTotalComponentsNum();
12938
12939 SmallVector<Expr *, 16> Vars;
12940 Vars.reserve(NumVars);
12941 for (unsigned i = 0; i != NumVars; ++i)
12942 Vars.push_back(Record.readSubExpr());
12943 C->setVarRefs(Vars);
12944 Vars.clear();
12945 for (unsigned i = 0; i != NumVars; ++i)
12946 Vars.push_back(Record.readSubExpr());
12947 C->setPrivateCopies(Vars);
12948 Vars.clear();
12949 for (unsigned i = 0; i != NumVars; ++i)
12950 Vars.push_back(Record.readSubExpr());
12951 C->setInits(Vars);
12952
12953 SmallVector<ValueDecl *, 16> Decls;
12954 Decls.reserve(UniqueDecls);
12955 for (unsigned i = 0; i < UniqueDecls; ++i)
12956 Decls.push_back(Record.readDeclAs<ValueDecl>());
12957 C->setUniqueDecls(Decls);
12958
12959 SmallVector<unsigned, 16> ListsPerDecl;
12960 ListsPerDecl.reserve(UniqueDecls);
12961 for (unsigned i = 0; i < UniqueDecls; ++i)
12962 ListsPerDecl.push_back(Record.readInt());
12963 C->setDeclNumLists(ListsPerDecl);
12964
12965 SmallVector<unsigned, 32> ListSizes;
12966 ListSizes.reserve(TotalLists);
12967 for (unsigned i = 0; i < TotalLists; ++i)
12968 ListSizes.push_back(Record.readInt());
12969 C->setComponentListSizes(ListSizes);
12970
12971 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12972 Components.reserve(TotalComponents);
12973 for (unsigned i = 0; i < TotalComponents; ++i) {
12974 auto *AssociatedExprPr = Record.readSubExpr();
12975 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12976 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12977 /*IsNonContiguous=*/false);
12978 }
12979 C->setComponents(Components, ListSizes);
12980}
12981
12982void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12983 C->setLParenLoc(Record.readSourceLocation());
12984 auto NumVars = C->varlist_size();
12985 auto UniqueDecls = C->getUniqueDeclarationsNum();
12986 auto TotalLists = C->getTotalComponentListNum();
12987 auto TotalComponents = C->getTotalComponentsNum();
12988
12989 SmallVector<Expr *, 16> Vars;
12990 Vars.reserve(NumVars);
12991 for (unsigned i = 0; i != NumVars; ++i)
12992 Vars.push_back(Record.readSubExpr());
12993 C->setVarRefs(Vars);
12994
12995 SmallVector<ValueDecl *, 16> Decls;
12996 Decls.reserve(UniqueDecls);
12997 for (unsigned i = 0; i < UniqueDecls; ++i)
12998 Decls.push_back(Record.readDeclAs<ValueDecl>());
12999 C->setUniqueDecls(Decls);
13000
13001 SmallVector<unsigned, 16> ListsPerDecl;
13002 ListsPerDecl.reserve(UniqueDecls);
13003 for (unsigned i = 0; i < UniqueDecls; ++i)
13004 ListsPerDecl.push_back(Record.readInt());
13005 C->setDeclNumLists(ListsPerDecl);
13006
13007 SmallVector<unsigned, 32> ListSizes;
13008 ListSizes.reserve(TotalLists);
13009 for (unsigned i = 0; i < TotalLists; ++i)
13010 ListSizes.push_back(Record.readInt());
13011 C->setComponentListSizes(ListSizes);
13012
13013 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13014 Components.reserve(TotalComponents);
13015 for (unsigned i = 0; i < TotalComponents; ++i) {
13016 Expr *AssociatedExpr = Record.readSubExpr();
13017 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13018 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13019 /*IsNonContiguous*/ false);
13020 }
13021 C->setComponents(Components, ListSizes);
13022}
13023
13024void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
13025 C->setLParenLoc(Record.readSourceLocation());
13026 auto NumVars = C->varlist_size();
13027 auto UniqueDecls = C->getUniqueDeclarationsNum();
13028 auto TotalLists = C->getTotalComponentListNum();
13029 auto TotalComponents = C->getTotalComponentsNum();
13030
13031 SmallVector<Expr *, 16> Vars;
13032 Vars.reserve(NumVars);
13033 for (unsigned i = 0; i != NumVars; ++i)
13034 Vars.push_back(Record.readSubExpr());
13035 C->setVarRefs(Vars);
13036 Vars.clear();
13037
13038 SmallVector<ValueDecl *, 16> Decls;
13039 Decls.reserve(UniqueDecls);
13040 for (unsigned i = 0; i < UniqueDecls; ++i)
13041 Decls.push_back(Record.readDeclAs<ValueDecl>());
13042 C->setUniqueDecls(Decls);
13043
13044 SmallVector<unsigned, 16> ListsPerDecl;
13045 ListsPerDecl.reserve(UniqueDecls);
13046 for (unsigned i = 0; i < UniqueDecls; ++i)
13047 ListsPerDecl.push_back(Record.readInt());
13048 C->setDeclNumLists(ListsPerDecl);
13049
13050 SmallVector<unsigned, 32> ListSizes;
13051 ListSizes.reserve(TotalLists);
13052 for (unsigned i = 0; i < TotalLists; ++i)
13053 ListSizes.push_back(Record.readInt());
13054 C->setComponentListSizes(ListSizes);
13055
13056 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13057 Components.reserve(TotalComponents);
13058 for (unsigned i = 0; i < TotalComponents; ++i) {
13059 Expr *AssociatedExpr = Record.readSubExpr();
13060 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13061 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13062 /*IsNonContiguous=*/false);
13063 }
13064 C->setComponents(Components, ListSizes);
13065}
13066
13067void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
13068 C->setLParenLoc(Record.readSourceLocation());
13069 auto NumVars = C->varlist_size();
13070 auto UniqueDecls = C->getUniqueDeclarationsNum();
13071 auto TotalLists = C->getTotalComponentListNum();
13072 auto TotalComponents = C->getTotalComponentsNum();
13073
13074 SmallVector<Expr *, 16> Vars;
13075 Vars.reserve(NumVars);
13076 for (unsigned I = 0; I != NumVars; ++I)
13077 Vars.push_back(Record.readSubExpr());
13078 C->setVarRefs(Vars);
13079 Vars.clear();
13080
13081 SmallVector<ValueDecl *, 16> Decls;
13082 Decls.reserve(UniqueDecls);
13083 for (unsigned I = 0; I < UniqueDecls; ++I)
13084 Decls.push_back(Record.readDeclAs<ValueDecl>());
13085 C->setUniqueDecls(Decls);
13086
13087 SmallVector<unsigned, 16> ListsPerDecl;
13088 ListsPerDecl.reserve(UniqueDecls);
13089 for (unsigned I = 0; I < UniqueDecls; ++I)
13090 ListsPerDecl.push_back(Record.readInt());
13091 C->setDeclNumLists(ListsPerDecl);
13092
13093 SmallVector<unsigned, 32> ListSizes;
13094 ListSizes.reserve(TotalLists);
13095 for (unsigned i = 0; i < TotalLists; ++i)
13096 ListSizes.push_back(Record.readInt());
13097 C->setComponentListSizes(ListSizes);
13098
13099 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13100 Components.reserve(TotalComponents);
13101 for (unsigned I = 0; I < TotalComponents; ++I) {
13102 Expr *AssociatedExpr = Record.readSubExpr();
13103 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13104 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13105 /*IsNonContiguous=*/false);
13106 }
13107 C->setComponents(Components, ListSizes);
13108}
13109
13110void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
13111 C->setLParenLoc(Record.readSourceLocation());
13112 unsigned NumVars = C->varlist_size();
13113 SmallVector<Expr *, 16> Vars;
13114 Vars.reserve(NumVars);
13115 for (unsigned i = 0; i != NumVars; ++i)
13116 Vars.push_back(Record.readSubExpr());
13117 C->setVarRefs(Vars);
13118 Vars.clear();
13119 Vars.reserve(NumVars);
13120 for (unsigned i = 0; i != NumVars; ++i)
13121 Vars.push_back(Record.readSubExpr());
13122 C->setPrivateRefs(Vars);
13123}
13124
13125void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
13126 C->setLParenLoc(Record.readSourceLocation());
13127 unsigned NumVars = C->varlist_size();
13128 SmallVector<Expr *, 16> Vars;
13129 Vars.reserve(NumVars);
13130 for (unsigned i = 0; i != NumVars; ++i)
13131 Vars.push_back(Record.readSubExpr());
13132 C->setVarRefs(Vars);
13133}
13134
13135void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
13136 C->setLParenLoc(Record.readSourceLocation());
13137 unsigned NumVars = C->varlist_size();
13138 SmallVector<Expr *, 16> Vars;
13139 Vars.reserve(NumVars);
13140 for (unsigned i = 0; i != NumVars; ++i)
13141 Vars.push_back(Record.readSubExpr());
13142 C->setVarRefs(Vars);
13143}
13144
13145void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
13146 C->setLParenLoc(Record.readSourceLocation());
13147 unsigned NumOfAllocators = C->getNumberOfAllocators();
13148 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
13149 Data.reserve(NumOfAllocators);
13150 for (unsigned I = 0; I != NumOfAllocators; ++I) {
13151 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
13152 D.Allocator = Record.readSubExpr();
13153 D.AllocatorTraits = Record.readSubExpr();
13154 D.LParenLoc = Record.readSourceLocation();
13155 D.RParenLoc = Record.readSourceLocation();
13156 }
13157 C->setAllocatorsData(Data);
13158}
13159
13160void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
13161 C->setLParenLoc(Record.readSourceLocation());
13162 C->setModifier(Record.readSubExpr());
13163 C->setColonLoc(Record.readSourceLocation());
13164 unsigned NumOfLocators = C->varlist_size();
13165 SmallVector<Expr *, 4> Locators;
13166 Locators.reserve(NumOfLocators);
13167 for (unsigned I = 0; I != NumOfLocators; ++I)
13168 Locators.push_back(Record.readSubExpr());
13169 C->setVarRefs(Locators);
13170}
13171
13172void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
13173 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
13174 C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
13175 C->setLParenLoc(Record.readSourceLocation());
13176 C->setKindKwLoc(Record.readSourceLocation());
13177 C->setModifierKwLoc(Record.readSourceLocation());
13178}
13179
13180void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
13182 C->setThreadID(Record.readSubExpr());
13183 C->setLParenLoc(Record.readSourceLocation());
13184}
13185
13186void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
13187 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
13188 C->setLParenLoc(Record.readSourceLocation());
13189 C->setBindKindLoc(Record.readSourceLocation());
13190}
13191
13192void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
13193 C->setAlignment(Record.readExpr());
13194 C->setLParenLoc(Record.readSourceLocation());
13195}
13196
13197void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
13199 C->setSize(Record.readSubExpr());
13200 C->setLParenLoc(Record.readSourceLocation());
13201}
13202
13203void OMPClauseReader::VisitOMPDynGroupprivateClause(
13204 OMPDynGroupprivateClause *C) {
13206 C->setDynGroupprivateModifier(
13207 Record.readEnum<OpenMPDynGroupprivateClauseModifier>());
13208 C->setDynGroupprivateFallbackModifier(
13210 C->setSize(Record.readSubExpr());
13211 C->setLParenLoc(Record.readSourceLocation());
13212 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13213 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13214}
13215
13216void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
13217 C->setLParenLoc(Record.readSourceLocation());
13218 C->setDependenceType(
13219 static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
13220 C->setDependenceLoc(Record.readSourceLocation());
13221 C->setColonLoc(Record.readSourceLocation());
13222 unsigned NumVars = C->varlist_size();
13223 SmallVector<Expr *, 16> Vars;
13224 Vars.reserve(NumVars);
13225 for (unsigned I = 0; I != NumVars; ++I)
13226 Vars.push_back(Record.readSubExpr());
13227 C->setVarRefs(Vars);
13228 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
13229 C->setLoopData(I, Record.readSubExpr());
13230}
13231
13232void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
13233 AttrVec Attrs;
13234 Record.readAttributes(Attrs);
13235 C->setAttrs(Attrs);
13236 C->setLocStart(Record.readSourceLocation());
13237 C->setLParenLoc(Record.readSourceLocation());
13238 C->setLocEnd(Record.readSourceLocation());
13239}
13240
13241void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
13242
13245 TI.Sets.resize(readUInt32());
13246 for (auto &Set : TI.Sets) {
13248 Set.Selectors.resize(readUInt32());
13249 for (auto &Selector : Set.Selectors) {
13251 Selector.ScoreOrCondition = nullptr;
13252 if (readBool())
13253 Selector.ScoreOrCondition = readExprRef();
13254 Selector.Properties.resize(readUInt32());
13255 for (auto &Property : Selector.Properties)
13257 }
13258 }
13259 return &TI;
13260}
13261
13263 if (!Data)
13264 return;
13265 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13266 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
13267 skipInts(3);
13268 }
13269 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
13270 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
13271 Clauses[I] = readOMPClause();
13272 Data->setClauses(Clauses);
13273 if (Data->hasAssociatedStmt())
13274 Data->setAssociatedStmt(readStmt());
13275 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
13276 Data->getChildren()[I] = readStmt();
13277}
13278
13280 unsigned NumVars = readInt();
13282 for (unsigned I = 0; I < NumVars; ++I)
13283 VarList.push_back(readExpr());
13284 return VarList;
13285}
13286
13288 unsigned NumExprs = readInt();
13290 for (unsigned I = 0; I < NumExprs; ++I)
13291 ExprList.push_back(readSubExpr());
13292 return ExprList;
13293}
13294
13299
13300 switch (ClauseKind) {
13302 SourceLocation LParenLoc = readSourceLocation();
13304 return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
13305 EndLoc);
13306 }
13307 case OpenACCClauseKind::If: {
13308 SourceLocation LParenLoc = readSourceLocation();
13309 Expr *CondExpr = readSubExpr();
13310 return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
13311 EndLoc);
13312 }
13314 SourceLocation LParenLoc = readSourceLocation();
13315 bool isConditionExprClause = readBool();
13316 if (isConditionExprClause) {
13317 Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
13318 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
13319 CondExpr, EndLoc);
13320 }
13321 unsigned NumVars = readInt();
13323 for (unsigned I = 0; I < NumVars; ++I)
13324 VarList.push_back(readSubExpr());
13325 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13326 EndLoc);
13327 }
13329 SourceLocation LParenLoc = readSourceLocation();
13330 unsigned NumClauses = readInt();
13332 for (unsigned I = 0; I < NumClauses; ++I)
13333 IntExprs.push_back(readSubExpr());
13334 return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
13335 IntExprs, EndLoc);
13336 }
13338 SourceLocation LParenLoc = readSourceLocation();
13339 Expr *IntExpr = readSubExpr();
13340 return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
13341 IntExpr, EndLoc);
13342 }
13344 SourceLocation LParenLoc = readSourceLocation();
13345 Expr *IntExpr = readSubExpr();
13346 return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
13347 IntExpr, EndLoc);
13348 }
13350 SourceLocation LParenLoc = readSourceLocation();
13351 Expr *IntExpr = readSubExpr();
13352 return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13353 IntExpr, EndLoc);
13354 }
13356 SourceLocation LParenLoc = readSourceLocation();
13357 Expr *IntExpr = readSubExpr();
13358 return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
13359 IntExpr, EndLoc);
13360 }
13362 SourceLocation LParenLoc = readSourceLocation();
13364
13366 for (unsigned I = 0; I < VarList.size(); ++I) {
13367 static_assert(sizeof(OpenACCPrivateRecipe) == 1 * sizeof(int *));
13368 VarDecl *Alloca = readDeclAs<VarDecl>();
13369 RecipeList.push_back({Alloca});
13370 }
13371
13372 return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13373 VarList, RecipeList, EndLoc);
13374 }
13376 SourceLocation LParenLoc = readSourceLocation();
13378 return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13379 EndLoc);
13380 }
13382 SourceLocation LParenLoc = readSourceLocation();
13384 return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13385 VarList, EndLoc);
13386 }
13388 SourceLocation LParenLoc = readSourceLocation();
13391 for (unsigned I = 0; I < VarList.size(); ++I) {
13392 static_assert(sizeof(OpenACCFirstPrivateRecipe) == 2 * sizeof(int *));
13393 VarDecl *Recipe = readDeclAs<VarDecl>();
13394 VarDecl *RecipeTemp = readDeclAs<VarDecl>();
13395 RecipeList.push_back({Recipe, RecipeTemp});
13396 }
13397
13398 return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13399 VarList, RecipeList, EndLoc);
13400 }
13402 SourceLocation LParenLoc = readSourceLocation();
13404 return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
13405 VarList, EndLoc);
13406 }
13408 SourceLocation LParenLoc = readSourceLocation();
13410 return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
13411 VarList, EndLoc);
13412 }
13414 SourceLocation LParenLoc = readSourceLocation();
13416 return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
13417 VarList, EndLoc);
13418 }
13420 SourceLocation LParenLoc = readSourceLocation();
13422 return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13423 VarList, EndLoc);
13424 }
13426 SourceLocation LParenLoc = readSourceLocation();
13428 return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
13429 VarList, EndLoc);
13430 }
13432 SourceLocation LParenLoc = readSourceLocation();
13434 return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
13435 VarList, EndLoc);
13436 }
13438 SourceLocation LParenLoc = readSourceLocation();
13440 return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
13441 VarList, EndLoc);
13442 }
13446 SourceLocation LParenLoc = readSourceLocation();
13449 return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
13450 LParenLoc, ModList, VarList, EndLoc);
13451 }
13455 SourceLocation LParenLoc = readSourceLocation();
13458 return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
13459 LParenLoc, ModList, VarList, EndLoc);
13460 }
13464 SourceLocation LParenLoc = readSourceLocation();
13467 return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
13468 LParenLoc, ModList, VarList, EndLoc);
13469 }
13473 SourceLocation LParenLoc = readSourceLocation();
13476 return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
13477 LParenLoc, ModList, VarList, EndLoc);
13478 }
13480 SourceLocation LParenLoc = readSourceLocation();
13481 Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
13482 return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13483 AsyncExpr, EndLoc);
13484 }
13486 SourceLocation LParenLoc = readSourceLocation();
13487 Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
13488 SourceLocation QueuesLoc = readSourceLocation();
13490 return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
13491 DevNumExpr, QueuesLoc, QueueIdExprs,
13492 EndLoc);
13493 }
13496 SourceLocation LParenLoc = readSourceLocation();
13498 unsigned NumArchs = readInt();
13499
13500 for (unsigned I = 0; I < NumArchs; ++I) {
13501 IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
13503 Archs.emplace_back(Loc, Ident);
13504 }
13505
13506 return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
13507 LParenLoc, Archs, EndLoc);
13508 }
13510 SourceLocation LParenLoc = readSourceLocation();
13514
13515 for (unsigned I = 0; I < VarList.size(); ++I) {
13516 VarDecl *Recipe = readDeclAs<VarDecl>();
13517
13518 static_assert(sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
13519 3 * sizeof(int *));
13520
13522 unsigned NumCombiners = readInt();
13523 for (unsigned I = 0; I < NumCombiners; ++I) {
13526 Expr *Op = readExpr();
13527
13528 Combiners.push_back({LHS, RHS, Op});
13529 }
13530
13531 RecipeList.push_back({Recipe, Combiners});
13532 }
13533
13534 return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
13535 VarList, RecipeList, EndLoc);
13536 }
13538 return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
13540 return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
13542 return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
13544 return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
13546 return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
13548 return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
13550 SourceLocation LParenLoc = readSourceLocation();
13551 bool HasForce = readBool();
13552 Expr *LoopCount = readSubExpr();
13553 return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
13554 HasForce, LoopCount, EndLoc);
13555 }
13557 SourceLocation LParenLoc = readSourceLocation();
13558 unsigned NumClauses = readInt();
13559 llvm::SmallVector<Expr *> SizeExprs;
13560 for (unsigned I = 0; I < NumClauses; ++I)
13561 SizeExprs.push_back(readSubExpr());
13562 return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
13563 SizeExprs, EndLoc);
13564 }
13566 SourceLocation LParenLoc = readSourceLocation();
13567 unsigned NumExprs = readInt();
13570 for (unsigned I = 0; I < NumExprs; ++I) {
13571 GangKinds.push_back(readEnum<OpenACCGangKind>());
13572 // Can't use `readSubExpr` because this is usable from a 'decl' construct.
13573 Exprs.push_back(readExpr());
13574 }
13575 return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
13576 GangKinds, Exprs, EndLoc);
13577 }
13579 SourceLocation LParenLoc = readSourceLocation();
13580 Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
13581 return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
13582 WorkerExpr, EndLoc);
13583 }
13585 SourceLocation LParenLoc = readSourceLocation();
13586 Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
13587 return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
13588 VectorExpr, EndLoc);
13589 }
13591 SourceLocation LParenLoc = readSourceLocation();
13593 return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13594 EndLoc);
13595 }
13597 SourceLocation LParenLoc = readSourceLocation();
13600 LParenLoc, VarList, EndLoc);
13601 }
13602
13604 SourceLocation LParenLoc = readSourceLocation();
13605 bool IsString = readBool();
13606 if (IsString)
13607 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13608 cast<StringLiteral>(readExpr()), EndLoc);
13609 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13610 readIdentifier(), EndLoc);
13611 }
13614 llvm_unreachable("Clause serialization not yet implemented");
13615 }
13616 llvm_unreachable("Invalid Clause Kind");
13617}
13618
13621 for (unsigned I = 0; I < Clauses.size(); ++I)
13622 Clauses[I] = readOpenACCClause();
13623}
13624
13625void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
13626 unsigned NumVars = readInt();
13627 A->Clauses.resize(NumVars);
13628 readOpenACCClauseList(A->Clauses);
13629}
13630
13631static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
13632 // TODO: Maybe it is better to check PrimaryModuleName is a valid
13633 // module name?
13634 llvm::FoldingSetNodeID ID;
13635 ID.AddString(PrimaryModuleName);
13636 return ID.computeStableHash();
13637}
13638
13640 if (!M)
13641 return std::nullopt;
13642
13643 if (M->isHeaderLikeModule())
13644 return std::nullopt;
13645
13646 if (M->isGlobalModule())
13647 return std::nullopt;
13648
13649 StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
13650 return getStableHashForModuleName(PrimaryModuleName);
13651}
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....
This file defines OpenMP nodes for declarative directives.
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.
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.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to RISC-V.
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:636
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.
This represents 'bind' clause in the 'pragma omp ...' directives.
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.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive. This clause does not ...
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:239
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:903
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:1980
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
Definition ASTReader.h:432
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const TypedefNameDecl * > &Decls) override
Read the set of potentially unused typedefs known to the source.
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:2618
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:2173
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:1828
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1841
@ 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:1832
@ 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:1836
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:2652
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:2183
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:1812
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:2630
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:2049
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:2504
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:2079
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.
static std::pair< SourceLocation::UIntTy, SourceLocationEncoding::Chain > ReadSourceLocationOffset(const RecordDataImpl &Record, unsigned Idx, SourceLocation::UIntTy InitialDelta)
Read a source location offset from Record at Idx, returning it together with a chain anchored at that...
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.
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:2625
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:1988
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:1475
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
static std::pair< SourceLocation::UIntTy, SourceLocationEncoding::Chain > ReadEntryOffset(const RecordDataImpl &Record)
Read an SLocEntry record's first field, returning it together with a chain anchored at that entry.
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:2532
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:2137
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:2482
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:1984
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:2526
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:1813
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:1949
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:1808
void setLBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1814
void setRBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1822
void setSizeExpr(Expr *Size)
Definition TypeLoc.h:1834
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2720
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2712
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2704
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:2436
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2430
void setCaretLoc(SourceLocation Loc)
Definition TypeLoc.h:1563
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:2642
Represents a C++ base or member initializer.
Definition DeclCXX.h:2407
void setSourceOrder(int Pos)
Set the source order of this initializer.
Definition DeclCXX.h:2594
Represents a C++ destructor within a class.
Definition DeclCXX.h:2907
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
base_class_iterator bases_begin()
Definition DeclCXX.h:616
base_class_iterator vbases_begin()
Definition DeclCXX.h:633
Represents a C++ temporary.
Definition ExprCXX.h:1464
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition ExprCXX.cpp:1145
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, TemplateName 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:2750
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:2723
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2738
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:2423
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition DeclBase.h:2744
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:2764
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
Definition DeclID.h:128
DeclID getRawValue() const
Definition DeclID.h:118
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Definition DeclID.h:111
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:550
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:781
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2322
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2319
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2562
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2544
void setTemplateNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2550
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2008
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2029
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2632
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2612
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2621
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2127
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2099
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:241
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
Definition Diagnostic.h:635
bool getEnableAllWarnings() const
Definition Diagnostic.h:735
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:246
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
Definition Diagnostic.h:761
bool getWarningsAsErrors() const
Definition Diagnostic.h:743
diag::Severity getExtensionHandlingBehavior() const
Definition Diagnostic.h:851
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
Definition Diagnostic.h:630
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
Definition TypeLoc.h:744
This represents one expression.
Definition Expr.h:113
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:3295
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:57
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:2059
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5416
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5705
Wrapper for source info for functions.
Definition TypeLoc.h:1675
unsigned getNumParams() const
Definition TypeLoc.h:1747
void setLocalRangeBegin(SourceLocation L)
Definition TypeLoc.h:1695
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1711
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1754
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1719
void setLocalRangeEnd(SourceLocation L)
Definition TypeLoc.h:1703
void setExceptionSpecRange(SourceRange R)
Definition TypeLoc.h:1733
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 ModulesValidateDirectoryDependencies
Whether to treat an implicitly built module as out of date when a directory it depends on the listing...
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:3602
Wrapper for source info for injected class names of class templates.
Definition TypeLoc.h:872
void setAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1645
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Definition LangOptions.h:84
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.
LangStandard::Kind LangStd
The used language standard.
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:1414
void setAttrRowOperand(Expr *e)
Definition TypeLoc.h:2162
void setAttrColumnOperand(Expr *e)
Definition TypeLoc.h:2168
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2177
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2156
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1581
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:1590
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:40
virtual std::optional< bool > isDirectoryInvalidated(StringRef Directory)
Whether the build system reported that Directory changed before the build session started,...
Definition ModuleCache.h:80
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:953
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:336
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition Module.h:674
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
Definition Module.h:609
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:731
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:564
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
Definition Module.h:654
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:646
@ Hidden
All of the names in this module are hidden.
Definition Module.h:648
@ AllVisible
All of the names in this module are visible.
Definition Module.h:650
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
Definition Module.h:964
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:544
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:1013
bool isUnimportable() const
Determine whether this module has been declared unimportable.
Definition Module.h:766
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
Definition Module.h:970
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:592
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:958
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
Definition Module.h:598
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
Definition Module.h:637
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:723
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
Definition Module.h:692
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition Module.h:988
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
Definition Module.h:555
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
Definition Module.h:869
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:665
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
Definition Module.h:642
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
Definition Module.h:908
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
Definition Module.h:627
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:410
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:441
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:619
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
Definition Module.cpp:402
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:744
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:579
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
Definition Module.h:980
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
Definition Module.h:420
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:575
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Definition Module.h:614
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
Definition Module.h:852
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:661
std::vector< Conflict > Conflicts
The list of conflicts.
Definition Module.h:756
This represents a decl that may have a name.
Definition Decl.h:275
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:341
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:1848
Represent a C++ namespace.
Definition Decl.h:593
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 the 'depth' clause on the 'pragma omp flatten' (and 'pragma omp fuse') loop-transform...
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
static OMPNumThreadsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N expressions.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
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:1022
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:526
void setLazyBody(uint64_t Offset)
Definition DeclObjC.h:531
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1623
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:2664
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2347
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1446
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1442
Represents a parameter to a function.
Definition Decl.h:1820
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2756
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1550
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:938
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
@ FastWidth
The width of the "fast" qualifier mask.
Definition TypeBase.h:377
@ FastMask
The fast qualifier mask.
Definition TypeBase.h:380
void setAmpAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1659
Wrapper for source info for record types.
Definition TypeLoc.h:855
Declaration of a redeclarable template.
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:863
SemaObjC & ObjC()
Definition Sema.h:1544
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:677
IdentifierResolver IdResolver
Definition Sema.h:3577
PragmaMsStackAction
Definition Sema.h:1879
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.
A delta encoder for a run of source locations.
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.
bool isFileOverridden(const FileEntry *File) const
Returns true if the file contents have been overridden.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
OptionalFileEntryRef bypassFileContentsOverride(FileEntryRef File)
Bypass the overridden contents of a file.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
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:85
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:1944
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TypeLoc.cpp:653
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:3425
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:2296
A container of type source information.
Definition TypeBase.h:8417
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:1879
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9299
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3697
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2239
void setTypeofLoc(SourceLocation Loc)
Definition TypeLoc.h:2231
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2247
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2381
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2375
void setUnderlyingTInfo(TypeSourceInfo *TInfo)
Definition TypeLoc.h:2387
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2378
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:713
Represents a variable declaration or definition.
Definition Decl.h:933
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2076
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:420
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
Definition ModuleFile.h:375
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
Definition ModuleFile.h:499
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
Definition ModuleFile.h:287
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
Definition ModuleFile.h:277
StringRef Data
The serialized bitstream data for this file.
Definition ModuleFile.h:263
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:527
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
Definition ModuleFile.h:467
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:339
std::vector< std::string > DirectoryDependencies
Directories this module file depends on the listing of.
Definition ModuleFile.h:208
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:365
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
Definition ModuleFile.h:418
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
Definition ModuleFile.h:547
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:530
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
Definition ModuleFile.h:392
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
Definition ModuleFile.h:302
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
Definition ModuleFile.h:379
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
Definition ModuleFile.h:355
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:506
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
Definition ModuleFile.h:470
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
Definition ModuleFile.h:371
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
Definition ModuleFile.h:464
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
Definition ModuleFile.h:346
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
Definition ModuleFile.h:296
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
Definition ModuleFile.h:305
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
Definition ModuleFile.h:484
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
Definition ModuleFile.h:555
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
Definition ModuleFile.h:439
SourceLocation ImportLoc
The source location where this module was first imported.
Definition ModuleFile.h:280
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
Definition ModuleFile.h:522
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
Definition ModuleFile.h:350
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
Definition ModuleFile.h:385
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:226
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:414
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
Definition ModuleFile.h:308
unsigned LocalNumSubmodules
The number of submodules in this module.
Definition ModuleFile.h:448
SourceLocation FirstLoc
The first source location in this module.
Definition ModuleFile.h:283
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
Definition ModuleFile.h:458
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:234
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
Definition ModuleFile.h:333
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
Definition ModuleFile.h:220
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:573
bool HasTimestamps
Whether timestamps are included in this module file.
Definition ModuleFile.h:217
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
Definition ModuleFile.h:299
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
Definition ModuleFile.h:330
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
Definition ModuleFile.h:211
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
Definition ModuleFile.h:481
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
Definition ModuleFile.h:519
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
Definition ModuleFile.h:336
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
Definition ModuleFile.h:443
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:266
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
Definition ModuleFile.h:451
uint64_t SizeInBits
The size of this file, in bits.
Definition ModuleFile.h:254
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
Definition ModuleFile.h:543
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition ModuleFile.h:257
bool StandardCXXModule
Whether this module file is a standard C++ module.
Definition ModuleFile.h:214
unsigned LocalNumTypes
The number of types in this AST file.
Definition ModuleFile.h:539
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:291
const PPSkippedRange * PreprocessedSkippedRangeOffsets
Definition ModuleFile.h:426
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
Definition ModuleFile.h:318
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
Definition ModuleFile.h:411
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
Definition ModuleFile.h:342
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
Definition ModuleFile.h:570
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
Definition ModuleFile.h:455
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition ModuleFile.h:516
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
Definition ModuleFile.h:405
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
Definition ModuleFile.h:230
unsigned LocalNumMacros
The number of macros in this AST file.
Definition ModuleFile.h:388
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
Definition ModuleFile.h:492
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
Definition ModuleFile.h:512
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
Definition ModuleFile.h:432
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
Definition ModuleFile.h:237
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
Definition ModuleFile.h:325
unsigned Generation
The generation of which this module file is a part.
Definition ModuleFile.h:247
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
Definition ModuleFile.h:362
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
Definition ModuleFile.h:487
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
Definition ModuleFile.h:399
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
Definition ModuleFile.h:260
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:461
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
Definition ModuleFile.h:240
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:509
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
Definition ModuleFile.h:552
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
Definition ModuleFile.h:424
unsigned LocalNumSelectors
The number of selectors new to this file.
Definition ModuleFile.h:477
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:402
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:534
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:566
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_META_INFO_ID
C++26 std::meta::info 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_DIRECTORY_DEPENDENCIES
Record code for the directories this AST file depends on the listing of.
@ 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.
@ OMP_REQUIRES_DECLS
Record code for the OpenMP 'requires' directives seen in the TU.
@ 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:33
Top level wrappers for InstallAPI frontend operations.
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.
@ 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:127
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:90
@ 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
@ PREDEF_DECL_BUILTIN_ZOS_VA_LIST_ID
The internal '__builtin_zos_va_list' typedef.
Definition DeclID.h:84
@ Property
The type of a property.
Definition TypeBase.h:912
@ Result
The result type of a method or function.
Definition TypeBase.h:906
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
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
OpenMPThreadLimitClauseModifier
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:2722
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
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:6028
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
int32_t uint32_t
int32_t uint32_t uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_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:747
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:752
ModuleRef Other
The module that this module conflicts with.
Definition Module.h:749
Information about a header directive as found in the module map file.
Definition Module.h:490
A library or framework to link against when an entity from this module is used.
Definition Module.h:706
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:754
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
Definition Decl.h:768
NestedNameSpecifierLoc QualifierLoc
Definition Decl.h:755
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Definition Decl.h:761
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:1890
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