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 // The base directory is relative if the module was found through a
4886 // relative search path, and empty with -fmodule-file-home-is-cwd.
4887 SmallString<256> Dir(ReadPath(F, Record, Idx));
4889 F.DirectoryDependencies.push_back(std::string(Dir));
4890 }
4891}
4892
4893bool ASTReader::isDirectoryDependencyOutOfDate(ModuleFile &F, bool Complain) {
4894 llvm::vfs::FileSystem &FS = PP.getFileManager().getVirtualFileSystem();
4895 // Adding or removing an entry updates the modification time of the directory
4896 // holding it, so comparing every directory in the tree against the module
4897 // file catches a header that was added, even one whose own modification time
4898 // is older. A directory that doesn't exist has no listing to depend on.
4899 auto IsNewer = [&](StringRef Dir) {
4900 llvm::ErrorOr<llvm::vfs::Status> Status = FS.status(Dir);
4901 return Status && Status->isDirectory() &&
4902 llvm::sys::toTimeT(Status->getLastModificationTime()) > F.ModTime;
4903 };
4904
4905 ModuleCache &ModCache = getModuleManager().getModuleCache();
4906 const HeaderSearchOptions &HSOpts =
4907 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4908 for (StringRef Dir : F.DirectoryDependencies) {
4909 if (std::optional<bool> Invalidated =
4910 ModCache.isDirectoryInvalidated(Dir)) {
4911 // The build system reports paths as changed before the build session
4912 // started, so a module built during it is newer than them.
4913 if (!*Invalidated ||
4914 static_cast<uint64_t>(F.ModTime) >= HSOpts.BuildSessionTimestamp)
4915 continue;
4916 Diag(diag::remark_module_path_invalidated) << F.ModuleName << Dir;
4917 if (Complain)
4918 Diag(diag::err_module_path_invalidated) << F.ModuleName << Dir;
4919 return true;
4920 }
4921
4922 std::optional<std::string> Changed;
4923 if (IsNewer(Dir)) {
4924 Changed = Dir.str();
4925 } else {
4926 std::error_code EC;
4927 for (llvm::vfs::recursive_directory_iterator I(FS, Dir, EC), E;
4928 I != E && !EC; I.increment(EC)) {
4929 if (I->type() == llvm::sys::fs::file_type::directory_file &&
4930 IsNewer(I->path())) {
4931 Changed = I->path().str();
4932 break;
4933 }
4934 }
4935 }
4936 if (!Changed)
4937 continue;
4938 Diag(diag::remark_module_directory_dep_changed) << F.ModuleName << *Changed;
4939 if (Complain)
4940 Diag(diag::err_module_directory_dep_changed) << F.ModuleName << *Changed;
4941 return true;
4942 }
4943 return false;
4944}
4945
4946/// Move the given method to the back of the global list of methods.
4948 // Find the entry for this selector in the method pool.
4949 SemaObjC::GlobalMethodPool::iterator Known =
4950 S.ObjC().MethodPool.find(Method->getSelector());
4951 if (Known == S.ObjC().MethodPool.end())
4952 return;
4953
4954 // Retrieve the appropriate method list.
4955 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4956 : Known->second.second;
4957 bool Found = false;
4958 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4959 if (!Found) {
4960 if (List->getMethod() == Method) {
4961 Found = true;
4962 } else {
4963 // Keep searching.
4964 continue;
4965 }
4966 }
4967
4968 if (List->getNext())
4969 List->setMethod(List->getNext()->getMethod());
4970 else
4971 List->setMethod(Method);
4972 }
4973}
4974
4975void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4976 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4977 for (Decl *D : Names) {
4978 bool wasHidden = !D->isUnconditionallyVisible();
4980
4981 if (wasHidden && SemaObj) {
4982 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4984 }
4985 }
4986 }
4987}
4988
4990 Module::NameVisibilityKind NameVisibility,
4991 SourceLocation ImportLoc) {
4994 Stack.push_back(Mod);
4995 while (!Stack.empty()) {
4996 Mod = Stack.pop_back_val();
4997
4998 if (NameVisibility <= Mod->NameVisibility) {
4999 // This module already has this level of visibility (or greater), so
5000 // there is nothing more to do.
5001 continue;
5002 }
5003
5004 if (Mod->isUnimportable()) {
5005 // Modules that aren't importable cannot be made visible.
5006 continue;
5007 }
5008
5009 // Update the module's name visibility.
5010 Mod->NameVisibility = NameVisibility;
5011
5012 // If we've already deserialized any names from this module,
5013 // mark them as visible.
5014 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
5015 if (Hidden != HiddenNamesMap.end()) {
5016 auto HiddenNames = std::move(*Hidden);
5017 HiddenNamesMap.erase(Hidden);
5018 makeNamesVisible(HiddenNames.second, HiddenNames.first);
5019 assert(!HiddenNamesMap.contains(Mod) &&
5020 "making names visible added hidden names");
5021 }
5022
5023 // Push any exported modules onto the stack to be marked as visible.
5025 Mod->getExportedModules(Exports);
5027 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
5028 Module *Exported = *I;
5029 if (Visited.insert(Exported).second)
5030 Stack.push_back(Exported);
5031 }
5032 }
5033}
5034
5035/// We've merged the definition \p MergedDef into the existing definition
5036/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
5037/// visible.
5039 NamedDecl *MergedDef) {
5040 if (!Def->isUnconditionallyVisible()) {
5041 // If MergedDef is visible or becomes visible, make the definition visible.
5042 if (MergedDef->isUnconditionallyVisible())
5044 else {
5045 getContext().mergeDefinitionIntoModule(
5046 Def, MergedDef->getImportedOwningModule(),
5047 /*NotifyListeners*/ false);
5048 PendingMergedDefinitionsToDeduplicate.insert(Def);
5049 }
5050 }
5051}
5052
5054 if (GlobalIndex)
5055 return false;
5056
5057 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
5058 !PP.getLangOpts().Modules)
5059 return true;
5060
5061 // Try to load the global index.
5062 TriedLoadingGlobalIndex = true;
5063 StringRef SpecificModuleCachePath =
5064 getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath();
5065 std::pair<GlobalModuleIndex *, llvm::Error> Result =
5066 GlobalModuleIndex::readIndex(SpecificModuleCachePath);
5067 if (llvm::Error Err = std::move(Result.second)) {
5068 assert(!Result.first);
5069 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5070 return true;
5071 }
5072
5073 GlobalIndex.reset(Result.first);
5074 ModuleMgr.setGlobalIndex(GlobalIndex.get());
5075 return false;
5076}
5077
5079 return PP.getLangOpts().Modules && UseGlobalIndex &&
5080 !hasGlobalIndex() && TriedLoadingGlobalIndex;
5081}
5082
5083/// Given a cursor at the start of an AST file, scan ahead and drop the
5084/// cursor into the start of the given block ID, returning false on success and
5085/// true on failure.
5086static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
5087 while (true) {
5088 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
5089 if (!MaybeEntry) {
5090 // FIXME this drops errors on the floor.
5091 consumeError(MaybeEntry.takeError());
5092 return true;
5093 }
5094 llvm::BitstreamEntry Entry = MaybeEntry.get();
5095
5096 switch (Entry.Kind) {
5097 case llvm::BitstreamEntry::Error:
5098 case llvm::BitstreamEntry::EndBlock:
5099 return true;
5100
5101 case llvm::BitstreamEntry::Record:
5102 // Ignore top-level records.
5103 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
5104 break;
5105 else {
5106 // FIXME this drops errors on the floor.
5107 consumeError(Skipped.takeError());
5108 return true;
5109 }
5110
5111 case llvm::BitstreamEntry::SubBlock:
5112 if (Entry.ID == BlockID) {
5113 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5114 // FIXME this drops the error on the floor.
5115 consumeError(std::move(Err));
5116 return true;
5117 }
5118 // Found it!
5119 return false;
5120 }
5121
5122 if (llvm::Error Err = Cursor.SkipBlock()) {
5123 // FIXME this drops the error on the floor.
5124 consumeError(std::move(Err));
5125 return true;
5126 }
5127 }
5128 }
5129}
5130
5133 SourceLocation ImportLoc,
5134 unsigned ClientLoadCapabilities,
5135 ModuleFile **NewLoadedModuleFile) {
5136 llvm::TimeTraceScope scope("ReadAST", FileName);
5137
5138 llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
5140 CurrentDeserializingModuleKind, Type);
5141
5142 // Defer any pending actions until we get to the end of reading the AST file.
5143 Deserializing AnASTFile(this);
5144
5145 // Bump the generation number.
5146 unsigned PreviousGeneration = 0;
5147 if (ContextObj)
5148 PreviousGeneration = incrementGeneration(*ContextObj);
5149
5150 unsigned NumModules = ModuleMgr.size();
5152 if (ASTReadResult ReadResult =
5153 ReadASTCore(FileName, Type, ImportLoc,
5154 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
5155 ClientLoadCapabilities)) {
5156 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5157
5158 // If we find that any modules are unusable, the global index is going
5159 // to be out-of-date. Just remove it.
5160 GlobalIndex.reset();
5161 ModuleMgr.setGlobalIndex(nullptr);
5162 return ReadResult;
5163 }
5164
5165 if (NewLoadedModuleFile && !Loaded.empty())
5166 *NewLoadedModuleFile = Loaded.back().Mod;
5167
5168 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
5169 // remove modules from this point. Various fields are updated during reading
5170 // the AST block and removing the modules would result in dangling pointers.
5171 // They are generally only incidentally dereferenced, ie. a binary search
5172 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
5173 // be dereferenced but it wouldn't actually be used.
5174
5175 // Load the AST blocks of all of the modules that we loaded. We can still
5176 // hit errors parsing the ASTs at this point.
5177 for (ImportedModule &M : Loaded) {
5178 ModuleFile &F = *M.Mod;
5179 llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
5180
5181 // Read the AST block.
5182 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5183 Error(std::move(Err));
5184 return Failure;
5185 }
5186
5187 // The AST block should always have a definition for the main module.
5188 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
5189 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
5190 return Failure;
5191 }
5192
5193 // Read the extension blocks.
5195 if (llvm::Error Err = ReadExtensionBlock(F)) {
5196 Error(std::move(Err));
5197 return Failure;
5198 }
5199 }
5200
5201 // Once read, set the ModuleFile bit base offset and update the size in
5202 // bits of all files we've seen.
5203 F.GlobalBitOffset = TotalModulesSizeInBits;
5204 TotalModulesSizeInBits += F.SizeInBits;
5205 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
5206 }
5207
5208 // Preload source locations and interesting indentifiers.
5209 for (ImportedModule &M : Loaded) {
5210 ModuleFile &F = *M.Mod;
5211
5212 // Map the original source file ID into the ID space of the current
5213 // compilation.
5216
5217 for (auto Offset : F.PreloadIdentifierOffsets) {
5218 const unsigned char *Data = F.IdentifierTableData + Offset;
5219
5220 ASTIdentifierLookupTrait Trait(*this, F);
5221 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
5222 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
5223
5224 IdentifierInfo *II;
5225 if (!PP.getLangOpts().CPlusPlus) {
5226 // Identifiers present in both the module file and the importing
5227 // instance are marked out-of-date so that they can be deserialized
5228 // on next use via ASTReader::updateOutOfDateIdentifier().
5229 // Identifiers present in the module file but not in the importing
5230 // instance are ignored for now, preventing growth of the identifier
5231 // table. They will be deserialized on first use via ASTReader::get().
5232 auto It = PP.getIdentifierTable().find(Key);
5233 if (It == PP.getIdentifierTable().end())
5234 continue;
5235 II = It->second;
5236 } else {
5237 // With C++ modules, not many identifiers are considered interesting.
5238 // All identifiers in the module file can be placed into the identifier
5239 // table of the importing instance and marked as out-of-date. This makes
5240 // ASTReader::get() a no-op, and deserialization will take place on
5241 // first/next use via ASTReader::updateOutOfDateIdentifier().
5242 II = &PP.getIdentifierTable().getOwn(Key);
5243 }
5244
5245 II->setOutOfDate(true);
5246
5247 // Mark this identifier as being from an AST file so that we can track
5248 // whether we need to serialize it.
5249 markIdentifierFromAST(*this, *II, /*IsModule=*/true);
5250
5251 // Associate the ID with the identifier so that the writer can reuse it.
5252 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
5253 SetIdentifierInfo(ID, II);
5254 }
5255 }
5256
5257 // Builtins and library builtins have already been initialized. Mark all
5258 // identifiers as out-of-date, so that they are deserialized on first use.
5259 if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
5260 for (auto &Id : PP.getIdentifierTable())
5261 Id.second->setOutOfDate(true);
5262
5263 // Mark selectors as out of date.
5264 for (const auto &Sel : SelectorGeneration)
5265 SelectorOutOfDate[Sel.first] = true;
5266
5267 // Setup the import locations and notify the module manager that we've
5268 // committed to these module files.
5269 for (ImportedModule &M : Loaded) {
5270 ModuleFile &F = *M.Mod;
5271
5272 ModuleMgr.moduleFileAccepted(&F);
5273
5274 // Set the import location.
5275 F.DirectImportLoc = ImportLoc;
5276 // FIXME: We assume that locations from PCH / preamble do not need
5277 // any translation.
5278 if (!M.ImportedBy)
5279 F.ImportLoc = M.ImportLoc;
5280 else
5281 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
5282 }
5283
5284 // FIXME: How do we load the 'use'd modules? They may not be submodules.
5285 // Might be unnecessary as use declarations are only used to build the
5286 // module itself.
5287
5288 if (ContextObj)
5290
5291 if (SemaObj)
5292 UpdateSema();
5293
5294 if (DeserializationListener)
5295 DeserializationListener->ReaderInitialized(this);
5296
5297 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5298 if (PrimaryModule.OriginalSourceFileID.isValid()) {
5299 // If this AST file is a precompiled preamble, then set the
5300 // preamble file ID of the source manager to the file source file
5301 // from which the preamble was built.
5302 if (Type == MK_Preamble) {
5303 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
5304 } else if (Type == MK_MainFile) {
5305 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
5306 }
5307 }
5308
5309 // For any Objective-C class definitions we have already loaded, make sure
5310 // that we load any additional categories.
5311 if (ContextObj) {
5312 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5313 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5314 ObjCClassesLoaded[I], PreviousGeneration);
5315 }
5316 }
5317
5318 const HeaderSearchOptions &HSOpts =
5319 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5321 // Now we are certain that the module and all modules it depends on are
5322 // up-to-date. For implicitly-built module files, ensure the corresponding
5323 // timestamp files are up-to-date in this build session.
5324 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5325 ImportedModule &M = Loaded[I];
5326 if (M.Mod->Kind == MK_ImplicitModule &&
5328 getModuleManager().getModuleCache().updateModuleTimestamp(
5329 M.Mod->FileName);
5330 }
5331 }
5332
5333 return Success;
5334}
5335
5336static ASTFileSignature readASTFileSignature(StringRef PCH);
5337
5338/// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
5339static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
5340 // FIXME checking magic headers is done in other places such as
5341 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
5342 // always done the same. Unify it all with a helper.
5343 if (!Stream.canSkipToPos(4))
5344 return llvm::createStringError(
5345 std::errc::illegal_byte_sequence,
5346 "file too small to contain precompiled file magic");
5347 for (unsigned C : {'C', 'P', 'C', 'H'})
5348 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
5349 if (Res.get() != C)
5350 return llvm::createStringError(
5351 std::errc::illegal_byte_sequence,
5352 "file doesn't start with precompiled file magic");
5353 } else
5354 return Res.takeError();
5355 return llvm::Error::success();
5356}
5357
5359 switch (Kind) {
5360 case MK_PCH:
5361 return 0; // PCH
5362 case MK_ImplicitModule:
5363 case MK_ExplicitModule:
5364 case MK_PrebuiltModule:
5365 return 1; // module
5366 case MK_MainFile:
5367 case MK_Preamble:
5368 return 2; // main source file
5369 }
5370 llvm_unreachable("unknown module kind");
5371}
5372
5375 ModuleFile *ImportedBy, SmallVectorImpl<ImportedModule> &Loaded,
5376 off_t ExpectedSize, time_t ExpectedModTime,
5377 ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities) {
5378 auto Result = ModuleMgr.addModule(
5379 FileName, Type, ImportLoc, ImportedBy, getGeneration(), ExpectedSize,
5380 ExpectedModTime, ExpectedSignature, readASTFileSignature);
5381 ModuleFile *M = Result.getModule();
5382
5383 switch (Result.getKind()) {
5385 Diag(diag::remark_module_import)
5386 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5387 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5388 return Success;
5389 }
5390
5392 // Load module file below.
5393 break;
5394
5396 // The module file was missing; if the client can handle that, return
5397 // it.
5398 if (ClientLoadCapabilities & ARR_Missing)
5399 return Missing;
5400
5401 // Otherwise, return an error.
5402 Diag(diag::err_ast_file_not_found)
5404 if (!Result.getBufferError().empty())
5405 Diag(diag::note_ast_file_buffer_failed) << Result.getBufferError();
5406 return Failure;
5407
5409 // We couldn't load the module file because it is out-of-date. If the
5410 // client can handle out-of-date, return it.
5411 if (ClientLoadCapabilities & ARR_OutOfDate)
5412 return OutOfDate;
5413
5414 // Otherwise, return an error.
5415 Diag(diag::err_ast_file_out_of_date)
5417 for (const auto &C : Result.getChanges()) {
5418 Diag(diag::note_fe_ast_file_modified)
5419 << C.Kind << (C.Old && C.New) << llvm::itostr(C.Old.value_or(0))
5420 << llvm::itostr(C.New.value_or(0));
5421 }
5422 Diag(diag::note_ast_file_input_files_validation_status)
5423 << Result.getValidationStatus();
5424 if (!Result.getSignatureError().empty())
5425 Diag(diag::note_ast_file_signature_failed) << Result.getSignatureError();
5426 return Failure;
5427
5429 llvm_unreachable("Unexpected value from adding module.");
5430 }
5431
5432 assert(M && "Missing module file");
5433
5434 bool ShouldFinalizePCM = false;
5435 llvm::scope_exit FinalizeOrDropPCM([&]() {
5436 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5437 if (ShouldFinalizePCM)
5438 MC.finalizePCM(FileName);
5439 else
5440 MC.tryToDropPCM(FileName);
5441 });
5442 ModuleFile &F = *M;
5443 BitstreamCursor &Stream = F.Stream;
5444 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5445 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5446
5447 // Sniff for the signature.
5448 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5449 Diag(diag::err_ast_file_invalid)
5450 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5451 return Failure;
5452 }
5453
5454 // This is used for compatibility with older PCH formats.
5455 bool HaveReadControlBlock = false;
5456 while (true) {
5457 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5458 if (!MaybeEntry) {
5459 Error(MaybeEntry.takeError());
5460 return Failure;
5461 }
5462 llvm::BitstreamEntry Entry = MaybeEntry.get();
5463
5464 switch (Entry.Kind) {
5465 case llvm::BitstreamEntry::Error:
5466 case llvm::BitstreamEntry::Record:
5467 case llvm::BitstreamEntry::EndBlock:
5468 Error("invalid record at top-level of AST file");
5469 return Failure;
5470
5471 case llvm::BitstreamEntry::SubBlock:
5472 break;
5473 }
5474
5475 switch (Entry.ID) {
5476 case CONTROL_BLOCK_ID:
5477 HaveReadControlBlock = true;
5478 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5479 case Success:
5480 // Check that we didn't try to load a non-module AST file as a module.
5481 //
5482 // FIXME: Should we also perform the converse check? Loading a module as
5483 // a PCH file sort of works, but it's a bit wonky.
5485 Type == MK_PrebuiltModule) &&
5486 F.ModuleName.empty()) {
5488 if (Result != OutOfDate ||
5489 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5490 Diag(diag::err_module_file_not_module) << FileName;
5491 return Result;
5492 }
5493 break;
5494
5495 case Failure: return Failure;
5496 case Missing: return Missing;
5497 case OutOfDate: return OutOfDate;
5498 case VersionMismatch: return VersionMismatch;
5500 case HadErrors: return HadErrors;
5501 }
5502 break;
5503
5504 case AST_BLOCK_ID:
5505 if (!HaveReadControlBlock) {
5506 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5507 Diag(diag::err_ast_file_version_too_old)
5509 return VersionMismatch;
5510 }
5511
5512 // Record that we've loaded this module.
5513 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5514 ShouldFinalizePCM = true;
5515 return Success;
5516
5517 default:
5518 if (llvm::Error Err = Stream.SkipBlock()) {
5519 Error(std::move(Err));
5520 return Failure;
5521 }
5522 break;
5523 }
5524 }
5525
5526 llvm_unreachable("unexpected break; expected return");
5527}
5528
5530ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5531 unsigned ClientLoadCapabilities) {
5532 const HeaderSearchOptions &HSOpts =
5533 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5534 bool AllowCompatibleConfigurationMismatch =
5536 bool DisableValidation = shouldDisableValidationForFile(F);
5537
5538 ASTReadResult Result = readUnhashedControlBlockImpl(
5539 &F, F.Data, F.FileName, ClientLoadCapabilities,
5540 AllowCompatibleConfigurationMismatch, Listener.get(),
5541 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5542
5543 // If F was directly imported by another module, it's implicitly validated by
5544 // the importing module.
5545 if (DisableValidation || WasImportedBy ||
5546 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5547 return Success;
5548
5549 if (Result == Failure) {
5550 Error("malformed block record in AST file");
5551 return Failure;
5552 }
5553
5554 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5555 // If this module has already been finalized in the ModuleCache, we're stuck
5556 // with it; we can only load a single version of each module.
5557 //
5558 // This can happen when a module is imported in two contexts: in one, as a
5559 // user module; in another, as a system module (due to an import from
5560 // another module marked with the [system] flag). It usually indicates a
5561 // bug in the module map: this module should also be marked with [system].
5562 //
5563 // If -Wno-system-headers (the default), and the first import is as a
5564 // system module, then validation will fail during the as-user import,
5565 // since -Werror flags won't have been validated. However, it's reasonable
5566 // to treat this consistently as a system module.
5567 //
5568 // If -Wsystem-headers, the PCM on disk was built with
5569 // -Wno-system-headers, and the first import is as a user module, then
5570 // validation will fail during the as-system import since the PCM on disk
5571 // doesn't guarantee that -Werror was respected. However, the -Werror
5572 // flags were checked during the initial as-user import.
5573 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5574 F.FileName)) {
5575 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5576 return Success;
5577 }
5578 }
5579
5580 return Result;
5581}
5582
5583ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5584 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5585 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5586 ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5587 // Initialize a stream.
5588 BitstreamCursor Stream(StreamData);
5589
5590 // Sniff for the signature.
5591 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5592 // FIXME this drops the error on the floor.
5593 consumeError(std::move(Err));
5594 return Failure;
5595 }
5596
5597 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5599 return Failure;
5600
5601 // Read all of the records in the options block.
5602 RecordData Record;
5603 ASTReadResult Result = Success;
5604 while (true) {
5605 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5606 if (!MaybeEntry) {
5607 // FIXME this drops the error on the floor.
5608 consumeError(MaybeEntry.takeError());
5609 return Failure;
5610 }
5611 llvm::BitstreamEntry Entry = MaybeEntry.get();
5612
5613 switch (Entry.Kind) {
5614 case llvm::BitstreamEntry::Error:
5615 case llvm::BitstreamEntry::SubBlock:
5616 return Failure;
5617
5618 case llvm::BitstreamEntry::EndBlock:
5619 return Result;
5620
5621 case llvm::BitstreamEntry::Record:
5622 // The interesting case.
5623 break;
5624 }
5625
5626 // Read and process a record.
5627 Record.clear();
5628 StringRef Blob;
5629 Expected<unsigned> MaybeRecordType =
5630 Stream.readRecord(Entry.ID, Record, &Blob);
5631 if (!MaybeRecordType) {
5632 // FIXME this drops the error.
5633 return Failure;
5634 }
5635 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5636 case SIGNATURE:
5637 if (F) {
5638 F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5640 "Dummy AST file signature not backpatched in ASTWriter.");
5641 }
5642 break;
5643 case AST_BLOCK_HASH:
5644 if (F) {
5645 F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5647 "Dummy AST block hash not backpatched in ASTWriter.");
5648 }
5649 break;
5650 case DIAGNOSTIC_OPTIONS: {
5651 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5652 if (Listener && ValidateDiagnosticOptions &&
5653 !AllowCompatibleConfigurationMismatch &&
5654 ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5655 Result = OutOfDate; // Don't return early. Read the signature.
5656 break;
5657 }
5658 case HEADER_SEARCH_PATHS: {
5659 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5660 if (Listener && !AllowCompatibleConfigurationMismatch &&
5661 ParseHeaderSearchPaths(Record, Complain, *Listener))
5662 Result = ConfigurationMismatch;
5663 break;
5664 }
5666 if (!F)
5667 break;
5668 if (F->PragmaDiagMappings.empty())
5669 F->PragmaDiagMappings.swap(Record);
5670 else
5671 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5672 Record.begin(), Record.end());
5673 break;
5675 if (F)
5676 F->SearchPathUsage = ReadBitVector(Record, Blob);
5677 break;
5678 case VFS_USAGE:
5679 if (F)
5680 F->VFSUsage = ReadBitVector(Record, Blob);
5681 break;
5682 }
5683 }
5684}
5685
5686/// Parse a record and blob containing module file extension metadata.
5689 StringRef Blob,
5690 ModuleFileExtensionMetadata &Metadata) {
5691 if (Record.size() < 4) return true;
5692
5693 Metadata.MajorVersion = Record[0];
5694 Metadata.MinorVersion = Record[1];
5695
5696 unsigned BlockNameLen = Record[2];
5697 unsigned UserInfoLen = Record[3];
5698
5699 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5700
5701 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5702 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5703 Blob.data() + BlockNameLen + UserInfoLen);
5704 return false;
5705}
5706
5707llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5708 BitstreamCursor &Stream = F.Stream;
5709
5710 RecordData Record;
5711 while (true) {
5712 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5713 if (!MaybeEntry)
5714 return MaybeEntry.takeError();
5715 llvm::BitstreamEntry Entry = MaybeEntry.get();
5716
5717 switch (Entry.Kind) {
5718 case llvm::BitstreamEntry::SubBlock:
5719 if (llvm::Error Err = Stream.SkipBlock())
5720 return Err;
5721 continue;
5722 case llvm::BitstreamEntry::EndBlock:
5723 return llvm::Error::success();
5724 case llvm::BitstreamEntry::Error:
5725 return llvm::createStringError(std::errc::illegal_byte_sequence,
5726 "malformed block record in AST file");
5727 case llvm::BitstreamEntry::Record:
5728 break;
5729 }
5730
5731 Record.clear();
5732 StringRef Blob;
5733 Expected<unsigned> MaybeRecCode =
5734 Stream.readRecord(Entry.ID, Record, &Blob);
5735 if (!MaybeRecCode)
5736 return MaybeRecCode.takeError();
5737 switch (MaybeRecCode.get()) {
5738 case EXTENSION_METADATA: {
5739 ModuleFileExtensionMetadata Metadata;
5740 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5741 return llvm::createStringError(
5742 std::errc::illegal_byte_sequence,
5743 "malformed EXTENSION_METADATA in AST file");
5744
5745 // Find a module file extension with this block name.
5746 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5747 if (Known == ModuleFileExtensions.end()) break;
5748
5749 // Form a reader.
5750 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5751 F, Stream)) {
5752 F.ExtensionReaders.push_back(std::move(Reader));
5753 }
5754
5755 break;
5756 }
5757 }
5758 }
5759
5760 llvm_unreachable("ReadExtensionBlock should return from while loop");
5761}
5762
5764 assert(ContextObj && "no context to initialize");
5765 ASTContext &Context = *ContextObj;
5766
5767 // If there's a listener, notify them that we "read" the translation unit.
5768 if (DeserializationListener)
5769 DeserializationListener->DeclRead(
5771 Context.getTranslationUnitDecl());
5772
5773 // FIXME: Find a better way to deal with collisions between these
5774 // built-in types. Right now, we just ignore the problem.
5775
5776 // Load the special types.
5777 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5778 if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5779 if (!Context.CFConstantStringTypeDecl)
5780 Context.setCFConstantStringType(GetType(String));
5781 }
5782
5783 if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5784 QualType FileType = GetType(File);
5785 if (FileType.isNull()) {
5786 Error("FILE type is NULL");
5787 return;
5788 }
5789
5790 if (!Context.FILEDecl) {
5791 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5792 Context.setFILEDecl(Typedef->getDecl());
5793 else {
5794 const TagType *Tag = FileType->getAs<TagType>();
5795 if (!Tag) {
5796 Error("Invalid FILE type in AST file");
5797 return;
5798 }
5799 Context.setFILEDecl(Tag->getDecl());
5800 }
5801 }
5802 }
5803
5804 if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5805 QualType Jmp_bufType = GetType(Jmp_buf);
5806 if (Jmp_bufType.isNull()) {
5807 Error("jmp_buf type is NULL");
5808 return;
5809 }
5810
5811 if (!Context.jmp_bufDecl) {
5812 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5813 Context.setjmp_bufDecl(Typedef->getDecl());
5814 else {
5815 const TagType *Tag = Jmp_bufType->getAs<TagType>();
5816 if (!Tag) {
5817 Error("Invalid jmp_buf type in AST file");
5818 return;
5819 }
5820 Context.setjmp_bufDecl(Tag->getDecl());
5821 }
5822 }
5823 }
5824
5825 if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5826 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5827 if (Sigjmp_bufType.isNull()) {
5828 Error("sigjmp_buf type is NULL");
5829 return;
5830 }
5831
5832 if (!Context.sigjmp_bufDecl) {
5833 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5834 Context.setsigjmp_bufDecl(Typedef->getDecl());
5835 else {
5836 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5837 assert(Tag && "Invalid sigjmp_buf type in AST file");
5838 Context.setsigjmp_bufDecl(Tag->getDecl());
5839 }
5840 }
5841 }
5842
5843 if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5844 if (Context.ObjCIdRedefinitionType.isNull())
5845 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5846 }
5847
5848 if (TypeID ObjCClassRedef =
5850 if (Context.ObjCClassRedefinitionType.isNull())
5851 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5852 }
5853
5854 if (TypeID ObjCSelRedef =
5855 SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5856 if (Context.ObjCSelRedefinitionType.isNull())
5857 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5858 }
5859
5860 if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5861 QualType Ucontext_tType = GetType(Ucontext_t);
5862 if (Ucontext_tType.isNull()) {
5863 Error("ucontext_t type is NULL");
5864 return;
5865 }
5866
5867 if (!Context.ucontext_tDecl) {
5868 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5869 Context.setucontext_tDecl(Typedef->getDecl());
5870 else {
5871 const TagType *Tag = Ucontext_tType->getAs<TagType>();
5872 assert(Tag && "Invalid ucontext_t type in AST file");
5873 Context.setucontext_tDecl(Tag->getDecl());
5874 }
5875 }
5876 }
5877 }
5878
5879 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5880
5881 // If there were any CUDA special declarations, deserialize them.
5882 if (!CUDASpecialDeclRefs.empty()) {
5883 assert(CUDASpecialDeclRefs.size() == 3 && "More decl refs than expected!");
5884 Context.setcudaConfigureCallDecl(
5885 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5886 Context.setcudaGetParameterBufferDecl(
5887 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[1])));
5888 Context.setcudaLaunchDeviceDecl(
5889 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[2])));
5890 }
5891
5892 // Re-export any modules that were imported by a non-module AST file.
5893 // FIXME: This does not make macro-only imports visible again.
5894 for (auto &Import : PendingImportedModules) {
5895 if (Module *Imported = getSubmodule(Import.ID)) {
5897 /*ImportLoc=*/Import.ImportLoc);
5898 if (Import.ImportLoc.isValid())
5899 PP.makeModuleVisible(Imported, Import.ImportLoc);
5900 // This updates visibility for Preprocessor only. For Sema, which can be
5901 // nullptr here, we do the same later, in UpdateSema().
5902 }
5903 }
5904
5905 // Hand off these modules to Sema.
5906 PendingImportedModulesSema.append(PendingImportedModules);
5907 PendingImportedModules.clear();
5908}
5909
5911 // Nothing to do for now.
5912}
5913
5914/// Reads and return the signature record from \p PCH's control block, or
5915/// else returns 0.
5917 BitstreamCursor Stream(PCH);
5918 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5919 // FIXME this drops the error on the floor.
5920 consumeError(std::move(Err));
5921 return ASTFileSignature();
5922 }
5923
5924 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5926 return ASTFileSignature();
5927
5928 // Scan for SIGNATURE inside the diagnostic options block.
5930 while (true) {
5932 Stream.advanceSkippingSubblocks();
5933 if (!MaybeEntry) {
5934 // FIXME this drops the error on the floor.
5935 consumeError(MaybeEntry.takeError());
5936 return ASTFileSignature();
5937 }
5938 llvm::BitstreamEntry Entry = MaybeEntry.get();
5939
5940 if (Entry.Kind != llvm::BitstreamEntry::Record)
5941 return ASTFileSignature();
5942
5943 Record.clear();
5944 StringRef Blob;
5945 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5946 if (!MaybeRecord) {
5947 // FIXME this drops the error on the floor.
5948 consumeError(MaybeRecord.takeError());
5949 return ASTFileSignature();
5950 }
5951 if (SIGNATURE == MaybeRecord.get()) {
5952 auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5953 assert(Signature != ASTFileSignature::createDummy() &&
5954 "Dummy AST file signature not backpatched in ASTWriter.");
5955 return Signature;
5956 }
5957 }
5958}
5959
5960/// Retrieve the name of the original source file name
5961/// directly from the AST file, without actually loading the AST
5962/// file.
5964 const std::string &ASTFileName, FileManager &FileMgr,
5965 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5966 // Open the AST file.
5967 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5968 /*RequiresNullTerminator=*/false,
5969 /*MaybeLimit=*/std::nullopt,
5970 /*IsText=*/false);
5971 if (!Buffer) {
5972 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5973 << ASTFileName << Buffer.getError().message();
5974 return std::string();
5975 }
5976
5977 // Initialize the stream
5978 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5979
5980 // Sniff for the signature.
5981 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5982 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5983 return std::string();
5984 }
5985
5986 // Scan for the CONTROL_BLOCK_ID block.
5987 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5988 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5989 return std::string();
5990 }
5991
5992 // Scan for ORIGINAL_FILE inside the control block.
5994 while (true) {
5996 Stream.advanceSkippingSubblocks();
5997 if (!MaybeEntry) {
5998 // FIXME this drops errors on the floor.
5999 consumeError(MaybeEntry.takeError());
6000 return std::string();
6001 }
6002 llvm::BitstreamEntry Entry = MaybeEntry.get();
6003
6004 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
6005 return std::string();
6006
6007 if (Entry.Kind != llvm::BitstreamEntry::Record) {
6008 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
6009 return std::string();
6010 }
6011
6012 Record.clear();
6013 StringRef Blob;
6014 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
6015 if (!MaybeRecord) {
6016 // FIXME this drops the errors on the floor.
6017 consumeError(MaybeRecord.takeError());
6018 return std::string();
6019 }
6020 if (ORIGINAL_FILE == MaybeRecord.get())
6021 return Blob.str();
6022 }
6023}
6024
6025namespace {
6026
6027 class SimplePCHValidator : public ASTReaderListener {
6028 const LangOptions &ExistingLangOpts;
6029 const CodeGenOptions &ExistingCGOpts;
6030 const TargetOptions &ExistingTargetOpts;
6031 const PreprocessorOptions &ExistingPPOpts;
6032 const HeaderSearchOptions &ExistingHSOpts;
6033 std::string ExistingSpecificModuleCachePath;
6035 bool StrictOptionMatches;
6036
6037 public:
6038 SimplePCHValidator(const LangOptions &ExistingLangOpts,
6039 const CodeGenOptions &ExistingCGOpts,
6040 const TargetOptions &ExistingTargetOpts,
6041 const PreprocessorOptions &ExistingPPOpts,
6042 const HeaderSearchOptions &ExistingHSOpts,
6043 StringRef ExistingSpecificModuleCachePath,
6044 FileManager &FileMgr, bool StrictOptionMatches)
6045 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
6046 ExistingTargetOpts(ExistingTargetOpts),
6047 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
6048 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
6049 FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {}
6050
6051 bool ReadLanguageOptions(const LangOptions &LangOpts,
6052 StringRef ModuleFilename, bool Complain,
6053 bool AllowCompatibleDifferences) override {
6054 return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
6055 nullptr, AllowCompatibleDifferences);
6056 }
6057
6058 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
6059 StringRef ModuleFilename, bool Complain,
6060 bool AllowCompatibleDifferences) override {
6061 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
6062 nullptr, AllowCompatibleDifferences);
6063 }
6064
6065 bool ReadTargetOptions(const TargetOptions &TargetOpts,
6066 StringRef ModuleFilename, bool Complain,
6067 bool AllowCompatibleDifferences) override {
6068 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
6069 nullptr, AllowCompatibleDifferences);
6070 }
6071
6072 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
6073 StringRef ASTFilename, StringRef ContextHash,
6074 bool Complain) override {
6075 return checkModuleCachePath(
6076 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
6077 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
6078 }
6079
6080 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
6081 StringRef ModuleFilename, bool ReadMacros,
6082 bool Complain,
6083 std::string &SuggestedPredefines) override {
6085 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
6086 FileMgr, SuggestedPredefines, ExistingLangOpts,
6087 StrictOptionMatches ? OptionValidateStrictMatches
6089 }
6090 };
6091
6092} // namespace
6093
6095 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6096 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
6097 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
6098 unsigned ClientLoadCapabilities) {
6099 // Open the AST file.
6100 off_t Size;
6101 time_t ModTime;
6102 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
6103 llvm::MemoryBuffer *Buffer =
6104 ModCache.getInMemoryModuleCache().lookupPCM(Filename, Size, ModTime);
6105 if (!Buffer) {
6106 // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
6107 // read again later, but we do not have the context here to determine if it
6108 // is safe to change the result of InMemoryModuleCache::getPCMState().
6109
6110 // FIXME: This allows use of the VFS; we do not allow use of the
6111 // VFS when actually loading a module.
6112 auto Entry = Filename == "-" ? FileMgr.getSTDIN()
6113 : FileMgr.getFileRef(Filename,
6114 /*OpenFile=*/false,
6115 /*CacheFailure=*/true,
6116 /*IsText=*/false);
6117 if (!Entry) {
6118 llvm::consumeError(Entry.takeError());
6119 return true;
6120 }
6121 auto BufferOrErr =
6122 FileMgr.getBufferForFile(*Entry,
6123 /*IsVolatile=*/false,
6124 /*RequiresNullTerminator=*/false,
6125 /*MaybeLimit=*/std::nullopt,
6126 /*IsText=*/false);
6127 if (!BufferOrErr)
6128 return true;
6129 OwnedBuffer = std::move(*BufferOrErr);
6130 Buffer = OwnedBuffer.get();
6131 }
6132
6133 // Initialize the stream
6134 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6135 BitstreamCursor Stream(Bytes);
6136
6137 // Sniff for the signature.
6138 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
6139 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
6140 return true;
6141 }
6142
6143 // Scan for the CONTROL_BLOCK_ID block.
6145 return true;
6146
6147 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6148 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6149 bool NeedsImports = Listener.needsImportVisitation();
6150 BitstreamCursor InputFilesCursor;
6151 uint64_t InputFilesOffsetBase = 0;
6152
6154 std::string ModuleDir;
6155 bool DoneWithControlBlock = false;
6156 SmallString<0> PathBuf;
6157 PathBuf.reserve(256);
6158 // Additional path buffer to use when multiple paths need to be resolved.
6159 // For example, when deserializing input files that contains a path that was
6160 // resolved from a vfs overlay and an external location.
6161 SmallString<0> AdditionalPathBuf;
6162 AdditionalPathBuf.reserve(256);
6163 while (!DoneWithControlBlock) {
6164 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6165 if (!MaybeEntry) {
6166 // FIXME this drops the error on the floor.
6167 consumeError(MaybeEntry.takeError());
6168 return true;
6169 }
6170 llvm::BitstreamEntry Entry = MaybeEntry.get();
6171
6172 switch (Entry.Kind) {
6173 case llvm::BitstreamEntry::SubBlock: {
6174 switch (Entry.ID) {
6175 case OPTIONS_BLOCK_ID: {
6176 std::string IgnoredSuggestedPredefines;
6177 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6178 /*AllowCompatibleConfigurationMismatch*/ false,
6179 Listener, IgnoredSuggestedPredefines) != Success)
6180 return true;
6181 break;
6182 }
6183
6185 InputFilesCursor = Stream;
6186 if (llvm::Error Err = Stream.SkipBlock()) {
6187 // FIXME this drops the error on the floor.
6188 consumeError(std::move(Err));
6189 return true;
6190 }
6191 if (NeedsInputFiles &&
6192 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
6193 return true;
6194 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6195 break;
6196
6197 default:
6198 if (llvm::Error Err = Stream.SkipBlock()) {
6199 // FIXME this drops the error on the floor.
6200 consumeError(std::move(Err));
6201 return true;
6202 }
6203 break;
6204 }
6205
6206 continue;
6207 }
6208
6209 case llvm::BitstreamEntry::EndBlock:
6210 DoneWithControlBlock = true;
6211 break;
6212
6213 case llvm::BitstreamEntry::Error:
6214 return true;
6215
6216 case llvm::BitstreamEntry::Record:
6217 break;
6218 }
6219
6220 if (DoneWithControlBlock) break;
6221
6222 Record.clear();
6223 StringRef Blob;
6224 Expected<unsigned> MaybeRecCode =
6225 Stream.readRecord(Entry.ID, Record, &Blob);
6226 if (!MaybeRecCode) {
6227 // FIXME this drops the error.
6228 return Failure;
6229 }
6230 switch ((ControlRecordTypes)MaybeRecCode.get()) {
6231 case METADATA:
6232 if (Record[0] != VERSION_MAJOR)
6233 return true;
6234 if (Listener.ReadFullVersionInformation(Blob))
6235 return true;
6236 break;
6237 case MODULE_NAME:
6238 Listener.ReadModuleName(Blob);
6239 break;
6240 case MODULE_DIRECTORY:
6241 ModuleDir = std::string(Blob);
6242 break;
6243 case MODULE_MAP_FILE: {
6244 unsigned Idx = 0;
6245 std::string PathStr = ReadString(Record, Idx);
6246 auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
6247 Listener.ReadModuleMapFile(*Path);
6248 break;
6249 }
6250 case INPUT_FILE_OFFSETS: {
6251 if (!NeedsInputFiles)
6252 break;
6253
6254 unsigned NumInputFiles = Record[0];
6255 unsigned NumUserFiles = Record[1];
6256 const llvm::support::unaligned_uint64_t *InputFileOffs =
6257 (const llvm::support::unaligned_uint64_t *)Blob.data();
6258 for (unsigned I = 0; I != NumInputFiles; ++I) {
6259 // Go find this input file.
6260 bool isSystemFile = I >= NumUserFiles;
6261
6262 if (isSystemFile && !NeedsSystemInputFiles)
6263 break; // the rest are system input files
6264
6265 BitstreamCursor &Cursor = InputFilesCursor;
6266 SavedStreamPosition SavedPosition(Cursor);
6267 if (llvm::Error Err =
6268 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6269 // FIXME this drops errors on the floor.
6270 consumeError(std::move(Err));
6271 }
6272
6273 Expected<unsigned> MaybeCode = Cursor.ReadCode();
6274 if (!MaybeCode) {
6275 // FIXME this drops errors on the floor.
6276 consumeError(MaybeCode.takeError());
6277 }
6278 unsigned Code = MaybeCode.get();
6279
6281 StringRef Blob;
6282 bool shouldContinue = false;
6283 Expected<unsigned> MaybeRecordType =
6284 Cursor.readRecord(Code, Record, &Blob);
6285 if (!MaybeRecordType) {
6286 // FIXME this drops errors on the floor.
6287 consumeError(MaybeRecordType.takeError());
6288 }
6289 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
6290 case INPUT_FILE_HASH:
6291 break;
6292 case INPUT_FILE:
6293 time_t StoredTime = static_cast<time_t>(Record[2]);
6294 bool Overridden = static_cast<bool>(Record[3]);
6295 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6297 auto FilenameAsRequestedBuf = ResolveImportedPath(
6298 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6299 StringRef Filename;
6300 if (UnresolvedFilename.empty())
6301 Filename = *FilenameAsRequestedBuf;
6302 else {
6303 auto FilenameBuf = ResolveImportedPath(
6304 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6305 Filename = *FilenameBuf;
6306 }
6307 shouldContinue = Listener.visitInputFileAsRequested(
6308 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6309 StoredTime, /*IsExplicitModule=*/false);
6310 break;
6311 }
6312 if (!shouldContinue)
6313 break;
6314 }
6315 break;
6316 }
6317
6318 case IMPORT: {
6319 if (!NeedsImports)
6320 break;
6321
6322 unsigned Idx = 0;
6323 // Read information about the AST file.
6324
6325 // Skip Kind
6326 Idx++;
6327
6328 // Skip ImportLoc
6329 Idx++;
6330
6331 StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
6332
6333 bool IsStandardCXXModule = Record[Idx++];
6334
6335 // In C++20 Modules, we don't record the path to imported
6336 // modules in the BMI files.
6337 if (IsStandardCXXModule) {
6338 Listener.visitImport(ModuleName, /*Filename=*/"");
6339 continue;
6340 }
6341
6342 // Skip Size, ModTime and ImplicitModuleSuffix.
6343 Idx += 1 + 1 + 1;
6344 // Skip signature.
6345 Blob = Blob.substr(ASTFileSignature::size);
6346
6347 StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
6348 auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
6349 Listener.visitImport(ModuleName, *Filename);
6350 break;
6351 }
6352
6353 default:
6354 // No other validation to perform.
6355 break;
6356 }
6357 }
6358
6359 // Look for module file extension blocks, if requested.
6360 if (FindModuleFileExtensions) {
6361 BitstreamCursor SavedStream = Stream;
6362 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
6363 bool DoneWithExtensionBlock = false;
6364 while (!DoneWithExtensionBlock) {
6365 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6366 if (!MaybeEntry) {
6367 // FIXME this drops the error.
6368 return true;
6369 }
6370 llvm::BitstreamEntry Entry = MaybeEntry.get();
6371
6372 switch (Entry.Kind) {
6373 case llvm::BitstreamEntry::SubBlock:
6374 if (llvm::Error Err = Stream.SkipBlock()) {
6375 // FIXME this drops the error on the floor.
6376 consumeError(std::move(Err));
6377 return true;
6378 }
6379 continue;
6380
6381 case llvm::BitstreamEntry::EndBlock:
6382 DoneWithExtensionBlock = true;
6383 continue;
6384
6385 case llvm::BitstreamEntry::Error:
6386 return true;
6387
6388 case llvm::BitstreamEntry::Record:
6389 break;
6390 }
6391
6392 Record.clear();
6393 StringRef Blob;
6394 Expected<unsigned> MaybeRecCode =
6395 Stream.readRecord(Entry.ID, Record, &Blob);
6396 if (!MaybeRecCode) {
6397 // FIXME this drops the error.
6398 return true;
6399 }
6400 switch (MaybeRecCode.get()) {
6401 case EXTENSION_METADATA: {
6403 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
6404 return true;
6405
6406 Listener.readModuleFileExtension(Metadata);
6407 break;
6408 }
6409 }
6410 }
6411 }
6412 Stream = std::move(SavedStream);
6413 }
6414
6415 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6416 if (readUnhashedControlBlockImpl(
6417 nullptr, Bytes, Filename, ClientLoadCapabilities,
6418 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6419 ValidateDiagnosticOptions) != Success)
6420 return true;
6421
6422 return false;
6423}
6424
6426 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6427 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6428 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
6429 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
6430 StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches) {
6431 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6432 SpecificModuleCachePath, FileMgr,
6433 RequireStrictOptionMatches);
6434 return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6435 /*FindModuleFileExtensions=*/false, validator,
6436 /*ValidateDiagnosticOptions=*/true);
6437}
6438
6439Module *ASTReader::getSubmodule(uint32_t GlobalID) {
6440 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6441 assert(GlobalID == 0 && "Unhandled global submodule ID");
6442 return nullptr;
6443 }
6444
6445 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6446 if (GlobalIndex >= SubmodulesLoaded.size()) {
6447 Error("submodule ID out of range in AST file");
6448 return nullptr;
6449 }
6450
6451 if (SubmodulesLoaded[GlobalIndex])
6452 return SubmodulesLoaded[GlobalIndex];
6453
6454 GlobalSubmoduleMapType::iterator It = GlobalSubmoduleMap.find(GlobalID);
6455 assert(It != GlobalSubmoduleMap.end());
6456 ModuleFile &F = *It->second;
6457 unsigned Index = GlobalID - F.BaseSubmoduleID - NUM_PREDEF_SUBMODULE_IDS;
6458 [[maybe_unused]] unsigned LocalID =
6460
6461 BitstreamCursor &Cursor = F.SubmodulesCursor;
6462 SavedStreamPosition SavedPosition(Cursor);
6463 unsigned Offset = F.SubmoduleOffsets[Index];
6464 if (llvm::Error Err = Cursor.JumpToBit(F.SubmodulesOffsetBase + Offset)) {
6465 Error(std::move(Err));
6466 return nullptr;
6467 }
6468
6469 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6470 bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6471 // If we don't know the top-level module, there's no point in doing qualified
6472 // lookup of its submodules; it won't find anything anywhere within this tree.
6473 // Let's skip that and avoid some string lookups.
6474 auto CreateModule = !KnowsTopLevelModule
6477
6478 Module *CurrentModule = nullptr;
6480 while (true) {
6481 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
6482 if (!MaybeEntry) {
6483 Error(MaybeEntry.takeError());
6484 return nullptr;
6485 }
6486 llvm::BitstreamEntry Entry = MaybeEntry.get();
6487
6488 switch (Entry.Kind) {
6489 case llvm::BitstreamEntry::SubBlock:
6490 case llvm::BitstreamEntry::Error:
6491 case llvm::BitstreamEntry::EndBlock: {
6492 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6493 "malformed block record in AST file"));
6494 return nullptr;
6495 }
6496 case llvm::BitstreamEntry::Record:
6497 // The interesting case.
6498 break;
6499 }
6500
6501 // Read a record.
6502 StringRef Blob;
6503 Record.clear();
6504 Expected<unsigned> MaybeKind = Cursor.readRecord(Entry.ID, Record, &Blob);
6505 if (!MaybeKind) {
6506 Error(MaybeKind.takeError());
6507 return nullptr;
6508 }
6509 auto Kind = static_cast<SubmoduleRecordTypes>(MaybeKind.get());
6510
6511 switch (Kind) {
6512 case SUBMODULE_END:
6513 if (!CurrentModule) {
6514 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6515 "malformed module definition"));
6516 return nullptr;
6517 }
6518 return CurrentModule;
6519
6520 case SUBMODULE_DEFINITION: {
6521 if (Record.size() < 13) {
6522 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6523 "malformed module definition"));
6524 return nullptr;
6525 }
6526
6527 StringRef Name = Blob;
6528 unsigned Idx = 0;
6529 [[maybe_unused]] unsigned ReadLocalID = Record[Idx++];
6530 assert(LocalID == ReadLocalID);
6531 assert(GlobalID == getGlobalSubmoduleID(F, ReadLocalID));
6532 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6534 SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6535 FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6536 bool IsFramework = Record[Idx++];
6537 bool IsExplicit = Record[Idx++];
6538 bool IsSystem = Record[Idx++];
6539 bool IsExternC = Record[Idx++];
6540 bool InferSubmodules = Record[Idx++];
6541 bool InferExplicitSubmodules = Record[Idx++];
6542 bool InferExportWildcard = Record[Idx++];
6543 bool ConfigMacrosExhaustive = Record[Idx++];
6544 bool ModuleMapIsPrivate = Record[Idx++];
6545 bool NamedModuleHasInit = Record[Idx++];
6546
6547 Module *ParentModule = nullptr;
6548 if (Parent) {
6549 ParentModule = getSubmodule(Parent);
6550 if (!ParentModule)
6551 return nullptr;
6552 }
6553
6554 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6555 IsFramework, IsExplicit);
6556
6557 if (!ParentModule) {
6558 if ([[maybe_unused]] const ModuleFileKey *CurFileKey =
6559 CurrentModule->getASTFileKey()) {
6560 // Don't emit module relocation error if we have -fno-validate-pch
6561 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6563 assert(*CurFileKey != F.FileKey &&
6564 "ModuleManager did not de-duplicate");
6565
6566 Diag(diag::err_module_file_conflict)
6567 << CurrentModule->getTopLevelModuleName()
6568 << *CurrentModule->getASTFileName() << F.FileName;
6569
6570 auto CurModMapFile =
6571 ModMap.getContainingModuleMapFile(CurrentModule);
6572 auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6573 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6574 Diag(diag::note_module_file_conflict)
6575 << CurModMapFile->getName() << ModMapFile->getName();
6576
6577 return nullptr;
6578 }
6579 }
6580
6581 F.DidReadTopLevelSubmodule = true;
6582 CurrentModule->setASTFileNameAndKey(F.FileName, F.FileKey);
6583 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6584 }
6585
6586 CurrentModule->Kind = Kind;
6587 // Note that we may be rewriting an existing location and it is important
6588 // to keep doing that. In particular, we would like to prefer a
6589 // `DefinitionLoc` loaded from the module file instead of the location
6590 // created in the current source manager, because it allows the new
6591 // location to be marked as "unaffecting" when writing and avoid creating
6592 // duplicate locations for the same module map file.
6593 CurrentModule->DefinitionLoc = DefinitionLoc;
6594 CurrentModule->Signature = F.Signature;
6595 CurrentModule->IsFromModuleFile = true;
6596 if (InferredAllowedBy.isValid())
6597 ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6598 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6599 CurrentModule->IsExternC = IsExternC;
6600 CurrentModule->InferSubmodules = InferSubmodules;
6601 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6602 CurrentModule->InferExportWildcard = InferExportWildcard;
6603 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6604 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6605 CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6606
6607 if (!ParentModule && !F.BaseDirectory.empty()) {
6608 if (auto Dir = FileMgr.getOptionalDirectoryRef(F.BaseDirectory))
6609 CurrentModule->Directory = *Dir;
6610 } else if (ParentModule && ParentModule->Directory) {
6611 // Submodules inherit the directory from their parent.
6612 CurrentModule->Directory = ParentModule->Directory;
6613 }
6614
6615 if (DeserializationListener)
6616 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6617
6618 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6619
6620 // Clear out data that will be replaced by what is in the module file.
6621 CurrentModule->LinkLibraries.clear();
6622 CurrentModule->ConfigMacros.clear();
6623 CurrentModule->UnresolvedConflicts.clear();
6624 CurrentModule->Conflicts.clear();
6625
6626 // The module is available unless it's missing a requirement; relevant
6627 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6628 // Missing headers that were present when the module was built do not
6629 // make it unavailable -- if we got this far, this must be an explicitly
6630 // imported module file.
6631 CurrentModule->Requirements.clear();
6632 CurrentModule->MissingHeaders.clear();
6633 CurrentModule->IsUnimportable =
6634 ParentModule && ParentModule->IsUnimportable;
6635 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6636 break;
6637 }
6638
6640 SmallString<128> RelativePathName;
6641 if (auto Umbrella = ModMap.findUmbrellaHeaderForModule(
6642 CurrentModule, Blob.str(), RelativePathName)) {
6643 if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6644 ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob,
6645 RelativePathName);
6646 }
6647 // Note that it's too late at this point to return out of date if the
6648 // name from the PCM doesn't match up with the one in the module map,
6649 // but also quite unlikely since we will have already checked the
6650 // modification time and size of the module map file itself.
6651 }
6652 break;
6653 }
6654
6655 case SUBMODULE_HEADER:
6658 // We lazily associate headers with their modules via the HeaderInfo table.
6659 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6660 // of complete filenames or remove it entirely.
6661 break;
6662
6665 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6666 // them here.
6667 break;
6668
6669 case SUBMODULE_TOPHEADER: {
6670 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6671 CurrentModule->addTopHeaderFilename(*HeaderName);
6672 break;
6673 }
6674
6676 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6677 if (auto Umbrella =
6678 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6679 if (!CurrentModule->getUmbrellaDirAsWritten()) {
6680 // FIXME: NameAsWritten
6681 ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6682 }
6683 }
6684 break;
6685 }
6686
6687 case SUBMODULE_IMPORTS:
6688 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6689 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6690 CurrentModule->Imports.push_back(ModuleRef(this, GlobalID));
6691 }
6692 break;
6693
6695 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6696 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6697 CurrentModule->AffectingClangModules.push_back(
6698 ModuleRef(this, GlobalID));
6699 }
6700 break;
6701
6702 case SUBMODULE_EXPORTS:
6703 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6704 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6705 bool IsWildcard = Record[Idx + 1];
6706 ModuleRef ExportedMod =
6707 GlobalID ? ModuleRef(this, GlobalID) : ModuleRef();
6708 if (ExportedMod || IsWildcard)
6709 CurrentModule->Exports.push_back({ExportedMod, IsWildcard});
6710 }
6711
6712 // Once we've loaded the set of exports, there's no reason to keep
6713 // the parsed, unresolved exports around.
6714 CurrentModule->UnresolvedExports.clear();
6715 break;
6716
6717 case SUBMODULE_REQUIRES:
6718 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6719 PP.getTargetInfo());
6720 break;
6721
6723 ModMap.resolveLinkAsDependencies(CurrentModule);
6724 CurrentModule->LinkLibraries.push_back(
6725 Module::LinkLibrary(std::string(Blob), Record[0]));
6726 break;
6727
6729 CurrentModule->ConfigMacros.push_back(Blob.str());
6730 break;
6731
6732 case SUBMODULE_CONFLICT: {
6733 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6734 Module::Conflict Conflict;
6735 Conflict.Other = ModuleRef(this, GlobalID);
6736 Conflict.Message = Blob.str();
6737 CurrentModule->Conflicts.push_back(Conflict);
6738 break;
6739 }
6740
6742 if (!ContextObj)
6743 break;
6744 // Standard C++ module has its own way to initialize variables.
6745 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
6747 for (unsigned I = 0; I < Record.size(); /*in loop*/)
6748 Inits.push_back(ReadDeclID(F, Record, I));
6749 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6750 }
6751 break;
6752 }
6753
6755 CurrentModule->ExportAsModule = Blob.str();
6756 ModMap.addLinkAsDependency(CurrentModule);
6757 break;
6758
6759 case SUBMODULE_CHILD: {
6760 // Record a not-yet-loaded direct child for on-demand deserialization.
6761 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6762 CurrentModule->addSubmodule(Blob, this, GlobalID);
6763 break;
6764 }
6765 }
6766 }
6767}
6768
6769/// Parse the record that corresponds to a LangOptions data
6770/// structure.
6771///
6772/// This routine parses the language options from the AST file and then gives
6773/// them to the AST listener if one is set.
6774///
6775/// \returns true if the listener deems the file unacceptable, false otherwise.
6776bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6777 StringRef ModuleFilename, bool Complain,
6778 ASTReaderListener &Listener,
6779 bool AllowCompatibleDifferences) {
6780 LangOptions LangOpts;
6781 unsigned Idx = 0;
6782 LangOpts.LangStd = static_cast<LangStandard::Kind>(Record[Idx++]);
6783#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6784 LangOpts.Name = Record[Idx++];
6785#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6786 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6787#include "clang/Basic/LangOptions.def"
6788#define SANITIZER(NAME, ID) \
6789 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6790#include "clang/Basic/Sanitizers.def"
6791
6792 for (unsigned N = Record[Idx++]; N; --N)
6793 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6794
6795 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6796 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6797 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6798
6799 LangOpts.CurrentModule = ReadString(Record, Idx);
6800
6801 // Comment options.
6802 for (unsigned N = Record[Idx++]; N; --N) {
6803 LangOpts.CommentOpts.BlockCommandNames.push_back(
6804 ReadString(Record, Idx));
6805 }
6806 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6807
6808 // OpenMP offloading options.
6809 for (unsigned N = Record[Idx++]; N; --N) {
6810 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6811 }
6812
6813 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6814
6815 return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6816 AllowCompatibleDifferences);
6817}
6818
6819bool ASTReader::ParseCodeGenOptions(const RecordData &Record,
6820 StringRef ModuleFilename, bool Complain,
6821 ASTReaderListener &Listener,
6822 bool AllowCompatibleDifferences) {
6823 unsigned Idx = 0;
6824 CodeGenOptions CGOpts;
6826#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6827 if constexpr (CK::Compatibility != CK::Benign) \
6828 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6829#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6830 if constexpr (CK::Compatibility != CK::Benign) \
6831 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6832#define DEBUGOPT(Name, Bits, Default, Compatibility)
6833#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6834#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6835#include "clang/Basic/CodeGenOptions.def"
6836
6837 return Listener.ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
6838 AllowCompatibleDifferences);
6839}
6840
6841bool ASTReader::ParseTargetOptions(const RecordData &Record,
6842 StringRef ModuleFilename, bool Complain,
6843 ASTReaderListener &Listener,
6844 bool AllowCompatibleDifferences) {
6845 unsigned Idx = 0;
6846 TargetOptions TargetOpts;
6847 TargetOpts.Triple = ReadString(Record, Idx);
6848 TargetOpts.CPU = ReadString(Record, Idx);
6849 TargetOpts.TuneCPU = ReadString(Record, Idx);
6850 TargetOpts.ABI = ReadString(Record, Idx);
6851 for (unsigned N = Record[Idx++]; N; --N) {
6852 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6853 }
6854 for (unsigned N = Record[Idx++]; N; --N) {
6855 TargetOpts.Features.push_back(ReadString(Record, Idx));
6856 }
6857
6858 return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6859 AllowCompatibleDifferences);
6860}
6861
6862bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6863 StringRef ModuleFilename, bool Complain,
6864 ASTReaderListener &Listener) {
6865 DiagnosticOptions DiagOpts;
6866 unsigned Idx = 0;
6867#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6868#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6869 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6870#include "clang/Basic/DiagnosticOptions.def"
6871
6872 for (unsigned N = Record[Idx++]; N; --N)
6873 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6874 for (unsigned N = Record[Idx++]; N; --N)
6875 DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6876
6877 return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6878}
6879
6880bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6881 ASTReaderListener &Listener) {
6882 FileSystemOptions FSOpts;
6883 unsigned Idx = 0;
6884 FSOpts.WorkingDir = ReadString(Record, Idx);
6885 return Listener.ReadFileSystemOptions(FSOpts, Complain);
6886}
6887
6888bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6889 StringRef ModuleFilename,
6890 bool Complain,
6891 ASTReaderListener &Listener) {
6892 HeaderSearchOptions HSOpts;
6893 unsigned Idx = 0;
6894 HSOpts.Sysroot = ReadString(Record, Idx);
6895
6896 HSOpts.ResourceDir = ReadString(Record, Idx);
6897 HSOpts.ModuleCachePath = ReadString(Record, Idx);
6898 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6899 HSOpts.DisableModuleHash = Record[Idx++];
6900 HSOpts.ImplicitModuleMaps = Record[Idx++];
6901 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6902 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6903 HSOpts.UseBuiltinIncludes = Record[Idx++];
6904 HSOpts.UseStandardSystemIncludes = Record[Idx++];
6905 HSOpts.UseStandardCXXIncludes = Record[Idx++];
6906 HSOpts.UseLibcxx = Record[Idx++];
6907 std::string ContextHash = ReadString(Record, Idx);
6908
6909 return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
6910 Complain);
6911}
6912
6913bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6914 ASTReaderListener &Listener) {
6915 HeaderSearchOptions HSOpts;
6916 unsigned Idx = 0;
6917
6918 // Include entries.
6919 for (unsigned N = Record[Idx++]; N; --N) {
6920 std::string Path = ReadString(Record, Idx);
6922 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6923 bool IsFramework = Record[Idx++];
6924 bool IgnoreSysRoot = Record[Idx++];
6925 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6926 IgnoreSysRoot);
6927 }
6928
6929 // System header prefixes.
6930 for (unsigned N = Record[Idx++]; N; --N) {
6931 std::string Prefix = ReadString(Record, Idx);
6932 bool IsSystemHeader = Record[Idx++];
6933 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6934 }
6935
6936 // VFS overlay files.
6937 for (unsigned N = Record[Idx++]; N; --N) {
6938 std::string VFSOverlayFile = ReadString(Record, Idx);
6939 HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6940 }
6941
6942 return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6943}
6944
6945bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6946 StringRef ModuleFilename,
6947 bool Complain,
6948 ASTReaderListener &Listener,
6949 std::string &SuggestedPredefines) {
6950 PreprocessorOptions PPOpts;
6951 unsigned Idx = 0;
6952
6953 // Macro definitions/undefs
6954 bool ReadMacros = Record[Idx++];
6955 if (ReadMacros) {
6956 for (unsigned N = Record[Idx++]; N; --N) {
6957 std::string Macro = ReadString(Record, Idx);
6958 bool IsUndef = Record[Idx++];
6959 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6960 }
6961 }
6962
6963 // Includes
6964 for (unsigned N = Record[Idx++]; N; --N) {
6965 PPOpts.Includes.push_back(ReadString(Record, Idx));
6966 }
6967
6968 // Macro Includes
6969 for (unsigned N = Record[Idx++]; N; --N) {
6970 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6971 }
6972
6973 PPOpts.UsePredefines = Record[Idx++];
6974 PPOpts.DetailedRecord = Record[Idx++];
6975 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6977 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6978 SuggestedPredefines.clear();
6979 return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6980 Complain, SuggestedPredefines);
6981}
6982
6983std::pair<ModuleFile *, unsigned>
6984ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6985 GlobalPreprocessedEntityMapType::iterator
6986 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6987 assert(I != GlobalPreprocessedEntityMap.end() &&
6988 "Corrupted global preprocessed entity map");
6989 ModuleFile *M = I->second;
6990 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6991 return std::make_pair(M, LocalIndex);
6992}
6993
6994llvm::iterator_range<PreprocessingRecord::iterator>
6995ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6996 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6997 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6999
7000 return llvm::make_range(PreprocessingRecord::iterator(),
7001 PreprocessingRecord::iterator());
7002}
7003
7004bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
7005 unsigned int ClientLoadCapabilities) {
7006 return ClientLoadCapabilities & ARR_OutOfDate &&
7007 !getModuleManager()
7008 .getModuleCache()
7009 .getInMemoryModuleCache()
7010 .isPCMFinal(ModuleFileName);
7011}
7012
7013llvm::iterator_range<ASTReader::ModuleDeclIterator>
7015 return llvm::make_range(
7016 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
7017 ModuleDeclIterator(this, &Mod,
7019}
7020
7022 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
7023 assert(I != GlobalSkippedRangeMap.end() &&
7024 "Corrupted global skipped range map");
7025 ModuleFile *M = I->second;
7026 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
7027 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
7028 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
7029 SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
7030 ReadSourceLocation(*M, RawRange.getEnd()));
7031 assert(Range.isValid());
7032 return Range;
7033}
7034
7035unsigned
7036ASTReader::translatePreprocessedEntityIDToIndex(PreprocessedEntityID ID) const {
7037 unsigned ModuleFileIndex = ID >> 32;
7038 assert(ModuleFileIndex && "not translating loaded MacroID?");
7039 assert(getModuleManager().size() > ModuleFileIndex - 1);
7040 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
7041
7042 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
7043 return MF.BasePreprocessedEntityID + ID;
7044}
7045
7047 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7048 ModuleFile &M = *PPInfo.first;
7049 unsigned LocalIndex = PPInfo.second;
7051 (static_cast<PreprocessedEntityID>(M.Index + 1) << 32) | LocalIndex;
7052 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7053
7054 if (!PP.getPreprocessingRecord()) {
7055 Error("no preprocessing record");
7056 return nullptr;
7057 }
7058
7060 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
7061 M.MacroOffsetsBase + PPOffs.getOffset())) {
7062 Error(std::move(Err));
7063 return nullptr;
7064 }
7065
7067 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
7068 if (!MaybeEntry) {
7069 Error(MaybeEntry.takeError());
7070 return nullptr;
7071 }
7072 llvm::BitstreamEntry Entry = MaybeEntry.get();
7073
7074 if (Entry.Kind != llvm::BitstreamEntry::Record)
7075 return nullptr;
7076
7077 // Read the record.
7078 SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
7079 ReadSourceLocation(M, PPOffs.getEnd()));
7080 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
7081 StringRef Blob;
7083 Expected<unsigned> MaybeRecType =
7084 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
7085 if (!MaybeRecType) {
7086 Error(MaybeRecType.takeError());
7087 return nullptr;
7088 }
7089 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
7090 case PPD_MACRO_EXPANSION: {
7091 bool isBuiltin = Record[0];
7092 IdentifierInfo *Name = nullptr;
7093 MacroDefinitionRecord *Def = nullptr;
7094 if (isBuiltin)
7095 Name = getLocalIdentifier(M, Record[1]);
7096 else {
7097 PreprocessedEntityID GlobalID =
7099 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7100 Def =
7101 cast<MacroDefinitionRecord>(PPRec.getLoadedPreprocessedEntity(Index));
7102 }
7103
7104 MacroExpansion *ME;
7105 if (isBuiltin)
7106 ME = new (PPRec) MacroExpansion(Name, Range);
7107 else
7108 ME = new (PPRec) MacroExpansion(Def, Range);
7109
7110 return ME;
7111 }
7112
7113 case PPD_MACRO_DEFINITION: {
7114 // Decode the identifier info and then check again; if the macro is
7115 // still defined and associated with the identifier,
7117 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
7118
7119 if (DeserializationListener)
7120 DeserializationListener->MacroDefinitionRead(PPID, MD);
7121
7122 return MD;
7123 }
7124
7126 const char *FullFileNameStart = Blob.data() + Record[0];
7127 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
7129 if (!FullFileName.empty())
7130 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7131
7132 // FIXME: Stable encoding
7134 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
7136 = new (PPRec) InclusionDirective(PPRec, Kind,
7137 StringRef(Blob.data(), Record[0]),
7138 Record[1], Record[3],
7139 File,
7140 Range);
7141 return ID;
7142 }
7143 }
7144
7145 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
7146}
7147
7148/// Find the next module that contains entities and return the ID
7149/// of the first entry.
7150///
7151/// \param SLocMapI points at a chunk of a module that contains no
7152/// preprocessed entities or the entities it contains are not the ones we are
7153/// looking for.
7154unsigned ASTReader::findNextPreprocessedEntity(
7155 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
7156 ++SLocMapI;
7157 for (GlobalSLocOffsetMapType::const_iterator
7158 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7159 ModuleFile &M = *SLocMapI->second;
7161 return M.BasePreprocessedEntityID;
7162 }
7163
7164 return getTotalNumPreprocessedEntities();
7165}
7166
7167namespace {
7168
7169struct PPEntityComp {
7170 const ASTReader &Reader;
7171 ModuleFile &M;
7172
7173 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7174
7175 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
7176 SourceLocation LHS = getLoc(L);
7177 SourceLocation RHS = getLoc(R);
7178 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7179 }
7180
7181 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
7182 SourceLocation LHS = getLoc(L);
7183 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7184 }
7185
7186 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
7187 SourceLocation RHS = getLoc(R);
7188 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7189 }
7190
7191 SourceLocation getLoc(const PPEntityOffset &PPE) const {
7192 return Reader.ReadSourceLocation(M, PPE.getBegin());
7193 }
7194};
7195
7196} // namespace
7197
7198unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7199 bool EndsAfter) const {
7200 if (SourceMgr.isLocalSourceLocation(Loc))
7201 return getTotalNumPreprocessedEntities();
7202
7203 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7204 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7205 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7206 "Corrupted global sloc offset map");
7207
7208 if (SLocMapI->second->NumPreprocessedEntities == 0)
7209 return findNextPreprocessedEntity(SLocMapI);
7210
7211 ModuleFile &M = *SLocMapI->second;
7212
7213 using pp_iterator = const PPEntityOffset *;
7214
7215 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
7216 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
7217
7218 size_t Count = M.NumPreprocessedEntities;
7219 size_t Half;
7220 pp_iterator First = pp_begin;
7221 pp_iterator PPI;
7222
7223 if (EndsAfter) {
7224 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7225 PPEntityComp(*this, M));
7226 } else {
7227 // Do a binary search manually instead of using std::lower_bound because
7228 // The end locations of entities may be unordered (when a macro expansion
7229 // is inside another macro argument), but for this case it is not important
7230 // whether we get the first macro expansion or its containing macro.
7231 while (Count > 0) {
7232 Half = Count / 2;
7233 PPI = First;
7234 std::advance(PPI, Half);
7235 if (SourceMgr.isBeforeInTranslationUnit(
7236 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7237 First = PPI;
7238 ++First;
7239 Count = Count - Half - 1;
7240 } else
7241 Count = Half;
7242 }
7243 }
7244
7245 if (PPI == pp_end)
7246 return findNextPreprocessedEntity(SLocMapI);
7247
7248 return M.BasePreprocessedEntityID + (PPI - pp_begin);
7249}
7250
7251/// Returns a pair of [Begin, End) indices of preallocated
7252/// preprocessed entities that \arg Range encompasses.
7253std::pair<unsigned, unsigned>
7255 if (Range.isInvalid())
7256 return std::make_pair(0,0);
7257 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7258
7259 unsigned BeginID = findPreprocessedEntity(Range.getBegin(), false);
7260 unsigned EndID = findPreprocessedEntity(Range.getEnd(), true);
7261 return std::make_pair(BeginID, EndID);
7262}
7263
7264/// Optionally returns true or false if the preallocated preprocessed
7265/// entity with index \arg Index came from file \arg FID.
7266std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
7267 FileID FID) {
7268 if (FID.isInvalid())
7269 return false;
7270
7271 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7272 ModuleFile &M = *PPInfo.first;
7273 unsigned LocalIndex = PPInfo.second;
7274 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7275
7276 SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
7277 if (Loc.isInvalid())
7278 return false;
7279
7280 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7281 return true;
7282 else
7283 return false;
7284}
7285
7286namespace {
7287
7288 /// Visitor used to search for information about a header file.
7289 class HeaderFileInfoVisitor {
7290 FileEntryRef FE;
7291 std::optional<HeaderFileInfo> HFI;
7292
7293 public:
7294 explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
7295
7296 bool operator()(ModuleFile &M) {
7299 if (!Table)
7300 return false;
7301
7302 // Look in the on-disk hash table for an entry for this file name.
7303 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7304 if (Pos == Table->end())
7305 return false;
7306
7307 HFI = *Pos;
7308 return true;
7309 }
7310
7311 std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
7312 };
7313
7314} // namespace
7315
7317 HeaderFileInfoVisitor Visitor(FE);
7318 ModuleMgr.visit(Visitor);
7319 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7320 return *HFI;
7321
7322 return HeaderFileInfo();
7323}
7324
7326 using DiagState = DiagnosticsEngine::DiagState;
7328
7329 for (ModuleFile &F : ModuleMgr) {
7330 unsigned Idx = 0;
7331 auto &Record = F.PragmaDiagMappings;
7332 if (Record.empty())
7333 continue;
7334
7335 DiagStates.clear();
7336
7337 auto ReadDiagState = [&](const DiagState &BasedOn,
7338 bool IncludeNonPragmaStates) {
7339 unsigned BackrefID = Record[Idx++];
7340 if (BackrefID != 0)
7341 return DiagStates[BackrefID - 1];
7342
7343 // A new DiagState was created here.
7344 Diag.DiagStates.push_back(BasedOn);
7345 DiagState *NewState = &Diag.DiagStates.back();
7346 DiagStates.push_back(NewState);
7347 unsigned Size = Record[Idx++];
7348 assert(Idx + Size * 2 <= Record.size() &&
7349 "Invalid data, not enough diag/map pairs");
7350 while (Size--) {
7351 unsigned DiagID = Record[Idx++];
7352 DiagnosticMapping NewMapping =
7354 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
7355 continue;
7356
7357 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
7358
7359 // If this mapping was specified as a warning but the severity was
7360 // upgraded due to diagnostic settings, simulate the current diagnostic
7361 // settings (and use a warning).
7362 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
7364 NewMapping.setUpgradedFromWarning(false);
7365 }
7366
7367 Mapping = NewMapping;
7368 }
7369 return NewState;
7370 };
7371
7372 // Read the first state.
7373 DiagState *FirstState;
7374 if (F.Kind == MK_ImplicitModule) {
7375 // Implicitly-built modules are reused with different diagnostic
7376 // settings. Use the initial diagnostic state from Diag to simulate this
7377 // compilation's diagnostic settings.
7378 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
7379 DiagStates.push_back(FirstState);
7380
7381 // Skip the initial diagnostic state from the serialized module.
7382 assert(Record[1] == 0 &&
7383 "Invalid data, unexpected backref in initial state");
7384 Idx = 3 + Record[2] * 2;
7385 assert(Idx < Record.size() &&
7386 "Invalid data, not enough state change pairs in initial state");
7387 } else if (F.isModule()) {
7388 // For an explicit module, preserve the flags from the module build
7389 // command line (-w, -Weverything, -Werror, ...) along with any explicit
7390 // -Wblah flags.
7391 unsigned Flags = Record[Idx++];
7392 DiagState Initial(*Diag.getDiagnosticIDs());
7393 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7394 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7395 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7396 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7397 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7398 Initial.ExtBehavior = (diag::Severity)Flags;
7399 FirstState = ReadDiagState(Initial, true);
7400
7401 assert(F.OriginalSourceFileID.isValid());
7402
7403 // Set up the root buffer of the module to start with the initial
7404 // diagnostic state of the module itself, to cover files that contain no
7405 // explicit transitions (for which we did not serialize anything).
7406 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
7407 .StateTransitions.push_back({FirstState, 0});
7408 } else {
7409 // For prefix ASTs, start with whatever the user configured on the
7410 // command line.
7411 Idx++; // Skip flags.
7412 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
7413 }
7414
7415 // Read the state transitions.
7416 unsigned NumLocations = Record[Idx++];
7417 while (NumLocations--) {
7418 assert(Idx < Record.size() &&
7419 "Invalid data, missing pragma diagnostic states");
7420 FileID FID = ReadFileID(F, Record, Idx);
7421 assert(FID.isValid() && "invalid FileID for transition");
7422 unsigned Transitions = Record[Idx++];
7423
7424 // Note that we don't need to set up Parent/ParentOffset here, because
7425 // we won't be changing the diagnostic state within imported FileIDs
7426 // (other than perhaps appending to the main source file, which has no
7427 // parent).
7428 auto &F = Diag.DiagStatesByLoc.Files[FID];
7429 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7430 for (unsigned I = 0; I != Transitions; ++I) {
7431 unsigned Offset = Record[Idx++];
7432 auto *State = ReadDiagState(*FirstState, false);
7433 F.StateTransitions.push_back({State, Offset});
7434 }
7435 }
7436
7437 // Read the final state.
7438 assert(Idx < Record.size() &&
7439 "Invalid data, missing final pragma diagnostic state");
7440 SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
7441 auto *CurState = ReadDiagState(*FirstState, false);
7442
7443 if (!F.isModule()) {
7444 Diag.DiagStatesByLoc.CurDiagState = CurState;
7445 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7446
7447 // Preserve the property that the imaginary root file describes the
7448 // current state.
7449 FileID NullFile;
7450 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7451 if (T.empty())
7452 T.push_back({CurState, 0});
7453 else
7454 T[0].State = CurState;
7455 }
7456
7457 // Restore the push stack so that unmatched pushes from a preamble are
7458 // visible when the main file is parsed, allowing the corresponding
7459 // `#pragma diagnostic pop` to succeed.
7460 assert(Idx < Record.size() &&
7461 "Invalid data, missing diagnostic push stack");
7462 unsigned NumPushes = Record[Idx++];
7463 for (unsigned I = 0; I != NumPushes; ++I) {
7464 auto *State = ReadDiagState(*FirstState, false);
7465 if (!F.isModule())
7466 Diag.DiagStateOnPushStack.push_back(State);
7467 }
7468
7469 // Don't try to read these mappings again.
7470 Record.clear();
7471 }
7472}
7473
7474/// Get the correct cursor and offset for loading a type.
7475ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7476 auto [M, Index] = translateTypeIDToIndex(ID);
7477 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7479}
7480
7481static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7482 switch (code) {
7483#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7484 case TYPE_##CODE_ID: return Type::CLASS_ID;
7485#include "clang/Serialization/TypeBitCodes.def"
7486 default:
7487 return std::nullopt;
7488 }
7489}
7490
7491/// Read and return the type with the given index..
7492///
7493/// The index is the type ID, shifted and minus the number of predefs. This
7494/// routine actually reads the record corresponding to the type at the given
7495/// location. It is a helper routine for GetType, which deals with reading type
7496/// IDs.
7497QualType ASTReader::readTypeRecord(TypeID ID) {
7498 assert(ContextObj && "reading type with no AST context");
7499 ASTContext &Context = *ContextObj;
7500 RecordLocation Loc = TypeCursorForIndex(ID);
7501 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7502
7503 // Keep track of where we are in the stream, then jump back there
7504 // after reading this type.
7505 SavedStreamPosition SavedPosition(DeclsCursor);
7506
7507 ReadingKindTracker ReadingKind(Read_Type, *this);
7508
7509 // Note that we are loading a type record.
7510 Deserializing AType(this);
7511
7512 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7513 Error(std::move(Err));
7514 return QualType();
7515 }
7516 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7517 if (!RawCode) {
7518 Error(RawCode.takeError());
7519 return QualType();
7520 }
7521
7522 ASTRecordReader Record(*this, *Loc.F);
7523 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7524 if (!Code) {
7525 Error(Code.takeError());
7526 return QualType();
7527 }
7528 if (Code.get() == TYPE_EXT_QUAL) {
7529 QualType baseType = Record.readQualType();
7530 Qualifiers quals = Record.readQualifiers();
7531 return Context.getQualifiedType(baseType, quals);
7532 }
7533
7534 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7535 if (!maybeClass) {
7536 Error("Unexpected code for type");
7537 return QualType();
7538 }
7539
7540 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7541 return TypeReader.read(*maybeClass);
7542}
7543
7544namespace clang {
7545
7546class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7547 ASTRecordReader &Reader;
7548
7549 SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
7550 SourceRange readSourceRange() { return Reader.readSourceRange(); }
7551
7552 TypeSourceInfo *GetTypeSourceInfo() {
7553 return Reader.readTypeSourceInfo();
7554 }
7555
7556 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7557 return Reader.readNestedNameSpecifierLoc();
7558 }
7559
7560 Attr *ReadAttr() {
7561 return Reader.readAttr();
7562 }
7563
7564public:
7565 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7566
7567 // We want compile-time assurance that we've enumerated all of
7568 // these, so unfortunately we have to declare them first, then
7569 // define them out-of-line.
7570#define ABSTRACT_TYPELOC(CLASS, PARENT)
7571#define TYPELOC(CLASS, PARENT) \
7572 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7573#include "clang/AST/TypeLocNodes.def"
7574
7577 void VisitTagTypeLoc(TagTypeLoc TL);
7578};
7579
7580} // namespace clang
7581
7582void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7583 // nothing to do
7584}
7585
7586void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7587 TL.setBuiltinLoc(readSourceLocation());
7588 if (TL.needsExtraLocalData()) {
7589 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7590 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7591 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7592 TL.setModeAttr(Reader.readInt());
7593 }
7594}
7595
7596void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7597 TL.setNameLoc(readSourceLocation());
7598}
7599
7600void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7601 TL.setStarLoc(readSourceLocation());
7602}
7603
7604void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7605 // nothing to do
7606}
7607
7608void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7609 // nothing to do
7610}
7611
7612void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7613 // nothing to do
7614}
7615
7616void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7617 TL.setExpansionLoc(readSourceLocation());
7618}
7619
7620void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7621 TL.setCaretLoc(readSourceLocation());
7622}
7623
7624void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7625 TL.setAmpLoc(readSourceLocation());
7626}
7627
7628void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7629 TL.setAmpAmpLoc(readSourceLocation());
7630}
7631
7632void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7633 TL.setStarLoc(readSourceLocation());
7634 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7635}
7636
7638 TL.setLBracketLoc(readSourceLocation());
7639 TL.setRBracketLoc(readSourceLocation());
7640 if (Reader.readBool())
7641 TL.setSizeExpr(Reader.readExpr());
7642 else
7643 TL.setSizeExpr(nullptr);
7644}
7645
7646void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7647 VisitArrayTypeLoc(TL);
7648}
7649
7650void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7651 VisitArrayTypeLoc(TL);
7652}
7653
7654void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7655 VisitArrayTypeLoc(TL);
7656}
7657
7658void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7659 DependentSizedArrayTypeLoc TL) {
7660 VisitArrayTypeLoc(TL);
7661}
7662
7663void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7664 DependentAddressSpaceTypeLoc TL) {
7665
7666 TL.setAttrNameLoc(readSourceLocation());
7667 TL.setAttrOperandParensRange(readSourceRange());
7668 TL.setAttrExprOperand(Reader.readExpr());
7669}
7670
7671void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7672 DependentSizedExtVectorTypeLoc TL) {
7673 TL.setNameLoc(readSourceLocation());
7674}
7675
7676void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7677 TL.setNameLoc(readSourceLocation());
7678}
7679
7680void TypeLocReader::VisitDependentVectorTypeLoc(
7681 DependentVectorTypeLoc TL) {
7682 TL.setNameLoc(readSourceLocation());
7683}
7684
7685void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7686 TL.setNameLoc(readSourceLocation());
7687}
7688
7689void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7690 TL.setAttrNameLoc(readSourceLocation());
7691 TL.setAttrOperandParensRange(readSourceRange());
7692 TL.setAttrRowOperand(Reader.readExpr());
7693 TL.setAttrColumnOperand(Reader.readExpr());
7694}
7695
7696void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7697 DependentSizedMatrixTypeLoc TL) {
7698 TL.setAttrNameLoc(readSourceLocation());
7699 TL.setAttrOperandParensRange(readSourceRange());
7700 TL.setAttrRowOperand(Reader.readExpr());
7701 TL.setAttrColumnOperand(Reader.readExpr());
7702}
7703
7705 TL.setLocalRangeBegin(readSourceLocation());
7706 TL.setLParenLoc(readSourceLocation());
7707 TL.setRParenLoc(readSourceLocation());
7708 TL.setExceptionSpecRange(readSourceRange());
7709 TL.setLocalRangeEnd(readSourceLocation());
7710 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7711 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7712 }
7713}
7714
7715void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7716 VisitFunctionTypeLoc(TL);
7717}
7718
7719void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7720 VisitFunctionTypeLoc(TL);
7721}
7722
7723void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7724 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7725 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7726 SourceLocation NameLoc = readSourceLocation();
7727 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7728}
7729
7730void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7731 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7732 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7733 SourceLocation NameLoc = readSourceLocation();
7734 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7735}
7736
7737void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7738 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7739 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7740 SourceLocation NameLoc = readSourceLocation();
7741 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7742}
7743
7744void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7745 TL.setTypeofLoc(readSourceLocation());
7746 TL.setLParenLoc(readSourceLocation());
7747 TL.setRParenLoc(readSourceLocation());
7748}
7749
7750void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7751 TL.setTypeofLoc(readSourceLocation());
7752 TL.setLParenLoc(readSourceLocation());
7753 TL.setRParenLoc(readSourceLocation());
7754 TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7755}
7756
7757void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7758 TL.setDecltypeLoc(readSourceLocation());
7759 TL.setRParenLoc(readSourceLocation());
7760}
7761
7762void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7763 TL.setEllipsisLoc(readSourceLocation());
7764}
7765
7766void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7767 TL.setKWLoc(readSourceLocation());
7768 TL.setLParenLoc(readSourceLocation());
7769 TL.setRParenLoc(readSourceLocation());
7770 TL.setUnderlyingTInfo(GetTypeSourceInfo());
7771}
7772
7774 auto NNS = readNestedNameSpecifierLoc();
7775 auto TemplateKWLoc = readSourceLocation();
7776 auto ConceptNameLoc = readDeclarationNameInfo();
7777 auto FoundDecl = readDeclAs<NamedDecl>();
7778 auto NamedConcept = readTemplateName();
7779 auto *CR = ConceptReference::Create(
7780 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7781 (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7782 return CR;
7783}
7784
7785void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7786 TL.setNameLoc(readSourceLocation());
7787 if (Reader.readBool())
7788 TL.setConceptReference(Reader.readConceptReference());
7789 if (Reader.readBool())
7790 TL.setRParenLoc(readSourceLocation());
7791}
7792
7793void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7795 TL.setElaboratedKeywordLoc(readSourceLocation());
7796 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7797 TL.setTemplateNameLoc(readSourceLocation());
7798}
7799
7801 TL.setElaboratedKeywordLoc(readSourceLocation());
7802 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7803 TL.setNameLoc(readSourceLocation());
7804}
7805
7806void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7807 VisitTagTypeLoc(TL);
7808}
7809
7810void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7811 VisitTagTypeLoc(TL);
7812}
7813
7814void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7815
7816void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7817 TL.setAttr(ReadAttr());
7818}
7819
7820void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7821 // Nothing to do
7822}
7823
7824void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7825 llvm_unreachable(
7826 "should be replaced with a concrete type before serialization");
7827}
7828
7829void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7830 // Nothing to do.
7831}
7832
7833void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7834 TL.setAttrLoc(readSourceLocation());
7835}
7836
7837void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7838 HLSLAttributedResourceTypeLoc TL) {
7839 // Nothing to do.
7840}
7841
7842void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7843 // Nothing to do.
7844}
7845
7846void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7847 TL.setNameLoc(readSourceLocation());
7848}
7849
7850void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7851 SubstTemplateTypeParmTypeLoc TL) {
7852 TL.setNameLoc(readSourceLocation());
7853}
7854
7855void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7856 SubstTemplateTypeParmPackTypeLoc TL) {
7857 TL.setNameLoc(readSourceLocation());
7858}
7859
7860void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7861 SubstBuiltinTemplatePackTypeLoc TL) {
7862 TL.setNameLoc(readSourceLocation());
7863}
7864
7865void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7866 TemplateSpecializationTypeLoc TL) {
7867 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7868 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7869 SourceLocation TemplateKeywordLoc = readSourceLocation();
7870 SourceLocation NameLoc = readSourceLocation();
7871 SourceLocation LAngleLoc = readSourceLocation();
7872 SourceLocation RAngleLoc = readSourceLocation();
7873 TL.set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7874 LAngleLoc, RAngleLoc);
7875 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.getArgLocInfos();
7876 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7877 Args[I] = Reader.readTemplateArgumentLocInfo(
7878 TL.getTypePtr()->template_arguments()[I].getKind());
7879}
7880
7881void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7882 TL.setLParenLoc(readSourceLocation());
7883 TL.setRParenLoc(readSourceLocation());
7884}
7885
7886void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7887 TL.setElaboratedKeywordLoc(readSourceLocation());
7888 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7889 TL.setNameLoc(readSourceLocation());
7890}
7891
7892void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7893 TL.setEllipsisLoc(readSourceLocation());
7894}
7895
7896void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7897 TL.setNameLoc(readSourceLocation());
7898 TL.setNameEndLoc(readSourceLocation());
7899}
7900
7901void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7902 if (TL.getNumProtocols()) {
7903 TL.setProtocolLAngleLoc(readSourceLocation());
7904 TL.setProtocolRAngleLoc(readSourceLocation());
7905 }
7906 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7907 TL.setProtocolLoc(i, readSourceLocation());
7908}
7909
7910void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7911 TL.setHasBaseTypeAsWritten(Reader.readBool());
7912 TL.setTypeArgsLAngleLoc(readSourceLocation());
7913 TL.setTypeArgsRAngleLoc(readSourceLocation());
7914 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7915 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7916 TL.setProtocolLAngleLoc(readSourceLocation());
7917 TL.setProtocolRAngleLoc(readSourceLocation());
7918 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7919 TL.setProtocolLoc(i, readSourceLocation());
7920}
7921
7922void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7923 TL.setStarLoc(readSourceLocation());
7924}
7925
7926void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7927 TL.setKWLoc(readSourceLocation());
7928 TL.setLParenLoc(readSourceLocation());
7929 TL.setRParenLoc(readSourceLocation());
7930}
7931
7932void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7933 TL.setKWLoc(readSourceLocation());
7934}
7935
7936void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7937 TL.setNameLoc(readSourceLocation());
7938}
7939
7940void TypeLocReader::VisitDependentBitIntTypeLoc(
7941 clang::DependentBitIntTypeLoc TL) {
7942 TL.setNameLoc(readSourceLocation());
7943}
7944
7945void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7946 // Nothing to do.
7947}
7948
7950 TypeLocReader TLR(*this);
7951 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7952 TLR.Visit(TL);
7953}
7954
7956 QualType InfoTy = readType();
7957 if (InfoTy.isNull())
7958 return nullptr;
7959
7960 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7961 readTypeLoc(TInfo->getTypeLoc());
7962 return TInfo;
7963}
7964
7966 return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7967}
7968
7970 return ID >> 32;
7971}
7972
7974 // We don't need to erase the higher bits since if these bits are not 0,
7975 // it must be larger than NUM_PREDEF_TYPE_IDS.
7977}
7978
7979std::pair<ModuleFile *, unsigned>
7980ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7981 assert(!isPredefinedType(ID) &&
7982 "Predefined type shouldn't be in TypesLoaded");
7983 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7984 assert(ModuleFileIndex && "Untranslated Local Decl?");
7985
7986 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7987 assert(OwningModuleFile &&
7988 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7989
7990 return {OwningModuleFile,
7991 OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7992}
7993
7995 assert(ContextObj && "reading type with no AST context");
7996 ASTContext &Context = *ContextObj;
7997
7998 unsigned FastQuals = ID & Qualifiers::FastMask;
7999
8000 if (isPredefinedType(ID)) {
8001 QualType T;
8002 unsigned Index = getIndexForTypeID(ID);
8003 switch ((PredefinedTypeIDs)Index) {
8005 // We should never use this one.
8006 llvm_unreachable("Invalid predefined type");
8007 break;
8009 return QualType();
8011 T = Context.VoidTy;
8012 break;
8014 T = Context.BoolTy;
8015 break;
8018 // FIXME: Check that the signedness of CharTy is correct!
8019 T = Context.CharTy;
8020 break;
8022 T = Context.UnsignedCharTy;
8023 break;
8025 T = Context.UnsignedShortTy;
8026 break;
8028 T = Context.UnsignedIntTy;
8029 break;
8031 T = Context.UnsignedLongTy;
8032 break;
8034 T = Context.UnsignedLongLongTy;
8035 break;
8037 T = Context.UnsignedInt128Ty;
8038 break;
8040 T = Context.SignedCharTy;
8041 break;
8043 T = Context.WCharTy;
8044 break;
8046 T = Context.ShortTy;
8047 break;
8048 case PREDEF_TYPE_INT_ID:
8049 T = Context.IntTy;
8050 break;
8052 T = Context.LongTy;
8053 break;
8055 T = Context.LongLongTy;
8056 break;
8058 T = Context.Int128Ty;
8059 break;
8061 T = Context.BFloat16Ty;
8062 break;
8064 T = Context.HalfTy;
8065 break;
8067 T = Context.FloatTy;
8068 break;
8070 T = Context.DoubleTy;
8071 break;
8073 T = Context.LongDoubleTy;
8074 break;
8076 T = Context.ShortAccumTy;
8077 break;
8079 T = Context.AccumTy;
8080 break;
8082 T = Context.LongAccumTy;
8083 break;
8085 T = Context.UnsignedShortAccumTy;
8086 break;
8088 T = Context.UnsignedAccumTy;
8089 break;
8091 T = Context.UnsignedLongAccumTy;
8092 break;
8094 T = Context.ShortFractTy;
8095 break;
8097 T = Context.FractTy;
8098 break;
8100 T = Context.LongFractTy;
8101 break;
8103 T = Context.UnsignedShortFractTy;
8104 break;
8106 T = Context.UnsignedFractTy;
8107 break;
8109 T = Context.UnsignedLongFractTy;
8110 break;
8112 T = Context.SatShortAccumTy;
8113 break;
8115 T = Context.SatAccumTy;
8116 break;
8118 T = Context.SatLongAccumTy;
8119 break;
8121 T = Context.SatUnsignedShortAccumTy;
8122 break;
8124 T = Context.SatUnsignedAccumTy;
8125 break;
8127 T = Context.SatUnsignedLongAccumTy;
8128 break;
8130 T = Context.SatShortFractTy;
8131 break;
8133 T = Context.SatFractTy;
8134 break;
8136 T = Context.SatLongFractTy;
8137 break;
8139 T = Context.SatUnsignedShortFractTy;
8140 break;
8142 T = Context.SatUnsignedFractTy;
8143 break;
8145 T = Context.SatUnsignedLongFractTy;
8146 break;
8148 T = Context.Float16Ty;
8149 break;
8151 T = Context.Float128Ty;
8152 break;
8154 T = Context.Ibm128Ty;
8155 break;
8157 T = Context.OverloadTy;
8158 break;
8160 T = Context.UnresolvedTemplateTy;
8161 break;
8163 T = Context.BoundMemberTy;
8164 break;
8166 T = Context.PseudoObjectTy;
8167 break;
8169 T = Context.DependentTy;
8170 break;
8172 T = Context.UnknownAnyTy;
8173 break;
8175 T = Context.NullPtrTy;
8176 break;
8178 T = Context.MetaInfoTy;
8179 break;
8181 T = Context.Char8Ty;
8182 break;
8184 T = Context.Char16Ty;
8185 break;
8187 T = Context.Char32Ty;
8188 break;
8190 T = Context.ObjCBuiltinIdTy;
8191 break;
8193 T = Context.ObjCBuiltinClassTy;
8194 break;
8196 T = Context.ObjCBuiltinSelTy;
8197 break;
8198#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8199 case PREDEF_TYPE_##Id##_ID: \
8200 T = Context.SingletonId; \
8201 break;
8202#include "clang/Basic/OpenCLImageTypes.def"
8203#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8204 case PREDEF_TYPE_##Id##_ID: \
8205 T = Context.Id##Ty; \
8206 break;
8207#include "clang/Basic/OpenCLExtensionTypes.def"
8209 T = Context.OCLSamplerTy;
8210 break;
8212 T = Context.OCLEventTy;
8213 break;
8215 T = Context.OCLClkEventTy;
8216 break;
8218 T = Context.OCLQueueTy;
8219 break;
8221 T = Context.OCLReserveIDTy;
8222 break;
8224 T = Context.getAutoDeductType();
8225 break;
8227 T = Context.getAutoRRefDeductType();
8228 break;
8230 T = Context.ARCUnbridgedCastTy;
8231 break;
8233 T = Context.BuiltinFnTy;
8234 break;
8236 T = Context.IncompleteMatrixIdxTy;
8237 break;
8239 T = Context.ArraySectionTy;
8240 break;
8242 T = Context.OMPArrayShapingTy;
8243 break;
8245 T = Context.OMPIteratorTy;
8246 break;
8247#define SVE_TYPE(Name, Id, SingletonId) \
8248 case PREDEF_TYPE_##Id##_ID: \
8249 T = Context.SingletonId; \
8250 break;
8251#include "clang/Basic/AArch64ACLETypes.def"
8252#define PPC_VECTOR_TYPE(Name, Id, Size) \
8253 case PREDEF_TYPE_##Id##_ID: \
8254 T = Context.Id##Ty; \
8255 break;
8256#include "clang/Basic/PPCTypes.def"
8257#define RVV_TYPE(Name, Id, SingletonId) \
8258 case PREDEF_TYPE_##Id##_ID: \
8259 T = Context.SingletonId; \
8260 break;
8261#include "clang/Basic/RISCVVTypes.def"
8262#define WASM_TYPE(Name, Id, SingletonId) \
8263 case PREDEF_TYPE_##Id##_ID: \
8264 T = Context.SingletonId; \
8265 break;
8266#include "clang/Basic/WebAssemblyReferenceTypes.def"
8267#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8268 case PREDEF_TYPE_##Id##_ID: \
8269 T = Context.SingletonId; \
8270 break;
8271#include "clang/Basic/AMDGPUTypes.def"
8272#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8273 case PREDEF_TYPE_##Id##_ID: \
8274 T = Context.SingletonId; \
8275 break;
8276#include "clang/Basic/HLSLIntangibleTypes.def"
8277#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
8278 case PREDEF_TYPE_##Id##_ID: \
8279 T = Context.SingletonId; \
8280 break;
8281#include "clang/Basic/HLSLPackedTypes.def"
8282#define SPIRV_TYPE(Name, Id, SingletonId) \
8283 case PREDEF_TYPE_##Id##_ID: \
8284 T = Context.SingletonId; \
8285 break;
8286#include "clang/Basic/SPIRVTypes.def"
8287 }
8288
8289 assert(!T.isNull() && "Unknown predefined type");
8290 return T.withFastQualifiers(FastQuals);
8291 }
8292
8293 unsigned Index = translateTypeIDToIndex(ID).second;
8294
8295 assert(Index < TypesLoaded.size() && "Type index out-of-range");
8296 if (TypesLoaded[Index].isNull()) {
8297 TypesLoaded[Index] = readTypeRecord(ID);
8298 if (TypesLoaded[Index].isNull())
8299 return QualType();
8300
8301 TypesLoaded[Index]->setFromAST();
8302 if (DeserializationListener)
8303 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
8304 TypesLoaded[Index]);
8305 }
8306
8307 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8308}
8309
8311 return GetType(getGlobalTypeID(F, LocalID));
8312}
8313
8315 LocalTypeID LocalID) const {
8316 if (isPredefinedType(LocalID))
8317 return LocalID;
8318
8319 if (!F.ModuleOffsetMap.empty())
8320 ReadModuleOffsetMap(F);
8321
8322 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
8323 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8324
8325 if (ModuleFileIndex == 0)
8327
8328 ModuleFile &MF =
8329 ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
8330 ModuleFileIndex = MF.Index + 1;
8331 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8332}
8333
8336 switch (Kind) {
8338 return readExpr();
8340 return readTypeSourceInfo();
8343 SourceLocation TemplateKWLoc = readSourceLocation();
8345 SourceLocation TemplateNameLoc = readSourceLocation();
8348 : SourceLocation();
8349 return TemplateArgumentLocInfo(getASTContext(), TemplateKWLoc, QualifierLoc,
8350 TemplateNameLoc, EllipsisLoc);
8351 }
8358 // FIXME: Is this right?
8359 return TemplateArgumentLocInfo();
8360 }
8361 llvm_unreachable("unexpected template argument loc");
8362}
8363
8373
8376 Result.setLAngleLoc(readSourceLocation());
8377 Result.setRAngleLoc(readSourceLocation());
8378 unsigned NumArgsAsWritten = readInt();
8379 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
8380 Result.addArgument(readTemplateArgumentLoc());
8381}
8382
8389
8391
8393 if (NumCurrentElementsDeserializing) {
8394 // We arrange to not care about the complete redeclaration chain while we're
8395 // deserializing. Just remember that the AST has marked this one as complete
8396 // but that it's not actually complete yet, so we know we still need to
8397 // complete it later.
8398 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
8399 return;
8400 }
8401
8402 if (!D->getDeclContext()) {
8403 assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
8404 return;
8405 }
8406
8407 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
8408
8409 // If this is a named declaration, complete it by looking it up
8410 // within its context.
8411 //
8412 // FIXME: Merging a function definition should merge
8413 // all mergeable entities within it.
8415 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
8416 if (!getContext().getLangOpts().CPlusPlus &&
8418 // Outside of C++, we don't have a lookup table for the TU, so update
8419 // the identifier instead. (For C++ modules, we don't store decls
8420 // in the serialized identifier table, so we do the lookup in the TU.)
8421 auto *II = Name.getAsIdentifierInfo();
8422 assert(II && "non-identifier name in C?");
8423 if (II->isOutOfDate())
8425 } else
8426 DC->lookup(Name);
8428 // Find all declarations of this kind from the relevant context.
8429 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
8430 auto *DC = cast<DeclContext>(DCDecl);
8433 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
8434 }
8435 }
8436 }
8437
8440 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8441 Template = CTSD->getSpecializedTemplate();
8442 Args = CTSD->getTemplateArgs().asArray();
8443 } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8444 Template = VTSD->getSpecializedTemplate();
8445 Args = VTSD->getTemplateArgs().asArray();
8446 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
8447 if (auto *Tmplt = FD->getPrimaryTemplate()) {
8448 Template = Tmplt;
8449 Args = FD->getTemplateSpecializationArgs()->asArray();
8450 }
8451 }
8452
8453 if (Template)
8454 Template->loadLazySpecializationsImpl(Args);
8455}
8456
8459 RecordLocation Loc = getLocalBitOffset(Offset);
8460 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8461 SavedStreamPosition SavedPosition(Cursor);
8462 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8463 Error(std::move(Err));
8464 return nullptr;
8465 }
8466 ReadingKindTracker ReadingKind(Read_Decl, *this);
8467 Deserializing D(this);
8468
8469 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8470 if (!MaybeCode) {
8471 Error(MaybeCode.takeError());
8472 return nullptr;
8473 }
8474 unsigned Code = MaybeCode.get();
8475
8476 ASTRecordReader Record(*this, *Loc.F);
8477 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8478 if (!MaybeRecCode) {
8479 Error(MaybeRecCode.takeError());
8480 return nullptr;
8481 }
8482 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
8483 Error("malformed AST file: missing C++ ctor initializers");
8484 return nullptr;
8485 }
8486
8487 return Record.readCXXCtorInitializers();
8488}
8489
8491 assert(ContextObj && "reading base specifiers with no AST context");
8492 ASTContext &Context = *ContextObj;
8493
8494 RecordLocation Loc = getLocalBitOffset(Offset);
8495 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8496 SavedStreamPosition SavedPosition(Cursor);
8497 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8498 Error(std::move(Err));
8499 return nullptr;
8500 }
8501 ReadingKindTracker ReadingKind(Read_Decl, *this);
8502 Deserializing D(this);
8503
8504 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8505 if (!MaybeCode) {
8506 Error(MaybeCode.takeError());
8507 return nullptr;
8508 }
8509 unsigned Code = MaybeCode.get();
8510
8511 ASTRecordReader Record(*this, *Loc.F);
8512 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8513 if (!MaybeRecCode) {
8514 Error(MaybeCode.takeError());
8515 return nullptr;
8516 }
8517 unsigned RecCode = MaybeRecCode.get();
8518
8519 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8520 Error("malformed AST file: missing C++ base specifiers");
8521 return nullptr;
8522 }
8523
8524 unsigned NumBases = Record.readInt();
8525 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8526 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8527 for (unsigned I = 0; I != NumBases; ++I)
8528 Bases[I] = Record.readCXXBaseSpecifier();
8529 return Bases;
8530}
8531
8533 LocalDeclID LocalID) const {
8534 if (LocalID < NUM_PREDEF_DECL_IDS)
8535 return GlobalDeclID(LocalID.getRawValue());
8536
8537 unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8538 DeclID ID = LocalID.getLocalDeclIndex();
8539
8540 if (!F.ModuleOffsetMap.empty())
8541 ReadModuleOffsetMap(F);
8542
8543 ModuleFile *OwningModuleFile =
8544 OwningModuleFileIndex == 0
8545 ? &F
8546 : F.TransitiveImports[OwningModuleFileIndex - 1];
8547
8548 if (OwningModuleFileIndex == 0)
8549 ID -= NUM_PREDEF_DECL_IDS;
8550
8551 uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8552 return GlobalDeclID(NewModuleFileIndex, ID);
8553}
8554
8556 // Predefined decls aren't from any module.
8557 if (ID < NUM_PREDEF_DECL_IDS)
8558 return false;
8559
8560 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8561 return M.Index == ModuleFileIndex - 1;
8562}
8563
8565 // Predefined decls aren't from any module.
8566 if (ID < NUM_PREDEF_DECL_IDS)
8567 return nullptr;
8568
8569 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8570 assert(ModuleFileIndex && "Untranslated Local Decl?");
8571
8572 return &getModuleManager()[ModuleFileIndex - 1];
8573}
8574
8576 if (!D->isFromASTFile())
8577 return nullptr;
8578
8579 return getOwningModuleFile(D->getGlobalID());
8580}
8581
8583 if (ID < NUM_PREDEF_DECL_IDS)
8584 return SourceLocation();
8585
8586 if (Decl *D = GetExistingDecl(ID))
8587 return D->getLocation();
8588
8589 SourceLocation Loc;
8590 DeclCursorForID(ID, Loc);
8591 return Loc;
8592}
8593
8594Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8595 assert(ContextObj && "reading predefined decl without AST context");
8596 ASTContext &Context = *ContextObj;
8597 Decl *NewLoaded = nullptr;
8598 switch (ID) {
8600 return nullptr;
8601
8603 return Context.getTranslationUnitDecl();
8604
8606 if (Context.ObjCIdDecl)
8607 return Context.ObjCIdDecl;
8608 NewLoaded = Context.getObjCIdDecl();
8609 break;
8610
8612 if (Context.ObjCSelDecl)
8613 return Context.ObjCSelDecl;
8614 NewLoaded = Context.getObjCSelDecl();
8615 break;
8616
8618 if (Context.ObjCClassDecl)
8619 return Context.ObjCClassDecl;
8620 NewLoaded = Context.getObjCClassDecl();
8621 break;
8622
8624 if (Context.ObjCProtocolClassDecl)
8625 return Context.ObjCProtocolClassDecl;
8626 NewLoaded = Context.getObjCProtocolDecl();
8627 break;
8628
8630 if (Context.Int128Decl)
8631 return Context.Int128Decl;
8632 NewLoaded = Context.getInt128Decl();
8633 break;
8634
8636 if (Context.UInt128Decl)
8637 return Context.UInt128Decl;
8638 NewLoaded = Context.getUInt128Decl();
8639 break;
8640
8642 if (Context.ObjCInstanceTypeDecl)
8643 return Context.ObjCInstanceTypeDecl;
8644 NewLoaded = Context.getObjCInstanceTypeDecl();
8645 break;
8646
8648 if (Context.BuiltinVaListDecl)
8649 return Context.BuiltinVaListDecl;
8650 NewLoaded = Context.getBuiltinVaListDecl();
8651 break;
8652
8654 if (Context.VaListTagDecl)
8655 return Context.VaListTagDecl;
8656 NewLoaded = Context.getVaListTagDecl();
8657 break;
8658
8660 if (Context.BuiltinMSVaListDecl)
8661 return Context.BuiltinMSVaListDecl;
8662 NewLoaded = Context.getBuiltinMSVaListDecl();
8663 break;
8664
8666 if (Context.BuiltinZOSVaListDecl)
8667 return Context.BuiltinZOSVaListDecl;
8668 NewLoaded = Context.getBuiltinZOSVaListDecl();
8669 break;
8670
8672 // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8673 return Context.getMSGuidTagDecl();
8674
8676 if (Context.ExternCContext)
8677 return Context.ExternCContext;
8678 NewLoaded = Context.getExternCContextDecl();
8679 break;
8680
8682 if (Context.CFConstantStringTypeDecl)
8683 return Context.CFConstantStringTypeDecl;
8684 NewLoaded = Context.getCFConstantStringDecl();
8685 break;
8686
8688 if (Context.CFConstantStringTagDecl)
8689 return Context.CFConstantStringTagDecl;
8690 NewLoaded = Context.getCFConstantStringTagDecl();
8691 break;
8692
8694 return Context.getMSTypeInfoTagDecl();
8695
8696#define BuiltinTemplate(BTName) \
8697 case PREDEF_DECL##BTName##_ID: \
8698 if (Context.Decl##BTName) \
8699 return Context.Decl##BTName; \
8700 NewLoaded = Context.get##BTName##Decl(); \
8701 break;
8702#include "clang/Basic/BuiltinTemplates.inc"
8703
8705 llvm_unreachable("Invalid decl ID");
8706 break;
8707 }
8708
8709 assert(NewLoaded && "Failed to load predefined decl?");
8710
8711 if (DeserializationListener)
8712 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8713
8714 return NewLoaded;
8715}
8716
8717unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8718 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8719 if (!OwningModuleFile) {
8720 assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8721 return GlobalID.getRawValue();
8722 }
8723
8724 return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8725}
8726
8728 assert(ContextObj && "reading decl with no AST context");
8729
8730 if (ID < NUM_PREDEF_DECL_IDS) {
8731 Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8732 if (D) {
8733 // Track that we have merged the declaration with ID \p ID into the
8734 // pre-existing predefined declaration \p D.
8735 auto &Merged = KeyDecls[D->getCanonicalDecl()];
8736 if (Merged.empty())
8737 Merged.push_back(ID);
8738 }
8739 return D;
8740 }
8741
8742 unsigned Index = translateGlobalDeclIDToIndex(ID);
8743
8744 if (Index >= DeclsLoaded.size()) {
8745 assert(0 && "declaration ID out-of-range for AST file");
8746 Error("declaration ID out-of-range for AST file");
8747 return nullptr;
8748 }
8749
8750 return DeclsLoaded[Index];
8751}
8752
8754 if (ID < NUM_PREDEF_DECL_IDS)
8755 return GetExistingDecl(ID);
8756
8757 unsigned Index = translateGlobalDeclIDToIndex(ID);
8758
8759 if (Index >= DeclsLoaded.size()) {
8760 assert(0 && "declaration ID out-of-range for AST file");
8761 Error("declaration ID out-of-range for AST file");
8762 return nullptr;
8763 }
8764
8765 if (!DeclsLoaded[Index]) {
8766 ReadDeclRecord(ID);
8767 if (DeserializationListener)
8768 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8769 }
8770
8771 return DeclsLoaded[Index];
8772}
8773
8775 GlobalDeclID GlobalID) {
8776 if (GlobalID < NUM_PREDEF_DECL_IDS)
8777 return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8778
8779 if (!M.ModuleOffsetMap.empty())
8780 ReadModuleOffsetMap(M);
8781
8782 ModuleFile *Owner = getOwningModuleFile(GlobalID);
8783 DeclID ID = GlobalID.getLocalDeclIndex();
8784
8785 if (Owner == &M) {
8786 ID += NUM_PREDEF_DECL_IDS;
8787 return LocalDeclID::get(*this, M, ID);
8788 }
8789
8790 uint64_t OrignalModuleFileIndex = 0;
8791 for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8792 if (M.TransitiveImports[I] == Owner) {
8793 OrignalModuleFileIndex = I + 1;
8794 break;
8795 }
8796
8797 if (!OrignalModuleFileIndex)
8798 return LocalDeclID();
8799
8800 return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8801}
8802
8804 unsigned &Idx) {
8805 if (Idx >= Record.size()) {
8806 Error("Corrupted AST file");
8807 return GlobalDeclID(0);
8808 }
8809
8810 return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8811}
8812
8813/// Resolve the offset of a statement into a statement.
8814///
8815/// This operation will read a new statement from the external
8816/// source each time it is called, and is meant to be used via a
8817/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
8819 // Switch case IDs are per Decl.
8821
8822 // Offset here is a global offset across the entire chain.
8823 RecordLocation Loc = getLocalBitOffset(Offset);
8824 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8825 Error(std::move(Err));
8826 return nullptr;
8827 }
8828 assert(NumCurrentElementsDeserializing == 0 &&
8829 "should not be called while already deserializing");
8830 Deserializing D(this);
8831 return ReadStmtFromStream(*Loc.F);
8832}
8833
8834bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8835 const Decl *D) {
8836 assert(D);
8837
8838 auto It = SpecLookups.find(D);
8839 if (It == SpecLookups.end())
8840 return false;
8841
8842 // Get Decl may violate the iterator from SpecializationsLookups so we store
8843 // the DeclIDs in ahead.
8845 It->second.Table.findAll();
8846
8847 // Since we've loaded all the specializations, we can erase it from
8848 // the lookup table.
8849 SpecLookups.erase(It);
8850
8851 bool NewSpecsFound = false;
8852 Deserializing LookupResults(this);
8853 for (auto &Info : Infos) {
8854 if (GetExistingDecl(Info))
8855 continue;
8856 NewSpecsFound = true;
8857 GetDecl(Info);
8858 }
8859
8860 return NewSpecsFound;
8861}
8862
8864 assert(D);
8865
8867 bool NewSpecsFound =
8868 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8869 if (OnlyPartial)
8870 return NewSpecsFound;
8871
8872 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8873 return NewSpecsFound;
8874}
8875
8876bool ASTReader::LoadExternalSpecializationsImpl(
8877 SpecLookupTableTy &SpecLookups, const Decl *D,
8878 ArrayRef<TemplateArgument> TemplateArgs) {
8879 assert(D);
8880
8881 auto It = SpecLookups.find(D);
8882 if (It == SpecLookups.end())
8883 return false;
8884
8885 Deserializing LookupResults(this);
8886 auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8887
8889 It->second.Table.find(HashValue);
8890
8891 llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8892 std::string Name;
8893 llvm::raw_string_ostream OS(Name);
8894 auto *ND = cast<NamedDecl>(D);
8896 /*Qualified=*/true);
8897 return Name;
8898 });
8899
8900 bool NewSpecsFound = false;
8901 for (auto &Info : Infos) {
8902 if (GetExistingDecl(Info))
8903 continue;
8904 NewSpecsFound = true;
8905 GetDecl(Info);
8906 }
8907
8908 return NewSpecsFound;
8909}
8910
8912 const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8913 assert(D);
8914
8915 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8916 PartialSpecializationsLookups, D, TemplateArgs);
8917 NewDeclsFound |=
8918 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8919
8920 return NewDeclsFound;
8921}
8922
8924 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8925 SmallVectorImpl<Decl *> &Decls) {
8926 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8927
8928 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8929 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8930 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8931 auto K = (Decl::Kind)+LexicalDecls[I];
8932 if (!IsKindWeWant(K))
8933 continue;
8934
8935 auto ID = (DeclID) + LexicalDecls[I + 1];
8936
8937 // Don't add predefined declarations to the lexical context more
8938 // than once.
8939 if (ID < NUM_PREDEF_DECL_IDS) {
8940 if (PredefsVisited[ID])
8941 continue;
8942
8943 PredefsVisited[ID] = true;
8944 }
8945
8946 if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8947 assert(D->getKind() == K && "wrong kind for lexical decl");
8948 if (!DC->isDeclInLexicalTraversal(D))
8949 Decls.push_back(D);
8950 }
8951 }
8952 };
8953
8954 if (isa<TranslationUnitDecl>(DC)) {
8955 for (const auto &Lexical : TULexicalDecls)
8956 Visit(Lexical.first, Lexical.second);
8957 } else {
8958 auto I = LexicalDecls.find(DC);
8959 if (I != LexicalDecls.end())
8960 Visit(I->second.first, I->second.second);
8961 }
8962
8963 ++NumLexicalDeclContextsRead;
8964}
8965
8966namespace {
8967
8968class UnalignedDeclIDComp {
8969 ASTReader &Reader;
8970 ModuleFile &Mod;
8971
8972public:
8973 UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8974 : Reader(Reader), Mod(M) {}
8975
8976 bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8977 SourceLocation LHS = getLocation(L);
8978 SourceLocation RHS = getLocation(R);
8979 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8980 }
8981
8982 bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8983 SourceLocation RHS = getLocation(R);
8984 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8985 }
8986
8987 bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8988 SourceLocation LHS = getLocation(L);
8989 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8990 }
8991
8992 SourceLocation getLocation(unaligned_decl_id_t ID) const {
8993 return Reader.getSourceManager().getFileLoc(
8995 Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8996 }
8997};
8998
8999} // namespace
9000
9002 unsigned Offset, unsigned Length,
9003 SmallVectorImpl<Decl *> &Decls) {
9005
9006 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
9007 if (I == FileDeclIDs.end())
9008 return;
9009
9010 FileDeclsInfo &DInfo = I->second;
9011 if (DInfo.Decls.empty())
9012 return;
9013
9015 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
9016 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
9017
9018 UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
9020 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
9021 if (BeginIt != DInfo.Decls.begin())
9022 --BeginIt;
9023
9024 // If we are pointing at a top-level decl inside an objc container, we need
9025 // to backtrack until we find it otherwise we will fail to report that the
9026 // region overlaps with an objc container.
9027 while (BeginIt != DInfo.Decls.begin() &&
9028 GetDecl(getGlobalDeclID(*DInfo.Mod,
9029 LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
9030 ->isTopLevelDeclInObjCContainer())
9031 --BeginIt;
9032
9034 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
9035 if (EndIt != DInfo.Decls.end())
9036 ++EndIt;
9037
9038 for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
9039 ++DIt)
9040 Decls.push_back(GetDecl(getGlobalDeclID(
9041 *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
9042}
9043
9045 DeclarationName Name,
9046 const DeclContext *OriginalDC) {
9047 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
9048 "DeclContext has no visible decls in storage");
9049 if (!Name)
9050 return false;
9051
9052 // Load the list of declarations.
9053 DeclsSet DS;
9054
9055 auto Find = [&, this](auto &&Table, auto &&Key) {
9056 for (GlobalDeclID ID : Table.find(Key)) {
9058 if (ND->getDeclName() != Name)
9059 continue;
9060 // Special case for namespaces: There can be a lot of redeclarations of
9061 // some namespaces, and we import a "key declaration" per imported module.
9062 // Since all declarations of a namespace are essentially interchangeable,
9063 // we can optimize namespace look-up by only storing the key declaration
9064 // of the current TU, rather than storing N key declarations where N is
9065 // the # of imported modules that declare that namespace.
9066 // TODO: Try to generalize this optimization to other redeclarable decls.
9067 if (isa<NamespaceDecl>(ND))
9069 DS.insert(ND);
9070 }
9071 };
9072
9073 Deserializing LookupResults(this);
9074
9075 // FIXME: Clear the redundancy with templated lambda in C++20 when that's
9076 // available.
9077 if (auto It = Lookups.find(DC); It != Lookups.end()) {
9078 ++NumVisibleDeclContextsRead;
9079 Find(It->second.Table, Name);
9080 }
9081
9082 auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
9083 if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
9084 ++NumModuleLocalVisibleDeclContexts;
9085 Find(It->second.Table, std::make_pair(Name, NamedModule));
9086 }
9087 };
9088 if (auto *NamedModule =
9089 OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
9090 : nullptr)
9091 FindModuleLocalLookup(NamedModule);
9092 // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
9093 // We're going to find a decl but the decl context of the lookup is
9094 // unspecified. In this case, the OriginalDC may be the decl context in other
9095 // module.
9096 if (ContextObj && ContextObj->getCurrentNamedModule())
9097 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
9098
9099 if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
9100 ++NumTULocalVisibleDeclContexts;
9101 Find(It->second.Table, Name);
9102 }
9103
9104 SetExternalVisibleDeclsForName(DC, Name, DS);
9105 return !DS.empty();
9106}
9107
9109 if (!DC->hasExternalVisibleStorage())
9110 return;
9111
9112 DeclsMap Decls;
9113
9114 auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
9115 auto It = LookupTables.find(DC);
9116 if (It == LookupTables.end())
9117 return;
9118
9119 NumRead++;
9120
9121 for (GlobalDeclID ID : It->second.Table.findAll()) {
9123 // Special case for namespaces: There can be a lot of redeclarations of
9124 // some namespaces, and we import a "key declaration" per imported module.
9125 // Since all declarations of a namespace are essentially interchangeable,
9126 // we can optimize namespace look-up by only storing the key declaration
9127 // of the current TU, rather than storing N key declarations where N is
9128 // the # of imported modules that declare that namespace.
9129 // TODO: Try to generalize this optimization to other redeclarable decls.
9130 if (isa<NamespaceDecl>(ND))
9132 Decls[ND->getDeclName()].insert(ND);
9133 }
9134
9135 // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
9136 };
9137
9138 findAll(Lookups, NumVisibleDeclContextsRead);
9139 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9140 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9141
9142 for (auto &[Name, DS] : Decls)
9143 SetExternalVisibleDeclsForName(DC, Name, DS);
9144
9145 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
9146}
9147
9150 auto I = Lookups.find(Primary);
9151 return I == Lookups.end() ? nullptr : &I->second;
9152}
9153
9156 auto I = ModuleLocalLookups.find(Primary);
9157 return I == ModuleLocalLookups.end() ? nullptr : &I->second;
9158}
9159
9162 auto I = TULocalLookups.find(Primary);
9163 return I == TULocalLookups.end() ? nullptr : &I->second;
9164}
9165
9168 assert(D->isCanonicalDecl());
9169 auto &LookupTable =
9170 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9171 auto I = LookupTable.find(D);
9172 return I == LookupTable.end() ? nullptr : &I->second;
9173}
9174
9176 assert(D->isCanonicalDecl());
9177 return PartialSpecializationsLookups.contains(D) ||
9178 SpecializationsLookups.contains(D);
9179}
9180
9181/// Under non-PCH compilation the consumer receives the objc methods
9182/// before receiving the implementation, and codegen depends on this.
9183/// We simulate this by deserializing and passing to consumer the methods of the
9184/// implementation before passing the deserialized implementation decl.
9186 ASTConsumer *Consumer) {
9187 assert(ImplD && Consumer);
9188
9189 for (auto *I : ImplD->methods())
9190 Consumer->HandleInterestingDecl(DeclGroupRef(I));
9191
9192 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
9193}
9194
9195void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9196 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9197 PassObjCImplDeclToConsumer(ImplD, Consumer);
9198 else
9199 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9200}
9201
9202void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9203 Consumer->HandleVTable(RD);
9204}
9205
9207 this->Consumer = Consumer;
9208
9209 if (Consumer)
9210 PassInterestingDeclsToConsumer();
9211
9212 if (DeserializationListener)
9213 DeserializationListener->ReaderInitialized(this);
9214}
9215
9217 std::fprintf(stderr, "*** AST File Statistics:\n");
9218
9219 unsigned NumTypesLoaded =
9220 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
9221 unsigned NumDeclsLoaded =
9222 DeclsLoaded.size() -
9223 llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
9224 unsigned NumIdentifiersLoaded =
9225 IdentifiersLoaded.size() -
9226 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
9227 unsigned NumMacrosLoaded =
9228 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
9229 unsigned NumSelectorsLoaded =
9230 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
9231
9232 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
9233 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
9234 NumSLocEntriesRead, TotalNumSLocEntries,
9235 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9236 if (!TypesLoaded.empty())
9237 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
9238 NumTypesLoaded, (unsigned)TypesLoaded.size(),
9239 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
9240 if (!DeclsLoaded.empty())
9241 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
9242 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
9243 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9244 if (!IdentifiersLoaded.empty())
9245 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
9246 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
9247 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9248 if (!MacrosLoaded.empty())
9249 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9250 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
9251 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9252 if (!SelectorsLoaded.empty())
9253 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
9254 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
9255 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9256 if (TotalNumStatements)
9257 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
9258 NumStatementsRead, TotalNumStatements,
9259 ((float)NumStatementsRead/TotalNumStatements * 100));
9260 if (TotalNumMacros)
9261 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9262 NumMacrosRead, TotalNumMacros,
9263 ((float)NumMacrosRead/TotalNumMacros * 100));
9264 if (TotalLexicalDeclContexts)
9265 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
9266 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9267 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9268 * 100));
9269 if (TotalVisibleDeclContexts)
9270 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
9271 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9272 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9273 * 100));
9274 if (TotalModuleLocalVisibleDeclContexts)
9275 std::fprintf(
9276 stderr, " %u/%u module local visible declcontexts read (%f%%)\n",
9277 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9278 ((float)NumModuleLocalVisibleDeclContexts /
9279 TotalModuleLocalVisibleDeclContexts * 100));
9280 if (TotalTULocalVisibleDeclContexts)
9281 std::fprintf(stderr, " %u/%u visible declcontexts in GMF read (%f%%)\n",
9282 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9283 ((float)NumTULocalVisibleDeclContexts /
9284 TotalTULocalVisibleDeclContexts * 100));
9285 if (TotalNumMethodPoolEntries)
9286 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
9287 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9288 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9289 * 100));
9290 if (NumMethodPoolLookups)
9291 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
9292 NumMethodPoolHits, NumMethodPoolLookups,
9293 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9294 if (NumMethodPoolTableLookups)
9295 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
9296 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9297 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9298 * 100.0));
9299 if (NumIdentifierLookupHits)
9300 std::fprintf(stderr,
9301 " %u / %u identifier table lookups succeeded (%f%%)\n",
9302 NumIdentifierLookupHits, NumIdentifierLookups,
9303 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9304
9305 if (GlobalIndex) {
9306 std::fprintf(stderr, "\n");
9307 GlobalIndex->printStats();
9308 }
9309
9310 std::fprintf(stderr, "\n");
9311 dump();
9312 std::fprintf(stderr, "\n");
9313}
9314
9315template<typename Key, typename ModuleFile, unsigned InitialCapacity>
9316LLVM_DUMP_METHOD static void
9317dumpModuleIDMap(StringRef Name,
9318 const ContinuousRangeMap<Key, ModuleFile *,
9319 InitialCapacity> &Map) {
9320 if (Map.begin() == Map.end())
9321 return;
9322
9324
9325 llvm::errs() << Name << ":\n";
9326 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9327 I != IEnd; ++I)
9328 llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName
9329 << "\n";
9330}
9331
9332LLVM_DUMP_METHOD void ASTReader::dump() {
9333 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
9334 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
9335 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
9336 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
9337 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
9338 dumpModuleIDMap("Global preprocessed entity map",
9339 GlobalPreprocessedEntityMap);
9340
9341 llvm::errs() << "\n*** PCH/Modules Loaded:";
9342 for (ModuleFile &M : ModuleMgr)
9343 M.dump();
9344}
9345
9346/// Return the amount of memory used by memory buffers, breaking down
9347/// by heap-backed versus mmap'ed memory.
9349 for (ModuleFile &I : ModuleMgr) {
9350 if (llvm::MemoryBuffer *buf = I.Buffer) {
9351 size_t bytes = buf->getBufferSize();
9352 switch (buf->getBufferKind()) {
9353 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9354 sizes.malloc_bytes += bytes;
9355 break;
9356 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9357 sizes.mmap_bytes += bytes;
9358 break;
9359 }
9360 }
9361 }
9362}
9363
9365 SemaObj = &S;
9366 S.addExternalSource(this);
9367
9368 // Makes sure any declarations that were deserialized "too early"
9369 // still get added to the identifier's declaration chains.
9370 for (GlobalDeclID ID : PreloadedDeclIDs) {
9372 pushExternalDeclIntoScope(D, D->getDeclName());
9373 }
9374 PreloadedDeclIDs.clear();
9375
9376 // FIXME: What happens if these are changed by a module import?
9377 if (!FPPragmaOptions.empty()) {
9378 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
9379 FPOptionsOverride NewOverrides =
9380 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
9381 SemaObj->CurFPFeatures =
9382 NewOverrides.applyOverrides(SemaObj->getLangOpts());
9383 }
9384
9385 for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
9386 Decl *D = GetDecl(ID);
9387 if (auto *FD = dyn_cast<FunctionDecl>(D))
9388 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9389 else if (auto *BD = dyn_cast<BlockDecl>(D))
9390 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9391 else
9392 llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
9393 }
9394 DeclsWithEffectsToVerify.clear();
9395
9396 SemaObj->OpenCLFeatures = OpenCLExtensions;
9397
9398 UpdateSema();
9399}
9400
9402 assert(SemaObj && "no Sema to update");
9403
9404 // UpdateSema() runs after each AST file is loaded, not only the first, so a
9405 // 'requires' directive from a module is registered too.
9406 for (GlobalDeclID ID : OpenMPRequiresDecls)
9407 SemaObj->OpenMP().addRequiresDecl(cast<OMPRequiresDecl>(GetDecl(ID)));
9408 OpenMPRequiresDecls.clear();
9409
9410 // Load the offsets of the declarations that Sema references.
9411 // They will be lazily deserialized when needed.
9412 if (!SemaDeclRefs.empty()) {
9413 assert(SemaDeclRefs.size() % 3 == 0);
9414 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9415 if (!SemaObj->StdNamespace)
9416 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9417 if (!SemaObj->StdBadAlloc)
9418 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9419 if (!SemaObj->StdAlignValT)
9420 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9421 }
9422 SemaDeclRefs.clear();
9423 }
9424
9425 // Update the state of pragmas. Use the same API as if we had encountered the
9426 // pragma in the source.
9427 if(OptimizeOffPragmaLocation.isValid())
9428 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
9429 if (PragmaMSStructState != -1)
9430 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
9431 if (PointersToMembersPragmaLocation.isValid()) {
9432 SemaObj->ActOnPragmaMSPointersToMembers(
9434 PragmaMSPointersToMembersState,
9435 PointersToMembersPragmaLocation);
9436 }
9437 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9438 if (!RISCVVecIntrinsicPragma.empty()) {
9439 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9440 "Wrong number of RISCVVecIntrinsicPragma");
9441 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9442 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9443 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9444 }
9445
9446 if (PragmaAlignPackCurrentValue) {
9447 // The bottom of the stack might have a default value. It must be adjusted
9448 // to the current value to ensure that the packing state is preserved after
9449 // popping entries that were included/imported from a PCH/module.
9450 bool DropFirst = false;
9451 if (!PragmaAlignPackStack.empty() &&
9452 PragmaAlignPackStack.front().Location.isInvalid()) {
9453 assert(PragmaAlignPackStack.front().Value ==
9454 SemaObj->AlignPackStack.DefaultValue &&
9455 "Expected a default alignment value");
9456 SemaObj->AlignPackStack.Stack.emplace_back(
9457 PragmaAlignPackStack.front().SlotLabel,
9458 SemaObj->AlignPackStack.CurrentValue,
9459 SemaObj->AlignPackStack.CurrentPragmaLocation,
9460 PragmaAlignPackStack.front().PushLocation);
9461 DropFirst = true;
9462 }
9463 for (const auto &Entry :
9464 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9465 SemaObj->AlignPackStack.Stack.emplace_back(
9466 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9467 }
9468 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9469 assert(*PragmaAlignPackCurrentValue ==
9470 SemaObj->AlignPackStack.DefaultValue &&
9471 "Expected a default align and pack value");
9472 // Keep the current values.
9473 } else {
9474 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9475 SemaObj->AlignPackStack.CurrentPragmaLocation =
9476 PragmaAlignPackCurrentLocation;
9477 }
9478 }
9479 if (FpPragmaCurrentValue) {
9480 // The bottom of the stack might have a default value. It must be adjusted
9481 // to the current value to ensure that fp-pragma state is preserved after
9482 // popping entries that were included/imported from a PCH/module.
9483 bool DropFirst = false;
9484 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9485 assert(FpPragmaStack.front().Value ==
9486 SemaObj->FpPragmaStack.DefaultValue &&
9487 "Expected a default pragma float_control value");
9488 SemaObj->FpPragmaStack.Stack.emplace_back(
9489 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9490 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9491 FpPragmaStack.front().PushLocation);
9492 DropFirst = true;
9493 }
9494 for (const auto &Entry :
9495 llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
9496 SemaObj->FpPragmaStack.Stack.emplace_back(
9497 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9498 if (FpPragmaCurrentLocation.isInvalid()) {
9499 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9500 "Expected a default pragma float_control value");
9501 // Keep the current values.
9502 } else {
9503 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9504 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9505 }
9506 }
9507
9508 // For non-modular AST files, restore visiblity of modules.
9509 for (auto &Import : PendingImportedModulesSema) {
9510 if (Import.ImportLoc.isInvalid())
9511 continue;
9512 if (Module *Imported = getSubmodule(Import.ID)) {
9513 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9514 }
9515 }
9516 PendingImportedModulesSema.clear();
9517}
9518
9520 // Note that we are loading an identifier.
9521 Deserializing AnIdentifier(this);
9522
9523 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
9524 NumIdentifierLookups,
9525 NumIdentifierLookupHits);
9526
9527 // We don't need to do identifier table lookups in C++ modules (we preload
9528 // all interesting declarations, and don't need to use the scope for name
9529 // lookups). Perform the lookup in PCH files, though, since we don't build
9530 // a complete initial identifier table if we're carrying on from a PCH.
9531 if (PP.getLangOpts().CPlusPlus) {
9532 for (auto *F : ModuleMgr.pch_modules())
9533 if (Visitor(*F))
9534 break;
9535 } else {
9536 // If there is a global index, look there first to determine which modules
9537 // provably do not have any results for this identifier.
9539 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9540 if (!loadGlobalIndex()) {
9541 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9542 HitsPtr = &Hits;
9543 }
9544 }
9545
9546 ModuleMgr.visit(Visitor, HitsPtr);
9547 }
9548
9549 IdentifierInfo *II = Visitor.getIdentifierInfo();
9551 return II;
9552}
9553
9554namespace clang {
9555
9556 /// An identifier-lookup iterator that enumerates all of the
9557 /// identifiers stored within a set of AST files.
9559 /// The AST reader whose identifiers are being enumerated.
9560 const ASTReader &Reader;
9561
9562 /// The current index into the chain of AST files stored in
9563 /// the AST reader.
9564 unsigned Index;
9565
9566 /// The current position within the identifier lookup table
9567 /// of the current AST file.
9568 ASTIdentifierLookupTable::key_iterator Current;
9569
9570 /// The end position within the identifier lookup table of
9571 /// the current AST file.
9572 ASTIdentifierLookupTable::key_iterator End;
9573
9574 /// Whether to skip any modules in the ASTReader.
9575 bool SkipModules;
9576
9577 public:
9578 explicit ASTIdentifierIterator(const ASTReader &Reader,
9579 bool SkipModules = false);
9580
9581 StringRef Next() override;
9582 };
9583
9584} // namespace clang
9585
9587 bool SkipModules)
9588 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9589}
9590
9592 while (Current == End) {
9593 // If we have exhausted all of our AST files, we're done.
9594 if (Index == 0)
9595 return StringRef();
9596
9597 --Index;
9598 ModuleFile &F = Reader.ModuleMgr[Index];
9599 if (SkipModules && F.isModule())
9600 continue;
9601
9602 ASTIdentifierLookupTable *IdTable =
9604 Current = IdTable->key_begin();
9605 End = IdTable->key_end();
9606 }
9607
9608 // We have any identifiers remaining in the current AST file; return
9609 // the next one.
9610 StringRef Result = *Current;
9611 ++Current;
9612 return Result;
9613}
9614
9615namespace {
9616
9617/// A utility for appending two IdentifierIterators.
9618class ChainedIdentifierIterator : public IdentifierIterator {
9619 std::unique_ptr<IdentifierIterator> Current;
9620 std::unique_ptr<IdentifierIterator> Queued;
9621
9622public:
9623 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9624 std::unique_ptr<IdentifierIterator> Second)
9625 : Current(std::move(First)), Queued(std::move(Second)) {}
9626
9627 StringRef Next() override {
9628 if (!Current)
9629 return StringRef();
9630
9631 StringRef result = Current->Next();
9632 if (!result.empty())
9633 return result;
9634
9635 // Try the queued iterator, which may itself be empty.
9636 Current.reset();
9637 std::swap(Current, Queued);
9638 return Next();
9639 }
9640};
9641
9642} // namespace
9643
9645 if (!loadGlobalIndex()) {
9646 std::unique_ptr<IdentifierIterator> ReaderIter(
9647 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9648 std::unique_ptr<IdentifierIterator> ModulesIter(
9649 GlobalIndex->createIdentifierIterator());
9650 return new ChainedIdentifierIterator(std::move(ReaderIter),
9651 std::move(ModulesIter));
9652 }
9653
9654 return new ASTIdentifierIterator(*this);
9655}
9656
9657namespace clang {
9658namespace serialization {
9659
9661 ASTReader &Reader;
9662 Selector Sel;
9663 unsigned PriorGeneration;
9664 unsigned InstanceBits = 0;
9665 unsigned FactoryBits = 0;
9666 bool InstanceHasMoreThanOneDecl = false;
9667 bool FactoryHasMoreThanOneDecl = false;
9668 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9669 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9670
9671 public:
9673 unsigned PriorGeneration)
9674 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9675
9677 if (!M.SelectorLookupTable)
9678 return false;
9679
9680 // If we've already searched this module file, skip it now.
9681 if (M.Generation <= PriorGeneration)
9682 return true;
9683
9684 ++Reader.NumMethodPoolTableLookups;
9685 ASTSelectorLookupTable *PoolTable
9687 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9688 if (Pos == PoolTable->end())
9689 return false;
9690
9691 ++Reader.NumMethodPoolTableHits;
9692 ++Reader.NumSelectorsRead;
9693 // FIXME: Not quite happy with the statistics here. We probably should
9694 // disable this tracking when called via LoadSelector.
9695 // Also, should entries without methods count as misses?
9696 ++Reader.NumMethodPoolEntriesRead;
9698 if (Reader.DeserializationListener)
9699 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9700
9701 // Append methods in the reverse order, so that later we can process them
9702 // in the order they appear in the source code by iterating through
9703 // the vector in the reverse order.
9704 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9705 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9706 InstanceBits = Data.InstanceBits;
9707 FactoryBits = Data.FactoryBits;
9708 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9709 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9710 return false;
9711 }
9712
9713 /// Retrieve the instance methods found by this visitor.
9715 return InstanceMethods;
9716 }
9717
9718 /// Retrieve the instance methods found by this visitor.
9720 return FactoryMethods;
9721 }
9722
9723 unsigned getInstanceBits() const { return InstanceBits; }
9724 unsigned getFactoryBits() const { return FactoryBits; }
9725
9727 return InstanceHasMoreThanOneDecl;
9728 }
9729
9730 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9731 };
9732
9733} // namespace serialization
9734} // namespace clang
9735
9736/// Add the given set of methods to the method list.
9738 ObjCMethodList &List) {
9739 for (ObjCMethodDecl *M : llvm::reverse(Methods))
9740 S.ObjC().addMethodToGlobalList(&List, M);
9741}
9742
9744 // Get the selector generation and update it to the current generation.
9745 unsigned &Generation = SelectorGeneration[Sel];
9746 unsigned PriorGeneration = Generation;
9747 Generation = getGeneration();
9748 SelectorOutOfDate[Sel] = false;
9749
9750 // Search for methods defined with this selector.
9751 ++NumMethodPoolLookups;
9752 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9753 ModuleMgr.visit(Visitor);
9754
9755 if (Visitor.getInstanceMethods().empty() &&
9756 Visitor.getFactoryMethods().empty())
9757 return;
9758
9759 ++NumMethodPoolHits;
9760
9761 if (!getSema())
9762 return;
9763
9764 Sema &S = *getSema();
9765 auto &Methods = S.ObjC().MethodPool[Sel];
9766
9767 Methods.first.setBits(Visitor.getInstanceBits());
9768 Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9769 Methods.second.setBits(Visitor.getFactoryBits());
9770 Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9771
9772 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9773 // when building a module we keep every method individually and may need to
9774 // update hasMoreThanOneDecl as we add the methods.
9775 addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9776 addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9777}
9778
9780 if (SelectorOutOfDate[Sel])
9781 ReadMethodPool(Sel);
9782}
9783
9786 Namespaces.clear();
9787
9788 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9789 if (NamespaceDecl *Namespace
9790 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9791 Namespaces.push_back(Namespace);
9792 }
9793}
9794
9796 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9797 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9798 UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9801 Undefined.insert(std::make_pair(D, Loc));
9802 }
9803 UndefinedButUsed.clear();
9804}
9805
9807 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9808 Exprs) {
9809 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9810 FieldDecl *FD =
9811 cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9812 uint64_t Count = DelayedDeleteExprs[Idx++];
9813 for (uint64_t C = 0; C < Count; ++C) {
9814 SourceLocation DeleteLoc =
9815 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9816 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9817 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9818 }
9819 }
9820}
9821
9823 SmallVectorImpl<VarDecl *> &TentativeDefs) {
9824 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9825 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9826 if (Var)
9827 TentativeDefs.push_back(Var);
9828 }
9829 TentativeDefinitions.clear();
9830}
9831
9834 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9836 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9837 if (D)
9838 Decls.push_back(D);
9839 }
9840 UnusedFileScopedDecls.clear();
9841}
9842
9845 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9847 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9848 if (D)
9849 Decls.push_back(D);
9850 }
9851 DelegatingCtorDecls.clear();
9852}
9853
9855 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9857 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9858 if (D)
9859 Decls.push_back(D);
9860 }
9861 ExtVectorDecls.clear();
9862}
9863
9865 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9866 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9867 ++I) {
9868 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9869 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9870 if (D)
9871 Decls.insert(D);
9872 }
9873 UnusedLocalTypedefNameCandidates.clear();
9874}
9875
9878 for (auto I : DeclsToCheckForDeferredDiags) {
9879 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9880 if (D)
9881 Decls.insert(D);
9882 }
9883 DeclsToCheckForDeferredDiags.clear();
9884}
9885
9887 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9888 if (ReferencedSelectorsData.empty())
9889 return;
9890
9891 // If there are @selector references added them to its pool. This is for
9892 // implementation of -Wselector.
9893 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9894 unsigned I = 0;
9895 while (I < DataSize) {
9896 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9897 SourceLocation SelLoc
9898 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9899 Sels.push_back(std::make_pair(Sel, SelLoc));
9900 }
9901 ReferencedSelectorsData.clear();
9902}
9903
9905 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9906 if (WeakUndeclaredIdentifiers.empty())
9907 return;
9908
9909 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9910 IdentifierInfo *WeakId
9911 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9912 IdentifierInfo *AliasId
9913 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9914 SourceLocation Loc =
9915 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9916 WeakInfo WI(AliasId, Loc);
9917 WeakIDs.push_back(std::make_pair(WeakId, WI));
9918 }
9919 WeakUndeclaredIdentifiers.clear();
9920}
9921
9923 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9924 if (ExtnameUndeclaredIdentifiers.empty())
9925 return;
9926
9927 for (unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9928 IdentifierInfo *NameId =
9929 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I]);
9930 IdentifierInfo *ExtnameId =
9931 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I + 1]);
9932 SourceLocation Loc =
9933 SourceLocation::getFromRawEncoding(ExtnameUndeclaredIdentifiers[I + 2]);
9934 AsmLabelAttr *Attr = AsmLabelAttr::CreateImplicit(
9935 getContext(), ExtnameId->getName(),
9936 AttributeCommonInfo(ExtnameId, SourceRange(Loc),
9938 ExtnameIDs.push_back(std::make_pair(NameId, Attr));
9939 }
9940 ExtnameUndeclaredIdentifiers.clear();
9941}
9942
9944 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9946 VTableUse &TableInfo = VTableUses[Idx++];
9947 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9948 VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9949 VT.DefinitionRequired = TableInfo.Used;
9950 VTables.push_back(VT);
9951 }
9952
9953 VTableUses.clear();
9954}
9955
9957 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9958 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9959 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9960 ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9962
9963 Pending.push_back(std::make_pair(D, Loc));
9964 }
9965 PendingInstantiations.clear();
9966}
9967
9969 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9970 &LPTMap) {
9971 for (auto &LPT : LateParsedTemplates) {
9972 ModuleFile *FMod = LPT.first;
9973 RecordDataImpl &LateParsed = LPT.second;
9974 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9975 /* In loop */) {
9976 FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9977
9978 auto LT = std::make_unique<LateParsedTemplate>();
9979 LT->D = ReadDecl(*FMod, LateParsed, Idx);
9980 LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9981
9982 ModuleFile *F = getOwningModuleFile(LT->D);
9983 assert(F && "No module");
9984
9985 unsigned TokN = LateParsed[Idx++];
9986 LT->Toks.reserve(TokN);
9987 for (unsigned T = 0; T < TokN; ++T)
9988 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9989
9990 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9991 }
9992 }
9993
9994 LateParsedTemplates.clear();
9995}
9996
9998 // It would be complicated to avoid reading the methods anyway. So don't.
9999 ReadMethodPool(Sel);
10000}
10001
10003 assert(ID && "Non-zero identifier ID required");
10004 unsigned Index = translateIdentifierIDToIndex(ID).second;
10005 assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
10006 IdentifiersLoaded[Index] = II;
10007 if (DeserializationListener)
10008 DeserializationListener->IdentifierRead(ID, II);
10009}
10010
10011/// Set the globally-visible declarations associated with the given
10012/// identifier.
10013///
10014/// If the AST reader is currently in a state where the given declaration IDs
10015/// cannot safely be resolved, they are queued until it is safe to resolve
10016/// them.
10017///
10018/// \param II an IdentifierInfo that refers to one or more globally-visible
10019/// declarations.
10020///
10021/// \param DeclIDs the set of declaration IDs with the name @p II that are
10022/// visible at global scope.
10023///
10024/// \param Decls if non-null, this vector will be populated with the set of
10025/// deserialized declarations. These declarations will not be pushed into
10026/// scope.
10029 SmallVectorImpl<Decl *> *Decls) {
10030 if (NumCurrentElementsDeserializing && !Decls) {
10031 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
10032 return;
10033 }
10034
10035 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
10036 if (!SemaObj) {
10037 // Queue this declaration so that it will be added to the
10038 // translation unit scope and identifier's declaration chain
10039 // once a Sema object is known.
10040 PreloadedDeclIDs.push_back(DeclIDs[I]);
10041 continue;
10042 }
10043
10044 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
10045
10046 // If we're simply supposed to record the declarations, do so now.
10047 if (Decls) {
10048 Decls->push_back(D);
10049 continue;
10050 }
10051
10052 // Introduce this declaration into the translation-unit scope
10053 // and add it to the declaration chain for this identifier, so
10054 // that (unqualified) name lookup will find it.
10055 pushExternalDeclIntoScope(D, II);
10056 }
10057}
10058
10059std::pair<ModuleFile *, unsigned>
10060ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
10061 if (ID == 0)
10062 return {nullptr, 0};
10063
10064 unsigned ModuleFileIndex = ID >> 32;
10065 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
10066
10067 assert(ModuleFileIndex && "not translating loaded IdentifierID?");
10068 assert(getModuleManager().size() > ModuleFileIndex - 1);
10069
10070 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10071 assert(LocalID < MF.LocalNumIdentifiers);
10072 return {&MF, MF.BaseIdentifierID + LocalID};
10073}
10074
10076 if (ID == 0)
10077 return nullptr;
10078
10079 if (IdentifiersLoaded.empty()) {
10080 Error("no identifier table in AST file");
10081 return nullptr;
10082 }
10083
10084 auto [M, Index] = translateIdentifierIDToIndex(ID);
10085 if (!IdentifiersLoaded[Index]) {
10086 assert(M != nullptr && "Untranslated Identifier ID?");
10087 assert(Index >= M->BaseIdentifierID);
10088 unsigned LocalIndex = Index - M->BaseIdentifierID;
10089 const unsigned char *Data =
10090 M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
10091
10092 ASTIdentifierLookupTrait Trait(*this, *M);
10093 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
10094 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
10095 auto &II = PP.getIdentifierTable().get(Key);
10096 IdentifiersLoaded[Index] = &II;
10097 bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
10098 markIdentifierFromAST(*this, II, IsModule);
10099 if (DeserializationListener)
10100 DeserializationListener->IdentifierRead(ID, &II);
10101 }
10102
10103 return IdentifiersLoaded[Index];
10104}
10105
10109
10111 if (LocalID < NUM_PREDEF_IDENT_IDS)
10112 return LocalID;
10113
10114 if (!M.ModuleOffsetMap.empty())
10115 ReadModuleOffsetMap(M);
10116
10117 unsigned ModuleFileIndex = LocalID >> 32;
10118 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10119 ModuleFile *MF =
10120 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10121 assert(MF && "malformed identifier ID encoding?");
10122
10123 if (!ModuleFileIndex)
10124 LocalID -= NUM_PREDEF_IDENT_IDS;
10125
10126 return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
10127}
10128
10129std::pair<ModuleFile *, unsigned>
10130ASTReader::translateMacroIDToIndex(MacroID ID) const {
10131 if (ID == 0)
10132 return {nullptr, 0};
10133
10134 unsigned ModuleFileIndex = ID >> 32;
10135 assert(ModuleFileIndex && "not translating loaded MacroID?");
10136 assert(getModuleManager().size() > ModuleFileIndex - 1);
10137 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10138
10139 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10140 assert(LocalID < MF.LocalNumMacros);
10141 return {&MF, MF.BaseMacroID + LocalID};
10142}
10143
10145 if (ID == 0)
10146 return nullptr;
10147
10148 if (MacrosLoaded.empty()) {
10149 Error("no macro table in AST file");
10150 return nullptr;
10151 }
10152
10153 auto [M, Index] = translateMacroIDToIndex(ID);
10154 if (!MacrosLoaded[Index]) {
10155 assert(M != nullptr && "Untranslated Macro ID?");
10156 assert(Index >= M->BaseMacroID);
10157 unsigned LocalIndex = Index - M->BaseMacroID;
10158 uint64_t DataOffset = M->MacroOffsetsBase + M->MacroOffsets[LocalIndex];
10159 MacrosLoaded[Index] = ReadMacroRecord(*M, DataOffset);
10160
10161 if (DeserializationListener)
10162 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10163 }
10164
10165 return MacrosLoaded[Index];
10166}
10167
10169 if (LocalID < NUM_PREDEF_MACRO_IDS)
10170 return LocalID;
10171
10172 if (!M.ModuleOffsetMap.empty())
10173 ReadModuleOffsetMap(M);
10174
10175 unsigned ModuleFileIndex = LocalID >> 32;
10176 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10177 ModuleFile *MF =
10178 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10179 assert(MF && "malformed identifier ID encoding?");
10180
10181 if (!ModuleFileIndex) {
10182 assert(LocalID >= NUM_PREDEF_MACRO_IDS);
10183 LocalID -= NUM_PREDEF_MACRO_IDS;
10184 }
10185
10186 return (static_cast<MacroID>(MF->Index + 1) << 32) | LocalID;
10187}
10188
10190ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
10191 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
10192 return LocalID;
10193
10194 if (!M.ModuleOffsetMap.empty())
10195 ReadModuleOffsetMap(M);
10196
10199 assert(I != M.SubmoduleRemap.end()
10200 && "Invalid index into submodule index remap");
10201
10202 return LocalID + I->second;
10203}
10204
10206 return getSubmodule(ID);
10207}
10208
10210 if (ID & 1) {
10211 // It's a module, look it up by submodule ID.
10212 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
10213 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
10214 } else {
10215 // It's a prefix (preamble, PCH, ...). Look it up by index.
10216 int IndexFromEnd = static_cast<int>(ID >> 1);
10217 assert(IndexFromEnd && "got reference to unknown module file");
10218 return getModuleManager().pch_modules().end()[-IndexFromEnd];
10219 }
10220}
10221
10223 if (!M)
10224 return 1;
10225
10226 // For a file representing a module, use the submodule ID of the top-level
10227 // module as the file ID. For any other kind of file, the number of such
10228 // files loaded beforehand will be the same on reload.
10229 // FIXME: Is this true even if we have an explicit module file and a PCH?
10230 if (M->isModule())
10231 return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
10232
10233 auto PCHModules = getModuleManager().pch_modules();
10234 auto I = llvm::find(PCHModules, M);
10235 assert(I != PCHModules.end() && "emitting reference to unknown file");
10236 return std::distance(I, PCHModules.end()) << 1;
10237}
10238
10239std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
10240 if (Module *M = getSubmodule(ID))
10241 return ASTSourceDescriptor(*M);
10242
10243 // If there is only a single PCH, return it instead.
10244 // Chained PCH are not supported.
10245 const auto &PCHChain = ModuleMgr.pch_modules();
10246 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10247 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10248 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
10249 StringRef FileName = llvm::sys::path::filename(MF.FileName);
10250 return ASTSourceDescriptor(ModuleName,
10251 llvm::sys::path::parent_path(MF.FileName),
10252 FileName, MF.Signature);
10253 }
10254 return std::nullopt;
10255}
10256
10258 auto I = DefinitionSource.find(FD);
10259 if (I == DefinitionSource.end())
10260 return EK_ReplyHazy;
10261 return I->second ? EK_Never : EK_Always;
10262}
10263
10265 return ThisDeclarationWasADefinitionSet.contains(FD);
10266}
10267
10269 return DecodeSelector(getGlobalSelectorID(M, LocalID));
10270}
10271
10273 if (ID == 0)
10274 return Selector();
10275
10276 if (ID > SelectorsLoaded.size()) {
10277 Error("selector ID out of range in AST file");
10278 return Selector();
10279 }
10280
10281 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
10282 // Load this selector from the selector table.
10283 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
10284 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
10285 ModuleFile &M = *I->second;
10286 ASTSelectorLookupTrait Trait(*this, M);
10287 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
10288 SelectorsLoaded[ID - 1] =
10289 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
10290 if (DeserializationListener)
10291 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10292 }
10293
10294 return SelectorsLoaded[ID - 1];
10295}
10296
10300
10302 // ID 0 (the null selector) is considered an external selector.
10303 return getTotalNumSelectors() + 1;
10304}
10305
10307ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
10308 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
10309 return LocalID;
10310
10311 if (!M.ModuleOffsetMap.empty())
10312 ReadModuleOffsetMap(M);
10313
10316 assert(I != M.SelectorRemap.end()
10317 && "Invalid index into selector index remap");
10318
10319 return LocalID + I->second;
10320}
10321
10347
10349 DeclarationNameInfo NameInfo;
10350 NameInfo.setName(readDeclarationName());
10351 NameInfo.setLoc(readSourceLocation());
10352 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
10353 return NameInfo;
10354}
10355
10359
10361 auto Kind = readInt();
10362 auto ResultType = readQualType();
10363 auto Value = readAPInt();
10364 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
10365 assert(Op.isValid());
10366 return Op;
10367}
10368
10371 unsigned NumTPLists = readInt();
10372 Info.NumTemplParamLists = NumTPLists;
10373 if (NumTPLists) {
10374 Info.TemplParamLists =
10375 new (getContext()) TemplateParameterList *[NumTPLists];
10376 for (unsigned i = 0; i != NumTPLists; ++i)
10378 }
10379}
10380
10383 SourceLocation TemplateLoc = readSourceLocation();
10384 SourceLocation LAngleLoc = readSourceLocation();
10385 SourceLocation RAngleLoc = readSourceLocation();
10386
10387 unsigned NumParams = readInt();
10389 Params.reserve(NumParams);
10390 while (NumParams--)
10391 Params.push_back(readDeclAs<NamedDecl>());
10392
10393 bool HasRequiresClause = readBool();
10394 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
10395
10397 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10398 return TemplateParams;
10399}
10400
10403 bool Canonicalize) {
10404 unsigned NumTemplateArgs = readInt();
10405 TemplArgs.reserve(NumTemplateArgs);
10406 while (NumTemplateArgs--)
10407 TemplArgs.push_back(readTemplateArgument(Canonicalize));
10408}
10409
10410/// Read a UnresolvedSet structure.
10412 unsigned NumDecls = readInt();
10413 Set.reserve(getContext(), NumDecls);
10414 while (NumDecls--) {
10415 GlobalDeclID ID = readDeclID();
10417 Set.addLazyDecl(getContext(), ID, AS);
10418 }
10419}
10420
10423 bool isVirtual = readBool();
10424 bool isBaseOfClass = readBool();
10425 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
10426 bool inheritConstructors = readBool();
10428 SourceRange Range = readSourceRange();
10429 SourceLocation EllipsisLoc = readSourceLocation();
10430 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
10431 EllipsisLoc);
10432 Result.setInheritConstructors(inheritConstructors);
10433 return Result;
10434}
10435
10438 ASTContext &Context = getContext();
10439 unsigned NumInitializers = readInt();
10440 assert(NumInitializers && "wrote ctor initializers but have no inits");
10441 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
10442 for (unsigned i = 0; i != NumInitializers; ++i) {
10443 TypeSourceInfo *TInfo = nullptr;
10444 bool IsBaseVirtual = false;
10445 FieldDecl *Member = nullptr;
10446 IndirectFieldDecl *IndirectMember = nullptr;
10447
10449 switch (Type) {
10451 TInfo = readTypeSourceInfo();
10452 IsBaseVirtual = readBool();
10453 break;
10454
10456 TInfo = readTypeSourceInfo();
10457 break;
10458
10461 break;
10462
10464 IndirectMember = readDeclAs<IndirectFieldDecl>();
10465 break;
10466 }
10467
10468 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
10469 Expr *Init = readExpr();
10470 SourceLocation LParenLoc = readSourceLocation();
10471 SourceLocation RParenLoc = readSourceLocation();
10472
10473 CXXCtorInitializer *BOMInit;
10475 BOMInit = new (Context)
10476 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
10477 RParenLoc, MemberOrEllipsisLoc);
10479 BOMInit = new (Context)
10480 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
10481 else if (Member)
10482 BOMInit = new (Context)
10483 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
10484 Init, RParenLoc);
10485 else
10486 BOMInit = new (Context)
10487 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
10488 LParenLoc, Init, RParenLoc);
10489
10490 if (/*IsWritten*/readBool()) {
10491 unsigned SourceOrder = readInt();
10492 BOMInit->setSourceOrder(SourceOrder);
10493 }
10494
10495 CtorInitializers[i] = BOMInit;
10496 }
10497
10498 return CtorInitializers;
10499}
10500
10503 ASTContext &Context = getContext();
10504 unsigned N = readInt();
10506 for (unsigned I = 0; I != N; ++I) {
10507 auto Kind = readNestedNameSpecifierKind();
10508 switch (Kind) {
10510 auto *NS = readDeclAs<NamespaceBaseDecl>();
10511 SourceRange Range = readSourceRange();
10512 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10513 break;
10514 }
10515
10518 if (!T)
10519 return NestedNameSpecifierLoc();
10520 SourceLocation ColonColonLoc = readSourceLocation();
10521 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10522 break;
10523 }
10524
10526 SourceLocation ColonColonLoc = readSourceLocation();
10527 Builder.MakeGlobal(Context, ColonColonLoc);
10528 break;
10529 }
10530
10533 SourceRange Range = readSourceRange();
10534 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10535 break;
10536 }
10537
10539 llvm_unreachable("unexpected null nested name specifier");
10540 }
10541 }
10542
10543 return Builder.getWithLocInContext(Context);
10544}
10545
10547 unsigned &Idx) {
10550 return SourceRange(beg, end);
10551}
10552
10554 const StringRef Blob) {
10555 unsigned Count = Record[0];
10556 const char *Byte = Blob.data();
10557 llvm::BitVector Ret = llvm::BitVector(Count, false);
10558 for (unsigned I = 0; I < Count; ++Byte)
10559 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10560 if (*Byte & (1 << Bit))
10561 Ret[I] = true;
10562 return Ret;
10563}
10564
10565/// Read a floating-point value
10566llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10567 return llvm::APFloat(Sem, readAPInt());
10568}
10569
10570// Read a string
10571std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10572 unsigned Len = Record[Idx++];
10573 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10574 Idx += Len;
10575 return Result;
10576}
10577
10578StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10579 StringRef &Blob) {
10580 unsigned Len = Record[Idx++];
10581 StringRef Result = Blob.substr(0, Len);
10582 Blob = Blob.substr(Len);
10583 return Result;
10584}
10585
10587 unsigned &Idx) {
10588 return ReadPath(F.BaseDirectory, Record, Idx);
10589}
10590
10591std::string ASTReader::ReadPath(StringRef BaseDirectory,
10592 const RecordData &Record, unsigned &Idx) {
10593 std::string Filename = ReadString(Record, Idx);
10594 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10595}
10596
10597std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10598 const RecordData &Record, unsigned &Idx,
10599 StringRef &Blob) {
10600 StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10601 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10602}
10603
10605 unsigned &Idx) {
10606 unsigned Major = Record[Idx++];
10607 unsigned Minor = Record[Idx++];
10608 unsigned Subminor = Record[Idx++];
10609 if (Minor == 0)
10610 return VersionTuple(Major);
10611 if (Subminor == 0)
10612 return VersionTuple(Major, Minor - 1);
10613 return VersionTuple(Major, Minor - 1, Subminor - 1);
10614}
10615
10622
10623DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10624 return Diag(CurrentImportLoc, DiagID);
10625}
10626
10628 return Diags.Report(Loc, DiagID);
10629}
10630
10632 llvm::function_ref<void()> Fn) {
10633 // When Sema is available, avoid duplicate errors.
10634 if (SemaObj) {
10635 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10636 return;
10637 }
10638
10639 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10640}
10641
10642/// Retrieve the identifier table associated with the
10643/// preprocessor.
10645 return PP.getIdentifierTable();
10646}
10647
10648/// Record that the given ID maps to the given switch-case
10649/// statement.
10651 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10652 "Already have a SwitchCase with this ID");
10653 (*CurrSwitchCaseStmts)[ID] = SC;
10654}
10655
10656/// Retrieve the switch-case statement with the given ID.
10658 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10659 return (*CurrSwitchCaseStmts)[ID];
10660}
10661
10663 CurrSwitchCaseStmts->clear();
10664}
10665
10667 ASTContext &Context = getContext();
10668 std::vector<RawComment *> Comments;
10669 for (SmallVectorImpl<std::pair<BitstreamCursor,
10671 I = CommentsCursors.begin(),
10672 E = CommentsCursors.end();
10673 I != E; ++I) {
10674 Comments.clear();
10675 BitstreamCursor &Cursor = I->first;
10676 serialization::ModuleFile &F = *I->second;
10677 SavedStreamPosition SavedPosition(Cursor);
10678
10680 while (true) {
10682 Cursor.advanceSkippingSubblocks(
10683 BitstreamCursor::AF_DontPopBlockAtEnd);
10684 if (!MaybeEntry) {
10685 Error(MaybeEntry.takeError());
10686 return;
10687 }
10688 llvm::BitstreamEntry Entry = MaybeEntry.get();
10689
10690 switch (Entry.Kind) {
10691 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10692 case llvm::BitstreamEntry::Error:
10693 Error("malformed block record in AST file");
10694 return;
10695 case llvm::BitstreamEntry::EndBlock:
10696 goto NextCursor;
10697 case llvm::BitstreamEntry::Record:
10698 // The interesting case.
10699 break;
10700 }
10701
10702 // Read a record.
10703 Record.clear();
10704 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10705 if (!MaybeComment) {
10706 Error(MaybeComment.takeError());
10707 return;
10708 }
10709 switch ((CommentRecordTypes)MaybeComment.get()) {
10710 case COMMENTS_RAW_COMMENT: {
10711 unsigned Idx = 0;
10712 SourceRange SR = ReadSourceRange(F, Record, Idx);
10715 bool IsTrailingComment = Record[Idx++];
10716 bool IsAlmostTrailingComment = Record[Idx++];
10717 Comments.push_back(new (Context) RawComment(
10718 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10719 break;
10720 }
10721 }
10722 }
10723 NextCursor:
10724 for (RawComment *C : Comments) {
10725 SourceLocation CommentLoc = C->getBeginLoc();
10726 if (CommentLoc.isValid()) {
10727 FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10728 if (Loc.first.isValid())
10729 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10730 }
10731 }
10732 }
10733}
10734
10736 serialization::ModuleFile &MF, bool IncludeSystem,
10737 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10738 bool IsSystem)>
10739 Visitor) {
10740 unsigned NumUserInputs = MF.NumUserInputFiles;
10741 unsigned NumInputs = MF.InputFilesLoaded.size();
10742 assert(NumUserInputs <= NumInputs);
10743 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10744 for (unsigned I = 0; I < N; ++I) {
10745 bool IsSystem = I >= NumUserInputs;
10746 InputFileInfo IFI = getInputFileInfo(MF, I+1);
10747 Visitor(IFI, IsSystem);
10748 }
10749}
10750
10752 bool IncludeSystem, bool Complain,
10753 llvm::function_ref<void(const serialization::InputFile &IF,
10754 bool isSystem)> Visitor) {
10755 unsigned NumUserInputs = MF.NumUserInputFiles;
10756 unsigned NumInputs = MF.InputFilesLoaded.size();
10757 assert(NumUserInputs <= NumInputs);
10758 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10759 for (unsigned I = 0; I < N; ++I) {
10760 bool IsSystem = I >= NumUserInputs;
10761 InputFile IF = getInputFile(MF, I+1, Complain);
10762 Visitor(IF, IsSystem);
10763 }
10764}
10765
10768 llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10769 unsigned NumInputs = MF.InputFilesLoaded.size();
10770 for (unsigned I = 0; I < NumInputs; ++I) {
10771 InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10772 if (IFI.TopLevel && IFI.ModuleMap)
10773 if (auto FE = getInputFile(MF, I + 1).getFile())
10774 Visitor(*FE);
10775 }
10776}
10777
10778void ASTReader::finishPendingActions() {
10779 while (!PendingIdentifierInfos.empty() ||
10780 !PendingDeducedFunctionTypes.empty() ||
10781 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10782 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10783 !PendingUpdateRecords.empty() ||
10784 !PendingObjCExtensionIvarRedeclarations.empty()) {
10785 // If any identifiers with corresponding top-level declarations have
10786 // been loaded, load those declarations now.
10787 using TopLevelDeclsMap =
10788 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10789 TopLevelDeclsMap TopLevelDecls;
10790
10791 while (!PendingIdentifierInfos.empty()) {
10792 IdentifierInfo *II = PendingIdentifierInfos.back().first;
10794 std::move(PendingIdentifierInfos.back().second);
10795 PendingIdentifierInfos.pop_back();
10796
10797 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10798 }
10799
10800 // Load each function type that we deferred loading because it was a
10801 // deduced type that might refer to a local type declared within itself.
10802 for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10803 auto *FD = PendingDeducedFunctionTypes[I].first;
10804 FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10805
10806 if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10807 // If we gave a function a deduced return type, remember that we need to
10808 // propagate that along the redeclaration chain.
10809 if (DT->isDeduced()) {
10810 PendingDeducedTypeUpdates.insert(
10811 {FD->getCanonicalDecl(), FD->getReturnType()});
10812 continue;
10813 }
10814
10815 // The function has undeduced DeduceType return type. We hope we can
10816 // find the deduced type by iterating the redecls in other modules
10817 // later.
10818 PendingUndeducedFunctionDecls.push_back(FD);
10819 continue;
10820 }
10821 }
10822 PendingDeducedFunctionTypes.clear();
10823
10824 // Load each variable type that we deferred loading because it was a
10825 // deduced type that might refer to a local type declared within itself.
10826 for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10827 auto *VD = PendingDeducedVarTypes[I].first;
10828 VD->setType(GetType(PendingDeducedVarTypes[I].second));
10829 }
10830 PendingDeducedVarTypes.clear();
10831
10832 // Load pending declaration chains.
10833 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10834 loadPendingDeclChain(PendingDeclChains[I].first,
10835 PendingDeclChains[I].second);
10836 PendingDeclChains.clear();
10837
10838 // Make the most recent of the top-level declarations visible.
10839 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10840 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10841 IdentifierInfo *II = TLD->first;
10842 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10843 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10844 }
10845 }
10846
10847 // Load any pending macro definitions.
10848 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10849 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10850 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10851 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10852 // Initialize the macro history from chained-PCHs ahead of module imports.
10853 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10854 ++IDIdx) {
10855 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10856 if (!Info.M->isModule())
10857 resolvePendingMacro(II, Info);
10858 }
10859 // Handle module imports.
10860 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10861 ++IDIdx) {
10862 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10863 if (Info.M->isModule())
10864 resolvePendingMacro(II, Info);
10865 }
10866 }
10867 PendingMacroIDs.clear();
10868
10869 // Wire up the DeclContexts for Decls that we delayed setting until
10870 // recursive loading is completed.
10871 while (!PendingDeclContextInfos.empty()) {
10872 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10873 PendingDeclContextInfos.pop_front();
10874 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10875 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10876 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10877 }
10878
10879 // Perform any pending declaration updates.
10880 while (!PendingUpdateRecords.empty()) {
10881 auto Update = PendingUpdateRecords.pop_back_val();
10882 ReadingKindTracker ReadingKind(Read_Decl, *this);
10883 loadDeclUpdateRecords(Update);
10884 }
10885
10886 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10887 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10888 auto DuplicateIvars =
10889 PendingObjCExtensionIvarRedeclarations.back().second;
10891 StructuralEquivalenceContext Ctx(
10892 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10893 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10894 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10895 /*Complain =*/false,
10896 /*ErrorOnTagTypeMismatch =*/true);
10897 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10898 // Merge redeclared ivars with their predecessors.
10899 for (auto IvarPair : DuplicateIvars) {
10900 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10901 // Change semantic DeclContext but keep the lexical one.
10902 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10903 Ivar->getLexicalDeclContext(),
10904 getContext());
10905 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10906 }
10907 // Invalidate duplicate extension and the cached ivar list.
10908 ExtensionsPair.first->setInvalidDecl();
10909 ExtensionsPair.second->getClassInterface()
10910 ->getDefinition()
10911 ->setIvarList(nullptr);
10912 } else {
10913 for (auto IvarPair : DuplicateIvars) {
10914 Diag(IvarPair.first->getLocation(),
10915 diag::err_duplicate_ivar_declaration)
10916 << IvarPair.first->getIdentifier();
10917 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10918 }
10919 }
10920 PendingObjCExtensionIvarRedeclarations.pop_back();
10921 }
10922 }
10923
10924 // At this point, all update records for loaded decls are in place, so any
10925 // fake class definitions should have become real.
10926 assert(PendingFakeDefinitionData.empty() &&
10927 "faked up a class definition but never saw the real one");
10928
10929 // If we deserialized any C++ or Objective-C class definitions, any
10930 // Objective-C protocol definitions, or any redeclarable templates, make sure
10931 // that all redeclarations point to the definitions. Note that this can only
10932 // happen now, after the redeclaration chains have been fully wired.
10933 for (Decl *D : PendingDefinitions) {
10934 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10935 if (auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10936 for (auto *R = getMostRecentExistingDecl(RD); R;
10937 R = R->getPreviousDecl()) {
10938 assert((R == D) ==
10939 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10940 "declaration thinks it's the definition but it isn't");
10941 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10942 }
10943 }
10944
10945 continue;
10946 }
10947
10948 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10949 // Make sure that the ObjCInterfaceType points at the definition.
10950 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10951 ->Decl = ID;
10952
10953 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10954 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10955
10956 continue;
10957 }
10958
10959 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10960 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10961 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10962
10963 continue;
10964 }
10965
10966 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10967 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10968 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10969 }
10970 PendingDefinitions.clear();
10971
10972 for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10973 auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10974 if (auto *VD = dyn_cast<VarDecl>(D))
10975 return VD->isThisDeclarationADefinition() ||
10976 VD->isThisDeclarationADemotedDefinition();
10977
10978 if (auto *TD = dyn_cast<TagDecl>(D))
10979 return TD->isThisDeclarationADefinition() ||
10980 TD->isThisDeclarationADemotedDefinition();
10981
10982 if (auto *FD = dyn_cast<FunctionDecl>(D))
10983 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10984
10985 if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10986 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10987
10988 // Conservatively return false here.
10989 return false;
10990 };
10991
10992 auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10993 return hasDefinitionImpl(D, hasDefinitionImpl);
10994 };
10995
10996 // It is not good to prevent multiple declarations since the forward
10997 // declaration is common. Let's try to avoid duplicated definitions
10998 // only.
11000 continue;
11001
11002 Module *PM = Previous->getOwningModule();
11003 Module *DM = D->getOwningModule();
11004 Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
11006 << (DM ? DM->getTopLevelModuleName() : "global module");
11007 Diag(Previous->getLocation(), diag::note_also_found);
11008 }
11009 PendingWarningForDuplicatedDefsInModuleUnits.clear();
11010
11011 // Load the bodies of any functions or methods we've encountered. We do
11012 // this now (delayed) so that we can be sure that the declaration chains
11013 // have been fully wired up (hasBody relies on this).
11014 // FIXME: We shouldn't require complete redeclaration chains here.
11015 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
11016 PBEnd = PendingBodies.end();
11017 PB != PBEnd; ++PB) {
11018 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
11019 // FIXME: Check for =delete/=default?
11020 const FunctionDecl *Defn = nullptr;
11021 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
11022 FD->setLazyBody(PB->second);
11023 } else {
11024 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
11025 mergeDefinitionVisibility(NonConstDefn, FD);
11026
11027 if (!FD->isLateTemplateParsed() &&
11028 !NonConstDefn->isLateTemplateParsed() &&
11029 // We only perform ODR checks for decls not in the explicit
11030 // global module fragment.
11031 !shouldSkipCheckingODR(FD) &&
11032 !shouldSkipCheckingODR(NonConstDefn) &&
11033 FD->getODRHash() != NonConstDefn->getODRHash()) {
11034 if (!isa<CXXMethodDecl>(FD)) {
11035 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11036 } else if (FD->getLexicalParent()->isFileContext() &&
11037 NonConstDefn->getLexicalParent()->isFileContext()) {
11038 // Only diagnose out-of-line method definitions. If they are
11039 // in class definitions, then an error will be generated when
11040 // processing the class bodies.
11041 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11042 }
11043 }
11044 }
11045 continue;
11046 }
11047
11048 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
11049 if (!getContext().getLangOpts().Modules || !MD->hasBody())
11050 MD->setLazyBody(PB->second);
11051 }
11052 PendingBodies.clear();
11053
11054 // Inform any classes that had members added that they now have more members.
11055 for (auto [RD, MD] : PendingAddedClassMembers) {
11056 // The module we just imported added MD to RD so we should do the same, but
11057 // only RD doesn't already contain the same member. This can happen when two
11058 // modules independent add and serialize the same implicit member.
11059
11060 // Fast path: we can check for the presence of implicit special members
11061 // (default/copy/move constructors + copy/move assignments + destructors)
11062 // with RD's needsImplicit*() methods (which are constant time).
11063 if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD)) {
11064 if (!Ctor->isInheritingConstructor()) {
11065 if (Ctor->isDefaultConstructor()) {
11067 RD->addHiddenDecl(MD);
11068 continue;
11069 }
11070 if (Ctor->isCopyConstructor()) {
11072 RD->addHiddenDecl(MD);
11073 continue;
11074 }
11075 if (Ctor->isMoveConstructor()) {
11077 RD->addHiddenDecl(MD);
11078 continue;
11079 }
11080 }
11081 } else if (const auto *Mthd = dyn_cast<CXXMethodDecl>(MD)) {
11082 if (isa<CXXDestructorDecl>(Mthd)) {
11083 if (RD->needsImplicitDestructor())
11084 RD->addHiddenDecl(MD);
11085 continue;
11086 }
11087 if (Mthd->isCopyAssignmentOperator()) {
11089 RD->addHiddenDecl(MD);
11090 continue;
11091 }
11092 if (Mthd->isMoveAssignmentOperator()) {
11094 RD->addHiddenDecl(MD);
11095 continue;
11096 }
11097 }
11098
11099 if (auto *FD = dyn_cast<FunctionDecl>(MD)) {
11100 // Slow path: this is some other implicit added member (e.g., inherited
11101 // constructor). We need iterate through all of RD's members and compare
11102 // their ODR hash against MD's.
11103 auto needToAddMD = true;
11104 for (auto *RDD : RD->noload_decls()) {
11105 if (auto *RDFD = dyn_cast<FunctionDecl>(RDD)) {
11106 if (FD->getODRHash() == RDFD->getODRHash()) {
11107 needToAddMD = false;
11108 break;
11109 }
11110 }
11111 }
11112 if (needToAddMD)
11113 RD->addHiddenDecl(MD);
11114 continue;
11115 }
11116
11117 // This branch is only reachable if MD is not a function decl (which means
11118 // it doesn't have an ODR hash to compare). Call addedMember() to preserve
11119 // historical behavior.
11120 RD->addedMember(MD);
11121 }
11122 PendingAddedClassMembers.clear();
11123
11124 // Do some cleanup.
11125 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
11127 PendingMergedDefinitionsToDeduplicate.clear();
11128
11129 // For each decl chain that we wanted to complete while deserializing, mark
11130 // it as "still needs to be completed".
11131 for (Decl *D : PendingIncompleteDeclChains)
11132 markIncompleteDeclChain(D);
11133 PendingIncompleteDeclChains.clear();
11134
11135 assert(PendingIdentifierInfos.empty() &&
11136 "Should be empty at the end of finishPendingActions");
11137 assert(PendingDeducedFunctionTypes.empty() &&
11138 "Should be empty at the end of finishPendingActions");
11139 assert(PendingDeducedVarTypes.empty() &&
11140 "Should be empty at the end of finishPendingActions");
11141 assert(PendingDeclChains.empty() &&
11142 "Should be empty at the end of finishPendingActions");
11143 assert(PendingMacroIDs.empty() &&
11144 "Should be empty at the end of finishPendingActions");
11145 assert(PendingDeclContextInfos.empty() &&
11146 "Should be empty at the end of finishPendingActions");
11147 assert(PendingUpdateRecords.empty() &&
11148 "Should be empty at the end of finishPendingActions");
11149 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
11150 "Should be empty at the end of finishPendingActions");
11151 assert(PendingFakeDefinitionData.empty() &&
11152 "Should be empty at the end of finishPendingActions");
11153 assert(PendingDefinitions.empty() &&
11154 "Should be empty at the end of finishPendingActions");
11155 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
11156 "Should be empty at the end of finishPendingActions");
11157 assert(PendingBodies.empty() &&
11158 "Should be empty at the end of finishPendingActions");
11159 assert(PendingAddedClassMembers.empty() &&
11160 "Should be empty at the end of finishPendingActions");
11161 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
11162 "Should be empty at the end of finishPendingActions");
11163 assert(PendingIncompleteDeclChains.empty() &&
11164 "Should be empty at the end of finishPendingActions");
11165}
11166
11167void ASTReader::diagnoseOdrViolations() {
11168 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
11169 PendingRecordOdrMergeFailures.empty() &&
11170 PendingFunctionOdrMergeFailures.empty() &&
11171 PendingEnumOdrMergeFailures.empty() &&
11172 PendingObjCInterfaceOdrMergeFailures.empty() &&
11173 PendingObjCProtocolOdrMergeFailures.empty())
11174 return;
11175
11176 // Trigger the import of the full definition of each class that had any
11177 // odr-merging problems, so we can produce better diagnostics for them.
11178 // These updates may in turn find and diagnose some ODR failures, so take
11179 // ownership of the set first.
11180 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11181 PendingOdrMergeFailures.clear();
11182 for (auto &Merge : OdrMergeFailures) {
11183 Merge.first->buildLookup();
11184 Merge.first->decls_begin();
11185 Merge.first->bases_begin();
11186 Merge.first->vbases_begin();
11187 for (auto &RecordPair : Merge.second) {
11188 auto *RD = RecordPair.first;
11189 RD->decls_begin();
11190 RD->bases_begin();
11191 RD->vbases_begin();
11192 }
11193 }
11194
11195 // Trigger the import of the full definition of each record in C/ObjC.
11196 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11197 PendingRecordOdrMergeFailures.clear();
11198 for (auto &Merge : RecordOdrMergeFailures) {
11199 Merge.first->decls_begin();
11200 for (auto &D : Merge.second)
11201 D->decls_begin();
11202 }
11203
11204 // Trigger the import of the full interface definition.
11205 auto ObjCInterfaceOdrMergeFailures =
11206 std::move(PendingObjCInterfaceOdrMergeFailures);
11207 PendingObjCInterfaceOdrMergeFailures.clear();
11208 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11209 Merge.first->decls_begin();
11210 for (auto &InterfacePair : Merge.second)
11211 InterfacePair.first->decls_begin();
11212 }
11213
11214 // Trigger the import of functions.
11215 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11216 PendingFunctionOdrMergeFailures.clear();
11217 for (auto &Merge : FunctionOdrMergeFailures) {
11218 Merge.first->buildLookup();
11219 Merge.first->decls_begin();
11220 Merge.first->getBody();
11221 for (auto &FD : Merge.second) {
11222 FD->buildLookup();
11223 FD->decls_begin();
11224 FD->getBody();
11225 }
11226 }
11227
11228 // Trigger the import of enums.
11229 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11230 PendingEnumOdrMergeFailures.clear();
11231 for (auto &Merge : EnumOdrMergeFailures) {
11232 Merge.first->decls_begin();
11233 for (auto &Enum : Merge.second) {
11234 Enum->decls_begin();
11235 }
11236 }
11237
11238 // Trigger the import of the full protocol definition.
11239 auto ObjCProtocolOdrMergeFailures =
11240 std::move(PendingObjCProtocolOdrMergeFailures);
11241 PendingObjCProtocolOdrMergeFailures.clear();
11242 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11243 Merge.first->decls_begin();
11244 for (auto &ProtocolPair : Merge.second)
11245 ProtocolPair.first->decls_begin();
11246 }
11247
11248 // For each declaration from a merged context, check that the canonical
11249 // definition of that context also contains a declaration of the same
11250 // entity.
11251 //
11252 // Caution: this loop does things that might invalidate iterators into
11253 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
11254 while (!PendingOdrMergeChecks.empty()) {
11255 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11256
11257 // FIXME: Skip over implicit declarations for now. This matters for things
11258 // like implicitly-declared special member functions. This isn't entirely
11259 // correct; we can end up with multiple unmerged declarations of the same
11260 // implicit entity.
11261 if (D->isImplicit())
11262 continue;
11263
11264 DeclContext *CanonDef = D->getDeclContext();
11265
11266 bool Found = false;
11267 const Decl *DCanon = D->getCanonicalDecl();
11268
11269 for (auto *RI : D->redecls()) {
11270 if (RI->getLexicalDeclContext() == CanonDef) {
11271 Found = true;
11272 break;
11273 }
11274 }
11275 if (Found)
11276 continue;
11277
11278 // Quick check failed, time to do the slow thing. Note, we can't just
11279 // look up the name of D in CanonDef here, because the member that is
11280 // in CanonDef might not be found by name lookup (it might have been
11281 // replaced by a more recent declaration in the lookup table), and we
11282 // can't necessarily find it in the redeclaration chain because it might
11283 // be merely mergeable, not redeclarable.
11284 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11285 for (auto *CanonMember : CanonDef->decls()) {
11286 if (CanonMember->getCanonicalDecl() == DCanon) {
11287 // This can happen if the declaration is merely mergeable and not
11288 // actually redeclarable (we looked for redeclarations earlier).
11289 //
11290 // FIXME: We should be able to detect this more efficiently, without
11291 // pulling in all of the members of CanonDef.
11292 Found = true;
11293 break;
11294 }
11295 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
11296 if (ND->getDeclName() == D->getDeclName())
11297 Candidates.push_back(ND);
11298 }
11299
11300 if (!Found) {
11301 // The AST doesn't like TagDecls becoming invalid after they've been
11302 // completed. We only really need to mark FieldDecls as invalid here.
11303 if (!isa<TagDecl>(D))
11304 D->setInvalidDecl();
11305
11306 // Ensure we don't accidentally recursively enter deserialization while
11307 // we're producing our diagnostic.
11308 Deserializing RecursionGuard(this);
11309
11310 std::string CanonDefModule =
11312 cast<Decl>(CanonDef));
11313 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
11315 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11316
11317 if (Candidates.empty())
11318 Diag(cast<Decl>(CanonDef)->getLocation(),
11319 diag::note_module_odr_violation_no_possible_decls) << D;
11320 else {
11321 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
11322 Diag(Candidates[I]->getLocation(),
11323 diag::note_module_odr_violation_possible_decl)
11324 << Candidates[I];
11325 }
11326
11327 DiagnosedOdrMergeFailures.insert(CanonDef);
11328 }
11329 }
11330
11331 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11332 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11333 ObjCInterfaceOdrMergeFailures.empty() &&
11334 ObjCProtocolOdrMergeFailures.empty())
11335 return;
11336
11337 ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
11338 getPreprocessor().getLangOpts());
11339
11340 // Issue any pending ODR-failure diagnostics.
11341 for (auto &Merge : OdrMergeFailures) {
11342 // If we've already pointed out a specific problem with this class, don't
11343 // bother issuing a general "something's different" diagnostic.
11344 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11345 continue;
11346
11347 bool Diagnosed = false;
11348 CXXRecordDecl *FirstRecord = Merge.first;
11349 for (auto &RecordPair : Merge.second) {
11350 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11351 RecordPair.second)) {
11352 Diagnosed = true;
11353 break;
11354 }
11355 }
11356
11357 if (!Diagnosed) {
11358 // All definitions are updates to the same declaration. This happens if a
11359 // module instantiates the declaration of a class template specialization
11360 // and two or more other modules instantiate its definition.
11361 //
11362 // FIXME: Indicate which modules had instantiations of this definition.
11363 // FIXME: How can this even happen?
11364 Diag(Merge.first->getLocation(),
11365 diag::err_module_odr_violation_different_instantiations)
11366 << Merge.first;
11367 }
11368 }
11369
11370 // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
11371 // that in C++ this is done as a part of CXXRecordDecl ODR checking.
11372 for (auto &Merge : RecordOdrMergeFailures) {
11373 // If we've already pointed out a specific problem with this class, don't
11374 // bother issuing a general "something's different" diagnostic.
11375 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11376 continue;
11377
11378 RecordDecl *FirstRecord = Merge.first;
11379 bool Diagnosed = false;
11380 for (auto *SecondRecord : Merge.second) {
11381 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11382 Diagnosed = true;
11383 break;
11384 }
11385 }
11386 (void)Diagnosed;
11387 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11388 }
11389
11390 // Issue ODR failures diagnostics for functions.
11391 for (auto &Merge : FunctionOdrMergeFailures) {
11392 FunctionDecl *FirstFunction = Merge.first;
11393 bool Diagnosed = false;
11394 for (auto &SecondFunction : Merge.second) {
11395 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11396 Diagnosed = true;
11397 break;
11398 }
11399 }
11400 (void)Diagnosed;
11401 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11402 }
11403
11404 // Issue ODR failures diagnostics for enums.
11405 for (auto &Merge : EnumOdrMergeFailures) {
11406 // If we've already pointed out a specific problem with this enum, don't
11407 // bother issuing a general "something's different" diagnostic.
11408 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11409 continue;
11410
11411 EnumDecl *FirstEnum = Merge.first;
11412 bool Diagnosed = false;
11413 for (auto &SecondEnum : Merge.second) {
11414 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11415 Diagnosed = true;
11416 break;
11417 }
11418 }
11419 (void)Diagnosed;
11420 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11421 }
11422
11423 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11424 // If we've already pointed out a specific problem with this interface,
11425 // don't bother issuing a general "something's different" diagnostic.
11426 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11427 continue;
11428
11429 bool Diagnosed = false;
11430 ObjCInterfaceDecl *FirstID = Merge.first;
11431 for (auto &InterfacePair : Merge.second) {
11432 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11433 InterfacePair.second)) {
11434 Diagnosed = true;
11435 break;
11436 }
11437 }
11438 (void)Diagnosed;
11439 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11440 }
11441
11442 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11443 // If we've already pointed out a specific problem with this protocol,
11444 // don't bother issuing a general "something's different" diagnostic.
11445 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11446 continue;
11447
11448 ObjCProtocolDecl *FirstProtocol = Merge.first;
11449 bool Diagnosed = false;
11450 for (auto &ProtocolPair : Merge.second) {
11451 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11452 ProtocolPair.second)) {
11453 Diagnosed = true;
11454 break;
11455 }
11456 }
11457 (void)Diagnosed;
11458 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11459 }
11460}
11461
11463 if (llvm::Timer *T = ReadTimer.get();
11464 ++NumCurrentElementsDeserializing == 1 && T)
11465 ReadTimeRegion.emplace(T);
11466}
11467
11469 assert(NumCurrentElementsDeserializing &&
11470 "FinishedDeserializing not paired with StartedDeserializing");
11471 if (NumCurrentElementsDeserializing == 1) {
11472 // We decrease NumCurrentElementsDeserializing only after pending actions
11473 // are finished, to avoid recursively re-calling finishPendingActions().
11474 finishPendingActions();
11475 }
11476 --NumCurrentElementsDeserializing;
11477
11478 if (NumCurrentElementsDeserializing == 0) {
11479 {
11480 // Guard variable to avoid recursively entering the process of passing
11481 // decls to consumer.
11482 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11483 /*NewValue=*/false);
11484
11485 // Propagate exception specification and deduced type updates along
11486 // redeclaration chains.
11487 //
11488 // We do this now rather than in finishPendingActions because we want to
11489 // be able to walk the complete redeclaration chains of the updated decls.
11490 while (!PendingExceptionSpecUpdates.empty() ||
11491 !PendingDeducedTypeUpdates.empty() ||
11492 !PendingUndeducedFunctionDecls.empty()) {
11493 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11494 PendingExceptionSpecUpdates.clear();
11495 for (auto Update : ESUpdates) {
11496 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11497 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11498 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11499 if (auto *Listener = getContext().getASTMutationListener())
11500 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11501 for (auto *Redecl : Update.second->redecls())
11503 }
11504
11505 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11506 PendingDeducedTypeUpdates.clear();
11507 for (auto Update : DTUpdates) {
11508 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11509 // FIXME: If the return type is already deduced, check that it
11510 // matches.
11512 Update.second);
11513 }
11514
11515 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11516 PendingUndeducedFunctionDecls.clear();
11517 // We hope we can find the deduced type for the functions by iterating
11518 // redeclarations in other modules.
11519 for (FunctionDecl *UndeducedFD : UDTUpdates)
11520 (void)UndeducedFD->getMostRecentDecl();
11521 }
11522
11523 ReadTimeRegion.reset();
11524
11525 diagnoseOdrViolations();
11526 }
11527
11528 // We are not in recursive loading, so it's safe to pass the "interesting"
11529 // decls to the consumer.
11530 if (Consumer)
11531 PassInterestingDeclsToConsumer();
11532 }
11533}
11534
11535void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11536 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11537 // Remove any fake results before adding any real ones.
11538 auto It = PendingFakeLookupResults.find(II);
11539 if (It != PendingFakeLookupResults.end()) {
11540 for (auto *ND : It->second)
11541 SemaObj->IdResolver.RemoveDecl(ND);
11542 // FIXME: this works around module+PCH performance issue.
11543 // Rather than erase the result from the map, which is O(n), just clear
11544 // the vector of NamedDecls.
11545 It->second.clear();
11546 }
11547 }
11548
11549 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11550 SemaObj->TUScope->AddDecl(D);
11551 } else if (SemaObj->TUScope) {
11552 // Adding the decl to IdResolver may have failed because it was already in
11553 // (even though it was not added in scope). If it is already in, make sure
11554 // it gets in the scope as well.
11555 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11556 SemaObj->TUScope->AddDecl(D);
11557 }
11558}
11559
11561 ASTContext *Context,
11562 const PCHContainerReader &PCHContainerRdr,
11563 const CodeGenOptions &CodeGenOpts,
11564 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11565 StringRef isysroot,
11566 DisableValidationForModuleKind DisableValidationKind,
11567 bool AllowASTWithCompilerErrors,
11568 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11569 bool ForceValidateUserInputs,
11570 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11571 std::unique_ptr<llvm::Timer> ReadTimer)
11572 : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11574 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11575 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11576 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11577 StackHandler(Diags), PP(PP), ContextObj(Context),
11578 CodeGenOpts(CodeGenOpts),
11579 ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11580 PP.getHeaderSearchInfo()),
11581 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11582 DisableValidationKind(DisableValidationKind),
11583 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11584 AllowConfigurationMismatch(AllowConfigurationMismatch),
11585 ValidateSystemInputs(ValidateSystemInputs),
11586 ForceValidateUserInputs(ForceValidateUserInputs),
11587 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11588 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11589 SourceMgr.setExternalSLocEntrySource(this);
11590
11591 PathBuf.reserve(256);
11592
11593 for (const auto &Ext : Extensions) {
11594 auto BlockName = Ext->getExtensionMetadata().BlockName;
11595 auto Known = ModuleFileExtensions.find(BlockName);
11596 if (Known != ModuleFileExtensions.end()) {
11597 Diags.Report(diag::warn_duplicate_module_file_extension)
11598 << BlockName;
11599 continue;
11600 }
11601
11602 ModuleFileExtensions.insert({BlockName, Ext});
11603 }
11604}
11605
11607 if (OwnsDeserializationListener)
11608 delete DeserializationListener;
11609}
11610
11612 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11613}
11614
11616 unsigned AbbrevID) {
11617 Idx = 0;
11618 Record.clear();
11619 return Cursor.readRecord(AbbrevID, Record);
11620}
11621//===----------------------------------------------------------------------===//
11622//// OMPClauseReader implementation
11623////===----------------------------------------------------------------------===//
11624
11625// This has to be in namespace clang because it's friended by all
11626// of the OMP clauses.
11627namespace clang {
11628
11629class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11630 ASTRecordReader &Record;
11631 ASTContext &Context;
11632
11633public:
11635 : Record(Record), Context(Record.getContext()) {}
11636#define GEN_CLANG_CLAUSE_CLASS
11637#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11638#include "llvm/Frontend/OpenMP/OMP.inc"
11642};
11643
11644} // end namespace clang
11645
11649
11651 OMPClause *C = nullptr;
11652 switch (llvm::omp::Clause(Record.readInt())) {
11653 case llvm::omp::OMPC_if:
11654 C = new (Context) OMPIfClause();
11655 break;
11656 case llvm::omp::OMPC_final:
11657 C = new (Context) OMPFinalClause();
11658 break;
11659 case llvm::omp::OMPC_num_threads:
11660 C = OMPNumThreadsClause::CreateEmpty(Context, Record.readInt());
11661 break;
11662 case llvm::omp::OMPC_safelen:
11663 C = new (Context) OMPSafelenClause();
11664 break;
11665 case llvm::omp::OMPC_simdlen:
11666 C = new (Context) OMPSimdlenClause();
11667 break;
11668 case llvm::omp::OMPC_sizes: {
11669 unsigned NumSizes = Record.readInt();
11670 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11671 break;
11672 }
11673 case llvm::omp::OMPC_counts: {
11674 unsigned NumCounts = Record.readInt();
11675 C = OMPCountsClause::CreateEmpty(Context, NumCounts);
11676 break;
11677 }
11678 case llvm::omp::OMPC_permutation: {
11679 unsigned NumLoops = Record.readInt();
11680 C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11681 break;
11682 }
11683 case llvm::omp::OMPC_full:
11684 C = new (Context) OMPFullClause();
11685 break;
11686 case llvm::omp::OMPC_partial:
11687 C = new (Context) OMPPartialClause();
11688 break;
11689 case llvm::omp::OMPC_depth:
11690 C = new (Context) OMPDepthClause();
11691 break;
11692 case llvm::omp::OMPC_looprange:
11693 C = new (Context) OMPLoopRangeClause();
11694 break;
11695 case llvm::omp::OMPC_allocator:
11696 C = new (Context) OMPAllocatorClause();
11697 break;
11698 case llvm::omp::OMPC_collapse:
11699 C = new (Context) OMPCollapseClause();
11700 break;
11701 case llvm::omp::OMPC_default:
11702 C = new (Context) OMPDefaultClause();
11703 break;
11704 case llvm::omp::OMPC_proc_bind:
11705 C = new (Context) OMPProcBindClause();
11706 break;
11707 case llvm::omp::OMPC_schedule:
11708 C = new (Context) OMPScheduleClause();
11709 break;
11710 case llvm::omp::OMPC_ordered:
11711 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11712 break;
11713 case llvm::omp::OMPC_nowait:
11714 C = new (Context) OMPNowaitClause();
11715 break;
11716 case llvm::omp::OMPC_untied:
11717 C = new (Context) OMPUntiedClause();
11718 break;
11719 case llvm::omp::OMPC_mergeable:
11720 C = new (Context) OMPMergeableClause();
11721 break;
11722 case llvm::omp::OMPC_threadset:
11723 C = new (Context) OMPThreadsetClause();
11724 break;
11725 case llvm::omp::OMPC_transparent:
11726 C = new (Context) OMPTransparentClause();
11727 break;
11728 case llvm::omp::OMPC_read:
11729 C = new (Context) OMPReadClause();
11730 break;
11731 case llvm::omp::OMPC_write:
11732 C = new (Context) OMPWriteClause();
11733 break;
11734 case llvm::omp::OMPC_update:
11735 C = new (Context) OMPUpdateClause();
11736 break;
11737 case llvm::omp::OMPC_update_depend_objects:
11738 C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
11739 break;
11740 case llvm::omp::OMPC_capture:
11741 C = new (Context) OMPCaptureClause();
11742 break;
11743 case llvm::omp::OMPC_compare:
11744 C = new (Context) OMPCompareClause();
11745 break;
11746 case llvm::omp::OMPC_fail:
11747 C = new (Context) OMPFailClause();
11748 break;
11749 case llvm::omp::OMPC_seq_cst:
11750 C = new (Context) OMPSeqCstClause();
11751 break;
11752 case llvm::omp::OMPC_acq_rel:
11753 C = new (Context) OMPAcqRelClause();
11754 break;
11755 case llvm::omp::OMPC_absent: {
11756 unsigned NumKinds = Record.readInt();
11757 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11758 break;
11759 }
11760 case llvm::omp::OMPC_holds:
11761 C = new (Context) OMPHoldsClause();
11762 break;
11763 case llvm::omp::OMPC_contains: {
11764 unsigned NumKinds = Record.readInt();
11765 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11766 break;
11767 }
11768 case llvm::omp::OMPC_no_openmp:
11769 C = new (Context) OMPNoOpenMPClause();
11770 break;
11771 case llvm::omp::OMPC_no_openmp_routines:
11772 C = new (Context) OMPNoOpenMPRoutinesClause();
11773 break;
11774 case llvm::omp::OMPC_no_openmp_constructs:
11775 C = new (Context) OMPNoOpenMPConstructsClause();
11776 break;
11777 case llvm::omp::OMPC_no_parallelism:
11778 C = new (Context) OMPNoParallelismClause();
11779 break;
11780 case llvm::omp::OMPC_acquire:
11781 C = new (Context) OMPAcquireClause();
11782 break;
11783 case llvm::omp::OMPC_release:
11784 C = new (Context) OMPReleaseClause();
11785 break;
11786 case llvm::omp::OMPC_relaxed:
11787 C = new (Context) OMPRelaxedClause();
11788 break;
11789 case llvm::omp::OMPC_weak:
11790 C = new (Context) OMPWeakClause();
11791 break;
11792 case llvm::omp::OMPC_threads:
11793 C = new (Context) OMPThreadsClause();
11794 break;
11795 case llvm::omp::OMPC_simd:
11796 C = new (Context) OMPSIMDClause();
11797 break;
11798 case llvm::omp::OMPC_nogroup:
11799 C = new (Context) OMPNogroupClause();
11800 break;
11801 case llvm::omp::OMPC_unified_address:
11802 C = new (Context) OMPUnifiedAddressClause();
11803 break;
11804 case llvm::omp::OMPC_unified_shared_memory:
11805 C = new (Context) OMPUnifiedSharedMemoryClause();
11806 break;
11807 case llvm::omp::OMPC_reverse_offload:
11808 C = new (Context) OMPReverseOffloadClause();
11809 break;
11810 case llvm::omp::OMPC_dynamic_allocators:
11811 C = new (Context) OMPDynamicAllocatorsClause();
11812 break;
11813 case llvm::omp::OMPC_atomic_default_mem_order:
11814 C = new (Context) OMPAtomicDefaultMemOrderClause();
11815 break;
11816 case llvm::omp::OMPC_self_maps:
11817 C = new (Context) OMPSelfMapsClause();
11818 break;
11819 case llvm::omp::OMPC_at:
11820 C = new (Context) OMPAtClause();
11821 break;
11822 case llvm::omp::OMPC_severity:
11823 C = new (Context) OMPSeverityClause();
11824 break;
11825 case llvm::omp::OMPC_message:
11826 C = new (Context) OMPMessageClause();
11827 break;
11828 case llvm::omp::OMPC_private:
11829 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11830 break;
11831 case llvm::omp::OMPC_firstprivate:
11832 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11833 break;
11834 case llvm::omp::OMPC_lastprivate:
11835 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11836 break;
11837 case llvm::omp::OMPC_shared:
11838 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11839 break;
11840 case llvm::omp::OMPC_reduction: {
11841 unsigned N = Record.readInt();
11842 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11843 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11844 break;
11845 }
11846 case llvm::omp::OMPC_task_reduction:
11847 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11848 break;
11849 case llvm::omp::OMPC_in_reduction:
11850 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11851 break;
11852 case llvm::omp::OMPC_linear:
11853 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11854 break;
11855 case llvm::omp::OMPC_aligned:
11856 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11857 break;
11858 case llvm::omp::OMPC_copyin:
11859 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11860 break;
11861 case llvm::omp::OMPC_copyprivate:
11862 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11863 break;
11864 case llvm::omp::OMPC_flush:
11865 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11866 break;
11867 case llvm::omp::OMPC_depobj:
11868 C = new (Context) OMPDepobjClause();
11869 break;
11870 case llvm::omp::OMPC_depend: {
11871 unsigned NumVars = Record.readInt();
11872 unsigned NumLoops = Record.readInt();
11873 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11874 break;
11875 }
11876 case llvm::omp::OMPC_device:
11877 C = new (Context) OMPDeviceClause();
11878 break;
11879 case llvm::omp::OMPC_map: {
11881 Sizes.NumVars = Record.readInt();
11882 Sizes.NumUniqueDeclarations = Record.readInt();
11883 Sizes.NumComponentLists = Record.readInt();
11884 Sizes.NumComponents = Record.readInt();
11885 C = OMPMapClause::CreateEmpty(Context, Sizes);
11886 break;
11887 }
11888 case llvm::omp::OMPC_num_teams:
11889 C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11890 break;
11891 case llvm::omp::OMPC_thread_limit:
11892 C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11893 break;
11894 case llvm::omp::OMPC_priority:
11895 C = new (Context) OMPPriorityClause();
11896 break;
11897 case llvm::omp::OMPC_grainsize:
11898 C = new (Context) OMPGrainsizeClause();
11899 break;
11900 case llvm::omp::OMPC_num_tasks:
11901 C = new (Context) OMPNumTasksClause();
11902 break;
11903 case llvm::omp::OMPC_hint:
11904 C = new (Context) OMPHintClause();
11905 break;
11906 case llvm::omp::OMPC_dist_schedule:
11907 C = new (Context) OMPDistScheduleClause();
11908 break;
11909 case llvm::omp::OMPC_defaultmap:
11910 C = new (Context) OMPDefaultmapClause();
11911 break;
11912 case llvm::omp::OMPC_to: {
11914 Sizes.NumVars = Record.readInt();
11915 Sizes.NumUniqueDeclarations = Record.readInt();
11916 Sizes.NumComponentLists = Record.readInt();
11917 Sizes.NumComponents = Record.readInt();
11918 C = OMPToClause::CreateEmpty(Context, Sizes);
11919 break;
11920 }
11921 case llvm::omp::OMPC_from: {
11923 Sizes.NumVars = Record.readInt();
11924 Sizes.NumUniqueDeclarations = Record.readInt();
11925 Sizes.NumComponentLists = Record.readInt();
11926 Sizes.NumComponents = Record.readInt();
11927 C = OMPFromClause::CreateEmpty(Context, Sizes);
11928 break;
11929 }
11930 case llvm::omp::OMPC_use_device_ptr: {
11932 Sizes.NumVars = Record.readInt();
11933 Sizes.NumUniqueDeclarations = Record.readInt();
11934 Sizes.NumComponentLists = Record.readInt();
11935 Sizes.NumComponents = Record.readInt();
11936 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11937 break;
11938 }
11939 case llvm::omp::OMPC_use_device_addr: {
11941 Sizes.NumVars = Record.readInt();
11942 Sizes.NumUniqueDeclarations = Record.readInt();
11943 Sizes.NumComponentLists = Record.readInt();
11944 Sizes.NumComponents = Record.readInt();
11945 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11946 break;
11947 }
11948 case llvm::omp::OMPC_is_device_ptr: {
11950 Sizes.NumVars = Record.readInt();
11951 Sizes.NumUniqueDeclarations = Record.readInt();
11952 Sizes.NumComponentLists = Record.readInt();
11953 Sizes.NumComponents = Record.readInt();
11954 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11955 break;
11956 }
11957 case llvm::omp::OMPC_has_device_addr: {
11959 Sizes.NumVars = Record.readInt();
11960 Sizes.NumUniqueDeclarations = Record.readInt();
11961 Sizes.NumComponentLists = Record.readInt();
11962 Sizes.NumComponents = Record.readInt();
11963 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11964 break;
11965 }
11966 case llvm::omp::OMPC_allocate:
11967 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11968 break;
11969 case llvm::omp::OMPC_nontemporal:
11970 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11971 break;
11972 case llvm::omp::OMPC_inclusive:
11973 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11974 break;
11975 case llvm::omp::OMPC_exclusive:
11976 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11977 break;
11978 case llvm::omp::OMPC_order:
11979 C = new (Context) OMPOrderClause();
11980 break;
11981 case llvm::omp::OMPC_init: {
11982 unsigned VarListSize = Record.readInt();
11983 unsigned NumAttrs = Record.readInt();
11984 C = OMPInitClause::CreateEmpty(Context, /*NumPrefs=*/VarListSize - 1,
11985 NumAttrs);
11986 break;
11987 }
11988 case llvm::omp::OMPC_use:
11989 C = new (Context) OMPUseClause();
11990 break;
11991 case llvm::omp::OMPC_destroy:
11992 C = new (Context) OMPDestroyClause();
11993 break;
11994 case llvm::omp::OMPC_novariants:
11995 C = new (Context) OMPNovariantsClause();
11996 break;
11997 case llvm::omp::OMPC_nocontext:
11998 C = new (Context) OMPNocontextClause();
11999 break;
12000 case llvm::omp::OMPC_detach:
12001 C = new (Context) OMPDetachClause();
12002 break;
12003 case llvm::omp::OMPC_uses_allocators:
12004 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
12005 break;
12006 case llvm::omp::OMPC_affinity:
12007 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
12008 break;
12009 case llvm::omp::OMPC_filter:
12010 C = new (Context) OMPFilterClause();
12011 break;
12012 case llvm::omp::OMPC_bind:
12013 C = new (Context) OMPBindClause();
12014 break;
12015 case llvm::omp::OMPC_align:
12016 C = new (Context) OMPAlignClause();
12017 break;
12018 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
12019 C = new (Context) OMPXDynCGroupMemClause();
12020 break;
12021 case llvm::omp::OMPC_dyn_groupprivate:
12022 C = new (Context) OMPDynGroupprivateClause();
12023 break;
12024 case llvm::omp::OMPC_doacross: {
12025 unsigned NumVars = Record.readInt();
12026 unsigned NumLoops = Record.readInt();
12027 C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
12028 break;
12029 }
12030 case llvm::omp::OMPC_ompx_attribute:
12031 C = new (Context) OMPXAttributeClause();
12032 break;
12033 case llvm::omp::OMPC_ompx_bare:
12034 C = new (Context) OMPXBareClause();
12035 break;
12036#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
12037 case llvm::omp::Enum: \
12038 break;
12039#include "llvm/Frontend/OpenMP/OMPKinds.def"
12040 default:
12041 break;
12042 }
12043 assert(C && "Unknown OMPClause type");
12044
12045 Visit(C);
12046 C->setLocStart(Record.readSourceLocation());
12047 C->setLocEnd(Record.readSourceLocation());
12048
12049 return C;
12050}
12051
12053 C->setPreInitStmt(Record.readSubStmt(),
12054 static_cast<OpenMPDirectiveKind>(Record.readInt()));
12055}
12056
12059 C->setPostUpdateExpr(Record.readSubExpr());
12060}
12061
12062void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
12064 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
12065 C->setNameModifierLoc(Record.readSourceLocation());
12066 C->setColonLoc(Record.readSourceLocation());
12067 C->setCondition(Record.readSubExpr());
12068 C->setLParenLoc(Record.readSourceLocation());
12069}
12070
12071void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
12073 C->setCondition(Record.readSubExpr());
12074 C->setLParenLoc(Record.readSourceLocation());
12075}
12076
12077void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
12078 C->setPrescriptivenessModifier(
12079 Record.readEnum<OpenMPNumThreadsClauseModifier>());
12080 C->setPrescriptivenessModifierLoc(Record.readSourceLocation());
12081 C->setDimsModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
12082 C->setDimsModifierLoc(Record.readSourceLocation());
12083 C->setDimsModifierExpr(Record.readSubExpr());
12085 C->setLParenLoc(Record.readSourceLocation());
12086 unsigned NumVars = C->varlist_size();
12087 SmallVector<Expr *, 16> Vars;
12088 Vars.reserve(NumVars);
12089 for (unsigned I = 0; I != NumVars; ++I)
12090 Vars.push_back(Record.readSubExpr());
12091 C->setVarRefs(Vars);
12092}
12093
12094void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
12095 C->setSafelen(Record.readSubExpr());
12096 C->setLParenLoc(Record.readSourceLocation());
12097}
12098
12099void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
12100 C->setSimdlen(Record.readSubExpr());
12101 C->setLParenLoc(Record.readSourceLocation());
12102}
12103
12104void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
12105 for (Expr *&E : C->getSizesRefs())
12106 E = Record.readSubExpr();
12107 C->setLParenLoc(Record.readSourceLocation());
12108}
12109
12110void OMPClauseReader::VisitOMPCountsClause(OMPCountsClause *C) {
12111 bool HasFill = Record.readBool();
12112 if (HasFill)
12113 C->setOmpFillIndex(Record.readInt());
12114 C->setOmpFillLoc(Record.readSourceLocation());
12115 for (Expr *&E : C->getCountsRefs())
12116 E = Record.readSubExpr();
12117 C->setLParenLoc(Record.readSourceLocation());
12118}
12119
12120void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
12121 for (Expr *&E : C->getArgsRefs())
12122 E = Record.readSubExpr();
12123 C->setLParenLoc(Record.readSourceLocation());
12124}
12125
12126void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
12127
12128void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
12129 C->setFactor(Record.readSubExpr());
12130 C->setLParenLoc(Record.readSourceLocation());
12131}
12132
12133void OMPClauseReader::VisitOMPDepthClause(OMPDepthClause *C) {
12134 C->setDepth(Record.readSubExpr());
12135 C->setLParenLoc(Record.readSourceLocation());
12136}
12137
12138void OMPClauseReader::VisitOMPLoopRangeClause(OMPLoopRangeClause *C) {
12139 C->setFirst(Record.readSubExpr());
12140 C->setCount(Record.readSubExpr());
12141 C->setLParenLoc(Record.readSourceLocation());
12142 C->setFirstLoc(Record.readSourceLocation());
12143 C->setCountLoc(Record.readSourceLocation());
12144}
12145
12146void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
12147 C->setAllocator(Record.readExpr());
12148 C->setLParenLoc(Record.readSourceLocation());
12149}
12150
12151void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
12152 C->setNumForLoops(Record.readSubExpr());
12153 C->setLParenLoc(Record.readSourceLocation());
12154}
12155
12156void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
12157 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
12158 C->setLParenLoc(Record.readSourceLocation());
12159 C->setDefaultKindKwLoc(Record.readSourceLocation());
12160 C->setDefaultVariableCategory(
12161 Record.readEnum<OpenMPDefaultClauseVariableCategory>());
12162 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
12163}
12164
12165// Read the parameter of threadset clause. This will have been saved when
12166// OMPClauseWriter is called.
12167void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) {
12168 C->setLParenLoc(Record.readSourceLocation());
12169 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
12170 C->setThreadsetKindLoc(ThreadsetKindLoc);
12171 OpenMPThreadsetKind TKind =
12172 static_cast<OpenMPThreadsetKind>(Record.readInt());
12173 C->setThreadsetKind(TKind);
12174}
12175
12176void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *C) {
12177 C->setLParenLoc(Record.readSourceLocation());
12178 C->setImpexTypeKind(Record.readSubExpr());
12179}
12180
12181void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
12182 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
12183 C->setLParenLoc(Record.readSourceLocation());
12184 C->setProcBindKindKwLoc(Record.readSourceLocation());
12185}
12186
12187void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
12189 C->setScheduleKind(
12190 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
12191 C->setFirstScheduleModifier(
12192 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12193 C->setSecondScheduleModifier(
12194 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
12195 C->setChunkSize(Record.readSubExpr());
12196 C->setLParenLoc(Record.readSourceLocation());
12197 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12198 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12199 C->setScheduleKindLoc(Record.readSourceLocation());
12200 C->setCommaLoc(Record.readSourceLocation());
12201}
12202
12203void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
12204 C->setNumForLoops(Record.readSubExpr());
12205 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12206 C->setLoopNumIterations(I, Record.readSubExpr());
12207 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
12208 C->setLoopCounter(I, Record.readSubExpr());
12209 C->setLParenLoc(Record.readSourceLocation());
12210}
12211
12212void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
12213 C->setEventHandler(Record.readSubExpr());
12214 C->setLParenLoc(Record.readSourceLocation());
12215}
12216
12217void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *C) {
12218 C->setCondition(Record.readSubExpr());
12219 C->setLParenLoc(Record.readSourceLocation());
12220}
12221
12222void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12223
12224void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12225
12226void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12227
12228void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12229
12230void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12231
12232void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
12233 OMPUpdateDependObjectsClause *C) {
12234 C->setLParenLoc(Record.readSourceLocation());
12235 C->setArgumentLoc(Record.readSourceLocation());
12236 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12237}
12238
12239void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12240
12241void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12242
12243// Read the parameter of fail clause. This will have been saved when
12244// OMPClauseWriter is called.
12245void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
12246 C->setLParenLoc(Record.readSourceLocation());
12247 SourceLocation FailParameterLoc = Record.readSourceLocation();
12248 C->setFailParameterLoc(FailParameterLoc);
12249 OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
12250 C->setFailParameter(CKind);
12251}
12252
12253void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
12254 unsigned Count = C->getDirectiveKinds().size();
12255 C->setLParenLoc(Record.readSourceLocation());
12256 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12257 DKVec.reserve(Count);
12258 for (unsigned I = 0; I < Count; I++) {
12259 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12260 }
12261 C->setDirectiveKinds(DKVec);
12262}
12263
12264void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
12265 C->setExpr(Record.readExpr());
12266 C->setLParenLoc(Record.readSourceLocation());
12267}
12268
12269void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
12270 unsigned Count = C->getDirectiveKinds().size();
12271 C->setLParenLoc(Record.readSourceLocation());
12272 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12273 DKVec.reserve(Count);
12274 for (unsigned I = 0; I < Count; I++) {
12275 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12276 }
12277 C->setDirectiveKinds(DKVec);
12278}
12279
12280void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12281
12282void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12283 OMPNoOpenMPRoutinesClause *) {}
12284
12285void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12286 OMPNoOpenMPConstructsClause *) {}
12287
12288void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12289
12290void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12291
12292void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12293
12294void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12295
12296void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12297
12298void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12299
12300void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12301
12302void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12303
12304void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12305
12306void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12307
12308void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12309 unsigned NumVars = C->varlist_size();
12310 SmallVector<Expr *, 16> Vars;
12311 Vars.reserve(NumVars);
12312 for (unsigned I = 0; I != NumVars; ++I)
12313 Vars.push_back(Record.readSubExpr());
12314 C->setVarRefs(Vars);
12315 C->setIsTarget(Record.readBool());
12316 C->setIsTargetSync(Record.readBool());
12317 C->setHasPreferAttrs(Record.readBool());
12318
12319 unsigned NumPrefs = C->varlist_size() - 1;
12320 SmallVector<unsigned, 4> Counts;
12321 SmallVector<Expr *, 8> Attrs;
12322 Counts.reserve(NumPrefs);
12323 for (unsigned I = 0; I < NumPrefs; ++I) {
12324 unsigned NA = Record.readInt();
12325 Counts.push_back(NA);
12326 for (unsigned J = 0; J < NA; ++J)
12327 Attrs.push_back(Record.readSubExpr());
12328 }
12329 C->setAttrs(Counts, Attrs);
12330
12331 C->setLParenLoc(Record.readSourceLocation());
12332 C->setVarLoc(Record.readSourceLocation());
12333}
12334
12335void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12336 C->setInteropVar(Record.readSubExpr());
12337 C->setLParenLoc(Record.readSourceLocation());
12338 C->setVarLoc(Record.readSourceLocation());
12339}
12340
12341void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12342 C->setInteropVar(Record.readSubExpr());
12343 C->setLParenLoc(Record.readSourceLocation());
12344 C->setVarLoc(Record.readSourceLocation());
12345}
12346
12347void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12349 C->setCondition(Record.readSubExpr());
12350 C->setLParenLoc(Record.readSourceLocation());
12351}
12352
12353void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12355 C->setCondition(Record.readSubExpr());
12356 C->setLParenLoc(Record.readSourceLocation());
12357}
12358
12359void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12360
12361void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12362 OMPUnifiedSharedMemoryClause *) {}
12363
12364void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12365
12366void
12367OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12368}
12369
12370void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12371 OMPAtomicDefaultMemOrderClause *C) {
12372 C->setAtomicDefaultMemOrderKind(
12373 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12374 C->setLParenLoc(Record.readSourceLocation());
12375 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12376}
12377
12378void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12379
12380void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
12381 C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
12382 C->setLParenLoc(Record.readSourceLocation());
12383 C->setAtKindKwLoc(Record.readSourceLocation());
12384}
12385
12386void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
12387 C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
12388 C->setLParenLoc(Record.readSourceLocation());
12389 C->setSeverityKindKwLoc(Record.readSourceLocation());
12390}
12391
12392void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
12394 C->setMessageString(Record.readSubExpr());
12395 C->setLParenLoc(Record.readSourceLocation());
12396}
12397
12398void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12399 C->setLParenLoc(Record.readSourceLocation());
12400 unsigned NumVars = C->varlist_size();
12401 SmallVector<Expr *, 16> Vars;
12402 Vars.reserve(NumVars);
12403 for (unsigned i = 0; i != NumVars; ++i)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setVarRefs(Vars);
12406 Vars.clear();
12407 for (unsigned i = 0; i != NumVars; ++i)
12408 Vars.push_back(Record.readSubExpr());
12409 C->setPrivateCopies(Vars);
12410}
12411
12412void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12414 C->setLParenLoc(Record.readSourceLocation());
12415 unsigned NumVars = C->varlist_size();
12416 SmallVector<Expr *, 16> Vars;
12417 Vars.reserve(NumVars);
12418 for (unsigned i = 0; i != NumVars; ++i)
12419 Vars.push_back(Record.readSubExpr());
12420 C->setVarRefs(Vars);
12421 Vars.clear();
12422 for (unsigned i = 0; i != NumVars; ++i)
12423 Vars.push_back(Record.readSubExpr());
12424 C->setPrivateCopies(Vars);
12425 Vars.clear();
12426 for (unsigned i = 0; i != NumVars; ++i)
12427 Vars.push_back(Record.readSubExpr());
12428 C->setInits(Vars);
12429}
12430
12431void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12433 C->setLParenLoc(Record.readSourceLocation());
12434 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12435 C->setKindLoc(Record.readSourceLocation());
12436 C->setColonLoc(Record.readSourceLocation());
12437 unsigned NumVars = C->varlist_size();
12438 SmallVector<Expr *, 16> Vars;
12439 Vars.reserve(NumVars);
12440 for (unsigned i = 0; i != NumVars; ++i)
12441 Vars.push_back(Record.readSubExpr());
12442 C->setVarRefs(Vars);
12443 Vars.clear();
12444 for (unsigned i = 0; i != NumVars; ++i)
12445 Vars.push_back(Record.readSubExpr());
12446 C->setPrivateCopies(Vars);
12447 Vars.clear();
12448 for (unsigned i = 0; i != NumVars; ++i)
12449 Vars.push_back(Record.readSubExpr());
12450 C->setSourceExprs(Vars);
12451 Vars.clear();
12452 for (unsigned i = 0; i != NumVars; ++i)
12453 Vars.push_back(Record.readSubExpr());
12454 C->setDestinationExprs(Vars);
12455 Vars.clear();
12456 for (unsigned i = 0; i != NumVars; ++i)
12457 Vars.push_back(Record.readSubExpr());
12458 C->setAssignmentOps(Vars);
12459}
12460
12461void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12462 C->setLParenLoc(Record.readSourceLocation());
12463 unsigned NumVars = C->varlist_size();
12464 SmallVector<Expr *, 16> Vars;
12465 Vars.reserve(NumVars);
12466 for (unsigned i = 0; i != NumVars; ++i)
12467 Vars.push_back(Record.readSubExpr());
12468 C->setVarRefs(Vars);
12469}
12470
12471void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12473 C->setLParenLoc(Record.readSourceLocation());
12474 C->setModifierLoc(Record.readSourceLocation());
12475 C->setColonLoc(Record.readSourceLocation());
12476 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12477 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12478 C->setQualifierLoc(NNSL);
12479 C->setNameInfo(DNI);
12480
12481 unsigned NumVars = C->varlist_size();
12482 SmallVector<Expr *, 16> Vars;
12483 Vars.reserve(NumVars);
12484 for (unsigned i = 0; i != NumVars; ++i)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setVarRefs(Vars);
12487 Vars.clear();
12488 for (unsigned i = 0; i != NumVars; ++i)
12489 Vars.push_back(Record.readSubExpr());
12490 C->setPrivates(Vars);
12491 Vars.clear();
12492 for (unsigned i = 0; i != NumVars; ++i)
12493 Vars.push_back(Record.readSubExpr());
12494 C->setLHSExprs(Vars);
12495 Vars.clear();
12496 for (unsigned i = 0; i != NumVars; ++i)
12497 Vars.push_back(Record.readSubExpr());
12498 C->setRHSExprs(Vars);
12499 Vars.clear();
12500 for (unsigned i = 0; i != NumVars; ++i)
12501 Vars.push_back(Record.readSubExpr());
12502 C->setReductionOps(Vars);
12503 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12504 Vars.clear();
12505 for (unsigned i = 0; i != NumVars; ++i)
12506 Vars.push_back(Record.readSubExpr());
12507 C->setInscanCopyOps(Vars);
12508 Vars.clear();
12509 for (unsigned i = 0; i != NumVars; ++i)
12510 Vars.push_back(Record.readSubExpr());
12511 C->setInscanCopyArrayTemps(Vars);
12512 Vars.clear();
12513 for (unsigned i = 0; i != NumVars; ++i)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setInscanCopyArrayElems(Vars);
12516 }
12517 unsigned NumFlags = Record.readInt();
12518 SmallVector<bool, 16> Flags;
12519 Flags.reserve(NumFlags);
12520 for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
12521 Flags.push_back(Record.readInt());
12522 C->setPrivateVariableReductionFlags(Flags);
12523}
12524
12525void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12527 C->setLParenLoc(Record.readSourceLocation());
12528 C->setColonLoc(Record.readSourceLocation());
12529 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12530 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12531 C->setQualifierLoc(NNSL);
12532 C->setNameInfo(DNI);
12533
12534 unsigned NumVars = C->varlist_size();
12535 SmallVector<Expr *, 16> Vars;
12536 Vars.reserve(NumVars);
12537 for (unsigned I = 0; I != NumVars; ++I)
12538 Vars.push_back(Record.readSubExpr());
12539 C->setVarRefs(Vars);
12540 Vars.clear();
12541 for (unsigned I = 0; I != NumVars; ++I)
12542 Vars.push_back(Record.readSubExpr());
12543 C->setPrivates(Vars);
12544 Vars.clear();
12545 for (unsigned I = 0; I != NumVars; ++I)
12546 Vars.push_back(Record.readSubExpr());
12547 C->setLHSExprs(Vars);
12548 Vars.clear();
12549 for (unsigned I = 0; I != NumVars; ++I)
12550 Vars.push_back(Record.readSubExpr());
12551 C->setRHSExprs(Vars);
12552 Vars.clear();
12553 for (unsigned I = 0; I != NumVars; ++I)
12554 Vars.push_back(Record.readSubExpr());
12555 C->setReductionOps(Vars);
12556}
12557
12558void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12560 C->setLParenLoc(Record.readSourceLocation());
12561 C->setColonLoc(Record.readSourceLocation());
12562 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12563 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12564 C->setQualifierLoc(NNSL);
12565 C->setNameInfo(DNI);
12566
12567 unsigned NumVars = C->varlist_size();
12568 SmallVector<Expr *, 16> Vars;
12569 Vars.reserve(NumVars);
12570 for (unsigned I = 0; I != NumVars; ++I)
12571 Vars.push_back(Record.readSubExpr());
12572 C->setVarRefs(Vars);
12573 Vars.clear();
12574 for (unsigned I = 0; I != NumVars; ++I)
12575 Vars.push_back(Record.readSubExpr());
12576 C->setPrivates(Vars);
12577 Vars.clear();
12578 for (unsigned I = 0; I != NumVars; ++I)
12579 Vars.push_back(Record.readSubExpr());
12580 C->setLHSExprs(Vars);
12581 Vars.clear();
12582 for (unsigned I = 0; I != NumVars; ++I)
12583 Vars.push_back(Record.readSubExpr());
12584 C->setRHSExprs(Vars);
12585 Vars.clear();
12586 for (unsigned I = 0; I != NumVars; ++I)
12587 Vars.push_back(Record.readSubExpr());
12588 C->setReductionOps(Vars);
12589 Vars.clear();
12590 for (unsigned I = 0; I != NumVars; ++I)
12591 Vars.push_back(Record.readSubExpr());
12592 C->setTaskgroupDescriptors(Vars);
12593}
12594
12595void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12597 C->setLParenLoc(Record.readSourceLocation());
12598 C->setColonLoc(Record.readSourceLocation());
12599 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12600 C->setModifierLoc(Record.readSourceLocation());
12601 unsigned NumVars = C->varlist_size();
12602 SmallVector<Expr *, 16> Vars;
12603 Vars.reserve(NumVars);
12604 for (unsigned i = 0; i != NumVars; ++i)
12605 Vars.push_back(Record.readSubExpr());
12606 C->setVarRefs(Vars);
12607 Vars.clear();
12608 for (unsigned i = 0; i != NumVars; ++i)
12609 Vars.push_back(Record.readSubExpr());
12610 C->setPrivates(Vars);
12611 Vars.clear();
12612 for (unsigned i = 0; i != NumVars; ++i)
12613 Vars.push_back(Record.readSubExpr());
12614 C->setInits(Vars);
12615 Vars.clear();
12616 for (unsigned i = 0; i != NumVars; ++i)
12617 Vars.push_back(Record.readSubExpr());
12618 C->setUpdates(Vars);
12619 Vars.clear();
12620 for (unsigned i = 0; i != NumVars; ++i)
12621 Vars.push_back(Record.readSubExpr());
12622 C->setFinals(Vars);
12623 C->setStep(Record.readSubExpr());
12624 C->setCalcStep(Record.readSubExpr());
12625 Vars.clear();
12626 for (unsigned I = 0; I != NumVars + 1; ++I)
12627 Vars.push_back(Record.readSubExpr());
12628 C->setUsedExprs(Vars);
12629}
12630
12631void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12632 C->setLParenLoc(Record.readSourceLocation());
12633 C->setColonLoc(Record.readSourceLocation());
12634 unsigned NumVars = C->varlist_size();
12635 SmallVector<Expr *, 16> Vars;
12636 Vars.reserve(NumVars);
12637 for (unsigned i = 0; i != NumVars; ++i)
12638 Vars.push_back(Record.readSubExpr());
12639 C->setVarRefs(Vars);
12640 C->setAlignment(Record.readSubExpr());
12641}
12642
12643void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12644 C->setLParenLoc(Record.readSourceLocation());
12645 unsigned NumVars = C->varlist_size();
12646 SmallVector<Expr *, 16> Exprs;
12647 Exprs.reserve(NumVars);
12648 for (unsigned i = 0; i != NumVars; ++i)
12649 Exprs.push_back(Record.readSubExpr());
12650 C->setVarRefs(Exprs);
12651 Exprs.clear();
12652 for (unsigned i = 0; i != NumVars; ++i)
12653 Exprs.push_back(Record.readSubExpr());
12654 C->setSourceExprs(Exprs);
12655 Exprs.clear();
12656 for (unsigned i = 0; i != NumVars; ++i)
12657 Exprs.push_back(Record.readSubExpr());
12658 C->setDestinationExprs(Exprs);
12659 Exprs.clear();
12660 for (unsigned i = 0; i != NumVars; ++i)
12661 Exprs.push_back(Record.readSubExpr());
12662 C->setAssignmentOps(Exprs);
12663}
12664
12665void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12666 C->setLParenLoc(Record.readSourceLocation());
12667 unsigned NumVars = C->varlist_size();
12668 SmallVector<Expr *, 16> Exprs;
12669 Exprs.reserve(NumVars);
12670 for (unsigned i = 0; i != NumVars; ++i)
12671 Exprs.push_back(Record.readSubExpr());
12672 C->setVarRefs(Exprs);
12673 Exprs.clear();
12674 for (unsigned i = 0; i != NumVars; ++i)
12675 Exprs.push_back(Record.readSubExpr());
12676 C->setSourceExprs(Exprs);
12677 Exprs.clear();
12678 for (unsigned i = 0; i != NumVars; ++i)
12679 Exprs.push_back(Record.readSubExpr());
12680 C->setDestinationExprs(Exprs);
12681 Exprs.clear();
12682 for (unsigned i = 0; i != NumVars; ++i)
12683 Exprs.push_back(Record.readSubExpr());
12684 C->setAssignmentOps(Exprs);
12685}
12686
12687void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12688 C->setLParenLoc(Record.readSourceLocation());
12689 unsigned NumVars = C->varlist_size();
12690 SmallVector<Expr *, 16> Vars;
12691 Vars.reserve(NumVars);
12692 for (unsigned i = 0; i != NumVars; ++i)
12693 Vars.push_back(Record.readSubExpr());
12694 C->setVarRefs(Vars);
12695}
12696
12697void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12698 C->setDepobj(Record.readSubExpr());
12699 C->setLParenLoc(Record.readSourceLocation());
12700}
12701
12702void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12703 C->setLParenLoc(Record.readSourceLocation());
12704 C->setModifier(Record.readSubExpr());
12705 C->setDependencyKind(
12706 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12707 C->setDependencyLoc(Record.readSourceLocation());
12708 C->setColonLoc(Record.readSourceLocation());
12709 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12710 unsigned NumVars = C->varlist_size();
12711 SmallVector<Expr *, 16> Vars;
12712 Vars.reserve(NumVars);
12713 for (unsigned I = 0; I != NumVars; ++I)
12714 Vars.push_back(Record.readSubExpr());
12715 C->setVarRefs(Vars);
12716 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12717 C->setLoopData(I, Record.readSubExpr());
12718}
12719
12720void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12722 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12723 C->setDevice(Record.readSubExpr());
12724 C->setModifierLoc(Record.readSourceLocation());
12725 C->setLParenLoc(Record.readSourceLocation());
12726}
12727
12728void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12729 C->setLParenLoc(Record.readSourceLocation());
12730 bool HasIteratorModifier = false;
12731 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12732 C->setMapTypeModifier(
12733 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12734 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12735 if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12736 HasIteratorModifier = true;
12737 }
12738 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12739 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12740 C->setMapType(
12741 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12742 C->setMapLoc(Record.readSourceLocation());
12743 C->setColonLoc(Record.readSourceLocation());
12744 auto NumVars = C->varlist_size();
12745 auto UniqueDecls = C->getUniqueDeclarationsNum();
12746 auto TotalLists = C->getTotalComponentListNum();
12747 auto TotalComponents = C->getTotalComponentsNum();
12748
12749 SmallVector<Expr *, 16> Vars;
12750 Vars.reserve(NumVars);
12751 for (unsigned i = 0; i != NumVars; ++i)
12752 Vars.push_back(Record.readExpr());
12753 C->setVarRefs(Vars);
12754
12755 SmallVector<Expr *, 16> UDMappers;
12756 UDMappers.reserve(NumVars);
12757 for (unsigned I = 0; I < NumVars; ++I)
12758 UDMappers.push_back(Record.readExpr());
12759 C->setUDMapperRefs(UDMappers);
12760
12761 if (HasIteratorModifier)
12762 C->setIteratorModifier(Record.readExpr());
12763
12764 SmallVector<ValueDecl *, 16> Decls;
12765 Decls.reserve(UniqueDecls);
12766 for (unsigned i = 0; i < UniqueDecls; ++i)
12767 Decls.push_back(Record.readDeclAs<ValueDecl>());
12768 C->setUniqueDecls(Decls);
12769
12770 SmallVector<unsigned, 16> ListsPerDecl;
12771 ListsPerDecl.reserve(UniqueDecls);
12772 for (unsigned i = 0; i < UniqueDecls; ++i)
12773 ListsPerDecl.push_back(Record.readInt());
12774 C->setDeclNumLists(ListsPerDecl);
12775
12776 SmallVector<unsigned, 32> ListSizes;
12777 ListSizes.reserve(TotalLists);
12778 for (unsigned i = 0; i < TotalLists; ++i)
12779 ListSizes.push_back(Record.readInt());
12780 C->setComponentListSizes(ListSizes);
12781
12782 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12783 Components.reserve(TotalComponents);
12784 for (unsigned i = 0; i < TotalComponents; ++i) {
12785 Expr *AssociatedExprPr = Record.readExpr();
12786 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12787 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12788 /*IsNonContiguous=*/false);
12789 }
12790 C->setComponents(Components, ListSizes);
12791}
12792
12793void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12794 C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12795 C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12796 C->setLParenLoc(Record.readSourceLocation());
12797 C->setColonLoc(Record.readSourceLocation());
12798 C->setAllocator(Record.readSubExpr());
12799 C->setAlignment(Record.readSubExpr());
12800 unsigned NumVars = C->varlist_size();
12801 SmallVector<Expr *, 16> Vars;
12802 Vars.reserve(NumVars);
12803 for (unsigned i = 0; i != NumVars; ++i)
12804 Vars.push_back(Record.readSubExpr());
12805 C->setVarRefs(Vars);
12806}
12807
12808void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12809 C->setModifier(Record.readEnum<OpenMPNumTeamsClauseModifier>());
12810 C->setModifierLoc(Record.readSourceLocation());
12811 C->setModifierExpr(Record.readSubExpr());
12813 C->setLParenLoc(Record.readSourceLocation());
12814 unsigned NumVars = C->varlist_size();
12815 SmallVector<Expr *, 16> Vars;
12816 Vars.reserve(NumVars);
12817 for (unsigned I = 0; I != NumVars; ++I)
12818 Vars.push_back(Record.readSubExpr());
12819 C->setVarRefs(Vars);
12820}
12821
12822void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12823 C->setModifier(Record.readEnum<OpenMPThreadLimitClauseModifier>());
12824 C->setModifierLoc(Record.readSourceLocation());
12825 C->setModifierExpr(Record.readSubExpr());
12827 C->setLParenLoc(Record.readSourceLocation());
12828 unsigned NumVars = C->varlist_size();
12829 SmallVector<Expr *, 16> Vars;
12830 Vars.reserve(NumVars);
12831 for (unsigned I = 0; I != NumVars; ++I)
12832 Vars.push_back(Record.readSubExpr());
12833 C->setVarRefs(Vars);
12834}
12835
12836void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12838 C->setPriority(Record.readSubExpr());
12839 C->setLParenLoc(Record.readSourceLocation());
12840}
12841
12842void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12844 C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12845 C->setGrainsize(Record.readSubExpr());
12846 C->setModifierLoc(Record.readSourceLocation());
12847 C->setLParenLoc(Record.readSourceLocation());
12848}
12849
12850void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12852 C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12853 C->setNumTasks(Record.readSubExpr());
12854 C->setModifierLoc(Record.readSourceLocation());
12855 C->setLParenLoc(Record.readSourceLocation());
12856}
12857
12858void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12859 C->setHint(Record.readSubExpr());
12860 C->setLParenLoc(Record.readSourceLocation());
12861}
12862
12863void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12865 C->setDistScheduleKind(
12866 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12867 C->setChunkSize(Record.readSubExpr());
12868 C->setLParenLoc(Record.readSourceLocation());
12869 C->setDistScheduleKindLoc(Record.readSourceLocation());
12870 C->setCommaLoc(Record.readSourceLocation());
12871}
12872
12873void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12874 C->setDefaultmapKind(
12875 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12876 C->setDefaultmapModifier(
12877 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12878 C->setLParenLoc(Record.readSourceLocation());
12879 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12880 C->setDefaultmapKindLoc(Record.readSourceLocation());
12881}
12882
12883void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12884 C->setLParenLoc(Record.readSourceLocation());
12885 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12886 C->setMotionModifier(
12887 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12888 C->setMotionModifierLoc(I, Record.readSourceLocation());
12889 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12890 C->setIteratorModifier(Record.readExpr());
12891 }
12892 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12893 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12894 C->setColonLoc(Record.readSourceLocation());
12895 auto NumVars = C->varlist_size();
12896 auto UniqueDecls = C->getUniqueDeclarationsNum();
12897 auto TotalLists = C->getTotalComponentListNum();
12898 auto TotalComponents = C->getTotalComponentsNum();
12899
12900 SmallVector<Expr *, 16> Vars;
12901 Vars.reserve(NumVars);
12902 for (unsigned i = 0; i != NumVars; ++i)
12903 Vars.push_back(Record.readSubExpr());
12904 C->setVarRefs(Vars);
12905
12906 SmallVector<Expr *, 16> UDMappers;
12907 UDMappers.reserve(NumVars);
12908 for (unsigned I = 0; I < NumVars; ++I)
12909 UDMappers.push_back(Record.readSubExpr());
12910 C->setUDMapperRefs(UDMappers);
12911
12912 SmallVector<ValueDecl *, 16> Decls;
12913 Decls.reserve(UniqueDecls);
12914 for (unsigned i = 0; i < UniqueDecls; ++i)
12915 Decls.push_back(Record.readDeclAs<ValueDecl>());
12916 C->setUniqueDecls(Decls);
12917
12918 SmallVector<unsigned, 16> ListsPerDecl;
12919 ListsPerDecl.reserve(UniqueDecls);
12920 for (unsigned i = 0; i < UniqueDecls; ++i)
12921 ListsPerDecl.push_back(Record.readInt());
12922 C->setDeclNumLists(ListsPerDecl);
12923
12924 SmallVector<unsigned, 32> ListSizes;
12925 ListSizes.reserve(TotalLists);
12926 for (unsigned i = 0; i < TotalLists; ++i)
12927 ListSizes.push_back(Record.readInt());
12928 C->setComponentListSizes(ListSizes);
12929
12930 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12931 Components.reserve(TotalComponents);
12932 for (unsigned i = 0; i < TotalComponents; ++i) {
12933 Expr *AssociatedExprPr = Record.readSubExpr();
12934 bool IsNonContiguous = Record.readBool();
12935 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12936 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12937 }
12938 C->setComponents(Components, ListSizes);
12939}
12940
12941void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12942 C->setLParenLoc(Record.readSourceLocation());
12943 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12944 C->setMotionModifier(
12945 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12946 C->setMotionModifierLoc(I, Record.readSourceLocation());
12947 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12948 C->setIteratorModifier(Record.readExpr());
12949 }
12950 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12951 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12952 C->setColonLoc(Record.readSourceLocation());
12953 auto NumVars = C->varlist_size();
12954 auto UniqueDecls = C->getUniqueDeclarationsNum();
12955 auto TotalLists = C->getTotalComponentListNum();
12956 auto TotalComponents = C->getTotalComponentsNum();
12957
12958 SmallVector<Expr *, 16> Vars;
12959 Vars.reserve(NumVars);
12960 for (unsigned i = 0; i != NumVars; ++i)
12961 Vars.push_back(Record.readSubExpr());
12962 C->setVarRefs(Vars);
12963
12964 SmallVector<Expr *, 16> UDMappers;
12965 UDMappers.reserve(NumVars);
12966 for (unsigned I = 0; I < NumVars; ++I)
12967 UDMappers.push_back(Record.readSubExpr());
12968 C->setUDMapperRefs(UDMappers);
12969
12970 SmallVector<ValueDecl *, 16> Decls;
12971 Decls.reserve(UniqueDecls);
12972 for (unsigned i = 0; i < UniqueDecls; ++i)
12973 Decls.push_back(Record.readDeclAs<ValueDecl>());
12974 C->setUniqueDecls(Decls);
12975
12976 SmallVector<unsigned, 16> ListsPerDecl;
12977 ListsPerDecl.reserve(UniqueDecls);
12978 for (unsigned i = 0; i < UniqueDecls; ++i)
12979 ListsPerDecl.push_back(Record.readInt());
12980 C->setDeclNumLists(ListsPerDecl);
12981
12982 SmallVector<unsigned, 32> ListSizes;
12983 ListSizes.reserve(TotalLists);
12984 for (unsigned i = 0; i < TotalLists; ++i)
12985 ListSizes.push_back(Record.readInt());
12986 C->setComponentListSizes(ListSizes);
12987
12988 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12989 Components.reserve(TotalComponents);
12990 for (unsigned i = 0; i < TotalComponents; ++i) {
12991 Expr *AssociatedExprPr = Record.readSubExpr();
12992 bool IsNonContiguous = Record.readBool();
12993 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12994 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12995 }
12996 C->setComponents(Components, ListSizes);
12997}
12998
12999void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
13000 C->setLParenLoc(Record.readSourceLocation());
13001 C->setFallbackModifier(Record.readEnum<OpenMPUseDevicePtrFallbackModifier>());
13002 C->setFallbackModifierLoc(Record.readSourceLocation());
13003 auto NumVars = C->varlist_size();
13004 auto UniqueDecls = C->getUniqueDeclarationsNum();
13005 auto TotalLists = C->getTotalComponentListNum();
13006 auto TotalComponents = C->getTotalComponentsNum();
13007
13008 SmallVector<Expr *, 16> Vars;
13009 Vars.reserve(NumVars);
13010 for (unsigned i = 0; i != NumVars; ++i)
13011 Vars.push_back(Record.readSubExpr());
13012 C->setVarRefs(Vars);
13013 Vars.clear();
13014 for (unsigned i = 0; i != NumVars; ++i)
13015 Vars.push_back(Record.readSubExpr());
13016 C->setPrivateCopies(Vars);
13017 Vars.clear();
13018 for (unsigned i = 0; i != NumVars; ++i)
13019 Vars.push_back(Record.readSubExpr());
13020 C->setInits(Vars);
13021
13022 SmallVector<ValueDecl *, 16> Decls;
13023 Decls.reserve(UniqueDecls);
13024 for (unsigned i = 0; i < UniqueDecls; ++i)
13025 Decls.push_back(Record.readDeclAs<ValueDecl>());
13026 C->setUniqueDecls(Decls);
13027
13028 SmallVector<unsigned, 16> ListsPerDecl;
13029 ListsPerDecl.reserve(UniqueDecls);
13030 for (unsigned i = 0; i < UniqueDecls; ++i)
13031 ListsPerDecl.push_back(Record.readInt());
13032 C->setDeclNumLists(ListsPerDecl);
13033
13034 SmallVector<unsigned, 32> ListSizes;
13035 ListSizes.reserve(TotalLists);
13036 for (unsigned i = 0; i < TotalLists; ++i)
13037 ListSizes.push_back(Record.readInt());
13038 C->setComponentListSizes(ListSizes);
13039
13040 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13041 Components.reserve(TotalComponents);
13042 for (unsigned i = 0; i < TotalComponents; ++i) {
13043 auto *AssociatedExprPr = Record.readSubExpr();
13044 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13045 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
13046 /*IsNonContiguous=*/false);
13047 }
13048 C->setComponents(Components, ListSizes);
13049}
13050
13051void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
13052 C->setLParenLoc(Record.readSourceLocation());
13053 auto NumVars = C->varlist_size();
13054 auto UniqueDecls = C->getUniqueDeclarationsNum();
13055 auto TotalLists = C->getTotalComponentListNum();
13056 auto TotalComponents = C->getTotalComponentsNum();
13057
13058 SmallVector<Expr *, 16> Vars;
13059 Vars.reserve(NumVars);
13060 for (unsigned i = 0; i != NumVars; ++i)
13061 Vars.push_back(Record.readSubExpr());
13062 C->setVarRefs(Vars);
13063
13064 SmallVector<ValueDecl *, 16> Decls;
13065 Decls.reserve(UniqueDecls);
13066 for (unsigned i = 0; i < UniqueDecls; ++i)
13067 Decls.push_back(Record.readDeclAs<ValueDecl>());
13068 C->setUniqueDecls(Decls);
13069
13070 SmallVector<unsigned, 16> ListsPerDecl;
13071 ListsPerDecl.reserve(UniqueDecls);
13072 for (unsigned i = 0; i < UniqueDecls; ++i)
13073 ListsPerDecl.push_back(Record.readInt());
13074 C->setDeclNumLists(ListsPerDecl);
13075
13076 SmallVector<unsigned, 32> ListSizes;
13077 ListSizes.reserve(TotalLists);
13078 for (unsigned i = 0; i < TotalLists; ++i)
13079 ListSizes.push_back(Record.readInt());
13080 C->setComponentListSizes(ListSizes);
13081
13082 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13083 Components.reserve(TotalComponents);
13084 for (unsigned i = 0; i < TotalComponents; ++i) {
13085 Expr *AssociatedExpr = Record.readSubExpr();
13086 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13087 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13088 /*IsNonContiguous*/ false);
13089 }
13090 C->setComponents(Components, ListSizes);
13091}
13092
13093void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
13094 C->setLParenLoc(Record.readSourceLocation());
13095 auto NumVars = C->varlist_size();
13096 auto UniqueDecls = C->getUniqueDeclarationsNum();
13097 auto TotalLists = C->getTotalComponentListNum();
13098 auto TotalComponents = C->getTotalComponentsNum();
13099
13100 SmallVector<Expr *, 16> Vars;
13101 Vars.reserve(NumVars);
13102 for (unsigned i = 0; i != NumVars; ++i)
13103 Vars.push_back(Record.readSubExpr());
13104 C->setVarRefs(Vars);
13105 Vars.clear();
13106
13107 SmallVector<ValueDecl *, 16> Decls;
13108 Decls.reserve(UniqueDecls);
13109 for (unsigned i = 0; i < UniqueDecls; ++i)
13110 Decls.push_back(Record.readDeclAs<ValueDecl>());
13111 C->setUniqueDecls(Decls);
13112
13113 SmallVector<unsigned, 16> ListsPerDecl;
13114 ListsPerDecl.reserve(UniqueDecls);
13115 for (unsigned i = 0; i < UniqueDecls; ++i)
13116 ListsPerDecl.push_back(Record.readInt());
13117 C->setDeclNumLists(ListsPerDecl);
13118
13119 SmallVector<unsigned, 32> ListSizes;
13120 ListSizes.reserve(TotalLists);
13121 for (unsigned i = 0; i < TotalLists; ++i)
13122 ListSizes.push_back(Record.readInt());
13123 C->setComponentListSizes(ListSizes);
13124
13125 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13126 Components.reserve(TotalComponents);
13127 for (unsigned i = 0; i < TotalComponents; ++i) {
13128 Expr *AssociatedExpr = Record.readSubExpr();
13129 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13130 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13131 /*IsNonContiguous=*/false);
13132 }
13133 C->setComponents(Components, ListSizes);
13134}
13135
13136void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
13137 C->setLParenLoc(Record.readSourceLocation());
13138 auto NumVars = C->varlist_size();
13139 auto UniqueDecls = C->getUniqueDeclarationsNum();
13140 auto TotalLists = C->getTotalComponentListNum();
13141 auto TotalComponents = C->getTotalComponentsNum();
13142
13143 SmallVector<Expr *, 16> Vars;
13144 Vars.reserve(NumVars);
13145 for (unsigned I = 0; I != NumVars; ++I)
13146 Vars.push_back(Record.readSubExpr());
13147 C->setVarRefs(Vars);
13148 Vars.clear();
13149
13150 SmallVector<ValueDecl *, 16> Decls;
13151 Decls.reserve(UniqueDecls);
13152 for (unsigned I = 0; I < UniqueDecls; ++I)
13153 Decls.push_back(Record.readDeclAs<ValueDecl>());
13154 C->setUniqueDecls(Decls);
13155
13156 SmallVector<unsigned, 16> ListsPerDecl;
13157 ListsPerDecl.reserve(UniqueDecls);
13158 for (unsigned I = 0; I < UniqueDecls; ++I)
13159 ListsPerDecl.push_back(Record.readInt());
13160 C->setDeclNumLists(ListsPerDecl);
13161
13162 SmallVector<unsigned, 32> ListSizes;
13163 ListSizes.reserve(TotalLists);
13164 for (unsigned i = 0; i < TotalLists; ++i)
13165 ListSizes.push_back(Record.readInt());
13166 C->setComponentListSizes(ListSizes);
13167
13168 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13169 Components.reserve(TotalComponents);
13170 for (unsigned I = 0; I < TotalComponents; ++I) {
13171 Expr *AssociatedExpr = Record.readSubExpr();
13172 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13173 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13174 /*IsNonContiguous=*/false);
13175 }
13176 C->setComponents(Components, ListSizes);
13177}
13178
13179void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
13180 C->setLParenLoc(Record.readSourceLocation());
13181 unsigned NumVars = C->varlist_size();
13182 SmallVector<Expr *, 16> Vars;
13183 Vars.reserve(NumVars);
13184 for (unsigned i = 0; i != NumVars; ++i)
13185 Vars.push_back(Record.readSubExpr());
13186 C->setVarRefs(Vars);
13187 Vars.clear();
13188 Vars.reserve(NumVars);
13189 for (unsigned i = 0; i != NumVars; ++i)
13190 Vars.push_back(Record.readSubExpr());
13191 C->setPrivateRefs(Vars);
13192}
13193
13194void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
13195 C->setLParenLoc(Record.readSourceLocation());
13196 unsigned NumVars = C->varlist_size();
13197 SmallVector<Expr *, 16> Vars;
13198 Vars.reserve(NumVars);
13199 for (unsigned i = 0; i != NumVars; ++i)
13200 Vars.push_back(Record.readSubExpr());
13201 C->setVarRefs(Vars);
13202}
13203
13204void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
13205 C->setLParenLoc(Record.readSourceLocation());
13206 unsigned NumVars = C->varlist_size();
13207 SmallVector<Expr *, 16> Vars;
13208 Vars.reserve(NumVars);
13209 for (unsigned i = 0; i != NumVars; ++i)
13210 Vars.push_back(Record.readSubExpr());
13211 C->setVarRefs(Vars);
13212}
13213
13214void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
13215 C->setLParenLoc(Record.readSourceLocation());
13216 unsigned NumOfAllocators = C->getNumberOfAllocators();
13217 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
13218 Data.reserve(NumOfAllocators);
13219 for (unsigned I = 0; I != NumOfAllocators; ++I) {
13220 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
13221 D.Allocator = Record.readSubExpr();
13222 D.AllocatorTraits = Record.readSubExpr();
13223 D.LParenLoc = Record.readSourceLocation();
13224 D.RParenLoc = Record.readSourceLocation();
13225 }
13226 C->setAllocatorsData(Data);
13227}
13228
13229void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
13230 C->setLParenLoc(Record.readSourceLocation());
13231 C->setModifier(Record.readSubExpr());
13232 C->setColonLoc(Record.readSourceLocation());
13233 unsigned NumOfLocators = C->varlist_size();
13234 SmallVector<Expr *, 4> Locators;
13235 Locators.reserve(NumOfLocators);
13236 for (unsigned I = 0; I != NumOfLocators; ++I)
13237 Locators.push_back(Record.readSubExpr());
13238 C->setVarRefs(Locators);
13239}
13240
13241void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
13242 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
13243 C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
13244 C->setLParenLoc(Record.readSourceLocation());
13245 C->setKindKwLoc(Record.readSourceLocation());
13246 C->setModifierKwLoc(Record.readSourceLocation());
13247}
13248
13249void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
13251 C->setThreadID(Record.readSubExpr());
13252 C->setLParenLoc(Record.readSourceLocation());
13253}
13254
13255void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
13256 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
13257 C->setLParenLoc(Record.readSourceLocation());
13258 C->setBindKindLoc(Record.readSourceLocation());
13259}
13260
13261void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
13262 C->setAlignment(Record.readExpr());
13263 C->setLParenLoc(Record.readSourceLocation());
13264}
13265
13266void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
13268 C->setSize(Record.readSubExpr());
13269 C->setLParenLoc(Record.readSourceLocation());
13270}
13271
13272void OMPClauseReader::VisitOMPDynGroupprivateClause(
13273 OMPDynGroupprivateClause *C) {
13275 C->setDynGroupprivateModifier(
13276 Record.readEnum<OpenMPDynGroupprivateClauseModifier>());
13277 C->setDynGroupprivateFallbackModifier(
13279 C->setSize(Record.readSubExpr());
13280 C->setLParenLoc(Record.readSourceLocation());
13281 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13282 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13283}
13284
13285void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
13286 C->setLParenLoc(Record.readSourceLocation());
13287 C->setDependenceType(
13288 static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
13289 C->setDependenceLoc(Record.readSourceLocation());
13290 C->setColonLoc(Record.readSourceLocation());
13291 unsigned NumVars = C->varlist_size();
13292 SmallVector<Expr *, 16> Vars;
13293 Vars.reserve(NumVars);
13294 for (unsigned I = 0; I != NumVars; ++I)
13295 Vars.push_back(Record.readSubExpr());
13296 C->setVarRefs(Vars);
13297 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
13298 C->setLoopData(I, Record.readSubExpr());
13299}
13300
13301void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
13302 AttrVec Attrs;
13303 Record.readAttributes(Attrs);
13304 C->setAttrs(Attrs);
13305 C->setLocStart(Record.readSourceLocation());
13306 C->setLParenLoc(Record.readSourceLocation());
13307 C->setLocEnd(Record.readSourceLocation());
13308}
13309
13310void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
13311
13314 TI.Sets.resize(readUInt32());
13315 for (auto &Set : TI.Sets) {
13317 Set.Selectors.resize(readUInt32());
13318 for (auto &Selector : Set.Selectors) {
13320 Selector.ScoreOrCondition = nullptr;
13321 if (readBool())
13322 Selector.ScoreOrCondition = readExprRef();
13323 Selector.Properties.resize(readUInt32());
13324 for (auto &Property : Selector.Properties)
13326 }
13327 }
13328 return &TI;
13329}
13330
13332 if (!Data)
13333 return;
13334 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13335 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
13336 skipInts(3);
13337 }
13338 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
13339 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
13340 Clauses[I] = readOMPClause();
13341 Data->setClauses(Clauses);
13342 if (Data->hasAssociatedStmt())
13343 Data->setAssociatedStmt(readStmt());
13344 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
13345 Data->getChildren()[I] = readStmt();
13346}
13347
13349 unsigned NumVars = readInt();
13351 for (unsigned I = 0; I < NumVars; ++I)
13352 VarList.push_back(readExpr());
13353 return VarList;
13354}
13355
13357 unsigned NumExprs = readInt();
13359 for (unsigned I = 0; I < NumExprs; ++I)
13360 ExprList.push_back(readSubExpr());
13361 return ExprList;
13362}
13363
13368
13369 switch (ClauseKind) {
13371 SourceLocation LParenLoc = readSourceLocation();
13373 return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
13374 EndLoc);
13375 }
13376 case OpenACCClauseKind::If: {
13377 SourceLocation LParenLoc = readSourceLocation();
13378 Expr *CondExpr = readSubExpr();
13379 return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
13380 EndLoc);
13381 }
13383 SourceLocation LParenLoc = readSourceLocation();
13384 bool isConditionExprClause = readBool();
13385 if (isConditionExprClause) {
13386 Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
13387 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
13388 CondExpr, EndLoc);
13389 }
13390 unsigned NumVars = readInt();
13392 for (unsigned I = 0; I < NumVars; ++I)
13393 VarList.push_back(readSubExpr());
13394 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13395 EndLoc);
13396 }
13398 SourceLocation LParenLoc = readSourceLocation();
13399 unsigned NumClauses = readInt();
13401 for (unsigned I = 0; I < NumClauses; ++I)
13402 IntExprs.push_back(readSubExpr());
13403 return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
13404 IntExprs, EndLoc);
13405 }
13407 SourceLocation LParenLoc = readSourceLocation();
13408 Expr *IntExpr = readSubExpr();
13409 return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
13410 IntExpr, EndLoc);
13411 }
13413 SourceLocation LParenLoc = readSourceLocation();
13414 Expr *IntExpr = readSubExpr();
13415 return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
13416 IntExpr, EndLoc);
13417 }
13419 SourceLocation LParenLoc = readSourceLocation();
13420 Expr *IntExpr = readSubExpr();
13421 return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13422 IntExpr, EndLoc);
13423 }
13425 SourceLocation LParenLoc = readSourceLocation();
13426 Expr *IntExpr = readSubExpr();
13427 return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
13428 IntExpr, EndLoc);
13429 }
13431 SourceLocation LParenLoc = readSourceLocation();
13433
13435 for (unsigned I = 0; I < VarList.size(); ++I) {
13436 static_assert(sizeof(OpenACCPrivateRecipe) == 1 * sizeof(int *));
13437 VarDecl *Alloca = readDeclAs<VarDecl>();
13438 RecipeList.push_back({Alloca});
13439 }
13440
13441 return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13442 VarList, RecipeList, EndLoc);
13443 }
13445 SourceLocation LParenLoc = readSourceLocation();
13447 return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13448 EndLoc);
13449 }
13451 SourceLocation LParenLoc = readSourceLocation();
13453 return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13454 VarList, EndLoc);
13455 }
13457 SourceLocation LParenLoc = readSourceLocation();
13460 for (unsigned I = 0; I < VarList.size(); ++I) {
13461 static_assert(sizeof(OpenACCFirstPrivateRecipe) == 2 * sizeof(int *));
13462 VarDecl *Recipe = readDeclAs<VarDecl>();
13463 VarDecl *RecipeTemp = readDeclAs<VarDecl>();
13464 RecipeList.push_back({Recipe, RecipeTemp});
13465 }
13466
13467 return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13468 VarList, RecipeList, EndLoc);
13469 }
13471 SourceLocation LParenLoc = readSourceLocation();
13473 return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
13474 VarList, EndLoc);
13475 }
13477 SourceLocation LParenLoc = readSourceLocation();
13479 return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
13480 VarList, EndLoc);
13481 }
13483 SourceLocation LParenLoc = readSourceLocation();
13485 return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
13486 VarList, EndLoc);
13487 }
13489 SourceLocation LParenLoc = readSourceLocation();
13491 return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13492 VarList, EndLoc);
13493 }
13495 SourceLocation LParenLoc = readSourceLocation();
13497 return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
13498 VarList, EndLoc);
13499 }
13501 SourceLocation LParenLoc = readSourceLocation();
13503 return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
13504 VarList, EndLoc);
13505 }
13507 SourceLocation LParenLoc = readSourceLocation();
13509 return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
13510 VarList, EndLoc);
13511 }
13515 SourceLocation LParenLoc = readSourceLocation();
13518 return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
13519 LParenLoc, ModList, VarList, EndLoc);
13520 }
13524 SourceLocation LParenLoc = readSourceLocation();
13527 return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
13528 LParenLoc, ModList, VarList, EndLoc);
13529 }
13533 SourceLocation LParenLoc = readSourceLocation();
13536 return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
13537 LParenLoc, ModList, VarList, EndLoc);
13538 }
13542 SourceLocation LParenLoc = readSourceLocation();
13545 return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
13546 LParenLoc, ModList, VarList, EndLoc);
13547 }
13549 SourceLocation LParenLoc = readSourceLocation();
13550 Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
13551 return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13552 AsyncExpr, EndLoc);
13553 }
13555 SourceLocation LParenLoc = readSourceLocation();
13556 Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
13557 SourceLocation QueuesLoc = readSourceLocation();
13559 return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
13560 DevNumExpr, QueuesLoc, QueueIdExprs,
13561 EndLoc);
13562 }
13565 SourceLocation LParenLoc = readSourceLocation();
13567 unsigned NumArchs = readInt();
13568
13569 for (unsigned I = 0; I < NumArchs; ++I) {
13570 IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
13572 Archs.emplace_back(Loc, Ident);
13573 }
13574
13575 return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
13576 LParenLoc, Archs, EndLoc);
13577 }
13579 SourceLocation LParenLoc = readSourceLocation();
13583
13584 for (unsigned I = 0; I < VarList.size(); ++I) {
13585 VarDecl *Recipe = readDeclAs<VarDecl>();
13586
13587 static_assert(sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
13588 3 * sizeof(int *));
13589
13591 unsigned NumCombiners = readInt();
13592 for (unsigned I = 0; I < NumCombiners; ++I) {
13595 Expr *Op = readExpr();
13596
13597 Combiners.push_back({LHS, RHS, Op});
13598 }
13599
13600 RecipeList.push_back({Recipe, Combiners});
13601 }
13602
13603 return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
13604 VarList, RecipeList, EndLoc);
13605 }
13607 return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
13609 return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
13611 return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
13613 return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
13615 return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
13617 return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
13619 SourceLocation LParenLoc = readSourceLocation();
13620 bool HasForce = readBool();
13621 Expr *LoopCount = readSubExpr();
13622 return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
13623 HasForce, LoopCount, EndLoc);
13624 }
13626 SourceLocation LParenLoc = readSourceLocation();
13627 unsigned NumClauses = readInt();
13628 llvm::SmallVector<Expr *> SizeExprs;
13629 for (unsigned I = 0; I < NumClauses; ++I)
13630 SizeExprs.push_back(readSubExpr());
13631 return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
13632 SizeExprs, EndLoc);
13633 }
13635 SourceLocation LParenLoc = readSourceLocation();
13636 unsigned NumExprs = readInt();
13639 for (unsigned I = 0; I < NumExprs; ++I) {
13640 GangKinds.push_back(readEnum<OpenACCGangKind>());
13641 // Can't use `readSubExpr` because this is usable from a 'decl' construct.
13642 Exprs.push_back(readExpr());
13643 }
13644 return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
13645 GangKinds, Exprs, EndLoc);
13646 }
13648 SourceLocation LParenLoc = readSourceLocation();
13649 Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
13650 return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
13651 WorkerExpr, EndLoc);
13652 }
13654 SourceLocation LParenLoc = readSourceLocation();
13655 Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
13656 return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
13657 VectorExpr, EndLoc);
13658 }
13660 SourceLocation LParenLoc = readSourceLocation();
13662 return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13663 EndLoc);
13664 }
13666 SourceLocation LParenLoc = readSourceLocation();
13669 LParenLoc, VarList, EndLoc);
13670 }
13671
13673 SourceLocation LParenLoc = readSourceLocation();
13674 bool IsString = readBool();
13675 if (IsString)
13676 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13677 cast<StringLiteral>(readExpr()), EndLoc);
13678 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13679 readIdentifier(), EndLoc);
13680 }
13683 llvm_unreachable("Clause serialization not yet implemented");
13684 }
13685 llvm_unreachable("Invalid Clause Kind");
13686}
13687
13690 for (unsigned I = 0; I < Clauses.size(); ++I)
13691 Clauses[I] = readOpenACCClause();
13692}
13693
13694void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
13695 unsigned NumVars = readInt();
13696 A->Clauses.resize(NumVars);
13697 readOpenACCClauseList(A->Clauses);
13698}
13699
13700static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
13701 // TODO: Maybe it is better to check PrimaryModuleName is a valid
13702 // module name?
13703 llvm::FoldingSetNodeID ID;
13704 ID.AddString(PrimaryModuleName);
13705 return ID.computeStableHash();
13706}
13707
13709 if (!M)
13710 return std::nullopt;
13711
13712 if (M->isHeaderLikeModule())
13713 return std::nullopt;
13714
13715 if (M->isGlobalModule())
13716 return std::nullopt;
13717
13718 StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
13719 return getStableHashForModuleName(PrimaryModuleName);
13720}
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:245
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:909
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
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
Definition DeclCXX.h:771
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
Definition DeclCXX.h:899
base_class_iterator bases_begin()
Definition DeclCXX.h:616
base_class_iterator vbases_begin()
Definition DeclCXX.h:633
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
Definition DeclCXX.h:805
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
Definition DeclCXX.h:1017
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
Definition DeclCXX.h:992
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
Definition DeclCXX.h:933
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:2744
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:2717
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2732
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
Definition DeclBase.h:2425
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:2417
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition DeclBase.h:2738
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
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:2758
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:3299
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:3606
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.
static void canonicalizeDirectoryDependency(const FileManager &FileMgr, SmallVectorImpl< char > &Path)
Spell Path the way directory dependencies are recorded: absolute, with dots removed.
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:3620
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:3701
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
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __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