clang 23.0.0git
ASTReader.cpp
Go to the documentation of this file.
1//===- ASTReader.cpp - AST File Reader ------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the ASTReader class, which reads AST files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ASTCommon.h"
14#include "ASTReaderInternals.h"
22#include "clang/AST/Attr.h"
23#include "clang/AST/Decl.h"
24#include "clang/AST/DeclBase.h"
25#include "clang/AST/DeclCXX.h"
27#include "clang/AST/DeclGroup.h"
28#include "clang/AST/DeclObjC.h"
31#include "clang/AST/Expr.h"
32#include "clang/AST/ExprCXX.h"
41#include "clang/AST/Type.h"
42#include "clang/AST/TypeLoc.h"
54#include "clang/Basic/LLVM.h"
56#include "clang/Basic/Module.h"
70#include "clang/Basic/Version.h"
73#include "clang/Lex/MacroInfo.h"
74#include "clang/Lex/ModuleMap.h"
78#include "clang/Lex/Token.h"
80#include "clang/Sema/Scope.h"
81#include "clang/Sema/Sema.h"
82#include "clang/Sema/SemaCUDA.h"
83#include "clang/Sema/SemaObjC.h"
84#include "clang/Sema/Weak.h"
97#include "llvm/ADT/APFloat.h"
98#include "llvm/ADT/APInt.h"
99#include "llvm/ADT/ArrayRef.h"
100#include "llvm/ADT/DenseMap.h"
101#include "llvm/ADT/FoldingSet.h"
102#include "llvm/ADT/IntrusiveRefCntPtr.h"
103#include "llvm/ADT/STLExtras.h"
104#include "llvm/ADT/ScopeExit.h"
105#include "llvm/ADT/Sequence.h"
106#include "llvm/ADT/SmallPtrSet.h"
107#include "llvm/ADT/SmallVector.h"
108#include "llvm/ADT/StringExtras.h"
109#include "llvm/ADT/StringMap.h"
110#include "llvm/ADT/StringRef.h"
111#include "llvm/ADT/iterator_range.h"
112#include "llvm/Bitstream/BitstreamReader.h"
113#include "llvm/Support/Compiler.h"
114#include "llvm/Support/Compression.h"
115#include "llvm/Support/DJB.h"
116#include "llvm/Support/Endian.h"
117#include "llvm/Support/Error.h"
118#include "llvm/Support/ErrorHandling.h"
119#include "llvm/Support/LEB128.h"
120#include "llvm/Support/MemoryBuffer.h"
121#include "llvm/Support/Path.h"
122#include "llvm/Support/SaveAndRestore.h"
123#include "llvm/Support/TimeProfiler.h"
124#include "llvm/Support/Timer.h"
125#include "llvm/Support/VersionTuple.h"
126#include "llvm/Support/raw_ostream.h"
127#include "llvm/TargetParser/Triple.h"
128#include <algorithm>
129#include <cassert>
130#include <cstddef>
131#include <cstdint>
132#include <cstdio>
133#include <ctime>
134#include <iterator>
135#include <limits>
136#include <map>
137#include <memory>
138#include <optional>
139#include <string>
140#include <system_error>
141#include <tuple>
142#include <utility>
143#include <vector>
144
145using namespace clang;
146using namespace clang::serialization;
147using namespace clang::serialization::reader;
148using llvm::BitstreamCursor;
149
150//===----------------------------------------------------------------------===//
151// ChainedASTReaderListener implementation
152//===----------------------------------------------------------------------===//
153
154bool
156 return First->ReadFullVersionInformation(FullVersion) ||
157 Second->ReadFullVersionInformation(FullVersion);
158}
159
161 First->ReadModuleName(ModuleName);
162 Second->ReadModuleName(ModuleName);
163}
164
165void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
166 First->ReadModuleMapFile(ModuleMapPath);
167 Second->ReadModuleMapFile(ModuleMapPath);
168}
169
171 const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain,
172 bool AllowCompatibleDifferences) {
173 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
174 AllowCompatibleDifferences) ||
175 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
176 AllowCompatibleDifferences);
177}
178
180 const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain,
181 bool AllowCompatibleDifferences) {
182 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
183 AllowCompatibleDifferences) ||
184 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
185 AllowCompatibleDifferences);
186}
187
189 const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain,
190 bool AllowCompatibleDifferences) {
191 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
192 AllowCompatibleDifferences) ||
193 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
194 AllowCompatibleDifferences);
195}
196
198 DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) {
199 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
200 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
201}
202
203bool
205 bool Complain) {
206 return First->ReadFileSystemOptions(FSOpts, Complain) ||
207 Second->ReadFileSystemOptions(FSOpts, Complain);
208}
209
211 const HeaderSearchOptions &HSOpts, StringRef ModuleFilename,
212 StringRef ContextHash, bool Complain) {
213 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
214 Complain) ||
215 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
216 Complain);
217}
218
220 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
221 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
222 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
223 Complain, SuggestedPredefines) ||
224 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
225 Complain, SuggestedPredefines);
226}
227
229 uint32_t Value) {
230 First->ReadCounter(M, Value);
231 Second->ReadCounter(M, Value);
232}
233
235 return First->needsInputFileVisitation() ||
236 Second->needsInputFileVisitation();
237}
238
240 return First->needsSystemInputFileVisitation() ||
241 Second->needsSystemInputFileVisitation();
242}
243
245 ModuleKind Kind,
246 bool DirectlyImported) {
247 First->visitModuleFile(Filename, Kind, DirectlyImported);
248 Second->visitModuleFile(Filename, Kind, DirectlyImported);
249}
250
252 bool isSystem,
253 bool isOverridden,
254 bool isExplicitModule) {
255 bool Continue = false;
256 if (First->needsInputFileVisitation() &&
257 (!isSystem || First->needsSystemInputFileVisitation()))
258 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
259 isExplicitModule);
260 if (Second->needsInputFileVisitation() &&
261 (!isSystem || Second->needsSystemInputFileVisitation()))
262 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
263 isExplicitModule);
264 return Continue;
265}
266
268 const ModuleFileExtensionMetadata &Metadata) {
269 First->readModuleFileExtension(Metadata);
270 Second->readModuleFileExtension(Metadata);
271}
272
273//===----------------------------------------------------------------------===//
274// PCH validator implementation
275//===----------------------------------------------------------------------===//
276
278
279/// Compare the given set of language options against an existing set of
280/// language options.
281///
282/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
283/// \param AllowCompatibleDifferences If true, differences between compatible
284/// language options will be permitted.
285///
286/// \returns true if the languagae options mis-match, false otherwise.
287static bool checkLanguageOptions(const LangOptions &LangOpts,
288 const LangOptions &ExistingLangOpts,
289 StringRef ModuleFilename,
290 DiagnosticsEngine *Diags,
291 bool AllowCompatibleDifferences = true) {
292 // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
294
295#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
296 if constexpr (CK::Compatibility != CK::Benign) { \
297 if ((CK::Compatibility == CK::NotCompatible) || \
298 (CK::Compatibility == CK::Compatible && \
299 !AllowCompatibleDifferences)) { \
300 if (ExistingLangOpts.Name != LangOpts.Name) { \
301 if (Diags) { \
302 if (Bits == 1) \
303 Diags->Report(diag::err_ast_file_langopt_mismatch) \
304 << Description << LangOpts.Name << ExistingLangOpts.Name \
305 << ModuleFilename; \
306 else \
307 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
308 << Description << ModuleFilename; \
309 } \
310 return true; \
311 } \
312 } \
313 }
314
315#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
316 if constexpr (CK::Compatibility != CK::Benign) { \
317 if ((CK::Compatibility == CK::NotCompatible) || \
318 (CK::Compatibility == CK::Compatible && \
319 !AllowCompatibleDifferences)) { \
320 if (ExistingLangOpts.Name != LangOpts.Name) { \
321 if (Diags) \
322 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
323 << Description << ModuleFilename; \
324 return true; \
325 } \
326 } \
327 }
328
329#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
330 if constexpr (CK::Compatibility != CK::Benign) { \
331 if ((CK::Compatibility == CK::NotCompatible) || \
332 (CK::Compatibility == CK::Compatible && \
333 !AllowCompatibleDifferences)) { \
334 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
335 if (Diags) \
336 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
337 << Description << ModuleFilename; \
338 return true; \
339 } \
340 } \
341 }
342
343#include "clang/Basic/LangOptions.def"
344
345 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
346 if (Diags)
347 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
348 << "module features" << ModuleFilename;
349 return true;
350 }
351
352 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
353 if (Diags)
354 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
355 << "target Objective-C runtime" << ModuleFilename;
356 return true;
357 }
358
359 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
361 if (Diags)
362 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
363 << "block command names" << ModuleFilename;
364 return true;
365 }
366
367 // Sanitizer feature mismatches are treated as compatible differences. If
368 // compatible differences aren't allowed, we still only want to check for
369 // mismatches of non-modular sanitizers (the only ones which can affect AST
370 // generation).
371 if (!AllowCompatibleDifferences) {
372 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
373 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
374 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
375 ExistingSanitizers.clear(ModularSanitizers);
376 ImportedSanitizers.clear(ModularSanitizers);
377 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
378 const std::string Flag = "-fsanitize=";
379 if (Diags) {
380#define SANITIZER(NAME, ID) \
381 { \
382 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
383 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
384 if (InExistingModule != InImportedModule) \
385 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
386 << InExistingModule << ModuleFilename << (Flag + NAME); \
387 }
388#include "clang/Basic/Sanitizers.def"
389 }
390 return true;
391 }
392 }
393
394 return false;
395}
396
397static bool checkCodegenOptions(const CodeGenOptions &CGOpts,
398 const CodeGenOptions &ExistingCGOpts,
399 StringRef ModuleFilename,
400 DiagnosticsEngine *Diags,
401 bool AllowCompatibleDifferences = true) {
402 // FIXME: Specify and print a description for each option instead of the name.
403 // FIXME: Replace with C++20 `using enum CodeGenOptions::CompatibilityKind`.
405#define CODEGENOPT(Name, Bits, Default, Compatibility) \
406 if constexpr (CK::Compatibility != CK::Benign) { \
407 if ((CK::Compatibility == CK::NotCompatible) || \
408 (CK::Compatibility == CK::Compatible && \
409 !AllowCompatibleDifferences)) { \
410 if (ExistingCGOpts.Name != CGOpts.Name) { \
411 if (Diags) { \
412 if (Bits == 1) \
413 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
414 << #Name << CGOpts.Name << ExistingCGOpts.Name \
415 << ModuleFilename; \
416 else \
417 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
418 << #Name << ModuleFilename; \
419 } \
420 return true; \
421 } \
422 } \
423 }
424
425#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
426 if constexpr (CK::Compatibility != CK::Benign) { \
427 if ((CK::Compatibility == CK::NotCompatible) || \
428 (CK::Compatibility == CK::Compatible && \
429 !AllowCompatibleDifferences)) { \
430 if (ExistingCGOpts.Name != CGOpts.Name) { \
431 if (Diags) \
432 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
433 << #Name << ModuleFilename; \
434 return true; \
435 } \
436 } \
437 }
438#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
439 if constexpr (CK::Compatibility != CK::Benign) { \
440 if ((CK::Compatibility == CK::NotCompatible) || \
441 (CK::Compatibility == CK::Compatible && \
442 !AllowCompatibleDifferences)) { \
443 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
444 if (Diags) \
445 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
446 << #Name << ModuleFilename; \
447 return true; \
448 } \
449 } \
450 }
451#define DEBUGOPT(Name, Bits, Default, Compatibility)
452#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
453#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
454#include "clang/Basic/CodeGenOptions.def"
455
456 return false;
457}
458
459static std::vector<std::string>
460accumulateFeaturesAsWritten(std::vector<std::string> FeaturesAsWritten) {
461 llvm::erase_if(FeaturesAsWritten, [](const std::string &S) {
462 return S.empty() || (S[0] != '+' && S[0] != '-');
463 });
464 llvm::stable_sort(FeaturesAsWritten,
465 [](const std::string &A, const std::string &B) {
466 return A.substr(1) < B.substr(1);
467 });
468 auto NewRend =
469 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
470 [](const std::string &A, const std::string &B) {
471 return A.substr(1) == B.substr(1);
472 });
473 // Because we are operating on reverse iterators, the duplicate elements
474 // are actually at the beginning.
475 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
476 return FeaturesAsWritten;
477}
478
479/// Compare the given set of target options against an existing set of
480/// target options.
481///
482/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
483///
484/// \returns true if the target options mis-match, false otherwise.
485static bool checkTargetOptions(const TargetOptions &TargetOpts,
486 const TargetOptions &ExistingTargetOpts,
487 StringRef ModuleFilename,
488 DiagnosticsEngine *Diags,
489 bool AllowCompatibleDifferences = true) {
490#define CHECK_TARGET_OPT(Field, Name) \
491 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
492 if (Diags) \
493 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
494 << ModuleFilename << Name << TargetOpts.Field \
495 << ExistingTargetOpts.Field; \
496 return true; \
497 }
498
499 // The triple and ABI must match exactly.
500 CHECK_TARGET_OPT(Triple, "target");
501 CHECK_TARGET_OPT(ABI, "target ABI");
502
503 // We can tolerate different CPUs in many cases, notably when one CPU
504 // supports a strict superset of another. When allowing compatible
505 // differences skip this check.
506 if (!AllowCompatibleDifferences) {
507 CHECK_TARGET_OPT(CPU, "target CPU");
508 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
509 }
510
511#undef CHECK_TARGET_OPT
512
513 // Compare feature sets.
514 // Alternatively, we could be diffing TargetOpts.Features, but that would
515 // clutter the output with implied features.
516 std::vector<std::string> ExistingFeatures =
518 std::vector<std::string> ReadFeatures =
520
521 // We compute the set difference in both directions explicitly so that we can
522 // diagnose the differences differently.
523 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
524 std::set_difference(
525 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
526 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
527 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
528 ExistingFeatures.begin(), ExistingFeatures.end(),
529 std::back_inserter(UnmatchedReadFeatures));
530
531 // If we are allowing compatible differences and the read feature set is
532 // a strict subset of the existing feature set, there is nothing to diagnose.
533 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
534 return false;
535
536 if (Diags) {
537 for (StringRef Feature : UnmatchedReadFeatures)
538 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
539 << /* is-existing-feature */ false << ModuleFilename << Feature;
540 for (StringRef Feature : UnmatchedExistingFeatures)
541 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
542 << /* is-existing-feature */ true << ModuleFilename << Feature;
543 }
544
545 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
546}
547
549 StringRef ModuleFilename, bool Complain,
550 bool AllowCompatibleDifferences) {
551 const LangOptions &ExistingLangOpts = PP.getLangOpts();
552 return checkLanguageOptions(LangOpts, ExistingLangOpts, ModuleFilename,
553 Complain ? &Reader.Diags : nullptr,
554 AllowCompatibleDifferences);
555}
556
558 StringRef ModuleFilename, bool Complain,
559 bool AllowCompatibleDifferences) {
560 const CodeGenOptions &ExistingCGOpts = Reader.getCodeGenOpts();
561 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
562 Complain ? &Reader.Diags : nullptr,
563 AllowCompatibleDifferences);
564}
565
567 StringRef ModuleFilename, bool Complain,
568 bool AllowCompatibleDifferences) {
569 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
570 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
571 Complain ? &Reader.Diags : nullptr,
572 AllowCompatibleDifferences);
573}
574
575namespace {
576
577using MacroDefinitionsMap =
578 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
579
580class DeclsSet {
583
584public:
585 operator ArrayRef<NamedDecl *>() const { return Decls; }
586
587 bool empty() const { return Decls.empty(); }
588
589 bool insert(NamedDecl *ND) {
590 auto [_, Inserted] = Found.insert(ND);
591 if (Inserted)
592 Decls.push_back(ND);
593 return Inserted;
594 }
595};
596
597using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
598
599} // namespace
600
602 DiagnosticsEngine &Diags,
603 StringRef ModuleFilename,
604 bool Complain) {
605 using Level = DiagnosticsEngine::Level;
606
607 // Check current mappings for new -Werror mappings, and the stored mappings
608 // for cases that were explicitly mapped to *not* be errors that are now
609 // errors because of options like -Werror.
610 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
611
612 for (DiagnosticsEngine *MappingSource : MappingSources) {
613 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
614 diag::kind DiagID = DiagIDMappingPair.first;
615 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
616 if (CurLevel < DiagnosticsEngine::Error)
617 continue; // not significant
618 Level StoredLevel =
619 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
620 if (StoredLevel < DiagnosticsEngine::Error) {
621 if (Complain)
622 Diags.Report(diag::err_ast_file_diagopt_mismatch)
623 << "-Werror=" + Diags.getDiagnosticIDs()
624 ->getWarningOptionForDiag(DiagID)
625 .str()
626 << ModuleFilename;
627 return true;
628 }
629 }
630 }
631
632 return false;
633}
634
637 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
638 return true;
639 return Ext >= diag::Severity::Error;
640}
641
643 DiagnosticsEngine &Diags,
644 StringRef ModuleFilename, bool IsSystem,
645 bool SystemHeaderWarningsInModule,
646 bool Complain) {
647 // Top-level options
648 if (IsSystem) {
649 if (Diags.getSuppressSystemWarnings())
650 return false;
651 // If -Wsystem-headers was not enabled before, and it was not explicit,
652 // be conservative
653 if (StoredDiags.getSuppressSystemWarnings() &&
654 !SystemHeaderWarningsInModule) {
655 if (Complain)
656 Diags.Report(diag::err_ast_file_diagopt_mismatch)
657 << "-Wsystem-headers" << ModuleFilename;
658 return true;
659 }
660 }
661
662 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
663 if (Complain)
664 Diags.Report(diag::err_ast_file_diagopt_mismatch)
665 << "-Werror" << ModuleFilename;
666 return true;
667 }
668
669 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
670 !StoredDiags.getEnableAllWarnings()) {
671 if (Complain)
672 Diags.Report(diag::err_ast_file_diagopt_mismatch)
673 << "-Weverything -Werror" << ModuleFilename;
674 return true;
675 }
676
677 if (isExtHandlingFromDiagsError(Diags) &&
678 !isExtHandlingFromDiagsError(StoredDiags)) {
679 if (Complain)
680 Diags.Report(diag::err_ast_file_diagopt_mismatch)
681 << "-pedantic-errors" << ModuleFilename;
682 return true;
683 }
684
685 return checkDiagnosticGroupMappings(StoredDiags, Diags, ModuleFilename,
686 Complain);
687}
688
689/// Return the top import module if it is implicit, nullptr otherwise.
691 Preprocessor &PP) {
692 // If the original import came from a file explicitly generated by the user,
693 // don't check the diagnostic mappings.
694 // FIXME: currently this is approximated by checking whether this is not a
695 // module import of an implicitly-loaded module file.
696 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
697 // the transitive closure of its imports, since unrelated modules cannot be
698 // imported until after this module finishes validation.
699 ModuleFile *TopImport = &*ModuleMgr.rbegin();
700 while (!TopImport->ImportedBy.empty())
701 TopImport = TopImport->ImportedBy[0];
702 if (TopImport->Kind != MK_ImplicitModule)
703 return nullptr;
704
705 StringRef ModuleName = TopImport->ModuleName;
706 assert(!ModuleName.empty() && "diagnostic options read before module name");
707
708 Module *M =
709 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
710 assert(M && "missing module");
711 return M;
712}
713
715 StringRef ModuleFilename,
716 bool Complain) {
717 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
719 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
720 // This should never fail, because we would have processed these options
721 // before writing them to an ASTFile.
722 ProcessWarningOptions(*Diags, DiagOpts,
723 PP.getFileManager().getVirtualFileSystem(),
724 /*Report*/ false);
725
726 ModuleManager &ModuleMgr = Reader.getModuleManager();
727 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
728
729 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
730 if (!TopM)
731 return false;
732
733 Module *Importer = PP.getCurrentModule();
734
735 DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
736 bool SystemHeaderWarningsInModule =
737 Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
738 Importer->Name);
739
740 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
741 // contains the union of their flags.
742 return checkDiagnosticMappings(*Diags, ExistingDiags, ModuleFilename,
743 TopM->IsSystem, SystemHeaderWarningsInModule,
744 Complain);
745}
746
747/// Collect the macro definitions provided by the given preprocessor
748/// options.
749static void
751 MacroDefinitionsMap &Macros,
752 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
753 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
754 StringRef Macro = PPOpts.Macros[I].first;
755 bool IsUndef = PPOpts.Macros[I].second;
756
757 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
758 StringRef MacroName = MacroPair.first;
759 StringRef MacroBody = MacroPair.second;
760
761 // For an #undef'd macro, we only care about the name.
762 if (IsUndef) {
763 auto [It, Inserted] = Macros.try_emplace(MacroName);
764 if (MacroNames && Inserted)
765 MacroNames->push_back(MacroName);
766
767 It->second = std::make_pair("", true);
768 continue;
769 }
770
771 // For a #define'd macro, figure out the actual definition.
772 if (MacroName.size() == Macro.size())
773 MacroBody = "1";
774 else {
775 // Note: GCC drops anything following an end-of-line character.
776 StringRef::size_type End = MacroBody.find_first_of("\n\r");
777 MacroBody = MacroBody.substr(0, End);
778 }
779
780 auto [It, Inserted] = Macros.try_emplace(MacroName);
781 if (MacroNames && Inserted)
782 MacroNames->push_back(MacroName);
783 It->second = std::make_pair(MacroBody, false);
784 }
785}
786
792
793/// Check the preprocessor options deserialized from the control block
794/// against the preprocessor options in an existing preprocessor.
795///
796/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
797/// \param Validation If set to OptionValidateNone, ignore differences in
798/// preprocessor options. If set to OptionValidateContradictions,
799/// require that options passed both in the AST file and on the command
800/// line (-D or -U) match, but tolerate options missing in one or the
801/// other. If set to OptionValidateContradictions, require that there
802/// are no differences in the options between the two.
804 const PreprocessorOptions &PPOpts,
805 const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename,
806 bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr,
807 std::string &SuggestedPredefines, const LangOptions &LangOpts,
809 if (ReadMacros) {
810 // Check macro definitions.
811 MacroDefinitionsMap ASTFileMacros;
812 collectMacroDefinitions(PPOpts, ASTFileMacros);
813 MacroDefinitionsMap ExistingMacros;
814 SmallVector<StringRef, 4> ExistingMacroNames;
815 collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
816 &ExistingMacroNames);
817
818 // Use a line marker to enter the <command line> file, as the defines and
819 // undefines here will have come from the command line.
820 SuggestedPredefines += "# 1 \"<command line>\" 1\n";
821
822 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
823 // Dig out the macro definition in the existing preprocessor options.
824 StringRef MacroName = ExistingMacroNames[I];
825 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
826
827 // Check whether we know anything about this macro name or not.
828 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
829 ASTFileMacros.find(MacroName);
830 if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
831 if (Validation == OptionValidateStrictMatches) {
832 // If strict matches are requested, don't tolerate any extra defines
833 // on the command line that are missing in the AST file.
834 if (Diags) {
835 Diags->Report(diag::err_ast_file_macro_def_undef)
836 << MacroName << true << ModuleFilename;
837 }
838 return true;
839 }
840 // FIXME: Check whether this identifier was referenced anywhere in the
841 // AST file. If so, we should reject the AST file. Unfortunately, this
842 // information isn't in the control block. What shall we do about it?
843
844 if (Existing.second) {
845 SuggestedPredefines += "#undef ";
846 SuggestedPredefines += MacroName.str();
847 SuggestedPredefines += '\n';
848 } else {
849 SuggestedPredefines += "#define ";
850 SuggestedPredefines += MacroName.str();
851 SuggestedPredefines += ' ';
852 SuggestedPredefines += Existing.first.str();
853 SuggestedPredefines += '\n';
854 }
855 continue;
856 }
857
858 // If the macro was defined in one but undef'd in the other, we have a
859 // conflict.
860 if (Existing.second != Known->second.second) {
861 if (Diags) {
862 Diags->Report(diag::err_ast_file_macro_def_undef)
863 << MacroName << Known->second.second << ModuleFilename;
864 }
865 return true;
866 }
867
868 // If the macro was #undef'd in both, or if the macro bodies are
869 // identical, it's fine.
870 if (Existing.second || Existing.first == Known->second.first) {
871 ASTFileMacros.erase(Known);
872 continue;
873 }
874
875 // The macro bodies differ; complain.
876 if (Diags) {
877 Diags->Report(diag::err_ast_file_macro_def_conflict)
878 << MacroName << Known->second.first << Existing.first
879 << ModuleFilename;
880 }
881 return true;
882 }
883
884 // Leave the <command line> file and return to <built-in>.
885 SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
886
887 if (Validation == OptionValidateStrictMatches) {
888 // If strict matches are requested, don't tolerate any extra defines in
889 // the AST file that are missing on the command line.
890 for (const auto &MacroName : ASTFileMacros.keys()) {
891 if (Diags) {
892 Diags->Report(diag::err_ast_file_macro_def_undef)
893 << MacroName << false << ModuleFilename;
894 }
895 return true;
896 }
897 }
898 }
899
900 // Check whether we're using predefines.
901 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
902 Validation != OptionValidateNone) {
903 if (Diags) {
904 Diags->Report(diag::err_ast_file_undef)
905 << ExistingPPOpts.UsePredefines << ModuleFilename;
906 }
907 return true;
908 }
909
910 // Detailed record is important since it is used for the module cache hash.
911 if (LangOpts.Modules &&
912 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
913 Validation != OptionValidateNone) {
914 if (Diags) {
915 Diags->Report(diag::err_ast_file_pp_detailed_record)
916 << PPOpts.DetailedRecord << ModuleFilename;
917 }
918 return true;
919 }
920
921 // Compute the #include and #include_macros lines we need.
922 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
923 StringRef File = ExistingPPOpts.Includes[I];
924
925 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
926 !ExistingPPOpts.PCHThroughHeader.empty()) {
927 // In case the through header is an include, we must add all the includes
928 // to the predefines so the start point can be determined.
929 SuggestedPredefines += "#include \"";
930 SuggestedPredefines += File;
931 SuggestedPredefines += "\"\n";
932 continue;
933 }
934
935 if (File == ExistingPPOpts.ImplicitPCHInclude)
936 continue;
937
938 if (llvm::is_contained(PPOpts.Includes, File))
939 continue;
940
941 SuggestedPredefines += "#include \"";
942 SuggestedPredefines += File;
943 SuggestedPredefines += "\"\n";
944 }
945
946 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
947 StringRef File = ExistingPPOpts.MacroIncludes[I];
948 if (llvm::is_contained(PPOpts.MacroIncludes, File))
949 continue;
950
951 SuggestedPredefines += "#__include_macros \"";
952 SuggestedPredefines += File;
953 SuggestedPredefines += "\"\n##\n";
954 }
955
956 return false;
957}
958
960 StringRef ModuleFilename,
961 bool ReadMacros, bool Complain,
962 std::string &SuggestedPredefines) {
963 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
964
966 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
967 Complain ? &Reader.Diags : nullptr, PP.getFileManager(),
968 SuggestedPredefines, PP.getLangOpts());
969}
970
972 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
973 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
974 return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(),
975 ModuleFilename, ReadMacros, nullptr,
976 PP.getFileManager(), SuggestedPredefines,
977 PP.getLangOpts(), OptionValidateNone);
978}
979
980/// Check that the specified and the existing module cache paths are equivalent.
981///
982/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
983/// \returns true when the module cache paths differ.
984static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash,
985 StringRef ExistingSpecificModuleCachePath,
986 StringRef ASTFilename,
987 DiagnosticsEngine *Diags,
988 const LangOptions &LangOpts,
989 const PreprocessorOptions &PPOpts,
990 const HeaderSearchOptions &HSOpts,
991 const HeaderSearchOptions &ASTFileHSOpts) {
992 std::string SpecificModuleCachePath = createSpecificModuleCachePath(
993 FileMgr, ASTFileHSOpts.ModuleCachePath, ASTFileHSOpts.DisableModuleHash,
994 std::string(ContextHash));
995
996 if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
997 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
998 return false;
999 auto EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1000 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1001 if (EqualOrErr && *EqualOrErr)
1002 return false;
1003 if (Diags) {
1004 // If the module cache arguments provided from the command line are the
1005 // same, the mismatch must come from other arguments of the configuration
1006 // and not directly the cache path.
1007 EqualOrErr = FileMgr.getVirtualFileSystem().equivalent(
1008 ASTFileHSOpts.ModuleCachePath, HSOpts.ModuleCachePath);
1009 if (EqualOrErr && *EqualOrErr)
1010 Diags->Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1011 else
1012 Diags->Report(diag::err_ast_file_modulecache_mismatch)
1013 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1014 << ASTFilename;
1015 }
1016 return true;
1017}
1018
1020 StringRef ASTFilename,
1021 StringRef ContextHash,
1022 bool Complain) {
1023 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1024 return checkModuleCachePath(Reader.getFileManager(), ContextHash,
1025 HeaderSearchInfo.getSpecificModuleCachePath(),
1026 ASTFilename, Complain ? &Reader.Diags : nullptr,
1027 PP.getLangOpts(), PP.getPreprocessorOpts(),
1028 HeaderSearchInfo.getHeaderSearchOpts(), HSOpts);
1029}
1030
1032 PP.setCounterValue(Value);
1033}
1034
1035//===----------------------------------------------------------------------===//
1036// AST reader implementation
1037//===----------------------------------------------------------------------===//
1038
1039static uint64_t readULEB(const unsigned char *&P) {
1040 unsigned Length = 0;
1041 const char *Error = nullptr;
1042
1043 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
1044 if (Error)
1045 llvm::report_fatal_error(Error);
1046 P += Length;
1047 return Val;
1048}
1049
1050/// Read ULEB-encoded key length and data length.
1051static std::pair<unsigned, unsigned>
1052readULEBKeyDataLength(const unsigned char *&P) {
1053 unsigned KeyLen = readULEB(P);
1054 if ((unsigned)KeyLen != KeyLen)
1055 llvm::report_fatal_error("key too large");
1056
1057 unsigned DataLen = readULEB(P);
1058 if ((unsigned)DataLen != DataLen)
1059 llvm::report_fatal_error("data too large");
1060
1061 return std::make_pair(KeyLen, DataLen);
1062}
1063
1065 bool TakeOwnership) {
1066 DeserializationListener = Listener;
1067 OwnsDeserializationListener = TakeOwnership;
1068}
1069
1073
1075 LocalDeclID ID(Value);
1076#ifndef NDEBUG
1077 if (!MF.ModuleOffsetMap.empty())
1078 Reader.ReadModuleOffsetMap(MF);
1079
1080 unsigned ModuleFileIndex = ID.getModuleFileIndex();
1081 unsigned LocalDeclID = ID.getLocalDeclIndex();
1082
1083 assert(ModuleFileIndex <= MF.TransitiveImports.size());
1084
1085 ModuleFile *OwningModuleFile =
1086 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
1087 assert(OwningModuleFile);
1088
1089 unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
1090
1091 if (!ModuleFileIndex)
1092 LocalNumDecls += NUM_PREDEF_DECL_IDS;
1093
1094 assert(LocalDeclID < LocalNumDecls);
1095#endif
1096 (void)Reader;
1097 (void)MF;
1098 return ID;
1099}
1100
1101LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
1102 unsigned ModuleFileIndex, unsigned LocalDeclID) {
1103 DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
1104 return LocalDeclID::get(Reader, MF, Value);
1105}
1106
1107std::pair<unsigned, unsigned>
1109 return readULEBKeyDataLength(d);
1110}
1111
1113ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
1114 using namespace llvm::support;
1115
1116 SelectorTable &SelTable = Reader.getContext().Selectors;
1117 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1118 const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
1119 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1120 if (N == 0)
1121 return SelTable.getNullarySelector(FirstII);
1122 else if (N == 1)
1123 return SelTable.getUnarySelector(FirstII);
1124
1126 Args.push_back(FirstII);
1127 for (unsigned I = 1; I != N; ++I)
1128 Args.push_back(Reader.getLocalIdentifier(
1129 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1130
1131 return SelTable.getSelector(N, Args.data());
1132}
1133
1136 unsigned DataLen) {
1137 using namespace llvm::support;
1138
1140
1141 Result.ID = Reader.getGlobalSelectorID(
1142 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1143 unsigned FullInstanceBits =
1144 endian::readNext<uint16_t, llvm::endianness::little>(d);
1145 unsigned FullFactoryBits =
1146 endian::readNext<uint16_t, llvm::endianness::little>(d);
1147 Result.InstanceBits = FullInstanceBits & 0x3;
1148 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1149 Result.FactoryBits = FullFactoryBits & 0x3;
1150 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1151 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1152 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1153
1154 // Load instance methods
1155 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
1156 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1158 Reader, F,
1159 endian::readNext<DeclID, llvm::endianness::little>(d))))
1160 Result.Instance.push_back(Method);
1161 }
1162
1163 // Load factory methods
1164 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1165 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1167 Reader, F,
1168 endian::readNext<DeclID, llvm::endianness::little>(d))))
1169 Result.Factory.push_back(Method);
1170 }
1171
1172 return Result;
1173}
1174
1176 return llvm::djbHash(a);
1177}
1178
1179std::pair<unsigned, unsigned>
1181 return readULEBKeyDataLength(d);
1182}
1183
1185ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1186 assert(n >= 2 && d[n-1] == '\0');
1187 return StringRef((const char*) d, n-1);
1188}
1189
1190/// Whether the given identifier is "interesting".
1191static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1192 bool IsModule) {
1193 bool IsInteresting =
1194 II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1196 II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1197 return II.hadMacroDefinition() || II.isPoisoned() ||
1198 (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1199 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1200 II.getFETokenInfo());
1201}
1202
1203static bool readBit(unsigned &Bits) {
1204 bool Value = Bits & 0x1;
1205 Bits >>= 1;
1206 return Value;
1207}
1208
1210 using namespace llvm::support;
1211
1212 IdentifierID RawID =
1213 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1214 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1215}
1216
1218 bool IsModule) {
1219 if (!II.isFromAST()) {
1220 II.setIsFromAST();
1221 if (isInterestingIdentifier(Reader, II, IsModule))
1223 }
1224}
1225
1227 const unsigned char* d,
1228 unsigned DataLen) {
1229 using namespace llvm::support;
1230
1231 IdentifierID RawID =
1232 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1233 bool IsInteresting = RawID & 0x01;
1234
1235 DataLen -= sizeof(IdentifierID);
1236
1237 // Wipe out the "is interesting" bit.
1238 RawID = RawID >> 1;
1239
1240 // Build the IdentifierInfo and link the identifier ID with it.
1241 IdentifierInfo *II = KnownII;
1242 if (!II) {
1243 II = &Reader.getIdentifierTable().getOwn(k);
1244 KnownII = II;
1245 }
1246 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1247 markIdentifierFromAST(Reader, *II, IsModule);
1248 Reader.markIdentifierUpToDate(II);
1249
1250 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1251 if (!IsInteresting) {
1252 // For uninteresting identifiers, there's nothing else to do. Just notify
1253 // the reader that we've finished loading this identifier.
1254 Reader.SetIdentifierInfo(ID, II);
1255 return II;
1256 }
1257
1258 unsigned ObjCOrBuiltinID =
1259 endian::readNext<uint16_t, llvm::endianness::little>(d);
1260 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1261 bool CPlusPlusOperatorKeyword = readBit(Bits);
1262 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1263 bool Poisoned = readBit(Bits);
1264 bool ExtensionToken = readBit(Bits);
1265 bool HasMacroDefinition = readBit(Bits);
1266
1267 assert(Bits == 0 && "Extra bits in the identifier?");
1268 DataLen -= sizeof(uint16_t) * 2;
1269
1270 // Set or check the various bits in the IdentifierInfo structure.
1271 // Token IDs are read-only.
1272 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1274 if (!F.isModule())
1275 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1276 assert(II->isExtensionToken() == ExtensionToken &&
1277 "Incorrect extension token flag");
1278 (void)ExtensionToken;
1279 if (Poisoned)
1280 II->setIsPoisoned(true);
1281 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1282 "Incorrect C++ operator keyword flag");
1283 (void)CPlusPlusOperatorKeyword;
1284
1285 // If this identifier has a macro definition, deserialize it or notify the
1286 // visitor the actual definition is in a different module.
1287 if (HasMacroDefinition) {
1288 uint32_t MacroDirectivesOffset =
1289 endian::readNext<uint32_t, llvm::endianness::little>(d);
1290 DataLen -= 4;
1291
1292 if (MacroDirectivesOffset)
1293 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1294 else
1295 hasMacroDefinitionInDependencies = true;
1296 }
1297
1298 Reader.SetIdentifierInfo(ID, II);
1299
1300 // Read all of the declarations visible at global scope with this
1301 // name.
1302 if (DataLen > 0) {
1304 for (; DataLen > 0; DataLen -= sizeof(DeclID))
1305 DeclIDs.push_back(Reader.getGlobalDeclID(
1307 Reader, F,
1308 endian::readNext<DeclID, llvm::endianness::little>(d))));
1309 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1310 }
1311
1312 return II;
1313}
1314
1316 : Kind(Name.getNameKind()) {
1317 switch (Kind) {
1319 Data = (uint64_t)Name.getAsIdentifierInfo();
1320 break;
1324 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1325 break;
1327 Data = Name.getCXXOverloadedOperator();
1328 break;
1330 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1331 break;
1333 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1335 break;
1340 Data = 0;
1341 break;
1342 }
1343}
1344
1346 llvm::FoldingSetNodeID ID;
1347 ID.AddInteger(Kind);
1348
1349 switch (Kind) {
1353 ID.AddString(((IdentifierInfo*)Data)->getName());
1354 break;
1358 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1359 break;
1361 ID.AddInteger((OverloadedOperatorKind)Data);
1362 break;
1367 break;
1368 }
1369
1370 return ID.computeStableHash();
1371}
1372
1373ModuleFile *
1375 using namespace llvm::support;
1376
1377 uint32_t ModuleFileID =
1378 endian::readNext<uint32_t, llvm::endianness::little>(d);
1379 return Reader.getLocalModuleFile(F, ModuleFileID);
1380}
1381
1382std::pair<unsigned, unsigned>
1386
1389 using namespace llvm::support;
1390
1391 auto Kind = (DeclarationName::NameKind)*d++;
1392 uint64_t Data;
1393 switch (Kind) {
1397 Data = (uint64_t)Reader.getLocalIdentifier(
1398 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1399 break;
1403 Data = (uint64_t)Reader
1404 .getLocalSelector(
1405 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1406 .getAsOpaquePtr();
1407 break;
1409 Data = *d++; // OverloadedOperatorKind
1410 break;
1415 Data = 0;
1416 break;
1417 }
1418
1419 return DeclarationNameKey(Kind, Data);
1420}
1421
1423ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1424 return ReadKeyBase(d);
1425}
1426
1428 const unsigned char *d, unsigned DataLen, data_type_builder &Val) {
1429 using namespace llvm::support;
1430
1431 for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1433 Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1434 Val.insert(Reader.getGlobalDeclID(F, ID));
1435 }
1436}
1437
1439 const unsigned char *d,
1440 unsigned DataLen,
1441 data_type_builder &Val) {
1442 ReadDataIntoImpl(d, DataLen, Val);
1443}
1444
1447 llvm::FoldingSetNodeID ID;
1448 ID.AddInteger(Key.first.getHash());
1449 ID.AddInteger(Key.second);
1450 return ID.computeStableHash();
1451}
1452
1455 DeclarationNameKey Name(Key.first);
1456
1457 UnsignedOrNone ModuleHash = getPrimaryModuleHash(Key.second);
1458 if (!ModuleHash)
1459 return {Name, 0};
1460
1461 return {Name, *ModuleHash};
1462}
1463
1465ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1467 unsigned PrimaryModuleHash =
1468 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1469 return {Name, PrimaryModuleHash};
1470}
1471
1473 const unsigned char *d,
1474 unsigned DataLen,
1475 data_type_builder &Val) {
1476 ReadDataIntoImpl(d, DataLen, Val);
1477}
1478
1479ModuleFile *
1481 using namespace llvm::support;
1482
1483 uint32_t ModuleFileID =
1484 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1485 return Reader.getLocalModuleFile(F, ModuleFileID);
1486}
1487
1489LazySpecializationInfoLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1490 using namespace llvm::support;
1491 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1492}
1493
1494std::pair<unsigned, unsigned>
1498
1500 const unsigned char *d,
1501 unsigned DataLen,
1502 data_type_builder &Val) {
1503 using namespace llvm::support;
1504
1505 for (unsigned NumDecls =
1507 NumDecls; --NumDecls) {
1508 LocalDeclID LocalID = LocalDeclID::get(
1509 Reader, F,
1510 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1511 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1512 }
1513}
1514
1515bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1516 BitstreamCursor &Cursor,
1517 uint64_t Offset,
1518 DeclContext *DC) {
1519 assert(Offset != 0);
1520
1521 SavedStreamPosition SavedPosition(Cursor);
1522 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1523 Error(std::move(Err));
1524 return true;
1525 }
1526
1527 RecordData Record;
1528 StringRef Blob;
1529 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1530 if (!MaybeCode) {
1531 Error(MaybeCode.takeError());
1532 return true;
1533 }
1534 unsigned Code = MaybeCode.get();
1535
1536 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1537 if (!MaybeRecCode) {
1538 Error(MaybeRecCode.takeError());
1539 return true;
1540 }
1541 unsigned RecCode = MaybeRecCode.get();
1542 if (RecCode != DECL_CONTEXT_LEXICAL) {
1543 Error("Expected lexical block");
1544 return true;
1545 }
1546
1547 assert(!isa<TranslationUnitDecl>(DC) &&
1548 "expected a TU_UPDATE_LEXICAL record for TU");
1549 // If we are handling a C++ class template instantiation, we can see multiple
1550 // lexical updates for the same record. It's important that we select only one
1551 // of them, so that field numbering works properly. Just pick the first one we
1552 // see.
1553 auto &Lex = LexicalDecls[DC];
1554 if (!Lex.first) {
1555 Lex = std::make_pair(
1556 &M, llvm::ArrayRef(
1557 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1558 Blob.size() / sizeof(DeclID)));
1559 }
1561 return false;
1562}
1563
1564bool ASTReader::ReadVisibleDeclContextStorage(
1565 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1566 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1567 assert(Offset != 0);
1568
1569 SavedStreamPosition SavedPosition(Cursor);
1570 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1571 Error(std::move(Err));
1572 return true;
1573 }
1574
1575 RecordData Record;
1576 StringRef Blob;
1577 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1578 if (!MaybeCode) {
1579 Error(MaybeCode.takeError());
1580 return true;
1581 }
1582 unsigned Code = MaybeCode.get();
1583
1584 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1585 if (!MaybeRecCode) {
1586 Error(MaybeRecCode.takeError());
1587 return true;
1588 }
1589 unsigned RecCode = MaybeRecCode.get();
1590 switch (VisibleKind) {
1591 case VisibleDeclContextStorageKind::GenerallyVisible:
1592 if (RecCode != DECL_CONTEXT_VISIBLE) {
1593 Error("Expected visible lookup table block");
1594 return true;
1595 }
1596 break;
1597 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1598 if (RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) {
1599 Error("Expected module local visible lookup table block");
1600 return true;
1601 }
1602 break;
1603 case VisibleDeclContextStorageKind::TULocalVisible:
1604 if (RecCode != DECL_CONTEXT_TU_LOCAL_VISIBLE) {
1605 Error("Expected TU local lookup table block");
1606 return true;
1607 }
1608 break;
1609 }
1610
1611 // We can't safely determine the primary context yet, so delay attaching the
1612 // lookup table until we're done with recursive deserialization.
1613 auto *Data = (const unsigned char*)Blob.data();
1614 switch (VisibleKind) {
1615 case VisibleDeclContextStorageKind::GenerallyVisible:
1616 PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1617 break;
1618 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1619 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1620 break;
1621 case VisibleDeclContextStorageKind::TULocalVisible:
1622 if (M.Kind == MK_MainFile)
1623 TULocalUpdates[ID].push_back(UpdateData{&M, Data});
1624 break;
1625 }
1626 return false;
1627}
1628
1629void ASTReader::AddSpecializations(const Decl *D, const unsigned char *Data,
1630 ModuleFile &M, bool IsPartial) {
1631 D = D->getCanonicalDecl();
1632 auto &SpecLookups =
1633 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1634 SpecLookups[D].Table.add(&M, Data,
1636}
1637
1638bool ASTReader::ReadSpecializations(ModuleFile &M, BitstreamCursor &Cursor,
1639 uint64_t Offset, Decl *D, bool IsPartial) {
1640 assert(Offset != 0);
1641
1642 SavedStreamPosition SavedPosition(Cursor);
1643 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1644 Error(std::move(Err));
1645 return true;
1646 }
1647
1648 RecordData Record;
1649 StringRef Blob;
1650 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1651 if (!MaybeCode) {
1652 Error(MaybeCode.takeError());
1653 return true;
1654 }
1655 unsigned Code = MaybeCode.get();
1656
1657 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1658 if (!MaybeRecCode) {
1659 Error(MaybeRecCode.takeError());
1660 return true;
1661 }
1662 unsigned RecCode = MaybeRecCode.get();
1663 if (RecCode != DECL_SPECIALIZATIONS &&
1664 RecCode != DECL_PARTIAL_SPECIALIZATIONS) {
1665 Error("Expected decl specs block");
1666 return true;
1667 }
1668
1669 auto *Data = (const unsigned char *)Blob.data();
1670 AddSpecializations(D, Data, M, IsPartial);
1671 return false;
1672}
1673
1674void ASTReader::Error(StringRef Msg) const {
1675 Error(diag::err_fe_ast_file_malformed, Msg);
1676 if (PP.getLangOpts().Modules &&
1677 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1678 Diag(diag::note_module_cache_path)
1679 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1680 }
1681}
1682
1683void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1684 StringRef Arg3) const {
1685 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1686}
1687
1688namespace {
1689struct AlreadyReportedDiagnosticError
1690 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1691 static char ID;
1692
1693 void log(raw_ostream &OS) const override {
1694 llvm_unreachable("reporting an already-reported diagnostic error");
1695 }
1696
1697 std::error_code convertToErrorCode() const override {
1698 return llvm::inconvertibleErrorCode();
1699 }
1700};
1701
1702char AlreadyReportedDiagnosticError::ID = 0;
1703} // namespace
1704
1705void ASTReader::Error(llvm::Error &&Err) const {
1706 handleAllErrors(
1707 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1708 [&](llvm::ErrorInfoBase &E) { return Error(E.message()); });
1709}
1710
1711//===----------------------------------------------------------------------===//
1712// Source Manager Deserialization
1713//===----------------------------------------------------------------------===//
1714
1715/// Read the line table in the source manager block.
1716void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1717 unsigned Idx = 0;
1718 LineTableInfo &LineTable = SourceMgr.getLineTable();
1719
1720 // Parse the file names
1721 std::map<int, int> FileIDs;
1722 FileIDs[-1] = -1; // For unspecified filenames.
1723 for (unsigned I = 0; Record[Idx]; ++I) {
1724 // Extract the file name
1725 auto Filename = ReadPath(F, Record, Idx);
1726 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1727 }
1728 ++Idx;
1729
1730 // Parse the line entries
1731 std::vector<LineEntry> Entries;
1732 while (Idx < Record.size()) {
1733 FileID FID = ReadFileID(F, Record, Idx);
1734
1735 // Extract the line entries
1736 unsigned NumEntries = Record[Idx++];
1737 assert(NumEntries && "no line entries for file ID");
1738 Entries.clear();
1739 Entries.reserve(NumEntries);
1740 for (unsigned I = 0; I != NumEntries; ++I) {
1741 unsigned FileOffset = Record[Idx++];
1742 unsigned LineNo = Record[Idx++];
1743 int FilenameID = FileIDs[Record[Idx++]];
1746 unsigned IncludeOffset = Record[Idx++];
1747 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1748 FileKind, IncludeOffset));
1749 }
1750 LineTable.AddEntry(FID, Entries);
1751 }
1752}
1753
1754/// Read a source manager block
1755llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1756 using namespace SrcMgr;
1757
1758 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1759
1760 // Set the source-location entry cursor to the current position in
1761 // the stream. This cursor will be used to read the contents of the
1762 // source manager block initially, and then lazily read
1763 // source-location entries as needed.
1764 SLocEntryCursor = F.Stream;
1765
1766 // The stream itself is going to skip over the source manager block.
1767 if (llvm::Error Err = F.Stream.SkipBlock())
1768 return Err;
1769
1770 // Enter the source manager block.
1771 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1772 return Err;
1773 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1774
1775 RecordData Record;
1776 while (true) {
1777 Expected<llvm::BitstreamEntry> MaybeE =
1778 SLocEntryCursor.advanceSkippingSubblocks();
1779 if (!MaybeE)
1780 return MaybeE.takeError();
1781 llvm::BitstreamEntry E = MaybeE.get();
1782
1783 switch (E.Kind) {
1784 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1785 case llvm::BitstreamEntry::Error:
1786 return llvm::createStringError(std::errc::illegal_byte_sequence,
1787 "malformed block record in AST file");
1788 case llvm::BitstreamEntry::EndBlock:
1789 return llvm::Error::success();
1790 case llvm::BitstreamEntry::Record:
1791 // The interesting case.
1792 break;
1793 }
1794
1795 // Read a record.
1796 Record.clear();
1797 StringRef Blob;
1798 Expected<unsigned> MaybeRecord =
1799 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1800 if (!MaybeRecord)
1801 return MaybeRecord.takeError();
1802 switch (MaybeRecord.get()) {
1803 default: // Default behavior: ignore.
1804 break;
1805
1806 case SM_SLOC_FILE_ENTRY:
1809 // Once we hit one of the source location entries, we're done.
1810 return llvm::Error::success();
1811 }
1812 }
1813}
1814
1815llvm::Expected<SourceLocation::UIntTy>
1817 BitstreamCursor &Cursor = F->SLocEntryCursor;
1818 SavedStreamPosition SavedPosition(Cursor);
1819 if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1820 F->SLocEntryOffsets[Index]))
1821 return std::move(Err);
1822
1823 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1824 if (!MaybeEntry)
1825 return MaybeEntry.takeError();
1826
1827 llvm::BitstreamEntry Entry = MaybeEntry.get();
1828 if (Entry.Kind != llvm::BitstreamEntry::Record)
1829 return llvm::createStringError(
1830 std::errc::illegal_byte_sequence,
1831 "incorrectly-formatted source location entry in AST file");
1832
1834 StringRef Blob;
1835 Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1836 if (!MaybeSLOC)
1837 return MaybeSLOC.takeError();
1838
1839 switch (MaybeSLOC.get()) {
1840 default:
1841 return llvm::createStringError(
1842 std::errc::illegal_byte_sequence,
1843 "incorrectly-formatted source location entry in AST file");
1844 case SM_SLOC_FILE_ENTRY:
1847 return F->SLocEntryBaseOffset + Record[0];
1848 }
1849}
1850
1852 auto SLocMapI =
1853 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1854 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1855 "Corrupted global sloc offset map");
1856 ModuleFile *F = SLocMapI->second;
1857
1858 bool Invalid = false;
1859
1860 auto It = llvm::upper_bound(
1861 llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1862 [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1863 int ID = F->SLocEntryBaseID + LocalIndex;
1864 std::size_t Index = -ID - 2;
1865 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1866 assert(!SourceMgr.SLocEntryLoaded[Index]);
1867 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1868 if (!MaybeEntryOffset) {
1869 Error(MaybeEntryOffset.takeError());
1870 Invalid = true;
1871 return true;
1872 }
1873 SourceMgr.LoadedSLocEntryTable[Index] =
1874 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1875 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1876 }
1877 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1878 });
1879
1880 if (Invalid)
1881 return 0;
1882
1883 // The iterator points to the first entry with start offset greater than the
1884 // offset of interest. The previous entry must contain the offset of interest.
1885 return F->SLocEntryBaseID + *std::prev(It);
1886}
1887
1889 if (ID == 0)
1890 return false;
1891
1892 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1893 Error("source location entry ID out-of-range for AST file");
1894 return true;
1895 }
1896
1897 // Local helper to read the (possibly-compressed) buffer data following the
1898 // entry record.
1899 auto ReadBuffer = [this](
1900 BitstreamCursor &SLocEntryCursor,
1901 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1903 StringRef Blob;
1904 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1905 if (!MaybeCode) {
1906 Error(MaybeCode.takeError());
1907 return nullptr;
1908 }
1909 unsigned Code = MaybeCode.get();
1910
1911 Expected<unsigned> MaybeRecCode =
1912 SLocEntryCursor.readRecord(Code, Record, &Blob);
1913 if (!MaybeRecCode) {
1914 Error(MaybeRecCode.takeError());
1915 return nullptr;
1916 }
1917 unsigned RecCode = MaybeRecCode.get();
1918
1919 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1920 // Inspect the first byte to differentiate zlib (\x78) and zstd
1921 // (little-endian 0xFD2FB528).
1922 const llvm::compression::Format F =
1923 Blob.size() > 0 && Blob.data()[0] == 0x78
1924 ? llvm::compression::Format::Zlib
1925 : llvm::compression::Format::Zstd;
1926 if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1927 Error(Reason);
1928 return nullptr;
1929 }
1930 SmallVector<uint8_t, 0> Decompressed;
1931 if (llvm::Error E = llvm::compression::decompress(
1932 F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1933 Error("could not decompress embedded file contents: " +
1934 llvm::toString(std::move(E)));
1935 return nullptr;
1936 }
1937 return llvm::MemoryBuffer::getMemBufferCopy(
1938 llvm::toStringRef(Decompressed), Name);
1939 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1940 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1941 } else {
1942 Error("AST record has invalid code");
1943 return nullptr;
1944 }
1945 };
1946
1947 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1948 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1950 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1951 Error(std::move(Err));
1952 return true;
1953 }
1954
1955 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1957
1958 ++NumSLocEntriesRead;
1959 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1960 if (!MaybeEntry) {
1961 Error(MaybeEntry.takeError());
1962 return true;
1963 }
1964 llvm::BitstreamEntry Entry = MaybeEntry.get();
1965
1966 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1967 Error("incorrectly-formatted source location entry in AST file");
1968 return true;
1969 }
1970
1972 StringRef Blob;
1973 Expected<unsigned> MaybeSLOC =
1974 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1975 if (!MaybeSLOC) {
1976 Error(MaybeSLOC.takeError());
1977 return true;
1978 }
1979 switch (MaybeSLOC.get()) {
1980 default:
1981 Error("incorrectly-formatted source location entry in AST file");
1982 return true;
1983
1984 case SM_SLOC_FILE_ENTRY: {
1985 // We will detect whether a file changed and return 'Failure' for it, but
1986 // we will also try to fail gracefully by setting up the SLocEntry.
1987 unsigned InputID = Record[4];
1988 InputFile IF = getInputFile(*F, InputID);
1990 bool OverriddenBuffer = IF.isOverridden();
1991
1992 // Note that we only check if a File was returned. If it was out-of-date
1993 // we have complained but we will continue creating a FileID to recover
1994 // gracefully.
1995 if (!File)
1996 return true;
1997
1998 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1999 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
2000 // This is the module's main file.
2001 IncludeLoc = getImportLocation(F);
2002 }
2004 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2005 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
2006 BaseOffset + Record[0]);
2007 SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2008 FileInfo.NumCreatedFIDs = Record[5];
2009 if (Record[3])
2010 FileInfo.setHasLineDirectives();
2011
2012 unsigned NumFileDecls = Record[7];
2013 if (NumFileDecls && ContextObj) {
2014 const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
2015 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
2016 FileDeclIDs[FID] =
2017 FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
2018 }
2019
2020 const SrcMgr::ContentCache &ContentCache =
2021 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
2022 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
2023 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
2024 !ContentCache.getBufferIfLoaded()) {
2025 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
2026 if (!Buffer)
2027 return true;
2028 SourceMgr.overrideFileContents(*File, std::move(Buffer));
2029 }
2030
2031 break;
2032 }
2033
2034 case SM_SLOC_BUFFER_ENTRY: {
2035 const char *Name = Blob.data();
2036 unsigned Offset = Record[0];
2038 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
2039 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
2040 if (IncludeLoc.isInvalid() && F->isModule()) {
2041 IncludeLoc = getImportLocation(F);
2042 }
2043
2044 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2045 if (!Buffer)
2046 return true;
2047 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2048 BaseOffset + Offset, IncludeLoc);
2049 if (Record[3]) {
2050 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2051 FileInfo.setHasLineDirectives();
2052 }
2053 break;
2054 }
2055
2057 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
2058 SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2]);
2059 SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3]);
2060 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2061 Record[5], Record[4], ID,
2062 BaseOffset + Record[0]);
2063 break;
2064 }
2065 }
2066
2067 return false;
2068}
2069
2070std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
2071 if (ID == 0)
2072 return std::make_pair(SourceLocation(), "");
2073
2074 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
2075 Error("source location entry ID out-of-range for AST file");
2076 return std::make_pair(SourceLocation(), "");
2077 }
2078
2079 // Find which module file this entry lands in.
2080 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2081 if (!M->isModule())
2082 return std::make_pair(SourceLocation(), "");
2083
2084 // FIXME: Can we map this down to a particular submodule? That would be
2085 // ideal.
2086 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
2087}
2088
2089/// Find the location where the module F is imported.
2090SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
2091 if (F->ImportLoc.isValid())
2092 return F->ImportLoc;
2093
2094 // Otherwise we have a PCH. It's considered to be "imported" at the first
2095 // location of its includer.
2096 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
2097 // Main file is the importer.
2098 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
2099 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2100 }
2101 return F->ImportedBy[0]->FirstLoc;
2102}
2103
2104/// Enter a subblock of the specified BlockID with the specified cursor. Read
2105/// the abbreviations that are at the top of the block and then leave the cursor
2106/// pointing into the block.
2107llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
2108 unsigned BlockID,
2109 uint64_t *StartOfBlockOffset) {
2110 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2111 return Err;
2112
2113 if (StartOfBlockOffset)
2114 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2115
2116 while (true) {
2117 uint64_t Offset = Cursor.GetCurrentBitNo();
2118 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2119 if (!MaybeCode)
2120 return MaybeCode.takeError();
2121 unsigned Code = MaybeCode.get();
2122
2123 // We expect all abbrevs to be at the start of the block.
2124 if (Code != llvm::bitc::DEFINE_ABBREV) {
2125 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2126 return Err;
2127 return llvm::Error::success();
2128 }
2129 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2130 return Err;
2131 }
2132}
2133
2135 unsigned &Idx) {
2136 Token Tok;
2137 Tok.startToken();
2138 Tok.setLocation(ReadSourceLocation(M, Record, Idx));
2139 Tok.setKind((tok::TokenKind)Record[Idx++]);
2140 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
2141
2142 if (Tok.isAnnotation()) {
2143 Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
2144 switch (Tok.getKind()) {
2145 case tok::annot_pragma_loop_hint: {
2146 auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
2147 Info->PragmaName = ReadToken(M, Record, Idx);
2148 Info->Option = ReadToken(M, Record, Idx);
2149 unsigned NumTokens = Record[Idx++];
2151 Toks.reserve(NumTokens);
2152 for (unsigned I = 0; I < NumTokens; ++I)
2153 Toks.push_back(ReadToken(M, Record, Idx));
2154 Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2155 Tok.setAnnotationValue(static_cast<void *>(Info));
2156 break;
2157 }
2158 case tok::annot_pragma_pack: {
2159 auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
2160 Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
2161 auto SlotLabel = ReadString(Record, Idx);
2162 Info->SlotLabel =
2163 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2164 Info->Alignment = ReadToken(M, Record, Idx);
2165 Tok.setAnnotationValue(static_cast<void *>(Info));
2166 break;
2167 }
2168 // Some annotation tokens do not use the PtrData field.
2169 case tok::annot_pragma_openmp:
2170 case tok::annot_pragma_openmp_end:
2171 case tok::annot_pragma_unused:
2172 case tok::annot_pragma_openacc:
2173 case tok::annot_pragma_openacc_end:
2174 case tok::annot_repl_input_end:
2175 break;
2176 default:
2177 llvm_unreachable("missing deserialization code for annotation token");
2178 }
2179 } else {
2180 Tok.setLength(Record[Idx++]);
2181 if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
2182 Tok.setIdentifierInfo(II);
2183 }
2184 return Tok;
2185}
2186
2188 BitstreamCursor &Stream = F.MacroCursor;
2189
2190 // Keep track of where we are in the stream, then jump back there
2191 // after reading this macro.
2192 SavedStreamPosition SavedPosition(Stream);
2193
2194 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2195 // FIXME this drops errors on the floor.
2196 consumeError(std::move(Err));
2197 return nullptr;
2198 }
2201 MacroInfo *Macro = nullptr;
2202 llvm::MutableArrayRef<Token> MacroTokens;
2203
2204 while (true) {
2205 // Advance to the next record, but if we get to the end of the block, don't
2206 // pop it (removing all the abbreviations from the cursor) since we want to
2207 // be able to reseek within the block and read entries.
2208 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2210 Stream.advanceSkippingSubblocks(Flags);
2211 if (!MaybeEntry) {
2212 Error(MaybeEntry.takeError());
2213 return Macro;
2214 }
2215 llvm::BitstreamEntry Entry = MaybeEntry.get();
2216
2217 switch (Entry.Kind) {
2218 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2219 case llvm::BitstreamEntry::Error:
2220 Error("malformed block record in AST file");
2221 return Macro;
2222 case llvm::BitstreamEntry::EndBlock:
2223 return Macro;
2224 case llvm::BitstreamEntry::Record:
2225 // The interesting case.
2226 break;
2227 }
2228
2229 // Read a record.
2230 Record.clear();
2232 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
2233 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
2234 else {
2235 Error(MaybeRecType.takeError());
2236 return Macro;
2237 }
2238 switch (RecType) {
2239 case PP_MODULE_MACRO:
2241 return Macro;
2242
2245 // If we already have a macro, that means that we've hit the end
2246 // of the definition of the macro we were looking for. We're
2247 // done.
2248 if (Macro)
2249 return Macro;
2250
2251 unsigned NextIndex = 1; // Skip identifier ID.
2252 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
2253 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2254 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
2255 MI->setIsUsed(Record[NextIndex++]);
2256 MI->setUsedForHeaderGuard(Record[NextIndex++]);
2257 MacroTokens = MI->allocateTokens(Record[NextIndex++],
2258 PP.getPreprocessorAllocator());
2259 if (RecType == PP_MACRO_FUNCTION_LIKE) {
2260 // Decode function-like macro info.
2261 bool isC99VarArgs = Record[NextIndex++];
2262 bool isGNUVarArgs = Record[NextIndex++];
2263 bool hasCommaPasting = Record[NextIndex++];
2264 MacroParams.clear();
2265 unsigned NumArgs = Record[NextIndex++];
2266 for (unsigned i = 0; i != NumArgs; ++i)
2267 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
2268
2269 // Install function-like macro info.
2270 MI->setIsFunctionLike();
2271 if (isC99VarArgs) MI->setIsC99Varargs();
2272 if (isGNUVarArgs) MI->setIsGNUVarargs();
2273 if (hasCommaPasting) MI->setHasCommaPasting();
2274 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
2275 }
2276
2277 // Remember that we saw this macro last so that we add the tokens that
2278 // form its body to it.
2279 Macro = MI;
2280
2281 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
2282 Record[NextIndex]) {
2283 // We have a macro definition. Register the association
2285 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
2286 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2287 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
2288 PreprocessingRecord::PPEntityID PPID =
2289 PPRec.getPPEntityID(Index, /*isLoaded=*/true);
2290 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
2291 PPRec.getPreprocessedEntity(PPID));
2292 if (PPDef)
2293 PPRec.RegisterMacroDefinition(Macro, PPDef);
2294 }
2295
2296 ++NumMacrosRead;
2297 break;
2298 }
2299
2300 case PP_TOKEN: {
2301 // If we see a TOKEN before a PP_MACRO_*, then the file is
2302 // erroneous, just pretend we didn't see this.
2303 if (!Macro) break;
2304 if (MacroTokens.empty()) {
2305 Error("unexpected number of macro tokens for a macro in AST file");
2306 return Macro;
2307 }
2308
2309 unsigned Idx = 0;
2310 MacroTokens[0] = ReadToken(F, Record, Idx);
2311 MacroTokens = MacroTokens.drop_front();
2312 break;
2313 }
2314 }
2315 }
2316}
2317
2320 PreprocessedEntityID LocalID) const {
2321 if (!M.ModuleOffsetMap.empty())
2322 ReadModuleOffsetMap(M);
2323
2324 unsigned ModuleFileIndex = LocalID >> 32;
2325 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2326 ModuleFile *MF =
2327 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
2328 assert(MF && "malformed identifier ID encoding?");
2329
2330 if (!ModuleFileIndex) {
2331 assert(LocalID >= NUM_PREDEF_PP_ENTITY_IDS);
2332 LocalID -= NUM_PREDEF_PP_ENTITY_IDS;
2333 }
2334
2335 return (static_cast<PreprocessedEntityID>(MF->Index + 1) << 32) | LocalID;
2336}
2337
2339HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2340 FileManager &FileMgr = Reader.getFileManager();
2341 if (!Key.Imported)
2342 return FileMgr.getOptionalFileRef(Key.Filename);
2343
2344 auto Resolved =
2345 ASTReader::ResolveImportedPath(Reader.getPathBuf(), Key.Filename, M);
2346 return FileMgr.getOptionalFileRef(*Resolved);
2347}
2348
2350 uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2351 memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2352 memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2353 return llvm::xxh3_64bits(buf);
2354}
2355
2358 internal_key_type ikey = {ekey.getSize(),
2359 M.HasTimestamps ? ekey.getModificationTime() : 0,
2360 ekey.getName(), /*Imported*/ false};
2361 return ikey;
2362}
2363
2365 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2366 return false;
2367
2368 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2369 return true;
2370
2371 // Determine whether the actual files are equivalent.
2372 OptionalFileEntryRef FEA = getFile(a);
2373 OptionalFileEntryRef FEB = getFile(b);
2374 return FEA && FEA == FEB;
2375}
2376
2377std::pair<unsigned, unsigned>
2379 return readULEBKeyDataLength(d);
2380}
2381
2383HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2384 using namespace llvm::support;
2385
2386 internal_key_type ikey;
2387 ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2388 ikey.ModTime =
2389 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2390 ikey.Filename = (const char *)d;
2391 ikey.Imported = true;
2392 return ikey;
2393}
2394
2397 unsigned DataLen) {
2398 using namespace llvm::support;
2399
2400 const unsigned char *End = d + DataLen;
2401 HeaderFileInfo HFI;
2402 unsigned Flags = *d++;
2403
2405 bool Included = (Flags >> 6) & 0x01;
2406 if (Included)
2407 if ((FE = getFile(key)))
2408 // Not using \c Preprocessor::markIncluded(), since that would attempt to
2409 // deserialize this header file info again.
2410 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2411
2412 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2413 HFI.isImport |= (Flags >> 5) & 0x01;
2414 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2415 HFI.DirInfo = (Flags >> 1) & 0x07;
2416 HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2417 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2418
2419 assert((End - d) % 4 == 0 &&
2420 "Wrong data length in HeaderFileInfo deserialization");
2421 while (d != End) {
2422 uint32_t LocalSMID =
2423 endian::readNext<uint32_t, llvm::endianness::little>(d);
2424 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2425 LocalSMID >>= 3;
2426
2427 // This header is part of a module. Associate it with the module to enable
2428 // implicit module import.
2429 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2430 Module *Mod = Reader.getSubmodule(GlobalSMID);
2431 ModuleMap &ModMap =
2432 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2433
2434 if (FE || (FE = getFile(key))) {
2435 // FIXME: NameAsWritten
2436 Module::Header H = {std::string(key.Filename), "", *FE};
2437 ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2438 }
2439 HFI.mergeModuleMembership(HeaderRole);
2440 }
2441
2442 // This HeaderFileInfo was externally loaded.
2443 HFI.External = true;
2444 HFI.IsValid = true;
2445 return HFI;
2446}
2447
2449 uint32_t MacroDirectivesOffset) {
2450 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2451 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2452}
2453
2455 // Note that we are loading defined macros.
2456 Deserializing Macros(this);
2457
2458 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2459 BitstreamCursor &MacroCursor = I.MacroCursor;
2460
2461 // If there was no preprocessor block, skip this file.
2462 if (MacroCursor.getBitcodeBytes().empty())
2463 continue;
2464
2465 BitstreamCursor Cursor = MacroCursor;
2466 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2467 Error(std::move(Err));
2468 return;
2469 }
2470
2472 while (true) {
2473 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2474 if (!MaybeE) {
2475 Error(MaybeE.takeError());
2476 return;
2477 }
2478 llvm::BitstreamEntry E = MaybeE.get();
2479
2480 switch (E.Kind) {
2481 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2482 case llvm::BitstreamEntry::Error:
2483 Error("malformed block record in AST file");
2484 return;
2485 case llvm::BitstreamEntry::EndBlock:
2486 goto NextCursor;
2487
2488 case llvm::BitstreamEntry::Record: {
2489 Record.clear();
2490 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2491 if (!MaybeRecord) {
2492 Error(MaybeRecord.takeError());
2493 return;
2494 }
2495 switch (MaybeRecord.get()) {
2496 default: // Default behavior: ignore.
2497 break;
2498
2502 if (II->isOutOfDate())
2504 break;
2505 }
2506
2507 case PP_TOKEN:
2508 // Ignore tokens.
2509 break;
2510 }
2511 break;
2512 }
2513 }
2514 }
2515 NextCursor: ;
2516 }
2517}
2518
2519namespace {
2520
2521 /// Visitor class used to look up identifirs in an AST file.
2522 class IdentifierLookupVisitor {
2523 StringRef Name;
2524 unsigned NameHash;
2525 unsigned PriorGeneration;
2526 unsigned &NumIdentifierLookups;
2527 unsigned &NumIdentifierLookupHits;
2528 IdentifierInfo *Found = nullptr;
2529
2530 public:
2531 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2532 unsigned &NumIdentifierLookups,
2533 unsigned &NumIdentifierLookupHits)
2534 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2535 PriorGeneration(PriorGeneration),
2536 NumIdentifierLookups(NumIdentifierLookups),
2537 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2538
2539 bool operator()(ModuleFile &M) {
2540 // If we've already searched this module file, skip it now.
2541 if (M.Generation <= PriorGeneration)
2542 return true;
2543
2546 if (!IdTable)
2547 return false;
2548
2549 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2550 Found);
2551 ++NumIdentifierLookups;
2552 ASTIdentifierLookupTable::iterator Pos =
2553 IdTable->find_hashed(Name, NameHash, &Trait);
2554 if (Pos == IdTable->end())
2555 return false;
2556
2557 // Dereferencing the iterator has the effect of building the
2558 // IdentifierInfo node and populating it with the various
2559 // declarations it needs.
2560 ++NumIdentifierLookupHits;
2561 Found = *Pos;
2562 if (Trait.hasMoreInformationInDependencies()) {
2563 // Look for the identifier in extra modules as they contain more info.
2564 return false;
2565 }
2566 return true;
2567 }
2568
2569 // Retrieve the identifier info found within the module
2570 // files.
2571 IdentifierInfo *getIdentifierInfo() const { return Found; }
2572 };
2573
2574} // namespace
2575
2577 // Note that we are loading an identifier.
2578 Deserializing AnIdentifier(this);
2579
2580 unsigned PriorGeneration = 0;
2581 if (getContext().getLangOpts().Modules)
2582 PriorGeneration = IdentifierGeneration[&II];
2583
2584 // If there is a global index, look there first to determine which modules
2585 // provably do not have any results for this identifier.
2587 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2588 if (!loadGlobalIndex()) {
2589 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2590 HitsPtr = &Hits;
2591 }
2592 }
2593
2594 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2595 NumIdentifierLookups,
2596 NumIdentifierLookupHits);
2597 ModuleMgr.visit(Visitor, HitsPtr);
2599}
2600
2602 if (!II)
2603 return;
2604
2605 const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2606
2607 // Update the generation for this identifier.
2608 if (getContext().getLangOpts().Modules)
2609 IdentifierGeneration[II] = getGeneration();
2610}
2611
2613 unsigned &Idx) {
2614 uint64_t ModuleFileIndex = Record[Idx++] << 32;
2615 uint64_t LocalIndex = Record[Idx++];
2616 return getGlobalMacroID(F, (ModuleFileIndex | LocalIndex));
2617}
2618
2620 const PendingMacroInfo &PMInfo) {
2621 ModuleFile &M = *PMInfo.M;
2622
2623 BitstreamCursor &Cursor = M.MacroCursor;
2624 SavedStreamPosition SavedPosition(Cursor);
2625 if (llvm::Error Err =
2626 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2627 Error(std::move(Err));
2628 return;
2629 }
2630
2631 struct ModuleMacroRecord {
2632 SubmoduleID SubModID;
2633 MacroInfo *MI;
2635 };
2637
2638 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2639 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2640 // macro histroy.
2642 while (true) {
2644 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2645 if (!MaybeEntry) {
2646 Error(MaybeEntry.takeError());
2647 return;
2648 }
2649 llvm::BitstreamEntry Entry = MaybeEntry.get();
2650
2651 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2652 Error("malformed block record in AST file");
2653 return;
2654 }
2655
2656 Record.clear();
2657 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2658 if (!MaybePP) {
2659 Error(MaybePP.takeError());
2660 return;
2661 }
2662 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2664 break;
2665
2666 case PP_MODULE_MACRO: {
2667 ModuleMacros.push_back(ModuleMacroRecord());
2668 auto &Info = ModuleMacros.back();
2669 unsigned Idx = 0;
2670 Info.SubModID = getGlobalSubmoduleID(M, Record[Idx++]);
2671 Info.MI = getMacro(ReadMacroID(M, Record, Idx));
2672 for (int I = Idx, N = Record.size(); I != N; ++I)
2673 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2674 continue;
2675 }
2676
2677 default:
2678 Error("malformed block record in AST file");
2679 return;
2680 }
2681
2682 // We found the macro directive history; that's the last record
2683 // for this macro.
2684 break;
2685 }
2686
2687 // Module macros are listed in reverse dependency order.
2688 {
2689 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2691 for (auto &MMR : ModuleMacros) {
2692 Overrides.clear();
2693 for (unsigned ModID : MMR.Overrides) {
2694 Module *Mod = getSubmodule(ModID);
2695 auto *Macro = PP.getModuleMacro(Mod, II);
2696 assert(Macro && "missing definition for overridden macro");
2697 Overrides.push_back(Macro);
2698 }
2699
2700 bool Inserted = false;
2701 Module *Owner = getSubmodule(MMR.SubModID);
2702 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2703 }
2704 }
2705
2706 // Don't read the directive history for a module; we don't have anywhere
2707 // to put it.
2708 if (M.isModule())
2709 return;
2710
2711 // Deserialize the macro directives history in reverse source-order.
2712 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2713 unsigned Idx = 0, N = Record.size();
2714 while (Idx < N) {
2715 MacroDirective *MD = nullptr;
2718 switch (K) {
2720 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2721 MD = PP.AllocateDefMacroDirective(MI, Loc);
2722 break;
2723 }
2725 MD = PP.AllocateUndefMacroDirective(Loc);
2726 break;
2728 bool isPublic = Record[Idx++];
2729 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2730 break;
2731 }
2732
2733 if (!Latest)
2734 Latest = MD;
2735 if (Earliest)
2736 Earliest->setPrevious(MD);
2737 Earliest = MD;
2738 }
2739
2740 if (Latest)
2741 PP.setLoadedMacroDirective(II, Earliest, Latest);
2742}
2743
2744bool ASTReader::shouldDisableValidationForFile(
2745 const serialization::ModuleFile &M) const {
2746 if (DisableValidationKind == DisableValidationForModuleKind::None)
2747 return false;
2748
2749 // If a PCH is loaded and validation is disabled for PCH then disable
2750 // validation for the PCH and the modules it loads.
2751 ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2752
2753 switch (K) {
2754 case MK_MainFile:
2755 case MK_Preamble:
2756 case MK_PCH:
2757 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2758 case MK_ImplicitModule:
2759 case MK_ExplicitModule:
2760 case MK_PrebuiltModule:
2761 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2762 }
2763
2764 return false;
2765}
2766
2767static std::pair<StringRef, StringRef>
2769 const StringRef InputBlob) {
2770 uint16_t AsRequestedLength = Record[7];
2771 return {InputBlob.substr(0, AsRequestedLength),
2772 InputBlob.substr(AsRequestedLength)};
2773}
2774
2775InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2776 // If this ID is bogus, just return an empty input file.
2777 if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2778 return InputFileInfo();
2779
2780 // If we've already loaded this input file, return it.
2781 if (F.InputFileInfosLoaded[ID - 1].isValid())
2782 return F.InputFileInfosLoaded[ID - 1];
2783
2784 // Go find this input file.
2785 BitstreamCursor &Cursor = F.InputFilesCursor;
2786 SavedStreamPosition SavedPosition(Cursor);
2787 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2788 F.InputFileOffsets[ID - 1])) {
2789 // FIXME this drops errors on the floor.
2790 consumeError(std::move(Err));
2791 }
2792
2793 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2794 if (!MaybeCode) {
2795 // FIXME this drops errors on the floor.
2796 consumeError(MaybeCode.takeError());
2797 }
2798 unsigned Code = MaybeCode.get();
2799 RecordData Record;
2800 StringRef Blob;
2801
2802 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2803 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2804 "invalid record type for input file");
2805 else {
2806 // FIXME this drops errors on the floor.
2807 consumeError(Maybe.takeError());
2808 }
2809
2810 assert(Record[0] == ID && "Bogus stored ID or offset");
2812 R.StoredSize = static_cast<off_t>(Record[1]);
2813 R.StoredTime = static_cast<time_t>(Record[2]);
2814 R.Overridden = static_cast<bool>(Record[3]);
2815 R.Transient = static_cast<bool>(Record[4]);
2816 R.TopLevel = static_cast<bool>(Record[5]);
2817 R.ModuleMap = static_cast<bool>(Record[6]);
2818 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2820 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2821 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2822 ? UnresolvedFilenameAsRequested
2823 : UnresolvedFilename;
2824
2825 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2826 if (!MaybeEntry) // FIXME this drops errors on the floor.
2827 consumeError(MaybeEntry.takeError());
2828 llvm::BitstreamEntry Entry = MaybeEntry.get();
2829 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2830 "expected record type for input file hash");
2831
2832 Record.clear();
2833 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2834 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2835 "invalid record type for input file hash");
2836 else {
2837 // FIXME this drops errors on the floor.
2838 consumeError(Maybe.takeError());
2839 }
2840 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2841 static_cast<uint64_t>(Record[0]);
2842
2843 // Note that we've loaded this input file info.
2844 F.InputFileInfosLoaded[ID - 1] = R;
2845 return R;
2846}
2847
2848static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2849InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2850 // If this ID is bogus, just return an empty input file.
2851 if (ID == 0 || ID > F.InputFilesLoaded.size())
2852 return InputFile();
2853
2854 // If we've already loaded this input file, return it.
2855 if (F.InputFilesLoaded[ID-1].getFile())
2856 return F.InputFilesLoaded[ID-1];
2857
2858 if (F.InputFilesLoaded[ID-1].isNotFound())
2859 return InputFile();
2860
2861 // Go find this input file.
2862 BitstreamCursor &Cursor = F.InputFilesCursor;
2863 SavedStreamPosition SavedPosition(Cursor);
2864 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2865 F.InputFileOffsets[ID - 1])) {
2866 // FIXME this drops errors on the floor.
2867 consumeError(std::move(Err));
2868 }
2869
2870 InputFileInfo FI = getInputFileInfo(F, ID);
2871 off_t StoredSize = FI.StoredSize;
2872 time_t StoredTime = FI.StoredTime;
2873 bool Overridden = FI.Overridden;
2874 bool Transient = FI.Transient;
2875 auto Filename =
2876 ResolveImportedPath(PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
2877 uint64_t StoredContentHash = FI.ContentHash;
2878
2879 // For standard C++ modules, we don't need to check the inputs.
2880 bool SkipChecks = F.StandardCXXModule;
2881
2882 const HeaderSearchOptions &HSOpts =
2883 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2884
2885 // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2886 // modules.
2888 SkipChecks = false;
2889 Overridden = false;
2890 }
2891
2892 auto File = FileMgr.getOptionalFileRef(*Filename, /*OpenFile=*/false);
2893
2894 // For an overridden file, create a virtual file with the stored
2895 // size/timestamp.
2896 if ((Overridden || Transient || SkipChecks) && !File)
2897 File = FileMgr.getVirtualFileRef(*Filename, StoredSize, StoredTime);
2898
2899 if (!File) {
2900 if (Complain) {
2901 std::string ErrorStr = "could not find file '";
2902 ErrorStr += *Filename;
2903 ErrorStr += "' referenced by AST file '";
2904 ErrorStr += F.FileName.str();
2905 ErrorStr += "'";
2906 Error(ErrorStr);
2907 }
2908 // Record that we didn't find the file.
2910 return InputFile();
2911 }
2912
2913 // Check if there was a request to override the contents of the file
2914 // that was part of the precompiled header. Overriding such a file
2915 // can lead to problems when lexing using the source locations from the
2916 // PCH.
2917 SourceManager &SM = getSourceManager();
2918 // FIXME: Reject if the overrides are different.
2919 if ((!Overridden && !Transient) && !SkipChecks &&
2920 SM.isFileOverridden(*File)) {
2921 if (Complain)
2922 Error(diag::err_fe_pch_file_overridden, *Filename);
2923
2924 // After emitting the diagnostic, bypass the overriding file to recover
2925 // (this creates a separate FileEntry).
2926 File = SM.bypassFileContentsOverride(*File);
2927 if (!File) {
2929 return InputFile();
2930 }
2931 }
2932
2933 auto HasInputContentChanged = [&](Change OriginalChange) {
2934 assert(ValidateASTInputFilesContent &&
2935 "We should only check the content of the inputs with "
2936 "ValidateASTInputFilesContent enabled.");
2937
2938 if (StoredContentHash == 0)
2939 return OriginalChange;
2940
2941 auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2942 if (!MemBuffOrError) {
2943 if (!Complain)
2944 return OriginalChange;
2945 std::string ErrorStr = "could not get buffer for file '";
2946 ErrorStr += File->getName();
2947 ErrorStr += "'";
2948 Error(ErrorStr);
2949 return OriginalChange;
2950 }
2951
2952 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2953 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2954 return Change{Change::None};
2955
2956 return Change{Change::Content};
2957 };
2958 auto HasInputFileChanged = [&]() {
2959 if (StoredSize != File->getSize())
2960 return Change{Change::Size, StoredSize, File->getSize()};
2961 if (!shouldDisableValidationForFile(F) && StoredTime &&
2962 StoredTime != File->getModificationTime()) {
2963 Change MTimeChange = {Change::ModTime, StoredTime,
2964 File->getModificationTime()};
2965
2966 // In case the modification time changes but not the content,
2967 // accept the cached file as legit.
2968 if (ValidateASTInputFilesContent)
2969 return HasInputContentChanged(MTimeChange);
2970
2971 return MTimeChange;
2972 }
2973 return Change{Change::None};
2974 };
2975
2976 bool IsOutOfDate = false;
2977 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2978 // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
2979 // enabled, it is better to check the contents of the inputs. Since we can't
2980 // get correct modified time information for inputs from overriden inputs.
2981 if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
2982 F.StandardCXXModule && FileChange.Kind == Change::None)
2983 FileChange = HasInputContentChanged(FileChange);
2984
2985 // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
2986 // it is better to check the content of the input files because we cannot rely
2987 // on the file modification time, which will be the same (zero) for these
2988 // files.
2989 if (!StoredTime && ValidateASTInputFilesContent &&
2990 FileChange.Kind == Change::None)
2991 FileChange = HasInputContentChanged(FileChange);
2992
2993 // For an overridden file, there is nothing to validate.
2994 if (!Overridden && FileChange.Kind != Change::None) {
2995 if (Complain) {
2996 // Build a list of the PCH imports that got us here (in reverse).
2997 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2998 while (!ImportStack.back()->ImportedBy.empty())
2999 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3000
3001 // The top-level AST file is stale.
3002 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3003 Diag(diag::err_fe_ast_file_modified)
3004 << *Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
3005 << TopLevelASTFileName;
3006 Diag(diag::note_fe_ast_file_modified)
3007 << FileChange.Kind << (FileChange.Old && FileChange.New)
3008 << llvm::itostr(FileChange.Old.value_or(0))
3009 << llvm::itostr(FileChange.New.value_or(0));
3010
3011 // Print the import stack.
3012 if (ImportStack.size() > 1) {
3013 Diag(diag::note_ast_file_required_by)
3014 << *Filename << ImportStack[0]->FileName;
3015 for (unsigned I = 1; I < ImportStack.size(); ++I)
3016 Diag(diag::note_ast_file_required_by)
3017 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3018 }
3019
3021 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3022 Diag(diag::note_ast_file_input_files_validation_status)
3024 }
3025
3026 IsOutOfDate = true;
3027 }
3028 // FIXME: If the file is overridden and we've already opened it,
3029 // issue an error (or split it into a separate FileEntry).
3030
3031 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
3032
3033 // Note that we've loaded this input file.
3034 F.InputFilesLoaded[ID-1] = IF;
3035 return IF;
3036}
3037
3038ASTReader::TemporarilyOwnedStringRef
3040 ModuleFile &ModF) {
3041 return ResolveImportedPath(Buf, Path, ModF.BaseDirectory);
3042}
3043
3044ASTReader::TemporarilyOwnedStringRef
3046 StringRef Prefix) {
3047 assert(Buf.capacity() != 0 && "Overlapping ResolveImportedPath calls");
3048
3049 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3050 Path == "<built-in>" || Path == "<command line>")
3051 return {Path, Buf};
3052
3053 Buf.clear();
3054 llvm::sys::path::append(Buf, Prefix, Path);
3055 StringRef ResolvedPath{Buf.data(), Buf.size()};
3056 return {ResolvedPath, Buf};
3057}
3058
3060 StringRef P,
3061 ModuleFile &ModF) {
3062 return ResolveImportedPathAndAllocate(Buf, P, ModF.BaseDirectory);
3063}
3064
3066 StringRef P,
3067 StringRef Prefix) {
3068 auto ResolvedPath = ResolveImportedPath(Buf, P, Prefix);
3069 return ResolvedPath->str();
3070}
3071
3072static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
3073 switch (ARR) {
3074 case ASTReader::Failure: return true;
3075 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
3076 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
3079 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
3080 case ASTReader::HadErrors: return true;
3081 case ASTReader::Success: return false;
3082 }
3083
3084 llvm_unreachable("unknown ASTReadResult");
3085}
3086
3087ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
3088 BitstreamCursor &Stream, StringRef Filename,
3089 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
3090 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3091 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
3092 // FIXME this drops errors on the floor.
3093 consumeError(std::move(Err));
3094 return Failure;
3095 }
3096
3097 // Read all of the records in the options block.
3098 RecordData Record;
3099 ASTReadResult Result = Success;
3100 while (true) {
3101 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3102 if (!MaybeEntry) {
3103 // FIXME this drops errors on the floor.
3104 consumeError(MaybeEntry.takeError());
3105 return Failure;
3106 }
3107 llvm::BitstreamEntry Entry = MaybeEntry.get();
3108
3109 switch (Entry.Kind) {
3110 case llvm::BitstreamEntry::Error:
3111 case llvm::BitstreamEntry::SubBlock:
3112 return Failure;
3113
3114 case llvm::BitstreamEntry::EndBlock:
3115 return Result;
3116
3117 case llvm::BitstreamEntry::Record:
3118 // The interesting case.
3119 break;
3120 }
3121
3122 // Read and process a record.
3123 Record.clear();
3124 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
3125 if (!MaybeRecordType) {
3126 // FIXME this drops errors on the floor.
3127 consumeError(MaybeRecordType.takeError());
3128 return Failure;
3129 }
3130 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
3131 case LANGUAGE_OPTIONS: {
3132 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3133 if (ParseLanguageOptions(Record, Filename, Complain, Listener,
3134 AllowCompatibleConfigurationMismatch))
3135 Result = ConfigurationMismatch;
3136 break;
3137 }
3138
3139 case CODEGEN_OPTIONS: {
3140 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3141 if (ParseCodeGenOptions(Record, Filename, Complain, Listener,
3142 AllowCompatibleConfigurationMismatch))
3143 Result = ConfigurationMismatch;
3144 break;
3145 }
3146
3147 case TARGET_OPTIONS: {
3148 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3149 if (ParseTargetOptions(Record, Filename, Complain, Listener,
3150 AllowCompatibleConfigurationMismatch))
3151 Result = ConfigurationMismatch;
3152 break;
3153 }
3154
3155 case FILE_SYSTEM_OPTIONS: {
3156 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3157 if (!AllowCompatibleConfigurationMismatch &&
3158 ParseFileSystemOptions(Record, Complain, Listener))
3159 Result = ConfigurationMismatch;
3160 break;
3161 }
3162
3163 case HEADER_SEARCH_OPTIONS: {
3164 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3165 if (!AllowCompatibleConfigurationMismatch &&
3166 ParseHeaderSearchOptions(Record, Filename, Complain, Listener))
3167 Result = ConfigurationMismatch;
3168 break;
3169 }
3170
3172 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3173 if (!AllowCompatibleConfigurationMismatch &&
3174 ParsePreprocessorOptions(Record, Filename, Complain, Listener,
3175 SuggestedPredefines))
3176 Result = ConfigurationMismatch;
3177 break;
3178 }
3179 }
3180}
3181
3182ASTReader::RelocationResult
3183ASTReader::getModuleForRelocationChecks(ModuleFile &F, bool DirectoryCheck) {
3184 // Don't emit module relocation errors if we have -fno-validate-pch.
3185 const bool IgnoreError =
3186 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3188
3189 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3190 return {std::nullopt, IgnoreError};
3191
3192 const bool IsImplicitModule = F.Kind == MK_ImplicitModule;
3193
3194 if (!DirectoryCheck &&
3195 (!IsImplicitModule || ModuleMgr.begin()->Kind == MK_MainFile))
3196 return {std::nullopt, IgnoreError};
3197
3198 const HeaderSearchOptions &HSOpts =
3199 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3200
3201 // When only validating modules once per build session,
3202 // Skip check if the timestamp is up to date or module was built in same build
3203 // session.
3204 if (HSOpts.ModulesValidateOncePerBuildSession && IsImplicitModule) {
3206 return {std::nullopt, IgnoreError};
3207 if (static_cast<uint64_t>(F.ModTime) >= HSOpts.BuildSessionTimestamp)
3208 return {std::nullopt, IgnoreError};
3209 }
3210
3211 Diag(diag::remark_module_check_relocation) << F.ModuleName << F.FileName;
3212
3213 // If we've already loaded a module map file covering this module, we may
3214 // have a better path for it (relative to the current build if doing directory
3215 // check).
3216 Module *M = PP.getHeaderSearchInfo().lookupModule(
3217 F.ModuleName, DirectoryCheck ? SourceLocation() : F.ImportLoc,
3218 /*AllowSearch=*/DirectoryCheck,
3219 /*AllowExtraModuleMapSearch=*/DirectoryCheck);
3220
3221 return {M, IgnoreError};
3222}
3223
3225ASTReader::ReadControlBlock(ModuleFile &F,
3226 SmallVectorImpl<ImportedModule> &Loaded,
3227 const ModuleFile *ImportedBy,
3228 unsigned ClientLoadCapabilities) {
3229 BitstreamCursor &Stream = F.Stream;
3230
3231 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
3232 Error(std::move(Err));
3233 return Failure;
3234 }
3235
3236 // Lambda to read the unhashed control block the first time it's called.
3237 //
3238 // For PCM files, the unhashed control block cannot be read until after the
3239 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
3240 // need to look ahead before reading the IMPORTS record. For consistency,
3241 // this block is always read somehow (see BitstreamEntry::EndBlock).
3242 bool HasReadUnhashedControlBlock = false;
3243 auto readUnhashedControlBlockOnce = [&]() {
3244 if (!HasReadUnhashedControlBlock) {
3245 HasReadUnhashedControlBlock = true;
3246 if (ASTReadResult Result =
3247 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3248 return Result;
3249 }
3250 return Success;
3251 };
3252
3253 bool DisableValidation = shouldDisableValidationForFile(F);
3254
3255 // Read all of the records and blocks in the control block.
3256 RecordData Record;
3257 unsigned NumInputs = 0;
3258 unsigned NumUserInputs = 0;
3259 StringRef BaseDirectoryAsWritten;
3260 while (true) {
3261 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3262 if (!MaybeEntry) {
3263 Error(MaybeEntry.takeError());
3264 return Failure;
3265 }
3266 llvm::BitstreamEntry Entry = MaybeEntry.get();
3267
3268 switch (Entry.Kind) {
3269 case llvm::BitstreamEntry::Error:
3270 Error("malformed block record in AST file");
3271 return Failure;
3272 case llvm::BitstreamEntry::EndBlock: {
3273 // Validate the module before returning. This call catches an AST with
3274 // no module name and no imports.
3275 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3276 return Result;
3277
3278 // Validate input files.
3279 const HeaderSearchOptions &HSOpts =
3280 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3281
3282 // All user input files reside at the index range [0, NumUserInputs), and
3283 // system input files reside at [NumUserInputs, NumInputs). For explicitly
3284 // loaded module files, ignore missing inputs.
3285 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
3286 F.Kind != MK_PrebuiltModule) {
3287 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3288
3289 // If we are reading a module, we will create a verification timestamp,
3290 // so we verify all input files. Otherwise, verify only user input
3291 // files.
3292
3293 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3294 F.InputFilesValidationStatus = ValidateSystemInputs
3299 F.Kind == MK_ImplicitModule) {
3300 N = ForceValidateUserInputs ? NumUserInputs : 0;
3302 ForceValidateUserInputs
3305 }
3306
3307 if (N != 0)
3308 Diag(diag::remark_module_validation)
3309 << N << F.ModuleName << F.FileName;
3310
3311 for (unsigned I = 0; I < N; ++I) {
3312 InputFile IF = getInputFile(F, I+1, Complain);
3313 if (!IF.getFile() || IF.isOutOfDate())
3314 return OutOfDate;
3315 }
3316 } else {
3318 }
3319
3320 if (Listener)
3321 Listener->visitModuleFile(F.FileName, F.Kind, F.isDirectlyImported());
3322
3323 if (Listener && Listener->needsInputFileVisitation()) {
3324 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
3325 : NumUserInputs;
3326 for (unsigned I = 0; I < N; ++I) {
3327 bool IsSystem = I >= NumUserInputs;
3328 InputFileInfo FI = getInputFileInfo(F, I + 1);
3329 auto FilenameAsRequested = ResolveImportedPath(
3331 Listener->visitInputFile(
3332 *FilenameAsRequested, IsSystem, FI.Overridden,
3334 }
3335 }
3336
3337 return Success;
3338 }
3339
3340 case llvm::BitstreamEntry::SubBlock:
3341 switch (Entry.ID) {
3343 F.InputFilesCursor = Stream;
3344 if (llvm::Error Err = Stream.SkipBlock()) {
3345 Error(std::move(Err));
3346 return Failure;
3347 }
3348 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
3349 Error("malformed block record in AST file");
3350 return Failure;
3351 }
3352 F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
3353 continue;
3354
3355 case OPTIONS_BLOCK_ID:
3356 // If we're reading the first module for this group, check its options
3357 // are compatible with ours. For modules it imports, no further checking
3358 // is required, because we checked them when we built it.
3359 if (Listener && !ImportedBy) {
3360 // Should we allow the configuration of the module file to differ from
3361 // the configuration of the current translation unit in a compatible
3362 // way?
3363 //
3364 // FIXME: Allow this for files explicitly specified with -include-pch.
3365 bool AllowCompatibleConfigurationMismatch =
3367
3368 ASTReadResult Result =
3369 ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities,
3370 AllowCompatibleConfigurationMismatch, *Listener,
3371 SuggestedPredefines);
3372 if (Result == Failure) {
3373 Error("malformed block record in AST file");
3374 return Result;
3375 }
3376
3377 if (DisableValidation ||
3378 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
3379 Result = Success;
3380
3381 // If we can't load the module, exit early since we likely
3382 // will rebuild the module anyway. The stream may be in the
3383 // middle of a block.
3384 if (Result != Success)
3385 return Result;
3386 } else if (llvm::Error Err = Stream.SkipBlock()) {
3387 Error(std::move(Err));
3388 return Failure;
3389 }
3390 continue;
3391
3392 default:
3393 if (llvm::Error Err = Stream.SkipBlock()) {
3394 Error(std::move(Err));
3395 return Failure;
3396 }
3397 continue;
3398 }
3399
3400 case llvm::BitstreamEntry::Record:
3401 // The interesting case.
3402 break;
3403 }
3404
3405 // Read and process a record.
3406 Record.clear();
3407 StringRef Blob;
3408 Expected<unsigned> MaybeRecordType =
3409 Stream.readRecord(Entry.ID, Record, &Blob);
3410 if (!MaybeRecordType) {
3411 Error(MaybeRecordType.takeError());
3412 return Failure;
3413 }
3414 switch ((ControlRecordTypes)MaybeRecordType.get()) {
3415 case METADATA: {
3416 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3417 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3418 Diag(Record[0] < VERSION_MAJOR ? diag::err_ast_file_version_too_old
3419 : diag::err_ast_file_version_too_new)
3421 return VersionMismatch;
3422 }
3423
3424 bool hasErrors = Record[7];
3425 if (hasErrors && !DisableValidation) {
3426 // If requested by the caller and the module hasn't already been read
3427 // or compiled, mark modules on error as out-of-date.
3428 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3429 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3430 return OutOfDate;
3431
3432 if (!AllowASTWithCompilerErrors) {
3433 Diag(diag::err_ast_file_with_compiler_errors)
3435 return HadErrors;
3436 }
3437 }
3438 if (hasErrors) {
3439 Diags.ErrorOccurred = true;
3440 Diags.UncompilableErrorOccurred = true;
3441 Diags.UnrecoverableErrorOccurred = true;
3442 }
3443
3444 F.RelocatablePCH = Record[4];
3445 // Relative paths in a relocatable PCH are relative to our sysroot.
3446 if (F.RelocatablePCH)
3447 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3448
3450
3451 F.HasTimestamps = Record[6];
3452
3453 const std::string &CurBranch = getClangFullRepositoryVersion();
3454 StringRef ASTBranch = Blob;
3455 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3456 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3457 Diag(diag::err_ast_file_different_branch)
3458 << moduleKindForDiagnostic(F.Kind) << F.FileName << ASTBranch
3459 << CurBranch;
3460 return VersionMismatch;
3461 }
3462 break;
3463 }
3464
3465 case IMPORT: {
3466 // Validate the AST before processing any imports (otherwise, untangling
3467 // them can be error-prone and expensive). A module will have a name and
3468 // will already have been validated, but this catches the PCH case.
3469 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3470 return Result;
3471
3472 unsigned Idx = 0;
3473 // Read information about the AST file.
3474 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3475
3476 // The import location will be the local one for now; we will adjust
3477 // all import locations of module imports after the global source
3478 // location info are setup, in ReadAST.
3479 auto [ImportLoc, ImportModuleFileIndex] =
3480 ReadUntranslatedSourceLocation(Record[Idx++]);
3481 // The import location must belong to the current module file itself.
3482 assert(ImportModuleFileIndex == 0);
3483
3484 StringRef ImportedName = ReadStringBlob(Record, Idx, Blob);
3485
3486 bool IsImportingStdCXXModule = Record[Idx++];
3487
3488 off_t StoredSize = 0;
3489 time_t StoredModTime = 0;
3490 unsigned ImplicitModuleSuffixLength = 0;
3491 ASTFileSignature StoredSignature;
3492 ModuleFileName ImportedFile;
3493 std::string StoredFile;
3494 bool IgnoreImportedByNote = false;
3495
3496 // For prebuilt and explicit modules first consult the file map for
3497 // an override. Note that here we don't search prebuilt module
3498 // directories if we're not importing standard c++ module, only the
3499 // explicit name to file mappings. Also, we will still verify the
3500 // size/signature making sure it is essentially the same file but
3501 // perhaps in a different location.
3502 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3503 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3504 ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3505
3506 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3507 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3508 return Missing;
3509 }
3510
3511 if (!IsImportingStdCXXModule) {
3512 StoredSize = (off_t)Record[Idx++];
3513 StoredModTime = (time_t)Record[Idx++];
3514 ImplicitModuleSuffixLength = (unsigned)Record[Idx++];
3515
3516 StringRef SignatureBytes = Blob.substr(0, ASTFileSignature::size);
3517 StoredSignature = ASTFileSignature::create(SignatureBytes.begin(),
3518 SignatureBytes.end());
3519 Blob = Blob.substr(ASTFileSignature::size);
3520
3521 StoredFile = ReadPathBlob(BaseDirectoryAsWritten, Record, Idx, Blob);
3522 if (ImportedFile.empty()) {
3523 ImportedFile = ImplicitModuleSuffixLength
3525 StoredFile, ImplicitModuleSuffixLength)
3526 : ModuleFileName::makeExplicit(StoredFile);
3527 assert((ImportedKind == MK_ImplicitModule) ==
3528 (ImplicitModuleSuffixLength != 0));
3529 } else if (!getDiags().isIgnored(
3530 diag::warn_module_file_mapping_mismatch,
3531 CurrentImportLoc)) {
3532 auto ImportedFileRef =
3533 PP.getFileManager().getOptionalFileRef(ImportedFile);
3534 auto StoredFileRef =
3535 PP.getFileManager().getOptionalFileRef(StoredFile);
3536 if ((ImportedFileRef && StoredFileRef) &&
3537 (*ImportedFileRef != *StoredFileRef)) {
3538 Diag(diag::warn_module_file_mapping_mismatch)
3539 << ImportedFile << StoredFile;
3540 Diag(diag::note_module_file_imported_by)
3541 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3542 IgnoreImportedByNote = true;
3543 }
3544 }
3545 }
3546
3547 // If our client can't cope with us being out of date, we can't cope with
3548 // our dependency being missing.
3549 unsigned Capabilities = ClientLoadCapabilities;
3550 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3551 Capabilities &= ~ARR_Missing;
3552
3553 // Load the AST file.
3554 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3555 Loaded, StoredSize, StoredModTime,
3556 StoredSignature, Capabilities);
3557
3558 // Check the AST we just read from ImportedFile contains a different
3559 // module than we expected (ImportedName). This can occur for C++20
3560 // Modules when given a mismatch via -fmodule-file=<name>=<file>
3561 if (IsImportingStdCXXModule) {
3562 if (const auto *Imported =
3563 getModuleManager().lookupByFileName(ImportedFile);
3564 Imported != nullptr && Imported->ModuleName != ImportedName) {
3565 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3566 Result = Missing;
3567 }
3568 }
3569
3570 // If we diagnosed a problem, produce a backtrace.
3571 bool recompilingFinalized = Result == OutOfDate &&
3572 (Capabilities & ARR_OutOfDate) &&
3573 getModuleManager()
3574 .getModuleCache()
3575 .getInMemoryModuleCache()
3576 .isPCMFinal(F.FileName);
3577 if (!IgnoreImportedByNote &&
3578 (isDiagnosedResult(Result, Capabilities) || recompilingFinalized))
3579 Diag(diag::note_module_file_imported_by)
3580 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3581
3582 switch (Result) {
3583 case Failure: return Failure;
3584 // If we have to ignore the dependency, we'll have to ignore this too.
3585 case Missing:
3586 case OutOfDate: return OutOfDate;
3587 case VersionMismatch: return VersionMismatch;
3588 case ConfigurationMismatch: return ConfigurationMismatch;
3589 case HadErrors: return HadErrors;
3590 case Success: break;
3591 }
3592 break;
3593 }
3594
3595 case ORIGINAL_FILE:
3596 F.OriginalSourceFileID = FileID::get(Record[0]);
3597 F.ActualOriginalSourceFileName = std::string(Blob);
3598 F.OriginalSourceFileName = ResolveImportedPathAndAllocate(
3599 PathBuf, F.ActualOriginalSourceFileName, F);
3600 break;
3601
3602 case ORIGINAL_FILE_ID:
3603 F.OriginalSourceFileID = FileID::get(Record[0]);
3604 break;
3605
3606 case MODULE_NAME:
3607 F.ModuleName = std::string(Blob);
3608 Diag(diag::remark_module_import)
3609 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3610 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3611 if (Listener)
3612 Listener->ReadModuleName(F.ModuleName);
3613
3614 // Validate the AST as soon as we have a name so we can exit early on
3615 // failure.
3616 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3617 return Result;
3618
3619 break;
3620
3621 case MODULE_DIRECTORY: {
3622 // Save the BaseDirectory as written in the PCM for computing the module
3623 // filename for the ModuleCache.
3624 BaseDirectoryAsWritten = Blob;
3625 assert(!F.ModuleName.empty() &&
3626 "MODULE_DIRECTORY found before MODULE_NAME");
3627 F.BaseDirectory = std::string(Blob);
3628
3629 auto [MaybeM, IgnoreError] =
3630 getModuleForRelocationChecks(F, /*DirectoryCheck=*/true);
3631 if (!MaybeM.has_value())
3632 break;
3633
3634 Module *M = MaybeM.value();
3635 if (!M || !M->Directory)
3636 break;
3637 if (IgnoreError) {
3638 F.BaseDirectory = std::string(M->Directory->getName());
3639 break;
3640 }
3641 if ((F.Kind == MK_ExplicitModule) || (F.Kind == MK_PrebuiltModule))
3642 break;
3643
3644 // If we're implicitly loading a module, the base directory can't
3645 // change between the build and use.
3646 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3647 if (BuildDir && (*BuildDir == M->Directory)) {
3648 F.BaseDirectory = std::string(M->Directory->getName());
3649 break;
3650 }
3651 Diag(diag::remark_module_relocated)
3652 << F.ModuleName << Blob << M->Directory->getName();
3653
3654 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3655 Diag(diag::err_imported_module_relocated)
3656 << F.ModuleName << Blob << M->Directory->getName();
3657 return OutOfDate;
3658 }
3659
3660 case MODULE_MAP_FILE:
3661 if (ASTReadResult Result =
3662 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3663 return Result;
3664 break;
3665
3666 case INPUT_FILE_OFFSETS:
3667 NumInputs = Record[0];
3668 NumUserInputs = Record[1];
3670 (const llvm::support::unaligned_uint64_t *)Blob.data();
3671 F.InputFilesLoaded.resize(NumInputs);
3672 F.InputFileInfosLoaded.resize(NumInputs);
3673 F.NumUserInputFiles = NumUserInputs;
3674 break;
3675 }
3676 }
3677}
3678
3679llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3680 unsigned ClientLoadCapabilities) {
3681 BitstreamCursor &Stream = F.Stream;
3682
3683 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3684 return Err;
3685 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3686
3687 // Read all of the records and blocks for the AST file.
3688 RecordData Record;
3689 while (true) {
3690 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3691 if (!MaybeEntry)
3692 return MaybeEntry.takeError();
3693 llvm::BitstreamEntry Entry = MaybeEntry.get();
3694
3695 switch (Entry.Kind) {
3696 case llvm::BitstreamEntry::Error:
3697 return llvm::createStringError(
3698 std::errc::illegal_byte_sequence,
3699 "error at end of module block in AST file");
3700 case llvm::BitstreamEntry::EndBlock:
3701 // Outside of C++, we do not store a lookup map for the translation unit.
3702 // Instead, mark it as needing a lookup map to be built if this module
3703 // contains any declarations lexically within it (which it always does!).
3704 // This usually has no cost, since we very rarely need the lookup map for
3705 // the translation unit outside C++.
3706 if (ASTContext *Ctx = ContextObj) {
3707 DeclContext *DC = Ctx->getTranslationUnitDecl();
3708 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3710 }
3711
3712 return llvm::Error::success();
3713 case llvm::BitstreamEntry::SubBlock:
3714 switch (Entry.ID) {
3715 case DECLTYPES_BLOCK_ID:
3716 // We lazily load the decls block, but we want to set up the
3717 // DeclsCursor cursor to point into it. Clone our current bitcode
3718 // cursor to it, enter the block and read the abbrevs in that block.
3719 // With the main cursor, we just skip over it.
3720 F.DeclsCursor = Stream;
3721 if (llvm::Error Err = Stream.SkipBlock())
3722 return Err;
3723 if (llvm::Error Err = ReadBlockAbbrevs(
3725 return Err;
3726 break;
3727
3729 F.MacroCursor = Stream;
3730 if (!PP.getExternalSource())
3731 PP.setExternalSource(this);
3732
3733 if (llvm::Error Err = Stream.SkipBlock())
3734 return Err;
3735 if (llvm::Error Err =
3736 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3737 return Err;
3738 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3739 break;
3740
3742 F.PreprocessorDetailCursor = Stream;
3743
3744 if (llvm::Error Err = Stream.SkipBlock()) {
3745 return Err;
3746 }
3747 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3749 return Err;
3751 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3752
3753 if (!PP.getPreprocessingRecord())
3754 PP.createPreprocessingRecord();
3755 if (!PP.getPreprocessingRecord()->getExternalSource())
3756 PP.getPreprocessingRecord()->SetExternalSource(*this);
3757 break;
3758
3760 if (llvm::Error Err = ReadSourceManagerBlock(F))
3761 return Err;
3762 break;
3763
3764 case SUBMODULE_BLOCK_ID:
3765 F.SubmodulesCursor = Stream;
3766 if (llvm::Error Err = Stream.SkipBlock())
3767 return Err;
3768 if (llvm::Error Err =
3769 ReadBlockAbbrevs(F.SubmodulesCursor, SUBMODULE_BLOCK_ID))
3770 return Err;
3771 F.SubmodulesOffsetBase = F.SubmodulesCursor.GetCurrentBitNo();
3772 break;
3773
3774 case COMMENTS_BLOCK_ID: {
3775 BitstreamCursor C = Stream;
3776
3777 if (llvm::Error Err = Stream.SkipBlock())
3778 return Err;
3779 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3780 return Err;
3781 CommentsCursors.push_back(std::make_pair(C, &F));
3782 break;
3783 }
3784
3785 default:
3786 if (llvm::Error Err = Stream.SkipBlock())
3787 return Err;
3788 break;
3789 }
3790 continue;
3791
3792 case llvm::BitstreamEntry::Record:
3793 // The interesting case.
3794 break;
3795 }
3796
3797 // Read and process a record.
3798 Record.clear();
3799 StringRef Blob;
3800 Expected<unsigned> MaybeRecordType =
3801 Stream.readRecord(Entry.ID, Record, &Blob);
3802 if (!MaybeRecordType)
3803 return MaybeRecordType.takeError();
3804 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3805
3806 // If we're not loading an AST context, we don't care about most records.
3807 if (!ContextObj) {
3808 switch (RecordType) {
3809 case IDENTIFIER_TABLE:
3810 case IDENTIFIER_OFFSET:
3812 case STATISTICS:
3815 case PP_COUNTER_VALUE:
3817 case MODULE_OFFSET_MAP:
3821 case IMPORTED_MODULES:
3822 case MACRO_OFFSET:
3823 case SUBMODULE_METADATA:
3824 break;
3825 default:
3826 continue;
3827 }
3828 }
3829
3830 switch (RecordType) {
3831 default: // Default behavior: ignore.
3832 break;
3833
3834 case SUBMODULE_METADATA: {
3835 F.BaseSubmoduleID = getTotalNumSubmodules();
3840 (const llvm::support::unaligned_uint64_t *)Blob.data();
3841 if (F.LocalNumSubmodules > 0) {
3842 // Introduce the global -> local mapping for submodules within this
3843 // module.
3844 GlobalSubmoduleMap.insert(
3845 std::make_pair(getTotalNumSubmodules() + 1, &F));
3846
3847 // Introduce the local -> global mapping for submodules within this
3848 // module.
3850 std::make_pair(F.LocalBaseSubmoduleID,
3852
3853 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3854 }
3855
3856 auto ReadSubmodule = [&](unsigned LocalID) -> Module * {
3857 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3858 };
3859
3860 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.ModuleName)) {
3861 // If we already knew about this module, make sure to bring all
3862 // submodules up to date.
3863 for (unsigned Index = 0; Index != F.LocalNumSubmodules; ++Index) {
3864 unsigned LocalID =
3866 ReadSubmodule(LocalID);
3867 }
3868 } else {
3869 // If we didn't know this module, we loaded it transitively. Deserialize
3870 // just the top-level module to register it with ModuleMap, but load the
3871 // rest lazily.
3872 ReadSubmodule(F.LocalTopLevelSubmoduleID);
3873 }
3874
3875 break;
3876 }
3877
3878 case TYPE_OFFSET: {
3879 if (F.LocalNumTypes != 0)
3880 return llvm::createStringError(
3881 std::errc::illegal_byte_sequence,
3882 "duplicate TYPE_OFFSET record in AST file");
3883 F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3884 F.LocalNumTypes = Record[0];
3885 F.BaseTypeIndex = getTotalNumTypes();
3886
3887 if (F.LocalNumTypes > 0)
3888 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3889
3890 break;
3891 }
3892
3893 case DECL_OFFSET: {
3894 if (F.LocalNumDecls != 0)
3895 return llvm::createStringError(
3896 std::errc::illegal_byte_sequence,
3897 "duplicate DECL_OFFSET record in AST file");
3898 F.DeclOffsets = (const DeclOffset *)Blob.data();
3899 F.LocalNumDecls = Record[0];
3900 F.BaseDeclIndex = getTotalNumDecls();
3901
3902 if (F.LocalNumDecls > 0)
3903 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3904
3905 break;
3906 }
3907
3908 case TU_UPDATE_LEXICAL: {
3909 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3910 LexicalContents Contents(
3911 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3912 static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3913 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3915 break;
3916 }
3917
3918 case UPDATE_VISIBLE: {
3919 unsigned Idx = 0;
3920 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3921 auto *Data = (const unsigned char*)Blob.data();
3922 PendingVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3923 // If we've already loaded the decl, perform the updates when we finish
3924 // loading this block.
3925 if (Decl *D = GetExistingDecl(ID))
3926 PendingUpdateRecords.push_back(
3927 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3928 break;
3929 }
3930
3932 unsigned Idx = 0;
3933 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3934 auto *Data = (const unsigned char *)Blob.data();
3935 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3936 // If we've already loaded the decl, perform the updates when we finish
3937 // loading this block.
3938 if (Decl *D = GetExistingDecl(ID))
3939 PendingUpdateRecords.push_back(
3940 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3941 break;
3942 }
3943
3945 if (F.Kind != MK_MainFile)
3946 break;
3947 unsigned Idx = 0;
3948 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3949 auto *Data = (const unsigned char *)Blob.data();
3950 TULocalUpdates[ID].push_back(UpdateData{&F, Data});
3951 // If we've already loaded the decl, perform the updates when we finish
3952 // loading this block.
3953 if (Decl *D = GetExistingDecl(ID))
3954 PendingUpdateRecords.push_back(
3955 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3956 break;
3957 }
3958
3960 unsigned Idx = 0;
3961 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3962 auto *Data = (const unsigned char *)Blob.data();
3963 PendingSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3964 // If we've already loaded the decl, perform the updates when we finish
3965 // loading this block.
3966 if (Decl *D = GetExistingDecl(ID))
3967 PendingUpdateRecords.push_back(
3968 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3969 break;
3970 }
3971
3973 unsigned Idx = 0;
3974 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3975 auto *Data = (const unsigned char *)Blob.data();
3976 PendingPartialSpecializationsUpdates[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
3985 case IDENTIFIER_TABLE:
3987 reinterpret_cast<const unsigned char *>(Blob.data());
3988 if (Record[0]) {
3989 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3991 F.IdentifierTableData + sizeof(uint32_t),
3993 ASTIdentifierLookupTrait(*this, F));
3994
3995 PP.getIdentifierTable().setExternalIdentifierLookup(this);
3996 }
3997 break;
3998
3999 case IDENTIFIER_OFFSET: {
4000 if (F.LocalNumIdentifiers != 0)
4001 return llvm::createStringError(
4002 std::errc::illegal_byte_sequence,
4003 "duplicate IDENTIFIER_OFFSET record in AST file");
4004 F.IdentifierOffsets = (const uint32_t *)Blob.data();
4006 F.BaseIdentifierID = getTotalNumIdentifiers();
4007
4008 if (F.LocalNumIdentifiers > 0)
4009 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4011 break;
4012 }
4013
4015 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
4016 break;
4017
4019 // FIXME: Skip reading this record if our ASTConsumer doesn't care
4020 // about "interesting" decls (for instance, if we're building a module).
4021 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4022 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4023 break;
4024
4026 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
4027 // them (ie: if we're not codegenerating this module).
4028 if (F.Kind == MK_MainFile ||
4029 getContext().getLangOpts().BuildingPCHWithObjectFile)
4030 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4031 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
4032 break;
4033
4034 case SPECIAL_TYPES:
4035 if (SpecialTypes.empty()) {
4036 for (unsigned I = 0, N = Record.size(); I != N; ++I)
4037 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
4038 break;
4039 }
4040
4041 if (Record.empty())
4042 break;
4043
4044 if (SpecialTypes.size() != Record.size())
4045 return llvm::createStringError(std::errc::illegal_byte_sequence,
4046 "invalid special-types record");
4047
4048 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4049 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
4050 if (!SpecialTypes[I])
4051 SpecialTypes[I] = ID;
4052 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
4053 // merge step?
4054 }
4055 break;
4056
4057 case STATISTICS:
4058 TotalNumStatements += Record[0];
4059 TotalNumMacros += Record[1];
4060 TotalLexicalDeclContexts += Record[2];
4061 TotalVisibleDeclContexts += Record[3];
4062 TotalModuleLocalVisibleDeclContexts += Record[4];
4063 TotalTULocalVisibleDeclContexts += Record[5];
4064 break;
4065
4067 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4068 UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
4069 break;
4070
4071 case DELEGATING_CTORS:
4072 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4073 DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
4074 break;
4075
4077 if (Record.size() % 3 != 0)
4078 return llvm::createStringError(std::errc::illegal_byte_sequence,
4079 "invalid weak identifiers record");
4080
4081 // FIXME: Ignore weak undeclared identifiers from non-original PCH
4082 // files. This isn't the way to do it :)
4083 WeakUndeclaredIdentifiers.clear();
4084
4085 // Translate the weak, undeclared identifiers into global IDs.
4086 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4087 WeakUndeclaredIdentifiers.push_back(
4088 getGlobalIdentifierID(F, Record[I++]));
4089 WeakUndeclaredIdentifiers.push_back(
4090 getGlobalIdentifierID(F, Record[I++]));
4091 WeakUndeclaredIdentifiers.push_back(
4092 ReadSourceLocation(F, Record, I).getRawEncoding());
4093 }
4094 break;
4095
4097 if (Record.size() % 3 != 0)
4098 return llvm::createStringError(std::errc::illegal_byte_sequence,
4099 "invalid extname identifiers record");
4100
4101 // FIXME: Ignore #pragma redefine_extname'd, undeclared identifiers from
4102 // non-original PCH files. This isn't the way to do it :)
4103 ExtnameUndeclaredIdentifiers.clear();
4104
4105 // Translate the #pragma redefine_extname'd, undeclared identifiers into
4106 // global IDs.
4107 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
4108 ExtnameUndeclaredIdentifiers.push_back(
4109 getGlobalIdentifierID(F, Record[I++]));
4110 ExtnameUndeclaredIdentifiers.push_back(
4111 getGlobalIdentifierID(F, Record[I++]));
4112 ExtnameUndeclaredIdentifiers.push_back(
4113 ReadSourceLocation(F, Record, I).getRawEncoding());
4114 }
4115 break;
4116
4117 case SELECTOR_OFFSETS: {
4118 F.SelectorOffsets = (const uint32_t *)Blob.data();
4120 unsigned LocalBaseSelectorID = Record[1];
4121 F.BaseSelectorID = getTotalNumSelectors();
4122
4123 if (F.LocalNumSelectors > 0) {
4124 // Introduce the global -> local mapping for selectors within this
4125 // module.
4126 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4127
4128 // Introduce the local -> global mapping for selectors within this
4129 // module.
4131 std::make_pair(LocalBaseSelectorID,
4132 F.BaseSelectorID - LocalBaseSelectorID));
4133
4134 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
4135 }
4136 break;
4137 }
4138
4139 case METHOD_POOL:
4140 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
4141 if (Record[0])
4143 = ASTSelectorLookupTable::Create(
4146 ASTSelectorLookupTrait(*this, F));
4147 TotalNumMethodPoolEntries += Record[1];
4148 break;
4149
4151 if (!Record.empty()) {
4152 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
4153 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4154 Record[Idx++]));
4155 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
4156 getRawEncoding());
4157 }
4158 }
4159 break;
4160
4161 case PP_ASSUME_NONNULL_LOC: {
4162 unsigned Idx = 0;
4163 if (!Record.empty())
4164 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4165 ReadSourceLocation(F, Record, Idx));
4166 break;
4167 }
4168
4170 if (!Record.empty()) {
4171 SmallVector<SourceLocation, 64> SrcLocs;
4172 unsigned Idx = 0;
4173 while (Idx < Record.size())
4174 SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
4175 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4176 }
4177 break;
4178 }
4179
4181 if (!Record.empty()) {
4182 unsigned Idx = 0, End = Record.size() - 1;
4183 bool ReachedEOFWhileSkipping = Record[Idx++];
4184 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4185 if (ReachedEOFWhileSkipping) {
4186 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
4187 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
4188 bool FoundNonSkipPortion = Record[Idx++];
4189 bool FoundElse = Record[Idx++];
4190 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
4191 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4192 FoundElse, ElseLoc);
4193 }
4194 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4195 while (Idx < End) {
4196 auto Loc = ReadSourceLocation(F, Record, Idx);
4197 bool WasSkipping = Record[Idx++];
4198 bool FoundNonSkip = Record[Idx++];
4199 bool FoundElse = Record[Idx++];
4200 ConditionalStack.push_back(
4201 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4202 }
4203 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4204 }
4205 break;
4206
4207 case PP_COUNTER_VALUE:
4208 if (!Record.empty() && Listener)
4209 Listener->ReadCounter(F, Record[0]);
4210 break;
4211
4212 case FILE_SORTED_DECLS:
4213 F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
4215 break;
4216
4218 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
4220 SourceLocation::UIntTy SLocSpaceSize = Record[1];
4222 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
4223 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
4224 SLocSpaceSize);
4225 if (!F.SLocEntryBaseID) {
4226 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4227 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4228 return llvm::createStringError(std::errc::invalid_argument,
4229 "ran out of source locations");
4230 }
4231 // Make our entry in the range map. BaseID is negative and growing, so
4232 // we invert it. Because we invert it, though, we need the other end of
4233 // the range.
4234 unsigned RangeStart =
4235 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
4236 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4238
4239 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
4240 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
4241 GlobalSLocOffsetMap.insert(
4242 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
4243 - SLocSpaceSize,&F));
4244
4245 TotalNumSLocEntries += F.LocalNumSLocEntries;
4246 break;
4247 }
4248
4249 case MODULE_OFFSET_MAP:
4250 F.ModuleOffsetMap = Blob;
4251 break;
4252
4254 ParseLineTable(F, Record);
4255 break;
4256
4257 case EXT_VECTOR_DECLS:
4258 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4259 ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
4260 break;
4261
4262 case VTABLE_USES:
4263 if (Record.size() % 3 != 0)
4264 return llvm::createStringError(std::errc::illegal_byte_sequence,
4265 "Invalid VTABLE_USES record");
4266
4267 // Later tables overwrite earlier ones.
4268 // FIXME: Modules will have some trouble with this. This is clearly not
4269 // the right way to do this.
4270 VTableUses.clear();
4271
4272 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
4273 VTableUses.push_back(
4274 {ReadDeclID(F, Record, Idx),
4275 ReadSourceLocation(F, Record, Idx).getRawEncoding(),
4276 (bool)Record[Idx++]});
4277 }
4278 break;
4279
4281
4282 if (Record.size() % 2 != 0)
4283 return llvm::createStringError(
4284 std::errc::illegal_byte_sequence,
4285 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4286
4287 // For standard C++20 module, we will only reads the instantiations
4288 // if it is the main file.
4289 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
4290 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4291 PendingInstantiations.push_back(
4292 {ReadDeclID(F, Record, I),
4293 ReadSourceLocation(F, Record, I).getRawEncoding()});
4294 }
4295 }
4296 break;
4297
4298 case SEMA_DECL_REFS:
4299 if (Record.size() != 3)
4300 return llvm::createStringError(std::errc::illegal_byte_sequence,
4301 "Invalid SEMA_DECL_REFS block");
4302 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4303 SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
4304 break;
4305
4306 case PPD_ENTITIES_OFFSETS: {
4307 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
4308 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
4309 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
4310
4311 unsigned StartingID;
4312 if (!PP.getPreprocessingRecord())
4313 PP.createPreprocessingRecord();
4314 if (!PP.getPreprocessingRecord()->getExternalSource())
4315 PP.getPreprocessingRecord()->SetExternalSource(*this);
4316 StartingID
4317 = PP.getPreprocessingRecord()
4318 ->allocateLoadedEntities(F.NumPreprocessedEntities);
4319 F.BasePreprocessedEntityID = StartingID;
4320
4321 if (F.NumPreprocessedEntities > 0) {
4322 // Introduce the global -> local mapping for preprocessed entities in
4323 // this module.
4324 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4325 }
4326
4327 break;
4328 }
4329
4330 case PPD_SKIPPED_RANGES: {
4331 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
4332 assert(Blob.size() % sizeof(PPSkippedRange) == 0);
4333 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
4334
4335 if (!PP.getPreprocessingRecord())
4336 PP.createPreprocessingRecord();
4337 if (!PP.getPreprocessingRecord()->getExternalSource())
4338 PP.getPreprocessingRecord()->SetExternalSource(*this);
4339 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
4340 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
4341
4343 GlobalSkippedRangeMap.insert(
4344 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
4345 break;
4346 }
4347
4349 if (Record.size() % 2 != 0)
4350 return llvm::createStringError(
4351 std::errc::illegal_byte_sequence,
4352 "invalid DECL_UPDATE_OFFSETS block in AST file");
4353 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4354 GlobalDeclID ID = ReadDeclID(F, Record, I);
4355 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
4356
4357 // If we've already loaded the decl, perform the updates when we finish
4358 // loading this block.
4359 if (Decl *D = GetExistingDecl(ID))
4360 PendingUpdateRecords.push_back(
4361 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4362 }
4363 break;
4364
4366 if (Record.size() % 5 != 0)
4367 return llvm::createStringError(
4368 std::errc::illegal_byte_sequence,
4369 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4370 "file");
4371 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4372 GlobalDeclID ID = ReadDeclID(F, Record, I);
4373
4374 uint64_t BaseOffset = F.DeclsBlockStartOffset;
4375 assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
4376 uint64_t LocalLexicalOffset = Record[I++];
4377 uint64_t LexicalOffset =
4378 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4379 uint64_t LocalVisibleOffset = Record[I++];
4380 uint64_t VisibleOffset =
4381 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4382 uint64_t LocalModuleLocalOffset = Record[I++];
4383 uint64_t ModuleLocalOffset =
4384 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4385 uint64_t TULocalLocalOffset = Record[I++];
4386 uint64_t TULocalOffset =
4387 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4388
4389 DelayedNamespaceOffsetMap[ID] = {
4390 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4391
4392 assert(!GetExistingDecl(ID) &&
4393 "We shouldn't load the namespace in the front of delayed "
4394 "namespace lexical and visible block");
4395 }
4396 break;
4397 }
4398
4399 case RELATED_DECLS_MAP:
4400 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4401 GlobalDeclID ID = ReadDeclID(F, Record, I);
4402 auto &RelatedDecls = RelatedDeclsMap[ID];
4403 unsigned NN = Record[I++];
4404 RelatedDecls.reserve(NN);
4405 for (unsigned II = 0; II < NN; II++)
4406 RelatedDecls.push_back(ReadDeclID(F, Record, I));
4407 }
4408 break;
4409
4411 if (F.LocalNumObjCCategoriesInMap != 0)
4412 return llvm::createStringError(
4413 std::errc::illegal_byte_sequence,
4414 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4415
4417 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
4418 break;
4419
4420 case OBJC_CATEGORIES:
4421 F.ObjCCategories.swap(Record);
4422 break;
4423
4425 // Later tables overwrite earlier ones.
4426 // FIXME: Modules will have trouble with this.
4427 CUDASpecialDeclRefs.clear();
4428 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4429 CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
4430 break;
4431
4433 F.HeaderFileInfoTableData = Blob.data();
4435 if (Record[0]) {
4436 F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create(
4437 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
4438 (const unsigned char *)F.HeaderFileInfoTableData,
4439 HeaderFileInfoTrait(*this, F));
4440
4441 PP.getHeaderSearchInfo().SetExternalSource(this);
4442 if (!PP.getHeaderSearchInfo().getExternalLookup())
4443 PP.getHeaderSearchInfo().SetExternalLookup(this);
4444 }
4445 break;
4446
4447 case FP_PRAGMA_OPTIONS:
4448 // Later tables overwrite earlier ones.
4449 FPPragmaOptions.swap(Record);
4450 break;
4451
4453 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4454 DeclsWithEffectsToVerify.push_back(ReadDeclID(F, Record, I));
4455 break;
4456
4457 case OPENCL_EXTENSIONS:
4458 for (unsigned I = 0, E = Record.size(); I != E; ) {
4459 auto Name = ReadString(Record, I);
4460 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4461 OptInfo.Supported = Record[I++] != 0;
4462 OptInfo.Enabled = Record[I++] != 0;
4463 OptInfo.WithPragma = Record[I++] != 0;
4464 OptInfo.Avail = Record[I++];
4465 OptInfo.Core = Record[I++];
4466 OptInfo.Opt = Record[I++];
4467 }
4468 break;
4469
4471 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4472 TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
4473 break;
4474
4475 case KNOWN_NAMESPACES:
4476 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4477 KnownNamespaces.push_back(ReadDeclID(F, Record, I));
4478 break;
4479
4480 case UNDEFINED_BUT_USED:
4481 if (Record.size() % 2 != 0)
4482 return llvm::createStringError(std::errc::illegal_byte_sequence,
4483 "invalid undefined-but-used record");
4484 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4485 UndefinedButUsed.push_back(
4486 {ReadDeclID(F, Record, I),
4487 ReadSourceLocation(F, Record, I).getRawEncoding()});
4488 }
4489 break;
4490
4492 for (unsigned I = 0, N = Record.size(); I != N;) {
4493 DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
4494 const uint64_t Count = Record[I++];
4495 DelayedDeleteExprs.push_back(Count);
4496 for (uint64_t C = 0; C < Count; ++C) {
4497 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
4498 bool IsArrayForm = Record[I++] == 1;
4499 DelayedDeleteExprs.push_back(IsArrayForm);
4500 }
4501 }
4502 break;
4503
4504 case VTABLES_TO_EMIT:
4505 if (F.Kind == MK_MainFile ||
4506 getContext().getLangOpts().BuildingPCHWithObjectFile)
4507 for (unsigned I = 0, N = Record.size(); I != N;)
4508 VTablesToEmit.push_back(ReadDeclID(F, Record, I));
4509 break;
4510
4511 case IMPORTED_MODULES:
4512 if (!F.isModule()) {
4513 // If we aren't loading a module (which has its own exports), make
4514 // all of the imported modules visible.
4515 // FIXME: Deal with macros-only imports.
4516 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
4517 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
4518 SourceLocation Loc = ReadSourceLocation(F, Record, I);
4519 if (GlobalID) {
4520 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4521 if (DeserializationListener)
4522 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4523 }
4524 }
4525 }
4526 break;
4527
4528 case MACRO_OFFSET: {
4529 if (F.LocalNumMacros != 0)
4530 return llvm::createStringError(
4531 std::errc::illegal_byte_sequence,
4532 "duplicate MACRO_OFFSET record in AST file");
4533 F.MacroOffsets = (const uint32_t *)Blob.data();
4534 F.LocalNumMacros = Record[0];
4536 F.BaseMacroID = getTotalNumMacros();
4537
4538 if (F.LocalNumMacros > 0)
4539 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
4540 break;
4541 }
4542
4544 LateParsedTemplates.emplace_back(
4545 std::piecewise_construct, std::forward_as_tuple(&F),
4546 std::forward_as_tuple(Record.begin(), Record.end()));
4547 break;
4548
4550 if (Record.size() != 1)
4551 return llvm::createStringError(std::errc::illegal_byte_sequence,
4552 "invalid pragma optimize record");
4553 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
4554 break;
4555
4557 if (Record.size() != 1)
4558 return llvm::createStringError(std::errc::illegal_byte_sequence,
4559 "invalid pragma ms_struct record");
4560 PragmaMSStructState = Record[0];
4561 break;
4562
4564 if (Record.size() != 2)
4565 return llvm::createStringError(
4566 std::errc::illegal_byte_sequence,
4567 "invalid pragma pointers to members record");
4568 PragmaMSPointersToMembersState = Record[0];
4569 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4570 break;
4571
4573 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4574 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4575 break;
4576
4578 if (Record.size() != 1)
4579 return llvm::createStringError(std::errc::illegal_byte_sequence,
4580 "invalid cuda pragma options record");
4581 ForceHostDeviceDepth = Record[0];
4582 break;
4583
4585 if (Record.size() < 3)
4586 return llvm::createStringError(std::errc::illegal_byte_sequence,
4587 "invalid pragma pack record");
4588 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4589 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4590 unsigned NumStackEntries = Record[2];
4591 unsigned Idx = 3;
4592 // Reset the stack when importing a new module.
4593 PragmaAlignPackStack.clear();
4594 for (unsigned I = 0; I < NumStackEntries; ++I) {
4595 PragmaAlignPackStackEntry Entry;
4596 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4597 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4598 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4599 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4600 Entry.SlotLabel = PragmaAlignPackStrings.back();
4601 PragmaAlignPackStack.push_back(Entry);
4602 }
4603 break;
4604 }
4605
4607 if (Record.size() < 3)
4608 return llvm::createStringError(std::errc::illegal_byte_sequence,
4609 "invalid pragma float control record");
4610 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4611 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4612 unsigned NumStackEntries = Record[2];
4613 unsigned Idx = 3;
4614 // Reset the stack when importing a new module.
4615 FpPragmaStack.clear();
4616 for (unsigned I = 0; I < NumStackEntries; ++I) {
4617 FpPragmaStackEntry Entry;
4618 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4619 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4620 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4621 FpPragmaStrings.push_back(ReadString(Record, Idx));
4622 Entry.SlotLabel = FpPragmaStrings.back();
4623 FpPragmaStack.push_back(Entry);
4624 }
4625 break;
4626 }
4627
4629 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4630 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4631 break;
4632
4634 unsigned NumRecords = Record.front();
4635 // Last record which is used to keep number of valid records.
4636 if (Record.size() - 1 != NumRecords)
4637 return llvm::createStringError(std::errc::illegal_byte_sequence,
4638 "invalid rvv intrinsic pragma record");
4639
4640 if (RISCVVecIntrinsicPragma.empty())
4641 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4642 // There might be multiple precompiled modules imported, we need to union
4643 // them all.
4644 for (unsigned i = 0; i < NumRecords; ++i)
4645 RISCVVecIntrinsicPragma[i] |= Record[i + 1];
4646 break;
4647 }
4648 }
4649 }
4650}
4651
4652void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4653 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4654
4655 // Additional remapping information.
4656 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4657 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4658 F.ModuleOffsetMap = StringRef();
4659
4661 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4662 RemapBuilder SelectorRemap(F.SelectorRemap);
4663
4664 auto &ImportedModuleVector = F.TransitiveImports;
4665 assert(ImportedModuleVector.empty());
4666
4667 while (Data < DataEnd) {
4668 // FIXME: Looking up dependency modules by filename is horrible. Let's
4669 // start fixing this with prebuilt, explicit and implicit modules and see
4670 // how it goes...
4671 using namespace llvm::support;
4672 ModuleKind Kind = static_cast<ModuleKind>(
4673 endian::readNext<uint8_t, llvm::endianness::little>(Data));
4674 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4675 StringRef Name = StringRef((const char*)Data, Len);
4676 Data += Len;
4677 ModuleFile *OM =
4680 ? ModuleMgr.lookupByModuleName(Name)
4681 : ModuleMgr.lookupByFileName(ModuleFileName::makeExplicit(Name)));
4682 if (!OM) {
4683 std::string Msg = "refers to unknown module, cannot find ";
4684 Msg.append(std::string(Name));
4685 Error(Msg);
4686 return;
4687 }
4688
4689 ImportedModuleVector.push_back(OM);
4690
4691 uint32_t SubmoduleIDOffset =
4692 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4693 uint32_t SelectorIDOffset =
4694 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4695
4696 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4697 RemapBuilder &Remap) {
4698 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4699 if (Offset != None)
4700 Remap.insert(std::make_pair(Offset,
4701 static_cast<int>(BaseOffset - Offset)));
4702 };
4703
4704 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4705 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4706 }
4707}
4708
4710ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4711 const ModuleFile *ImportedBy,
4712 unsigned ClientLoadCapabilities) {
4713 unsigned Idx = 0;
4714 F.ModuleMapPath = ReadPath(F, Record, Idx);
4715
4716 // Try to resolve ModuleName in the current header search context and
4717 // verify that it is found in the same module map file as we saved. If the
4718 // top-level AST file is a main file, skip this check because there is no
4719 // usable header search context.
4720 assert(!F.ModuleName.empty() &&
4721 "MODULE_NAME should come before MODULE_MAP_FILE");
4722 auto [MaybeM, IgnoreError] =
4723 getModuleForRelocationChecks(F, /*DirectoryCheck=*/false);
4724 if (MaybeM.has_value()) {
4725 // An implicitly-loaded module file should have its module listed in some
4726 // module map file that we've already loaded.
4727 Module *M = MaybeM.value();
4728 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4729 OptionalFileEntryRef ModMap =
4730 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4731 if (!IgnoreError && !ModMap) {
4732 if (M && M->Directory)
4733 Diag(diag::remark_module_relocated)
4734 << F.ModuleName << F.BaseDirectory << M->Directory->getName();
4735
4736 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4737 if (auto ASTFileName = M ? M->getASTFileName() : nullptr) {
4738 // This module was defined by an imported (explicit) module.
4739 Diag(diag::err_module_file_conflict)
4740 << F.ModuleName << F.FileName << *ASTFileName;
4741 // TODO: Add a note with the module map paths if they differ.
4742 } else {
4743 // This module was built with a different module map.
4744 Diag(diag::err_imported_module_not_found)
4745 << F.ModuleName << F.FileName
4746 << (ImportedBy ? ImportedBy->FileName.str() : "")
4747 << F.ModuleMapPath << !ImportedBy;
4748 // In case it was imported by a PCH, there's a chance the user is
4749 // just missing to include the search path to the directory containing
4750 // the modulemap.
4751 if (ImportedBy && ImportedBy->Kind == MK_PCH)
4752 Diag(diag::note_imported_by_pch_module_not_found)
4753 << llvm::sys::path::parent_path(F.ModuleMapPath);
4754 }
4755 }
4756 return OutOfDate;
4757 }
4758
4759 assert(M && M->Name == F.ModuleName && "found module with different name");
4760
4761 // Check the primary module map file.
4762 auto StoredModMap = FileMgr.getOptionalFileRef(F.ModuleMapPath);
4763 if (!StoredModMap || *StoredModMap != ModMap) {
4764 assert(ModMap && "found module is missing module map file");
4765 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4766 "top-level import should be verified");
4767 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4768 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4769 Diag(diag::err_imported_module_modmap_changed)
4770 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4771 << ModMap->getName() << F.ModuleMapPath << NotImported;
4772 return OutOfDate;
4773 }
4774
4775 ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4776 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4777 // FIXME: we should use input files rather than storing names.
4778 std::string Filename = ReadPath(F, Record, Idx);
4779 auto SF = FileMgr.getOptionalFileRef(Filename, false, false);
4780 if (!SF) {
4781 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4782 Error("could not find file '" + Filename +"' referenced by AST file");
4783 return OutOfDate;
4784 }
4785 AdditionalStoredMaps.insert(*SF);
4786 }
4787
4788 // Check any additional module map files (e.g. module.private.modulemap)
4789 // that are not in the pcm.
4790 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4791 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4792 // Remove files that match
4793 // Note: SmallPtrSet::erase is really remove
4794 if (!AdditionalStoredMaps.erase(ModMap)) {
4795 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4796 Diag(diag::err_module_different_modmap)
4797 << F.ModuleName << /*new*/0 << ModMap.getName();
4798 return OutOfDate;
4799 }
4800 }
4801 }
4802
4803 // Check any additional module map files that are in the pcm, but not
4804 // found in header search. Cases that match are already removed.
4805 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4806 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4807 Diag(diag::err_module_different_modmap)
4808 << F.ModuleName << /*not new*/1 << ModMap.getName();
4809 return OutOfDate;
4810 }
4811 }
4812
4813 if (Listener)
4814 Listener->ReadModuleMapFile(F.ModuleMapPath);
4815 return Success;
4816}
4817
4818/// Move the given method to the back of the global list of methods.
4820 // Find the entry for this selector in the method pool.
4821 SemaObjC::GlobalMethodPool::iterator Known =
4822 S.ObjC().MethodPool.find(Method->getSelector());
4823 if (Known == S.ObjC().MethodPool.end())
4824 return;
4825
4826 // Retrieve the appropriate method list.
4827 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4828 : Known->second.second;
4829 bool Found = false;
4830 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4831 if (!Found) {
4832 if (List->getMethod() == Method) {
4833 Found = true;
4834 } else {
4835 // Keep searching.
4836 continue;
4837 }
4838 }
4839
4840 if (List->getNext())
4841 List->setMethod(List->getNext()->getMethod());
4842 else
4843 List->setMethod(Method);
4844 }
4845}
4846
4847void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4848 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4849 for (Decl *D : Names) {
4850 bool wasHidden = !D->isUnconditionallyVisible();
4852
4853 if (wasHidden && SemaObj) {
4854 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4856 }
4857 }
4858 }
4859}
4860
4862 Module::NameVisibilityKind NameVisibility,
4863 SourceLocation ImportLoc) {
4866 Stack.push_back(Mod);
4867 while (!Stack.empty()) {
4868 Mod = Stack.pop_back_val();
4869
4870 if (NameVisibility <= Mod->NameVisibility) {
4871 // This module already has this level of visibility (or greater), so
4872 // there is nothing more to do.
4873 continue;
4874 }
4875
4876 if (Mod->isUnimportable()) {
4877 // Modules that aren't importable cannot be made visible.
4878 continue;
4879 }
4880
4881 // Update the module's name visibility.
4882 Mod->NameVisibility = NameVisibility;
4883
4884 // If we've already deserialized any names from this module,
4885 // mark them as visible.
4886 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4887 if (Hidden != HiddenNamesMap.end()) {
4888 auto HiddenNames = std::move(*Hidden);
4889 HiddenNamesMap.erase(Hidden);
4890 makeNamesVisible(HiddenNames.second, HiddenNames.first);
4891 assert(!HiddenNamesMap.contains(Mod) &&
4892 "making names visible added hidden names");
4893 }
4894
4895 // Push any exported modules onto the stack to be marked as visible.
4897 Mod->getExportedModules(Exports);
4899 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4900 Module *Exported = *I;
4901 if (Visited.insert(Exported).second)
4902 Stack.push_back(Exported);
4903 }
4904 }
4905}
4906
4907/// We've merged the definition \p MergedDef into the existing definition
4908/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4909/// visible.
4911 NamedDecl *MergedDef) {
4912 if (!Def->isUnconditionallyVisible()) {
4913 // If MergedDef is visible or becomes visible, make the definition visible.
4914 if (MergedDef->isUnconditionallyVisible())
4916 else {
4917 getContext().mergeDefinitionIntoModule(
4918 Def, MergedDef->getImportedOwningModule(),
4919 /*NotifyListeners*/ false);
4920 PendingMergedDefinitionsToDeduplicate.insert(Def);
4921 }
4922 }
4923}
4924
4926 if (GlobalIndex)
4927 return false;
4928
4929 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4930 !PP.getLangOpts().Modules)
4931 return true;
4932
4933 // Try to load the global index.
4934 TriedLoadingGlobalIndex = true;
4935 StringRef SpecificModuleCachePath =
4936 getPreprocessor().getHeaderSearchInfo().getSpecificModuleCachePath();
4937 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4938 GlobalModuleIndex::readIndex(SpecificModuleCachePath);
4939 if (llvm::Error Err = std::move(Result.second)) {
4940 assert(!Result.first);
4941 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4942 return true;
4943 }
4944
4945 GlobalIndex.reset(Result.first);
4946 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4947 return false;
4948}
4949
4951 return PP.getLangOpts().Modules && UseGlobalIndex &&
4952 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4953}
4954
4955/// Given a cursor at the start of an AST file, scan ahead and drop the
4956/// cursor into the start of the given block ID, returning false on success and
4957/// true on failure.
4958static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4959 while (true) {
4960 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4961 if (!MaybeEntry) {
4962 // FIXME this drops errors on the floor.
4963 consumeError(MaybeEntry.takeError());
4964 return true;
4965 }
4966 llvm::BitstreamEntry Entry = MaybeEntry.get();
4967
4968 switch (Entry.Kind) {
4969 case llvm::BitstreamEntry::Error:
4970 case llvm::BitstreamEntry::EndBlock:
4971 return true;
4972
4973 case llvm::BitstreamEntry::Record:
4974 // Ignore top-level records.
4975 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4976 break;
4977 else {
4978 // FIXME this drops errors on the floor.
4979 consumeError(Skipped.takeError());
4980 return true;
4981 }
4982
4983 case llvm::BitstreamEntry::SubBlock:
4984 if (Entry.ID == BlockID) {
4985 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4986 // FIXME this drops the error on the floor.
4987 consumeError(std::move(Err));
4988 return true;
4989 }
4990 // Found it!
4991 return false;
4992 }
4993
4994 if (llvm::Error Err = Cursor.SkipBlock()) {
4995 // FIXME this drops the error on the floor.
4996 consumeError(std::move(Err));
4997 return true;
4998 }
4999 }
5000 }
5001}
5002
5005 SourceLocation ImportLoc,
5006 unsigned ClientLoadCapabilities,
5007 ModuleFile **NewLoadedModuleFile) {
5008 llvm::TimeTraceScope scope("ReadAST", FileName);
5009
5010 llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
5012 CurrentDeserializingModuleKind, Type);
5013
5014 // Defer any pending actions until we get to the end of reading the AST file.
5015 Deserializing AnASTFile(this);
5016
5017 // Bump the generation number.
5018 unsigned PreviousGeneration = 0;
5019 if (ContextObj)
5020 PreviousGeneration = incrementGeneration(*ContextObj);
5021
5022 unsigned NumModules = ModuleMgr.size();
5024 if (ASTReadResult ReadResult =
5025 ReadASTCore(FileName, Type, ImportLoc,
5026 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
5027 ClientLoadCapabilities)) {
5028 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5029
5030 // If we find that any modules are unusable, the global index is going
5031 // to be out-of-date. Just remove it.
5032 GlobalIndex.reset();
5033 ModuleMgr.setGlobalIndex(nullptr);
5034 return ReadResult;
5035 }
5036
5037 if (NewLoadedModuleFile && !Loaded.empty())
5038 *NewLoadedModuleFile = Loaded.back().Mod;
5039
5040 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
5041 // remove modules from this point. Various fields are updated during reading
5042 // the AST block and removing the modules would result in dangling pointers.
5043 // They are generally only incidentally dereferenced, ie. a binary search
5044 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
5045 // be dereferenced but it wouldn't actually be used.
5046
5047 // Load the AST blocks of all of the modules that we loaded. We can still
5048 // hit errors parsing the ASTs at this point.
5049 for (ImportedModule &M : Loaded) {
5050 ModuleFile &F = *M.Mod;
5051 llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
5052
5053 // Read the AST block.
5054 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5055 Error(std::move(Err));
5056 return Failure;
5057 }
5058
5059 // The AST block should always have a definition for the main module.
5060 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
5061 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
5062 return Failure;
5063 }
5064
5065 // Read the extension blocks.
5067 if (llvm::Error Err = ReadExtensionBlock(F)) {
5068 Error(std::move(Err));
5069 return Failure;
5070 }
5071 }
5072
5073 // Once read, set the ModuleFile bit base offset and update the size in
5074 // bits of all files we've seen.
5075 F.GlobalBitOffset = TotalModulesSizeInBits;
5076 TotalModulesSizeInBits += F.SizeInBits;
5077 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
5078 }
5079
5080 // Preload source locations and interesting indentifiers.
5081 for (ImportedModule &M : Loaded) {
5082 ModuleFile &F = *M.Mod;
5083
5084 // Map the original source file ID into the ID space of the current
5085 // compilation.
5088
5089 for (auto Offset : F.PreloadIdentifierOffsets) {
5090 const unsigned char *Data = F.IdentifierTableData + Offset;
5091
5092 ASTIdentifierLookupTrait Trait(*this, F);
5093 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
5094 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
5095
5096 IdentifierInfo *II;
5097 if (!PP.getLangOpts().CPlusPlus) {
5098 // Identifiers present in both the module file and the importing
5099 // instance are marked out-of-date so that they can be deserialized
5100 // on next use via ASTReader::updateOutOfDateIdentifier().
5101 // Identifiers present in the module file but not in the importing
5102 // instance are ignored for now, preventing growth of the identifier
5103 // table. They will be deserialized on first use via ASTReader::get().
5104 auto It = PP.getIdentifierTable().find(Key);
5105 if (It == PP.getIdentifierTable().end())
5106 continue;
5107 II = It->second;
5108 } else {
5109 // With C++ modules, not many identifiers are considered interesting.
5110 // All identifiers in the module file can be placed into the identifier
5111 // table of the importing instance and marked as out-of-date. This makes
5112 // ASTReader::get() a no-op, and deserialization will take place on
5113 // first/next use via ASTReader::updateOutOfDateIdentifier().
5114 II = &PP.getIdentifierTable().getOwn(Key);
5115 }
5116
5117 II->setOutOfDate(true);
5118
5119 // Mark this identifier as being from an AST file so that we can track
5120 // whether we need to serialize it.
5121 markIdentifierFromAST(*this, *II, /*IsModule=*/true);
5122
5123 // Associate the ID with the identifier so that the writer can reuse it.
5124 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
5125 SetIdentifierInfo(ID, II);
5126 }
5127 }
5128
5129 // Builtins and library builtins have already been initialized. Mark all
5130 // identifiers as out-of-date, so that they are deserialized on first use.
5131 if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
5132 for (auto &Id : PP.getIdentifierTable())
5133 Id.second->setOutOfDate(true);
5134
5135 // Mark selectors as out of date.
5136 for (const auto &Sel : SelectorGeneration)
5137 SelectorOutOfDate[Sel.first] = true;
5138
5139 // Setup the import locations and notify the module manager that we've
5140 // committed to these module files.
5141 for (ImportedModule &M : Loaded) {
5142 ModuleFile &F = *M.Mod;
5143
5144 ModuleMgr.moduleFileAccepted(&F);
5145
5146 // Set the import location.
5147 F.DirectImportLoc = ImportLoc;
5148 // FIXME: We assume that locations from PCH / preamble do not need
5149 // any translation.
5150 if (!M.ImportedBy)
5151 F.ImportLoc = M.ImportLoc;
5152 else
5153 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
5154 }
5155
5156 // FIXME: How do we load the 'use'd modules? They may not be submodules.
5157 // Might be unnecessary as use declarations are only used to build the
5158 // module itself.
5159
5160 if (ContextObj)
5162
5163 if (SemaObj)
5164 UpdateSema();
5165
5166 if (DeserializationListener)
5167 DeserializationListener->ReaderInitialized(this);
5168
5169 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5170 if (PrimaryModule.OriginalSourceFileID.isValid()) {
5171 // If this AST file is a precompiled preamble, then set the
5172 // preamble file ID of the source manager to the file source file
5173 // from which the preamble was built.
5174 if (Type == MK_Preamble) {
5175 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
5176 } else if (Type == MK_MainFile) {
5177 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
5178 }
5179 }
5180
5181 // For any Objective-C class definitions we have already loaded, make sure
5182 // that we load any additional categories.
5183 if (ContextObj) {
5184 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5185 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5186 ObjCClassesLoaded[I], PreviousGeneration);
5187 }
5188 }
5189
5190 const HeaderSearchOptions &HSOpts =
5191 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5193 // Now we are certain that the module and all modules it depends on are
5194 // up-to-date. For implicitly-built module files, ensure the corresponding
5195 // timestamp files are up-to-date in this build session.
5196 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5197 ImportedModule &M = Loaded[I];
5198 if (M.Mod->Kind == MK_ImplicitModule &&
5200 getModuleManager().getModuleCache().updateModuleTimestamp(
5201 M.Mod->FileName);
5202 }
5203 }
5204
5205 return Success;
5206}
5207
5208static ASTFileSignature readASTFileSignature(StringRef PCH);
5209
5210/// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
5211static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
5212 // FIXME checking magic headers is done in other places such as
5213 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
5214 // always done the same. Unify it all with a helper.
5215 if (!Stream.canSkipToPos(4))
5216 return llvm::createStringError(
5217 std::errc::illegal_byte_sequence,
5218 "file too small to contain precompiled file magic");
5219 for (unsigned C : {'C', 'P', 'C', 'H'})
5220 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
5221 if (Res.get() != C)
5222 return llvm::createStringError(
5223 std::errc::illegal_byte_sequence,
5224 "file doesn't start with precompiled file magic");
5225 } else
5226 return Res.takeError();
5227 return llvm::Error::success();
5228}
5229
5231 switch (Kind) {
5232 case MK_PCH:
5233 return 0; // PCH
5234 case MK_ImplicitModule:
5235 case MK_ExplicitModule:
5236 case MK_PrebuiltModule:
5237 return 1; // module
5238 case MK_MainFile:
5239 case MK_Preamble:
5240 return 2; // main source file
5241 }
5242 llvm_unreachable("unknown module kind");
5243}
5244
5247 ModuleFile *ImportedBy, SmallVectorImpl<ImportedModule> &Loaded,
5248 off_t ExpectedSize, time_t ExpectedModTime,
5249 ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities) {
5250 auto Result = ModuleMgr.addModule(
5251 FileName, Type, ImportLoc, ImportedBy, getGeneration(), ExpectedSize,
5252 ExpectedModTime, ExpectedSignature, readASTFileSignature);
5253 ModuleFile *M = Result.getModule();
5254
5255 switch (Result.getKind()) {
5257 Diag(diag::remark_module_import)
5258 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5259 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5260 return Success;
5261 }
5262
5264 // Load module file below.
5265 break;
5266
5268 // The module file was missing; if the client can handle that, return
5269 // it.
5270 if (ClientLoadCapabilities & ARR_Missing)
5271 return Missing;
5272
5273 // Otherwise, return an error.
5274 Diag(diag::err_ast_file_not_found)
5276 if (!Result.getBufferError().empty())
5277 Diag(diag::note_ast_file_buffer_failed) << Result.getBufferError();
5278 return Failure;
5279
5281 // We couldn't load the module file because it is out-of-date. If the
5282 // client can handle out-of-date, return it.
5283 if (ClientLoadCapabilities & ARR_OutOfDate)
5284 return OutOfDate;
5285
5286 // Otherwise, return an error.
5287 Diag(diag::err_ast_file_out_of_date)
5289 for (const auto &C : Result.getChanges()) {
5290 Diag(diag::note_fe_ast_file_modified)
5291 << C.Kind << (C.Old && C.New) << llvm::itostr(C.Old.value_or(0))
5292 << llvm::itostr(C.New.value_or(0));
5293 }
5294 Diag(diag::note_ast_file_input_files_validation_status)
5295 << Result.getValidationStatus();
5296 if (!Result.getSignatureError().empty())
5297 Diag(diag::note_ast_file_signature_failed) << Result.getSignatureError();
5298 return Failure;
5299
5301 llvm_unreachable("Unexpected value from adding module.");
5302 }
5303
5304 assert(M && "Missing module file");
5305
5306 bool ShouldFinalizePCM = false;
5307 llvm::scope_exit FinalizeOrDropPCM([&]() {
5308 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5309 if (ShouldFinalizePCM)
5310 MC.finalizePCM(FileName);
5311 else
5312 MC.tryToDropPCM(FileName);
5313 });
5314 ModuleFile &F = *M;
5315 BitstreamCursor &Stream = F.Stream;
5316 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5317 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5318
5319 // Sniff for the signature.
5320 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5321 Diag(diag::err_ast_file_invalid)
5322 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5323 return Failure;
5324 }
5325
5326 // This is used for compatibility with older PCH formats.
5327 bool HaveReadControlBlock = false;
5328 while (true) {
5329 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5330 if (!MaybeEntry) {
5331 Error(MaybeEntry.takeError());
5332 return Failure;
5333 }
5334 llvm::BitstreamEntry Entry = MaybeEntry.get();
5335
5336 switch (Entry.Kind) {
5337 case llvm::BitstreamEntry::Error:
5338 case llvm::BitstreamEntry::Record:
5339 case llvm::BitstreamEntry::EndBlock:
5340 Error("invalid record at top-level of AST file");
5341 return Failure;
5342
5343 case llvm::BitstreamEntry::SubBlock:
5344 break;
5345 }
5346
5347 switch (Entry.ID) {
5348 case CONTROL_BLOCK_ID:
5349 HaveReadControlBlock = true;
5350 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5351 case Success:
5352 // Check that we didn't try to load a non-module AST file as a module.
5353 //
5354 // FIXME: Should we also perform the converse check? Loading a module as
5355 // a PCH file sort of works, but it's a bit wonky.
5357 Type == MK_PrebuiltModule) &&
5358 F.ModuleName.empty()) {
5360 if (Result != OutOfDate ||
5361 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5362 Diag(diag::err_module_file_not_module) << FileName;
5363 return Result;
5364 }
5365 break;
5366
5367 case Failure: return Failure;
5368 case Missing: return Missing;
5369 case OutOfDate: return OutOfDate;
5370 case VersionMismatch: return VersionMismatch;
5372 case HadErrors: return HadErrors;
5373 }
5374 break;
5375
5376 case AST_BLOCK_ID:
5377 if (!HaveReadControlBlock) {
5378 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5379 Diag(diag::err_ast_file_version_too_old)
5381 return VersionMismatch;
5382 }
5383
5384 // Record that we've loaded this module.
5385 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5386 ShouldFinalizePCM = true;
5387 return Success;
5388
5389 default:
5390 if (llvm::Error Err = Stream.SkipBlock()) {
5391 Error(std::move(Err));
5392 return Failure;
5393 }
5394 break;
5395 }
5396 }
5397
5398 llvm_unreachable("unexpected break; expected return");
5399}
5400
5402ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5403 unsigned ClientLoadCapabilities) {
5404 const HeaderSearchOptions &HSOpts =
5405 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5406 bool AllowCompatibleConfigurationMismatch =
5408 bool DisableValidation = shouldDisableValidationForFile(F);
5409
5410 ASTReadResult Result = readUnhashedControlBlockImpl(
5411 &F, F.Data, F.FileName, ClientLoadCapabilities,
5412 AllowCompatibleConfigurationMismatch, Listener.get(),
5413 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5414
5415 // If F was directly imported by another module, it's implicitly validated by
5416 // the importing module.
5417 if (DisableValidation || WasImportedBy ||
5418 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5419 return Success;
5420
5421 if (Result == Failure) {
5422 Error("malformed block record in AST file");
5423 return Failure;
5424 }
5425
5426 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5427 // If this module has already been finalized in the ModuleCache, we're stuck
5428 // with it; we can only load a single version of each module.
5429 //
5430 // This can happen when a module is imported in two contexts: in one, as a
5431 // user module; in another, as a system module (due to an import from
5432 // another module marked with the [system] flag). It usually indicates a
5433 // bug in the module map: this module should also be marked with [system].
5434 //
5435 // If -Wno-system-headers (the default), and the first import is as a
5436 // system module, then validation will fail during the as-user import,
5437 // since -Werror flags won't have been validated. However, it's reasonable
5438 // to treat this consistently as a system module.
5439 //
5440 // If -Wsystem-headers, the PCM on disk was built with
5441 // -Wno-system-headers, and the first import is as a user module, then
5442 // validation will fail during the as-system import since the PCM on disk
5443 // doesn't guarantee that -Werror was respected. However, the -Werror
5444 // flags were checked during the initial as-user import.
5445 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5446 F.FileName)) {
5447 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5448 return Success;
5449 }
5450 }
5451
5452 return Result;
5453}
5454
5455ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5456 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5457 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5458 ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5459 // Initialize a stream.
5460 BitstreamCursor Stream(StreamData);
5461
5462 // Sniff for the signature.
5463 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5464 // FIXME this drops the error on the floor.
5465 consumeError(std::move(Err));
5466 return Failure;
5467 }
5468
5469 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5471 return Failure;
5472
5473 // Read all of the records in the options block.
5474 RecordData Record;
5475 ASTReadResult Result = Success;
5476 while (true) {
5477 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5478 if (!MaybeEntry) {
5479 // FIXME this drops the error on the floor.
5480 consumeError(MaybeEntry.takeError());
5481 return Failure;
5482 }
5483 llvm::BitstreamEntry Entry = MaybeEntry.get();
5484
5485 switch (Entry.Kind) {
5486 case llvm::BitstreamEntry::Error:
5487 case llvm::BitstreamEntry::SubBlock:
5488 return Failure;
5489
5490 case llvm::BitstreamEntry::EndBlock:
5491 return Result;
5492
5493 case llvm::BitstreamEntry::Record:
5494 // The interesting case.
5495 break;
5496 }
5497
5498 // Read and process a record.
5499 Record.clear();
5500 StringRef Blob;
5501 Expected<unsigned> MaybeRecordType =
5502 Stream.readRecord(Entry.ID, Record, &Blob);
5503 if (!MaybeRecordType) {
5504 // FIXME this drops the error.
5505 return Failure;
5506 }
5507 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5508 case SIGNATURE:
5509 if (F) {
5510 F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5512 "Dummy AST file signature not backpatched in ASTWriter.");
5513 }
5514 break;
5515 case AST_BLOCK_HASH:
5516 if (F) {
5517 F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5519 "Dummy AST block hash not backpatched in ASTWriter.");
5520 }
5521 break;
5522 case DIAGNOSTIC_OPTIONS: {
5523 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5524 if (Listener && ValidateDiagnosticOptions &&
5525 !AllowCompatibleConfigurationMismatch &&
5526 ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5527 Result = OutOfDate; // Don't return early. Read the signature.
5528 break;
5529 }
5530 case HEADER_SEARCH_PATHS: {
5531 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5532 if (Listener && !AllowCompatibleConfigurationMismatch &&
5533 ParseHeaderSearchPaths(Record, Complain, *Listener))
5534 Result = ConfigurationMismatch;
5535 break;
5536 }
5538 if (!F)
5539 break;
5540 if (F->PragmaDiagMappings.empty())
5541 F->PragmaDiagMappings.swap(Record);
5542 else
5543 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5544 Record.begin(), Record.end());
5545 break;
5547 if (F)
5548 F->SearchPathUsage = ReadBitVector(Record, Blob);
5549 break;
5550 case VFS_USAGE:
5551 if (F)
5552 F->VFSUsage = ReadBitVector(Record, Blob);
5553 break;
5554 }
5555 }
5556}
5557
5558/// Parse a record and blob containing module file extension metadata.
5561 StringRef Blob,
5562 ModuleFileExtensionMetadata &Metadata) {
5563 if (Record.size() < 4) return true;
5564
5565 Metadata.MajorVersion = Record[0];
5566 Metadata.MinorVersion = Record[1];
5567
5568 unsigned BlockNameLen = Record[2];
5569 unsigned UserInfoLen = Record[3];
5570
5571 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5572
5573 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5574 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5575 Blob.data() + BlockNameLen + UserInfoLen);
5576 return false;
5577}
5578
5579llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5580 BitstreamCursor &Stream = F.Stream;
5581
5582 RecordData Record;
5583 while (true) {
5584 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5585 if (!MaybeEntry)
5586 return MaybeEntry.takeError();
5587 llvm::BitstreamEntry Entry = MaybeEntry.get();
5588
5589 switch (Entry.Kind) {
5590 case llvm::BitstreamEntry::SubBlock:
5591 if (llvm::Error Err = Stream.SkipBlock())
5592 return Err;
5593 continue;
5594 case llvm::BitstreamEntry::EndBlock:
5595 return llvm::Error::success();
5596 case llvm::BitstreamEntry::Error:
5597 return llvm::createStringError(std::errc::illegal_byte_sequence,
5598 "malformed block record in AST file");
5599 case llvm::BitstreamEntry::Record:
5600 break;
5601 }
5602
5603 Record.clear();
5604 StringRef Blob;
5605 Expected<unsigned> MaybeRecCode =
5606 Stream.readRecord(Entry.ID, Record, &Blob);
5607 if (!MaybeRecCode)
5608 return MaybeRecCode.takeError();
5609 switch (MaybeRecCode.get()) {
5610 case EXTENSION_METADATA: {
5611 ModuleFileExtensionMetadata Metadata;
5612 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5613 return llvm::createStringError(
5614 std::errc::illegal_byte_sequence,
5615 "malformed EXTENSION_METADATA in AST file");
5616
5617 // Find a module file extension with this block name.
5618 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5619 if (Known == ModuleFileExtensions.end()) break;
5620
5621 // Form a reader.
5622 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5623 F, Stream)) {
5624 F.ExtensionReaders.push_back(std::move(Reader));
5625 }
5626
5627 break;
5628 }
5629 }
5630 }
5631
5632 llvm_unreachable("ReadExtensionBlock should return from while loop");
5633}
5634
5636 assert(ContextObj && "no context to initialize");
5637 ASTContext &Context = *ContextObj;
5638
5639 // If there's a listener, notify them that we "read" the translation unit.
5640 if (DeserializationListener)
5641 DeserializationListener->DeclRead(
5643 Context.getTranslationUnitDecl());
5644
5645 // FIXME: Find a better way to deal with collisions between these
5646 // built-in types. Right now, we just ignore the problem.
5647
5648 // Load the special types.
5649 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5650 if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5651 if (!Context.CFConstantStringTypeDecl)
5652 Context.setCFConstantStringType(GetType(String));
5653 }
5654
5655 if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5656 QualType FileType = GetType(File);
5657 if (FileType.isNull()) {
5658 Error("FILE type is NULL");
5659 return;
5660 }
5661
5662 if (!Context.FILEDecl) {
5663 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5664 Context.setFILEDecl(Typedef->getDecl());
5665 else {
5666 const TagType *Tag = FileType->getAs<TagType>();
5667 if (!Tag) {
5668 Error("Invalid FILE type in AST file");
5669 return;
5670 }
5671 Context.setFILEDecl(Tag->getDecl());
5672 }
5673 }
5674 }
5675
5676 if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5677 QualType Jmp_bufType = GetType(Jmp_buf);
5678 if (Jmp_bufType.isNull()) {
5679 Error("jmp_buf type is NULL");
5680 return;
5681 }
5682
5683 if (!Context.jmp_bufDecl) {
5684 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5685 Context.setjmp_bufDecl(Typedef->getDecl());
5686 else {
5687 const TagType *Tag = Jmp_bufType->getAs<TagType>();
5688 if (!Tag) {
5689 Error("Invalid jmp_buf type in AST file");
5690 return;
5691 }
5692 Context.setjmp_bufDecl(Tag->getDecl());
5693 }
5694 }
5695 }
5696
5697 if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5698 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5699 if (Sigjmp_bufType.isNull()) {
5700 Error("sigjmp_buf type is NULL");
5701 return;
5702 }
5703
5704 if (!Context.sigjmp_bufDecl) {
5705 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5706 Context.setsigjmp_bufDecl(Typedef->getDecl());
5707 else {
5708 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5709 assert(Tag && "Invalid sigjmp_buf type in AST file");
5710 Context.setsigjmp_bufDecl(Tag->getDecl());
5711 }
5712 }
5713 }
5714
5715 if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5716 if (Context.ObjCIdRedefinitionType.isNull())
5717 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5718 }
5719
5720 if (TypeID ObjCClassRedef =
5722 if (Context.ObjCClassRedefinitionType.isNull())
5723 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5724 }
5725
5726 if (TypeID ObjCSelRedef =
5727 SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5728 if (Context.ObjCSelRedefinitionType.isNull())
5729 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5730 }
5731
5732 if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5733 QualType Ucontext_tType = GetType(Ucontext_t);
5734 if (Ucontext_tType.isNull()) {
5735 Error("ucontext_t type is NULL");
5736 return;
5737 }
5738
5739 if (!Context.ucontext_tDecl) {
5740 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5741 Context.setucontext_tDecl(Typedef->getDecl());
5742 else {
5743 const TagType *Tag = Ucontext_tType->getAs<TagType>();
5744 assert(Tag && "Invalid ucontext_t type in AST file");
5745 Context.setucontext_tDecl(Tag->getDecl());
5746 }
5747 }
5748 }
5749 }
5750
5751 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5752
5753 // If there were any CUDA special declarations, deserialize them.
5754 if (!CUDASpecialDeclRefs.empty()) {
5755 assert(CUDASpecialDeclRefs.size() == 3 && "More decl refs than expected!");
5756 Context.setcudaConfigureCallDecl(
5757 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5758 Context.setcudaGetParameterBufferDecl(
5759 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[1])));
5760 Context.setcudaLaunchDeviceDecl(
5761 cast_or_null<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[2])));
5762 }
5763
5764 // Re-export any modules that were imported by a non-module AST file.
5765 // FIXME: This does not make macro-only imports visible again.
5766 for (auto &Import : PendingImportedModules) {
5767 if (Module *Imported = getSubmodule(Import.ID)) {
5769 /*ImportLoc=*/Import.ImportLoc);
5770 if (Import.ImportLoc.isValid())
5771 PP.makeModuleVisible(Imported, Import.ImportLoc);
5772 // This updates visibility for Preprocessor only. For Sema, which can be
5773 // nullptr here, we do the same later, in UpdateSema().
5774 }
5775 }
5776
5777 // Hand off these modules to Sema.
5778 PendingImportedModulesSema.append(PendingImportedModules);
5779 PendingImportedModules.clear();
5780}
5781
5783 // Nothing to do for now.
5784}
5785
5786/// Reads and return the signature record from \p PCH's control block, or
5787/// else returns 0.
5789 BitstreamCursor Stream(PCH);
5790 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5791 // FIXME this drops the error on the floor.
5792 consumeError(std::move(Err));
5793 return ASTFileSignature();
5794 }
5795
5796 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5798 return ASTFileSignature();
5799
5800 // Scan for SIGNATURE inside the diagnostic options block.
5802 while (true) {
5804 Stream.advanceSkippingSubblocks();
5805 if (!MaybeEntry) {
5806 // FIXME this drops the error on the floor.
5807 consumeError(MaybeEntry.takeError());
5808 return ASTFileSignature();
5809 }
5810 llvm::BitstreamEntry Entry = MaybeEntry.get();
5811
5812 if (Entry.Kind != llvm::BitstreamEntry::Record)
5813 return ASTFileSignature();
5814
5815 Record.clear();
5816 StringRef Blob;
5817 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5818 if (!MaybeRecord) {
5819 // FIXME this drops the error on the floor.
5820 consumeError(MaybeRecord.takeError());
5821 return ASTFileSignature();
5822 }
5823 if (SIGNATURE == MaybeRecord.get()) {
5824 auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5825 assert(Signature != ASTFileSignature::createDummy() &&
5826 "Dummy AST file signature not backpatched in ASTWriter.");
5827 return Signature;
5828 }
5829 }
5830}
5831
5832/// Retrieve the name of the original source file name
5833/// directly from the AST file, without actually loading the AST
5834/// file.
5836 const std::string &ASTFileName, FileManager &FileMgr,
5837 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5838 // Open the AST file.
5839 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5840 /*RequiresNullTerminator=*/false,
5841 /*MaybeLimit=*/std::nullopt,
5842 /*IsText=*/false);
5843 if (!Buffer) {
5844 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5845 << ASTFileName << Buffer.getError().message();
5846 return std::string();
5847 }
5848
5849 // Initialize the stream
5850 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5851
5852 // Sniff for the signature.
5853 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5854 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5855 return std::string();
5856 }
5857
5858 // Scan for the CONTROL_BLOCK_ID block.
5859 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5860 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5861 return std::string();
5862 }
5863
5864 // Scan for ORIGINAL_FILE inside the control block.
5866 while (true) {
5868 Stream.advanceSkippingSubblocks();
5869 if (!MaybeEntry) {
5870 // FIXME this drops errors on the floor.
5871 consumeError(MaybeEntry.takeError());
5872 return std::string();
5873 }
5874 llvm::BitstreamEntry Entry = MaybeEntry.get();
5875
5876 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5877 return std::string();
5878
5879 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5880 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5881 return std::string();
5882 }
5883
5884 Record.clear();
5885 StringRef Blob;
5886 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5887 if (!MaybeRecord) {
5888 // FIXME this drops the errors on the floor.
5889 consumeError(MaybeRecord.takeError());
5890 return std::string();
5891 }
5892 if (ORIGINAL_FILE == MaybeRecord.get())
5893 return Blob.str();
5894 }
5895}
5896
5897namespace {
5898
5899 class SimplePCHValidator : public ASTReaderListener {
5900 const LangOptions &ExistingLangOpts;
5901 const CodeGenOptions &ExistingCGOpts;
5902 const TargetOptions &ExistingTargetOpts;
5903 const PreprocessorOptions &ExistingPPOpts;
5904 const HeaderSearchOptions &ExistingHSOpts;
5905 std::string ExistingSpecificModuleCachePath;
5907 bool StrictOptionMatches;
5908
5909 public:
5910 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5911 const CodeGenOptions &ExistingCGOpts,
5912 const TargetOptions &ExistingTargetOpts,
5913 const PreprocessorOptions &ExistingPPOpts,
5914 const HeaderSearchOptions &ExistingHSOpts,
5915 StringRef ExistingSpecificModuleCachePath,
5916 FileManager &FileMgr, bool StrictOptionMatches)
5917 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5918 ExistingTargetOpts(ExistingTargetOpts),
5919 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5920 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5921 FileMgr(FileMgr), StrictOptionMatches(StrictOptionMatches) {}
5922
5923 bool ReadLanguageOptions(const LangOptions &LangOpts,
5924 StringRef ModuleFilename, bool Complain,
5925 bool AllowCompatibleDifferences) override {
5926 return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
5927 nullptr, AllowCompatibleDifferences);
5928 }
5929
5930 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
5931 StringRef ModuleFilename, bool Complain,
5932 bool AllowCompatibleDifferences) override {
5933 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
5934 nullptr, AllowCompatibleDifferences);
5935 }
5936
5937 bool ReadTargetOptions(const TargetOptions &TargetOpts,
5938 StringRef ModuleFilename, bool Complain,
5939 bool AllowCompatibleDifferences) override {
5940 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
5941 nullptr, AllowCompatibleDifferences);
5942 }
5943
5944 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5945 StringRef ASTFilename, StringRef ContextHash,
5946 bool Complain) override {
5947 return checkModuleCachePath(
5948 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5949 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5950 }
5951
5952 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5953 StringRef ModuleFilename, bool ReadMacros,
5954 bool Complain,
5955 std::string &SuggestedPredefines) override {
5957 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
5958 FileMgr, SuggestedPredefines, ExistingLangOpts,
5959 StrictOptionMatches ? OptionValidateStrictMatches
5961 }
5962 };
5963
5964} // namespace
5965
5967 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
5968 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5969 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5970 unsigned ClientLoadCapabilities) {
5971 // Open the AST file.
5972 off_t Size;
5973 time_t ModTime;
5974 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5975 llvm::MemoryBuffer *Buffer =
5976 ModCache.getInMemoryModuleCache().lookupPCM(Filename, Size, ModTime);
5977 if (!Buffer) {
5978 // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5979 // read again later, but we do not have the context here to determine if it
5980 // is safe to change the result of InMemoryModuleCache::getPCMState().
5981
5982 // FIXME: This allows use of the VFS; we do not allow use of the
5983 // VFS when actually loading a module.
5984 auto Entry = Filename == "-" ? FileMgr.getSTDIN()
5985 : FileMgr.getFileRef(Filename,
5986 /*OpenFile=*/false,
5987 /*CacheFailure=*/true,
5988 /*IsText=*/false);
5989 if (!Entry) {
5990 llvm::consumeError(Entry.takeError());
5991 return true;
5992 }
5993 auto BufferOrErr =
5994 FileMgr.getBufferForFile(*Entry,
5995 /*IsVolatile=*/false,
5996 /*RequiresNullTerminator=*/false,
5997 /*MaybeLimit=*/std::nullopt,
5998 /*IsText=*/false);
5999 if (!BufferOrErr)
6000 return true;
6001 OwnedBuffer = std::move(*BufferOrErr);
6002 Buffer = OwnedBuffer.get();
6003 }
6004
6005 // Initialize the stream
6006 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6007 BitstreamCursor Stream(Bytes);
6008
6009 // Sniff for the signature.
6010 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
6011 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
6012 return true;
6013 }
6014
6015 // Scan for the CONTROL_BLOCK_ID block.
6017 return true;
6018
6019 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6020 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6021 bool NeedsImports = Listener.needsImportVisitation();
6022 BitstreamCursor InputFilesCursor;
6023 uint64_t InputFilesOffsetBase = 0;
6024
6026 std::string ModuleDir;
6027 bool DoneWithControlBlock = false;
6028 SmallString<0> PathBuf;
6029 PathBuf.reserve(256);
6030 // Additional path buffer to use when multiple paths need to be resolved.
6031 // For example, when deserializing input files that contains a path that was
6032 // resolved from a vfs overlay and an external location.
6033 SmallString<0> AdditionalPathBuf;
6034 AdditionalPathBuf.reserve(256);
6035 while (!DoneWithControlBlock) {
6036 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6037 if (!MaybeEntry) {
6038 // FIXME this drops the error on the floor.
6039 consumeError(MaybeEntry.takeError());
6040 return true;
6041 }
6042 llvm::BitstreamEntry Entry = MaybeEntry.get();
6043
6044 switch (Entry.Kind) {
6045 case llvm::BitstreamEntry::SubBlock: {
6046 switch (Entry.ID) {
6047 case OPTIONS_BLOCK_ID: {
6048 std::string IgnoredSuggestedPredefines;
6049 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6050 /*AllowCompatibleConfigurationMismatch*/ false,
6051 Listener, IgnoredSuggestedPredefines) != Success)
6052 return true;
6053 break;
6054 }
6055
6057 InputFilesCursor = Stream;
6058 if (llvm::Error Err = Stream.SkipBlock()) {
6059 // FIXME this drops the error on the floor.
6060 consumeError(std::move(Err));
6061 return true;
6062 }
6063 if (NeedsInputFiles &&
6064 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
6065 return true;
6066 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6067 break;
6068
6069 default:
6070 if (llvm::Error Err = Stream.SkipBlock()) {
6071 // FIXME this drops the error on the floor.
6072 consumeError(std::move(Err));
6073 return true;
6074 }
6075 break;
6076 }
6077
6078 continue;
6079 }
6080
6081 case llvm::BitstreamEntry::EndBlock:
6082 DoneWithControlBlock = true;
6083 break;
6084
6085 case llvm::BitstreamEntry::Error:
6086 return true;
6087
6088 case llvm::BitstreamEntry::Record:
6089 break;
6090 }
6091
6092 if (DoneWithControlBlock) break;
6093
6094 Record.clear();
6095 StringRef Blob;
6096 Expected<unsigned> MaybeRecCode =
6097 Stream.readRecord(Entry.ID, Record, &Blob);
6098 if (!MaybeRecCode) {
6099 // FIXME this drops the error.
6100 return Failure;
6101 }
6102 switch ((ControlRecordTypes)MaybeRecCode.get()) {
6103 case METADATA:
6104 if (Record[0] != VERSION_MAJOR)
6105 return true;
6106 if (Listener.ReadFullVersionInformation(Blob))
6107 return true;
6108 break;
6109 case MODULE_NAME:
6110 Listener.ReadModuleName(Blob);
6111 break;
6112 case MODULE_DIRECTORY:
6113 ModuleDir = std::string(Blob);
6114 break;
6115 case MODULE_MAP_FILE: {
6116 unsigned Idx = 0;
6117 std::string PathStr = ReadString(Record, Idx);
6118 auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
6119 Listener.ReadModuleMapFile(*Path);
6120 break;
6121 }
6122 case INPUT_FILE_OFFSETS: {
6123 if (!NeedsInputFiles)
6124 break;
6125
6126 unsigned NumInputFiles = Record[0];
6127 unsigned NumUserFiles = Record[1];
6128 const llvm::support::unaligned_uint64_t *InputFileOffs =
6129 (const llvm::support::unaligned_uint64_t *)Blob.data();
6130 for (unsigned I = 0; I != NumInputFiles; ++I) {
6131 // Go find this input file.
6132 bool isSystemFile = I >= NumUserFiles;
6133
6134 if (isSystemFile && !NeedsSystemInputFiles)
6135 break; // the rest are system input files
6136
6137 BitstreamCursor &Cursor = InputFilesCursor;
6138 SavedStreamPosition SavedPosition(Cursor);
6139 if (llvm::Error Err =
6140 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6141 // FIXME this drops errors on the floor.
6142 consumeError(std::move(Err));
6143 }
6144
6145 Expected<unsigned> MaybeCode = Cursor.ReadCode();
6146 if (!MaybeCode) {
6147 // FIXME this drops errors on the floor.
6148 consumeError(MaybeCode.takeError());
6149 }
6150 unsigned Code = MaybeCode.get();
6151
6153 StringRef Blob;
6154 bool shouldContinue = false;
6155 Expected<unsigned> MaybeRecordType =
6156 Cursor.readRecord(Code, Record, &Blob);
6157 if (!MaybeRecordType) {
6158 // FIXME this drops errors on the floor.
6159 consumeError(MaybeRecordType.takeError());
6160 }
6161 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
6162 case INPUT_FILE_HASH:
6163 break;
6164 case INPUT_FILE:
6165 time_t StoredTime = static_cast<time_t>(Record[2]);
6166 bool Overridden = static_cast<bool>(Record[3]);
6167 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6169 auto FilenameAsRequestedBuf = ResolveImportedPath(
6170 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6171 StringRef Filename;
6172 if (UnresolvedFilename.empty())
6173 Filename = *FilenameAsRequestedBuf;
6174 else {
6175 auto FilenameBuf = ResolveImportedPath(
6176 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6177 Filename = *FilenameBuf;
6178 }
6179 shouldContinue = Listener.visitInputFileAsRequested(
6180 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6181 StoredTime, /*IsExplicitModule=*/false);
6182 break;
6183 }
6184 if (!shouldContinue)
6185 break;
6186 }
6187 break;
6188 }
6189
6190 case IMPORT: {
6191 if (!NeedsImports)
6192 break;
6193
6194 unsigned Idx = 0;
6195 // Read information about the AST file.
6196
6197 // Skip Kind
6198 Idx++;
6199
6200 // Skip ImportLoc
6201 Idx++;
6202
6203 StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
6204
6205 bool IsStandardCXXModule = Record[Idx++];
6206
6207 // In C++20 Modules, we don't record the path to imported
6208 // modules in the BMI files.
6209 if (IsStandardCXXModule) {
6210 Listener.visitImport(ModuleName, /*Filename=*/"");
6211 continue;
6212 }
6213
6214 // Skip Size, ModTime and ImplicitModuleSuffix.
6215 Idx += 1 + 1 + 1;
6216 // Skip signature.
6217 Blob = Blob.substr(ASTFileSignature::size);
6218
6219 StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
6220 auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
6221 Listener.visitImport(ModuleName, *Filename);
6222 break;
6223 }
6224
6225 default:
6226 // No other validation to perform.
6227 break;
6228 }
6229 }
6230
6231 // Look for module file extension blocks, if requested.
6232 if (FindModuleFileExtensions) {
6233 BitstreamCursor SavedStream = Stream;
6234 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
6235 bool DoneWithExtensionBlock = false;
6236 while (!DoneWithExtensionBlock) {
6237 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6238 if (!MaybeEntry) {
6239 // FIXME this drops the error.
6240 return true;
6241 }
6242 llvm::BitstreamEntry Entry = MaybeEntry.get();
6243
6244 switch (Entry.Kind) {
6245 case llvm::BitstreamEntry::SubBlock:
6246 if (llvm::Error Err = Stream.SkipBlock()) {
6247 // FIXME this drops the error on the floor.
6248 consumeError(std::move(Err));
6249 return true;
6250 }
6251 continue;
6252
6253 case llvm::BitstreamEntry::EndBlock:
6254 DoneWithExtensionBlock = true;
6255 continue;
6256
6257 case llvm::BitstreamEntry::Error:
6258 return true;
6259
6260 case llvm::BitstreamEntry::Record:
6261 break;
6262 }
6263
6264 Record.clear();
6265 StringRef Blob;
6266 Expected<unsigned> MaybeRecCode =
6267 Stream.readRecord(Entry.ID, Record, &Blob);
6268 if (!MaybeRecCode) {
6269 // FIXME this drops the error.
6270 return true;
6271 }
6272 switch (MaybeRecCode.get()) {
6273 case EXTENSION_METADATA: {
6275 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
6276 return true;
6277
6278 Listener.readModuleFileExtension(Metadata);
6279 break;
6280 }
6281 }
6282 }
6283 }
6284 Stream = std::move(SavedStream);
6285 }
6286
6287 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6288 if (readUnhashedControlBlockImpl(
6289 nullptr, Bytes, Filename, ClientLoadCapabilities,
6290 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6291 ValidateDiagnosticOptions) != Success)
6292 return true;
6293
6294 return false;
6295}
6296
6298 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6299 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6300 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
6301 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
6302 StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches) {
6303 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6304 SpecificModuleCachePath, FileMgr,
6305 RequireStrictOptionMatches);
6306 return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6307 /*FindModuleFileExtensions=*/false, validator,
6308 /*ValidateDiagnosticOptions=*/true);
6309}
6310
6311Module *ASTReader::getSubmodule(uint32_t GlobalID) {
6312 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6313 assert(GlobalID == 0 && "Unhandled global submodule ID");
6314 return nullptr;
6315 }
6316
6317 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6318 if (GlobalIndex >= SubmodulesLoaded.size()) {
6319 Error("submodule ID out of range in AST file");
6320 return nullptr;
6321 }
6322
6323 if (SubmodulesLoaded[GlobalIndex])
6324 return SubmodulesLoaded[GlobalIndex];
6325
6326 GlobalSubmoduleMapType::iterator It = GlobalSubmoduleMap.find(GlobalID);
6327 assert(It != GlobalSubmoduleMap.end());
6328 ModuleFile &F = *It->second;
6329 unsigned Index = GlobalID - F.BaseSubmoduleID - NUM_PREDEF_SUBMODULE_IDS;
6330 [[maybe_unused]] unsigned LocalID =
6332
6333 BitstreamCursor &Cursor = F.SubmodulesCursor;
6334 SavedStreamPosition SavedPosition(Cursor);
6335 unsigned Offset = F.SubmoduleOffsets[Index];
6336 if (llvm::Error Err = Cursor.JumpToBit(F.SubmodulesOffsetBase + Offset)) {
6337 Error(std::move(Err));
6338 return nullptr;
6339 }
6340
6341 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6342 bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6343 // If we don't know the top-level module, there's no point in doing qualified
6344 // lookup of its submodules; it won't find anything anywhere within this tree.
6345 // Let's skip that and avoid some string lookups.
6346 auto CreateModule = !KnowsTopLevelModule
6349
6350 Module *CurrentModule = nullptr;
6352 while (true) {
6353 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
6354 if (!MaybeEntry) {
6355 Error(MaybeEntry.takeError());
6356 return nullptr;
6357 }
6358 llvm::BitstreamEntry Entry = MaybeEntry.get();
6359
6360 switch (Entry.Kind) {
6361 case llvm::BitstreamEntry::SubBlock:
6362 case llvm::BitstreamEntry::Error:
6363 case llvm::BitstreamEntry::EndBlock: {
6364 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6365 "malformed block record in AST file"));
6366 return nullptr;
6367 }
6368 case llvm::BitstreamEntry::Record:
6369 // The interesting case.
6370 break;
6371 }
6372
6373 // Read a record.
6374 StringRef Blob;
6375 Record.clear();
6376 Expected<unsigned> MaybeKind = Cursor.readRecord(Entry.ID, Record, &Blob);
6377 if (!MaybeKind) {
6378 Error(MaybeKind.takeError());
6379 return nullptr;
6380 }
6381 auto Kind = static_cast<SubmoduleRecordTypes>(MaybeKind.get());
6382
6383 switch (Kind) {
6384 case SUBMODULE_END:
6385 if (!CurrentModule) {
6386 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6387 "malformed module definition"));
6388 return nullptr;
6389 }
6390 return CurrentModule;
6391
6392 case SUBMODULE_DEFINITION: {
6393 if (Record.size() < 13) {
6394 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6395 "malformed module definition"));
6396 return nullptr;
6397 }
6398
6399 StringRef Name = Blob;
6400 unsigned Idx = 0;
6401 [[maybe_unused]] unsigned ReadLocalID = Record[Idx++];
6402 assert(LocalID == ReadLocalID);
6403 assert(GlobalID == getGlobalSubmoduleID(F, ReadLocalID));
6404 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6406 SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6407 FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6408 bool IsFramework = Record[Idx++];
6409 bool IsExplicit = Record[Idx++];
6410 bool IsSystem = Record[Idx++];
6411 bool IsExternC = Record[Idx++];
6412 bool InferSubmodules = Record[Idx++];
6413 bool InferExplicitSubmodules = Record[Idx++];
6414 bool InferExportWildcard = Record[Idx++];
6415 bool ConfigMacrosExhaustive = Record[Idx++];
6416 bool ModuleMapIsPrivate = Record[Idx++];
6417 bool NamedModuleHasInit = Record[Idx++];
6418
6419 Module *ParentModule = nullptr;
6420 if (Parent) {
6421 ParentModule = getSubmodule(Parent);
6422 if (!ParentModule)
6423 return nullptr;
6424 }
6425
6426 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6427 IsFramework, IsExplicit);
6428
6429 if (!ParentModule) {
6430 if ([[maybe_unused]] const ModuleFileKey *CurFileKey =
6431 CurrentModule->getASTFileKey()) {
6432 // Don't emit module relocation error if we have -fno-validate-pch
6433 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6435 assert(*CurFileKey != F.FileKey &&
6436 "ModuleManager did not de-duplicate");
6437
6438 Diag(diag::err_module_file_conflict)
6439 << CurrentModule->getTopLevelModuleName()
6440 << *CurrentModule->getASTFileName() << F.FileName;
6441
6442 auto CurModMapFile =
6443 ModMap.getContainingModuleMapFile(CurrentModule);
6444 auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6445 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6446 Diag(diag::note_module_file_conflict)
6447 << CurModMapFile->getName() << ModMapFile->getName();
6448
6449 return nullptr;
6450 }
6451 }
6452
6453 F.DidReadTopLevelSubmodule = true;
6454 CurrentModule->setASTFileNameAndKey(F.FileName, F.FileKey);
6455 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6456 }
6457
6458 CurrentModule->Kind = Kind;
6459 // Note that we may be rewriting an existing location and it is important
6460 // to keep doing that. In particular, we would like to prefer a
6461 // `DefinitionLoc` loaded from the module file instead of the location
6462 // created in the current source manager, because it allows the new
6463 // location to be marked as "unaffecting" when writing and avoid creating
6464 // duplicate locations for the same module map file.
6465 CurrentModule->DefinitionLoc = DefinitionLoc;
6466 CurrentModule->Signature = F.Signature;
6467 CurrentModule->IsFromModuleFile = true;
6468 if (InferredAllowedBy.isValid())
6469 ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6470 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6471 CurrentModule->IsExternC = IsExternC;
6472 CurrentModule->InferSubmodules = InferSubmodules;
6473 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6474 CurrentModule->InferExportWildcard = InferExportWildcard;
6475 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6476 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6477 CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6478
6479 if (!ParentModule && !F.BaseDirectory.empty()) {
6480 if (auto Dir = FileMgr.getOptionalDirectoryRef(F.BaseDirectory))
6481 CurrentModule->Directory = *Dir;
6482 } else if (ParentModule && ParentModule->Directory) {
6483 // Submodules inherit the directory from their parent.
6484 CurrentModule->Directory = ParentModule->Directory;
6485 }
6486
6487 if (DeserializationListener)
6488 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6489
6490 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6491
6492 // Clear out data that will be replaced by what is in the module file.
6493 CurrentModule->LinkLibraries.clear();
6494 CurrentModule->ConfigMacros.clear();
6495 CurrentModule->UnresolvedConflicts.clear();
6496 CurrentModule->Conflicts.clear();
6497
6498 // The module is available unless it's missing a requirement; relevant
6499 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6500 // Missing headers that were present when the module was built do not
6501 // make it unavailable -- if we got this far, this must be an explicitly
6502 // imported module file.
6503 CurrentModule->Requirements.clear();
6504 CurrentModule->MissingHeaders.clear();
6505 CurrentModule->IsUnimportable =
6506 ParentModule && ParentModule->IsUnimportable;
6507 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6508 break;
6509 }
6510
6512 SmallString<128> RelativePathName;
6513 if (auto Umbrella = ModMap.findUmbrellaHeaderForModule(
6514 CurrentModule, Blob.str(), RelativePathName)) {
6515 if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6516 ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob,
6517 RelativePathName);
6518 }
6519 // Note that it's too late at this point to return out of date if the
6520 // name from the PCM doesn't match up with the one in the module map,
6521 // but also quite unlikely since we will have already checked the
6522 // modification time and size of the module map file itself.
6523 }
6524 break;
6525 }
6526
6527 case SUBMODULE_HEADER:
6530 // We lazily associate headers with their modules via the HeaderInfo table.
6531 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6532 // of complete filenames or remove it entirely.
6533 break;
6534
6537 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6538 // them here.
6539 break;
6540
6541 case SUBMODULE_TOPHEADER: {
6542 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6543 CurrentModule->addTopHeaderFilename(*HeaderName);
6544 break;
6545 }
6546
6548 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6549 if (auto Umbrella =
6550 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6551 if (!CurrentModule->getUmbrellaDirAsWritten()) {
6552 // FIXME: NameAsWritten
6553 ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6554 }
6555 }
6556 break;
6557 }
6558
6559 case SUBMODULE_IMPORTS:
6560 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6561 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6562 CurrentModule->Imports.push_back(ModuleRef(this, GlobalID));
6563 }
6564 break;
6565
6567 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6568 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6569 CurrentModule->AffectingClangModules.push_back(
6570 ModuleRef(this, GlobalID));
6571 }
6572 break;
6573
6574 case SUBMODULE_EXPORTS:
6575 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6576 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx]);
6577 bool IsWildcard = Record[Idx + 1];
6578 ModuleRef ExportedMod =
6579 GlobalID ? ModuleRef(this, GlobalID) : ModuleRef();
6580 if (ExportedMod || IsWildcard)
6581 CurrentModule->Exports.push_back({ExportedMod, IsWildcard});
6582 }
6583
6584 // Once we've loaded the set of exports, there's no reason to keep
6585 // the parsed, unresolved exports around.
6586 CurrentModule->UnresolvedExports.clear();
6587 break;
6588
6589 case SUBMODULE_REQUIRES:
6590 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6591 PP.getTargetInfo());
6592 break;
6593
6595 ModMap.resolveLinkAsDependencies(CurrentModule);
6596 CurrentModule->LinkLibraries.push_back(
6597 Module::LinkLibrary(std::string(Blob), Record[0]));
6598 break;
6599
6601 CurrentModule->ConfigMacros.push_back(Blob.str());
6602 break;
6603
6604 case SUBMODULE_CONFLICT: {
6605 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6606 Module::Conflict Conflict;
6607 Conflict.Other = ModuleRef(this, GlobalID);
6608 Conflict.Message = Blob.str();
6609 CurrentModule->Conflicts.push_back(Conflict);
6610 break;
6611 }
6612
6614 if (!ContextObj)
6615 break;
6616 // Standard C++ module has its own way to initialize variables.
6617 if (!F.StandardCXXModule || F.Kind == MK_MainFile) {
6619 for (unsigned I = 0; I < Record.size(); /*in loop*/)
6620 Inits.push_back(ReadDeclID(F, Record, I));
6621 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6622 }
6623 break;
6624 }
6625
6627 CurrentModule->ExportAsModule = Blob.str();
6628 ModMap.addLinkAsDependency(CurrentModule);
6629 break;
6630
6631 case SUBMODULE_CHILD: {
6632 // Record a not-yet-loaded direct child for on-demand deserialization.
6633 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
6634 CurrentModule->addSubmodule(Blob, this, GlobalID);
6635 break;
6636 }
6637 }
6638 }
6639}
6640
6641/// Parse the record that corresponds to a LangOptions data
6642/// structure.
6643///
6644/// This routine parses the language options from the AST file and then gives
6645/// them to the AST listener if one is set.
6646///
6647/// \returns true if the listener deems the file unacceptable, false otherwise.
6648bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6649 StringRef ModuleFilename, bool Complain,
6650 ASTReaderListener &Listener,
6651 bool AllowCompatibleDifferences) {
6652 LangOptions LangOpts;
6653 unsigned Idx = 0;
6654#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6655 LangOpts.Name = Record[Idx++];
6656#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6657 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6658#include "clang/Basic/LangOptions.def"
6659#define SANITIZER(NAME, ID) \
6660 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6661#include "clang/Basic/Sanitizers.def"
6662
6663 for (unsigned N = Record[Idx++]; N; --N)
6664 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6665
6666 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6667 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6668 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6669
6670 LangOpts.CurrentModule = ReadString(Record, Idx);
6671
6672 // Comment options.
6673 for (unsigned N = Record[Idx++]; N; --N) {
6674 LangOpts.CommentOpts.BlockCommandNames.push_back(
6675 ReadString(Record, Idx));
6676 }
6677 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6678
6679 // OpenMP offloading options.
6680 for (unsigned N = Record[Idx++]; N; --N) {
6681 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6682 }
6683
6684 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6685
6686 return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6687 AllowCompatibleDifferences);
6688}
6689
6690bool ASTReader::ParseCodeGenOptions(const RecordData &Record,
6691 StringRef ModuleFilename, bool Complain,
6692 ASTReaderListener &Listener,
6693 bool AllowCompatibleDifferences) {
6694 unsigned Idx = 0;
6695 CodeGenOptions CGOpts;
6697#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6698 if constexpr (CK::Compatibility != CK::Benign) \
6699 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6700#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6701 if constexpr (CK::Compatibility != CK::Benign) \
6702 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6703#define DEBUGOPT(Name, Bits, Default, Compatibility)
6704#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6705#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6706#include "clang/Basic/CodeGenOptions.def"
6707
6708 return Listener.ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
6709 AllowCompatibleDifferences);
6710}
6711
6712bool ASTReader::ParseTargetOptions(const RecordData &Record,
6713 StringRef ModuleFilename, bool Complain,
6714 ASTReaderListener &Listener,
6715 bool AllowCompatibleDifferences) {
6716 unsigned Idx = 0;
6717 TargetOptions TargetOpts;
6718 TargetOpts.Triple = ReadString(Record, Idx);
6719 TargetOpts.CPU = ReadString(Record, Idx);
6720 TargetOpts.TuneCPU = ReadString(Record, Idx);
6721 TargetOpts.ABI = ReadString(Record, Idx);
6722 for (unsigned N = Record[Idx++]; N; --N) {
6723 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6724 }
6725 for (unsigned N = Record[Idx++]; N; --N) {
6726 TargetOpts.Features.push_back(ReadString(Record, Idx));
6727 }
6728
6729 return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6730 AllowCompatibleDifferences);
6731}
6732
6733bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6734 StringRef ModuleFilename, bool Complain,
6735 ASTReaderListener &Listener) {
6736 DiagnosticOptions DiagOpts;
6737 unsigned Idx = 0;
6738#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6739#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6740 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6741#include "clang/Basic/DiagnosticOptions.def"
6742
6743 for (unsigned N = Record[Idx++]; N; --N)
6744 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6745 for (unsigned N = Record[Idx++]; N; --N)
6746 DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6747
6748 return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6749}
6750
6751bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6752 ASTReaderListener &Listener) {
6753 FileSystemOptions FSOpts;
6754 unsigned Idx = 0;
6755 FSOpts.WorkingDir = ReadString(Record, Idx);
6756 return Listener.ReadFileSystemOptions(FSOpts, Complain);
6757}
6758
6759bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6760 StringRef ModuleFilename,
6761 bool Complain,
6762 ASTReaderListener &Listener) {
6763 HeaderSearchOptions HSOpts;
6764 unsigned Idx = 0;
6765 HSOpts.Sysroot = ReadString(Record, Idx);
6766
6767 HSOpts.ResourceDir = ReadString(Record, Idx);
6768 HSOpts.ModuleCachePath = ReadString(Record, Idx);
6769 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6770 HSOpts.DisableModuleHash = Record[Idx++];
6771 HSOpts.ImplicitModuleMaps = Record[Idx++];
6772 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6773 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6774 HSOpts.UseBuiltinIncludes = Record[Idx++];
6775 HSOpts.UseStandardSystemIncludes = Record[Idx++];
6776 HSOpts.UseStandardCXXIncludes = Record[Idx++];
6777 HSOpts.UseLibcxx = Record[Idx++];
6778 std::string ContextHash = ReadString(Record, Idx);
6779
6780 return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
6781 Complain);
6782}
6783
6784bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6785 ASTReaderListener &Listener) {
6786 HeaderSearchOptions HSOpts;
6787 unsigned Idx = 0;
6788
6789 // Include entries.
6790 for (unsigned N = Record[Idx++]; N; --N) {
6791 std::string Path = ReadString(Record, Idx);
6793 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6794 bool IsFramework = Record[Idx++];
6795 bool IgnoreSysRoot = Record[Idx++];
6796 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6797 IgnoreSysRoot);
6798 }
6799
6800 // System header prefixes.
6801 for (unsigned N = Record[Idx++]; N; --N) {
6802 std::string Prefix = ReadString(Record, Idx);
6803 bool IsSystemHeader = Record[Idx++];
6804 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6805 }
6806
6807 // VFS overlay files.
6808 for (unsigned N = Record[Idx++]; N; --N) {
6809 std::string VFSOverlayFile = ReadString(Record, Idx);
6810 HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6811 }
6812
6813 return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6814}
6815
6816bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6817 StringRef ModuleFilename,
6818 bool Complain,
6819 ASTReaderListener &Listener,
6820 std::string &SuggestedPredefines) {
6821 PreprocessorOptions PPOpts;
6822 unsigned Idx = 0;
6823
6824 // Macro definitions/undefs
6825 bool ReadMacros = Record[Idx++];
6826 if (ReadMacros) {
6827 for (unsigned N = Record[Idx++]; N; --N) {
6828 std::string Macro = ReadString(Record, Idx);
6829 bool IsUndef = Record[Idx++];
6830 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6831 }
6832 }
6833
6834 // Includes
6835 for (unsigned N = Record[Idx++]; N; --N) {
6836 PPOpts.Includes.push_back(ReadString(Record, Idx));
6837 }
6838
6839 // Macro Includes
6840 for (unsigned N = Record[Idx++]; N; --N) {
6841 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6842 }
6843
6844 PPOpts.UsePredefines = Record[Idx++];
6845 PPOpts.DetailedRecord = Record[Idx++];
6846 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6848 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6849 SuggestedPredefines.clear();
6850 return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6851 Complain, SuggestedPredefines);
6852}
6853
6854std::pair<ModuleFile *, unsigned>
6855ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6856 GlobalPreprocessedEntityMapType::iterator
6857 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6858 assert(I != GlobalPreprocessedEntityMap.end() &&
6859 "Corrupted global preprocessed entity map");
6860 ModuleFile *M = I->second;
6861 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6862 return std::make_pair(M, LocalIndex);
6863}
6864
6865llvm::iterator_range<PreprocessingRecord::iterator>
6866ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6867 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6868 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6870
6871 return llvm::make_range(PreprocessingRecord::iterator(),
6872 PreprocessingRecord::iterator());
6873}
6874
6875bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6876 unsigned int ClientLoadCapabilities) {
6877 return ClientLoadCapabilities & ARR_OutOfDate &&
6878 !getModuleManager()
6879 .getModuleCache()
6880 .getInMemoryModuleCache()
6881 .isPCMFinal(ModuleFileName);
6882}
6883
6884llvm::iterator_range<ASTReader::ModuleDeclIterator>
6886 return llvm::make_range(
6887 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
6888 ModuleDeclIterator(this, &Mod,
6890}
6891
6893 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6894 assert(I != GlobalSkippedRangeMap.end() &&
6895 "Corrupted global skipped range map");
6896 ModuleFile *M = I->second;
6897 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
6898 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6899 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
6900 SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
6901 ReadSourceLocation(*M, RawRange.getEnd()));
6902 assert(Range.isValid());
6903 return Range;
6904}
6905
6906unsigned
6907ASTReader::translatePreprocessedEntityIDToIndex(PreprocessedEntityID ID) const {
6908 unsigned ModuleFileIndex = ID >> 32;
6909 assert(ModuleFileIndex && "not translating loaded MacroID?");
6910 assert(getModuleManager().size() > ModuleFileIndex - 1);
6911 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6912
6913 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6914 return MF.BasePreprocessedEntityID + ID;
6915}
6916
6918 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6919 ModuleFile &M = *PPInfo.first;
6920 unsigned LocalIndex = PPInfo.second;
6922 (static_cast<PreprocessedEntityID>(M.Index + 1) << 32) | LocalIndex;
6923 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6924
6925 if (!PP.getPreprocessingRecord()) {
6926 Error("no preprocessing record");
6927 return nullptr;
6928 }
6929
6931 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
6932 M.MacroOffsetsBase + PPOffs.getOffset())) {
6933 Error(std::move(Err));
6934 return nullptr;
6935 }
6936
6938 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
6939 if (!MaybeEntry) {
6940 Error(MaybeEntry.takeError());
6941 return nullptr;
6942 }
6943 llvm::BitstreamEntry Entry = MaybeEntry.get();
6944
6945 if (Entry.Kind != llvm::BitstreamEntry::Record)
6946 return nullptr;
6947
6948 // Read the record.
6949 SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
6950 ReadSourceLocation(M, PPOffs.getEnd()));
6951 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6952 StringRef Blob;
6954 Expected<unsigned> MaybeRecType =
6955 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6956 if (!MaybeRecType) {
6957 Error(MaybeRecType.takeError());
6958 return nullptr;
6959 }
6960 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6961 case PPD_MACRO_EXPANSION: {
6962 bool isBuiltin = Record[0];
6963 IdentifierInfo *Name = nullptr;
6964 MacroDefinitionRecord *Def = nullptr;
6965 if (isBuiltin)
6966 Name = getLocalIdentifier(M, Record[1]);
6967 else {
6968 PreprocessedEntityID GlobalID =
6970 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6971 Def =
6972 cast<MacroDefinitionRecord>(PPRec.getLoadedPreprocessedEntity(Index));
6973 }
6974
6975 MacroExpansion *ME;
6976 if (isBuiltin)
6977 ME = new (PPRec) MacroExpansion(Name, Range);
6978 else
6979 ME = new (PPRec) MacroExpansion(Def, Range);
6980
6981 return ME;
6982 }
6983
6984 case PPD_MACRO_DEFINITION: {
6985 // Decode the identifier info and then check again; if the macro is
6986 // still defined and associated with the identifier,
6988 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
6989
6990 if (DeserializationListener)
6991 DeserializationListener->MacroDefinitionRead(PPID, MD);
6992
6993 return MD;
6994 }
6995
6997 const char *FullFileNameStart = Blob.data() + Record[0];
6998 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
7000 if (!FullFileName.empty())
7001 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7002
7003 // FIXME: Stable encoding
7005 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
7007 = new (PPRec) InclusionDirective(PPRec, Kind,
7008 StringRef(Blob.data(), Record[0]),
7009 Record[1], Record[3],
7010 File,
7011 Range);
7012 return ID;
7013 }
7014 }
7015
7016 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
7017}
7018
7019/// Find the next module that contains entities and return the ID
7020/// of the first entry.
7021///
7022/// \param SLocMapI points at a chunk of a module that contains no
7023/// preprocessed entities or the entities it contains are not the ones we are
7024/// looking for.
7025unsigned ASTReader::findNextPreprocessedEntity(
7026 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
7027 ++SLocMapI;
7028 for (GlobalSLocOffsetMapType::const_iterator
7029 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7030 ModuleFile &M = *SLocMapI->second;
7032 return M.BasePreprocessedEntityID;
7033 }
7034
7035 return getTotalNumPreprocessedEntities();
7036}
7037
7038namespace {
7039
7040struct PPEntityComp {
7041 const ASTReader &Reader;
7042 ModuleFile &M;
7043
7044 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7045
7046 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
7047 SourceLocation LHS = getLoc(L);
7048 SourceLocation RHS = getLoc(R);
7049 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7050 }
7051
7052 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
7053 SourceLocation LHS = getLoc(L);
7054 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7055 }
7056
7057 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
7058 SourceLocation RHS = getLoc(R);
7059 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7060 }
7061
7062 SourceLocation getLoc(const PPEntityOffset &PPE) const {
7063 return Reader.ReadSourceLocation(M, PPE.getBegin());
7064 }
7065};
7066
7067} // namespace
7068
7069unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7070 bool EndsAfter) const {
7071 if (SourceMgr.isLocalSourceLocation(Loc))
7072 return getTotalNumPreprocessedEntities();
7073
7074 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7075 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7076 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7077 "Corrupted global sloc offset map");
7078
7079 if (SLocMapI->second->NumPreprocessedEntities == 0)
7080 return findNextPreprocessedEntity(SLocMapI);
7081
7082 ModuleFile &M = *SLocMapI->second;
7083
7084 using pp_iterator = const PPEntityOffset *;
7085
7086 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
7087 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
7088
7089 size_t Count = M.NumPreprocessedEntities;
7090 size_t Half;
7091 pp_iterator First = pp_begin;
7092 pp_iterator PPI;
7093
7094 if (EndsAfter) {
7095 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7096 PPEntityComp(*this, M));
7097 } else {
7098 // Do a binary search manually instead of using std::lower_bound because
7099 // The end locations of entities may be unordered (when a macro expansion
7100 // is inside another macro argument), but for this case it is not important
7101 // whether we get the first macro expansion or its containing macro.
7102 while (Count > 0) {
7103 Half = Count / 2;
7104 PPI = First;
7105 std::advance(PPI, Half);
7106 if (SourceMgr.isBeforeInTranslationUnit(
7107 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7108 First = PPI;
7109 ++First;
7110 Count = Count - Half - 1;
7111 } else
7112 Count = Half;
7113 }
7114 }
7115
7116 if (PPI == pp_end)
7117 return findNextPreprocessedEntity(SLocMapI);
7118
7119 return M.BasePreprocessedEntityID + (PPI - pp_begin);
7120}
7121
7122/// Returns a pair of [Begin, End) indices of preallocated
7123/// preprocessed entities that \arg Range encompasses.
7124std::pair<unsigned, unsigned>
7126 if (Range.isInvalid())
7127 return std::make_pair(0,0);
7128 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7129
7130 unsigned BeginID = findPreprocessedEntity(Range.getBegin(), false);
7131 unsigned EndID = findPreprocessedEntity(Range.getEnd(), true);
7132 return std::make_pair(BeginID, EndID);
7133}
7134
7135/// Optionally returns true or false if the preallocated preprocessed
7136/// entity with index \arg Index came from file \arg FID.
7137std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
7138 FileID FID) {
7139 if (FID.isInvalid())
7140 return false;
7141
7142 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7143 ModuleFile &M = *PPInfo.first;
7144 unsigned LocalIndex = PPInfo.second;
7145 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
7146
7147 SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
7148 if (Loc.isInvalid())
7149 return false;
7150
7151 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7152 return true;
7153 else
7154 return false;
7155}
7156
7157namespace {
7158
7159 /// Visitor used to search for information about a header file.
7160 class HeaderFileInfoVisitor {
7161 FileEntryRef FE;
7162 std::optional<HeaderFileInfo> HFI;
7163
7164 public:
7165 explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
7166
7167 bool operator()(ModuleFile &M) {
7170 if (!Table)
7171 return false;
7172
7173 // Look in the on-disk hash table for an entry for this file name.
7174 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7175 if (Pos == Table->end())
7176 return false;
7177
7178 HFI = *Pos;
7179 return true;
7180 }
7181
7182 std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
7183 };
7184
7185} // namespace
7186
7188 HeaderFileInfoVisitor Visitor(FE);
7189 ModuleMgr.visit(Visitor);
7190 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7191 return *HFI;
7192
7193 return HeaderFileInfo();
7194}
7195
7197 using DiagState = DiagnosticsEngine::DiagState;
7199
7200 for (ModuleFile &F : ModuleMgr) {
7201 unsigned Idx = 0;
7202 auto &Record = F.PragmaDiagMappings;
7203 if (Record.empty())
7204 continue;
7205
7206 DiagStates.clear();
7207
7208 auto ReadDiagState = [&](const DiagState &BasedOn,
7209 bool IncludeNonPragmaStates) {
7210 unsigned BackrefID = Record[Idx++];
7211 if (BackrefID != 0)
7212 return DiagStates[BackrefID - 1];
7213
7214 // A new DiagState was created here.
7215 Diag.DiagStates.push_back(BasedOn);
7216 DiagState *NewState = &Diag.DiagStates.back();
7217 DiagStates.push_back(NewState);
7218 unsigned Size = Record[Idx++];
7219 assert(Idx + Size * 2 <= Record.size() &&
7220 "Invalid data, not enough diag/map pairs");
7221 while (Size--) {
7222 unsigned DiagID = Record[Idx++];
7223 DiagnosticMapping NewMapping =
7225 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
7226 continue;
7227
7228 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
7229
7230 // If this mapping was specified as a warning but the severity was
7231 // upgraded due to diagnostic settings, simulate the current diagnostic
7232 // settings (and use a warning).
7233 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
7235 NewMapping.setUpgradedFromWarning(false);
7236 }
7237
7238 Mapping = NewMapping;
7239 }
7240 return NewState;
7241 };
7242
7243 // Read the first state.
7244 DiagState *FirstState;
7245 if (F.Kind == MK_ImplicitModule) {
7246 // Implicitly-built modules are reused with different diagnostic
7247 // settings. Use the initial diagnostic state from Diag to simulate this
7248 // compilation's diagnostic settings.
7249 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
7250 DiagStates.push_back(FirstState);
7251
7252 // Skip the initial diagnostic state from the serialized module.
7253 assert(Record[1] == 0 &&
7254 "Invalid data, unexpected backref in initial state");
7255 Idx = 3 + Record[2] * 2;
7256 assert(Idx < Record.size() &&
7257 "Invalid data, not enough state change pairs in initial state");
7258 } else if (F.isModule()) {
7259 // For an explicit module, preserve the flags from the module build
7260 // command line (-w, -Weverything, -Werror, ...) along with any explicit
7261 // -Wblah flags.
7262 unsigned Flags = Record[Idx++];
7263 DiagState Initial(*Diag.getDiagnosticIDs());
7264 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7265 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7266 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7267 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7268 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7269 Initial.ExtBehavior = (diag::Severity)Flags;
7270 FirstState = ReadDiagState(Initial, true);
7271
7272 assert(F.OriginalSourceFileID.isValid());
7273
7274 // Set up the root buffer of the module to start with the initial
7275 // diagnostic state of the module itself, to cover files that contain no
7276 // explicit transitions (for which we did not serialize anything).
7277 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
7278 .StateTransitions.push_back({FirstState, 0});
7279 } else {
7280 // For prefix ASTs, start with whatever the user configured on the
7281 // command line.
7282 Idx++; // Skip flags.
7283 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
7284 }
7285
7286 // Read the state transitions.
7287 unsigned NumLocations = Record[Idx++];
7288 while (NumLocations--) {
7289 assert(Idx < Record.size() &&
7290 "Invalid data, missing pragma diagnostic states");
7291 FileID FID = ReadFileID(F, Record, Idx);
7292 assert(FID.isValid() && "invalid FileID for transition");
7293 unsigned Transitions = Record[Idx++];
7294
7295 // Note that we don't need to set up Parent/ParentOffset here, because
7296 // we won't be changing the diagnostic state within imported FileIDs
7297 // (other than perhaps appending to the main source file, which has no
7298 // parent).
7299 auto &F = Diag.DiagStatesByLoc.Files[FID];
7300 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7301 for (unsigned I = 0; I != Transitions; ++I) {
7302 unsigned Offset = Record[Idx++];
7303 auto *State = ReadDiagState(*FirstState, false);
7304 F.StateTransitions.push_back({State, Offset});
7305 }
7306 }
7307
7308 // Read the final state.
7309 assert(Idx < Record.size() &&
7310 "Invalid data, missing final pragma diagnostic state");
7311 SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
7312 auto *CurState = ReadDiagState(*FirstState, false);
7313
7314 if (!F.isModule()) {
7315 Diag.DiagStatesByLoc.CurDiagState = CurState;
7316 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7317
7318 // Preserve the property that the imaginary root file describes the
7319 // current state.
7320 FileID NullFile;
7321 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7322 if (T.empty())
7323 T.push_back({CurState, 0});
7324 else
7325 T[0].State = CurState;
7326 }
7327
7328 // Restore the push stack so that unmatched pushes from a preamble are
7329 // visible when the main file is parsed, allowing the corresponding
7330 // `#pragma diagnostic pop` to succeed.
7331 assert(Idx < Record.size() &&
7332 "Invalid data, missing diagnostic push stack");
7333 unsigned NumPushes = Record[Idx++];
7334 for (unsigned I = 0; I != NumPushes; ++I) {
7335 auto *State = ReadDiagState(*FirstState, false);
7336 if (!F.isModule())
7337 Diag.DiagStateOnPushStack.push_back(State);
7338 }
7339
7340 // Don't try to read these mappings again.
7341 Record.clear();
7342 }
7343}
7344
7345/// Get the correct cursor and offset for loading a type.
7346ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7347 auto [M, Index] = translateTypeIDToIndex(ID);
7348 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7350}
7351
7352static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7353 switch (code) {
7354#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7355 case TYPE_##CODE_ID: return Type::CLASS_ID;
7356#include "clang/Serialization/TypeBitCodes.def"
7357 default:
7358 return std::nullopt;
7359 }
7360}
7361
7362/// Read and return the type with the given index..
7363///
7364/// The index is the type ID, shifted and minus the number of predefs. This
7365/// routine actually reads the record corresponding to the type at the given
7366/// location. It is a helper routine for GetType, which deals with reading type
7367/// IDs.
7368QualType ASTReader::readTypeRecord(TypeID ID) {
7369 assert(ContextObj && "reading type with no AST context");
7370 ASTContext &Context = *ContextObj;
7371 RecordLocation Loc = TypeCursorForIndex(ID);
7372 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7373
7374 // Keep track of where we are in the stream, then jump back there
7375 // after reading this type.
7376 SavedStreamPosition SavedPosition(DeclsCursor);
7377
7378 ReadingKindTracker ReadingKind(Read_Type, *this);
7379
7380 // Note that we are loading a type record.
7381 Deserializing AType(this);
7382
7383 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7384 Error(std::move(Err));
7385 return QualType();
7386 }
7387 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7388 if (!RawCode) {
7389 Error(RawCode.takeError());
7390 return QualType();
7391 }
7392
7393 ASTRecordReader Record(*this, *Loc.F);
7394 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7395 if (!Code) {
7396 Error(Code.takeError());
7397 return QualType();
7398 }
7399 if (Code.get() == TYPE_EXT_QUAL) {
7400 QualType baseType = Record.readQualType();
7401 Qualifiers quals = Record.readQualifiers();
7402 return Context.getQualifiedType(baseType, quals);
7403 }
7404
7405 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7406 if (!maybeClass) {
7407 Error("Unexpected code for type");
7408 return QualType();
7409 }
7410
7411 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7412 return TypeReader.read(*maybeClass);
7413}
7414
7415namespace clang {
7416
7417class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7418 ASTRecordReader &Reader;
7419
7420 SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
7421 SourceRange readSourceRange() { return Reader.readSourceRange(); }
7422
7423 TypeSourceInfo *GetTypeSourceInfo() {
7424 return Reader.readTypeSourceInfo();
7425 }
7426
7427 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7428 return Reader.readNestedNameSpecifierLoc();
7429 }
7430
7431 Attr *ReadAttr() {
7432 return Reader.readAttr();
7433 }
7434
7435public:
7436 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7437
7438 // We want compile-time assurance that we've enumerated all of
7439 // these, so unfortunately we have to declare them first, then
7440 // define them out-of-line.
7441#define ABSTRACT_TYPELOC(CLASS, PARENT)
7442#define TYPELOC(CLASS, PARENT) \
7443 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7444#include "clang/AST/TypeLocNodes.def"
7445
7448 void VisitTagTypeLoc(TagTypeLoc TL);
7449};
7450
7451} // namespace clang
7452
7453void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7454 // nothing to do
7455}
7456
7457void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7458 TL.setBuiltinLoc(readSourceLocation());
7459 if (TL.needsExtraLocalData()) {
7460 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7461 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7462 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7463 TL.setModeAttr(Reader.readInt());
7464 }
7465}
7466
7467void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7468 TL.setNameLoc(readSourceLocation());
7469}
7470
7471void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7472 TL.setStarLoc(readSourceLocation());
7473}
7474
7475void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7476 // nothing to do
7477}
7478
7479void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7480 // nothing to do
7481}
7482
7483void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7484 // nothing to do
7485}
7486
7487void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7488 TL.setExpansionLoc(readSourceLocation());
7489}
7490
7491void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7492 TL.setCaretLoc(readSourceLocation());
7493}
7494
7495void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7496 TL.setAmpLoc(readSourceLocation());
7497}
7498
7499void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7500 TL.setAmpAmpLoc(readSourceLocation());
7501}
7502
7503void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7504 TL.setStarLoc(readSourceLocation());
7505 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7506}
7507
7509 TL.setLBracketLoc(readSourceLocation());
7510 TL.setRBracketLoc(readSourceLocation());
7511 if (Reader.readBool())
7512 TL.setSizeExpr(Reader.readExpr());
7513 else
7514 TL.setSizeExpr(nullptr);
7515}
7516
7517void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7518 VisitArrayTypeLoc(TL);
7519}
7520
7521void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7522 VisitArrayTypeLoc(TL);
7523}
7524
7525void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7526 VisitArrayTypeLoc(TL);
7527}
7528
7529void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7530 DependentSizedArrayTypeLoc TL) {
7531 VisitArrayTypeLoc(TL);
7532}
7533
7534void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7535 DependentAddressSpaceTypeLoc TL) {
7536
7537 TL.setAttrNameLoc(readSourceLocation());
7538 TL.setAttrOperandParensRange(readSourceRange());
7539 TL.setAttrExprOperand(Reader.readExpr());
7540}
7541
7542void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7543 DependentSizedExtVectorTypeLoc TL) {
7544 TL.setNameLoc(readSourceLocation());
7545}
7546
7547void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7548 TL.setNameLoc(readSourceLocation());
7549}
7550
7551void TypeLocReader::VisitDependentVectorTypeLoc(
7552 DependentVectorTypeLoc TL) {
7553 TL.setNameLoc(readSourceLocation());
7554}
7555
7556void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7557 TL.setNameLoc(readSourceLocation());
7558}
7559
7560void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7561 TL.setAttrNameLoc(readSourceLocation());
7562 TL.setAttrOperandParensRange(readSourceRange());
7563 TL.setAttrRowOperand(Reader.readExpr());
7564 TL.setAttrColumnOperand(Reader.readExpr());
7565}
7566
7567void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7568 DependentSizedMatrixTypeLoc TL) {
7569 TL.setAttrNameLoc(readSourceLocation());
7570 TL.setAttrOperandParensRange(readSourceRange());
7571 TL.setAttrRowOperand(Reader.readExpr());
7572 TL.setAttrColumnOperand(Reader.readExpr());
7573}
7574
7576 TL.setLocalRangeBegin(readSourceLocation());
7577 TL.setLParenLoc(readSourceLocation());
7578 TL.setRParenLoc(readSourceLocation());
7579 TL.setExceptionSpecRange(readSourceRange());
7580 TL.setLocalRangeEnd(readSourceLocation());
7581 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7582 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7583 }
7584}
7585
7586void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7587 VisitFunctionTypeLoc(TL);
7588}
7589
7590void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7591 VisitFunctionTypeLoc(TL);
7592}
7593
7594void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7595 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7596 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7597 SourceLocation NameLoc = readSourceLocation();
7598 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7599}
7600
7601void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7602 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7603 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7604 SourceLocation NameLoc = readSourceLocation();
7605 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7606}
7607
7608void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7609 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7610 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7611 SourceLocation NameLoc = readSourceLocation();
7612 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7613}
7614
7615void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7616 TL.setTypeofLoc(readSourceLocation());
7617 TL.setLParenLoc(readSourceLocation());
7618 TL.setRParenLoc(readSourceLocation());
7619}
7620
7621void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7622 TL.setTypeofLoc(readSourceLocation());
7623 TL.setLParenLoc(readSourceLocation());
7624 TL.setRParenLoc(readSourceLocation());
7625 TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7626}
7627
7628void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7629 TL.setDecltypeLoc(readSourceLocation());
7630 TL.setRParenLoc(readSourceLocation());
7631}
7632
7633void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7634 TL.setEllipsisLoc(readSourceLocation());
7635}
7636
7637void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7638 TL.setKWLoc(readSourceLocation());
7639 TL.setLParenLoc(readSourceLocation());
7640 TL.setRParenLoc(readSourceLocation());
7641 TL.setUnderlyingTInfo(GetTypeSourceInfo());
7642}
7643
7645 auto NNS = readNestedNameSpecifierLoc();
7646 auto TemplateKWLoc = readSourceLocation();
7647 auto ConceptNameLoc = readDeclarationNameInfo();
7648 auto FoundDecl = readDeclAs<NamedDecl>();
7649 auto NamedConcept = readDeclAs<ConceptDecl>();
7650 auto *CR = ConceptReference::Create(
7651 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7652 (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7653 return CR;
7654}
7655
7656void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7657 TL.setNameLoc(readSourceLocation());
7658 if (Reader.readBool())
7659 TL.setConceptReference(Reader.readConceptReference());
7660 if (Reader.readBool())
7661 TL.setRParenLoc(readSourceLocation());
7662}
7663
7664void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7666 TL.setElaboratedKeywordLoc(readSourceLocation());
7667 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7668 TL.setTemplateNameLoc(readSourceLocation());
7669}
7670
7672 TL.setElaboratedKeywordLoc(readSourceLocation());
7673 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7674 TL.setNameLoc(readSourceLocation());
7675}
7676
7677void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7678 VisitTagTypeLoc(TL);
7679}
7680
7681void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7682 VisitTagTypeLoc(TL);
7683}
7684
7685void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7686
7687void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7688 TL.setAttr(ReadAttr());
7689}
7690
7691void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7692 // Nothing to do
7693}
7694
7695void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7696 // Nothing to do.
7697}
7698
7699void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7700 TL.setAttrLoc(readSourceLocation());
7701}
7702
7703void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7704 HLSLAttributedResourceTypeLoc TL) {
7705 // Nothing to do.
7706}
7707
7708void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7709 // Nothing to do.
7710}
7711
7712void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7713 TL.setNameLoc(readSourceLocation());
7714}
7715
7716void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7717 SubstTemplateTypeParmTypeLoc TL) {
7718 TL.setNameLoc(readSourceLocation());
7719}
7720
7721void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7722 SubstTemplateTypeParmPackTypeLoc TL) {
7723 TL.setNameLoc(readSourceLocation());
7724}
7725
7726void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7727 SubstBuiltinTemplatePackTypeLoc TL) {
7728 TL.setNameLoc(readSourceLocation());
7729}
7730
7731void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7732 TemplateSpecializationTypeLoc TL) {
7733 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7734 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7735 SourceLocation TemplateKeywordLoc = readSourceLocation();
7736 SourceLocation NameLoc = readSourceLocation();
7737 SourceLocation LAngleLoc = readSourceLocation();
7738 SourceLocation RAngleLoc = readSourceLocation();
7739 TL.set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7740 LAngleLoc, RAngleLoc);
7741 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.getArgLocInfos();
7742 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7743 Args[I] = Reader.readTemplateArgumentLocInfo(
7744 TL.getTypePtr()->template_arguments()[I].getKind());
7745}
7746
7747void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7748 TL.setLParenLoc(readSourceLocation());
7749 TL.setRParenLoc(readSourceLocation());
7750}
7751
7752void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7753 TL.setElaboratedKeywordLoc(readSourceLocation());
7754 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7755 TL.setNameLoc(readSourceLocation());
7756}
7757
7758void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7759 TL.setEllipsisLoc(readSourceLocation());
7760}
7761
7762void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7763 TL.setNameLoc(readSourceLocation());
7764 TL.setNameEndLoc(readSourceLocation());
7765}
7766
7767void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7768 if (TL.getNumProtocols()) {
7769 TL.setProtocolLAngleLoc(readSourceLocation());
7770 TL.setProtocolRAngleLoc(readSourceLocation());
7771 }
7772 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7773 TL.setProtocolLoc(i, readSourceLocation());
7774}
7775
7776void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7777 TL.setHasBaseTypeAsWritten(Reader.readBool());
7778 TL.setTypeArgsLAngleLoc(readSourceLocation());
7779 TL.setTypeArgsRAngleLoc(readSourceLocation());
7780 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7781 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7782 TL.setProtocolLAngleLoc(readSourceLocation());
7783 TL.setProtocolRAngleLoc(readSourceLocation());
7784 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7785 TL.setProtocolLoc(i, readSourceLocation());
7786}
7787
7788void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7789 TL.setStarLoc(readSourceLocation());
7790}
7791
7792void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7793 TL.setKWLoc(readSourceLocation());
7794 TL.setLParenLoc(readSourceLocation());
7795 TL.setRParenLoc(readSourceLocation());
7796}
7797
7798void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7799 TL.setKWLoc(readSourceLocation());
7800}
7801
7802void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7803 TL.setNameLoc(readSourceLocation());
7804}
7805
7806void TypeLocReader::VisitDependentBitIntTypeLoc(
7807 clang::DependentBitIntTypeLoc TL) {
7808 TL.setNameLoc(readSourceLocation());
7809}
7810
7811void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7812 // Nothing to do.
7813}
7814
7816 TypeLocReader TLR(*this);
7817 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7818 TLR.Visit(TL);
7819}
7820
7822 QualType InfoTy = readType();
7823 if (InfoTy.isNull())
7824 return nullptr;
7825
7826 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7827 readTypeLoc(TInfo->getTypeLoc());
7828 return TInfo;
7829}
7830
7832 return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7833}
7834
7836 return ID >> 32;
7837}
7838
7840 // We don't need to erase the higher bits since if these bits are not 0,
7841 // it must be larger than NUM_PREDEF_TYPE_IDS.
7843}
7844
7845std::pair<ModuleFile *, unsigned>
7846ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7847 assert(!isPredefinedType(ID) &&
7848 "Predefined type shouldn't be in TypesLoaded");
7849 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7850 assert(ModuleFileIndex && "Untranslated Local Decl?");
7851
7852 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7853 assert(OwningModuleFile &&
7854 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7855
7856 return {OwningModuleFile,
7857 OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7858}
7859
7861 assert(ContextObj && "reading type with no AST context");
7862 ASTContext &Context = *ContextObj;
7863
7864 unsigned FastQuals = ID & Qualifiers::FastMask;
7865
7866 if (isPredefinedType(ID)) {
7867 QualType T;
7868 unsigned Index = getIndexForTypeID(ID);
7869 switch ((PredefinedTypeIDs)Index) {
7871 // We should never use this one.
7872 llvm_unreachable("Invalid predefined type");
7873 break;
7875 return QualType();
7877 T = Context.VoidTy;
7878 break;
7880 T = Context.BoolTy;
7881 break;
7884 // FIXME: Check that the signedness of CharTy is correct!
7885 T = Context.CharTy;
7886 break;
7888 T = Context.UnsignedCharTy;
7889 break;
7891 T = Context.UnsignedShortTy;
7892 break;
7894 T = Context.UnsignedIntTy;
7895 break;
7897 T = Context.UnsignedLongTy;
7898 break;
7900 T = Context.UnsignedLongLongTy;
7901 break;
7903 T = Context.UnsignedInt128Ty;
7904 break;
7906 T = Context.SignedCharTy;
7907 break;
7909 T = Context.WCharTy;
7910 break;
7912 T = Context.ShortTy;
7913 break;
7914 case PREDEF_TYPE_INT_ID:
7915 T = Context.IntTy;
7916 break;
7918 T = Context.LongTy;
7919 break;
7921 T = Context.LongLongTy;
7922 break;
7924 T = Context.Int128Ty;
7925 break;
7927 T = Context.BFloat16Ty;
7928 break;
7930 T = Context.HalfTy;
7931 break;
7933 T = Context.FloatTy;
7934 break;
7936 T = Context.DoubleTy;
7937 break;
7939 T = Context.LongDoubleTy;
7940 break;
7942 T = Context.ShortAccumTy;
7943 break;
7945 T = Context.AccumTy;
7946 break;
7948 T = Context.LongAccumTy;
7949 break;
7951 T = Context.UnsignedShortAccumTy;
7952 break;
7954 T = Context.UnsignedAccumTy;
7955 break;
7957 T = Context.UnsignedLongAccumTy;
7958 break;
7960 T = Context.ShortFractTy;
7961 break;
7963 T = Context.FractTy;
7964 break;
7966 T = Context.LongFractTy;
7967 break;
7969 T = Context.UnsignedShortFractTy;
7970 break;
7972 T = Context.UnsignedFractTy;
7973 break;
7975 T = Context.UnsignedLongFractTy;
7976 break;
7978 T = Context.SatShortAccumTy;
7979 break;
7981 T = Context.SatAccumTy;
7982 break;
7984 T = Context.SatLongAccumTy;
7985 break;
7987 T = Context.SatUnsignedShortAccumTy;
7988 break;
7990 T = Context.SatUnsignedAccumTy;
7991 break;
7993 T = Context.SatUnsignedLongAccumTy;
7994 break;
7996 T = Context.SatShortFractTy;
7997 break;
7999 T = Context.SatFractTy;
8000 break;
8002 T = Context.SatLongFractTy;
8003 break;
8005 T = Context.SatUnsignedShortFractTy;
8006 break;
8008 T = Context.SatUnsignedFractTy;
8009 break;
8011 T = Context.SatUnsignedLongFractTy;
8012 break;
8014 T = Context.Float16Ty;
8015 break;
8017 T = Context.Float128Ty;
8018 break;
8020 T = Context.Ibm128Ty;
8021 break;
8023 T = Context.OverloadTy;
8024 break;
8026 T = Context.UnresolvedTemplateTy;
8027 break;
8029 T = Context.BoundMemberTy;
8030 break;
8032 T = Context.PseudoObjectTy;
8033 break;
8035 T = Context.DependentTy;
8036 break;
8038 T = Context.UnknownAnyTy;
8039 break;
8041 T = Context.NullPtrTy;
8042 break;
8044 T = Context.Char8Ty;
8045 break;
8047 T = Context.Char16Ty;
8048 break;
8050 T = Context.Char32Ty;
8051 break;
8053 T = Context.ObjCBuiltinIdTy;
8054 break;
8056 T = Context.ObjCBuiltinClassTy;
8057 break;
8059 T = Context.ObjCBuiltinSelTy;
8060 break;
8061#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8062 case PREDEF_TYPE_##Id##_ID: \
8063 T = Context.SingletonId; \
8064 break;
8065#include "clang/Basic/OpenCLImageTypes.def"
8066#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8067 case PREDEF_TYPE_##Id##_ID: \
8068 T = Context.Id##Ty; \
8069 break;
8070#include "clang/Basic/OpenCLExtensionTypes.def"
8072 T = Context.OCLSamplerTy;
8073 break;
8075 T = Context.OCLEventTy;
8076 break;
8078 T = Context.OCLClkEventTy;
8079 break;
8081 T = Context.OCLQueueTy;
8082 break;
8084 T = Context.OCLReserveIDTy;
8085 break;
8087 T = Context.getAutoDeductType();
8088 break;
8090 T = Context.getAutoRRefDeductType();
8091 break;
8093 T = Context.ARCUnbridgedCastTy;
8094 break;
8096 T = Context.BuiltinFnTy;
8097 break;
8099 T = Context.IncompleteMatrixIdxTy;
8100 break;
8102 T = Context.ArraySectionTy;
8103 break;
8105 T = Context.OMPArrayShapingTy;
8106 break;
8108 T = Context.OMPIteratorTy;
8109 break;
8110#define SVE_TYPE(Name, Id, SingletonId) \
8111 case PREDEF_TYPE_##Id##_ID: \
8112 T = Context.SingletonId; \
8113 break;
8114#include "clang/Basic/AArch64ACLETypes.def"
8115#define PPC_VECTOR_TYPE(Name, Id, Size) \
8116 case PREDEF_TYPE_##Id##_ID: \
8117 T = Context.Id##Ty; \
8118 break;
8119#include "clang/Basic/PPCTypes.def"
8120#define RVV_TYPE(Name, Id, SingletonId) \
8121 case PREDEF_TYPE_##Id##_ID: \
8122 T = Context.SingletonId; \
8123 break;
8124#include "clang/Basic/RISCVVTypes.def"
8125#define WASM_TYPE(Name, Id, SingletonId) \
8126 case PREDEF_TYPE_##Id##_ID: \
8127 T = Context.SingletonId; \
8128 break;
8129#include "clang/Basic/WebAssemblyReferenceTypes.def"
8130#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8131 case PREDEF_TYPE_##Id##_ID: \
8132 T = Context.SingletonId; \
8133 break;
8134#include "clang/Basic/AMDGPUTypes.def"
8135#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8136 case PREDEF_TYPE_##Id##_ID: \
8137 T = Context.SingletonId; \
8138 break;
8139#include "clang/Basic/HLSLIntangibleTypes.def"
8140 }
8141
8142 assert(!T.isNull() && "Unknown predefined type");
8143 return T.withFastQualifiers(FastQuals);
8144 }
8145
8146 unsigned Index = translateTypeIDToIndex(ID).second;
8147
8148 assert(Index < TypesLoaded.size() && "Type index out-of-range");
8149 if (TypesLoaded[Index].isNull()) {
8150 TypesLoaded[Index] = readTypeRecord(ID);
8151 if (TypesLoaded[Index].isNull())
8152 return QualType();
8153
8154 TypesLoaded[Index]->setFromAST();
8155 if (DeserializationListener)
8156 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
8157 TypesLoaded[Index]);
8158 }
8159
8160 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8161}
8162
8164 return GetType(getGlobalTypeID(F, LocalID));
8165}
8166
8168 LocalTypeID LocalID) const {
8169 if (isPredefinedType(LocalID))
8170 return LocalID;
8171
8172 if (!F.ModuleOffsetMap.empty())
8173 ReadModuleOffsetMap(F);
8174
8175 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
8176 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8177
8178 if (ModuleFileIndex == 0)
8180
8181 ModuleFile &MF =
8182 ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
8183 ModuleFileIndex = MF.Index + 1;
8184 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8185}
8186
8189 switch (Kind) {
8191 return readExpr();
8193 return readTypeSourceInfo();
8196 SourceLocation TemplateKWLoc = readSourceLocation();
8198 SourceLocation TemplateNameLoc = readSourceLocation();
8201 : SourceLocation();
8202 return TemplateArgumentLocInfo(getASTContext(), TemplateKWLoc, QualifierLoc,
8203 TemplateNameLoc, EllipsisLoc);
8204 }
8211 // FIXME: Is this right?
8212 return TemplateArgumentLocInfo();
8213 }
8214 llvm_unreachable("unexpected template argument loc");
8215}
8216
8226
8229 Result.setLAngleLoc(readSourceLocation());
8230 Result.setRAngleLoc(readSourceLocation());
8231 unsigned NumArgsAsWritten = readInt();
8232 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
8233 Result.addArgument(readTemplateArgumentLoc());
8234}
8235
8242
8244
8246 if (NumCurrentElementsDeserializing) {
8247 // We arrange to not care about the complete redeclaration chain while we're
8248 // deserializing. Just remember that the AST has marked this one as complete
8249 // but that it's not actually complete yet, so we know we still need to
8250 // complete it later.
8251 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
8252 return;
8253 }
8254
8255 if (!D->getDeclContext()) {
8256 assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
8257 return;
8258 }
8259
8260 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
8261
8262 // If this is a named declaration, complete it by looking it up
8263 // within its context.
8264 //
8265 // FIXME: Merging a function definition should merge
8266 // all mergeable entities within it.
8268 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
8269 if (!getContext().getLangOpts().CPlusPlus &&
8271 // Outside of C++, we don't have a lookup table for the TU, so update
8272 // the identifier instead. (For C++ modules, we don't store decls
8273 // in the serialized identifier table, so we do the lookup in the TU.)
8274 auto *II = Name.getAsIdentifierInfo();
8275 assert(II && "non-identifier name in C?");
8276 if (II->isOutOfDate())
8278 } else
8279 DC->lookup(Name);
8281 // Find all declarations of this kind from the relevant context.
8282 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
8283 auto *DC = cast<DeclContext>(DCDecl);
8286 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
8287 }
8288 }
8289 }
8290
8293 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8294 Template = CTSD->getSpecializedTemplate();
8295 Args = CTSD->getTemplateArgs().asArray();
8296 } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8297 Template = VTSD->getSpecializedTemplate();
8298 Args = VTSD->getTemplateArgs().asArray();
8299 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
8300 if (auto *Tmplt = FD->getPrimaryTemplate()) {
8301 Template = Tmplt;
8302 Args = FD->getTemplateSpecializationArgs()->asArray();
8303 }
8304 }
8305
8306 if (Template)
8307 Template->loadLazySpecializationsImpl(Args);
8308}
8309
8312 RecordLocation Loc = getLocalBitOffset(Offset);
8313 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8314 SavedStreamPosition SavedPosition(Cursor);
8315 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8316 Error(std::move(Err));
8317 return nullptr;
8318 }
8319 ReadingKindTracker ReadingKind(Read_Decl, *this);
8320 Deserializing D(this);
8321
8322 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8323 if (!MaybeCode) {
8324 Error(MaybeCode.takeError());
8325 return nullptr;
8326 }
8327 unsigned Code = MaybeCode.get();
8328
8329 ASTRecordReader Record(*this, *Loc.F);
8330 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8331 if (!MaybeRecCode) {
8332 Error(MaybeRecCode.takeError());
8333 return nullptr;
8334 }
8335 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
8336 Error("malformed AST file: missing C++ ctor initializers");
8337 return nullptr;
8338 }
8339
8340 return Record.readCXXCtorInitializers();
8341}
8342
8344 assert(ContextObj && "reading base specifiers with no AST context");
8345 ASTContext &Context = *ContextObj;
8346
8347 RecordLocation Loc = getLocalBitOffset(Offset);
8348 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8349 SavedStreamPosition SavedPosition(Cursor);
8350 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8351 Error(std::move(Err));
8352 return nullptr;
8353 }
8354 ReadingKindTracker ReadingKind(Read_Decl, *this);
8355 Deserializing D(this);
8356
8357 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8358 if (!MaybeCode) {
8359 Error(MaybeCode.takeError());
8360 return nullptr;
8361 }
8362 unsigned Code = MaybeCode.get();
8363
8364 ASTRecordReader Record(*this, *Loc.F);
8365 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8366 if (!MaybeRecCode) {
8367 Error(MaybeCode.takeError());
8368 return nullptr;
8369 }
8370 unsigned RecCode = MaybeRecCode.get();
8371
8372 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8373 Error("malformed AST file: missing C++ base specifiers");
8374 return nullptr;
8375 }
8376
8377 unsigned NumBases = Record.readInt();
8378 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8379 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8380 for (unsigned I = 0; I != NumBases; ++I)
8381 Bases[I] = Record.readCXXBaseSpecifier();
8382 return Bases;
8383}
8384
8386 LocalDeclID LocalID) const {
8387 if (LocalID < NUM_PREDEF_DECL_IDS)
8388 return GlobalDeclID(LocalID.getRawValue());
8389
8390 unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8391 DeclID ID = LocalID.getLocalDeclIndex();
8392
8393 if (!F.ModuleOffsetMap.empty())
8394 ReadModuleOffsetMap(F);
8395
8396 ModuleFile *OwningModuleFile =
8397 OwningModuleFileIndex == 0
8398 ? &F
8399 : F.TransitiveImports[OwningModuleFileIndex - 1];
8400
8401 if (OwningModuleFileIndex == 0)
8402 ID -= NUM_PREDEF_DECL_IDS;
8403
8404 uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8405 return GlobalDeclID(NewModuleFileIndex, ID);
8406}
8407
8409 // Predefined decls aren't from any module.
8410 if (ID < NUM_PREDEF_DECL_IDS)
8411 return false;
8412
8413 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8414 return M.Index == ModuleFileIndex - 1;
8415}
8416
8418 // Predefined decls aren't from any module.
8419 if (ID < NUM_PREDEF_DECL_IDS)
8420 return nullptr;
8421
8422 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8423 assert(ModuleFileIndex && "Untranslated Local Decl?");
8424
8425 return &getModuleManager()[ModuleFileIndex - 1];
8426}
8427
8429 if (!D->isFromASTFile())
8430 return nullptr;
8431
8432 return getOwningModuleFile(D->getGlobalID());
8433}
8434
8436 if (ID < NUM_PREDEF_DECL_IDS)
8437 return SourceLocation();
8438
8439 if (Decl *D = GetExistingDecl(ID))
8440 return D->getLocation();
8441
8442 SourceLocation Loc;
8443 DeclCursorForID(ID, Loc);
8444 return Loc;
8445}
8446
8447Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8448 assert(ContextObj && "reading predefined decl without AST context");
8449 ASTContext &Context = *ContextObj;
8450 Decl *NewLoaded = nullptr;
8451 switch (ID) {
8453 return nullptr;
8454
8456 return Context.getTranslationUnitDecl();
8457
8459 if (Context.ObjCIdDecl)
8460 return Context.ObjCIdDecl;
8461 NewLoaded = Context.getObjCIdDecl();
8462 break;
8463
8465 if (Context.ObjCSelDecl)
8466 return Context.ObjCSelDecl;
8467 NewLoaded = Context.getObjCSelDecl();
8468 break;
8469
8471 if (Context.ObjCClassDecl)
8472 return Context.ObjCClassDecl;
8473 NewLoaded = Context.getObjCClassDecl();
8474 break;
8475
8477 if (Context.ObjCProtocolClassDecl)
8478 return Context.ObjCProtocolClassDecl;
8479 NewLoaded = Context.getObjCProtocolDecl();
8480 break;
8481
8483 if (Context.Int128Decl)
8484 return Context.Int128Decl;
8485 NewLoaded = Context.getInt128Decl();
8486 break;
8487
8489 if (Context.UInt128Decl)
8490 return Context.UInt128Decl;
8491 NewLoaded = Context.getUInt128Decl();
8492 break;
8493
8495 if (Context.ObjCInstanceTypeDecl)
8496 return Context.ObjCInstanceTypeDecl;
8497 NewLoaded = Context.getObjCInstanceTypeDecl();
8498 break;
8499
8501 if (Context.BuiltinVaListDecl)
8502 return Context.BuiltinVaListDecl;
8503 NewLoaded = Context.getBuiltinVaListDecl();
8504 break;
8505
8507 if (Context.VaListTagDecl)
8508 return Context.VaListTagDecl;
8509 NewLoaded = Context.getVaListTagDecl();
8510 break;
8511
8513 if (Context.BuiltinMSVaListDecl)
8514 return Context.BuiltinMSVaListDecl;
8515 NewLoaded = Context.getBuiltinMSVaListDecl();
8516 break;
8517
8519 // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8520 return Context.getMSGuidTagDecl();
8521
8523 if (Context.ExternCContext)
8524 return Context.ExternCContext;
8525 NewLoaded = Context.getExternCContextDecl();
8526 break;
8527
8529 if (Context.CFConstantStringTypeDecl)
8530 return Context.CFConstantStringTypeDecl;
8531 NewLoaded = Context.getCFConstantStringDecl();
8532 break;
8533
8535 if (Context.CFConstantStringTagDecl)
8536 return Context.CFConstantStringTagDecl;
8537 NewLoaded = Context.getCFConstantStringTagDecl();
8538 break;
8539
8541 return Context.getMSTypeInfoTagDecl();
8542
8543#define BuiltinTemplate(BTName) \
8544 case PREDEF_DECL##BTName##_ID: \
8545 if (Context.Decl##BTName) \
8546 return Context.Decl##BTName; \
8547 NewLoaded = Context.get##BTName##Decl(); \
8548 break;
8549#include "clang/Basic/BuiltinTemplates.inc"
8550
8552 llvm_unreachable("Invalid decl ID");
8553 break;
8554 }
8555
8556 assert(NewLoaded && "Failed to load predefined decl?");
8557
8558 if (DeserializationListener)
8559 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8560
8561 return NewLoaded;
8562}
8563
8564unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8565 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8566 if (!OwningModuleFile) {
8567 assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8568 return GlobalID.getRawValue();
8569 }
8570
8571 return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8572}
8573
8575 assert(ContextObj && "reading decl with no AST context");
8576
8577 if (ID < NUM_PREDEF_DECL_IDS) {
8578 Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8579 if (D) {
8580 // Track that we have merged the declaration with ID \p ID into the
8581 // pre-existing predefined declaration \p D.
8582 auto &Merged = KeyDecls[D->getCanonicalDecl()];
8583 if (Merged.empty())
8584 Merged.push_back(ID);
8585 }
8586 return D;
8587 }
8588
8589 unsigned Index = translateGlobalDeclIDToIndex(ID);
8590
8591 if (Index >= DeclsLoaded.size()) {
8592 assert(0 && "declaration ID out-of-range for AST file");
8593 Error("declaration ID out-of-range for AST file");
8594 return nullptr;
8595 }
8596
8597 return DeclsLoaded[Index];
8598}
8599
8601 if (ID < NUM_PREDEF_DECL_IDS)
8602 return GetExistingDecl(ID);
8603
8604 unsigned Index = translateGlobalDeclIDToIndex(ID);
8605
8606 if (Index >= DeclsLoaded.size()) {
8607 assert(0 && "declaration ID out-of-range for AST file");
8608 Error("declaration ID out-of-range for AST file");
8609 return nullptr;
8610 }
8611
8612 if (!DeclsLoaded[Index]) {
8613 ReadDeclRecord(ID);
8614 if (DeserializationListener)
8615 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8616 }
8617
8618 return DeclsLoaded[Index];
8619}
8620
8622 GlobalDeclID GlobalID) {
8623 if (GlobalID < NUM_PREDEF_DECL_IDS)
8624 return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8625
8626 if (!M.ModuleOffsetMap.empty())
8627 ReadModuleOffsetMap(M);
8628
8629 ModuleFile *Owner = getOwningModuleFile(GlobalID);
8630 DeclID ID = GlobalID.getLocalDeclIndex();
8631
8632 if (Owner == &M) {
8633 ID += NUM_PREDEF_DECL_IDS;
8634 return LocalDeclID::get(*this, M, ID);
8635 }
8636
8637 uint64_t OrignalModuleFileIndex = 0;
8638 for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8639 if (M.TransitiveImports[I] == Owner) {
8640 OrignalModuleFileIndex = I + 1;
8641 break;
8642 }
8643
8644 if (!OrignalModuleFileIndex)
8645 return LocalDeclID();
8646
8647 return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8648}
8649
8651 unsigned &Idx) {
8652 if (Idx >= Record.size()) {
8653 Error("Corrupted AST file");
8654 return GlobalDeclID(0);
8655 }
8656
8657 return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8658}
8659
8660/// Resolve the offset of a statement into a statement.
8661///
8662/// This operation will read a new statement from the external
8663/// source each time it is called, and is meant to be used via a
8664/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
8666 // Switch case IDs are per Decl.
8668
8669 // Offset here is a global offset across the entire chain.
8670 RecordLocation Loc = getLocalBitOffset(Offset);
8671 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8672 Error(std::move(Err));
8673 return nullptr;
8674 }
8675 assert(NumCurrentElementsDeserializing == 0 &&
8676 "should not be called while already deserializing");
8677 Deserializing D(this);
8678 return ReadStmtFromStream(*Loc.F);
8679}
8680
8681bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8682 const Decl *D) {
8683 assert(D);
8684
8685 auto It = SpecLookups.find(D);
8686 if (It == SpecLookups.end())
8687 return false;
8688
8689 // Get Decl may violate the iterator from SpecializationsLookups so we store
8690 // the DeclIDs in ahead.
8692 It->second.Table.findAll();
8693
8694 // Since we've loaded all the specializations, we can erase it from
8695 // the lookup table.
8696 SpecLookups.erase(It);
8697
8698 bool NewSpecsFound = false;
8699 Deserializing LookupResults(this);
8700 for (auto &Info : Infos) {
8701 if (GetExistingDecl(Info))
8702 continue;
8703 NewSpecsFound = true;
8704 GetDecl(Info);
8705 }
8706
8707 return NewSpecsFound;
8708}
8709
8711 assert(D);
8712
8714 bool NewSpecsFound =
8715 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8716 if (OnlyPartial)
8717 return NewSpecsFound;
8718
8719 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8720 return NewSpecsFound;
8721}
8722
8723bool ASTReader::LoadExternalSpecializationsImpl(
8724 SpecLookupTableTy &SpecLookups, const Decl *D,
8725 ArrayRef<TemplateArgument> TemplateArgs) {
8726 assert(D);
8727
8728 reader::LazySpecializationInfoLookupTable *LookupTable = nullptr;
8729 if (auto It = SpecLookups.find(D); It != SpecLookups.end())
8730 LookupTable = &It->getSecond();
8731 if (!LookupTable)
8732 return false;
8733
8734 // NOTE: The getNameForDiagnostic usage in the lambda may mutate the
8735 // `SpecLookups` object.
8736 llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8737 std::string Name;
8738 llvm::raw_string_ostream OS(Name);
8739 auto *ND = cast<NamedDecl>(D);
8741 /*Qualified=*/true);
8742 return Name;
8743 });
8744
8745 Deserializing LookupResults(this);
8746 auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8747
8748 // Get Decl may violate the iterator from SpecLookups
8750 LookupTable->Table.find(HashValue);
8751
8752 bool NewSpecsFound = false;
8753 for (auto &Info : Infos) {
8754 if (GetExistingDecl(Info))
8755 continue;
8756 NewSpecsFound = true;
8757 GetDecl(Info);
8758 }
8759
8760 return NewSpecsFound;
8761}
8762
8764 const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8765 assert(D);
8766
8767 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8768 PartialSpecializationsLookups, D, TemplateArgs);
8769 NewDeclsFound |=
8770 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8771
8772 return NewDeclsFound;
8773}
8774
8776 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8777 SmallVectorImpl<Decl *> &Decls) {
8778 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8779
8780 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8781 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8782 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8783 auto K = (Decl::Kind)+LexicalDecls[I];
8784 if (!IsKindWeWant(K))
8785 continue;
8786
8787 auto ID = (DeclID) + LexicalDecls[I + 1];
8788
8789 // Don't add predefined declarations to the lexical context more
8790 // than once.
8791 if (ID < NUM_PREDEF_DECL_IDS) {
8792 if (PredefsVisited[ID])
8793 continue;
8794
8795 PredefsVisited[ID] = true;
8796 }
8797
8798 if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8799 assert(D->getKind() == K && "wrong kind for lexical decl");
8800 if (!DC->isDeclInLexicalTraversal(D))
8801 Decls.push_back(D);
8802 }
8803 }
8804 };
8805
8806 if (isa<TranslationUnitDecl>(DC)) {
8807 for (const auto &Lexical : TULexicalDecls)
8808 Visit(Lexical.first, Lexical.second);
8809 } else {
8810 auto I = LexicalDecls.find(DC);
8811 if (I != LexicalDecls.end())
8812 Visit(I->second.first, I->second.second);
8813 }
8814
8815 ++NumLexicalDeclContextsRead;
8816}
8817
8818namespace {
8819
8820class UnalignedDeclIDComp {
8821 ASTReader &Reader;
8822 ModuleFile &Mod;
8823
8824public:
8825 UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8826 : Reader(Reader), Mod(M) {}
8827
8828 bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8829 SourceLocation LHS = getLocation(L);
8830 SourceLocation RHS = getLocation(R);
8831 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8832 }
8833
8834 bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8835 SourceLocation RHS = getLocation(R);
8836 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8837 }
8838
8839 bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8840 SourceLocation LHS = getLocation(L);
8841 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8842 }
8843
8844 SourceLocation getLocation(unaligned_decl_id_t ID) const {
8845 return Reader.getSourceManager().getFileLoc(
8847 Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8848 }
8849};
8850
8851} // namespace
8852
8854 unsigned Offset, unsigned Length,
8855 SmallVectorImpl<Decl *> &Decls) {
8857
8858 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
8859 if (I == FileDeclIDs.end())
8860 return;
8861
8862 FileDeclsInfo &DInfo = I->second;
8863 if (DInfo.Decls.empty())
8864 return;
8865
8867 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
8868 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
8869
8870 UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
8872 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8873 if (BeginIt != DInfo.Decls.begin())
8874 --BeginIt;
8875
8876 // If we are pointing at a top-level decl inside an objc container, we need
8877 // to backtrack until we find it otherwise we will fail to report that the
8878 // region overlaps with an objc container.
8879 while (BeginIt != DInfo.Decls.begin() &&
8880 GetDecl(getGlobalDeclID(*DInfo.Mod,
8881 LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
8882 ->isTopLevelDeclInObjCContainer())
8883 --BeginIt;
8884
8886 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8887 if (EndIt != DInfo.Decls.end())
8888 ++EndIt;
8889
8890 for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
8891 ++DIt)
8892 Decls.push_back(GetDecl(getGlobalDeclID(
8893 *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
8894}
8895
8897 DeclarationName Name,
8898 const DeclContext *OriginalDC) {
8899 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
8900 "DeclContext has no visible decls in storage");
8901 if (!Name)
8902 return false;
8903
8904 // Load the list of declarations.
8905 DeclsSet DS;
8906
8907 auto Find = [&, this](auto &&Table, auto &&Key) {
8908 for (GlobalDeclID ID : Table.find(Key)) {
8910 if (ND->getDeclName() != Name)
8911 continue;
8912 // Special case for namespaces: There can be a lot of redeclarations of
8913 // some namespaces, and we import a "key declaration" per imported module.
8914 // Since all declarations of a namespace are essentially interchangeable,
8915 // we can optimize namespace look-up by only storing the key declaration
8916 // of the current TU, rather than storing N key declarations where N is
8917 // the # of imported modules that declare that namespace.
8918 // TODO: Try to generalize this optimization to other redeclarable decls.
8919 if (isa<NamespaceDecl>(ND))
8921 DS.insert(ND);
8922 }
8923 };
8924
8925 Deserializing LookupResults(this);
8926
8927 // FIXME: Clear the redundancy with templated lambda in C++20 when that's
8928 // available.
8929 if (auto It = Lookups.find(DC); It != Lookups.end()) {
8930 ++NumVisibleDeclContextsRead;
8931 Find(It->second.Table, Name);
8932 }
8933
8934 auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
8935 if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8936 ++NumModuleLocalVisibleDeclContexts;
8937 Find(It->second.Table, std::make_pair(Name, NamedModule));
8938 }
8939 };
8940 if (auto *NamedModule =
8941 OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8942 : nullptr)
8943 FindModuleLocalLookup(NamedModule);
8944 // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
8945 // We're going to find a decl but the decl context of the lookup is
8946 // unspecified. In this case, the OriginalDC may be the decl context in other
8947 // module.
8948 if (ContextObj && ContextObj->getCurrentNamedModule())
8949 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8950
8951 if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8952 ++NumTULocalVisibleDeclContexts;
8953 Find(It->second.Table, Name);
8954 }
8955
8956 SetExternalVisibleDeclsForName(DC, Name, DS);
8957 return !DS.empty();
8958}
8959
8961 if (!DC->hasExternalVisibleStorage())
8962 return;
8963
8964 DeclsMap Decls;
8965
8966 auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
8967 auto It = LookupTables.find(DC);
8968 if (It == LookupTables.end())
8969 return;
8970
8971 NumRead++;
8972
8973 for (GlobalDeclID ID : It->second.Table.findAll()) {
8975 // Special case for namespaces: There can be a lot of redeclarations of
8976 // some namespaces, and we import a "key declaration" per imported module.
8977 // Since all declarations of a namespace are essentially interchangeable,
8978 // we can optimize namespace look-up by only storing the key declaration
8979 // of the current TU, rather than storing N key declarations where N is
8980 // the # of imported modules that declare that namespace.
8981 // TODO: Try to generalize this optimization to other redeclarable decls.
8982 if (isa<NamespaceDecl>(ND))
8984 Decls[ND->getDeclName()].insert(ND);
8985 }
8986
8987 // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
8988 };
8989
8990 findAll(Lookups, NumVisibleDeclContextsRead);
8991 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8992 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8993
8994 for (auto &[Name, DS] : Decls)
8995 SetExternalVisibleDeclsForName(DC, Name, DS);
8996
8997 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
8998}
8999
9002 auto I = Lookups.find(Primary);
9003 return I == Lookups.end() ? nullptr : &I->second;
9004}
9005
9008 auto I = ModuleLocalLookups.find(Primary);
9009 return I == ModuleLocalLookups.end() ? nullptr : &I->second;
9010}
9011
9014 auto I = TULocalLookups.find(Primary);
9015 return I == TULocalLookups.end() ? nullptr : &I->second;
9016}
9017
9020 assert(D->isCanonicalDecl());
9021 auto &LookupTable =
9022 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9023 auto I = LookupTable.find(D);
9024 return I == LookupTable.end() ? nullptr : &I->second;
9025}
9026
9028 assert(D->isCanonicalDecl());
9029 return PartialSpecializationsLookups.contains(D) ||
9030 SpecializationsLookups.contains(D);
9031}
9032
9033/// Under non-PCH compilation the consumer receives the objc methods
9034/// before receiving the implementation, and codegen depends on this.
9035/// We simulate this by deserializing and passing to consumer the methods of the
9036/// implementation before passing the deserialized implementation decl.
9038 ASTConsumer *Consumer) {
9039 assert(ImplD && Consumer);
9040
9041 for (auto *I : ImplD->methods())
9042 Consumer->HandleInterestingDecl(DeclGroupRef(I));
9043
9044 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
9045}
9046
9047void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9048 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9049 PassObjCImplDeclToConsumer(ImplD, Consumer);
9050 else
9051 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9052}
9053
9054void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9055 Consumer->HandleVTable(RD);
9056}
9057
9059 this->Consumer = Consumer;
9060
9061 if (Consumer)
9062 PassInterestingDeclsToConsumer();
9063
9064 if (DeserializationListener)
9065 DeserializationListener->ReaderInitialized(this);
9066}
9067
9069 std::fprintf(stderr, "*** AST File Statistics:\n");
9070
9071 unsigned NumTypesLoaded =
9072 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
9073 unsigned NumDeclsLoaded =
9074 DeclsLoaded.size() -
9075 llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
9076 unsigned NumIdentifiersLoaded =
9077 IdentifiersLoaded.size() -
9078 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
9079 unsigned NumMacrosLoaded =
9080 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
9081 unsigned NumSelectorsLoaded =
9082 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
9083
9084 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
9085 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
9086 NumSLocEntriesRead, TotalNumSLocEntries,
9087 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9088 if (!TypesLoaded.empty())
9089 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
9090 NumTypesLoaded, (unsigned)TypesLoaded.size(),
9091 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
9092 if (!DeclsLoaded.empty())
9093 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
9094 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
9095 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9096 if (!IdentifiersLoaded.empty())
9097 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
9098 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
9099 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9100 if (!MacrosLoaded.empty())
9101 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9102 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
9103 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9104 if (!SelectorsLoaded.empty())
9105 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
9106 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
9107 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9108 if (TotalNumStatements)
9109 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
9110 NumStatementsRead, TotalNumStatements,
9111 ((float)NumStatementsRead/TotalNumStatements * 100));
9112 if (TotalNumMacros)
9113 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
9114 NumMacrosRead, TotalNumMacros,
9115 ((float)NumMacrosRead/TotalNumMacros * 100));
9116 if (TotalLexicalDeclContexts)
9117 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
9118 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9119 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9120 * 100));
9121 if (TotalVisibleDeclContexts)
9122 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
9123 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9124 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9125 * 100));
9126 if (TotalModuleLocalVisibleDeclContexts)
9127 std::fprintf(
9128 stderr, " %u/%u module local visible declcontexts read (%f%%)\n",
9129 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9130 ((float)NumModuleLocalVisibleDeclContexts /
9131 TotalModuleLocalVisibleDeclContexts * 100));
9132 if (TotalTULocalVisibleDeclContexts)
9133 std::fprintf(stderr, " %u/%u visible declcontexts in GMF read (%f%%)\n",
9134 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9135 ((float)NumTULocalVisibleDeclContexts /
9136 TotalTULocalVisibleDeclContexts * 100));
9137 if (TotalNumMethodPoolEntries)
9138 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
9139 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9140 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9141 * 100));
9142 if (NumMethodPoolLookups)
9143 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
9144 NumMethodPoolHits, NumMethodPoolLookups,
9145 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9146 if (NumMethodPoolTableLookups)
9147 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
9148 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9149 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9150 * 100.0));
9151 if (NumIdentifierLookupHits)
9152 std::fprintf(stderr,
9153 " %u / %u identifier table lookups succeeded (%f%%)\n",
9154 NumIdentifierLookupHits, NumIdentifierLookups,
9155 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9156
9157 if (GlobalIndex) {
9158 std::fprintf(stderr, "\n");
9159 GlobalIndex->printStats();
9160 }
9161
9162 std::fprintf(stderr, "\n");
9163 dump();
9164 std::fprintf(stderr, "\n");
9165}
9166
9167template<typename Key, typename ModuleFile, unsigned InitialCapacity>
9168LLVM_DUMP_METHOD static void
9169dumpModuleIDMap(StringRef Name,
9170 const ContinuousRangeMap<Key, ModuleFile *,
9171 InitialCapacity> &Map) {
9172 if (Map.begin() == Map.end())
9173 return;
9174
9176
9177 llvm::errs() << Name << ":\n";
9178 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9179 I != IEnd; ++I)
9180 llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName
9181 << "\n";
9182}
9183
9184LLVM_DUMP_METHOD void ASTReader::dump() {
9185 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
9186 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
9187 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
9188 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
9189 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
9190 dumpModuleIDMap("Global preprocessed entity map",
9191 GlobalPreprocessedEntityMap);
9192
9193 llvm::errs() << "\n*** PCH/Modules Loaded:";
9194 for (ModuleFile &M : ModuleMgr)
9195 M.dump();
9196}
9197
9198/// Return the amount of memory used by memory buffers, breaking down
9199/// by heap-backed versus mmap'ed memory.
9201 for (ModuleFile &I : ModuleMgr) {
9202 if (llvm::MemoryBuffer *buf = I.Buffer) {
9203 size_t bytes = buf->getBufferSize();
9204 switch (buf->getBufferKind()) {
9205 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9206 sizes.malloc_bytes += bytes;
9207 break;
9208 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9209 sizes.mmap_bytes += bytes;
9210 break;
9211 }
9212 }
9213 }
9214}
9215
9217 SemaObj = &S;
9218 S.addExternalSource(this);
9219
9220 // Makes sure any declarations that were deserialized "too early"
9221 // still get added to the identifier's declaration chains.
9222 for (GlobalDeclID ID : PreloadedDeclIDs) {
9224 pushExternalDeclIntoScope(D, D->getDeclName());
9225 }
9226 PreloadedDeclIDs.clear();
9227
9228 // FIXME: What happens if these are changed by a module import?
9229 if (!FPPragmaOptions.empty()) {
9230 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
9231 FPOptionsOverride NewOverrides =
9232 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
9233 SemaObj->CurFPFeatures =
9234 NewOverrides.applyOverrides(SemaObj->getLangOpts());
9235 }
9236
9237 for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
9238 Decl *D = GetDecl(ID);
9239 if (auto *FD = dyn_cast<FunctionDecl>(D))
9240 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9241 else if (auto *BD = dyn_cast<BlockDecl>(D))
9242 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9243 else
9244 llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
9245 }
9246 DeclsWithEffectsToVerify.clear();
9247
9248 SemaObj->OpenCLFeatures = OpenCLExtensions;
9249
9250 UpdateSema();
9251}
9252
9254 assert(SemaObj && "no Sema to update");
9255
9256 // Load the offsets of the declarations that Sema references.
9257 // They will be lazily deserialized when needed.
9258 if (!SemaDeclRefs.empty()) {
9259 assert(SemaDeclRefs.size() % 3 == 0);
9260 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9261 if (!SemaObj->StdNamespace)
9262 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9263 if (!SemaObj->StdBadAlloc)
9264 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9265 if (!SemaObj->StdAlignValT)
9266 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9267 }
9268 SemaDeclRefs.clear();
9269 }
9270
9271 // Update the state of pragmas. Use the same API as if we had encountered the
9272 // pragma in the source.
9273 if(OptimizeOffPragmaLocation.isValid())
9274 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
9275 if (PragmaMSStructState != -1)
9276 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
9277 if (PointersToMembersPragmaLocation.isValid()) {
9278 SemaObj->ActOnPragmaMSPointersToMembers(
9280 PragmaMSPointersToMembersState,
9281 PointersToMembersPragmaLocation);
9282 }
9283 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9284 if (!RISCVVecIntrinsicPragma.empty()) {
9285 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9286 "Wrong number of RISCVVecIntrinsicPragma");
9287 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9288 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9289 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9290 }
9291
9292 if (PragmaAlignPackCurrentValue) {
9293 // The bottom of the stack might have a default value. It must be adjusted
9294 // to the current value to ensure that the packing state is preserved after
9295 // popping entries that were included/imported from a PCH/module.
9296 bool DropFirst = false;
9297 if (!PragmaAlignPackStack.empty() &&
9298 PragmaAlignPackStack.front().Location.isInvalid()) {
9299 assert(PragmaAlignPackStack.front().Value ==
9300 SemaObj->AlignPackStack.DefaultValue &&
9301 "Expected a default alignment value");
9302 SemaObj->AlignPackStack.Stack.emplace_back(
9303 PragmaAlignPackStack.front().SlotLabel,
9304 SemaObj->AlignPackStack.CurrentValue,
9305 SemaObj->AlignPackStack.CurrentPragmaLocation,
9306 PragmaAlignPackStack.front().PushLocation);
9307 DropFirst = true;
9308 }
9309 for (const auto &Entry :
9310 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9311 SemaObj->AlignPackStack.Stack.emplace_back(
9312 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9313 }
9314 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9315 assert(*PragmaAlignPackCurrentValue ==
9316 SemaObj->AlignPackStack.DefaultValue &&
9317 "Expected a default align and pack value");
9318 // Keep the current values.
9319 } else {
9320 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9321 SemaObj->AlignPackStack.CurrentPragmaLocation =
9322 PragmaAlignPackCurrentLocation;
9323 }
9324 }
9325 if (FpPragmaCurrentValue) {
9326 // The bottom of the stack might have a default value. It must be adjusted
9327 // to the current value to ensure that fp-pragma state is preserved after
9328 // popping entries that were included/imported from a PCH/module.
9329 bool DropFirst = false;
9330 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9331 assert(FpPragmaStack.front().Value ==
9332 SemaObj->FpPragmaStack.DefaultValue &&
9333 "Expected a default pragma float_control value");
9334 SemaObj->FpPragmaStack.Stack.emplace_back(
9335 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9336 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9337 FpPragmaStack.front().PushLocation);
9338 DropFirst = true;
9339 }
9340 for (const auto &Entry :
9341 llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
9342 SemaObj->FpPragmaStack.Stack.emplace_back(
9343 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9344 if (FpPragmaCurrentLocation.isInvalid()) {
9345 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9346 "Expected a default pragma float_control value");
9347 // Keep the current values.
9348 } else {
9349 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9350 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9351 }
9352 }
9353
9354 // For non-modular AST files, restore visiblity of modules.
9355 for (auto &Import : PendingImportedModulesSema) {
9356 if (Import.ImportLoc.isInvalid())
9357 continue;
9358 if (Module *Imported = getSubmodule(Import.ID)) {
9359 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9360 }
9361 }
9362 PendingImportedModulesSema.clear();
9363}
9364
9366 // Note that we are loading an identifier.
9367 Deserializing AnIdentifier(this);
9368
9369 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
9370 NumIdentifierLookups,
9371 NumIdentifierLookupHits);
9372
9373 // We don't need to do identifier table lookups in C++ modules (we preload
9374 // all interesting declarations, and don't need to use the scope for name
9375 // lookups). Perform the lookup in PCH files, though, since we don't build
9376 // a complete initial identifier table if we're carrying on from a PCH.
9377 if (PP.getLangOpts().CPlusPlus) {
9378 for (auto *F : ModuleMgr.pch_modules())
9379 if (Visitor(*F))
9380 break;
9381 } else {
9382 // If there is a global index, look there first to determine which modules
9383 // provably do not have any results for this identifier.
9385 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9386 if (!loadGlobalIndex()) {
9387 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9388 HitsPtr = &Hits;
9389 }
9390 }
9391
9392 ModuleMgr.visit(Visitor, HitsPtr);
9393 }
9394
9395 IdentifierInfo *II = Visitor.getIdentifierInfo();
9397 return II;
9398}
9399
9400namespace clang {
9401
9402 /// An identifier-lookup iterator that enumerates all of the
9403 /// identifiers stored within a set of AST files.
9405 /// The AST reader whose identifiers are being enumerated.
9406 const ASTReader &Reader;
9407
9408 /// The current index into the chain of AST files stored in
9409 /// the AST reader.
9410 unsigned Index;
9411
9412 /// The current position within the identifier lookup table
9413 /// of the current AST file.
9414 ASTIdentifierLookupTable::key_iterator Current;
9415
9416 /// The end position within the identifier lookup table of
9417 /// the current AST file.
9418 ASTIdentifierLookupTable::key_iterator End;
9419
9420 /// Whether to skip any modules in the ASTReader.
9421 bool SkipModules;
9422
9423 public:
9424 explicit ASTIdentifierIterator(const ASTReader &Reader,
9425 bool SkipModules = false);
9426
9427 StringRef Next() override;
9428 };
9429
9430} // namespace clang
9431
9433 bool SkipModules)
9434 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9435}
9436
9438 while (Current == End) {
9439 // If we have exhausted all of our AST files, we're done.
9440 if (Index == 0)
9441 return StringRef();
9442
9443 --Index;
9444 ModuleFile &F = Reader.ModuleMgr[Index];
9445 if (SkipModules && F.isModule())
9446 continue;
9447
9448 ASTIdentifierLookupTable *IdTable =
9450 Current = IdTable->key_begin();
9451 End = IdTable->key_end();
9452 }
9453
9454 // We have any identifiers remaining in the current AST file; return
9455 // the next one.
9456 StringRef Result = *Current;
9457 ++Current;
9458 return Result;
9459}
9460
9461namespace {
9462
9463/// A utility for appending two IdentifierIterators.
9464class ChainedIdentifierIterator : public IdentifierIterator {
9465 std::unique_ptr<IdentifierIterator> Current;
9466 std::unique_ptr<IdentifierIterator> Queued;
9467
9468public:
9469 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9470 std::unique_ptr<IdentifierIterator> Second)
9471 : Current(std::move(First)), Queued(std::move(Second)) {}
9472
9473 StringRef Next() override {
9474 if (!Current)
9475 return StringRef();
9476
9477 StringRef result = Current->Next();
9478 if (!result.empty())
9479 return result;
9480
9481 // Try the queued iterator, which may itself be empty.
9482 Current.reset();
9483 std::swap(Current, Queued);
9484 return Next();
9485 }
9486};
9487
9488} // namespace
9489
9491 if (!loadGlobalIndex()) {
9492 std::unique_ptr<IdentifierIterator> ReaderIter(
9493 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9494 std::unique_ptr<IdentifierIterator> ModulesIter(
9495 GlobalIndex->createIdentifierIterator());
9496 return new ChainedIdentifierIterator(std::move(ReaderIter),
9497 std::move(ModulesIter));
9498 }
9499
9500 return new ASTIdentifierIterator(*this);
9501}
9502
9503namespace clang {
9504namespace serialization {
9505
9507 ASTReader &Reader;
9508 Selector Sel;
9509 unsigned PriorGeneration;
9510 unsigned InstanceBits = 0;
9511 unsigned FactoryBits = 0;
9512 bool InstanceHasMoreThanOneDecl = false;
9513 bool FactoryHasMoreThanOneDecl = false;
9514 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9515 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9516
9517 public:
9519 unsigned PriorGeneration)
9520 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9521
9523 if (!M.SelectorLookupTable)
9524 return false;
9525
9526 // If we've already searched this module file, skip it now.
9527 if (M.Generation <= PriorGeneration)
9528 return true;
9529
9530 ++Reader.NumMethodPoolTableLookups;
9531 ASTSelectorLookupTable *PoolTable
9533 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9534 if (Pos == PoolTable->end())
9535 return false;
9536
9537 ++Reader.NumMethodPoolTableHits;
9538 ++Reader.NumSelectorsRead;
9539 // FIXME: Not quite happy with the statistics here. We probably should
9540 // disable this tracking when called via LoadSelector.
9541 // Also, should entries without methods count as misses?
9542 ++Reader.NumMethodPoolEntriesRead;
9544 if (Reader.DeserializationListener)
9545 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9546
9547 // Append methods in the reverse order, so that later we can process them
9548 // in the order they appear in the source code by iterating through
9549 // the vector in the reverse order.
9550 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9551 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9552 InstanceBits = Data.InstanceBits;
9553 FactoryBits = Data.FactoryBits;
9554 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9555 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9556 return false;
9557 }
9558
9559 /// Retrieve the instance methods found by this visitor.
9561 return InstanceMethods;
9562 }
9563
9564 /// Retrieve the instance methods found by this visitor.
9566 return FactoryMethods;
9567 }
9568
9569 unsigned getInstanceBits() const { return InstanceBits; }
9570 unsigned getFactoryBits() const { return FactoryBits; }
9571
9573 return InstanceHasMoreThanOneDecl;
9574 }
9575
9576 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9577 };
9578
9579} // namespace serialization
9580} // namespace clang
9581
9582/// Add the given set of methods to the method list.
9584 ObjCMethodList &List) {
9585 for (ObjCMethodDecl *M : llvm::reverse(Methods))
9586 S.ObjC().addMethodToGlobalList(&List, M);
9587}
9588
9590 // Get the selector generation and update it to the current generation.
9591 unsigned &Generation = SelectorGeneration[Sel];
9592 unsigned PriorGeneration = Generation;
9593 Generation = getGeneration();
9594 SelectorOutOfDate[Sel] = false;
9595
9596 // Search for methods defined with this selector.
9597 ++NumMethodPoolLookups;
9598 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9599 ModuleMgr.visit(Visitor);
9600
9601 if (Visitor.getInstanceMethods().empty() &&
9602 Visitor.getFactoryMethods().empty())
9603 return;
9604
9605 ++NumMethodPoolHits;
9606
9607 if (!getSema())
9608 return;
9609
9610 Sema &S = *getSema();
9611 auto &Methods = S.ObjC().MethodPool[Sel];
9612
9613 Methods.first.setBits(Visitor.getInstanceBits());
9614 Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9615 Methods.second.setBits(Visitor.getFactoryBits());
9616 Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9617
9618 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9619 // when building a module we keep every method individually and may need to
9620 // update hasMoreThanOneDecl as we add the methods.
9621 addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9622 addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9623}
9624
9626 if (SelectorOutOfDate[Sel])
9627 ReadMethodPool(Sel);
9628}
9629
9632 Namespaces.clear();
9633
9634 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9635 if (NamespaceDecl *Namespace
9636 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9637 Namespaces.push_back(Namespace);
9638 }
9639}
9640
9642 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9643 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9644 UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9647 Undefined.insert(std::make_pair(D, Loc));
9648 }
9649 UndefinedButUsed.clear();
9650}
9651
9653 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9654 Exprs) {
9655 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9656 FieldDecl *FD =
9657 cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9658 uint64_t Count = DelayedDeleteExprs[Idx++];
9659 for (uint64_t C = 0; C < Count; ++C) {
9660 SourceLocation DeleteLoc =
9661 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9662 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9663 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9664 }
9665 }
9666}
9667
9669 SmallVectorImpl<VarDecl *> &TentativeDefs) {
9670 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9671 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9672 if (Var)
9673 TentativeDefs.push_back(Var);
9674 }
9675 TentativeDefinitions.clear();
9676}
9677
9680 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9682 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9683 if (D)
9684 Decls.push_back(D);
9685 }
9686 UnusedFileScopedDecls.clear();
9687}
9688
9691 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9693 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9694 if (D)
9695 Decls.push_back(D);
9696 }
9697 DelegatingCtorDecls.clear();
9698}
9699
9701 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9703 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9704 if (D)
9705 Decls.push_back(D);
9706 }
9707 ExtVectorDecls.clear();
9708}
9709
9712 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9713 ++I) {
9714 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9715 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9716 if (D)
9717 Decls.insert(D);
9718 }
9719 UnusedLocalTypedefNameCandidates.clear();
9720}
9721
9724 for (auto I : DeclsToCheckForDeferredDiags) {
9725 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9726 if (D)
9727 Decls.insert(D);
9728 }
9729 DeclsToCheckForDeferredDiags.clear();
9730}
9731
9733 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9734 if (ReferencedSelectorsData.empty())
9735 return;
9736
9737 // If there are @selector references added them to its pool. This is for
9738 // implementation of -Wselector.
9739 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9740 unsigned I = 0;
9741 while (I < DataSize) {
9742 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9743 SourceLocation SelLoc
9744 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9745 Sels.push_back(std::make_pair(Sel, SelLoc));
9746 }
9747 ReferencedSelectorsData.clear();
9748}
9749
9751 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9752 if (WeakUndeclaredIdentifiers.empty())
9753 return;
9754
9755 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9756 IdentifierInfo *WeakId
9757 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9758 IdentifierInfo *AliasId
9759 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9760 SourceLocation Loc =
9761 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9762 WeakInfo WI(AliasId, Loc);
9763 WeakIDs.push_back(std::make_pair(WeakId, WI));
9764 }
9765 WeakUndeclaredIdentifiers.clear();
9766}
9767
9769 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9770 if (ExtnameUndeclaredIdentifiers.empty())
9771 return;
9772
9773 for (unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9774 IdentifierInfo *NameId =
9775 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I]);
9776 IdentifierInfo *ExtnameId =
9777 DecodeIdentifierInfo(ExtnameUndeclaredIdentifiers[I + 1]);
9778 SourceLocation Loc =
9779 SourceLocation::getFromRawEncoding(ExtnameUndeclaredIdentifiers[I + 2]);
9780 AsmLabelAttr *Attr = AsmLabelAttr::CreateImplicit(
9781 getContext(), ExtnameId->getName(),
9782 AttributeCommonInfo(ExtnameId, SourceRange(Loc),
9784 ExtnameIDs.push_back(std::make_pair(NameId, Attr));
9785 }
9786 ExtnameUndeclaredIdentifiers.clear();
9787}
9788
9790 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9792 VTableUse &TableInfo = VTableUses[Idx++];
9793 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9794 VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9795 VT.DefinitionRequired = TableInfo.Used;
9796 VTables.push_back(VT);
9797 }
9798
9799 VTableUses.clear();
9800}
9801
9803 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9804 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9805 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9806 ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9808
9809 Pending.push_back(std::make_pair(D, Loc));
9810 }
9811 PendingInstantiations.clear();
9812}
9813
9815 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9816 &LPTMap) {
9817 for (auto &LPT : LateParsedTemplates) {
9818 ModuleFile *FMod = LPT.first;
9819 RecordDataImpl &LateParsed = LPT.second;
9820 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9821 /* In loop */) {
9822 FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9823
9824 auto LT = std::make_unique<LateParsedTemplate>();
9825 LT->D = ReadDecl(*FMod, LateParsed, Idx);
9826 LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9827
9828 ModuleFile *F = getOwningModuleFile(LT->D);
9829 assert(F && "No module");
9830
9831 unsigned TokN = LateParsed[Idx++];
9832 LT->Toks.reserve(TokN);
9833 for (unsigned T = 0; T < TokN; ++T)
9834 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9835
9836 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9837 }
9838 }
9839
9840 LateParsedTemplates.clear();
9841}
9842
9844 if (!Lambda->getLambdaContextDecl())
9845 return;
9846
9847 auto LambdaInfo =
9848 std::make_pair(Lambda->getLambdaContextDecl()->getCanonicalDecl(),
9849 Lambda->getLambdaIndexInContext());
9850
9851 // Handle the import and then include case for lambdas.
9852 if (auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9853 Iter != LambdaDeclarationsForMerging.end() &&
9854 Iter->second->isFromASTFile() && Lambda->getFirstDecl() == Lambda) {
9856 cast<CXXRecordDecl>(Iter->second)->getMostRecentDecl();
9857 Lambda->setPreviousDecl(Previous);
9858 return;
9859 }
9860
9861 // Keep track of this lambda so it can be merged with another lambda that
9862 // is loaded later.
9863 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9864}
9865
9867 // It would be complicated to avoid reading the methods anyway. So don't.
9868 ReadMethodPool(Sel);
9869}
9870
9872 assert(ID && "Non-zero identifier ID required");
9873 unsigned Index = translateIdentifierIDToIndex(ID).second;
9874 assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
9875 IdentifiersLoaded[Index] = II;
9876 if (DeserializationListener)
9877 DeserializationListener->IdentifierRead(ID, II);
9878}
9879
9880/// Set the globally-visible declarations associated with the given
9881/// identifier.
9882///
9883/// If the AST reader is currently in a state where the given declaration IDs
9884/// cannot safely be resolved, they are queued until it is safe to resolve
9885/// them.
9886///
9887/// \param II an IdentifierInfo that refers to one or more globally-visible
9888/// declarations.
9889///
9890/// \param DeclIDs the set of declaration IDs with the name @p II that are
9891/// visible at global scope.
9892///
9893/// \param Decls if non-null, this vector will be populated with the set of
9894/// deserialized declarations. These declarations will not be pushed into
9895/// scope.
9898 SmallVectorImpl<Decl *> *Decls) {
9899 if (NumCurrentElementsDeserializing && !Decls) {
9900 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9901 return;
9902 }
9903
9904 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9905 if (!SemaObj) {
9906 // Queue this declaration so that it will be added to the
9907 // translation unit scope and identifier's declaration chain
9908 // once a Sema object is known.
9909 PreloadedDeclIDs.push_back(DeclIDs[I]);
9910 continue;
9911 }
9912
9913 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
9914
9915 // If we're simply supposed to record the declarations, do so now.
9916 if (Decls) {
9917 Decls->push_back(D);
9918 continue;
9919 }
9920
9921 // Introduce this declaration into the translation-unit scope
9922 // and add it to the declaration chain for this identifier, so
9923 // that (unqualified) name lookup will find it.
9924 pushExternalDeclIntoScope(D, II);
9925 }
9926}
9927
9928std::pair<ModuleFile *, unsigned>
9929ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
9930 if (ID == 0)
9931 return {nullptr, 0};
9932
9933 unsigned ModuleFileIndex = ID >> 32;
9934 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9935
9936 assert(ModuleFileIndex && "not translating loaded IdentifierID?");
9937 assert(getModuleManager().size() > ModuleFileIndex - 1);
9938
9939 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
9940 assert(LocalID < MF.LocalNumIdentifiers);
9941 return {&MF, MF.BaseIdentifierID + LocalID};
9942}
9943
9945 if (ID == 0)
9946 return nullptr;
9947
9948 if (IdentifiersLoaded.empty()) {
9949 Error("no identifier table in AST file");
9950 return nullptr;
9951 }
9952
9953 auto [M, Index] = translateIdentifierIDToIndex(ID);
9954 if (!IdentifiersLoaded[Index]) {
9955 assert(M != nullptr && "Untranslated Identifier ID?");
9956 assert(Index >= M->BaseIdentifierID);
9957 unsigned LocalIndex = Index - M->BaseIdentifierID;
9958 const unsigned char *Data =
9959 M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
9960
9961 ASTIdentifierLookupTrait Trait(*this, *M);
9962 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
9963 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
9964 auto &II = PP.getIdentifierTable().get(Key);
9965 IdentifiersLoaded[Index] = &II;
9966 bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
9967 markIdentifierFromAST(*this, II, IsModule);
9968 if (DeserializationListener)
9969 DeserializationListener->IdentifierRead(ID, &II);
9970 }
9971
9972 return IdentifiersLoaded[Index];
9973}
9974
9978
9980 if (LocalID < NUM_PREDEF_IDENT_IDS)
9981 return LocalID;
9982
9983 if (!M.ModuleOffsetMap.empty())
9984 ReadModuleOffsetMap(M);
9985
9986 unsigned ModuleFileIndex = LocalID >> 32;
9987 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9988 ModuleFile *MF =
9989 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
9990 assert(MF && "malformed identifier ID encoding?");
9991
9992 if (!ModuleFileIndex)
9993 LocalID -= NUM_PREDEF_IDENT_IDS;
9994
9995 return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
9996}
9997
9998std::pair<ModuleFile *, unsigned>
9999ASTReader::translateMacroIDToIndex(MacroID ID) const {
10000 if (ID == 0)
10001 return {nullptr, 0};
10002
10003 unsigned ModuleFileIndex = ID >> 32;
10004 assert(ModuleFileIndex && "not translating loaded MacroID?");
10005 assert(getModuleManager().size() > ModuleFileIndex - 1);
10006 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
10007
10008 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10009 assert(LocalID < MF.LocalNumMacros);
10010 return {&MF, MF.BaseMacroID + LocalID};
10011}
10012
10014 if (ID == 0)
10015 return nullptr;
10016
10017 if (MacrosLoaded.empty()) {
10018 Error("no macro table in AST file");
10019 return nullptr;
10020 }
10021
10022 auto [M, Index] = translateMacroIDToIndex(ID);
10023 if (!MacrosLoaded[Index]) {
10024 assert(M != nullptr && "Untranslated Macro ID?");
10025 assert(Index >= M->BaseMacroID);
10026 unsigned LocalIndex = Index - M->BaseMacroID;
10027 uint64_t DataOffset = M->MacroOffsetsBase + M->MacroOffsets[LocalIndex];
10028 MacrosLoaded[Index] = ReadMacroRecord(*M, DataOffset);
10029
10030 if (DeserializationListener)
10031 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10032 }
10033
10034 return MacrosLoaded[Index];
10035}
10036
10038 if (LocalID < NUM_PREDEF_MACRO_IDS)
10039 return LocalID;
10040
10041 if (!M.ModuleOffsetMap.empty())
10042 ReadModuleOffsetMap(M);
10043
10044 unsigned ModuleFileIndex = LocalID >> 32;
10045 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10046 ModuleFile *MF =
10047 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
10048 assert(MF && "malformed identifier ID encoding?");
10049
10050 if (!ModuleFileIndex) {
10051 assert(LocalID >= NUM_PREDEF_MACRO_IDS);
10052 LocalID -= NUM_PREDEF_MACRO_IDS;
10053 }
10054
10055 return (static_cast<MacroID>(MF->Index + 1) << 32) | LocalID;
10056}
10057
10059ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
10060 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
10061 return LocalID;
10062
10063 if (!M.ModuleOffsetMap.empty())
10064 ReadModuleOffsetMap(M);
10065
10068 assert(I != M.SubmoduleRemap.end()
10069 && "Invalid index into submodule index remap");
10070
10071 return LocalID + I->second;
10072}
10073
10075 return getSubmodule(ID);
10076}
10077
10079 if (ID & 1) {
10080 // It's a module, look it up by submodule ID.
10081 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
10082 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
10083 } else {
10084 // It's a prefix (preamble, PCH, ...). Look it up by index.
10085 int IndexFromEnd = static_cast<int>(ID >> 1);
10086 assert(IndexFromEnd && "got reference to unknown module file");
10087 return getModuleManager().pch_modules().end()[-IndexFromEnd];
10088 }
10089}
10090
10092 if (!M)
10093 return 1;
10094
10095 // For a file representing a module, use the submodule ID of the top-level
10096 // module as the file ID. For any other kind of file, the number of such
10097 // files loaded beforehand will be the same on reload.
10098 // FIXME: Is this true even if we have an explicit module file and a PCH?
10099 if (M->isModule())
10100 return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
10101
10102 auto PCHModules = getModuleManager().pch_modules();
10103 auto I = llvm::find(PCHModules, M);
10104 assert(I != PCHModules.end() && "emitting reference to unknown file");
10105 return std::distance(I, PCHModules.end()) << 1;
10106}
10107
10108std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
10109 if (Module *M = getSubmodule(ID))
10110 return ASTSourceDescriptor(*M);
10111
10112 // If there is only a single PCH, return it instead.
10113 // Chained PCH are not supported.
10114 const auto &PCHChain = ModuleMgr.pch_modules();
10115 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10116 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10117 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
10118 StringRef FileName = llvm::sys::path::filename(MF.FileName);
10119 return ASTSourceDescriptor(ModuleName,
10120 llvm::sys::path::parent_path(MF.FileName),
10121 FileName, MF.Signature);
10122 }
10123 return std::nullopt;
10124}
10125
10127 auto I = DefinitionSource.find(FD);
10128 if (I == DefinitionSource.end())
10129 return EK_ReplyHazy;
10130 return I->second ? EK_Never : EK_Always;
10131}
10132
10134 return ThisDeclarationWasADefinitionSet.contains(FD);
10135}
10136
10138 return DecodeSelector(getGlobalSelectorID(M, LocalID));
10139}
10140
10142 if (ID == 0)
10143 return Selector();
10144
10145 if (ID > SelectorsLoaded.size()) {
10146 Error("selector ID out of range in AST file");
10147 return Selector();
10148 }
10149
10150 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
10151 // Load this selector from the selector table.
10152 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
10153 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
10154 ModuleFile &M = *I->second;
10155 ASTSelectorLookupTrait Trait(*this, M);
10156 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
10157 SelectorsLoaded[ID - 1] =
10158 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
10159 if (DeserializationListener)
10160 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10161 }
10162
10163 return SelectorsLoaded[ID - 1];
10164}
10165
10169
10171 // ID 0 (the null selector) is considered an external selector.
10172 return getTotalNumSelectors() + 1;
10173}
10174
10176ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
10177 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
10178 return LocalID;
10179
10180 if (!M.ModuleOffsetMap.empty())
10181 ReadModuleOffsetMap(M);
10182
10185 assert(I != M.SelectorRemap.end()
10186 && "Invalid index into selector index remap");
10187
10188 return LocalID + I->second;
10189}
10190
10216
10218 DeclarationNameInfo NameInfo;
10219 NameInfo.setName(readDeclarationName());
10220 NameInfo.setLoc(readSourceLocation());
10221 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
10222 return NameInfo;
10223}
10224
10228
10230 auto Kind = readInt();
10231 auto ResultType = readQualType();
10232 auto Value = readAPInt();
10233 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
10234 assert(Op.isValid());
10235 return Op;
10236}
10237
10240 unsigned NumTPLists = readInt();
10241 Info.NumTemplParamLists = NumTPLists;
10242 if (NumTPLists) {
10243 Info.TemplParamLists =
10244 new (getContext()) TemplateParameterList *[NumTPLists];
10245 for (unsigned i = 0; i != NumTPLists; ++i)
10247 }
10248}
10249
10252 SourceLocation TemplateLoc = readSourceLocation();
10253 SourceLocation LAngleLoc = readSourceLocation();
10254 SourceLocation RAngleLoc = readSourceLocation();
10255
10256 unsigned NumParams = readInt();
10258 Params.reserve(NumParams);
10259 while (NumParams--)
10260 Params.push_back(readDeclAs<NamedDecl>());
10261
10262 bool HasRequiresClause = readBool();
10263 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
10264
10266 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10267 return TemplateParams;
10268}
10269
10272 bool Canonicalize) {
10273 unsigned NumTemplateArgs = readInt();
10274 TemplArgs.reserve(NumTemplateArgs);
10275 while (NumTemplateArgs--)
10276 TemplArgs.push_back(readTemplateArgument(Canonicalize));
10277}
10278
10279/// Read a UnresolvedSet structure.
10281 unsigned NumDecls = readInt();
10282 Set.reserve(getContext(), NumDecls);
10283 while (NumDecls--) {
10284 GlobalDeclID ID = readDeclID();
10286 Set.addLazyDecl(getContext(), ID, AS);
10287 }
10288}
10289
10292 bool isVirtual = readBool();
10293 bool isBaseOfClass = readBool();
10294 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
10295 bool inheritConstructors = readBool();
10297 SourceRange Range = readSourceRange();
10298 SourceLocation EllipsisLoc = readSourceLocation();
10299 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
10300 EllipsisLoc);
10301 Result.setInheritConstructors(inheritConstructors);
10302 return Result;
10303}
10304
10307 ASTContext &Context = getContext();
10308 unsigned NumInitializers = readInt();
10309 assert(NumInitializers && "wrote ctor initializers but have no inits");
10310 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
10311 for (unsigned i = 0; i != NumInitializers; ++i) {
10312 TypeSourceInfo *TInfo = nullptr;
10313 bool IsBaseVirtual = false;
10314 FieldDecl *Member = nullptr;
10315 IndirectFieldDecl *IndirectMember = nullptr;
10316
10318 switch (Type) {
10320 TInfo = readTypeSourceInfo();
10321 IsBaseVirtual = readBool();
10322 break;
10323
10325 TInfo = readTypeSourceInfo();
10326 break;
10327
10330 break;
10331
10333 IndirectMember = readDeclAs<IndirectFieldDecl>();
10334 break;
10335 }
10336
10337 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
10338 Expr *Init = readExpr();
10339 SourceLocation LParenLoc = readSourceLocation();
10340 SourceLocation RParenLoc = readSourceLocation();
10341
10342 CXXCtorInitializer *BOMInit;
10344 BOMInit = new (Context)
10345 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
10346 RParenLoc, MemberOrEllipsisLoc);
10348 BOMInit = new (Context)
10349 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
10350 else if (Member)
10351 BOMInit = new (Context)
10352 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
10353 Init, RParenLoc);
10354 else
10355 BOMInit = new (Context)
10356 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
10357 LParenLoc, Init, RParenLoc);
10358
10359 if (/*IsWritten*/readBool()) {
10360 unsigned SourceOrder = readInt();
10361 BOMInit->setSourceOrder(SourceOrder);
10362 }
10363
10364 CtorInitializers[i] = BOMInit;
10365 }
10366
10367 return CtorInitializers;
10368}
10369
10372 ASTContext &Context = getContext();
10373 unsigned N = readInt();
10375 for (unsigned I = 0; I != N; ++I) {
10376 auto Kind = readNestedNameSpecifierKind();
10377 switch (Kind) {
10379 auto *NS = readDeclAs<NamespaceBaseDecl>();
10380 SourceRange Range = readSourceRange();
10381 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10382 break;
10383 }
10384
10387 if (!T)
10388 return NestedNameSpecifierLoc();
10389 SourceLocation ColonColonLoc = readSourceLocation();
10390 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10391 break;
10392 }
10393
10395 SourceLocation ColonColonLoc = readSourceLocation();
10396 Builder.MakeGlobal(Context, ColonColonLoc);
10397 break;
10398 }
10399
10402 SourceRange Range = readSourceRange();
10403 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10404 break;
10405 }
10406
10408 llvm_unreachable("unexpected null nested name specifier");
10409 }
10410 }
10411
10412 return Builder.getWithLocInContext(Context);
10413}
10414
10416 unsigned &Idx) {
10419 return SourceRange(beg, end);
10420}
10421
10423 const StringRef Blob) {
10424 unsigned Count = Record[0];
10425 const char *Byte = Blob.data();
10426 llvm::BitVector Ret = llvm::BitVector(Count, false);
10427 for (unsigned I = 0; I < Count; ++Byte)
10428 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10429 if (*Byte & (1 << Bit))
10430 Ret[I] = true;
10431 return Ret;
10432}
10433
10434/// Read a floating-point value
10435llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10436 return llvm::APFloat(Sem, readAPInt());
10437}
10438
10439// Read a string
10440std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10441 unsigned Len = Record[Idx++];
10442 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10443 Idx += Len;
10444 return Result;
10445}
10446
10447StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10448 StringRef &Blob) {
10449 unsigned Len = Record[Idx++];
10450 StringRef Result = Blob.substr(0, Len);
10451 Blob = Blob.substr(Len);
10452 return Result;
10453}
10454
10456 unsigned &Idx) {
10457 return ReadPath(F.BaseDirectory, Record, Idx);
10458}
10459
10460std::string ASTReader::ReadPath(StringRef BaseDirectory,
10461 const RecordData &Record, unsigned &Idx) {
10462 std::string Filename = ReadString(Record, Idx);
10463 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10464}
10465
10466std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10467 const RecordData &Record, unsigned &Idx,
10468 StringRef &Blob) {
10469 StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10470 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10471}
10472
10474 unsigned &Idx) {
10475 unsigned Major = Record[Idx++];
10476 unsigned Minor = Record[Idx++];
10477 unsigned Subminor = Record[Idx++];
10478 if (Minor == 0)
10479 return VersionTuple(Major);
10480 if (Subminor == 0)
10481 return VersionTuple(Major, Minor - 1);
10482 return VersionTuple(Major, Minor - 1, Subminor - 1);
10483}
10484
10491
10492DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10493 return Diag(CurrentImportLoc, DiagID);
10494}
10495
10497 return Diags.Report(Loc, DiagID);
10498}
10499
10501 llvm::function_ref<void()> Fn) {
10502 // When Sema is available, avoid duplicate errors.
10503 if (SemaObj) {
10504 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10505 return;
10506 }
10507
10508 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10509}
10510
10511/// Retrieve the identifier table associated with the
10512/// preprocessor.
10514 return PP.getIdentifierTable();
10515}
10516
10517/// Record that the given ID maps to the given switch-case
10518/// statement.
10520 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10521 "Already have a SwitchCase with this ID");
10522 (*CurrSwitchCaseStmts)[ID] = SC;
10523}
10524
10525/// Retrieve the switch-case statement with the given ID.
10527 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10528 return (*CurrSwitchCaseStmts)[ID];
10529}
10530
10532 CurrSwitchCaseStmts->clear();
10533}
10534
10536 ASTContext &Context = getContext();
10537 std::vector<RawComment *> Comments;
10538 for (SmallVectorImpl<std::pair<BitstreamCursor,
10540 I = CommentsCursors.begin(),
10541 E = CommentsCursors.end();
10542 I != E; ++I) {
10543 Comments.clear();
10544 BitstreamCursor &Cursor = I->first;
10545 serialization::ModuleFile &F = *I->second;
10546 SavedStreamPosition SavedPosition(Cursor);
10547
10549 while (true) {
10551 Cursor.advanceSkippingSubblocks(
10552 BitstreamCursor::AF_DontPopBlockAtEnd);
10553 if (!MaybeEntry) {
10554 Error(MaybeEntry.takeError());
10555 return;
10556 }
10557 llvm::BitstreamEntry Entry = MaybeEntry.get();
10558
10559 switch (Entry.Kind) {
10560 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10561 case llvm::BitstreamEntry::Error:
10562 Error("malformed block record in AST file");
10563 return;
10564 case llvm::BitstreamEntry::EndBlock:
10565 goto NextCursor;
10566 case llvm::BitstreamEntry::Record:
10567 // The interesting case.
10568 break;
10569 }
10570
10571 // Read a record.
10572 Record.clear();
10573 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10574 if (!MaybeComment) {
10575 Error(MaybeComment.takeError());
10576 return;
10577 }
10578 switch ((CommentRecordTypes)MaybeComment.get()) {
10579 case COMMENTS_RAW_COMMENT: {
10580 unsigned Idx = 0;
10581 SourceRange SR = ReadSourceRange(F, Record, Idx);
10584 bool IsTrailingComment = Record[Idx++];
10585 bool IsAlmostTrailingComment = Record[Idx++];
10586 Comments.push_back(new (Context) RawComment(
10587 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10588 break;
10589 }
10590 }
10591 }
10592 NextCursor:
10593 for (RawComment *C : Comments) {
10594 SourceLocation CommentLoc = C->getBeginLoc();
10595 if (CommentLoc.isValid()) {
10596 FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10597 if (Loc.first.isValid())
10598 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10599 }
10600 }
10601 }
10602}
10603
10605 serialization::ModuleFile &MF, bool IncludeSystem,
10606 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10607 bool IsSystem)>
10608 Visitor) {
10609 unsigned NumUserInputs = MF.NumUserInputFiles;
10610 unsigned NumInputs = MF.InputFilesLoaded.size();
10611 assert(NumUserInputs <= NumInputs);
10612 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10613 for (unsigned I = 0; I < N; ++I) {
10614 bool IsSystem = I >= NumUserInputs;
10615 InputFileInfo IFI = getInputFileInfo(MF, I+1);
10616 Visitor(IFI, IsSystem);
10617 }
10618}
10619
10621 bool IncludeSystem, bool Complain,
10622 llvm::function_ref<void(const serialization::InputFile &IF,
10623 bool isSystem)> Visitor) {
10624 unsigned NumUserInputs = MF.NumUserInputFiles;
10625 unsigned NumInputs = MF.InputFilesLoaded.size();
10626 assert(NumUserInputs <= NumInputs);
10627 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10628 for (unsigned I = 0; I < N; ++I) {
10629 bool IsSystem = I >= NumUserInputs;
10630 InputFile IF = getInputFile(MF, I+1, Complain);
10631 Visitor(IF, IsSystem);
10632 }
10633}
10634
10637 llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10638 unsigned NumInputs = MF.InputFilesLoaded.size();
10639 for (unsigned I = 0; I < NumInputs; ++I) {
10640 InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10641 if (IFI.TopLevel && IFI.ModuleMap)
10642 if (auto FE = getInputFile(MF, I + 1).getFile())
10643 Visitor(*FE);
10644 }
10645}
10646
10647void ASTReader::finishPendingActions() {
10648 while (!PendingIdentifierInfos.empty() ||
10649 !PendingDeducedFunctionTypes.empty() ||
10650 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10651 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10652 !PendingUpdateRecords.empty() ||
10653 !PendingObjCExtensionIvarRedeclarations.empty()) {
10654 // If any identifiers with corresponding top-level declarations have
10655 // been loaded, load those declarations now.
10656 using TopLevelDeclsMap =
10657 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10658 TopLevelDeclsMap TopLevelDecls;
10659
10660 while (!PendingIdentifierInfos.empty()) {
10661 IdentifierInfo *II = PendingIdentifierInfos.back().first;
10663 std::move(PendingIdentifierInfos.back().second);
10664 PendingIdentifierInfos.pop_back();
10665
10666 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10667 }
10668
10669 // Load each function type that we deferred loading because it was a
10670 // deduced type that might refer to a local type declared within itself.
10671 for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10672 auto *FD = PendingDeducedFunctionTypes[I].first;
10673 FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10674
10675 if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10676 // If we gave a function a deduced return type, remember that we need to
10677 // propagate that along the redeclaration chain.
10678 if (DT->isDeduced()) {
10679 PendingDeducedTypeUpdates.insert(
10680 {FD->getCanonicalDecl(), FD->getReturnType()});
10681 continue;
10682 }
10683
10684 // The function has undeduced DeduceType return type. We hope we can
10685 // find the deduced type by iterating the redecls in other modules
10686 // later.
10687 PendingUndeducedFunctionDecls.push_back(FD);
10688 continue;
10689 }
10690 }
10691 PendingDeducedFunctionTypes.clear();
10692
10693 // Load each variable type that we deferred loading because it was a
10694 // deduced type that might refer to a local type declared within itself.
10695 for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10696 auto *VD = PendingDeducedVarTypes[I].first;
10697 VD->setType(GetType(PendingDeducedVarTypes[I].second));
10698 }
10699 PendingDeducedVarTypes.clear();
10700
10701 // Load pending declaration chains.
10702 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10703 loadPendingDeclChain(PendingDeclChains[I].first,
10704 PendingDeclChains[I].second);
10705 PendingDeclChains.clear();
10706
10707 // Make the most recent of the top-level declarations visible.
10708 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10709 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10710 IdentifierInfo *II = TLD->first;
10711 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10712 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10713 }
10714 }
10715
10716 // Load any pending macro definitions.
10717 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10718 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10719 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10720 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10721 // Initialize the macro history from chained-PCHs ahead of module imports.
10722 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10723 ++IDIdx) {
10724 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10725 if (!Info.M->isModule())
10726 resolvePendingMacro(II, Info);
10727 }
10728 // Handle module imports.
10729 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10730 ++IDIdx) {
10731 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10732 if (Info.M->isModule())
10733 resolvePendingMacro(II, Info);
10734 }
10735 }
10736 PendingMacroIDs.clear();
10737
10738 // Wire up the DeclContexts for Decls that we delayed setting until
10739 // recursive loading is completed.
10740 while (!PendingDeclContextInfos.empty()) {
10741 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10742 PendingDeclContextInfos.pop_front();
10743 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10744 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10745 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10746 }
10747
10748 // Perform any pending declaration updates.
10749 while (!PendingUpdateRecords.empty()) {
10750 auto Update = PendingUpdateRecords.pop_back_val();
10751 ReadingKindTracker ReadingKind(Read_Decl, *this);
10752 loadDeclUpdateRecords(Update);
10753 }
10754
10755 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10756 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10757 auto DuplicateIvars =
10758 PendingObjCExtensionIvarRedeclarations.back().second;
10760 StructuralEquivalenceContext Ctx(
10761 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10762 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10763 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10764 /*Complain =*/false,
10765 /*ErrorOnTagTypeMismatch =*/true);
10766 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10767 // Merge redeclared ivars with their predecessors.
10768 for (auto IvarPair : DuplicateIvars) {
10769 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10770 // Change semantic DeclContext but keep the lexical one.
10771 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10772 Ivar->getLexicalDeclContext(),
10773 getContext());
10774 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10775 }
10776 // Invalidate duplicate extension and the cached ivar list.
10777 ExtensionsPair.first->setInvalidDecl();
10778 ExtensionsPair.second->getClassInterface()
10779 ->getDefinition()
10780 ->setIvarList(nullptr);
10781 } else {
10782 for (auto IvarPair : DuplicateIvars) {
10783 Diag(IvarPair.first->getLocation(),
10784 diag::err_duplicate_ivar_declaration)
10785 << IvarPair.first->getIdentifier();
10786 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10787 }
10788 }
10789 PendingObjCExtensionIvarRedeclarations.pop_back();
10790 }
10791 }
10792
10793 // At this point, all update records for loaded decls are in place, so any
10794 // fake class definitions should have become real.
10795 assert(PendingFakeDefinitionData.empty() &&
10796 "faked up a class definition but never saw the real one");
10797
10798 // If we deserialized any C++ or Objective-C class definitions, any
10799 // Objective-C protocol definitions, or any redeclarable templates, make sure
10800 // that all redeclarations point to the definitions. Note that this can only
10801 // happen now, after the redeclaration chains have been fully wired.
10802 for (Decl *D : PendingDefinitions) {
10803 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10804 if (auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10805 for (auto *R = getMostRecentExistingDecl(RD); R;
10806 R = R->getPreviousDecl()) {
10807 assert((R == D) ==
10808 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10809 "declaration thinks it's the definition but it isn't");
10810 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10811 }
10812 }
10813
10814 continue;
10815 }
10816
10817 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10818 // Make sure that the ObjCInterfaceType points at the definition.
10819 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10820 ->Decl = ID;
10821
10822 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10823 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10824
10825 continue;
10826 }
10827
10828 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10829 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10830 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10831
10832 continue;
10833 }
10834
10835 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10836 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10837 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10838 }
10839 PendingDefinitions.clear();
10840
10841 for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10842 auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10843 if (auto *VD = dyn_cast<VarDecl>(D))
10844 return VD->isThisDeclarationADefinition() ||
10845 VD->isThisDeclarationADemotedDefinition();
10846
10847 if (auto *TD = dyn_cast<TagDecl>(D))
10848 return TD->isThisDeclarationADefinition() ||
10849 TD->isThisDeclarationADemotedDefinition();
10850
10851 if (auto *FD = dyn_cast<FunctionDecl>(D))
10852 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10853
10854 if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10855 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10856
10857 // Conservatively return false here.
10858 return false;
10859 };
10860
10861 auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10862 return hasDefinitionImpl(D, hasDefinitionImpl);
10863 };
10864
10865 // It is not good to prevent multiple declarations since the forward
10866 // declaration is common. Let's try to avoid duplicated definitions
10867 // only.
10869 continue;
10870
10871 Module *PM = Previous->getOwningModule();
10872 Module *DM = D->getOwningModule();
10873 Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
10875 << (DM ? DM->getTopLevelModuleName() : "global module");
10876 Diag(Previous->getLocation(), diag::note_also_found);
10877 }
10878 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10879
10880 // Load the bodies of any functions or methods we've encountered. We do
10881 // this now (delayed) so that we can be sure that the declaration chains
10882 // have been fully wired up (hasBody relies on this).
10883 // FIXME: We shouldn't require complete redeclaration chains here.
10884 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10885 PBEnd = PendingBodies.end();
10886 PB != PBEnd; ++PB) {
10887 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10888 // FIXME: Check for =delete/=default?
10889 const FunctionDecl *Defn = nullptr;
10890 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10891 FD->setLazyBody(PB->second);
10892 } else {
10893 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
10894 mergeDefinitionVisibility(NonConstDefn, FD);
10895
10896 if (!FD->isLateTemplateParsed() &&
10897 !NonConstDefn->isLateTemplateParsed() &&
10898 // We only perform ODR checks for decls not in the explicit
10899 // global module fragment.
10900 !shouldSkipCheckingODR(FD) &&
10901 !shouldSkipCheckingODR(NonConstDefn) &&
10902 FD->getODRHash() != NonConstDefn->getODRHash()) {
10903 if (!isa<CXXMethodDecl>(FD)) {
10904 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10905 } else if (FD->getLexicalParent()->isFileContext() &&
10906 NonConstDefn->getLexicalParent()->isFileContext()) {
10907 // Only diagnose out-of-line method definitions. If they are
10908 // in class definitions, then an error will be generated when
10909 // processing the class bodies.
10910 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10911 }
10912 }
10913 }
10914 continue;
10915 }
10916
10917 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
10918 if (!getContext().getLangOpts().Modules || !MD->hasBody())
10919 MD->setLazyBody(PB->second);
10920 }
10921 PendingBodies.clear();
10922
10923 // Inform any classes that had members added that they now have more members.
10924 for (auto [RD, MD] : PendingAddedClassMembers) {
10925 RD->addedMember(MD);
10926 }
10927 PendingAddedClassMembers.clear();
10928
10929 // Do some cleanup.
10930 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
10932 PendingMergedDefinitionsToDeduplicate.clear();
10933
10934 // For each decl chain that we wanted to complete while deserializing, mark
10935 // it as "still needs to be completed".
10936 for (Decl *D : PendingIncompleteDeclChains)
10937 markIncompleteDeclChain(D);
10938 PendingIncompleteDeclChains.clear();
10939
10940 assert(PendingIdentifierInfos.empty() &&
10941 "Should be empty at the end of finishPendingActions");
10942 assert(PendingDeducedFunctionTypes.empty() &&
10943 "Should be empty at the end of finishPendingActions");
10944 assert(PendingDeducedVarTypes.empty() &&
10945 "Should be empty at the end of finishPendingActions");
10946 assert(PendingDeclChains.empty() &&
10947 "Should be empty at the end of finishPendingActions");
10948 assert(PendingMacroIDs.empty() &&
10949 "Should be empty at the end of finishPendingActions");
10950 assert(PendingDeclContextInfos.empty() &&
10951 "Should be empty at the end of finishPendingActions");
10952 assert(PendingUpdateRecords.empty() &&
10953 "Should be empty at the end of finishPendingActions");
10954 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10955 "Should be empty at the end of finishPendingActions");
10956 assert(PendingFakeDefinitionData.empty() &&
10957 "Should be empty at the end of finishPendingActions");
10958 assert(PendingDefinitions.empty() &&
10959 "Should be empty at the end of finishPendingActions");
10960 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10961 "Should be empty at the end of finishPendingActions");
10962 assert(PendingBodies.empty() &&
10963 "Should be empty at the end of finishPendingActions");
10964 assert(PendingAddedClassMembers.empty() &&
10965 "Should be empty at the end of finishPendingActions");
10966 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10967 "Should be empty at the end of finishPendingActions");
10968 assert(PendingIncompleteDeclChains.empty() &&
10969 "Should be empty at the end of finishPendingActions");
10970}
10971
10972void ASTReader::diagnoseOdrViolations() {
10973 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10974 PendingRecordOdrMergeFailures.empty() &&
10975 PendingFunctionOdrMergeFailures.empty() &&
10976 PendingEnumOdrMergeFailures.empty() &&
10977 PendingObjCInterfaceOdrMergeFailures.empty() &&
10978 PendingObjCProtocolOdrMergeFailures.empty())
10979 return;
10980
10981 // Trigger the import of the full definition of each class that had any
10982 // odr-merging problems, so we can produce better diagnostics for them.
10983 // These updates may in turn find and diagnose some ODR failures, so take
10984 // ownership of the set first.
10985 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10986 PendingOdrMergeFailures.clear();
10987 for (auto &Merge : OdrMergeFailures) {
10988 Merge.first->buildLookup();
10989 Merge.first->decls_begin();
10990 Merge.first->bases_begin();
10991 Merge.first->vbases_begin();
10992 for (auto &RecordPair : Merge.second) {
10993 auto *RD = RecordPair.first;
10994 RD->decls_begin();
10995 RD->bases_begin();
10996 RD->vbases_begin();
10997 }
10998 }
10999
11000 // Trigger the import of the full definition of each record in C/ObjC.
11001 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11002 PendingRecordOdrMergeFailures.clear();
11003 for (auto &Merge : RecordOdrMergeFailures) {
11004 Merge.first->decls_begin();
11005 for (auto &D : Merge.second)
11006 D->decls_begin();
11007 }
11008
11009 // Trigger the import of the full interface definition.
11010 auto ObjCInterfaceOdrMergeFailures =
11011 std::move(PendingObjCInterfaceOdrMergeFailures);
11012 PendingObjCInterfaceOdrMergeFailures.clear();
11013 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11014 Merge.first->decls_begin();
11015 for (auto &InterfacePair : Merge.second)
11016 InterfacePair.first->decls_begin();
11017 }
11018
11019 // Trigger the import of functions.
11020 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11021 PendingFunctionOdrMergeFailures.clear();
11022 for (auto &Merge : FunctionOdrMergeFailures) {
11023 Merge.first->buildLookup();
11024 Merge.first->decls_begin();
11025 Merge.first->getBody();
11026 for (auto &FD : Merge.second) {
11027 FD->buildLookup();
11028 FD->decls_begin();
11029 FD->getBody();
11030 }
11031 }
11032
11033 // Trigger the import of enums.
11034 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11035 PendingEnumOdrMergeFailures.clear();
11036 for (auto &Merge : EnumOdrMergeFailures) {
11037 Merge.first->decls_begin();
11038 for (auto &Enum : Merge.second) {
11039 Enum->decls_begin();
11040 }
11041 }
11042
11043 // Trigger the import of the full protocol definition.
11044 auto ObjCProtocolOdrMergeFailures =
11045 std::move(PendingObjCProtocolOdrMergeFailures);
11046 PendingObjCProtocolOdrMergeFailures.clear();
11047 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11048 Merge.first->decls_begin();
11049 for (auto &ProtocolPair : Merge.second)
11050 ProtocolPair.first->decls_begin();
11051 }
11052
11053 // For each declaration from a merged context, check that the canonical
11054 // definition of that context also contains a declaration of the same
11055 // entity.
11056 //
11057 // Caution: this loop does things that might invalidate iterators into
11058 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
11059 while (!PendingOdrMergeChecks.empty()) {
11060 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11061
11062 // FIXME: Skip over implicit declarations for now. This matters for things
11063 // like implicitly-declared special member functions. This isn't entirely
11064 // correct; we can end up with multiple unmerged declarations of the same
11065 // implicit entity.
11066 if (D->isImplicit())
11067 continue;
11068
11069 DeclContext *CanonDef = D->getDeclContext();
11070
11071 bool Found = false;
11072 const Decl *DCanon = D->getCanonicalDecl();
11073
11074 for (auto *RI : D->redecls()) {
11075 if (RI->getLexicalDeclContext() == CanonDef) {
11076 Found = true;
11077 break;
11078 }
11079 }
11080 if (Found)
11081 continue;
11082
11083 // Quick check failed, time to do the slow thing. Note, we can't just
11084 // look up the name of D in CanonDef here, because the member that is
11085 // in CanonDef might not be found by name lookup (it might have been
11086 // replaced by a more recent declaration in the lookup table), and we
11087 // can't necessarily find it in the redeclaration chain because it might
11088 // be merely mergeable, not redeclarable.
11089 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11090 for (auto *CanonMember : CanonDef->decls()) {
11091 if (CanonMember->getCanonicalDecl() == DCanon) {
11092 // This can happen if the declaration is merely mergeable and not
11093 // actually redeclarable (we looked for redeclarations earlier).
11094 //
11095 // FIXME: We should be able to detect this more efficiently, without
11096 // pulling in all of the members of CanonDef.
11097 Found = true;
11098 break;
11099 }
11100 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
11101 if (ND->getDeclName() == D->getDeclName())
11102 Candidates.push_back(ND);
11103 }
11104
11105 if (!Found) {
11106 // The AST doesn't like TagDecls becoming invalid after they've been
11107 // completed. We only really need to mark FieldDecls as invalid here.
11108 if (!isa<TagDecl>(D))
11109 D->setInvalidDecl();
11110
11111 // Ensure we don't accidentally recursively enter deserialization while
11112 // we're producing our diagnostic.
11113 Deserializing RecursionGuard(this);
11114
11115 std::string CanonDefModule =
11117 cast<Decl>(CanonDef));
11118 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
11120 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11121
11122 if (Candidates.empty())
11123 Diag(cast<Decl>(CanonDef)->getLocation(),
11124 diag::note_module_odr_violation_no_possible_decls) << D;
11125 else {
11126 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
11127 Diag(Candidates[I]->getLocation(),
11128 diag::note_module_odr_violation_possible_decl)
11129 << Candidates[I];
11130 }
11131
11132 DiagnosedOdrMergeFailures.insert(CanonDef);
11133 }
11134 }
11135
11136 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11137 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11138 ObjCInterfaceOdrMergeFailures.empty() &&
11139 ObjCProtocolOdrMergeFailures.empty())
11140 return;
11141
11142 ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
11143 getPreprocessor().getLangOpts());
11144
11145 // Issue any pending ODR-failure diagnostics.
11146 for (auto &Merge : OdrMergeFailures) {
11147 // If we've already pointed out a specific problem with this class, don't
11148 // bother issuing a general "something's different" diagnostic.
11149 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11150 continue;
11151
11152 bool Diagnosed = false;
11153 CXXRecordDecl *FirstRecord = Merge.first;
11154 for (auto &RecordPair : Merge.second) {
11155 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11156 RecordPair.second)) {
11157 Diagnosed = true;
11158 break;
11159 }
11160 }
11161
11162 if (!Diagnosed) {
11163 // All definitions are updates to the same declaration. This happens if a
11164 // module instantiates the declaration of a class template specialization
11165 // and two or more other modules instantiate its definition.
11166 //
11167 // FIXME: Indicate which modules had instantiations of this definition.
11168 // FIXME: How can this even happen?
11169 Diag(Merge.first->getLocation(),
11170 diag::err_module_odr_violation_different_instantiations)
11171 << Merge.first;
11172 }
11173 }
11174
11175 // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
11176 // that in C++ this is done as a part of CXXRecordDecl ODR checking.
11177 for (auto &Merge : RecordOdrMergeFailures) {
11178 // If we've already pointed out a specific problem with this class, don't
11179 // bother issuing a general "something's different" diagnostic.
11180 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11181 continue;
11182
11183 RecordDecl *FirstRecord = Merge.first;
11184 bool Diagnosed = false;
11185 for (auto *SecondRecord : Merge.second) {
11186 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11187 Diagnosed = true;
11188 break;
11189 }
11190 }
11191 (void)Diagnosed;
11192 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11193 }
11194
11195 // Issue ODR failures diagnostics for functions.
11196 for (auto &Merge : FunctionOdrMergeFailures) {
11197 FunctionDecl *FirstFunction = Merge.first;
11198 bool Diagnosed = false;
11199 for (auto &SecondFunction : Merge.second) {
11200 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11201 Diagnosed = true;
11202 break;
11203 }
11204 }
11205 (void)Diagnosed;
11206 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11207 }
11208
11209 // Issue ODR failures diagnostics for enums.
11210 for (auto &Merge : EnumOdrMergeFailures) {
11211 // If we've already pointed out a specific problem with this enum, don't
11212 // bother issuing a general "something's different" diagnostic.
11213 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11214 continue;
11215
11216 EnumDecl *FirstEnum = Merge.first;
11217 bool Diagnosed = false;
11218 for (auto &SecondEnum : Merge.second) {
11219 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11220 Diagnosed = true;
11221 break;
11222 }
11223 }
11224 (void)Diagnosed;
11225 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11226 }
11227
11228 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
11229 // If we've already pointed out a specific problem with this interface,
11230 // don't bother issuing a general "something's different" diagnostic.
11231 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11232 continue;
11233
11234 bool Diagnosed = false;
11235 ObjCInterfaceDecl *FirstID = Merge.first;
11236 for (auto &InterfacePair : Merge.second) {
11237 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11238 InterfacePair.second)) {
11239 Diagnosed = true;
11240 break;
11241 }
11242 }
11243 (void)Diagnosed;
11244 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11245 }
11246
11247 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
11248 // If we've already pointed out a specific problem with this protocol,
11249 // don't bother issuing a general "something's different" diagnostic.
11250 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11251 continue;
11252
11253 ObjCProtocolDecl *FirstProtocol = Merge.first;
11254 bool Diagnosed = false;
11255 for (auto &ProtocolPair : Merge.second) {
11256 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11257 ProtocolPair.second)) {
11258 Diagnosed = true;
11259 break;
11260 }
11261 }
11262 (void)Diagnosed;
11263 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11264 }
11265}
11266
11268 if (llvm::Timer *T = ReadTimer.get();
11269 ++NumCurrentElementsDeserializing == 1 && T)
11270 ReadTimeRegion.emplace(T);
11271}
11272
11274 assert(NumCurrentElementsDeserializing &&
11275 "FinishedDeserializing not paired with StartedDeserializing");
11276 if (NumCurrentElementsDeserializing == 1) {
11277 // We decrease NumCurrentElementsDeserializing only after pending actions
11278 // are finished, to avoid recursively re-calling finishPendingActions().
11279 finishPendingActions();
11280 }
11281 --NumCurrentElementsDeserializing;
11282
11283 if (NumCurrentElementsDeserializing == 0) {
11284 {
11285 // Guard variable to avoid recursively entering the process of passing
11286 // decls to consumer.
11287 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11288 /*NewValue=*/false);
11289
11290 // Propagate exception specification and deduced type updates along
11291 // redeclaration chains.
11292 //
11293 // We do this now rather than in finishPendingActions because we want to
11294 // be able to walk the complete redeclaration chains of the updated decls.
11295 while (!PendingExceptionSpecUpdates.empty() ||
11296 !PendingDeducedTypeUpdates.empty() ||
11297 !PendingUndeducedFunctionDecls.empty()) {
11298 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11299 PendingExceptionSpecUpdates.clear();
11300 for (auto Update : ESUpdates) {
11301 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11302 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11303 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11304 if (auto *Listener = getContext().getASTMutationListener())
11305 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11306 for (auto *Redecl : Update.second->redecls())
11308 }
11309
11310 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11311 PendingDeducedTypeUpdates.clear();
11312 for (auto Update : DTUpdates) {
11313 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11314 // FIXME: If the return type is already deduced, check that it
11315 // matches.
11317 Update.second);
11318 }
11319
11320 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11321 PendingUndeducedFunctionDecls.clear();
11322 // We hope we can find the deduced type for the functions by iterating
11323 // redeclarations in other modules.
11324 for (FunctionDecl *UndeducedFD : UDTUpdates)
11325 (void)UndeducedFD->getMostRecentDecl();
11326 }
11327
11328 ReadTimeRegion.reset();
11329
11330 diagnoseOdrViolations();
11331 }
11332
11333 // We are not in recursive loading, so it's safe to pass the "interesting"
11334 // decls to the consumer.
11335 if (Consumer)
11336 PassInterestingDeclsToConsumer();
11337 }
11338}
11339
11340void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11341 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11342 // Remove any fake results before adding any real ones.
11343 auto It = PendingFakeLookupResults.find(II);
11344 if (It != PendingFakeLookupResults.end()) {
11345 for (auto *ND : It->second)
11346 SemaObj->IdResolver.RemoveDecl(ND);
11347 // FIXME: this works around module+PCH performance issue.
11348 // Rather than erase the result from the map, which is O(n), just clear
11349 // the vector of NamedDecls.
11350 It->second.clear();
11351 }
11352 }
11353
11354 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11355 SemaObj->TUScope->AddDecl(D);
11356 } else if (SemaObj->TUScope) {
11357 // Adding the decl to IdResolver may have failed because it was already in
11358 // (even though it was not added in scope). If it is already in, make sure
11359 // it gets in the scope as well.
11360 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11361 SemaObj->TUScope->AddDecl(D);
11362 }
11363}
11364
11366 ASTContext *Context,
11367 const PCHContainerReader &PCHContainerRdr,
11368 const CodeGenOptions &CodeGenOpts,
11369 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11370 StringRef isysroot,
11371 DisableValidationForModuleKind DisableValidationKind,
11372 bool AllowASTWithCompilerErrors,
11373 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11374 bool ForceValidateUserInputs,
11375 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11376 std::unique_ptr<llvm::Timer> ReadTimer)
11377 : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11379 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11380 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11381 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11382 StackHandler(Diags), PP(PP), ContextObj(Context),
11383 CodeGenOpts(CodeGenOpts),
11384 ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11385 PP.getHeaderSearchInfo()),
11386 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11387 DisableValidationKind(DisableValidationKind),
11388 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11389 AllowConfigurationMismatch(AllowConfigurationMismatch),
11390 ValidateSystemInputs(ValidateSystemInputs),
11391 ForceValidateUserInputs(ForceValidateUserInputs),
11392 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11393 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11394 SourceMgr.setExternalSLocEntrySource(this);
11395
11396 PathBuf.reserve(256);
11397
11398 for (const auto &Ext : Extensions) {
11399 auto BlockName = Ext->getExtensionMetadata().BlockName;
11400 auto Known = ModuleFileExtensions.find(BlockName);
11401 if (Known != ModuleFileExtensions.end()) {
11402 Diags.Report(diag::warn_duplicate_module_file_extension)
11403 << BlockName;
11404 continue;
11405 }
11406
11407 ModuleFileExtensions.insert({BlockName, Ext});
11408 }
11409}
11410
11412 if (OwnsDeserializationListener)
11413 delete DeserializationListener;
11414}
11415
11417 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11418}
11419
11421 unsigned AbbrevID) {
11422 Idx = 0;
11423 Record.clear();
11424 return Cursor.readRecord(AbbrevID, Record);
11425}
11426//===----------------------------------------------------------------------===//
11427//// OMPClauseReader implementation
11428////===----------------------------------------------------------------------===//
11429
11430// This has to be in namespace clang because it's friended by all
11431// of the OMP clauses.
11432namespace clang {
11433
11434class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11435 ASTRecordReader &Record;
11436 ASTContext &Context;
11437
11438public:
11440 : Record(Record), Context(Record.getContext()) {}
11441#define GEN_CLANG_CLAUSE_CLASS
11442#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11443#include "llvm/Frontend/OpenMP/OMP.inc"
11447};
11448
11449} // end namespace clang
11450
11454
11456 OMPClause *C = nullptr;
11457 switch (llvm::omp::Clause(Record.readInt())) {
11458 case llvm::omp::OMPC_if:
11459 C = new (Context) OMPIfClause();
11460 break;
11461 case llvm::omp::OMPC_final:
11462 C = new (Context) OMPFinalClause();
11463 break;
11464 case llvm::omp::OMPC_num_threads:
11465 C = new (Context) OMPNumThreadsClause();
11466 break;
11467 case llvm::omp::OMPC_safelen:
11468 C = new (Context) OMPSafelenClause();
11469 break;
11470 case llvm::omp::OMPC_simdlen:
11471 C = new (Context) OMPSimdlenClause();
11472 break;
11473 case llvm::omp::OMPC_sizes: {
11474 unsigned NumSizes = Record.readInt();
11475 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11476 break;
11477 }
11478 case llvm::omp::OMPC_counts: {
11479 unsigned NumCounts = Record.readInt();
11480 C = OMPCountsClause::CreateEmpty(Context, NumCounts);
11481 break;
11482 }
11483 case llvm::omp::OMPC_permutation: {
11484 unsigned NumLoops = Record.readInt();
11485 C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11486 break;
11487 }
11488 case llvm::omp::OMPC_full:
11489 C = OMPFullClause::CreateEmpty(Context);
11490 break;
11491 case llvm::omp::OMPC_partial:
11493 break;
11494 case llvm::omp::OMPC_looprange:
11496 break;
11497 case llvm::omp::OMPC_allocator:
11498 C = new (Context) OMPAllocatorClause();
11499 break;
11500 case llvm::omp::OMPC_collapse:
11501 C = new (Context) OMPCollapseClause();
11502 break;
11503 case llvm::omp::OMPC_default:
11504 C = new (Context) OMPDefaultClause();
11505 break;
11506 case llvm::omp::OMPC_proc_bind:
11507 C = new (Context) OMPProcBindClause();
11508 break;
11509 case llvm::omp::OMPC_schedule:
11510 C = new (Context) OMPScheduleClause();
11511 break;
11512 case llvm::omp::OMPC_ordered:
11513 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11514 break;
11515 case llvm::omp::OMPC_nowait:
11516 C = new (Context) OMPNowaitClause();
11517 break;
11518 case llvm::omp::OMPC_untied:
11519 C = new (Context) OMPUntiedClause();
11520 break;
11521 case llvm::omp::OMPC_mergeable:
11522 C = new (Context) OMPMergeableClause();
11523 break;
11524 case llvm::omp::OMPC_threadset:
11525 C = new (Context) OMPThreadsetClause();
11526 break;
11527 case llvm::omp::OMPC_transparent:
11528 C = new (Context) OMPTransparentClause();
11529 break;
11530 case llvm::omp::OMPC_read:
11531 C = new (Context) OMPReadClause();
11532 break;
11533 case llvm::omp::OMPC_write:
11534 C = new (Context) OMPWriteClause();
11535 break;
11536 case llvm::omp::OMPC_update:
11537 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11538 break;
11539 case llvm::omp::OMPC_capture:
11540 C = new (Context) OMPCaptureClause();
11541 break;
11542 case llvm::omp::OMPC_compare:
11543 C = new (Context) OMPCompareClause();
11544 break;
11545 case llvm::omp::OMPC_fail:
11546 C = new (Context) OMPFailClause();
11547 break;
11548 case llvm::omp::OMPC_seq_cst:
11549 C = new (Context) OMPSeqCstClause();
11550 break;
11551 case llvm::omp::OMPC_acq_rel:
11552 C = new (Context) OMPAcqRelClause();
11553 break;
11554 case llvm::omp::OMPC_absent: {
11555 unsigned NumKinds = Record.readInt();
11556 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11557 break;
11558 }
11559 case llvm::omp::OMPC_holds:
11560 C = new (Context) OMPHoldsClause();
11561 break;
11562 case llvm::omp::OMPC_contains: {
11563 unsigned NumKinds = Record.readInt();
11564 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11565 break;
11566 }
11567 case llvm::omp::OMPC_no_openmp:
11568 C = new (Context) OMPNoOpenMPClause();
11569 break;
11570 case llvm::omp::OMPC_no_openmp_routines:
11571 C = new (Context) OMPNoOpenMPRoutinesClause();
11572 break;
11573 case llvm::omp::OMPC_no_openmp_constructs:
11574 C = new (Context) OMPNoOpenMPConstructsClause();
11575 break;
11576 case llvm::omp::OMPC_no_parallelism:
11577 C = new (Context) OMPNoParallelismClause();
11578 break;
11579 case llvm::omp::OMPC_acquire:
11580 C = new (Context) OMPAcquireClause();
11581 break;
11582 case llvm::omp::OMPC_release:
11583 C = new (Context) OMPReleaseClause();
11584 break;
11585 case llvm::omp::OMPC_relaxed:
11586 C = new (Context) OMPRelaxedClause();
11587 break;
11588 case llvm::omp::OMPC_weak:
11589 C = new (Context) OMPWeakClause();
11590 break;
11591 case llvm::omp::OMPC_threads:
11592 C = new (Context) OMPThreadsClause();
11593 break;
11594 case llvm::omp::OMPC_simd:
11595 C = new (Context) OMPSIMDClause();
11596 break;
11597 case llvm::omp::OMPC_nogroup:
11598 C = new (Context) OMPNogroupClause();
11599 break;
11600 case llvm::omp::OMPC_unified_address:
11601 C = new (Context) OMPUnifiedAddressClause();
11602 break;
11603 case llvm::omp::OMPC_unified_shared_memory:
11604 C = new (Context) OMPUnifiedSharedMemoryClause();
11605 break;
11606 case llvm::omp::OMPC_reverse_offload:
11607 C = new (Context) OMPReverseOffloadClause();
11608 break;
11609 case llvm::omp::OMPC_dynamic_allocators:
11610 C = new (Context) OMPDynamicAllocatorsClause();
11611 break;
11612 case llvm::omp::OMPC_atomic_default_mem_order:
11613 C = new (Context) OMPAtomicDefaultMemOrderClause();
11614 break;
11615 case llvm::omp::OMPC_self_maps:
11616 C = new (Context) OMPSelfMapsClause();
11617 break;
11618 case llvm::omp::OMPC_at:
11619 C = new (Context) OMPAtClause();
11620 break;
11621 case llvm::omp::OMPC_severity:
11622 C = new (Context) OMPSeverityClause();
11623 break;
11624 case llvm::omp::OMPC_message:
11625 C = new (Context) OMPMessageClause();
11626 break;
11627 case llvm::omp::OMPC_private:
11628 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11629 break;
11630 case llvm::omp::OMPC_firstprivate:
11631 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11632 break;
11633 case llvm::omp::OMPC_lastprivate:
11634 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11635 break;
11636 case llvm::omp::OMPC_shared:
11637 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11638 break;
11639 case llvm::omp::OMPC_reduction: {
11640 unsigned N = Record.readInt();
11641 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11642 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11643 break;
11644 }
11645 case llvm::omp::OMPC_task_reduction:
11646 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11647 break;
11648 case llvm::omp::OMPC_in_reduction:
11649 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11650 break;
11651 case llvm::omp::OMPC_linear:
11652 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11653 break;
11654 case llvm::omp::OMPC_aligned:
11655 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11656 break;
11657 case llvm::omp::OMPC_copyin:
11658 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11659 break;
11660 case llvm::omp::OMPC_copyprivate:
11661 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11662 break;
11663 case llvm::omp::OMPC_flush:
11664 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11665 break;
11666 case llvm::omp::OMPC_depobj:
11668 break;
11669 case llvm::omp::OMPC_depend: {
11670 unsigned NumVars = Record.readInt();
11671 unsigned NumLoops = Record.readInt();
11672 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11673 break;
11674 }
11675 case llvm::omp::OMPC_device:
11676 C = new (Context) OMPDeviceClause();
11677 break;
11678 case llvm::omp::OMPC_map: {
11680 Sizes.NumVars = Record.readInt();
11681 Sizes.NumUniqueDeclarations = Record.readInt();
11682 Sizes.NumComponentLists = Record.readInt();
11683 Sizes.NumComponents = Record.readInt();
11684 C = OMPMapClause::CreateEmpty(Context, Sizes);
11685 break;
11686 }
11687 case llvm::omp::OMPC_num_teams:
11688 C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11689 break;
11690 case llvm::omp::OMPC_thread_limit:
11691 C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11692 break;
11693 case llvm::omp::OMPC_priority:
11694 C = new (Context) OMPPriorityClause();
11695 break;
11696 case llvm::omp::OMPC_grainsize:
11697 C = new (Context) OMPGrainsizeClause();
11698 break;
11699 case llvm::omp::OMPC_num_tasks:
11700 C = new (Context) OMPNumTasksClause();
11701 break;
11702 case llvm::omp::OMPC_hint:
11703 C = new (Context) OMPHintClause();
11704 break;
11705 case llvm::omp::OMPC_dist_schedule:
11706 C = new (Context) OMPDistScheduleClause();
11707 break;
11708 case llvm::omp::OMPC_defaultmap:
11709 C = new (Context) OMPDefaultmapClause();
11710 break;
11711 case llvm::omp::OMPC_to: {
11713 Sizes.NumVars = Record.readInt();
11714 Sizes.NumUniqueDeclarations = Record.readInt();
11715 Sizes.NumComponentLists = Record.readInt();
11716 Sizes.NumComponents = Record.readInt();
11717 C = OMPToClause::CreateEmpty(Context, Sizes);
11718 break;
11719 }
11720 case llvm::omp::OMPC_from: {
11722 Sizes.NumVars = Record.readInt();
11723 Sizes.NumUniqueDeclarations = Record.readInt();
11724 Sizes.NumComponentLists = Record.readInt();
11725 Sizes.NumComponents = Record.readInt();
11726 C = OMPFromClause::CreateEmpty(Context, Sizes);
11727 break;
11728 }
11729 case llvm::omp::OMPC_use_device_ptr: {
11731 Sizes.NumVars = Record.readInt();
11732 Sizes.NumUniqueDeclarations = Record.readInt();
11733 Sizes.NumComponentLists = Record.readInt();
11734 Sizes.NumComponents = Record.readInt();
11735 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11736 break;
11737 }
11738 case llvm::omp::OMPC_use_device_addr: {
11740 Sizes.NumVars = Record.readInt();
11741 Sizes.NumUniqueDeclarations = Record.readInt();
11742 Sizes.NumComponentLists = Record.readInt();
11743 Sizes.NumComponents = Record.readInt();
11744 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11745 break;
11746 }
11747 case llvm::omp::OMPC_is_device_ptr: {
11749 Sizes.NumVars = Record.readInt();
11750 Sizes.NumUniqueDeclarations = Record.readInt();
11751 Sizes.NumComponentLists = Record.readInt();
11752 Sizes.NumComponents = Record.readInt();
11753 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11754 break;
11755 }
11756 case llvm::omp::OMPC_has_device_addr: {
11758 Sizes.NumVars = Record.readInt();
11759 Sizes.NumUniqueDeclarations = Record.readInt();
11760 Sizes.NumComponentLists = Record.readInt();
11761 Sizes.NumComponents = Record.readInt();
11762 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11763 break;
11764 }
11765 case llvm::omp::OMPC_allocate:
11766 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11767 break;
11768 case llvm::omp::OMPC_nontemporal:
11769 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11770 break;
11771 case llvm::omp::OMPC_inclusive:
11772 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11773 break;
11774 case llvm::omp::OMPC_exclusive:
11775 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11776 break;
11777 case llvm::omp::OMPC_order:
11778 C = new (Context) OMPOrderClause();
11779 break;
11780 case llvm::omp::OMPC_init:
11781 C = OMPInitClause::CreateEmpty(Context, Record.readInt());
11782 break;
11783 case llvm::omp::OMPC_use:
11784 C = new (Context) OMPUseClause();
11785 break;
11786 case llvm::omp::OMPC_destroy:
11787 C = new (Context) OMPDestroyClause();
11788 break;
11789 case llvm::omp::OMPC_novariants:
11790 C = new (Context) OMPNovariantsClause();
11791 break;
11792 case llvm::omp::OMPC_nocontext:
11793 C = new (Context) OMPNocontextClause();
11794 break;
11795 case llvm::omp::OMPC_detach:
11796 C = new (Context) OMPDetachClause();
11797 break;
11798 case llvm::omp::OMPC_uses_allocators:
11799 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11800 break;
11801 case llvm::omp::OMPC_affinity:
11802 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11803 break;
11804 case llvm::omp::OMPC_filter:
11805 C = new (Context) OMPFilterClause();
11806 break;
11807 case llvm::omp::OMPC_bind:
11808 C = OMPBindClause::CreateEmpty(Context);
11809 break;
11810 case llvm::omp::OMPC_align:
11811 C = new (Context) OMPAlignClause();
11812 break;
11813 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11814 C = new (Context) OMPXDynCGroupMemClause();
11815 break;
11816 case llvm::omp::OMPC_dyn_groupprivate:
11817 C = new (Context) OMPDynGroupprivateClause();
11818 break;
11819 case llvm::omp::OMPC_doacross: {
11820 unsigned NumVars = Record.readInt();
11821 unsigned NumLoops = Record.readInt();
11822 C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
11823 break;
11824 }
11825 case llvm::omp::OMPC_ompx_attribute:
11826 C = new (Context) OMPXAttributeClause();
11827 break;
11828 case llvm::omp::OMPC_ompx_bare:
11829 C = new (Context) OMPXBareClause();
11830 break;
11831#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11832 case llvm::omp::Enum: \
11833 break;
11834#include "llvm/Frontend/OpenMP/OMPKinds.def"
11835 default:
11836 break;
11837 }
11838 assert(C && "Unknown OMPClause type");
11839
11840 Visit(C);
11841 C->setLocStart(Record.readSourceLocation());
11842 C->setLocEnd(Record.readSourceLocation());
11843
11844 return C;
11845}
11846
11848 C->setPreInitStmt(Record.readSubStmt(),
11849 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11850}
11851
11854 C->setPostUpdateExpr(Record.readSubExpr());
11855}
11856
11857void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11859 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11860 C->setNameModifierLoc(Record.readSourceLocation());
11861 C->setColonLoc(Record.readSourceLocation());
11862 C->setCondition(Record.readSubExpr());
11863 C->setLParenLoc(Record.readSourceLocation());
11864}
11865
11866void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11868 C->setCondition(Record.readSubExpr());
11869 C->setLParenLoc(Record.readSourceLocation());
11870}
11871
11872void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11874 C->setModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
11875 C->setNumThreads(Record.readSubExpr());
11876 C->setModifierLoc(Record.readSourceLocation());
11877 C->setLParenLoc(Record.readSourceLocation());
11878}
11879
11880void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11881 C->setSafelen(Record.readSubExpr());
11882 C->setLParenLoc(Record.readSourceLocation());
11883}
11884
11885void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11886 C->setSimdlen(Record.readSubExpr());
11887 C->setLParenLoc(Record.readSourceLocation());
11888}
11889
11890void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
11891 for (Expr *&E : C->getSizesRefs())
11892 E = Record.readSubExpr();
11893 C->setLParenLoc(Record.readSourceLocation());
11894}
11895
11896void OMPClauseReader::VisitOMPCountsClause(OMPCountsClause *C) {
11897 bool HasFill = Record.readBool();
11898 if (HasFill)
11899 C->setOmpFillIndex(Record.readInt());
11900 C->setOmpFillLoc(Record.readSourceLocation());
11901 for (Expr *&E : C->getCountsRefs())
11902 E = Record.readSubExpr();
11903 C->setLParenLoc(Record.readSourceLocation());
11904}
11905
11906void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
11907 for (Expr *&E : C->getArgsRefs())
11908 E = Record.readSubExpr();
11909 C->setLParenLoc(Record.readSourceLocation());
11910}
11911
11912void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
11913
11914void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
11915 C->setFactor(Record.readSubExpr());
11916 C->setLParenLoc(Record.readSourceLocation());
11917}
11918
11919void OMPClauseReader::VisitOMPLoopRangeClause(OMPLoopRangeClause *C) {
11920 C->setFirst(Record.readSubExpr());
11921 C->setCount(Record.readSubExpr());
11922 C->setLParenLoc(Record.readSourceLocation());
11923 C->setFirstLoc(Record.readSourceLocation());
11924 C->setCountLoc(Record.readSourceLocation());
11925}
11926
11927void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11928 C->setAllocator(Record.readExpr());
11929 C->setLParenLoc(Record.readSourceLocation());
11930}
11931
11932void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11933 C->setNumForLoops(Record.readSubExpr());
11934 C->setLParenLoc(Record.readSourceLocation());
11935}
11936
11937void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11938 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
11939 C->setLParenLoc(Record.readSourceLocation());
11940 C->setDefaultKindKwLoc(Record.readSourceLocation());
11941 C->setDefaultVariableCategory(
11942 Record.readEnum<OpenMPDefaultClauseVariableCategory>());
11943 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11944}
11945
11946// Read the parameter of threadset clause. This will have been saved when
11947// OMPClauseWriter is called.
11948void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) {
11949 C->setLParenLoc(Record.readSourceLocation());
11950 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11951 C->setThreadsetKindLoc(ThreadsetKindLoc);
11952 OpenMPThreadsetKind TKind =
11953 static_cast<OpenMPThreadsetKind>(Record.readInt());
11954 C->setThreadsetKind(TKind);
11955}
11956
11957void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *C) {
11958 C->setLParenLoc(Record.readSourceLocation());
11959 C->setImpexTypeKind(Record.readSubExpr());
11960}
11961
11962void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11963 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
11964 C->setLParenLoc(Record.readSourceLocation());
11965 C->setProcBindKindKwLoc(Record.readSourceLocation());
11966}
11967
11968void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11970 C->setScheduleKind(
11971 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11972 C->setFirstScheduleModifier(
11973 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11974 C->setSecondScheduleModifier(
11975 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11976 C->setChunkSize(Record.readSubExpr());
11977 C->setLParenLoc(Record.readSourceLocation());
11978 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11979 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11980 C->setScheduleKindLoc(Record.readSourceLocation());
11981 C->setCommaLoc(Record.readSourceLocation());
11982}
11983
11984void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11985 C->setNumForLoops(Record.readSubExpr());
11986 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11987 C->setLoopNumIterations(I, Record.readSubExpr());
11988 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11989 C->setLoopCounter(I, Record.readSubExpr());
11990 C->setLParenLoc(Record.readSourceLocation());
11991}
11992
11993void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
11994 C->setEventHandler(Record.readSubExpr());
11995 C->setLParenLoc(Record.readSourceLocation());
11996}
11997
11998void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *C) {
11999 C->setCondition(Record.readSubExpr());
12000 C->setLParenLoc(Record.readSourceLocation());
12001}
12002
12003void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12004
12005void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12006
12007void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12008
12009void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12010
12011void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
12012 if (C->isExtended()) {
12013 C->setLParenLoc(Record.readSourceLocation());
12014 C->setArgumentLoc(Record.readSourceLocation());
12015 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
12016 }
12017}
12018
12019void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12020
12021void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12022
12023// Read the parameter of fail clause. This will have been saved when
12024// OMPClauseWriter is called.
12025void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
12026 C->setLParenLoc(Record.readSourceLocation());
12027 SourceLocation FailParameterLoc = Record.readSourceLocation();
12028 C->setFailParameterLoc(FailParameterLoc);
12029 OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
12030 C->setFailParameter(CKind);
12031}
12032
12033void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
12034 unsigned Count = C->getDirectiveKinds().size();
12035 C->setLParenLoc(Record.readSourceLocation());
12036 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12037 DKVec.reserve(Count);
12038 for (unsigned I = 0; I < Count; I++) {
12039 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12040 }
12041 C->setDirectiveKinds(DKVec);
12042}
12043
12044void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
12045 C->setExpr(Record.readExpr());
12046 C->setLParenLoc(Record.readSourceLocation());
12047}
12048
12049void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
12050 unsigned Count = C->getDirectiveKinds().size();
12051 C->setLParenLoc(Record.readSourceLocation());
12052 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12053 DKVec.reserve(Count);
12054 for (unsigned I = 0; I < Count; I++) {
12055 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
12056 }
12057 C->setDirectiveKinds(DKVec);
12058}
12059
12060void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12061
12062void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12063 OMPNoOpenMPRoutinesClause *) {}
12064
12065void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12066 OMPNoOpenMPConstructsClause *) {}
12067
12068void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12069
12070void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12071
12072void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12073
12074void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12075
12076void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12077
12078void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12079
12080void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12081
12082void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12083
12084void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12085
12086void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12087
12088void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
12089 unsigned NumVars = C->varlist_size();
12090 SmallVector<Expr *, 16> Vars;
12091 Vars.reserve(NumVars);
12092 for (unsigned I = 0; I != NumVars; ++I)
12093 Vars.push_back(Record.readSubExpr());
12094 C->setVarRefs(Vars);
12095 C->setIsTarget(Record.readBool());
12096 C->setIsTargetSync(Record.readBool());
12097 C->setLParenLoc(Record.readSourceLocation());
12098 C->setVarLoc(Record.readSourceLocation());
12099}
12100
12101void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
12102 C->setInteropVar(Record.readSubExpr());
12103 C->setLParenLoc(Record.readSourceLocation());
12104 C->setVarLoc(Record.readSourceLocation());
12105}
12106
12107void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
12108 C->setInteropVar(Record.readSubExpr());
12109 C->setLParenLoc(Record.readSourceLocation());
12110 C->setVarLoc(Record.readSourceLocation());
12111}
12112
12113void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
12115 C->setCondition(Record.readSubExpr());
12116 C->setLParenLoc(Record.readSourceLocation());
12117}
12118
12119void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
12121 C->setCondition(Record.readSubExpr());
12122 C->setLParenLoc(Record.readSourceLocation());
12123}
12124
12125void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12126
12127void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12128 OMPUnifiedSharedMemoryClause *) {}
12129
12130void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12131
12132void
12133OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12134}
12135
12136void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12137 OMPAtomicDefaultMemOrderClause *C) {
12138 C->setAtomicDefaultMemOrderKind(
12139 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
12140 C->setLParenLoc(Record.readSourceLocation());
12141 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12142}
12143
12144void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12145
12146void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
12147 C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
12148 C->setLParenLoc(Record.readSourceLocation());
12149 C->setAtKindKwLoc(Record.readSourceLocation());
12150}
12151
12152void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
12153 C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
12154 C->setLParenLoc(Record.readSourceLocation());
12155 C->setSeverityKindKwLoc(Record.readSourceLocation());
12156}
12157
12158void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
12160 C->setMessageString(Record.readSubExpr());
12161 C->setLParenLoc(Record.readSourceLocation());
12162}
12163
12164void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
12165 C->setLParenLoc(Record.readSourceLocation());
12166 unsigned NumVars = C->varlist_size();
12167 SmallVector<Expr *, 16> Vars;
12168 Vars.reserve(NumVars);
12169 for (unsigned i = 0; i != NumVars; ++i)
12170 Vars.push_back(Record.readSubExpr());
12171 C->setVarRefs(Vars);
12172 Vars.clear();
12173 for (unsigned i = 0; i != NumVars; ++i)
12174 Vars.push_back(Record.readSubExpr());
12175 C->setPrivateCopies(Vars);
12176}
12177
12178void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
12180 C->setLParenLoc(Record.readSourceLocation());
12181 unsigned NumVars = C->varlist_size();
12182 SmallVector<Expr *, 16> Vars;
12183 Vars.reserve(NumVars);
12184 for (unsigned i = 0; i != NumVars; ++i)
12185 Vars.push_back(Record.readSubExpr());
12186 C->setVarRefs(Vars);
12187 Vars.clear();
12188 for (unsigned i = 0; i != NumVars; ++i)
12189 Vars.push_back(Record.readSubExpr());
12190 C->setPrivateCopies(Vars);
12191 Vars.clear();
12192 for (unsigned i = 0; i != NumVars; ++i)
12193 Vars.push_back(Record.readSubExpr());
12194 C->setInits(Vars);
12195}
12196
12197void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
12199 C->setLParenLoc(Record.readSourceLocation());
12200 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
12201 C->setKindLoc(Record.readSourceLocation());
12202 C->setColonLoc(Record.readSourceLocation());
12203 unsigned NumVars = C->varlist_size();
12204 SmallVector<Expr *, 16> Vars;
12205 Vars.reserve(NumVars);
12206 for (unsigned i = 0; i != NumVars; ++i)
12207 Vars.push_back(Record.readSubExpr());
12208 C->setVarRefs(Vars);
12209 Vars.clear();
12210 for (unsigned i = 0; i != NumVars; ++i)
12211 Vars.push_back(Record.readSubExpr());
12212 C->setPrivateCopies(Vars);
12213 Vars.clear();
12214 for (unsigned i = 0; i != NumVars; ++i)
12215 Vars.push_back(Record.readSubExpr());
12216 C->setSourceExprs(Vars);
12217 Vars.clear();
12218 for (unsigned i = 0; i != NumVars; ++i)
12219 Vars.push_back(Record.readSubExpr());
12220 C->setDestinationExprs(Vars);
12221 Vars.clear();
12222 for (unsigned i = 0; i != NumVars; ++i)
12223 Vars.push_back(Record.readSubExpr());
12224 C->setAssignmentOps(Vars);
12225}
12226
12227void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
12228 C->setLParenLoc(Record.readSourceLocation());
12229 unsigned NumVars = C->varlist_size();
12230 SmallVector<Expr *, 16> Vars;
12231 Vars.reserve(NumVars);
12232 for (unsigned i = 0; i != NumVars; ++i)
12233 Vars.push_back(Record.readSubExpr());
12234 C->setVarRefs(Vars);
12235}
12236
12237void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
12239 C->setLParenLoc(Record.readSourceLocation());
12240 C->setModifierLoc(Record.readSourceLocation());
12241 C->setColonLoc(Record.readSourceLocation());
12242 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12243 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12244 C->setQualifierLoc(NNSL);
12245 C->setNameInfo(DNI);
12246
12247 unsigned NumVars = C->varlist_size();
12248 SmallVector<Expr *, 16> Vars;
12249 Vars.reserve(NumVars);
12250 for (unsigned i = 0; i != NumVars; ++i)
12251 Vars.push_back(Record.readSubExpr());
12252 C->setVarRefs(Vars);
12253 Vars.clear();
12254 for (unsigned i = 0; i != NumVars; ++i)
12255 Vars.push_back(Record.readSubExpr());
12256 C->setPrivates(Vars);
12257 Vars.clear();
12258 for (unsigned i = 0; i != NumVars; ++i)
12259 Vars.push_back(Record.readSubExpr());
12260 C->setLHSExprs(Vars);
12261 Vars.clear();
12262 for (unsigned i = 0; i != NumVars; ++i)
12263 Vars.push_back(Record.readSubExpr());
12264 C->setRHSExprs(Vars);
12265 Vars.clear();
12266 for (unsigned i = 0; i != NumVars; ++i)
12267 Vars.push_back(Record.readSubExpr());
12268 C->setReductionOps(Vars);
12269 if (C->getModifier() == OMPC_REDUCTION_inscan) {
12270 Vars.clear();
12271 for (unsigned i = 0; i != NumVars; ++i)
12272 Vars.push_back(Record.readSubExpr());
12273 C->setInscanCopyOps(Vars);
12274 Vars.clear();
12275 for (unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setInscanCopyArrayTemps(Vars);
12278 Vars.clear();
12279 for (unsigned i = 0; i != NumVars; ++i)
12280 Vars.push_back(Record.readSubExpr());
12281 C->setInscanCopyArrayElems(Vars);
12282 }
12283 unsigned NumFlags = Record.readInt();
12284 SmallVector<bool, 16> Flags;
12285 Flags.reserve(NumFlags);
12286 for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
12287 Flags.push_back(Record.readInt());
12288 C->setPrivateVariableReductionFlags(Flags);
12289}
12290
12291void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12293 C->setLParenLoc(Record.readSourceLocation());
12294 C->setColonLoc(Record.readSourceLocation());
12295 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12296 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12297 C->setQualifierLoc(NNSL);
12298 C->setNameInfo(DNI);
12299
12300 unsigned NumVars = C->varlist_size();
12301 SmallVector<Expr *, 16> Vars;
12302 Vars.reserve(NumVars);
12303 for (unsigned I = 0; I != NumVars; ++I)
12304 Vars.push_back(Record.readSubExpr());
12305 C->setVarRefs(Vars);
12306 Vars.clear();
12307 for (unsigned I = 0; I != NumVars; ++I)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setPrivates(Vars);
12310 Vars.clear();
12311 for (unsigned I = 0; I != NumVars; ++I)
12312 Vars.push_back(Record.readSubExpr());
12313 C->setLHSExprs(Vars);
12314 Vars.clear();
12315 for (unsigned I = 0; I != NumVars; ++I)
12316 Vars.push_back(Record.readSubExpr());
12317 C->setRHSExprs(Vars);
12318 Vars.clear();
12319 for (unsigned I = 0; I != NumVars; ++I)
12320 Vars.push_back(Record.readSubExpr());
12321 C->setReductionOps(Vars);
12322}
12323
12324void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12326 C->setLParenLoc(Record.readSourceLocation());
12327 C->setColonLoc(Record.readSourceLocation());
12328 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12329 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12330 C->setQualifierLoc(NNSL);
12331 C->setNameInfo(DNI);
12332
12333 unsigned NumVars = C->varlist_size();
12334 SmallVector<Expr *, 16> Vars;
12335 Vars.reserve(NumVars);
12336 for (unsigned I = 0; I != NumVars; ++I)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setVarRefs(Vars);
12339 Vars.clear();
12340 for (unsigned I = 0; I != NumVars; ++I)
12341 Vars.push_back(Record.readSubExpr());
12342 C->setPrivates(Vars);
12343 Vars.clear();
12344 for (unsigned I = 0; I != NumVars; ++I)
12345 Vars.push_back(Record.readSubExpr());
12346 C->setLHSExprs(Vars);
12347 Vars.clear();
12348 for (unsigned I = 0; I != NumVars; ++I)
12349 Vars.push_back(Record.readSubExpr());
12350 C->setRHSExprs(Vars);
12351 Vars.clear();
12352 for (unsigned I = 0; I != NumVars; ++I)
12353 Vars.push_back(Record.readSubExpr());
12354 C->setReductionOps(Vars);
12355 Vars.clear();
12356 for (unsigned I = 0; I != NumVars; ++I)
12357 Vars.push_back(Record.readSubExpr());
12358 C->setTaskgroupDescriptors(Vars);
12359}
12360
12361void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12363 C->setLParenLoc(Record.readSourceLocation());
12364 C->setColonLoc(Record.readSourceLocation());
12365 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12366 C->setModifierLoc(Record.readSourceLocation());
12367 unsigned NumVars = C->varlist_size();
12368 SmallVector<Expr *, 16> Vars;
12369 Vars.reserve(NumVars);
12370 for (unsigned i = 0; i != NumVars; ++i)
12371 Vars.push_back(Record.readSubExpr());
12372 C->setVarRefs(Vars);
12373 Vars.clear();
12374 for (unsigned i = 0; i != NumVars; ++i)
12375 Vars.push_back(Record.readSubExpr());
12376 C->setPrivates(Vars);
12377 Vars.clear();
12378 for (unsigned i = 0; i != NumVars; ++i)
12379 Vars.push_back(Record.readSubExpr());
12380 C->setInits(Vars);
12381 Vars.clear();
12382 for (unsigned i = 0; i != NumVars; ++i)
12383 Vars.push_back(Record.readSubExpr());
12384 C->setUpdates(Vars);
12385 Vars.clear();
12386 for (unsigned i = 0; i != NumVars; ++i)
12387 Vars.push_back(Record.readSubExpr());
12388 C->setFinals(Vars);
12389 C->setStep(Record.readSubExpr());
12390 C->setCalcStep(Record.readSubExpr());
12391 Vars.clear();
12392 for (unsigned I = 0; I != NumVars + 1; ++I)
12393 Vars.push_back(Record.readSubExpr());
12394 C->setUsedExprs(Vars);
12395}
12396
12397void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12398 C->setLParenLoc(Record.readSourceLocation());
12399 C->setColonLoc(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 C->setAlignment(Record.readSubExpr());
12407}
12408
12409void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12410 C->setLParenLoc(Record.readSourceLocation());
12411 unsigned NumVars = C->varlist_size();
12412 SmallVector<Expr *, 16> Exprs;
12413 Exprs.reserve(NumVars);
12414 for (unsigned i = 0; i != NumVars; ++i)
12415 Exprs.push_back(Record.readSubExpr());
12416 C->setVarRefs(Exprs);
12417 Exprs.clear();
12418 for (unsigned i = 0; i != NumVars; ++i)
12419 Exprs.push_back(Record.readSubExpr());
12420 C->setSourceExprs(Exprs);
12421 Exprs.clear();
12422 for (unsigned i = 0; i != NumVars; ++i)
12423 Exprs.push_back(Record.readSubExpr());
12424 C->setDestinationExprs(Exprs);
12425 Exprs.clear();
12426 for (unsigned i = 0; i != NumVars; ++i)
12427 Exprs.push_back(Record.readSubExpr());
12428 C->setAssignmentOps(Exprs);
12429}
12430
12431void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12432 C->setLParenLoc(Record.readSourceLocation());
12433 unsigned NumVars = C->varlist_size();
12434 SmallVector<Expr *, 16> Exprs;
12435 Exprs.reserve(NumVars);
12436 for (unsigned i = 0; i != NumVars; ++i)
12437 Exprs.push_back(Record.readSubExpr());
12438 C->setVarRefs(Exprs);
12439 Exprs.clear();
12440 for (unsigned i = 0; i != NumVars; ++i)
12441 Exprs.push_back(Record.readSubExpr());
12442 C->setSourceExprs(Exprs);
12443 Exprs.clear();
12444 for (unsigned i = 0; i != NumVars; ++i)
12445 Exprs.push_back(Record.readSubExpr());
12446 C->setDestinationExprs(Exprs);
12447 Exprs.clear();
12448 for (unsigned i = 0; i != NumVars; ++i)
12449 Exprs.push_back(Record.readSubExpr());
12450 C->setAssignmentOps(Exprs);
12451}
12452
12453void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12454 C->setLParenLoc(Record.readSourceLocation());
12455 unsigned NumVars = C->varlist_size();
12456 SmallVector<Expr *, 16> Vars;
12457 Vars.reserve(NumVars);
12458 for (unsigned i = 0; i != NumVars; ++i)
12459 Vars.push_back(Record.readSubExpr());
12460 C->setVarRefs(Vars);
12461}
12462
12463void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12464 C->setDepobj(Record.readSubExpr());
12465 C->setLParenLoc(Record.readSourceLocation());
12466}
12467
12468void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12469 C->setLParenLoc(Record.readSourceLocation());
12470 C->setModifier(Record.readSubExpr());
12471 C->setDependencyKind(
12472 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12473 C->setDependencyLoc(Record.readSourceLocation());
12474 C->setColonLoc(Record.readSourceLocation());
12475 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12476 unsigned NumVars = C->varlist_size();
12477 SmallVector<Expr *, 16> Vars;
12478 Vars.reserve(NumVars);
12479 for (unsigned I = 0; I != NumVars; ++I)
12480 Vars.push_back(Record.readSubExpr());
12481 C->setVarRefs(Vars);
12482 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12483 C->setLoopData(I, Record.readSubExpr());
12484}
12485
12486void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12488 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12489 C->setDevice(Record.readSubExpr());
12490 C->setModifierLoc(Record.readSourceLocation());
12491 C->setLParenLoc(Record.readSourceLocation());
12492}
12493
12494void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12495 C->setLParenLoc(Record.readSourceLocation());
12496 bool HasIteratorModifier = false;
12497 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12498 C->setMapTypeModifier(
12499 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12500 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12501 if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12502 HasIteratorModifier = true;
12503 }
12504 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12505 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12506 C->setMapType(
12507 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12508 C->setMapLoc(Record.readSourceLocation());
12509 C->setColonLoc(Record.readSourceLocation());
12510 auto NumVars = C->varlist_size();
12511 auto UniqueDecls = C->getUniqueDeclarationsNum();
12512 auto TotalLists = C->getTotalComponentListNum();
12513 auto TotalComponents = C->getTotalComponentsNum();
12514
12515 SmallVector<Expr *, 16> Vars;
12516 Vars.reserve(NumVars);
12517 for (unsigned i = 0; i != NumVars; ++i)
12518 Vars.push_back(Record.readExpr());
12519 C->setVarRefs(Vars);
12520
12521 SmallVector<Expr *, 16> UDMappers;
12522 UDMappers.reserve(NumVars);
12523 for (unsigned I = 0; I < NumVars; ++I)
12524 UDMappers.push_back(Record.readExpr());
12525 C->setUDMapperRefs(UDMappers);
12526
12527 if (HasIteratorModifier)
12528 C->setIteratorModifier(Record.readExpr());
12529
12530 SmallVector<ValueDecl *, 16> Decls;
12531 Decls.reserve(UniqueDecls);
12532 for (unsigned i = 0; i < UniqueDecls; ++i)
12533 Decls.push_back(Record.readDeclAs<ValueDecl>());
12534 C->setUniqueDecls(Decls);
12535
12536 SmallVector<unsigned, 16> ListsPerDecl;
12537 ListsPerDecl.reserve(UniqueDecls);
12538 for (unsigned i = 0; i < UniqueDecls; ++i)
12539 ListsPerDecl.push_back(Record.readInt());
12540 C->setDeclNumLists(ListsPerDecl);
12541
12542 SmallVector<unsigned, 32> ListSizes;
12543 ListSizes.reserve(TotalLists);
12544 for (unsigned i = 0; i < TotalLists; ++i)
12545 ListSizes.push_back(Record.readInt());
12546 C->setComponentListSizes(ListSizes);
12547
12548 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12549 Components.reserve(TotalComponents);
12550 for (unsigned i = 0; i < TotalComponents; ++i) {
12551 Expr *AssociatedExprPr = Record.readExpr();
12552 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12553 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12554 /*IsNonContiguous=*/false);
12555 }
12556 C->setComponents(Components, ListSizes);
12557}
12558
12559void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12560 C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12561 C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12562 C->setLParenLoc(Record.readSourceLocation());
12563 C->setColonLoc(Record.readSourceLocation());
12564 C->setAllocator(Record.readSubExpr());
12565 C->setAlignment(Record.readSubExpr());
12566 unsigned NumVars = C->varlist_size();
12567 SmallVector<Expr *, 16> Vars;
12568 Vars.reserve(NumVars);
12569 for (unsigned i = 0; i != NumVars; ++i)
12570 Vars.push_back(Record.readSubExpr());
12571 C->setVarRefs(Vars);
12572}
12573
12574void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12576 C->setLParenLoc(Record.readSourceLocation());
12577 unsigned NumVars = C->varlist_size();
12578 SmallVector<Expr *, 16> Vars;
12579 Vars.reserve(NumVars);
12580 for (unsigned I = 0; I != NumVars; ++I)
12581 Vars.push_back(Record.readSubExpr());
12582 C->setVarRefs(Vars);
12583}
12584
12585void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12587 C->setLParenLoc(Record.readSourceLocation());
12588 unsigned NumVars = C->varlist_size();
12589 SmallVector<Expr *, 16> Vars;
12590 Vars.reserve(NumVars);
12591 for (unsigned I = 0; I != NumVars; ++I)
12592 Vars.push_back(Record.readSubExpr());
12593 C->setVarRefs(Vars);
12594}
12595
12596void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12598 C->setPriority(Record.readSubExpr());
12599 C->setLParenLoc(Record.readSourceLocation());
12600}
12601
12602void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12604 C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12605 C->setGrainsize(Record.readSubExpr());
12606 C->setModifierLoc(Record.readSourceLocation());
12607 C->setLParenLoc(Record.readSourceLocation());
12608}
12609
12610void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12612 C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12613 C->setNumTasks(Record.readSubExpr());
12614 C->setModifierLoc(Record.readSourceLocation());
12615 C->setLParenLoc(Record.readSourceLocation());
12616}
12617
12618void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12619 C->setHint(Record.readSubExpr());
12620 C->setLParenLoc(Record.readSourceLocation());
12621}
12622
12623void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12625 C->setDistScheduleKind(
12626 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12627 C->setChunkSize(Record.readSubExpr());
12628 C->setLParenLoc(Record.readSourceLocation());
12629 C->setDistScheduleKindLoc(Record.readSourceLocation());
12630 C->setCommaLoc(Record.readSourceLocation());
12631}
12632
12633void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12634 C->setDefaultmapKind(
12635 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12636 C->setDefaultmapModifier(
12637 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12638 C->setLParenLoc(Record.readSourceLocation());
12639 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12640 C->setDefaultmapKindLoc(Record.readSourceLocation());
12641}
12642
12643void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12644 C->setLParenLoc(Record.readSourceLocation());
12645 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12646 C->setMotionModifier(
12647 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12648 C->setMotionModifierLoc(I, Record.readSourceLocation());
12649 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12650 C->setIteratorModifier(Record.readExpr());
12651 }
12652 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12653 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12654 C->setColonLoc(Record.readSourceLocation());
12655 auto NumVars = C->varlist_size();
12656 auto UniqueDecls = C->getUniqueDeclarationsNum();
12657 auto TotalLists = C->getTotalComponentListNum();
12658 auto TotalComponents = C->getTotalComponentsNum();
12659
12660 SmallVector<Expr *, 16> Vars;
12661 Vars.reserve(NumVars);
12662 for (unsigned i = 0; i != NumVars; ++i)
12663 Vars.push_back(Record.readSubExpr());
12664 C->setVarRefs(Vars);
12665
12666 SmallVector<Expr *, 16> UDMappers;
12667 UDMappers.reserve(NumVars);
12668 for (unsigned I = 0; I < NumVars; ++I)
12669 UDMappers.push_back(Record.readSubExpr());
12670 C->setUDMapperRefs(UDMappers);
12671
12672 SmallVector<ValueDecl *, 16> Decls;
12673 Decls.reserve(UniqueDecls);
12674 for (unsigned i = 0; i < UniqueDecls; ++i)
12675 Decls.push_back(Record.readDeclAs<ValueDecl>());
12676 C->setUniqueDecls(Decls);
12677
12678 SmallVector<unsigned, 16> ListsPerDecl;
12679 ListsPerDecl.reserve(UniqueDecls);
12680 for (unsigned i = 0; i < UniqueDecls; ++i)
12681 ListsPerDecl.push_back(Record.readInt());
12682 C->setDeclNumLists(ListsPerDecl);
12683
12684 SmallVector<unsigned, 32> ListSizes;
12685 ListSizes.reserve(TotalLists);
12686 for (unsigned i = 0; i < TotalLists; ++i)
12687 ListSizes.push_back(Record.readInt());
12688 C->setComponentListSizes(ListSizes);
12689
12690 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12691 Components.reserve(TotalComponents);
12692 for (unsigned i = 0; i < TotalComponents; ++i) {
12693 Expr *AssociatedExprPr = Record.readSubExpr();
12694 bool IsNonContiguous = Record.readBool();
12695 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12696 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12697 }
12698 C->setComponents(Components, ListSizes);
12699}
12700
12701void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12702 C->setLParenLoc(Record.readSourceLocation());
12703 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12704 C->setMotionModifier(
12705 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12706 C->setMotionModifierLoc(I, Record.readSourceLocation());
12707 if (C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12708 C->setIteratorModifier(Record.readExpr());
12709 }
12710 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12711 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12712 C->setColonLoc(Record.readSourceLocation());
12713 auto NumVars = C->varlist_size();
12714 auto UniqueDecls = C->getUniqueDeclarationsNum();
12715 auto TotalLists = C->getTotalComponentListNum();
12716 auto TotalComponents = C->getTotalComponentsNum();
12717
12718 SmallVector<Expr *, 16> Vars;
12719 Vars.reserve(NumVars);
12720 for (unsigned i = 0; i != NumVars; ++i)
12721 Vars.push_back(Record.readSubExpr());
12722 C->setVarRefs(Vars);
12723
12724 SmallVector<Expr *, 16> UDMappers;
12725 UDMappers.reserve(NumVars);
12726 for (unsigned I = 0; I < NumVars; ++I)
12727 UDMappers.push_back(Record.readSubExpr());
12728 C->setUDMapperRefs(UDMappers);
12729
12730 SmallVector<ValueDecl *, 16> Decls;
12731 Decls.reserve(UniqueDecls);
12732 for (unsigned i = 0; i < UniqueDecls; ++i)
12733 Decls.push_back(Record.readDeclAs<ValueDecl>());
12734 C->setUniqueDecls(Decls);
12735
12736 SmallVector<unsigned, 16> ListsPerDecl;
12737 ListsPerDecl.reserve(UniqueDecls);
12738 for (unsigned i = 0; i < UniqueDecls; ++i)
12739 ListsPerDecl.push_back(Record.readInt());
12740 C->setDeclNumLists(ListsPerDecl);
12741
12742 SmallVector<unsigned, 32> ListSizes;
12743 ListSizes.reserve(TotalLists);
12744 for (unsigned i = 0; i < TotalLists; ++i)
12745 ListSizes.push_back(Record.readInt());
12746 C->setComponentListSizes(ListSizes);
12747
12748 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12749 Components.reserve(TotalComponents);
12750 for (unsigned i = 0; i < TotalComponents; ++i) {
12751 Expr *AssociatedExprPr = Record.readSubExpr();
12752 bool IsNonContiguous = Record.readBool();
12753 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12754 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12755 }
12756 C->setComponents(Components, ListSizes);
12757}
12758
12759void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12760 C->setLParenLoc(Record.readSourceLocation());
12761 C->setFallbackModifier(Record.readEnum<OpenMPUseDevicePtrFallbackModifier>());
12762 C->setFallbackModifierLoc(Record.readSourceLocation());
12763 auto NumVars = C->varlist_size();
12764 auto UniqueDecls = C->getUniqueDeclarationsNum();
12765 auto TotalLists = C->getTotalComponentListNum();
12766 auto TotalComponents = C->getTotalComponentsNum();
12767
12768 SmallVector<Expr *, 16> Vars;
12769 Vars.reserve(NumVars);
12770 for (unsigned i = 0; i != NumVars; ++i)
12771 Vars.push_back(Record.readSubExpr());
12772 C->setVarRefs(Vars);
12773 Vars.clear();
12774 for (unsigned i = 0; i != NumVars; ++i)
12775 Vars.push_back(Record.readSubExpr());
12776 C->setPrivateCopies(Vars);
12777 Vars.clear();
12778 for (unsigned i = 0; i != NumVars; ++i)
12779 Vars.push_back(Record.readSubExpr());
12780 C->setInits(Vars);
12781
12782 SmallVector<ValueDecl *, 16> Decls;
12783 Decls.reserve(UniqueDecls);
12784 for (unsigned i = 0; i < UniqueDecls; ++i)
12785 Decls.push_back(Record.readDeclAs<ValueDecl>());
12786 C->setUniqueDecls(Decls);
12787
12788 SmallVector<unsigned, 16> ListsPerDecl;
12789 ListsPerDecl.reserve(UniqueDecls);
12790 for (unsigned i = 0; i < UniqueDecls; ++i)
12791 ListsPerDecl.push_back(Record.readInt());
12792 C->setDeclNumLists(ListsPerDecl);
12793
12794 SmallVector<unsigned, 32> ListSizes;
12795 ListSizes.reserve(TotalLists);
12796 for (unsigned i = 0; i < TotalLists; ++i)
12797 ListSizes.push_back(Record.readInt());
12798 C->setComponentListSizes(ListSizes);
12799
12800 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12801 Components.reserve(TotalComponents);
12802 for (unsigned i = 0; i < TotalComponents; ++i) {
12803 auto *AssociatedExprPr = Record.readSubExpr();
12804 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12805 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12806 /*IsNonContiguous=*/false);
12807 }
12808 C->setComponents(Components, ListSizes);
12809}
12810
12811void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12812 C->setLParenLoc(Record.readSourceLocation());
12813 auto NumVars = C->varlist_size();
12814 auto UniqueDecls = C->getUniqueDeclarationsNum();
12815 auto TotalLists = C->getTotalComponentListNum();
12816 auto TotalComponents = C->getTotalComponentsNum();
12817
12818 SmallVector<Expr *, 16> Vars;
12819 Vars.reserve(NumVars);
12820 for (unsigned i = 0; i != NumVars; ++i)
12821 Vars.push_back(Record.readSubExpr());
12822 C->setVarRefs(Vars);
12823
12824 SmallVector<ValueDecl *, 16> Decls;
12825 Decls.reserve(UniqueDecls);
12826 for (unsigned i = 0; i < UniqueDecls; ++i)
12827 Decls.push_back(Record.readDeclAs<ValueDecl>());
12828 C->setUniqueDecls(Decls);
12829
12830 SmallVector<unsigned, 16> ListsPerDecl;
12831 ListsPerDecl.reserve(UniqueDecls);
12832 for (unsigned i = 0; i < UniqueDecls; ++i)
12833 ListsPerDecl.push_back(Record.readInt());
12834 C->setDeclNumLists(ListsPerDecl);
12835
12836 SmallVector<unsigned, 32> ListSizes;
12837 ListSizes.reserve(TotalLists);
12838 for (unsigned i = 0; i < TotalLists; ++i)
12839 ListSizes.push_back(Record.readInt());
12840 C->setComponentListSizes(ListSizes);
12841
12842 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12843 Components.reserve(TotalComponents);
12844 for (unsigned i = 0; i < TotalComponents; ++i) {
12845 Expr *AssociatedExpr = Record.readSubExpr();
12846 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12847 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12848 /*IsNonContiguous*/ false);
12849 }
12850 C->setComponents(Components, ListSizes);
12851}
12852
12853void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12854 C->setLParenLoc(Record.readSourceLocation());
12855 auto NumVars = C->varlist_size();
12856 auto UniqueDecls = C->getUniqueDeclarationsNum();
12857 auto TotalLists = C->getTotalComponentListNum();
12858 auto TotalComponents = C->getTotalComponentsNum();
12859
12860 SmallVector<Expr *, 16> Vars;
12861 Vars.reserve(NumVars);
12862 for (unsigned i = 0; i != NumVars; ++i)
12863 Vars.push_back(Record.readSubExpr());
12864 C->setVarRefs(Vars);
12865 Vars.clear();
12866
12867 SmallVector<ValueDecl *, 16> Decls;
12868 Decls.reserve(UniqueDecls);
12869 for (unsigned i = 0; i < UniqueDecls; ++i)
12870 Decls.push_back(Record.readDeclAs<ValueDecl>());
12871 C->setUniqueDecls(Decls);
12872
12873 SmallVector<unsigned, 16> ListsPerDecl;
12874 ListsPerDecl.reserve(UniqueDecls);
12875 for (unsigned i = 0; i < UniqueDecls; ++i)
12876 ListsPerDecl.push_back(Record.readInt());
12877 C->setDeclNumLists(ListsPerDecl);
12878
12879 SmallVector<unsigned, 32> ListSizes;
12880 ListSizes.reserve(TotalLists);
12881 for (unsigned i = 0; i < TotalLists; ++i)
12882 ListSizes.push_back(Record.readInt());
12883 C->setComponentListSizes(ListSizes);
12884
12885 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12886 Components.reserve(TotalComponents);
12887 for (unsigned i = 0; i < TotalComponents; ++i) {
12888 Expr *AssociatedExpr = Record.readSubExpr();
12889 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12890 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12891 /*IsNonContiguous=*/false);
12892 }
12893 C->setComponents(Components, ListSizes);
12894}
12895
12896void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
12897 C->setLParenLoc(Record.readSourceLocation());
12898 auto NumVars = C->varlist_size();
12899 auto UniqueDecls = C->getUniqueDeclarationsNum();
12900 auto TotalLists = C->getTotalComponentListNum();
12901 auto TotalComponents = C->getTotalComponentsNum();
12902
12903 SmallVector<Expr *, 16> Vars;
12904 Vars.reserve(NumVars);
12905 for (unsigned I = 0; I != NumVars; ++I)
12906 Vars.push_back(Record.readSubExpr());
12907 C->setVarRefs(Vars);
12908 Vars.clear();
12909
12910 SmallVector<ValueDecl *, 16> Decls;
12911 Decls.reserve(UniqueDecls);
12912 for (unsigned I = 0; I < UniqueDecls; ++I)
12913 Decls.push_back(Record.readDeclAs<ValueDecl>());
12914 C->setUniqueDecls(Decls);
12915
12916 SmallVector<unsigned, 16> ListsPerDecl;
12917 ListsPerDecl.reserve(UniqueDecls);
12918 for (unsigned I = 0; I < UniqueDecls; ++I)
12919 ListsPerDecl.push_back(Record.readInt());
12920 C->setDeclNumLists(ListsPerDecl);
12921
12922 SmallVector<unsigned, 32> ListSizes;
12923 ListSizes.reserve(TotalLists);
12924 for (unsigned i = 0; i < TotalLists; ++i)
12925 ListSizes.push_back(Record.readInt());
12926 C->setComponentListSizes(ListSizes);
12927
12928 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12929 Components.reserve(TotalComponents);
12930 for (unsigned I = 0; I < TotalComponents; ++I) {
12931 Expr *AssociatedExpr = Record.readSubExpr();
12932 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12933 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12934 /*IsNonContiguous=*/false);
12935 }
12936 C->setComponents(Components, ListSizes);
12937}
12938
12939void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12940 C->setLParenLoc(Record.readSourceLocation());
12941 unsigned NumVars = C->varlist_size();
12942 SmallVector<Expr *, 16> Vars;
12943 Vars.reserve(NumVars);
12944 for (unsigned i = 0; i != NumVars; ++i)
12945 Vars.push_back(Record.readSubExpr());
12946 C->setVarRefs(Vars);
12947 Vars.clear();
12948 Vars.reserve(NumVars);
12949 for (unsigned i = 0; i != NumVars; ++i)
12950 Vars.push_back(Record.readSubExpr());
12951 C->setPrivateRefs(Vars);
12952}
12953
12954void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12955 C->setLParenLoc(Record.readSourceLocation());
12956 unsigned NumVars = C->varlist_size();
12957 SmallVector<Expr *, 16> Vars;
12958 Vars.reserve(NumVars);
12959 for (unsigned i = 0; i != NumVars; ++i)
12960 Vars.push_back(Record.readSubExpr());
12961 C->setVarRefs(Vars);
12962}
12963
12964void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12965 C->setLParenLoc(Record.readSourceLocation());
12966 unsigned NumVars = C->varlist_size();
12967 SmallVector<Expr *, 16> Vars;
12968 Vars.reserve(NumVars);
12969 for (unsigned i = 0; i != NumVars; ++i)
12970 Vars.push_back(Record.readSubExpr());
12971 C->setVarRefs(Vars);
12972}
12973
12974void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
12975 C->setLParenLoc(Record.readSourceLocation());
12976 unsigned NumOfAllocators = C->getNumberOfAllocators();
12977 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
12978 Data.reserve(NumOfAllocators);
12979 for (unsigned I = 0; I != NumOfAllocators; ++I) {
12980 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
12981 D.Allocator = Record.readSubExpr();
12982 D.AllocatorTraits = Record.readSubExpr();
12983 D.LParenLoc = Record.readSourceLocation();
12984 D.RParenLoc = Record.readSourceLocation();
12985 }
12986 C->setAllocatorsData(Data);
12987}
12988
12989void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
12990 C->setLParenLoc(Record.readSourceLocation());
12991 C->setModifier(Record.readSubExpr());
12992 C->setColonLoc(Record.readSourceLocation());
12993 unsigned NumOfLocators = C->varlist_size();
12994 SmallVector<Expr *, 4> Locators;
12995 Locators.reserve(NumOfLocators);
12996 for (unsigned I = 0; I != NumOfLocators; ++I)
12997 Locators.push_back(Record.readSubExpr());
12998 C->setVarRefs(Locators);
12999}
13000
13001void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
13002 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
13003 C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
13004 C->setLParenLoc(Record.readSourceLocation());
13005 C->setKindKwLoc(Record.readSourceLocation());
13006 C->setModifierKwLoc(Record.readSourceLocation());
13007}
13008
13009void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
13011 C->setThreadID(Record.readSubExpr());
13012 C->setLParenLoc(Record.readSourceLocation());
13013}
13014
13015void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
13016 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
13017 C->setLParenLoc(Record.readSourceLocation());
13018 C->setBindKindLoc(Record.readSourceLocation());
13019}
13020
13021void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
13022 C->setAlignment(Record.readExpr());
13023 C->setLParenLoc(Record.readSourceLocation());
13024}
13025
13026void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
13028 C->setSize(Record.readSubExpr());
13029 C->setLParenLoc(Record.readSourceLocation());
13030}
13031
13032void OMPClauseReader::VisitOMPDynGroupprivateClause(
13033 OMPDynGroupprivateClause *C) {
13035 C->setDynGroupprivateModifier(
13036 Record.readEnum<OpenMPDynGroupprivateClauseModifier>());
13037 C->setDynGroupprivateFallbackModifier(
13039 C->setSize(Record.readSubExpr());
13040 C->setLParenLoc(Record.readSourceLocation());
13041 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13042 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13043}
13044
13045void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
13046 C->setLParenLoc(Record.readSourceLocation());
13047 C->setDependenceType(
13048 static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
13049 C->setDependenceLoc(Record.readSourceLocation());
13050 C->setColonLoc(Record.readSourceLocation());
13051 unsigned NumVars = C->varlist_size();
13052 SmallVector<Expr *, 16> Vars;
13053 Vars.reserve(NumVars);
13054 for (unsigned I = 0; I != NumVars; ++I)
13055 Vars.push_back(Record.readSubExpr());
13056 C->setVarRefs(Vars);
13057 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
13058 C->setLoopData(I, Record.readSubExpr());
13059}
13060
13061void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
13062 AttrVec Attrs;
13063 Record.readAttributes(Attrs);
13064 C->setAttrs(Attrs);
13065 C->setLocStart(Record.readSourceLocation());
13066 C->setLParenLoc(Record.readSourceLocation());
13067 C->setLocEnd(Record.readSourceLocation());
13068}
13069
13070void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
13071
13074 TI.Sets.resize(readUInt32());
13075 for (auto &Set : TI.Sets) {
13077 Set.Selectors.resize(readUInt32());
13078 for (auto &Selector : Set.Selectors) {
13080 Selector.ScoreOrCondition = nullptr;
13081 if (readBool())
13082 Selector.ScoreOrCondition = readExprRef();
13083 Selector.Properties.resize(readUInt32());
13084 for (auto &Property : Selector.Properties)
13086 }
13087 }
13088 return &TI;
13089}
13090
13092 if (!Data)
13093 return;
13094 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13095 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
13096 skipInts(3);
13097 }
13098 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
13099 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
13100 Clauses[I] = readOMPClause();
13101 Data->setClauses(Clauses);
13102 if (Data->hasAssociatedStmt())
13103 Data->setAssociatedStmt(readStmt());
13104 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
13105 Data->getChildren()[I] = readStmt();
13106}
13107
13109 unsigned NumVars = readInt();
13111 for (unsigned I = 0; I < NumVars; ++I)
13112 VarList.push_back(readExpr());
13113 return VarList;
13114}
13115
13117 unsigned NumExprs = readInt();
13119 for (unsigned I = 0; I < NumExprs; ++I)
13120 ExprList.push_back(readSubExpr());
13121 return ExprList;
13122}
13123
13128
13129 switch (ClauseKind) {
13131 SourceLocation LParenLoc = readSourceLocation();
13133 return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
13134 EndLoc);
13135 }
13136 case OpenACCClauseKind::If: {
13137 SourceLocation LParenLoc = readSourceLocation();
13138 Expr *CondExpr = readSubExpr();
13139 return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
13140 EndLoc);
13141 }
13143 SourceLocation LParenLoc = readSourceLocation();
13144 bool isConditionExprClause = readBool();
13145 if (isConditionExprClause) {
13146 Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
13147 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
13148 CondExpr, EndLoc);
13149 }
13150 unsigned NumVars = readInt();
13152 for (unsigned I = 0; I < NumVars; ++I)
13153 VarList.push_back(readSubExpr());
13154 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13155 EndLoc);
13156 }
13158 SourceLocation LParenLoc = readSourceLocation();
13159 unsigned NumClauses = readInt();
13161 for (unsigned I = 0; I < NumClauses; ++I)
13162 IntExprs.push_back(readSubExpr());
13163 return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
13164 IntExprs, EndLoc);
13165 }
13167 SourceLocation LParenLoc = readSourceLocation();
13168 Expr *IntExpr = readSubExpr();
13169 return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
13170 IntExpr, EndLoc);
13171 }
13173 SourceLocation LParenLoc = readSourceLocation();
13174 Expr *IntExpr = readSubExpr();
13175 return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
13176 IntExpr, EndLoc);
13177 }
13179 SourceLocation LParenLoc = readSourceLocation();
13180 Expr *IntExpr = readSubExpr();
13181 return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13182 IntExpr, EndLoc);
13183 }
13185 SourceLocation LParenLoc = readSourceLocation();
13186 Expr *IntExpr = readSubExpr();
13187 return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
13188 IntExpr, EndLoc);
13189 }
13191 SourceLocation LParenLoc = readSourceLocation();
13193
13195 for (unsigned I = 0; I < VarList.size(); ++I) {
13196 static_assert(sizeof(OpenACCPrivateRecipe) == 1 * sizeof(int *));
13197 VarDecl *Alloca = readDeclAs<VarDecl>();
13198 RecipeList.push_back({Alloca});
13199 }
13200
13201 return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13202 VarList, RecipeList, EndLoc);
13203 }
13205 SourceLocation LParenLoc = readSourceLocation();
13207 return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13208 EndLoc);
13209 }
13211 SourceLocation LParenLoc = readSourceLocation();
13213 return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13214 VarList, EndLoc);
13215 }
13217 SourceLocation LParenLoc = readSourceLocation();
13220 for (unsigned I = 0; I < VarList.size(); ++I) {
13221 static_assert(sizeof(OpenACCFirstPrivateRecipe) == 2 * sizeof(int *));
13222 VarDecl *Recipe = readDeclAs<VarDecl>();
13223 VarDecl *RecipeTemp = readDeclAs<VarDecl>();
13224 RecipeList.push_back({Recipe, RecipeTemp});
13225 }
13226
13227 return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
13228 VarList, RecipeList, EndLoc);
13229 }
13231 SourceLocation LParenLoc = readSourceLocation();
13233 return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
13234 VarList, EndLoc);
13235 }
13237 SourceLocation LParenLoc = readSourceLocation();
13239 return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
13240 VarList, EndLoc);
13241 }
13243 SourceLocation LParenLoc = readSourceLocation();
13245 return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
13246 VarList, EndLoc);
13247 }
13249 SourceLocation LParenLoc = readSourceLocation();
13251 return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
13252 VarList, EndLoc);
13253 }
13255 SourceLocation LParenLoc = readSourceLocation();
13257 return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
13258 VarList, EndLoc);
13259 }
13261 SourceLocation LParenLoc = readSourceLocation();
13263 return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
13264 VarList, EndLoc);
13265 }
13267 SourceLocation LParenLoc = readSourceLocation();
13269 return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
13270 VarList, EndLoc);
13271 }
13275 SourceLocation LParenLoc = readSourceLocation();
13278 return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
13279 LParenLoc, ModList, VarList, EndLoc);
13280 }
13284 SourceLocation LParenLoc = readSourceLocation();
13287 return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
13288 LParenLoc, ModList, VarList, EndLoc);
13289 }
13293 SourceLocation LParenLoc = readSourceLocation();
13296 return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
13297 LParenLoc, ModList, VarList, EndLoc);
13298 }
13302 SourceLocation LParenLoc = readSourceLocation();
13305 return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
13306 LParenLoc, ModList, VarList, EndLoc);
13307 }
13309 SourceLocation LParenLoc = readSourceLocation();
13310 Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
13311 return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13312 AsyncExpr, EndLoc);
13313 }
13315 SourceLocation LParenLoc = readSourceLocation();
13316 Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
13317 SourceLocation QueuesLoc = readSourceLocation();
13319 return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
13320 DevNumExpr, QueuesLoc, QueueIdExprs,
13321 EndLoc);
13322 }
13325 SourceLocation LParenLoc = readSourceLocation();
13327 unsigned NumArchs = readInt();
13328
13329 for (unsigned I = 0; I < NumArchs; ++I) {
13330 IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
13332 Archs.emplace_back(Loc, Ident);
13333 }
13334
13335 return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
13336 LParenLoc, Archs, EndLoc);
13337 }
13339 SourceLocation LParenLoc = readSourceLocation();
13343
13344 for (unsigned I = 0; I < VarList.size(); ++I) {
13345 VarDecl *Recipe = readDeclAs<VarDecl>();
13346
13347 static_assert(sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
13348 3 * sizeof(int *));
13349
13351 unsigned NumCombiners = readInt();
13352 for (unsigned I = 0; I < NumCombiners; ++I) {
13355 Expr *Op = readExpr();
13356
13357 Combiners.push_back({LHS, RHS, Op});
13358 }
13359
13360 RecipeList.push_back({Recipe, Combiners});
13361 }
13362
13363 return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
13364 VarList, RecipeList, EndLoc);
13365 }
13367 return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
13369 return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
13371 return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
13373 return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
13375 return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
13377 return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
13379 SourceLocation LParenLoc = readSourceLocation();
13380 bool HasForce = readBool();
13381 Expr *LoopCount = readSubExpr();
13382 return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
13383 HasForce, LoopCount, EndLoc);
13384 }
13386 SourceLocation LParenLoc = readSourceLocation();
13387 unsigned NumClauses = readInt();
13388 llvm::SmallVector<Expr *> SizeExprs;
13389 for (unsigned I = 0; I < NumClauses; ++I)
13390 SizeExprs.push_back(readSubExpr());
13391 return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
13392 SizeExprs, EndLoc);
13393 }
13395 SourceLocation LParenLoc = readSourceLocation();
13396 unsigned NumExprs = readInt();
13399 for (unsigned I = 0; I < NumExprs; ++I) {
13400 GangKinds.push_back(readEnum<OpenACCGangKind>());
13401 // Can't use `readSubExpr` because this is usable from a 'decl' construct.
13402 Exprs.push_back(readExpr());
13403 }
13404 return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
13405 GangKinds, Exprs, EndLoc);
13406 }
13408 SourceLocation LParenLoc = readSourceLocation();
13409 Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
13410 return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
13411 WorkerExpr, EndLoc);
13412 }
13414 SourceLocation LParenLoc = readSourceLocation();
13415 Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
13416 return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
13417 VectorExpr, EndLoc);
13418 }
13420 SourceLocation LParenLoc = readSourceLocation();
13422 return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13423 EndLoc);
13424 }
13426 SourceLocation LParenLoc = readSourceLocation();
13429 LParenLoc, VarList, EndLoc);
13430 }
13431
13433 SourceLocation LParenLoc = readSourceLocation();
13434 bool IsString = readBool();
13435 if (IsString)
13436 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13437 cast<StringLiteral>(readExpr()), EndLoc);
13438 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13439 readIdentifier(), EndLoc);
13440 }
13443 llvm_unreachable("Clause serialization not yet implemented");
13444 }
13445 llvm_unreachable("Invalid Clause Kind");
13446}
13447
13450 for (unsigned I = 0; I < Clauses.size(); ++I)
13451 Clauses[I] = readOpenACCClause();
13452}
13453
13454void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
13455 unsigned NumVars = readInt();
13456 A->Clauses.resize(NumVars);
13457 readOpenACCClauseList(A->Clauses);
13458}
13459
13460static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
13461 // TODO: Maybe it is better to check PrimaryModuleName is a valid
13462 // module name?
13463 llvm::FoldingSetNodeID ID;
13464 ID.AddString(PrimaryModuleName);
13465 return ID.computeStableHash();
13466}
13467
13469 if (!M)
13470 return std::nullopt;
13471
13472 if (M->isHeaderLikeModule())
13473 return std::nullopt;
13474
13475 if (M->isGlobalModule())
13476 return std::nullopt;
13477
13478 StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
13479 return getStableHashForModuleName(PrimaryModuleName);
13480}
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 bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
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 void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
OptionValidation
@ OptionValidateStrictMatches
@ OptionValidateNone
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
Defines the clang::CommentOptions interface.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
#define SM(sm)
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
Definition Template.h:630
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__device__ __2f16 b
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'filter' clause in the 'pragma omp ...' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the 'pragma omp ...' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
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:227
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:858
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
Definition ASTReader.h:117
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
Definition ASTReader.h:186
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
Definition ASTReader.h:130
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
Definition ASTReader.h:232
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
Definition ASTReader.h:164
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
Definition ASTReader.h:154
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
Definition ASTReader.h:244
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
Definition ASTReader.h:201
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
Definition ASTReader.h:173
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
Definition ASTReader.h:226
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
Definition ASTReader.h:214
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
Definition ASTReader.h:135
virtual void ReadModuleName(StringRef ModuleName)
Definition ASTReader.h:129
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
Definition ASTReader.h:222
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
Definition ASTReader.h:236
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Definition ASTReader.h:144
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:427
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
Definition ASTReader.h:443
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
Definition ASTReader.h:1983
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
Definition ASTReader.h:432
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2605
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:2176
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1825
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1838
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
Definition ASTReader.h:1829
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
Definition ASTReader.h:1833
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Definition ASTReader.h:2639
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:2186
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
friend class LocalDeclID
Definition ASTReader.h:440
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
Definition ASTReader.h:474
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
Definition ASTReader.h:1809
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
Definition ASTReader.h:2617
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:2052
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:2491
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:2082
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
Definition ASTReader.h:2612
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:1991
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
Definition ASTReader.h:437
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
Definition ASTReader.h:1476
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
Definition ASTReader.h:447
@ Success
The control block was read successfully.
Definition ASTReader.h:450
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
Definition ASTReader.h:467
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
Definition ASTReader.h:460
@ Failure
The AST file itself appears corrupted.
Definition ASTReader.h:453
@ VersionMismatch
The AST file was written by a different version of Clang.
Definition ASTReader.h:463
@ HadErrors
The AST file has errors.
Definition ASTReader.h:470
@ Missing
The AST file was missing.
Definition ASTReader.h:456
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
Definition ASTReader.h:2519
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:2140
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:2475
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:1987
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:2513
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
Definition ASTReader.h:1810
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
Definition ASTReader.h:473
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
Definition ASTReader.h:1946
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
Definition TypeLoc.h:1777
void setLBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1783
void setRBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1791
void setSizeExpr(Expr *Size)
Definition TypeLoc.h:1803
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2689
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2681
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2673
Attr - This represents one attribute.
Definition Attr.h:46
void setAttr(const Attr *A)
Definition TypeLoc.h:1034
void setConceptReference(ConceptReference *CR)
Definition TypeLoc.h:2405
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2399
void setCaretLoc(SourceLocation Loc)
Definition TypeLoc.h:1532
void setWrittenTypeSpec(TypeSpecifierType written)
Definition TypeLoc.h:663
bool needsExtraLocalData() const
Definition TypeLoc.h:606
void setModeAttr(bool written)
Definition TypeLoc.h:675
void setBuiltinLoc(SourceLocation Loc)
Definition TypeLoc.h:583
void setWrittenWidthSpec(TypeSpecifierWidth written)
Definition TypeLoc.h:652
void setWrittenSignSpec(TypeSpecifierSign written)
Definition TypeLoc.h:636
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ constructor within a class.
Definition DeclCXX.h:2620
Represents a C++ base or member initializer.
Definition DeclCXX.h:2385
void setSourceOrder(int Pos)
Set the source order of this initializer.
Definition DeclCXX.h:2572
Represents a C++ destructor within a class.
Definition DeclCXX.h:2882
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
Definition DeclCXX.cpp:1834
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
Definition DeclCXX.h:1799
base_class_iterator bases_begin()
Definition DeclCXX.h:615
base_class_iterator vbases_begin()
Definition DeclCXX.h:632
Represents a C++ temporary.
Definition ExprCXX.h:1463
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition ExprCXX.cpp:1115
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1462
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:2713
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:2686
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2701
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:2386
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition DeclBase.h:2707
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:2727
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
Definition DeclID.h:125
DeclID getRawValue() const
Definition DeclID.h:115
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Definition DeclID.h:108
TypeSpecifierType TST
Definition DeclSpec.h:249
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:547
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Definition DeclBase.h:867
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:997
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:850
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition DeclBase.h:820
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:801
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:1062
DeclContext * getDeclContext()
Definition DeclBase.h:456
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:931
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:991
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:878
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2291
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2288
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2531
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2513
void setTemplateNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2519
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:1977
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:1998
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2601
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2581
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2590
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2096
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2068
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:233
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
Definition Diagnostic.h:603
bool getEnableAllWarnings() const
Definition Diagnostic.h:703
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:238
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Definition Diagnostic.h:975
bool getSuppressSystemWarnings() const
Definition Diagnostic.h:729
bool getWarningsAsErrors() const
Definition Diagnostic.h:711
diag::Severity getExtensionHandlingBehavior() const
Definition Diagnostic.h:819
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
Definition Diagnostic.h:598
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
Definition TypeLoc.h:744
This represents one expression.
Definition Expr.h:112
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
Definition Decl.h:3178
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:354
off_t getSize() const
Definition FileEntry.h:346
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:53
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:2018
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5362
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5651
Wrapper for source info for functions.
Definition TypeLoc.h:1644
unsigned getNumParams() const
Definition TypeLoc.h:1716
void setLocalRangeBegin(SourceLocation L)
Definition TypeLoc.h:1664
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1680
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1723
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1688
void setLocalRangeEnd(SourceLocation L)
Definition TypeLoc.h:1672
void setExceptionSpecRange(SourceRange R)
Definition TypeLoc.h:1702
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
uint64_t BuildSessionTimestamp
The time in seconds when the build session started.
unsigned ImplicitModuleMaps
Implicit module maps.
std::vector< SystemHeaderPrefix > SystemHeaderPrefixes
User-specified system header prefixes.
unsigned EnablePrebuiltImplicitModules
Also search for prebuilt implicit modules in the prebuilt module cache path.
unsigned ModuleMapFileHomeIsCwd
Set the 'home directory' of a module map file to the current working directory (or the home directory...
std::string Sysroot
If non-empty, the directory to use as a "virtual system root" for include paths.
std::string ModuleCachePath
The directory used for the module cache.
std::string ModuleUserBuildPath
The directory used for a user build.
std::vector< std::string > VFSOverlayFiles
The set of user-provided virtual filesystem overlay files.
unsigned UseLibcxx
Use libc++ instead of the default libstdc++.
unsigned UseBuiltinIncludes
Include the compiler builtin includes.
unsigned UseStandardCXXIncludes
Include the system standard C++ library include search directories.
std::vector< Entry > UserEntries
User specified include entries.
std::string ResourceDir
The directory which holds the compiler resource files (builtin includes, etc.).
unsigned UseStandardSystemIncludes
Include the system standard include search directories.
unsigned ModulesValidateOncePerBuildSession
If true, skip verifying input files used by modules if the module was already verified during this bu...
unsigned DisableModuleHash
Whether we should disable the use of the hash string within the module cache.
Encapsulates the information needed to find the file referenced by a #include or #include_next,...
Module * lookupModule(StringRef ModuleName, SourceLocation ImportLoc=SourceLocation(), bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
const HeaderSearchOptions & getHeaderSearchOpts() const
Retrieve the header-search options with which this header search was initialized.
StringRef getSpecificModuleCachePath() const
Retrieve the specific module cache path.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3485
Wrapper for source info for injected class names of class templates.
Definition TypeLoc.h:872
void setAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1614
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Definition LangOptions.h:83
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Definition MacroInfo.h:313
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Definition MacroInfo.h:351
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:39
void setUsedForHeaderGuard(bool Val)
Definition MacroInfo.h:296
void setHasCommaPasting()
Definition MacroInfo.h:220
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
Definition MacroInfo.h:128
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
Definition MacroInfo.h:166
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
Definition MacroInfo.h:254
void setIsFunctionLike()
Function/Object-likeness.
Definition MacroInfo.h:200
void setIsGNUVarargs()
Definition MacroInfo.h:206
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
Definition MacroInfo.h:205
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
Definition MacroInfo.h:154
void setExpansionLoc(SourceLocation Loc)
Definition TypeLoc.h:1383
void setAttrRowOperand(Expr *e)
Definition TypeLoc.h:2131
void setAttrColumnOperand(Expr *e)
Definition TypeLoc.h:2137
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2146
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2125
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1550
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:1559
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:37
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:77
Identifies a module file to be loaded.
Definition Module.h:107
bool empty() const
Checks whether the module file name is empty.
Definition Module.h:155
static ModuleFileName makeImplicit(std::string Name, unsigned SuffixLength)
Creates a file name for an implicit module.
Definition Module.h:128
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
Definition Module.h:116
StringRef str() const
Returns the plain module file name.
Definition Module.h:149
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
Definition ModuleMap.cpp:64
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Definition ModuleMap.h:196
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Definition ModuleMap.h:572
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
Definition ModuleMap.cpp:53
ModuleHeaderRole
Flags describing the role of a module header.
Definition ModuleMap.h:126
Reference to a module that consists of either an existing/materialized Module object,...
Definition Module.h:236
Describes a module or submodule.
Definition Module.h:301
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:911
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:313
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
Definition Module.h:632
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
Definition Module.h:567
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:689
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:522
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
Definition Module.h:612
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:604
@ Hidden
All of the names in this module are hidden.
Definition Module.h:606
@ AllVisible
All of the names in this module are visible.
Definition Module.h:608
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
Definition Module.h:922
SourceLocation DefinitionLoc
The location of the module definition.
Definition Module.h:307
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:502
ModuleKind Kind
The kind of this module.
Definition Module.h:346
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
Definition Module.h:962
bool isUnimportable() const
Determine whether this module has been declared unimportable.
Definition Module.h:724
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
Definition Module.h:928
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:550
std::string Name
The name of this module.
Definition Module.h:304
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
Definition Module.h:916
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
Definition Module.h:556
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
Definition Module.h:595
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:681
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
Definition Module.h:650
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition Module.h:946
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
Definition Module.h:513
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
Definition Module.h:827
OptionalDirectoryEntryRef Directory
The build directory of this module.
Definition Module.h:355
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:623
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
Definition Module.h:600
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
Definition Module.h:866
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
Definition Module.h:585
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
Definition Module.h:359
ASTFileSignature Signature
The module signature.
Definition Module.h:368
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:399
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:577
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
Definition Module.cpp:379
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:702
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:537
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
Definition Module.h:938
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
Definition Module.h:378
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:533
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Definition Module.h:572
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
Definition Module.h:810
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
Definition Module.h:619
std::vector< Conflict > Conflicts
The list of conflicts.
Definition Module.h:714
This represents a decl that may have a name.
Definition Decl.h:274
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Definition Decl.cpp:1847
Represent a C++ namespace.
Definition Decl.h:592
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
method_range methods() const
Definition DeclObjC.h:1016
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:1313
void setNameEndLoc(SourceLocation Loc)
Definition TypeLoc.h:1325
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
bool hasBody() const override
Determine whether this method has a body.
Definition DeclObjC.h:523
void setLazyBody(uint64_t Offset)
Definition DeclObjC.h:528
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1592
void setTypeArgsRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1196
unsigned getNumTypeArgs() const
Definition TypeLoc.h:1200
unsigned getNumProtocols() const
Definition TypeLoc.h:1230
void setTypeArgsLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1188
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
Definition TypeLoc.h:1209
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1218
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1226
void setHasBaseTypeAsWritten(bool HasBaseType)
Definition TypeLoc.h:1258
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:1239
The basic abstraction for the target Objective-C runtime.
Definition ObjCRuntime.h:28
Kind
The basic Objective-C runtimes that we know about.
Definition ObjCRuntime.h:31
unsigned getNumProtocols() const
Definition TypeLoc.h:932
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:941
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:918
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:928
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
Definition TypeLoc.h:1099
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2633
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2316
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1415
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1411
Represents a parameter to a function.
Definition Decl.h:1808
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2725
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1519
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
@ FastWidth
The width of the "fast" qualifier mask.
Definition TypeBase.h:376
@ FastMask
The fast qualifier mask.
Definition TypeBase.h:379
void setAmpAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1628
Wrapper for source info for record types.
Definition TypeLoc.h:855
Declaration of a redeclarable template.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition Decl.h:5348
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:868
SemaObjC & ObjC()
Definition Sema.h:1518
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:661
IdentifierResolver IdResolver
Definition Sema.h:3519
PragmaMsStackAction
Definition Sema.h:1849
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
Definition ASTReader.h:360
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
Encodes a location in the source.
static SourceLocation getFromRawEncoding(UIntTy Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
Definition Stmt.h:86
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:816
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:824
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:805
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
Definition TypeLoc.h:1913
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TypeLoc.cpp:648
Token - This structure provides full information about a lexed token.
Definition Token.h:36
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
Definition TypeBase.h:3411
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
Definition TypeLoc.h:171
bool isNull() const
Definition TypeLoc.h:121
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
Definition TypeLoc.h:2265
A container of type source information.
Definition TypeBase.h:8407
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:1871
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9266
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3580
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2208
void setTypeofLoc(SourceLocation Loc)
Definition TypeLoc.h:2200
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2216
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2350
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2344
void setUnderlyingTInfo(TypeSourceInfo *TInfo)
Definition TypeLoc.h:2356
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2347
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
Represents a variable declaration or definition.
Definition Decl.h:924
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2045
Captures information about a #pragma weak directive.
Definition Weak.h:25
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ AlreadyLoaded
The module file had already been loaded.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
The input file that has been loaded from this AST file, along with bools indicating whether this was ...
Definition ModuleFile.h:85
OptionalFileEntryRef getFile() const
Definition ModuleFile.h:114
static InputFile getNotFound()
Definition ModuleFile.h:108
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:158
const PPEntityOffset * PreprocessedEntityOffsets
Definition ModuleFile.h:417
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
Definition ModuleFile.h:372
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
Definition ModuleFile.h:496
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
Definition ModuleFile.h:284
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
Definition ModuleFile.h:274
StringRef Data
The serialized bitstream data for this file.
Definition ModuleFile.h:260
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:524
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
Definition ModuleFile.h:464
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:336
ModuleFileKey FileKey
The key ModuleManager used for the module file.
Definition ModuleFile.h:180
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
Definition ModuleFile.h:362
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
Definition ModuleFile.h:415
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
Definition ModuleFile.h:544
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:527
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
Definition ModuleFile.h:389
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
Definition ModuleFile.h:299
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
Definition ModuleFile.h:376
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
Definition ModuleFile.h:352
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:503
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
Definition ModuleFile.h:467
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
Definition ModuleFile.h:368
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
Definition ModuleFile.h:461
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
Definition ModuleFile.h:343
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
Definition ModuleFile.h:293
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
Definition ModuleFile.h:302
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
Definition ModuleFile.h:481
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
Definition ModuleFile.h:552
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
Definition ModuleFile.h:436
SourceLocation ImportLoc
The source location where this module was first imported.
Definition ModuleFile.h:277
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
Definition ModuleFile.h:519
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
Definition ModuleFile.h:347
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
Definition ModuleFile.h:382
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
Definition ModuleFile.h:203
time_t ModTime
Modification of the module file.
Definition ModuleFile.h:223
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
Definition ModuleFile.h:199
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
Definition ModuleFile.h:411
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
Definition ModuleFile.h:305
unsigned LocalNumSubmodules
The number of submodules in this module.
Definition ModuleFile.h:445
SourceLocation FirstLoc
The first source location in this module.
Definition ModuleFile.h:280
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
Definition ModuleFile.h:455
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
Definition ModuleFile.h:231
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
Definition ModuleFile.h:330
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
Definition ModuleFile.h:217
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
Definition ModuleFile.h:195
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
Definition ModuleFile.h:570
bool HasTimestamps
Whether timestamps are included in this module file.
Definition ModuleFile.h:214
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
Definition ModuleFile.h:296
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
Definition ModuleFile.h:327
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
Definition ModuleFile.h:208
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
Definition ModuleFile.h:478
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
Definition ModuleFile.h:516
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
Definition ModuleFile.h:333
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
Definition ModuleFile.h:440
unsigned Index
The index of this module in the list of modules.
Definition ModuleFile.h:171
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
Definition ModuleFile.h:263
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
Definition ModuleFile.h:448
uint64_t SizeInBits
The size of this file, in bits.
Definition ModuleFile.h:251
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
Definition ModuleFile.h:540
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition ModuleFile.h:254
bool StandardCXXModule
Whether this module file is a standard C++ module.
Definition ModuleFile.h:211
unsigned LocalNumTypes
The number of types in this AST file.
Definition ModuleFile.h:536
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:288
const PPSkippedRange * PreprocessedSkippedRangeOffsets
Definition ModuleFile.h:423
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
Definition ModuleFile.h:315
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
Definition ModuleFile.h:408
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
Definition ModuleFile.h:339
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
Definition ModuleFile.h:567
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
Definition ModuleFile.h:452
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition ModuleFile.h:513
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
Definition ModuleFile.h:402
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
Definition ModuleFile.h:227
unsigned LocalNumMacros
The number of macros in this AST file.
Definition ModuleFile.h:385
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
Definition ModuleFile.h:489
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
Definition ModuleFile.h:509
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
Definition ModuleFile.h:429
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
Definition ModuleFile.h:234
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
Definition ModuleFile.h:322
unsigned Generation
The generation of which this module file is a part.
Definition ModuleFile.h:244
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
Definition ModuleFile.h:359
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
Definition ModuleFile.h:484
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
Definition ModuleFile.h:396
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
Definition ModuleFile.h:257
ModuleFileName FileName
The file name of the module file.
Definition ModuleFile.h:177
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
Definition ModuleFile.h:458
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
Definition ModuleFile.h:237
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:506
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
Definition ModuleFile.h:549
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
Definition ModuleFile.h:421
unsigned LocalNumSelectors
The number of selectors new to this file.
Definition ModuleFile.h:474
ModuleKind Kind
The type of this module.
Definition ModuleFile.h:174
std::string ModuleName
The name of the module.
Definition ModuleFile.h:183
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
Definition ModuleFile.h:399
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:531
std::string BaseDirectory
The base directory of the module.
Definition ModuleFile.h:186
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Definition ModuleFile.h:563
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
RawLocEncoding getBegin() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type GetInternalKey(external_key_type ekey)
bool EqualKey(internal_key_ref a, internal_key_ref b)
static hash_value_type ComputeHash(internal_key_ref ikey)
data_type ReadData(internal_key_ref, const unsigned char *d, unsigned DataLen)
static internal_key_type ReadKey(const unsigned char *d, unsigned)
Class that performs lookup to specialized decls.
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
@ EXTENSION_METADATA
Metadata describing this particular extension.
SubmoduleRecordTypes
Record types used within a submodule description block.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
Definition ModuleFile.h:144
@ AllFiles
When the validation is done both for user files and system files.
Definition ModuleFile.h:148
@ Disabled
When the validation is disabled. For example, for a precompiled header.
Definition ModuleFile.h:141
@ UserFiles
When the validation is done only for user files as an optimization.
Definition ModuleFile.h:146
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
Definition ASTBitCodes.h:66
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
Definition ASTBitCodes.h:70
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
Definition ASTBitCodes.h:47
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition ASTBitCodes.h:88
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
Definition ModuleFile.h:44
@ MK_PCH
File is a PCH file treated as such.
Definition ModuleFile.h:52
@ MK_Preamble
File is a PCH file treated as the preamble.
Definition ModuleFile.h:55
@ MK_MainFile
File is a PCH file treated as the actual main file.
Definition ModuleFile.h:58
@ MK_ExplicitModule
File is an explicitly-loaded module.
Definition ModuleFile.h:49
@ MK_ImplicitModule
File is an implicitly-loaded module.
Definition ModuleFile.h:46
@ MK_PrebuiltModule
File is from a prebuilt module path.
Definition ModuleFile.h:61
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
Definition ASTBitCodes.h:94
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
Definition ASTBitCodes.h:63
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:25
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
OpenACCReductionOperator
bool isa(CodeGen::Address addr)
Definition Address.h:330
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
Definition FileEntry.h:208
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
Definition Sanitizers.h:230
@ CPlusPlus
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenACCModifierKind
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
Definition Format.h:3906
@ Success
Annotation was successful.
Definition Parser.h:65
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
Definition OpenMPKinds.h:39
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:124
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
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.
PredefinedDeclIDs
Predefined declaration IDs.
Definition DeclID.h:31
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
Definition DeclID.h:78
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
Definition DeclID.h:36
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
Definition DeclID.h:45
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
Definition DeclID.h:69
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
Definition DeclID.h:81
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
Definition DeclID.h:57
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
Definition DeclID.h:48
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
Definition DeclID.h:54
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
Definition DeclID.h:42
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
Definition DeclID.h:87
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
Definition DeclID.h:51
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
Definition DeclID.h:63
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
Definition DeclID.h:66
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
Definition DeclID.h:75
@ PREDEF_DECL_NULL_ID
The NULL declaration.
Definition DeclID.h:33
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
Definition DeclID.h:60
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
Definition DeclID.h:72
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
Definition DeclID.h:39
@ Property
The type of a property.
Definition TypeBase.h:911
@ Result
The result type of a method or function.
Definition TypeBase.h:905
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
Definition Parser.h:81
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
Definition OpenMPKinds.h:55
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
Definition Warnings.cpp:46
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:23
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
Definition OpenMPKinds.h:63
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
Definition Specifiers.h:51
OpenMPDynGroupprivateClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2709
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
Definition Version.cpp:68
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
Definition Address.h:327
@ None
The alignment was not explicit in code.
Definition ASTContext.h:180
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:5975
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
unsigned int uint32_t
#define true
Definition stdbool.h:25
__LIBC_ATTRS FILE * stderr
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
Definition Module.h:159
static constexpr size_t size
Definition Module.h:162
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
Definition Module.h:182
static ASTFileSignature createDummy()
Definition Module.h:192
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:705
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:710
ModuleRef Other
The module that this module conflicts with.
Definition Module.h:707
Information about a header directive as found in the module map file.
Definition Module.h:448
A library or framework to link against when an entity from this module is used.
Definition Module.h:664
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Definition Decl.h:753
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
Definition Decl.h:767
NestedNameSpecifierLoc QualifierLoc
Definition Decl.h:754
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Definition Decl.h:760
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
Definition Sanitizers.h:195
SanitizerMask Mask
Bitmask of enabled sanitizers.
Definition Sanitizers.h:201
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
Definition Sema.h:1860
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.
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
#define log(__x)
Definition tgmath.h:460