clang 22.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/Decl.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
26#include "clang/AST/DeclGroup.h"
27#include "clang/AST/DeclObjC.h"
30#include "clang/AST/Expr.h"
31#include "clang/AST/ExprCXX.h"
40#include "clang/AST/Type.h"
41#include "clang/AST/TypeLoc.h"
53#include "clang/Basic/LLVM.h"
55#include "clang/Basic/Module.h"
69#include "clang/Basic/Version.h"
72#include "clang/Lex/MacroInfo.h"
73#include "clang/Lex/ModuleMap.h"
77#include "clang/Lex/Token.h"
79#include "clang/Sema/Scope.h"
80#include "clang/Sema/Sema.h"
81#include "clang/Sema/SemaCUDA.h"
82#include "clang/Sema/SemaObjC.h"
83#include "clang/Sema/Weak.h"
96#include "llvm/ADT/APFloat.h"
97#include "llvm/ADT/APInt.h"
98#include "llvm/ADT/ArrayRef.h"
99#include "llvm/ADT/DenseMap.h"
100#include "llvm/ADT/FoldingSet.h"
101#include "llvm/ADT/IntrusiveRefCntPtr.h"
102#include "llvm/ADT/STLExtras.h"
103#include "llvm/ADT/ScopeExit.h"
104#include "llvm/ADT/Sequence.h"
105#include "llvm/ADT/SmallPtrSet.h"
106#include "llvm/ADT/SmallVector.h"
107#include "llvm/ADT/StringExtras.h"
108#include "llvm/ADT/StringMap.h"
109#include "llvm/ADT/StringRef.h"
110#include "llvm/ADT/iterator_range.h"
111#include "llvm/Bitstream/BitstreamReader.h"
112#include "llvm/Support/Compiler.h"
113#include "llvm/Support/Compression.h"
114#include "llvm/Support/DJB.h"
115#include "llvm/Support/Endian.h"
116#include "llvm/Support/Error.h"
117#include "llvm/Support/ErrorHandling.h"
118#include "llvm/Support/LEB128.h"
119#include "llvm/Support/MemoryBuffer.h"
120#include "llvm/Support/Path.h"
121#include "llvm/Support/SaveAndRestore.h"
122#include "llvm/Support/TimeProfiler.h"
123#include "llvm/Support/Timer.h"
124#include "llvm/Support/VersionTuple.h"
125#include "llvm/Support/raw_ostream.h"
126#include "llvm/TargetParser/Triple.h"
127#include <algorithm>
128#include <cassert>
129#include <cstddef>
130#include <cstdint>
131#include <cstdio>
132#include <ctime>
133#include <iterator>
134#include <limits>
135#include <map>
136#include <memory>
137#include <optional>
138#include <string>
139#include <system_error>
140#include <tuple>
141#include <utility>
142#include <vector>
143
144using namespace clang;
145using namespace clang::serialization;
146using namespace clang::serialization::reader;
147using llvm::BitstreamCursor;
148
149//===----------------------------------------------------------------------===//
150// ChainedASTReaderListener implementation
151//===----------------------------------------------------------------------===//
152
153bool
155 return First->ReadFullVersionInformation(FullVersion) ||
156 Second->ReadFullVersionInformation(FullVersion);
157}
158
160 First->ReadModuleName(ModuleName);
161 Second->ReadModuleName(ModuleName);
162}
163
164void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
165 First->ReadModuleMapFile(ModuleMapPath);
166 Second->ReadModuleMapFile(ModuleMapPath);
167}
168
170 const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain,
171 bool AllowCompatibleDifferences) {
172 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
173 AllowCompatibleDifferences) ||
174 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
175 AllowCompatibleDifferences);
176}
177
179 const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain,
180 bool AllowCompatibleDifferences) {
181 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
182 AllowCompatibleDifferences) ||
183 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
184 AllowCompatibleDifferences);
185}
186
188 const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain,
189 bool AllowCompatibleDifferences) {
190 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
191 AllowCompatibleDifferences) ||
192 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
193 AllowCompatibleDifferences);
194}
195
197 DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) {
198 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
199 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
200}
201
202bool
204 bool Complain) {
205 return First->ReadFileSystemOptions(FSOpts, Complain) ||
206 Second->ReadFileSystemOptions(FSOpts, Complain);
207}
208
210 const HeaderSearchOptions &HSOpts, StringRef ModuleFilename,
211 StringRef SpecificModuleCachePath, bool Complain) {
212 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
213 SpecificModuleCachePath, Complain) ||
214 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
215 SpecificModuleCachePath, Complain);
216}
217
219 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
220 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
221 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
222 Complain, SuggestedPredefines) ||
223 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
224 Complain, SuggestedPredefines);
225}
226
228 unsigned Value) {
229 First->ReadCounter(M, Value);
230 Second->ReadCounter(M, Value);
231}
232
234 return First->needsInputFileVisitation() ||
235 Second->needsInputFileVisitation();
236}
237
239 return First->needsSystemInputFileVisitation() ||
240 Second->needsSystemInputFileVisitation();
241}
242
244 ModuleKind Kind) {
245 First->visitModuleFile(Filename, Kind);
246 Second->visitModuleFile(Filename, Kind);
247}
248
250 bool isSystem,
251 bool isOverridden,
252 bool isExplicitModule) {
253 bool Continue = false;
254 if (First->needsInputFileVisitation() &&
255 (!isSystem || First->needsSystemInputFileVisitation()))
256 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
257 isExplicitModule);
258 if (Second->needsInputFileVisitation() &&
259 (!isSystem || Second->needsSystemInputFileVisitation()))
260 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
261 isExplicitModule);
262 return Continue;
263}
264
266 const ModuleFileExtensionMetadata &Metadata) {
267 First->readModuleFileExtension(Metadata);
268 Second->readModuleFileExtension(Metadata);
269}
270
271//===----------------------------------------------------------------------===//
272// PCH validator implementation
273//===----------------------------------------------------------------------===//
274
276
277/// Compare the given set of language options against an existing set of
278/// language options.
279///
280/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
281/// \param AllowCompatibleDifferences If true, differences between compatible
282/// language options will be permitted.
283///
284/// \returns true if the languagae options mis-match, false otherwise.
285static bool checkLanguageOptions(const LangOptions &LangOpts,
286 const LangOptions &ExistingLangOpts,
287 StringRef ModuleFilename,
288 DiagnosticsEngine *Diags,
289 bool AllowCompatibleDifferences = true) {
290 // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
292
293#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
294 if constexpr (CK::Compatibility != CK::Benign) { \
295 if ((CK::Compatibility == CK::NotCompatible) || \
296 (CK::Compatibility == CK::Compatible && \
297 !AllowCompatibleDifferences)) { \
298 if (ExistingLangOpts.Name != LangOpts.Name) { \
299 if (Diags) { \
300 if (Bits == 1) \
301 Diags->Report(diag::err_ast_file_langopt_mismatch) \
302 << Description << LangOpts.Name << ExistingLangOpts.Name \
303 << ModuleFilename; \
304 else \
305 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
306 << Description << ModuleFilename; \
307 } \
308 return true; \
309 } \
310 } \
311 }
312
313#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
314 if constexpr (CK::Compatibility != CK::Benign) { \
315 if ((CK::Compatibility == CK::NotCompatible) || \
316 (CK::Compatibility == CK::Compatible && \
317 !AllowCompatibleDifferences)) { \
318 if (ExistingLangOpts.Name != LangOpts.Name) { \
319 if (Diags) \
320 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
321 << Description << ModuleFilename; \
322 return true; \
323 } \
324 } \
325 }
326
327#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
328 if constexpr (CK::Compatibility != CK::Benign) { \
329 if ((CK::Compatibility == CK::NotCompatible) || \
330 (CK::Compatibility == CK::Compatible && \
331 !AllowCompatibleDifferences)) { \
332 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
333 if (Diags) \
334 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
335 << Description << ModuleFilename; \
336 return true; \
337 } \
338 } \
339 }
340
341#include "clang/Basic/LangOptions.def"
342
343 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
344 if (Diags)
345 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
346 << "module features" << ModuleFilename;
347 return true;
348 }
349
350 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
351 if (Diags)
352 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
353 << "target Objective-C runtime" << ModuleFilename;
354 return true;
355 }
356
357 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
359 if (Diags)
360 Diags->Report(diag::err_ast_file_langopt_value_mismatch)
361 << "block command names" << ModuleFilename;
362 return true;
363 }
364
365 // Sanitizer feature mismatches are treated as compatible differences. If
366 // compatible differences aren't allowed, we still only want to check for
367 // mismatches of non-modular sanitizers (the only ones which can affect AST
368 // generation).
369 if (!AllowCompatibleDifferences) {
370 SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
371 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
372 SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
373 ExistingSanitizers.clear(ModularSanitizers);
374 ImportedSanitizers.clear(ModularSanitizers);
375 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
376 const std::string Flag = "-fsanitize=";
377 if (Diags) {
378#define SANITIZER(NAME, ID) \
379 { \
380 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
381 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
382 if (InExistingModule != InImportedModule) \
383 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
384 << InExistingModule << ModuleFilename << (Flag + NAME); \
385 }
386#include "clang/Basic/Sanitizers.def"
387 }
388 return true;
389 }
390 }
391
392 return false;
393}
394
395static bool checkCodegenOptions(const CodeGenOptions &CGOpts,
396 const CodeGenOptions &ExistingCGOpts,
397 StringRef ModuleFilename,
398 DiagnosticsEngine *Diags,
399 bool AllowCompatibleDifferences = true) {
400 // FIXME: Specify and print a description for each option instead of the name.
401 // FIXME: Replace with C++20 `using enum CodeGenOptions::CompatibilityKind`.
403#define CODEGENOPT(Name, Bits, Default, Compatibility) \
404 if constexpr (CK::Compatibility != CK::Benign) { \
405 if ((CK::Compatibility == CK::NotCompatible) || \
406 (CK::Compatibility == CK::Compatible && \
407 !AllowCompatibleDifferences)) { \
408 if (ExistingCGOpts.Name != CGOpts.Name) { \
409 if (Diags) { \
410 if (Bits == 1) \
411 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
412 << #Name << CGOpts.Name << ExistingCGOpts.Name \
413 << ModuleFilename; \
414 else \
415 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
416 << #Name << ModuleFilename; \
417 } \
418 return true; \
419 } \
420 } \
421 }
422
423#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
424 if constexpr (CK::Compatibility != CK::Benign) { \
425 if ((CK::Compatibility == CK::NotCompatible) || \
426 (CK::Compatibility == CK::Compatible && \
427 !AllowCompatibleDifferences)) { \
428 if (ExistingCGOpts.Name != CGOpts.Name) { \
429 if (Diags) \
430 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
431 << #Name << ModuleFilename; \
432 return true; \
433 } \
434 } \
435 }
436#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
437 if constexpr (CK::Compatibility != CK::Benign) { \
438 if ((CK::Compatibility == CK::NotCompatible) || \
439 (CK::Compatibility == CK::Compatible && \
440 !AllowCompatibleDifferences)) { \
441 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
442 if (Diags) \
443 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
444 << #Name << ModuleFilename; \
445 return true; \
446 } \
447 } \
448 }
449#define DEBUGOPT(Name, Bits, Default, Compatibility)
450#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
451#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
452#include "clang/Basic/CodeGenOptions.def"
453
454 return false;
455}
456
457/// Compare the given set of target options against an existing set of
458/// target options.
459///
460/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
461///
462/// \returns true if the target options mis-match, false otherwise.
463static bool checkTargetOptions(const TargetOptions &TargetOpts,
464 const TargetOptions &ExistingTargetOpts,
465 StringRef ModuleFilename,
466 DiagnosticsEngine *Diags,
467 bool AllowCompatibleDifferences = true) {
468#define CHECK_TARGET_OPT(Field, Name) \
469 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
470 if (Diags) \
471 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
472 << ModuleFilename << Name << TargetOpts.Field \
473 << ExistingTargetOpts.Field; \
474 return true; \
475 }
476
477 // The triple and ABI must match exactly.
478 CHECK_TARGET_OPT(Triple, "target");
479 CHECK_TARGET_OPT(ABI, "target ABI");
480
481 // We can tolerate different CPUs in many cases, notably when one CPU
482 // supports a strict superset of another. When allowing compatible
483 // differences skip this check.
484 if (!AllowCompatibleDifferences) {
485 CHECK_TARGET_OPT(CPU, "target CPU");
486 CHECK_TARGET_OPT(TuneCPU, "tune CPU");
487 }
488
489#undef CHECK_TARGET_OPT
490
491 // Compare feature sets.
492 SmallVector<StringRef, 4> ExistingFeatures(
493 ExistingTargetOpts.FeaturesAsWritten.begin(),
494 ExistingTargetOpts.FeaturesAsWritten.end());
495 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
496 TargetOpts.FeaturesAsWritten.end());
497 llvm::sort(ExistingFeatures);
498 llvm::sort(ReadFeatures);
499
500 // We compute the set difference in both directions explicitly so that we can
501 // diagnose the differences differently.
502 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
503 std::set_difference(
504 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
505 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
506 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
507 ExistingFeatures.begin(), ExistingFeatures.end(),
508 std::back_inserter(UnmatchedReadFeatures));
509
510 // If we are allowing compatible differences and the read feature set is
511 // a strict subset of the existing feature set, there is nothing to diagnose.
512 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
513 return false;
514
515 if (Diags) {
516 for (StringRef Feature : UnmatchedReadFeatures)
517 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
518 << /* is-existing-feature */ false << ModuleFilename << Feature;
519 for (StringRef Feature : UnmatchedExistingFeatures)
520 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
521 << /* is-existing-feature */ true << ModuleFilename << Feature;
522 }
523
524 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
525}
526
528 StringRef ModuleFilename, bool Complain,
529 bool AllowCompatibleDifferences) {
530 const LangOptions &ExistingLangOpts = PP.getLangOpts();
531 return checkLanguageOptions(LangOpts, ExistingLangOpts, ModuleFilename,
532 Complain ? &Reader.Diags : nullptr,
533 AllowCompatibleDifferences);
534}
535
537 StringRef ModuleFilename, bool Complain,
538 bool AllowCompatibleDifferences) {
539 const CodeGenOptions &ExistingCGOpts = Reader.getCodeGenOpts();
540 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
541 Complain ? &Reader.Diags : nullptr,
542 AllowCompatibleDifferences);
543}
544
546 StringRef ModuleFilename, bool Complain,
547 bool AllowCompatibleDifferences) {
548 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
549 return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
550 Complain ? &Reader.Diags : nullptr,
551 AllowCompatibleDifferences);
552}
553
554namespace {
555
556using MacroDefinitionsMap =
557 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
558using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
559
560} // namespace
561
563 DiagnosticsEngine &Diags,
564 StringRef ModuleFilename,
565 bool Complain) {
566 using Level = DiagnosticsEngine::Level;
567
568 // Check current mappings for new -Werror mappings, and the stored mappings
569 // for cases that were explicitly mapped to *not* be errors that are now
570 // errors because of options like -Werror.
571 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
572
573 for (DiagnosticsEngine *MappingSource : MappingSources) {
574 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
575 diag::kind DiagID = DiagIDMappingPair.first;
576 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
577 if (CurLevel < DiagnosticsEngine::Error)
578 continue; // not significant
579 Level StoredLevel =
580 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
581 if (StoredLevel < DiagnosticsEngine::Error) {
582 if (Complain)
583 Diags.Report(diag::err_ast_file_diagopt_mismatch)
584 << "-Werror=" + Diags.getDiagnosticIDs()
585 ->getWarningOptionForDiag(DiagID)
586 .str()
587 << ModuleFilename;
588 return true;
589 }
590 }
591 }
592
593 return false;
594}
595
598 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
599 return true;
600 return Ext >= diag::Severity::Error;
601}
602
604 DiagnosticsEngine &Diags,
605 StringRef ModuleFilename, bool IsSystem,
606 bool SystemHeaderWarningsInModule,
607 bool Complain) {
608 // Top-level options
609 if (IsSystem) {
610 if (Diags.getSuppressSystemWarnings())
611 return false;
612 // If -Wsystem-headers was not enabled before, and it was not explicit,
613 // be conservative
614 if (StoredDiags.getSuppressSystemWarnings() &&
615 !SystemHeaderWarningsInModule) {
616 if (Complain)
617 Diags.Report(diag::err_ast_file_diagopt_mismatch)
618 << "-Wsystem-headers" << ModuleFilename;
619 return true;
620 }
621 }
622
623 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
624 if (Complain)
625 Diags.Report(diag::err_ast_file_diagopt_mismatch)
626 << "-Werror" << ModuleFilename;
627 return true;
628 }
629
630 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
631 !StoredDiags.getEnableAllWarnings()) {
632 if (Complain)
633 Diags.Report(diag::err_ast_file_diagopt_mismatch)
634 << "-Weverything -Werror" << ModuleFilename;
635 return true;
636 }
637
638 if (isExtHandlingFromDiagsError(Diags) &&
639 !isExtHandlingFromDiagsError(StoredDiags)) {
640 if (Complain)
641 Diags.Report(diag::err_ast_file_diagopt_mismatch)
642 << "-pedantic-errors" << ModuleFilename;
643 return true;
644 }
645
646 return checkDiagnosticGroupMappings(StoredDiags, Diags, ModuleFilename,
647 Complain);
648}
649
650/// Return the top import module if it is implicit, nullptr otherwise.
652 Preprocessor &PP) {
653 // If the original import came from a file explicitly generated by the user,
654 // don't check the diagnostic mappings.
655 // FIXME: currently this is approximated by checking whether this is not a
656 // module import of an implicitly-loaded module file.
657 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
658 // the transitive closure of its imports, since unrelated modules cannot be
659 // imported until after this module finishes validation.
660 ModuleFile *TopImport = &*ModuleMgr.rbegin();
661 while (!TopImport->ImportedBy.empty())
662 TopImport = TopImport->ImportedBy[0];
663 if (TopImport->Kind != MK_ImplicitModule)
664 return nullptr;
665
666 StringRef ModuleName = TopImport->ModuleName;
667 assert(!ModuleName.empty() && "diagnostic options read before module name");
668
669 Module *M =
670 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
671 assert(M && "missing module");
672 return M;
673}
674
676 StringRef ModuleFilename,
677 bool Complain) {
678 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
680 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
681 // This should never fail, because we would have processed these options
682 // before writing them to an ASTFile.
683 ProcessWarningOptions(*Diags, DiagOpts,
684 PP.getFileManager().getVirtualFileSystem(),
685 /*Report*/ false);
686
687 ModuleManager &ModuleMgr = Reader.getModuleManager();
688 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
689
690 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
691 if (!TopM)
692 return false;
693
694 Module *Importer = PP.getCurrentModule();
695
696 DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
697 bool SystemHeaderWarningsInModule =
698 Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
699 Importer->Name);
700
701 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
702 // contains the union of their flags.
703 return checkDiagnosticMappings(*Diags, ExistingDiags, ModuleFilename,
704 TopM->IsSystem, SystemHeaderWarningsInModule,
705 Complain);
706}
707
708/// Collect the macro definitions provided by the given preprocessor
709/// options.
710static void
712 MacroDefinitionsMap &Macros,
713 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
714 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
715 StringRef Macro = PPOpts.Macros[I].first;
716 bool IsUndef = PPOpts.Macros[I].second;
717
718 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
719 StringRef MacroName = MacroPair.first;
720 StringRef MacroBody = MacroPair.second;
721
722 // For an #undef'd macro, we only care about the name.
723 if (IsUndef) {
724 auto [It, Inserted] = Macros.try_emplace(MacroName);
725 if (MacroNames && Inserted)
726 MacroNames->push_back(MacroName);
727
728 It->second = std::make_pair("", true);
729 continue;
730 }
731
732 // For a #define'd macro, figure out the actual definition.
733 if (MacroName.size() == Macro.size())
734 MacroBody = "1";
735 else {
736 // Note: GCC drops anything following an end-of-line character.
737 StringRef::size_type End = MacroBody.find_first_of("\n\r");
738 MacroBody = MacroBody.substr(0, End);
739 }
740
741 auto [It, Inserted] = Macros.try_emplace(MacroName);
742 if (MacroNames && Inserted)
743 MacroNames->push_back(MacroName);
744 It->second = std::make_pair(MacroBody, false);
745 }
746}
747
753
754/// Check the preprocessor options deserialized from the control block
755/// against the preprocessor options in an existing preprocessor.
756///
757/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
758/// \param Validation If set to OptionValidateNone, ignore differences in
759/// preprocessor options. If set to OptionValidateContradictions,
760/// require that options passed both in the AST file and on the command
761/// line (-D or -U) match, but tolerate options missing in one or the
762/// other. If set to OptionValidateContradictions, require that there
763/// are no differences in the options between the two.
765 const PreprocessorOptions &PPOpts,
766 const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename,
767 bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr,
768 std::string &SuggestedPredefines, const LangOptions &LangOpts,
770 if (ReadMacros) {
771 // Check macro definitions.
772 MacroDefinitionsMap ASTFileMacros;
773 collectMacroDefinitions(PPOpts, ASTFileMacros);
774 MacroDefinitionsMap ExistingMacros;
775 SmallVector<StringRef, 4> ExistingMacroNames;
776 collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
777 &ExistingMacroNames);
778
779 // Use a line marker to enter the <command line> file, as the defines and
780 // undefines here will have come from the command line.
781 SuggestedPredefines += "# 1 \"<command line>\" 1\n";
782
783 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
784 // Dig out the macro definition in the existing preprocessor options.
785 StringRef MacroName = ExistingMacroNames[I];
786 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
787
788 // Check whether we know anything about this macro name or not.
789 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
790 ASTFileMacros.find(MacroName);
791 if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
792 if (Validation == OptionValidateStrictMatches) {
793 // If strict matches are requested, don't tolerate any extra defines
794 // on the command line that are missing in the AST file.
795 if (Diags) {
796 Diags->Report(diag::err_ast_file_macro_def_undef)
797 << MacroName << true << ModuleFilename;
798 }
799 return true;
800 }
801 // FIXME: Check whether this identifier was referenced anywhere in the
802 // AST file. If so, we should reject the AST file. Unfortunately, this
803 // information isn't in the control block. What shall we do about it?
804
805 if (Existing.second) {
806 SuggestedPredefines += "#undef ";
807 SuggestedPredefines += MacroName.str();
808 SuggestedPredefines += '\n';
809 } else {
810 SuggestedPredefines += "#define ";
811 SuggestedPredefines += MacroName.str();
812 SuggestedPredefines += ' ';
813 SuggestedPredefines += Existing.first.str();
814 SuggestedPredefines += '\n';
815 }
816 continue;
817 }
818
819 // If the macro was defined in one but undef'd in the other, we have a
820 // conflict.
821 if (Existing.second != Known->second.second) {
822 if (Diags) {
823 Diags->Report(diag::err_ast_file_macro_def_undef)
824 << MacroName << Known->second.second << ModuleFilename;
825 }
826 return true;
827 }
828
829 // If the macro was #undef'd in both, or if the macro bodies are
830 // identical, it's fine.
831 if (Existing.second || Existing.first == Known->second.first) {
832 ASTFileMacros.erase(Known);
833 continue;
834 }
835
836 // The macro bodies differ; complain.
837 if (Diags) {
838 Diags->Report(diag::err_ast_file_macro_def_conflict)
839 << MacroName << Known->second.first << Existing.first
840 << ModuleFilename;
841 }
842 return true;
843 }
844
845 // Leave the <command line> file and return to <built-in>.
846 SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
847
848 if (Validation == OptionValidateStrictMatches) {
849 // If strict matches are requested, don't tolerate any extra defines in
850 // the AST file that are missing on the command line.
851 for (const auto &MacroName : ASTFileMacros.keys()) {
852 if (Diags) {
853 Diags->Report(diag::err_ast_file_macro_def_undef)
854 << MacroName << false << ModuleFilename;
855 }
856 return true;
857 }
858 }
859 }
860
861 // Check whether we're using predefines.
862 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
863 Validation != OptionValidateNone) {
864 if (Diags) {
865 Diags->Report(diag::err_ast_file_undef)
866 << ExistingPPOpts.UsePredefines << ModuleFilename;
867 }
868 return true;
869 }
870
871 // Detailed record is important since it is used for the module cache hash.
872 if (LangOpts.Modules &&
873 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
874 Validation != OptionValidateNone) {
875 if (Diags) {
876 Diags->Report(diag::err_ast_file_pp_detailed_record)
877 << PPOpts.DetailedRecord << ModuleFilename;
878 }
879 return true;
880 }
881
882 // Compute the #include and #include_macros lines we need.
883 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
884 StringRef File = ExistingPPOpts.Includes[I];
885
886 if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
887 !ExistingPPOpts.PCHThroughHeader.empty()) {
888 // In case the through header is an include, we must add all the includes
889 // to the predefines so the start point can be determined.
890 SuggestedPredefines += "#include \"";
891 SuggestedPredefines += File;
892 SuggestedPredefines += "\"\n";
893 continue;
894 }
895
896 if (File == ExistingPPOpts.ImplicitPCHInclude)
897 continue;
898
899 if (llvm::is_contained(PPOpts.Includes, File))
900 continue;
901
902 SuggestedPredefines += "#include \"";
903 SuggestedPredefines += File;
904 SuggestedPredefines += "\"\n";
905 }
906
907 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
908 StringRef File = ExistingPPOpts.MacroIncludes[I];
909 if (llvm::is_contained(PPOpts.MacroIncludes, File))
910 continue;
911
912 SuggestedPredefines += "#__include_macros \"";
913 SuggestedPredefines += File;
914 SuggestedPredefines += "\"\n##\n";
915 }
916
917 return false;
918}
919
921 StringRef ModuleFilename,
922 bool ReadMacros, bool Complain,
923 std::string &SuggestedPredefines) {
924 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
925
927 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
928 Complain ? &Reader.Diags : nullptr, PP.getFileManager(),
929 SuggestedPredefines, PP.getLangOpts());
930}
931
933 const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
934 bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
935 return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(),
936 ModuleFilename, ReadMacros, nullptr,
937 PP.getFileManager(), SuggestedPredefines,
938 PP.getLangOpts(), OptionValidateNone);
939}
940
941/// Check that the specified and the existing module cache paths are equivalent.
942///
943/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
944/// \returns true when the module cache paths differ.
945static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS,
946 StringRef SpecificModuleCachePath,
947 StringRef ExistingModuleCachePath,
948 StringRef ModuleFilename,
949 DiagnosticsEngine *Diags,
950 const LangOptions &LangOpts,
951 const PreprocessorOptions &PPOpts) {
952 if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
953 SpecificModuleCachePath == ExistingModuleCachePath)
954 return false;
955 auto EqualOrErr =
956 VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
957 if (EqualOrErr && *EqualOrErr)
958 return false;
959 if (Diags)
960 Diags->Report(diag::err_ast_file_modulecache_mismatch)
961 << SpecificModuleCachePath << ExistingModuleCachePath << ModuleFilename;
962 return true;
963}
964
966 StringRef ModuleFilename,
967 StringRef SpecificModuleCachePath,
968 bool Complain) {
970 Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
971 PP.getHeaderSearchInfo().getModuleCachePath(), ModuleFilename,
972 Complain ? &Reader.Diags : nullptr, PP.getLangOpts(),
973 PP.getPreprocessorOpts());
974}
975
977 PP.setCounterValue(Value);
978}
979
980//===----------------------------------------------------------------------===//
981// AST reader implementation
982//===----------------------------------------------------------------------===//
983
984static uint64_t readULEB(const unsigned char *&P) {
985 unsigned Length = 0;
986 const char *Error = nullptr;
987
988 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
989 if (Error)
990 llvm::report_fatal_error(Error);
991 P += Length;
992 return Val;
993}
994
995/// Read ULEB-encoded key length and data length.
996static std::pair<unsigned, unsigned>
997readULEBKeyDataLength(const unsigned char *&P) {
998 unsigned KeyLen = readULEB(P);
999 if ((unsigned)KeyLen != KeyLen)
1000 llvm::report_fatal_error("key too large");
1001
1002 unsigned DataLen = readULEB(P);
1003 if ((unsigned)DataLen != DataLen)
1004 llvm::report_fatal_error("data too large");
1005
1006 return std::make_pair(KeyLen, DataLen);
1007}
1008
1010 bool TakeOwnership) {
1011 DeserializationListener = Listener;
1012 OwnsDeserializationListener = TakeOwnership;
1013}
1014
1018
1020 LocalDeclID ID(Value);
1021#ifndef NDEBUG
1022 if (!MF.ModuleOffsetMap.empty())
1023 Reader.ReadModuleOffsetMap(MF);
1024
1025 unsigned ModuleFileIndex = ID.getModuleFileIndex();
1026 unsigned LocalDeclID = ID.getLocalDeclIndex();
1027
1028 assert(ModuleFileIndex <= MF.TransitiveImports.size());
1029
1030 ModuleFile *OwningModuleFile =
1031 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
1032 assert(OwningModuleFile);
1033
1034 unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
1035
1036 if (!ModuleFileIndex)
1037 LocalNumDecls += NUM_PREDEF_DECL_IDS;
1038
1039 assert(LocalDeclID < LocalNumDecls);
1040#endif
1041 (void)Reader;
1042 (void)MF;
1043 return ID;
1044}
1045
1046LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
1047 unsigned ModuleFileIndex, unsigned LocalDeclID) {
1048 DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
1049 return LocalDeclID::get(Reader, MF, Value);
1050}
1051
1052std::pair<unsigned, unsigned>
1054 return readULEBKeyDataLength(d);
1055}
1056
1058ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
1059 using namespace llvm::support;
1060
1061 SelectorTable &SelTable = Reader.getContext().Selectors;
1062 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1063 const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
1064 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1065 if (N == 0)
1066 return SelTable.getNullarySelector(FirstII);
1067 else if (N == 1)
1068 return SelTable.getUnarySelector(FirstII);
1069
1071 Args.push_back(FirstII);
1072 for (unsigned I = 1; I != N; ++I)
1073 Args.push_back(Reader.getLocalIdentifier(
1074 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1075
1076 return SelTable.getSelector(N, Args.data());
1077}
1078
1081 unsigned DataLen) {
1082 using namespace llvm::support;
1083
1085
1086 Result.ID = Reader.getGlobalSelectorID(
1087 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1088 unsigned FullInstanceBits =
1089 endian::readNext<uint16_t, llvm::endianness::little>(d);
1090 unsigned FullFactoryBits =
1091 endian::readNext<uint16_t, llvm::endianness::little>(d);
1092 Result.InstanceBits = FullInstanceBits & 0x3;
1093 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1094 Result.FactoryBits = FullFactoryBits & 0x3;
1095 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1096 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1097 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1098
1099 // Load instance methods
1100 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
1101 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1103 Reader, F,
1104 endian::readNext<DeclID, llvm::endianness::little>(d))))
1105 Result.Instance.push_back(Method);
1106 }
1107
1108 // Load factory methods
1109 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1110 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1112 Reader, F,
1113 endian::readNext<DeclID, llvm::endianness::little>(d))))
1114 Result.Factory.push_back(Method);
1115 }
1116
1117 return Result;
1118}
1119
1121 return llvm::djbHash(a);
1122}
1123
1124std::pair<unsigned, unsigned>
1126 return readULEBKeyDataLength(d);
1127}
1128
1130ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1131 assert(n >= 2 && d[n-1] == '\0');
1132 return StringRef((const char*) d, n-1);
1133}
1134
1135/// Whether the given identifier is "interesting".
1136static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1137 bool IsModule) {
1138 bool IsInteresting =
1139 II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1141 II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1142 return II.hadMacroDefinition() || II.isPoisoned() ||
1143 (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1144 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1145 II.getFETokenInfo());
1146}
1147
1148static bool readBit(unsigned &Bits) {
1149 bool Value = Bits & 0x1;
1150 Bits >>= 1;
1151 return Value;
1152}
1153
1155 using namespace llvm::support;
1156
1157 IdentifierID RawID =
1158 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1159 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1160}
1161
1163 bool IsModule) {
1164 if (!II.isFromAST()) {
1165 II.setIsFromAST();
1166 if (isInterestingIdentifier(Reader, II, IsModule))
1168 }
1169}
1170
1172 const unsigned char* d,
1173 unsigned DataLen) {
1174 using namespace llvm::support;
1175
1176 IdentifierID RawID =
1177 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1178 bool IsInteresting = RawID & 0x01;
1179
1180 DataLen -= sizeof(IdentifierID);
1181
1182 // Wipe out the "is interesting" bit.
1183 RawID = RawID >> 1;
1184
1185 // Build the IdentifierInfo and link the identifier ID with it.
1186 IdentifierInfo *II = KnownII;
1187 if (!II) {
1188 II = &Reader.getIdentifierTable().getOwn(k);
1189 KnownII = II;
1190 }
1191 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1192 markIdentifierFromAST(Reader, *II, IsModule);
1193 Reader.markIdentifierUpToDate(II);
1194
1195 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1196 if (!IsInteresting) {
1197 // For uninteresting identifiers, there's nothing else to do. Just notify
1198 // the reader that we've finished loading this identifier.
1199 Reader.SetIdentifierInfo(ID, II);
1200 return II;
1201 }
1202
1203 unsigned ObjCOrBuiltinID =
1204 endian::readNext<uint16_t, llvm::endianness::little>(d);
1205 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1206 bool CPlusPlusOperatorKeyword = readBit(Bits);
1207 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1208 bool Poisoned = readBit(Bits);
1209 bool ExtensionToken = readBit(Bits);
1210 bool HasMacroDefinition = readBit(Bits);
1211
1212 assert(Bits == 0 && "Extra bits in the identifier?");
1213 DataLen -= sizeof(uint16_t) * 2;
1214
1215 // Set or check the various bits in the IdentifierInfo structure.
1216 // Token IDs are read-only.
1217 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1219 if (!F.isModule())
1220 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1221 assert(II->isExtensionToken() == ExtensionToken &&
1222 "Incorrect extension token flag");
1223 (void)ExtensionToken;
1224 if (Poisoned)
1225 II->setIsPoisoned(true);
1226 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1227 "Incorrect C++ operator keyword flag");
1228 (void)CPlusPlusOperatorKeyword;
1229
1230 // If this identifier has a macro definition, deserialize it or notify the
1231 // visitor the actual definition is in a different module.
1232 if (HasMacroDefinition) {
1233 uint32_t MacroDirectivesOffset =
1234 endian::readNext<uint32_t, llvm::endianness::little>(d);
1235 DataLen -= 4;
1236
1237 if (MacroDirectivesOffset)
1238 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1239 else
1240 hasMacroDefinitionInDependencies = true;
1241 }
1242
1243 Reader.SetIdentifierInfo(ID, II);
1244
1245 // Read all of the declarations visible at global scope with this
1246 // name.
1247 if (DataLen > 0) {
1249 for (; DataLen > 0; DataLen -= sizeof(DeclID))
1250 DeclIDs.push_back(Reader.getGlobalDeclID(
1252 Reader, F,
1253 endian::readNext<DeclID, llvm::endianness::little>(d))));
1254 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1255 }
1256
1257 return II;
1258}
1259
1261 : Kind(Name.getNameKind()) {
1262 switch (Kind) {
1264 Data = (uint64_t)Name.getAsIdentifierInfo();
1265 break;
1269 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1270 break;
1272 Data = Name.getCXXOverloadedOperator();
1273 break;
1275 Data = (uint64_t)Name.getCXXLiteralIdentifier();
1276 break;
1278 Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1280 break;
1285 Data = 0;
1286 break;
1287 }
1288}
1289
1291 llvm::FoldingSetNodeID ID;
1292 ID.AddInteger(Kind);
1293
1294 switch (Kind) {
1298 ID.AddString(((IdentifierInfo*)Data)->getName());
1299 break;
1303 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1304 break;
1306 ID.AddInteger((OverloadedOperatorKind)Data);
1307 break;
1312 break;
1313 }
1314
1315 return ID.computeStableHash();
1316}
1317
1318ModuleFile *
1320 using namespace llvm::support;
1321
1322 uint32_t ModuleFileID =
1323 endian::readNext<uint32_t, llvm::endianness::little>(d);
1324 return Reader.getLocalModuleFile(F, ModuleFileID);
1325}
1326
1327std::pair<unsigned, unsigned>
1331
1334 using namespace llvm::support;
1335
1336 auto Kind = (DeclarationName::NameKind)*d++;
1337 uint64_t Data;
1338 switch (Kind) {
1342 Data = (uint64_t)Reader.getLocalIdentifier(
1343 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1344 break;
1348 Data = (uint64_t)Reader
1349 .getLocalSelector(
1350 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1351 .getAsOpaquePtr();
1352 break;
1354 Data = *d++; // OverloadedOperatorKind
1355 break;
1360 Data = 0;
1361 break;
1362 }
1363
1364 return DeclarationNameKey(Kind, Data);
1365}
1366
1368ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1369 return ReadKeyBase(d);
1370}
1371
1373 const unsigned char *d, unsigned DataLen, data_type_builder &Val) {
1374 using namespace llvm::support;
1375
1376 for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1378 Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1379 Val.insert(Reader.getGlobalDeclID(F, ID));
1380 }
1381}
1382
1384 const unsigned char *d,
1385 unsigned DataLen,
1386 data_type_builder &Val) {
1387 ReadDataIntoImpl(d, DataLen, Val);
1388}
1389
1392 llvm::FoldingSetNodeID ID;
1393 ID.AddInteger(Key.first.getHash());
1394 ID.AddInteger(Key.second);
1395 return ID.computeStableHash();
1396}
1397
1400 DeclarationNameKey Name(Key.first);
1401
1402 UnsignedOrNone ModuleHash = getPrimaryModuleHash(Key.second);
1403 if (!ModuleHash)
1404 return {Name, 0};
1405
1406 return {Name, *ModuleHash};
1407}
1408
1410ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1412 unsigned PrimaryModuleHash =
1413 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1414 return {Name, PrimaryModuleHash};
1415}
1416
1418 const unsigned char *d,
1419 unsigned DataLen,
1420 data_type_builder &Val) {
1421 ReadDataIntoImpl(d, DataLen, Val);
1422}
1423
1424ModuleFile *
1426 using namespace llvm::support;
1427
1428 uint32_t ModuleFileID =
1429 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1430 return Reader.getLocalModuleFile(F, ModuleFileID);
1431}
1432
1434LazySpecializationInfoLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1435 using namespace llvm::support;
1436 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1437}
1438
1439std::pair<unsigned, unsigned>
1443
1445 const unsigned char *d,
1446 unsigned DataLen,
1447 data_type_builder &Val) {
1448 using namespace llvm::support;
1449
1450 for (unsigned NumDecls =
1452 NumDecls; --NumDecls) {
1453 LocalDeclID LocalID = LocalDeclID::get(
1454 Reader, F,
1455 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1456 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1457 }
1458}
1459
1460bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1461 BitstreamCursor &Cursor,
1462 uint64_t Offset,
1463 DeclContext *DC) {
1464 assert(Offset != 0);
1465
1466 SavedStreamPosition SavedPosition(Cursor);
1467 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1468 Error(std::move(Err));
1469 return true;
1470 }
1471
1472 RecordData Record;
1473 StringRef Blob;
1474 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1475 if (!MaybeCode) {
1476 Error(MaybeCode.takeError());
1477 return true;
1478 }
1479 unsigned Code = MaybeCode.get();
1480
1481 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1482 if (!MaybeRecCode) {
1483 Error(MaybeRecCode.takeError());
1484 return true;
1485 }
1486 unsigned RecCode = MaybeRecCode.get();
1487 if (RecCode != DECL_CONTEXT_LEXICAL) {
1488 Error("Expected lexical block");
1489 return true;
1490 }
1491
1492 assert(!isa<TranslationUnitDecl>(DC) &&
1493 "expected a TU_UPDATE_LEXICAL record for TU");
1494 // If we are handling a C++ class template instantiation, we can see multiple
1495 // lexical updates for the same record. It's important that we select only one
1496 // of them, so that field numbering works properly. Just pick the first one we
1497 // see.
1498 auto &Lex = LexicalDecls[DC];
1499 if (!Lex.first) {
1500 Lex = std::make_pair(
1501 &M, llvm::ArrayRef(
1502 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1503 Blob.size() / sizeof(DeclID)));
1504 }
1506 return false;
1507}
1508
1509bool ASTReader::ReadVisibleDeclContextStorage(
1510 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1511 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1512 assert(Offset != 0);
1513
1514 SavedStreamPosition SavedPosition(Cursor);
1515 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1516 Error(std::move(Err));
1517 return true;
1518 }
1519
1520 RecordData Record;
1521 StringRef Blob;
1522 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1523 if (!MaybeCode) {
1524 Error(MaybeCode.takeError());
1525 return true;
1526 }
1527 unsigned Code = MaybeCode.get();
1528
1529 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1530 if (!MaybeRecCode) {
1531 Error(MaybeRecCode.takeError());
1532 return true;
1533 }
1534 unsigned RecCode = MaybeRecCode.get();
1535 switch (VisibleKind) {
1536 case VisibleDeclContextStorageKind::GenerallyVisible:
1537 if (RecCode != DECL_CONTEXT_VISIBLE) {
1538 Error("Expected visible lookup table block");
1539 return true;
1540 }
1541 break;
1542 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1543 if (RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) {
1544 Error("Expected module local visible lookup table block");
1545 return true;
1546 }
1547 break;
1548 case VisibleDeclContextStorageKind::TULocalVisible:
1549 if (RecCode != DECL_CONTEXT_TU_LOCAL_VISIBLE) {
1550 Error("Expected TU local lookup table block");
1551 return true;
1552 }
1553 break;
1554 }
1555
1556 // We can't safely determine the primary context yet, so delay attaching the
1557 // lookup table until we're done with recursive deserialization.
1558 auto *Data = (const unsigned char*)Blob.data();
1559 switch (VisibleKind) {
1560 case VisibleDeclContextStorageKind::GenerallyVisible:
1561 PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1562 break;
1563 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1564 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1565 break;
1566 case VisibleDeclContextStorageKind::TULocalVisible:
1567 if (M.Kind == MK_MainFile)
1568 TULocalUpdates[ID].push_back(UpdateData{&M, Data});
1569 break;
1570 }
1571 return false;
1572}
1573
1574void ASTReader::AddSpecializations(const Decl *D, const unsigned char *Data,
1575 ModuleFile &M, bool IsPartial) {
1576 D = D->getCanonicalDecl();
1577 auto &SpecLookups =
1578 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1579 SpecLookups[D].Table.add(&M, Data,
1581}
1582
1583bool ASTReader::ReadSpecializations(ModuleFile &M, BitstreamCursor &Cursor,
1584 uint64_t Offset, Decl *D, bool IsPartial) {
1585 assert(Offset != 0);
1586
1587 SavedStreamPosition SavedPosition(Cursor);
1588 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1589 Error(std::move(Err));
1590 return true;
1591 }
1592
1593 RecordData Record;
1594 StringRef Blob;
1595 Expected<unsigned> MaybeCode = Cursor.ReadCode();
1596 if (!MaybeCode) {
1597 Error(MaybeCode.takeError());
1598 return true;
1599 }
1600 unsigned Code = MaybeCode.get();
1601
1602 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1603 if (!MaybeRecCode) {
1604 Error(MaybeRecCode.takeError());
1605 return true;
1606 }
1607 unsigned RecCode = MaybeRecCode.get();
1608 if (RecCode != DECL_SPECIALIZATIONS &&
1609 RecCode != DECL_PARTIAL_SPECIALIZATIONS) {
1610 Error("Expected decl specs block");
1611 return true;
1612 }
1613
1614 auto *Data = (const unsigned char *)Blob.data();
1615 AddSpecializations(D, Data, M, IsPartial);
1616 return false;
1617}
1618
1619void ASTReader::Error(StringRef Msg) const {
1620 Error(diag::err_fe_ast_file_malformed, Msg);
1621 if (PP.getLangOpts().Modules &&
1622 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1623 Diag(diag::note_module_cache_path)
1624 << PP.getHeaderSearchInfo().getModuleCachePath();
1625 }
1626}
1627
1628void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1629 StringRef Arg3) const {
1630 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1631}
1632
1633namespace {
1634struct AlreadyReportedDiagnosticError
1635 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1636 static char ID;
1637
1638 void log(raw_ostream &OS) const override {
1639 llvm_unreachable("reporting an already-reported diagnostic error");
1640 }
1641
1642 std::error_code convertToErrorCode() const override {
1643 return llvm::inconvertibleErrorCode();
1644 }
1645};
1646
1647char AlreadyReportedDiagnosticError::ID = 0;
1648} // namespace
1649
1650void ASTReader::Error(llvm::Error &&Err) const {
1651 handleAllErrors(
1652 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1653 [&](llvm::ErrorInfoBase &E) { return Error(E.message()); });
1654}
1655
1656//===----------------------------------------------------------------------===//
1657// Source Manager Deserialization
1658//===----------------------------------------------------------------------===//
1659
1660/// Read the line table in the source manager block.
1661void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1662 unsigned Idx = 0;
1663 LineTableInfo &LineTable = SourceMgr.getLineTable();
1664
1665 // Parse the file names
1666 std::map<int, int> FileIDs;
1667 FileIDs[-1] = -1; // For unspecified filenames.
1668 for (unsigned I = 0; Record[Idx]; ++I) {
1669 // Extract the file name
1670 auto Filename = ReadPath(F, Record, Idx);
1671 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1672 }
1673 ++Idx;
1674
1675 // Parse the line entries
1676 std::vector<LineEntry> Entries;
1677 while (Idx < Record.size()) {
1678 FileID FID = ReadFileID(F, Record, Idx);
1679
1680 // Extract the line entries
1681 unsigned NumEntries = Record[Idx++];
1682 assert(NumEntries && "no line entries for file ID");
1683 Entries.clear();
1684 Entries.reserve(NumEntries);
1685 for (unsigned I = 0; I != NumEntries; ++I) {
1686 unsigned FileOffset = Record[Idx++];
1687 unsigned LineNo = Record[Idx++];
1688 int FilenameID = FileIDs[Record[Idx++]];
1691 unsigned IncludeOffset = Record[Idx++];
1692 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1693 FileKind, IncludeOffset));
1694 }
1695 LineTable.AddEntry(FID, Entries);
1696 }
1697}
1698
1699/// Read a source manager block
1700llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1701 using namespace SrcMgr;
1702
1703 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1704
1705 // Set the source-location entry cursor to the current position in
1706 // the stream. This cursor will be used to read the contents of the
1707 // source manager block initially, and then lazily read
1708 // source-location entries as needed.
1709 SLocEntryCursor = F.Stream;
1710
1711 // The stream itself is going to skip over the source manager block.
1712 if (llvm::Error Err = F.Stream.SkipBlock())
1713 return Err;
1714
1715 // Enter the source manager block.
1716 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1717 return Err;
1718 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1719
1720 RecordData Record;
1721 while (true) {
1722 Expected<llvm::BitstreamEntry> MaybeE =
1723 SLocEntryCursor.advanceSkippingSubblocks();
1724 if (!MaybeE)
1725 return MaybeE.takeError();
1726 llvm::BitstreamEntry E = MaybeE.get();
1727
1728 switch (E.Kind) {
1729 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1730 case llvm::BitstreamEntry::Error:
1731 return llvm::createStringError(std::errc::illegal_byte_sequence,
1732 "malformed block record in AST file");
1733 case llvm::BitstreamEntry::EndBlock:
1734 return llvm::Error::success();
1735 case llvm::BitstreamEntry::Record:
1736 // The interesting case.
1737 break;
1738 }
1739
1740 // Read a record.
1741 Record.clear();
1742 StringRef Blob;
1743 Expected<unsigned> MaybeRecord =
1744 SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1745 if (!MaybeRecord)
1746 return MaybeRecord.takeError();
1747 switch (MaybeRecord.get()) {
1748 default: // Default behavior: ignore.
1749 break;
1750
1751 case SM_SLOC_FILE_ENTRY:
1754 // Once we hit one of the source location entries, we're done.
1755 return llvm::Error::success();
1756 }
1757 }
1758}
1759
1760llvm::Expected<SourceLocation::UIntTy>
1762 BitstreamCursor &Cursor = F->SLocEntryCursor;
1763 SavedStreamPosition SavedPosition(Cursor);
1764 if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1765 F->SLocEntryOffsets[Index]))
1766 return std::move(Err);
1767
1768 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1769 if (!MaybeEntry)
1770 return MaybeEntry.takeError();
1771
1772 llvm::BitstreamEntry Entry = MaybeEntry.get();
1773 if (Entry.Kind != llvm::BitstreamEntry::Record)
1774 return llvm::createStringError(
1775 std::errc::illegal_byte_sequence,
1776 "incorrectly-formatted source location entry in AST file");
1777
1779 StringRef Blob;
1780 Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1781 if (!MaybeSLOC)
1782 return MaybeSLOC.takeError();
1783
1784 switch (MaybeSLOC.get()) {
1785 default:
1786 return llvm::createStringError(
1787 std::errc::illegal_byte_sequence,
1788 "incorrectly-formatted source location entry in AST file");
1789 case SM_SLOC_FILE_ENTRY:
1792 return F->SLocEntryBaseOffset + Record[0];
1793 }
1794}
1795
1797 auto SLocMapI =
1798 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1799 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1800 "Corrupted global sloc offset map");
1801 ModuleFile *F = SLocMapI->second;
1802
1803 bool Invalid = false;
1804
1805 auto It = llvm::upper_bound(
1806 llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1807 [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1808 int ID = F->SLocEntryBaseID + LocalIndex;
1809 std::size_t Index = -ID - 2;
1810 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1811 assert(!SourceMgr.SLocEntryLoaded[Index]);
1812 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1813 if (!MaybeEntryOffset) {
1814 Error(MaybeEntryOffset.takeError());
1815 Invalid = true;
1816 return true;
1817 }
1818 SourceMgr.LoadedSLocEntryTable[Index] =
1819 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1820 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1821 }
1822 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1823 });
1824
1825 if (Invalid)
1826 return 0;
1827
1828 // The iterator points to the first entry with start offset greater than the
1829 // offset of interest. The previous entry must contain the offset of interest.
1830 return F->SLocEntryBaseID + *std::prev(It);
1831}
1832
1834 if (ID == 0)
1835 return false;
1836
1837 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1838 Error("source location entry ID out-of-range for AST file");
1839 return true;
1840 }
1841
1842 // Local helper to read the (possibly-compressed) buffer data following the
1843 // entry record.
1844 auto ReadBuffer = [this](
1845 BitstreamCursor &SLocEntryCursor,
1846 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1848 StringRef Blob;
1849 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1850 if (!MaybeCode) {
1851 Error(MaybeCode.takeError());
1852 return nullptr;
1853 }
1854 unsigned Code = MaybeCode.get();
1855
1856 Expected<unsigned> MaybeRecCode =
1857 SLocEntryCursor.readRecord(Code, Record, &Blob);
1858 if (!MaybeRecCode) {
1859 Error(MaybeRecCode.takeError());
1860 return nullptr;
1861 }
1862 unsigned RecCode = MaybeRecCode.get();
1863
1864 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1865 // Inspect the first byte to differentiate zlib (\x78) and zstd
1866 // (little-endian 0xFD2FB528).
1867 const llvm::compression::Format F =
1868 Blob.size() > 0 && Blob.data()[0] == 0x78
1869 ? llvm::compression::Format::Zlib
1870 : llvm::compression::Format::Zstd;
1871 if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1872 Error(Reason);
1873 return nullptr;
1874 }
1875 SmallVector<uint8_t, 0> Decompressed;
1876 if (llvm::Error E = llvm::compression::decompress(
1877 F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1878 Error("could not decompress embedded file contents: " +
1879 llvm::toString(std::move(E)));
1880 return nullptr;
1881 }
1882 return llvm::MemoryBuffer::getMemBufferCopy(
1883 llvm::toStringRef(Decompressed), Name);
1884 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1885 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1886 } else {
1887 Error("AST record has invalid code");
1888 return nullptr;
1889 }
1890 };
1891
1892 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1893 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1895 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1896 Error(std::move(Err));
1897 return true;
1898 }
1899
1900 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1902
1903 ++NumSLocEntriesRead;
1904 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1905 if (!MaybeEntry) {
1906 Error(MaybeEntry.takeError());
1907 return true;
1908 }
1909 llvm::BitstreamEntry Entry = MaybeEntry.get();
1910
1911 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1912 Error("incorrectly-formatted source location entry in AST file");
1913 return true;
1914 }
1915
1917 StringRef Blob;
1918 Expected<unsigned> MaybeSLOC =
1919 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1920 if (!MaybeSLOC) {
1921 Error(MaybeSLOC.takeError());
1922 return true;
1923 }
1924 switch (MaybeSLOC.get()) {
1925 default:
1926 Error("incorrectly-formatted source location entry in AST file");
1927 return true;
1928
1929 case SM_SLOC_FILE_ENTRY: {
1930 // We will detect whether a file changed and return 'Failure' for it, but
1931 // we will also try to fail gracefully by setting up the SLocEntry.
1932 unsigned InputID = Record[4];
1933 InputFile IF = getInputFile(*F, InputID);
1935 bool OverriddenBuffer = IF.isOverridden();
1936
1937 // Note that we only check if a File was returned. If it was out-of-date
1938 // we have complained but we will continue creating a FileID to recover
1939 // gracefully.
1940 if (!File)
1941 return true;
1942
1943 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1944 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1945 // This is the module's main file.
1946 IncludeLoc = getImportLocation(F);
1947 }
1949 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1950 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1951 BaseOffset + Record[0]);
1952 SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1953 FileInfo.NumCreatedFIDs = Record[5];
1954 if (Record[3])
1955 FileInfo.setHasLineDirectives();
1956
1957 unsigned NumFileDecls = Record[7];
1958 if (NumFileDecls && ContextObj) {
1959 const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
1960 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1961 FileDeclIDs[FID] =
1962 FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
1963 }
1964
1965 const SrcMgr::ContentCache &ContentCache =
1966 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1967 if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1968 ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1969 !ContentCache.getBufferIfLoaded()) {
1970 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1971 if (!Buffer)
1972 return true;
1973 SourceMgr.overrideFileContents(*File, std::move(Buffer));
1974 }
1975
1976 break;
1977 }
1978
1979 case SM_SLOC_BUFFER_ENTRY: {
1980 const char *Name = Blob.data();
1981 unsigned Offset = Record[0];
1983 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1984 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1985 if (IncludeLoc.isInvalid() && F->isModule()) {
1986 IncludeLoc = getImportLocation(F);
1987 }
1988
1989 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1990 if (!Buffer)
1991 return true;
1992 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1993 BaseOffset + Offset, IncludeLoc);
1994 if (Record[3]) {
1995 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1996 FileInfo.setHasLineDirectives();
1997 }
1998 break;
1999 }
2000
2002 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
2003 SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2]);
2004 SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3]);
2005 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2006 Record[5], Record[4], ID,
2007 BaseOffset + Record[0]);
2008 break;
2009 }
2010 }
2011
2012 return false;
2013}
2014
2015std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
2016 if (ID == 0)
2017 return std::make_pair(SourceLocation(), "");
2018
2019 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
2020 Error("source location entry ID out-of-range for AST file");
2021 return std::make_pair(SourceLocation(), "");
2022 }
2023
2024 // Find which module file this entry lands in.
2025 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2026 if (!M->isModule())
2027 return std::make_pair(SourceLocation(), "");
2028
2029 // FIXME: Can we map this down to a particular submodule? That would be
2030 // ideal.
2031 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
2032}
2033
2034/// Find the location where the module F is imported.
2035SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
2036 if (F->ImportLoc.isValid())
2037 return F->ImportLoc;
2038
2039 // Otherwise we have a PCH. It's considered to be "imported" at the first
2040 // location of its includer.
2041 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
2042 // Main file is the importer.
2043 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
2044 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2045 }
2046 return F->ImportedBy[0]->FirstLoc;
2047}
2048
2049/// Enter a subblock of the specified BlockID with the specified cursor. Read
2050/// the abbreviations that are at the top of the block and then leave the cursor
2051/// pointing into the block.
2052llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
2053 unsigned BlockID,
2054 uint64_t *StartOfBlockOffset) {
2055 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2056 return Err;
2057
2058 if (StartOfBlockOffset)
2059 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2060
2061 while (true) {
2062 uint64_t Offset = Cursor.GetCurrentBitNo();
2063 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2064 if (!MaybeCode)
2065 return MaybeCode.takeError();
2066 unsigned Code = MaybeCode.get();
2067
2068 // We expect all abbrevs to be at the start of the block.
2069 if (Code != llvm::bitc::DEFINE_ABBREV) {
2070 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2071 return Err;
2072 return llvm::Error::success();
2073 }
2074 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2075 return Err;
2076 }
2077}
2078
2080 unsigned &Idx) {
2081 Token Tok;
2082 Tok.startToken();
2083 Tok.setLocation(ReadSourceLocation(M, Record, Idx));
2084 Tok.setKind((tok::TokenKind)Record[Idx++]);
2085 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
2086
2087 if (Tok.isAnnotation()) {
2088 Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
2089 switch (Tok.getKind()) {
2090 case tok::annot_pragma_loop_hint: {
2091 auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
2092 Info->PragmaName = ReadToken(M, Record, Idx);
2093 Info->Option = ReadToken(M, Record, Idx);
2094 unsigned NumTokens = Record[Idx++];
2096 Toks.reserve(NumTokens);
2097 for (unsigned I = 0; I < NumTokens; ++I)
2098 Toks.push_back(ReadToken(M, Record, Idx));
2099 Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2100 Tok.setAnnotationValue(static_cast<void *>(Info));
2101 break;
2102 }
2103 case tok::annot_pragma_pack: {
2104 auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
2105 Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
2106 auto SlotLabel = ReadString(Record, Idx);
2107 Info->SlotLabel =
2108 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2109 Info->Alignment = ReadToken(M, Record, Idx);
2110 Tok.setAnnotationValue(static_cast<void *>(Info));
2111 break;
2112 }
2113 // Some annotation tokens do not use the PtrData field.
2114 case tok::annot_pragma_openmp:
2115 case tok::annot_pragma_openmp_end:
2116 case tok::annot_pragma_unused:
2117 case tok::annot_pragma_openacc:
2118 case tok::annot_pragma_openacc_end:
2119 case tok::annot_repl_input_end:
2120 break;
2121 default:
2122 llvm_unreachable("missing deserialization code for annotation token");
2123 }
2124 } else {
2125 Tok.setLength(Record[Idx++]);
2126 if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
2127 Tok.setIdentifierInfo(II);
2128 }
2129 return Tok;
2130}
2131
2133 BitstreamCursor &Stream = F.MacroCursor;
2134
2135 // Keep track of where we are in the stream, then jump back there
2136 // after reading this macro.
2137 SavedStreamPosition SavedPosition(Stream);
2138
2139 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2140 // FIXME this drops errors on the floor.
2141 consumeError(std::move(Err));
2142 return nullptr;
2143 }
2146 MacroInfo *Macro = nullptr;
2147 llvm::MutableArrayRef<Token> MacroTokens;
2148
2149 while (true) {
2150 // Advance to the next record, but if we get to the end of the block, don't
2151 // pop it (removing all the abbreviations from the cursor) since we want to
2152 // be able to reseek within the block and read entries.
2153 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2155 Stream.advanceSkippingSubblocks(Flags);
2156 if (!MaybeEntry) {
2157 Error(MaybeEntry.takeError());
2158 return Macro;
2159 }
2160 llvm::BitstreamEntry Entry = MaybeEntry.get();
2161
2162 switch (Entry.Kind) {
2163 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2164 case llvm::BitstreamEntry::Error:
2165 Error("malformed block record in AST file");
2166 return Macro;
2167 case llvm::BitstreamEntry::EndBlock:
2168 return Macro;
2169 case llvm::BitstreamEntry::Record:
2170 // The interesting case.
2171 break;
2172 }
2173
2174 // Read a record.
2175 Record.clear();
2177 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
2178 RecType = (PreprocessorRecordTypes)MaybeRecType.get();
2179 else {
2180 Error(MaybeRecType.takeError());
2181 return Macro;
2182 }
2183 switch (RecType) {
2184 case PP_MODULE_MACRO:
2186 return Macro;
2187
2190 // If we already have a macro, that means that we've hit the end
2191 // of the definition of the macro we were looking for. We're
2192 // done.
2193 if (Macro)
2194 return Macro;
2195
2196 unsigned NextIndex = 1; // Skip identifier ID.
2197 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
2198 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2199 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
2200 MI->setIsUsed(Record[NextIndex++]);
2201 MI->setUsedForHeaderGuard(Record[NextIndex++]);
2202 MacroTokens = MI->allocateTokens(Record[NextIndex++],
2203 PP.getPreprocessorAllocator());
2204 if (RecType == PP_MACRO_FUNCTION_LIKE) {
2205 // Decode function-like macro info.
2206 bool isC99VarArgs = Record[NextIndex++];
2207 bool isGNUVarArgs = Record[NextIndex++];
2208 bool hasCommaPasting = Record[NextIndex++];
2209 MacroParams.clear();
2210 unsigned NumArgs = Record[NextIndex++];
2211 for (unsigned i = 0; i != NumArgs; ++i)
2212 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
2213
2214 // Install function-like macro info.
2215 MI->setIsFunctionLike();
2216 if (isC99VarArgs) MI->setIsC99Varargs();
2217 if (isGNUVarArgs) MI->setIsGNUVarargs();
2218 if (hasCommaPasting) MI->setHasCommaPasting();
2219 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
2220 }
2221
2222 // Remember that we saw this macro last so that we add the tokens that
2223 // form its body to it.
2224 Macro = MI;
2225
2226 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
2227 Record[NextIndex]) {
2228 // We have a macro definition. Register the association
2230 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
2231 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
2232 PreprocessingRecord::PPEntityID PPID =
2233 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
2234 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
2235 PPRec.getPreprocessedEntity(PPID));
2236 if (PPDef)
2237 PPRec.RegisterMacroDefinition(Macro, PPDef);
2238 }
2239
2240 ++NumMacrosRead;
2241 break;
2242 }
2243
2244 case PP_TOKEN: {
2245 // If we see a TOKEN before a PP_MACRO_*, then the file is
2246 // erroneous, just pretend we didn't see this.
2247 if (!Macro) break;
2248 if (MacroTokens.empty()) {
2249 Error("unexpected number of macro tokens for a macro in AST file");
2250 return Macro;
2251 }
2252
2253 unsigned Idx = 0;
2254 MacroTokens[0] = ReadToken(F, Record, Idx);
2255 MacroTokens = MacroTokens.drop_front();
2256 break;
2257 }
2258 }
2259 }
2260}
2261
2264 unsigned LocalID) const {
2265 if (!M.ModuleOffsetMap.empty())
2266 ReadModuleOffsetMap(M);
2267
2270 assert(I != M.PreprocessedEntityRemap.end()
2271 && "Invalid index into preprocessed entity index remap");
2272
2273 return LocalID + I->second;
2274}
2275
2277HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2278 FileManager &FileMgr = Reader.getFileManager();
2279 if (!Key.Imported)
2280 return FileMgr.getOptionalFileRef(Key.Filename);
2281
2282 auto Resolved =
2283 ASTReader::ResolveImportedPath(Reader.getPathBuf(), Key.Filename, M);
2284 return FileMgr.getOptionalFileRef(*Resolved);
2285}
2286
2288 uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2289 memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2290 memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2291 return llvm::xxh3_64bits(buf);
2292}
2293
2296 internal_key_type ikey = {ekey.getSize(),
2297 M.HasTimestamps ? ekey.getModificationTime() : 0,
2298 ekey.getName(), /*Imported*/ false};
2299 return ikey;
2300}
2301
2303 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2304 return false;
2305
2306 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2307 return true;
2308
2309 // Determine whether the actual files are equivalent.
2310 OptionalFileEntryRef FEA = getFile(a);
2311 OptionalFileEntryRef FEB = getFile(b);
2312 return FEA && FEA == FEB;
2313}
2314
2315std::pair<unsigned, unsigned>
2317 return readULEBKeyDataLength(d);
2318}
2319
2321HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2322 using namespace llvm::support;
2323
2324 internal_key_type ikey;
2325 ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2326 ikey.ModTime =
2327 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2328 ikey.Filename = (const char *)d;
2329 ikey.Imported = true;
2330 return ikey;
2331}
2332
2335 unsigned DataLen) {
2336 using namespace llvm::support;
2337
2338 const unsigned char *End = d + DataLen;
2339 HeaderFileInfo HFI;
2340 unsigned Flags = *d++;
2341
2343 bool Included = (Flags >> 6) & 0x01;
2344 if (Included)
2345 if ((FE = getFile(key)))
2346 // Not using \c Preprocessor::markIncluded(), since that would attempt to
2347 // deserialize this header file info again.
2348 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2349
2350 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2351 HFI.isImport |= (Flags >> 5) & 0x01;
2352 HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2353 HFI.DirInfo = (Flags >> 1) & 0x07;
2354 HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2355 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2356
2357 assert((End - d) % 4 == 0 &&
2358 "Wrong data length in HeaderFileInfo deserialization");
2359 while (d != End) {
2360 uint32_t LocalSMID =
2361 endian::readNext<uint32_t, llvm::endianness::little>(d);
2362 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2363 LocalSMID >>= 3;
2364
2365 // This header is part of a module. Associate it with the module to enable
2366 // implicit module import.
2367 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2368 Module *Mod = Reader.getSubmodule(GlobalSMID);
2369 ModuleMap &ModMap =
2370 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2371
2372 if (FE || (FE = getFile(key))) {
2373 // FIXME: NameAsWritten
2374 Module::Header H = {std::string(key.Filename), "", *FE};
2375 ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2376 }
2377 HFI.mergeModuleMembership(HeaderRole);
2378 }
2379
2380 // This HeaderFileInfo was externally loaded.
2381 HFI.External = true;
2382 HFI.IsValid = true;
2383 return HFI;
2384}
2385
2387 uint32_t MacroDirectivesOffset) {
2388 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2389 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2390}
2391
2393 // Note that we are loading defined macros.
2394 Deserializing Macros(this);
2395
2396 for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2397 BitstreamCursor &MacroCursor = I.MacroCursor;
2398
2399 // If there was no preprocessor block, skip this file.
2400 if (MacroCursor.getBitcodeBytes().empty())
2401 continue;
2402
2403 BitstreamCursor Cursor = MacroCursor;
2404 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2405 Error(std::move(Err));
2406 return;
2407 }
2408
2410 while (true) {
2411 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2412 if (!MaybeE) {
2413 Error(MaybeE.takeError());
2414 return;
2415 }
2416 llvm::BitstreamEntry E = MaybeE.get();
2417
2418 switch (E.Kind) {
2419 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2420 case llvm::BitstreamEntry::Error:
2421 Error("malformed block record in AST file");
2422 return;
2423 case llvm::BitstreamEntry::EndBlock:
2424 goto NextCursor;
2425
2426 case llvm::BitstreamEntry::Record: {
2427 Record.clear();
2428 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2429 if (!MaybeRecord) {
2430 Error(MaybeRecord.takeError());
2431 return;
2432 }
2433 switch (MaybeRecord.get()) {
2434 default: // Default behavior: ignore.
2435 break;
2436
2440 if (II->isOutOfDate())
2442 break;
2443 }
2444
2445 case PP_TOKEN:
2446 // Ignore tokens.
2447 break;
2448 }
2449 break;
2450 }
2451 }
2452 }
2453 NextCursor: ;
2454 }
2455}
2456
2457namespace {
2458
2459 /// Visitor class used to look up identifirs in an AST file.
2460 class IdentifierLookupVisitor {
2461 StringRef Name;
2462 unsigned NameHash;
2463 unsigned PriorGeneration;
2464 unsigned &NumIdentifierLookups;
2465 unsigned &NumIdentifierLookupHits;
2466 IdentifierInfo *Found = nullptr;
2467
2468 public:
2469 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2470 unsigned &NumIdentifierLookups,
2471 unsigned &NumIdentifierLookupHits)
2472 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2473 PriorGeneration(PriorGeneration),
2474 NumIdentifierLookups(NumIdentifierLookups),
2475 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2476
2477 bool operator()(ModuleFile &M) {
2478 // If we've already searched this module file, skip it now.
2479 if (M.Generation <= PriorGeneration)
2480 return true;
2481
2484 if (!IdTable)
2485 return false;
2486
2487 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2488 Found);
2489 ++NumIdentifierLookups;
2490 ASTIdentifierLookupTable::iterator Pos =
2491 IdTable->find_hashed(Name, NameHash, &Trait);
2492 if (Pos == IdTable->end())
2493 return false;
2494
2495 // Dereferencing the iterator has the effect of building the
2496 // IdentifierInfo node and populating it with the various
2497 // declarations it needs.
2498 ++NumIdentifierLookupHits;
2499 Found = *Pos;
2500 if (Trait.hasMoreInformationInDependencies()) {
2501 // Look for the identifier in extra modules as they contain more info.
2502 return false;
2503 }
2504 return true;
2505 }
2506
2507 // Retrieve the identifier info found within the module
2508 // files.
2509 IdentifierInfo *getIdentifierInfo() const { return Found; }
2510 };
2511
2512} // namespace
2513
2515 // Note that we are loading an identifier.
2516 Deserializing AnIdentifier(this);
2517
2518 unsigned PriorGeneration = 0;
2519 if (getContext().getLangOpts().Modules)
2520 PriorGeneration = IdentifierGeneration[&II];
2521
2522 // If there is a global index, look there first to determine which modules
2523 // provably do not have any results for this identifier.
2525 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2526 if (!loadGlobalIndex()) {
2527 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2528 HitsPtr = &Hits;
2529 }
2530 }
2531
2532 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2533 NumIdentifierLookups,
2534 NumIdentifierLookupHits);
2535 ModuleMgr.visit(Visitor, HitsPtr);
2537}
2538
2540 if (!II)
2541 return;
2542
2543 const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2544
2545 // Update the generation for this identifier.
2546 if (getContext().getLangOpts().Modules)
2547 IdentifierGeneration[II] = getGeneration();
2548}
2549
2551 const PendingMacroInfo &PMInfo) {
2552 ModuleFile &M = *PMInfo.M;
2553
2554 BitstreamCursor &Cursor = M.MacroCursor;
2555 SavedStreamPosition SavedPosition(Cursor);
2556 if (llvm::Error Err =
2557 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2558 Error(std::move(Err));
2559 return;
2560 }
2561
2562 struct ModuleMacroRecord {
2563 SubmoduleID SubModID;
2564 MacroInfo *MI;
2566 };
2568
2569 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2570 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2571 // macro histroy.
2573 while (true) {
2575 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2576 if (!MaybeEntry) {
2577 Error(MaybeEntry.takeError());
2578 return;
2579 }
2580 llvm::BitstreamEntry Entry = MaybeEntry.get();
2581
2582 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2583 Error("malformed block record in AST file");
2584 return;
2585 }
2586
2587 Record.clear();
2588 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2589 if (!MaybePP) {
2590 Error(MaybePP.takeError());
2591 return;
2592 }
2593 switch ((PreprocessorRecordTypes)MaybePP.get()) {
2595 break;
2596
2597 case PP_MODULE_MACRO: {
2598 ModuleMacros.push_back(ModuleMacroRecord());
2599 auto &Info = ModuleMacros.back();
2600 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2601 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
2602 for (int I = 2, N = Record.size(); I != N; ++I)
2603 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2604 continue;
2605 }
2606
2607 default:
2608 Error("malformed block record in AST file");
2609 return;
2610 }
2611
2612 // We found the macro directive history; that's the last record
2613 // for this macro.
2614 break;
2615 }
2616
2617 // Module macros are listed in reverse dependency order.
2618 {
2619 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2621 for (auto &MMR : ModuleMacros) {
2622 Overrides.clear();
2623 for (unsigned ModID : MMR.Overrides) {
2624 Module *Mod = getSubmodule(ModID);
2625 auto *Macro = PP.getModuleMacro(Mod, II);
2626 assert(Macro && "missing definition for overridden macro");
2627 Overrides.push_back(Macro);
2628 }
2629
2630 bool Inserted = false;
2631 Module *Owner = getSubmodule(MMR.SubModID);
2632 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2633 }
2634 }
2635
2636 // Don't read the directive history for a module; we don't have anywhere
2637 // to put it.
2638 if (M.isModule())
2639 return;
2640
2641 // Deserialize the macro directives history in reverse source-order.
2642 MacroDirective *Latest = nullptr, *Earliest = nullptr;
2643 unsigned Idx = 0, N = Record.size();
2644 while (Idx < N) {
2645 MacroDirective *MD = nullptr;
2648 switch (K) {
2650 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2651 MD = PP.AllocateDefMacroDirective(MI, Loc);
2652 break;
2653 }
2655 MD = PP.AllocateUndefMacroDirective(Loc);
2656 break;
2658 bool isPublic = Record[Idx++];
2659 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2660 break;
2661 }
2662
2663 if (!Latest)
2664 Latest = MD;
2665 if (Earliest)
2666 Earliest->setPrevious(MD);
2667 Earliest = MD;
2668 }
2669
2670 if (Latest)
2671 PP.setLoadedMacroDirective(II, Earliest, Latest);
2672}
2673
2674bool ASTReader::shouldDisableValidationForFile(
2675 const serialization::ModuleFile &M) const {
2676 if (DisableValidationKind == DisableValidationForModuleKind::None)
2677 return false;
2678
2679 // If a PCH is loaded and validation is disabled for PCH then disable
2680 // validation for the PCH and the modules it loads.
2681 ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2682
2683 switch (K) {
2684 case MK_MainFile:
2685 case MK_Preamble:
2686 case MK_PCH:
2687 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2688 case MK_ImplicitModule:
2689 case MK_ExplicitModule:
2690 case MK_PrebuiltModule:
2691 return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2692 }
2693
2694 return false;
2695}
2696
2697static std::pair<StringRef, StringRef>
2699 const StringRef InputBlob) {
2700 uint16_t AsRequestedLength = Record[7];
2701 return {InputBlob.substr(0, AsRequestedLength),
2702 InputBlob.substr(AsRequestedLength)};
2703}
2704
2705InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2706 // If this ID is bogus, just return an empty input file.
2707 if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2708 return InputFileInfo();
2709
2710 // If we've already loaded this input file, return it.
2711 if (F.InputFileInfosLoaded[ID - 1].isValid())
2712 return F.InputFileInfosLoaded[ID - 1];
2713
2714 // Go find this input file.
2715 BitstreamCursor &Cursor = F.InputFilesCursor;
2716 SavedStreamPosition SavedPosition(Cursor);
2717 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2718 F.InputFileOffsets[ID - 1])) {
2719 // FIXME this drops errors on the floor.
2720 consumeError(std::move(Err));
2721 }
2722
2723 Expected<unsigned> MaybeCode = Cursor.ReadCode();
2724 if (!MaybeCode) {
2725 // FIXME this drops errors on the floor.
2726 consumeError(MaybeCode.takeError());
2727 }
2728 unsigned Code = MaybeCode.get();
2729 RecordData Record;
2730 StringRef Blob;
2731
2732 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2733 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2734 "invalid record type for input file");
2735 else {
2736 // FIXME this drops errors on the floor.
2737 consumeError(Maybe.takeError());
2738 }
2739
2740 assert(Record[0] == ID && "Bogus stored ID or offset");
2741 InputFileInfo R;
2742 R.StoredSize = static_cast<off_t>(Record[1]);
2743 R.StoredTime = static_cast<time_t>(Record[2]);
2744 R.Overridden = static_cast<bool>(Record[3]);
2745 R.Transient = static_cast<bool>(Record[4]);
2746 R.TopLevel = static_cast<bool>(Record[5]);
2747 R.ModuleMap = static_cast<bool>(Record[6]);
2748 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2750 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2751 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2752 ? UnresolvedFilenameAsRequested
2753 : UnresolvedFilename;
2754
2755 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2756 if (!MaybeEntry) // FIXME this drops errors on the floor.
2757 consumeError(MaybeEntry.takeError());
2758 llvm::BitstreamEntry Entry = MaybeEntry.get();
2759 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2760 "expected record type for input file hash");
2761
2762 Record.clear();
2763 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2764 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2765 "invalid record type for input file hash");
2766 else {
2767 // FIXME this drops errors on the floor.
2768 consumeError(Maybe.takeError());
2769 }
2770 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2771 static_cast<uint64_t>(Record[0]);
2772
2773 // Note that we've loaded this input file info.
2774 F.InputFileInfosLoaded[ID - 1] = R;
2775 return R;
2776}
2777
2778static unsigned moduleKindForDiagnostic(ModuleKind Kind);
2779InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2780 // If this ID is bogus, just return an empty input file.
2781 if (ID == 0 || ID > F.InputFilesLoaded.size())
2782 return InputFile();
2783
2784 // If we've already loaded this input file, return it.
2785 if (F.InputFilesLoaded[ID-1].getFile())
2786 return F.InputFilesLoaded[ID-1];
2787
2788 if (F.InputFilesLoaded[ID-1].isNotFound())
2789 return InputFile();
2790
2791 // Go find this input file.
2792 BitstreamCursor &Cursor = F.InputFilesCursor;
2793 SavedStreamPosition SavedPosition(Cursor);
2794 if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2795 F.InputFileOffsets[ID - 1])) {
2796 // FIXME this drops errors on the floor.
2797 consumeError(std::move(Err));
2798 }
2799
2800 InputFileInfo FI = getInputFileInfo(F, ID);
2801 off_t StoredSize = FI.StoredSize;
2802 time_t StoredTime = FI.StoredTime;
2803 bool Overridden = FI.Overridden;
2804 bool Transient = FI.Transient;
2805 auto Filename =
2806 ResolveImportedPath(PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
2807 uint64_t StoredContentHash = FI.ContentHash;
2808
2809 // For standard C++ modules, we don't need to check the inputs.
2810 bool SkipChecks = F.StandardCXXModule;
2811
2812 const HeaderSearchOptions &HSOpts =
2813 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2814
2815 // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2816 // modules.
2818 SkipChecks = false;
2819 Overridden = false;
2820 }
2821
2822 auto File = FileMgr.getOptionalFileRef(*Filename, /*OpenFile=*/false);
2823
2824 // For an overridden file, create a virtual file with the stored
2825 // size/timestamp.
2826 if ((Overridden || Transient || SkipChecks) && !File)
2827 File = FileMgr.getVirtualFileRef(*Filename, StoredSize, StoredTime);
2828
2829 if (!File) {
2830 if (Complain) {
2831 std::string ErrorStr = "could not find file '";
2832 ErrorStr += *Filename;
2833 ErrorStr += "' referenced by AST file '";
2834 ErrorStr += F.FileName;
2835 ErrorStr += "'";
2836 Error(ErrorStr);
2837 }
2838 // Record that we didn't find the file.
2840 return InputFile();
2841 }
2842
2843 // Check if there was a request to override the contents of the file
2844 // that was part of the precompiled header. Overriding such a file
2845 // can lead to problems when lexing using the source locations from the
2846 // PCH.
2847 SourceManager &SM = getSourceManager();
2848 // FIXME: Reject if the overrides are different.
2849 if ((!Overridden && !Transient) && !SkipChecks &&
2850 SM.isFileOverridden(*File)) {
2851 if (Complain)
2852 Error(diag::err_fe_pch_file_overridden, *Filename);
2853
2854 // After emitting the diagnostic, bypass the overriding file to recover
2855 // (this creates a separate FileEntry).
2856 File = SM.bypassFileContentsOverride(*File);
2857 if (!File) {
2859 return InputFile();
2860 }
2861 }
2862
2863 struct Change {
2864 enum ModificationKind {
2865 Size,
2866 ModTime,
2867 Content,
2868 None,
2869 } Kind;
2870 std::optional<int64_t> Old = std::nullopt;
2871 std::optional<int64_t> New = std::nullopt;
2872 };
2873 auto HasInputContentChanged = [&](Change OriginalChange) {
2874 assert(ValidateASTInputFilesContent &&
2875 "We should only check the content of the inputs with "
2876 "ValidateASTInputFilesContent enabled.");
2877
2878 if (StoredContentHash == 0)
2879 return OriginalChange;
2880
2881 auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2882 if (!MemBuffOrError) {
2883 if (!Complain)
2884 return OriginalChange;
2885 std::string ErrorStr = "could not get buffer for file '";
2886 ErrorStr += File->getName();
2887 ErrorStr += "'";
2888 Error(ErrorStr);
2889 return OriginalChange;
2890 }
2891
2892 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2893 if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2894 return Change{Change::None};
2895
2896 return Change{Change::Content};
2897 };
2898 auto HasInputFileChanged = [&]() {
2899 if (StoredSize != File->getSize())
2900 return Change{Change::Size, StoredSize, File->getSize()};
2901 if (!shouldDisableValidationForFile(F) && StoredTime &&
2902 StoredTime != File->getModificationTime()) {
2903 Change MTimeChange = {Change::ModTime, StoredTime,
2904 File->getModificationTime()};
2905
2906 // In case the modification time changes but not the content,
2907 // accept the cached file as legit.
2908 if (ValidateASTInputFilesContent)
2909 return HasInputContentChanged(MTimeChange);
2910
2911 return MTimeChange;
2912 }
2913 return Change{Change::None};
2914 };
2915
2916 bool IsOutOfDate = false;
2917 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2918 // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
2919 // enabled, it is better to check the contents of the inputs. Since we can't
2920 // get correct modified time information for inputs from overriden inputs.
2921 if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
2922 F.StandardCXXModule && FileChange.Kind == Change::None)
2923 FileChange = HasInputContentChanged(FileChange);
2924
2925 // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
2926 // it is better to check the content of the input files because we cannot rely
2927 // on the file modification time, which will be the same (zero) for these
2928 // files.
2929 if (!StoredTime && ValidateASTInputFilesContent &&
2930 FileChange.Kind == Change::None)
2931 FileChange = HasInputContentChanged(FileChange);
2932
2933 // For an overridden file, there is nothing to validate.
2934 if (!Overridden && FileChange.Kind != Change::None) {
2935 if (Complain) {
2936 // Build a list of the PCH imports that got us here (in reverse).
2937 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2938 while (!ImportStack.back()->ImportedBy.empty())
2939 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2940
2941 // The top-level AST file is stale.
2942 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2943 Diag(diag::err_fe_ast_file_modified)
2944 << *Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2945 << TopLevelASTFileName << FileChange.Kind
2946 << (FileChange.Old && FileChange.New)
2947 << llvm::itostr(FileChange.Old.value_or(0))
2948 << llvm::itostr(FileChange.New.value_or(0));
2949
2950 // Print the import stack.
2951 if (ImportStack.size() > 1) {
2952 Diag(diag::note_ast_file_required_by)
2953 << *Filename << ImportStack[0]->FileName;
2954 for (unsigned I = 1; I < ImportStack.size(); ++I)
2955 Diag(diag::note_ast_file_required_by)
2956 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
2957 }
2958
2959 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
2960 }
2961
2962 IsOutOfDate = true;
2963 }
2964 // FIXME: If the file is overridden and we've already opened it,
2965 // issue an error (or split it into a separate FileEntry).
2966
2967 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
2968
2969 // Note that we've loaded this input file.
2970 F.InputFilesLoaded[ID-1] = IF;
2971 return IF;
2972}
2973
2974ASTReader::TemporarilyOwnedStringRef
2976 ModuleFile &ModF) {
2977 return ResolveImportedPath(Buf, Path, ModF.BaseDirectory);
2978}
2979
2980ASTReader::TemporarilyOwnedStringRef
2982 StringRef Prefix) {
2983 assert(Buf.capacity() != 0 && "Overlapping ResolveImportedPath calls");
2984
2985 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
2986 Path == "<built-in>" || Path == "<command line>")
2987 return {Path, Buf};
2988
2989 Buf.clear();
2990 llvm::sys::path::append(Buf, Prefix, Path);
2991 StringRef ResolvedPath{Buf.data(), Buf.size()};
2992 return {ResolvedPath, Buf};
2993}
2994
2996 StringRef P,
2997 ModuleFile &ModF) {
2998 return ResolveImportedPathAndAllocate(Buf, P, ModF.BaseDirectory);
2999}
3000
3002 StringRef P,
3003 StringRef Prefix) {
3004 auto ResolvedPath = ResolveImportedPath(Buf, P, Prefix);
3005 return ResolvedPath->str();
3006}
3007
3008static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
3009 switch (ARR) {
3010 case ASTReader::Failure: return true;
3011 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
3012 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
3015 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
3016 case ASTReader::HadErrors: return true;
3017 case ASTReader::Success: return false;
3018 }
3019
3020 llvm_unreachable("unknown ASTReadResult");
3021}
3022
3023ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
3024 BitstreamCursor &Stream, StringRef Filename,
3025 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
3026 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3027 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
3028 // FIXME this drops errors on the floor.
3029 consumeError(std::move(Err));
3030 return Failure;
3031 }
3032
3033 // Read all of the records in the options block.
3034 RecordData Record;
3035 ASTReadResult Result = Success;
3036 while (true) {
3037 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3038 if (!MaybeEntry) {
3039 // FIXME this drops errors on the floor.
3040 consumeError(MaybeEntry.takeError());
3041 return Failure;
3042 }
3043 llvm::BitstreamEntry Entry = MaybeEntry.get();
3044
3045 switch (Entry.Kind) {
3046 case llvm::BitstreamEntry::Error:
3047 case llvm::BitstreamEntry::SubBlock:
3048 return Failure;
3049
3050 case llvm::BitstreamEntry::EndBlock:
3051 return Result;
3052
3053 case llvm::BitstreamEntry::Record:
3054 // The interesting case.
3055 break;
3056 }
3057
3058 // Read and process a record.
3059 Record.clear();
3060 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
3061 if (!MaybeRecordType) {
3062 // FIXME this drops errors on the floor.
3063 consumeError(MaybeRecordType.takeError());
3064 return Failure;
3065 }
3066 switch ((OptionsRecordTypes)MaybeRecordType.get()) {
3067 case LANGUAGE_OPTIONS: {
3068 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3069 if (ParseLanguageOptions(Record, Filename, Complain, Listener,
3070 AllowCompatibleConfigurationMismatch))
3071 Result = ConfigurationMismatch;
3072 break;
3073 }
3074
3075 case CODEGEN_OPTIONS: {
3076 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3077 if (ParseCodeGenOptions(Record, Filename, Complain, Listener,
3078 AllowCompatibleConfigurationMismatch))
3079 Result = ConfigurationMismatch;
3080 break;
3081 }
3082
3083 case TARGET_OPTIONS: {
3084 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3085 if (ParseTargetOptions(Record, Filename, Complain, Listener,
3086 AllowCompatibleConfigurationMismatch))
3087 Result = ConfigurationMismatch;
3088 break;
3089 }
3090
3091 case FILE_SYSTEM_OPTIONS: {
3092 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3093 if (!AllowCompatibleConfigurationMismatch &&
3094 ParseFileSystemOptions(Record, Complain, Listener))
3095 Result = ConfigurationMismatch;
3096 break;
3097 }
3098
3099 case HEADER_SEARCH_OPTIONS: {
3100 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3101 if (!AllowCompatibleConfigurationMismatch &&
3102 ParseHeaderSearchOptions(Record, Filename, Complain, Listener))
3103 Result = ConfigurationMismatch;
3104 break;
3105 }
3106
3108 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3109 if (!AllowCompatibleConfigurationMismatch &&
3110 ParsePreprocessorOptions(Record, Filename, Complain, Listener,
3111 SuggestedPredefines))
3112 Result = ConfigurationMismatch;
3113 break;
3114 }
3115 }
3116}
3117
3119ASTReader::ReadControlBlock(ModuleFile &F,
3120 SmallVectorImpl<ImportedModule> &Loaded,
3121 const ModuleFile *ImportedBy,
3122 unsigned ClientLoadCapabilities) {
3123 BitstreamCursor &Stream = F.Stream;
3124
3125 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
3126 Error(std::move(Err));
3127 return Failure;
3128 }
3129
3130 // Lambda to read the unhashed control block the first time it's called.
3131 //
3132 // For PCM files, the unhashed control block cannot be read until after the
3133 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still
3134 // need to look ahead before reading the IMPORTS record. For consistency,
3135 // this block is always read somehow (see BitstreamEntry::EndBlock).
3136 bool HasReadUnhashedControlBlock = false;
3137 auto readUnhashedControlBlockOnce = [&]() {
3138 if (!HasReadUnhashedControlBlock) {
3139 HasReadUnhashedControlBlock = true;
3140 if (ASTReadResult Result =
3141 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3142 return Result;
3143 }
3144 return Success;
3145 };
3146
3147 bool DisableValidation = shouldDisableValidationForFile(F);
3148
3149 // Read all of the records and blocks in the control block.
3150 RecordData Record;
3151 unsigned NumInputs = 0;
3152 unsigned NumUserInputs = 0;
3153 StringRef BaseDirectoryAsWritten;
3154 while (true) {
3155 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3156 if (!MaybeEntry) {
3157 Error(MaybeEntry.takeError());
3158 return Failure;
3159 }
3160 llvm::BitstreamEntry Entry = MaybeEntry.get();
3161
3162 switch (Entry.Kind) {
3163 case llvm::BitstreamEntry::Error:
3164 Error("malformed block record in AST file");
3165 return Failure;
3166 case llvm::BitstreamEntry::EndBlock: {
3167 // Validate the module before returning. This call catches an AST with
3168 // no module name and no imports.
3169 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3170 return Result;
3171
3172 // Validate input files.
3173 const HeaderSearchOptions &HSOpts =
3174 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3175
3176 // All user input files reside at the index range [0, NumUserInputs), and
3177 // system input files reside at [NumUserInputs, NumInputs). For explicitly
3178 // loaded module files, ignore missing inputs.
3179 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
3180 F.Kind != MK_PrebuiltModule) {
3181 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3182
3183 // If we are reading a module, we will create a verification timestamp,
3184 // so we verify all input files. Otherwise, verify only user input
3185 // files.
3186
3187 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3191 N = ForceValidateUserInputs ? NumUserInputs : 0;
3192
3193 if (N != 0)
3194 Diag(diag::remark_module_validation)
3195 << N << F.ModuleName << F.FileName;
3196
3197 for (unsigned I = 0; I < N; ++I) {
3198 InputFile IF = getInputFile(F, I+1, Complain);
3199 if (!IF.getFile() || IF.isOutOfDate())
3200 return OutOfDate;
3201 }
3202 }
3203
3204 if (Listener)
3205 Listener->visitModuleFile(F.FileName, F.Kind);
3206
3207 if (Listener && Listener->needsInputFileVisitation()) {
3208 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
3209 : NumUserInputs;
3210 for (unsigned I = 0; I < N; ++I) {
3211 bool IsSystem = I >= NumUserInputs;
3212 InputFileInfo FI = getInputFileInfo(F, I + 1);
3213 auto FilenameAsRequested = ResolveImportedPath(
3215 Listener->visitInputFile(
3216 *FilenameAsRequested, IsSystem, FI.Overridden,
3218 }
3219 }
3220
3221 return Success;
3222 }
3223
3224 case llvm::BitstreamEntry::SubBlock:
3225 switch (Entry.ID) {
3227 F.InputFilesCursor = Stream;
3228 if (llvm::Error Err = Stream.SkipBlock()) {
3229 Error(std::move(Err));
3230 return Failure;
3231 }
3232 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
3233 Error("malformed block record in AST file");
3234 return Failure;
3235 }
3236 F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
3237 continue;
3238
3239 case OPTIONS_BLOCK_ID:
3240 // If we're reading the first module for this group, check its options
3241 // are compatible with ours. For modules it imports, no further checking
3242 // is required, because we checked them when we built it.
3243 if (Listener && !ImportedBy) {
3244 // Should we allow the configuration of the module file to differ from
3245 // the configuration of the current translation unit in a compatible
3246 // way?
3247 //
3248 // FIXME: Allow this for files explicitly specified with -include-pch.
3249 bool AllowCompatibleConfigurationMismatch =
3251
3252 ASTReadResult Result =
3253 ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities,
3254 AllowCompatibleConfigurationMismatch, *Listener,
3255 SuggestedPredefines);
3256 if (Result == Failure) {
3257 Error("malformed block record in AST file");
3258 return Result;
3259 }
3260
3261 if (DisableValidation ||
3262 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
3263 Result = Success;
3264
3265 // If we can't load the module, exit early since we likely
3266 // will rebuild the module anyway. The stream may be in the
3267 // middle of a block.
3268 if (Result != Success)
3269 return Result;
3270 } else if (llvm::Error Err = Stream.SkipBlock()) {
3271 Error(std::move(Err));
3272 return Failure;
3273 }
3274 continue;
3275
3276 default:
3277 if (llvm::Error Err = Stream.SkipBlock()) {
3278 Error(std::move(Err));
3279 return Failure;
3280 }
3281 continue;
3282 }
3283
3284 case llvm::BitstreamEntry::Record:
3285 // The interesting case.
3286 break;
3287 }
3288
3289 // Read and process a record.
3290 Record.clear();
3291 StringRef Blob;
3292 Expected<unsigned> MaybeRecordType =
3293 Stream.readRecord(Entry.ID, Record, &Blob);
3294 if (!MaybeRecordType) {
3295 Error(MaybeRecordType.takeError());
3296 return Failure;
3297 }
3298 switch ((ControlRecordTypes)MaybeRecordType.get()) {
3299 case METADATA: {
3300 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3301 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3302 Diag(Record[0] < VERSION_MAJOR ? diag::err_ast_file_version_too_old
3303 : diag::err_ast_file_version_too_new)
3305 return VersionMismatch;
3306 }
3307
3308 bool hasErrors = Record[7];
3309 if (hasErrors && !DisableValidation) {
3310 // If requested by the caller and the module hasn't already been read
3311 // or compiled, mark modules on error as out-of-date.
3312 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3313 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3314 return OutOfDate;
3315
3316 if (!AllowASTWithCompilerErrors) {
3317 Diag(diag::err_ast_file_with_compiler_errors)
3319 return HadErrors;
3320 }
3321 }
3322 if (hasErrors) {
3323 Diags.ErrorOccurred = true;
3324 Diags.UncompilableErrorOccurred = true;
3325 Diags.UnrecoverableErrorOccurred = true;
3326 }
3327
3328 F.RelocatablePCH = Record[4];
3329 // Relative paths in a relocatable PCH are relative to our sysroot.
3330 if (F.RelocatablePCH)
3331 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3332
3334
3335 F.HasTimestamps = Record[6];
3336
3337 const std::string &CurBranch = getClangFullRepositoryVersion();
3338 StringRef ASTBranch = Blob;
3339 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3340 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3341 Diag(diag::err_ast_file_different_branch)
3342 << moduleKindForDiagnostic(F.Kind) << F.FileName << ASTBranch
3343 << CurBranch;
3344 return VersionMismatch;
3345 }
3346 break;
3347 }
3348
3349 case IMPORT: {
3350 // Validate the AST before processing any imports (otherwise, untangling
3351 // them can be error-prone and expensive). A module will have a name and
3352 // will already have been validated, but this catches the PCH case.
3353 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3354 return Result;
3355
3356 unsigned Idx = 0;
3357 // Read information about the AST file.
3358 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3359
3360 // The import location will be the local one for now; we will adjust
3361 // all import locations of module imports after the global source
3362 // location info are setup, in ReadAST.
3363 auto [ImportLoc, ImportModuleFileIndex] =
3364 ReadUntranslatedSourceLocation(Record[Idx++]);
3365 // The import location must belong to the current module file itself.
3366 assert(ImportModuleFileIndex == 0);
3367
3368 StringRef ImportedName = ReadStringBlob(Record, Idx, Blob);
3369
3370 bool IsImportingStdCXXModule = Record[Idx++];
3371
3372 off_t StoredSize = 0;
3373 time_t StoredModTime = 0;
3374 ASTFileSignature StoredSignature;
3375 std::string ImportedFile;
3376 std::string StoredFile;
3377 bool IgnoreImportedByNote = false;
3378
3379 // For prebuilt and explicit modules first consult the file map for
3380 // an override. Note that here we don't search prebuilt module
3381 // directories if we're not importing standard c++ module, only the
3382 // explicit name to file mappings. Also, we will still verify the
3383 // size/signature making sure it is essentially the same file but
3384 // perhaps in a different location.
3385 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3386 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3387 ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3388
3389 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3390 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3391 return Missing;
3392 }
3393
3394 if (!IsImportingStdCXXModule) {
3395 StoredSize = (off_t)Record[Idx++];
3396 StoredModTime = (time_t)Record[Idx++];
3397
3398 StringRef SignatureBytes = Blob.substr(0, ASTFileSignature::size);
3399 StoredSignature = ASTFileSignature::create(SignatureBytes.begin(),
3400 SignatureBytes.end());
3401 Blob = Blob.substr(ASTFileSignature::size);
3402
3403 // Use BaseDirectoryAsWritten to ensure we use the same path in the
3404 // ModuleCache as when writing.
3405 StoredFile = ReadPathBlob(BaseDirectoryAsWritten, Record, Idx, Blob);
3406 if (ImportedFile.empty()) {
3407 ImportedFile = StoredFile;
3408 } else if (!getDiags().isIgnored(
3409 diag::warn_module_file_mapping_mismatch,
3410 CurrentImportLoc)) {
3411 auto ImportedFileRef =
3412 PP.getFileManager().getOptionalFileRef(ImportedFile);
3413 auto StoredFileRef =
3414 PP.getFileManager().getOptionalFileRef(StoredFile);
3415 if ((ImportedFileRef && StoredFileRef) &&
3416 (*ImportedFileRef != *StoredFileRef)) {
3417 Diag(diag::warn_module_file_mapping_mismatch)
3418 << ImportedFile << StoredFile;
3419 Diag(diag::note_module_file_imported_by)
3420 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3421 IgnoreImportedByNote = true;
3422 }
3423 }
3424 }
3425
3426 // If our client can't cope with us being out of date, we can't cope with
3427 // our dependency being missing.
3428 unsigned Capabilities = ClientLoadCapabilities;
3429 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3430 Capabilities &= ~ARR_Missing;
3431
3432 // Load the AST file.
3433 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3434 Loaded, StoredSize, StoredModTime,
3435 StoredSignature, Capabilities);
3436
3437 // Check the AST we just read from ImportedFile contains a different
3438 // module than we expected (ImportedName). This can occur for C++20
3439 // Modules when given a mismatch via -fmodule-file=<name>=<file>
3440 if (IsImportingStdCXXModule) {
3441 if (const auto *Imported =
3442 getModuleManager().lookupByFileName(ImportedFile);
3443 Imported != nullptr && Imported->ModuleName != ImportedName) {
3444 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3445 Result = Missing;
3446 }
3447 }
3448
3449 // If we diagnosed a problem, produce a backtrace.
3450 bool recompilingFinalized = Result == OutOfDate &&
3451 (Capabilities & ARR_OutOfDate) &&
3452 getModuleManager()
3453 .getModuleCache()
3454 .getInMemoryModuleCache()
3455 .isPCMFinal(F.FileName);
3456 if (!IgnoreImportedByNote &&
3457 (isDiagnosedResult(Result, Capabilities) || recompilingFinalized))
3458 Diag(diag::note_module_file_imported_by)
3459 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3460
3461 switch (Result) {
3462 case Failure: return Failure;
3463 // If we have to ignore the dependency, we'll have to ignore this too.
3464 case Missing:
3465 case OutOfDate: return OutOfDate;
3466 case VersionMismatch: return VersionMismatch;
3467 case ConfigurationMismatch: return ConfigurationMismatch;
3468 case HadErrors: return HadErrors;
3469 case Success: break;
3470 }
3471 break;
3472 }
3473
3474 case ORIGINAL_FILE:
3475 F.OriginalSourceFileID = FileID::get(Record[0]);
3476 F.ActualOriginalSourceFileName = std::string(Blob);
3477 F.OriginalSourceFileName = ResolveImportedPathAndAllocate(
3478 PathBuf, F.ActualOriginalSourceFileName, F);
3479 break;
3480
3481 case ORIGINAL_FILE_ID:
3482 F.OriginalSourceFileID = FileID::get(Record[0]);
3483 break;
3484
3485 case MODULE_NAME:
3486 F.ModuleName = std::string(Blob);
3487 Diag(diag::remark_module_import)
3488 << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3489 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3490 if (Listener)
3491 Listener->ReadModuleName(F.ModuleName);
3492
3493 // Validate the AST as soon as we have a name so we can exit early on
3494 // failure.
3495 if (ASTReadResult Result = readUnhashedControlBlockOnce())
3496 return Result;
3497
3498 break;
3499
3500 case MODULE_DIRECTORY: {
3501 // Save the BaseDirectory as written in the PCM for computing the module
3502 // filename for the ModuleCache.
3503 BaseDirectoryAsWritten = Blob;
3504 assert(!F.ModuleName.empty() &&
3505 "MODULE_DIRECTORY found before MODULE_NAME");
3506 F.BaseDirectory = std::string(Blob);
3507 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3508 break;
3509 // If we've already loaded a module map file covering this module, we may
3510 // have a better path for it (relative to the current build).
3511 Module *M = PP.getHeaderSearchInfo().lookupModule(
3512 F.ModuleName, SourceLocation(), /*AllowSearch*/ true,
3513 /*AllowExtraModuleMapSearch*/ true);
3514 if (M && M->Directory) {
3515 // If we're implicitly loading a module, the base directory can't
3516 // change between the build and use.
3517 // Don't emit module relocation error if we have -fno-validate-pch
3518 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3521 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3522 if (!BuildDir || *BuildDir != M->Directory) {
3523 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3524 Diag(diag::err_imported_module_relocated)
3525 << F.ModuleName << Blob << M->Directory->getName();
3526 return OutOfDate;
3527 }
3528 }
3529 F.BaseDirectory = std::string(M->Directory->getName());
3530 }
3531 break;
3532 }
3533
3534 case MODULE_MAP_FILE:
3535 if (ASTReadResult Result =
3536 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3537 return Result;
3538 break;
3539
3540 case INPUT_FILE_OFFSETS:
3541 NumInputs = Record[0];
3542 NumUserInputs = Record[1];
3544 (const llvm::support::unaligned_uint64_t *)Blob.data();
3545 F.InputFilesLoaded.resize(NumInputs);
3546 F.InputFileInfosLoaded.resize(NumInputs);
3547 F.NumUserInputFiles = NumUserInputs;
3548 break;
3549 }
3550 }
3551}
3552
3553llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3554 unsigned ClientLoadCapabilities) {
3555 BitstreamCursor &Stream = F.Stream;
3556
3557 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3558 return Err;
3559 F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3560
3561 // Read all of the records and blocks for the AST file.
3562 RecordData Record;
3563 while (true) {
3564 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3565 if (!MaybeEntry)
3566 return MaybeEntry.takeError();
3567 llvm::BitstreamEntry Entry = MaybeEntry.get();
3568
3569 switch (Entry.Kind) {
3570 case llvm::BitstreamEntry::Error:
3571 return llvm::createStringError(
3572 std::errc::illegal_byte_sequence,
3573 "error at end of module block in AST file");
3574 case llvm::BitstreamEntry::EndBlock:
3575 // Outside of C++, we do not store a lookup map for the translation unit.
3576 // Instead, mark it as needing a lookup map to be built if this module
3577 // contains any declarations lexically within it (which it always does!).
3578 // This usually has no cost, since we very rarely need the lookup map for
3579 // the translation unit outside C++.
3580 if (ASTContext *Ctx = ContextObj) {
3581 DeclContext *DC = Ctx->getTranslationUnitDecl();
3582 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3584 }
3585
3586 return llvm::Error::success();
3587 case llvm::BitstreamEntry::SubBlock:
3588 switch (Entry.ID) {
3589 case DECLTYPES_BLOCK_ID:
3590 // We lazily load the decls block, but we want to set up the
3591 // DeclsCursor cursor to point into it. Clone our current bitcode
3592 // cursor to it, enter the block and read the abbrevs in that block.
3593 // With the main cursor, we just skip over it.
3594 F.DeclsCursor = Stream;
3595 if (llvm::Error Err = Stream.SkipBlock())
3596 return Err;
3597 if (llvm::Error Err = ReadBlockAbbrevs(
3599 return Err;
3600 break;
3601
3603 F.MacroCursor = Stream;
3604 if (!PP.getExternalSource())
3605 PP.setExternalSource(this);
3606
3607 if (llvm::Error Err = Stream.SkipBlock())
3608 return Err;
3609 if (llvm::Error Err =
3610 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3611 return Err;
3612 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3613 break;
3614
3616 F.PreprocessorDetailCursor = Stream;
3617
3618 if (llvm::Error Err = Stream.SkipBlock()) {
3619 return Err;
3620 }
3621 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3623 return Err;
3625 = F.PreprocessorDetailCursor.GetCurrentBitNo();
3626
3627 if (!PP.getPreprocessingRecord())
3628 PP.createPreprocessingRecord();
3629 if (!PP.getPreprocessingRecord()->getExternalSource())
3630 PP.getPreprocessingRecord()->SetExternalSource(*this);
3631 break;
3632
3634 if (llvm::Error Err = ReadSourceManagerBlock(F))
3635 return Err;
3636 break;
3637
3638 case SUBMODULE_BLOCK_ID:
3639 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3640 return Err;
3641 break;
3642
3643 case COMMENTS_BLOCK_ID: {
3644 BitstreamCursor C = Stream;
3645
3646 if (llvm::Error Err = Stream.SkipBlock())
3647 return Err;
3648 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3649 return Err;
3650 CommentsCursors.push_back(std::make_pair(C, &F));
3651 break;
3652 }
3653
3654 default:
3655 if (llvm::Error Err = Stream.SkipBlock())
3656 return Err;
3657 break;
3658 }
3659 continue;
3660
3661 case llvm::BitstreamEntry::Record:
3662 // The interesting case.
3663 break;
3664 }
3665
3666 // Read and process a record.
3667 Record.clear();
3668 StringRef Blob;
3669 Expected<unsigned> MaybeRecordType =
3670 Stream.readRecord(Entry.ID, Record, &Blob);
3671 if (!MaybeRecordType)
3672 return MaybeRecordType.takeError();
3673 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3674
3675 // If we're not loading an AST context, we don't care about most records.
3676 if (!ContextObj) {
3677 switch (RecordType) {
3678 case IDENTIFIER_TABLE:
3679 case IDENTIFIER_OFFSET:
3681 case STATISTICS:
3684 case PP_COUNTER_VALUE:
3686 case MODULE_OFFSET_MAP:
3690 case IMPORTED_MODULES:
3691 case MACRO_OFFSET:
3692 break;
3693 default:
3694 continue;
3695 }
3696 }
3697
3698 switch (RecordType) {
3699 default: // Default behavior: ignore.
3700 break;
3701
3702 case TYPE_OFFSET: {
3703 if (F.LocalNumTypes != 0)
3704 return llvm::createStringError(
3705 std::errc::illegal_byte_sequence,
3706 "duplicate TYPE_OFFSET record in AST file");
3707 F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3708 F.LocalNumTypes = Record[0];
3709 F.BaseTypeIndex = getTotalNumTypes();
3710
3711 if (F.LocalNumTypes > 0)
3712 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3713
3714 break;
3715 }
3716
3717 case DECL_OFFSET: {
3718 if (F.LocalNumDecls != 0)
3719 return llvm::createStringError(
3720 std::errc::illegal_byte_sequence,
3721 "duplicate DECL_OFFSET record in AST file");
3722 F.DeclOffsets = (const DeclOffset *)Blob.data();
3723 F.LocalNumDecls = Record[0];
3724 F.BaseDeclIndex = getTotalNumDecls();
3725
3726 if (F.LocalNumDecls > 0)
3727 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3728
3729 break;
3730 }
3731
3732 case TU_UPDATE_LEXICAL: {
3733 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3734 LexicalContents Contents(
3735 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3736 static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3737 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3739 break;
3740 }
3741
3742 case UPDATE_VISIBLE: {
3743 unsigned Idx = 0;
3744 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3745 auto *Data = (const unsigned char*)Blob.data();
3746 PendingVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3747 // If we've already loaded the decl, perform the updates when we finish
3748 // loading this block.
3749 if (Decl *D = GetExistingDecl(ID))
3750 PendingUpdateRecords.push_back(
3751 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3752 break;
3753 }
3754
3756 unsigned Idx = 0;
3757 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3758 auto *Data = (const unsigned char *)Blob.data();
3759 PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3760 // If we've already loaded the decl, perform the updates when we finish
3761 // loading this block.
3762 if (Decl *D = GetExistingDecl(ID))
3763 PendingUpdateRecords.push_back(
3764 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3765 break;
3766 }
3767
3769 if (F.Kind != MK_MainFile)
3770 break;
3771 unsigned Idx = 0;
3772 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3773 auto *Data = (const unsigned char *)Blob.data();
3774 TULocalUpdates[ID].push_back(UpdateData{&F, Data});
3775 // If we've already loaded the decl, perform the updates when we finish
3776 // loading this block.
3777 if (Decl *D = GetExistingDecl(ID))
3778 PendingUpdateRecords.push_back(
3779 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3780 break;
3781 }
3782
3784 unsigned Idx = 0;
3785 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3786 auto *Data = (const unsigned char *)Blob.data();
3787 PendingSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3788 // If we've already loaded the decl, perform the updates when we finish
3789 // loading this block.
3790 if (Decl *D = GetExistingDecl(ID))
3791 PendingUpdateRecords.push_back(
3792 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3793 break;
3794 }
3795
3797 unsigned Idx = 0;
3798 GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3799 auto *Data = (const unsigned char *)Blob.data();
3800 PendingPartialSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3801 // If we've already loaded the decl, perform the updates when we finish
3802 // loading this block.
3803 if (Decl *D = GetExistingDecl(ID))
3804 PendingUpdateRecords.push_back(
3805 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3806 break;
3807 }
3808
3809 case IDENTIFIER_TABLE:
3811 reinterpret_cast<const unsigned char *>(Blob.data());
3812 if (Record[0]) {
3813 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3815 F.IdentifierTableData + sizeof(uint32_t),
3817 ASTIdentifierLookupTrait(*this, F));
3818
3819 PP.getIdentifierTable().setExternalIdentifierLookup(this);
3820 }
3821 break;
3822
3823 case IDENTIFIER_OFFSET: {
3824 if (F.LocalNumIdentifiers != 0)
3825 return llvm::createStringError(
3826 std::errc::illegal_byte_sequence,
3827 "duplicate IDENTIFIER_OFFSET record in AST file");
3828 F.IdentifierOffsets = (const uint32_t *)Blob.data();
3830 F.BaseIdentifierID = getTotalNumIdentifiers();
3831
3832 if (F.LocalNumIdentifiers > 0)
3833 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3835 break;
3836 }
3837
3839 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3840 break;
3841
3843 // FIXME: Skip reading this record if our ASTConsumer doesn't care
3844 // about "interesting" decls (for instance, if we're building a module).
3845 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3846 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3847 break;
3848
3850 // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3851 // them (ie: if we're not codegenerating this module).
3852 if (F.Kind == MK_MainFile ||
3853 getContext().getLangOpts().BuildingPCHWithObjectFile)
3854 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3855 EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3856 break;
3857
3858 case SPECIAL_TYPES:
3859 if (SpecialTypes.empty()) {
3860 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3861 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3862 break;
3863 }
3864
3865 if (Record.empty())
3866 break;
3867
3868 if (SpecialTypes.size() != Record.size())
3869 return llvm::createStringError(std::errc::illegal_byte_sequence,
3870 "invalid special-types record");
3871
3872 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3873 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3874 if (!SpecialTypes[I])
3875 SpecialTypes[I] = ID;
3876 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3877 // merge step?
3878 }
3879 break;
3880
3881 case STATISTICS:
3882 TotalNumStatements += Record[0];
3883 TotalNumMacros += Record[1];
3884 TotalLexicalDeclContexts += Record[2];
3885 TotalVisibleDeclContexts += Record[3];
3886 TotalModuleLocalVisibleDeclContexts += Record[4];
3887 TotalTULocalVisibleDeclContexts += Record[5];
3888 break;
3889
3891 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3892 UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
3893 break;
3894
3895 case DELEGATING_CTORS:
3896 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3897 DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
3898 break;
3899
3901 if (Record.size() % 3 != 0)
3902 return llvm::createStringError(std::errc::illegal_byte_sequence,
3903 "invalid weak identifiers record");
3904
3905 // FIXME: Ignore weak undeclared identifiers from non-original PCH
3906 // files. This isn't the way to do it :)
3907 WeakUndeclaredIdentifiers.clear();
3908
3909 // Translate the weak, undeclared identifiers into global IDs.
3910 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3911 WeakUndeclaredIdentifiers.push_back(
3912 getGlobalIdentifierID(F, Record[I++]));
3913 WeakUndeclaredIdentifiers.push_back(
3914 getGlobalIdentifierID(F, Record[I++]));
3915 WeakUndeclaredIdentifiers.push_back(
3916 ReadSourceLocation(F, Record, I).getRawEncoding());
3917 }
3918 break;
3919
3920 case SELECTOR_OFFSETS: {
3921 F.SelectorOffsets = (const uint32_t *)Blob.data();
3923 unsigned LocalBaseSelectorID = Record[1];
3924 F.BaseSelectorID = getTotalNumSelectors();
3925
3926 if (F.LocalNumSelectors > 0) {
3927 // Introduce the global -> local mapping for selectors within this
3928 // module.
3929 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3930
3931 // Introduce the local -> global mapping for selectors within this
3932 // module.
3934 std::make_pair(LocalBaseSelectorID,
3935 F.BaseSelectorID - LocalBaseSelectorID));
3936
3937 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3938 }
3939 break;
3940 }
3941
3942 case METHOD_POOL:
3943 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3944 if (Record[0])
3946 = ASTSelectorLookupTable::Create(
3949 ASTSelectorLookupTrait(*this, F));
3950 TotalNumMethodPoolEntries += Record[1];
3951 break;
3952
3954 if (!Record.empty()) {
3955 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3956 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3957 Record[Idx++]));
3958 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3959 getRawEncoding());
3960 }
3961 }
3962 break;
3963
3964 case PP_ASSUME_NONNULL_LOC: {
3965 unsigned Idx = 0;
3966 if (!Record.empty())
3967 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
3968 ReadSourceLocation(F, Record, Idx));
3969 break;
3970 }
3971
3973 if (!Record.empty()) {
3974 SmallVector<SourceLocation, 64> SrcLocs;
3975 unsigned Idx = 0;
3976 while (Idx < Record.size())
3977 SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
3978 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
3979 }
3980 break;
3981 }
3982
3984 if (!Record.empty()) {
3985 unsigned Idx = 0, End = Record.size() - 1;
3986 bool ReachedEOFWhileSkipping = Record[Idx++];
3987 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3988 if (ReachedEOFWhileSkipping) {
3989 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3990 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3991 bool FoundNonSkipPortion = Record[Idx++];
3992 bool FoundElse = Record[Idx++];
3993 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3994 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3995 FoundElse, ElseLoc);
3996 }
3997 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3998 while (Idx < End) {
3999 auto Loc = ReadSourceLocation(F, Record, Idx);
4000 bool WasSkipping = Record[Idx++];
4001 bool FoundNonSkip = Record[Idx++];
4002 bool FoundElse = Record[Idx++];
4003 ConditionalStack.push_back(
4004 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4005 }
4006 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4007 }
4008 break;
4009
4010 case PP_COUNTER_VALUE:
4011 if (!Record.empty() && Listener)
4012 Listener->ReadCounter(F, Record[0]);
4013 break;
4014
4015 case FILE_SORTED_DECLS:
4016 F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
4018 break;
4019
4021 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
4023 SourceLocation::UIntTy SLocSpaceSize = Record[1];
4025 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
4026 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
4027 SLocSpaceSize);
4028 if (!F.SLocEntryBaseID) {
4029 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4030 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4031 return llvm::createStringError(std::errc::invalid_argument,
4032 "ran out of source locations");
4033 }
4034 // Make our entry in the range map. BaseID is negative and growing, so
4035 // we invert it. Because we invert it, though, we need the other end of
4036 // the range.
4037 unsigned RangeStart =
4038 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
4039 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4041
4042 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
4043 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
4044 GlobalSLocOffsetMap.insert(
4045 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
4046 - SLocSpaceSize,&F));
4047
4048 TotalNumSLocEntries += F.LocalNumSLocEntries;
4049 break;
4050 }
4051
4052 case MODULE_OFFSET_MAP:
4053 F.ModuleOffsetMap = Blob;
4054 break;
4055
4057 ParseLineTable(F, Record);
4058 break;
4059
4060 case EXT_VECTOR_DECLS:
4061 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4062 ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
4063 break;
4064
4065 case VTABLE_USES:
4066 if (Record.size() % 3 != 0)
4067 return llvm::createStringError(std::errc::illegal_byte_sequence,
4068 "Invalid VTABLE_USES record");
4069
4070 // Later tables overwrite earlier ones.
4071 // FIXME: Modules will have some trouble with this. This is clearly not
4072 // the right way to do this.
4073 VTableUses.clear();
4074
4075 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
4076 VTableUses.push_back(
4077 {ReadDeclID(F, Record, Idx),
4078 ReadSourceLocation(F, Record, Idx).getRawEncoding(),
4079 (bool)Record[Idx++]});
4080 }
4081 break;
4082
4084
4085 if (Record.size() % 2 != 0)
4086 return llvm::createStringError(
4087 std::errc::illegal_byte_sequence,
4088 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4089
4090 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4091 PendingInstantiations.push_back(
4092 {ReadDeclID(F, Record, I),
4093 ReadSourceLocation(F, Record, I).getRawEncoding()});
4094 }
4095 break;
4096
4097 case SEMA_DECL_REFS:
4098 if (Record.size() != 3)
4099 return llvm::createStringError(std::errc::illegal_byte_sequence,
4100 "Invalid SEMA_DECL_REFS block");
4101 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4102 SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
4103 break;
4104
4105 case PPD_ENTITIES_OFFSETS: {
4106 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
4107 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
4108 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
4109
4110 unsigned LocalBasePreprocessedEntityID = Record[0];
4111
4112 unsigned StartingID;
4113 if (!PP.getPreprocessingRecord())
4114 PP.createPreprocessingRecord();
4115 if (!PP.getPreprocessingRecord()->getExternalSource())
4116 PP.getPreprocessingRecord()->SetExternalSource(*this);
4117 StartingID
4118 = PP.getPreprocessingRecord()
4119 ->allocateLoadedEntities(F.NumPreprocessedEntities);
4120 F.BasePreprocessedEntityID = StartingID;
4121
4122 if (F.NumPreprocessedEntities > 0) {
4123 // Introduce the global -> local mapping for preprocessed entities in
4124 // this module.
4125 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4126
4127 // Introduce the local -> global mapping for preprocessed entities in
4128 // this module.
4130 std::make_pair(LocalBasePreprocessedEntityID,
4131 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
4132 }
4133
4134 break;
4135 }
4136
4137 case PPD_SKIPPED_RANGES: {
4138 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
4139 assert(Blob.size() % sizeof(PPSkippedRange) == 0);
4140 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
4141
4142 if (!PP.getPreprocessingRecord())
4143 PP.createPreprocessingRecord();
4144 if (!PP.getPreprocessingRecord()->getExternalSource())
4145 PP.getPreprocessingRecord()->SetExternalSource(*this);
4146 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
4147 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
4148
4150 GlobalSkippedRangeMap.insert(
4151 std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
4152 break;
4153 }
4154
4156 if (Record.size() % 2 != 0)
4157 return llvm::createStringError(
4158 std::errc::illegal_byte_sequence,
4159 "invalid DECL_UPDATE_OFFSETS block in AST file");
4160 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4161 GlobalDeclID ID = ReadDeclID(F, Record, I);
4162 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
4163
4164 // If we've already loaded the decl, perform the updates when we finish
4165 // loading this block.
4166 if (Decl *D = GetExistingDecl(ID))
4167 PendingUpdateRecords.push_back(
4168 PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4169 }
4170 break;
4171
4173 if (Record.size() % 5 != 0)
4174 return llvm::createStringError(
4175 std::errc::illegal_byte_sequence,
4176 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4177 "file");
4178 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4179 GlobalDeclID ID = ReadDeclID(F, Record, I);
4180
4181 uint64_t BaseOffset = F.DeclsBlockStartOffset;
4182 assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
4183 uint64_t LocalLexicalOffset = Record[I++];
4184 uint64_t LexicalOffset =
4185 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4186 uint64_t LocalVisibleOffset = Record[I++];
4187 uint64_t VisibleOffset =
4188 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4189 uint64_t LocalModuleLocalOffset = Record[I++];
4190 uint64_t ModuleLocalOffset =
4191 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4192 uint64_t TULocalLocalOffset = Record[I++];
4193 uint64_t TULocalOffset =
4194 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4195
4196 DelayedNamespaceOffsetMap[ID] = {
4197 {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
4198
4199 assert(!GetExistingDecl(ID) &&
4200 "We shouldn't load the namespace in the front of delayed "
4201 "namespace lexical and visible block");
4202 }
4203 break;
4204 }
4205
4206 case RELATED_DECLS_MAP:
4207 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4208 GlobalDeclID ID = ReadDeclID(F, Record, I);
4209 auto &RelatedDecls = RelatedDeclsMap[ID];
4210 unsigned NN = Record[I++];
4211 RelatedDecls.reserve(NN);
4212 for (unsigned II = 0; II < NN; II++)
4213 RelatedDecls.push_back(ReadDeclID(F, Record, I));
4214 }
4215 break;
4216
4218 if (F.LocalNumObjCCategoriesInMap != 0)
4219 return llvm::createStringError(
4220 std::errc::illegal_byte_sequence,
4221 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4222
4224 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
4225 break;
4226
4227 case OBJC_CATEGORIES:
4228 F.ObjCCategories.swap(Record);
4229 break;
4230
4232 // Later tables overwrite earlier ones.
4233 // FIXME: Modules will have trouble with this.
4234 CUDASpecialDeclRefs.clear();
4235 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4236 CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
4237 break;
4238
4240 F.HeaderFileInfoTableData = Blob.data();
4242 if (Record[0]) {
4243 F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create(
4244 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
4245 (const unsigned char *)F.HeaderFileInfoTableData,
4246 HeaderFileInfoTrait(*this, F));
4247
4248 PP.getHeaderSearchInfo().SetExternalSource(this);
4249 if (!PP.getHeaderSearchInfo().getExternalLookup())
4250 PP.getHeaderSearchInfo().SetExternalLookup(this);
4251 }
4252 break;
4253
4254 case FP_PRAGMA_OPTIONS:
4255 // Later tables overwrite earlier ones.
4256 FPPragmaOptions.swap(Record);
4257 break;
4258
4260 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4261 DeclsWithEffectsToVerify.push_back(ReadDeclID(F, Record, I));
4262 break;
4263
4264 case OPENCL_EXTENSIONS:
4265 for (unsigned I = 0, E = Record.size(); I != E; ) {
4266 auto Name = ReadString(Record, I);
4267 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4268 OptInfo.Supported = Record[I++] != 0;
4269 OptInfo.Enabled = Record[I++] != 0;
4270 OptInfo.WithPragma = Record[I++] != 0;
4271 OptInfo.Avail = Record[I++];
4272 OptInfo.Core = Record[I++];
4273 OptInfo.Opt = Record[I++];
4274 }
4275 break;
4276
4278 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4279 TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
4280 break;
4281
4282 case KNOWN_NAMESPACES:
4283 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4284 KnownNamespaces.push_back(ReadDeclID(F, Record, I));
4285 break;
4286
4287 case UNDEFINED_BUT_USED:
4288 if (Record.size() % 2 != 0)
4289 return llvm::createStringError(std::errc::illegal_byte_sequence,
4290 "invalid undefined-but-used record");
4291 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4292 UndefinedButUsed.push_back(
4293 {ReadDeclID(F, Record, I),
4294 ReadSourceLocation(F, Record, I).getRawEncoding()});
4295 }
4296 break;
4297
4299 for (unsigned I = 0, N = Record.size(); I != N;) {
4300 DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
4301 const uint64_t Count = Record[I++];
4302 DelayedDeleteExprs.push_back(Count);
4303 for (uint64_t C = 0; C < Count; ++C) {
4304 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
4305 bool IsArrayForm = Record[I++] == 1;
4306 DelayedDeleteExprs.push_back(IsArrayForm);
4307 }
4308 }
4309 break;
4310
4311 case VTABLES_TO_EMIT:
4312 if (F.Kind == MK_MainFile ||
4313 getContext().getLangOpts().BuildingPCHWithObjectFile)
4314 for (unsigned I = 0, N = Record.size(); I != N;)
4315 VTablesToEmit.push_back(ReadDeclID(F, Record, I));
4316 break;
4317
4318 case IMPORTED_MODULES:
4319 if (!F.isModule()) {
4320 // If we aren't loading a module (which has its own exports), make
4321 // all of the imported modules visible.
4322 // FIXME: Deal with macros-only imports.
4323 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
4324 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
4325 SourceLocation Loc = ReadSourceLocation(F, Record, I);
4326 if (GlobalID) {
4327 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4328 if (DeserializationListener)
4329 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4330 }
4331 }
4332 }
4333 break;
4334
4335 case MACRO_OFFSET: {
4336 if (F.LocalNumMacros != 0)
4337 return llvm::createStringError(
4338 std::errc::illegal_byte_sequence,
4339 "duplicate MACRO_OFFSET record in AST file");
4340 F.MacroOffsets = (const uint32_t *)Blob.data();
4341 F.LocalNumMacros = Record[0];
4342 unsigned LocalBaseMacroID = Record[1];
4344 F.BaseMacroID = getTotalNumMacros();
4345
4346 if (F.LocalNumMacros > 0) {
4347 // Introduce the global -> local mapping for macros within this module.
4348 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
4349
4350 // Introduce the local -> global mapping for macros within this module.
4352 std::make_pair(LocalBaseMacroID,
4353 F.BaseMacroID - LocalBaseMacroID));
4354
4355 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
4356 }
4357 break;
4358 }
4359
4361 LateParsedTemplates.emplace_back(
4362 std::piecewise_construct, std::forward_as_tuple(&F),
4363 std::forward_as_tuple(Record.begin(), Record.end()));
4364 break;
4365
4367 if (Record.size() != 1)
4368 return llvm::createStringError(std::errc::illegal_byte_sequence,
4369 "invalid pragma optimize record");
4370 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
4371 break;
4372
4374 if (Record.size() != 1)
4375 return llvm::createStringError(std::errc::illegal_byte_sequence,
4376 "invalid pragma ms_struct record");
4377 PragmaMSStructState = Record[0];
4378 break;
4379
4381 if (Record.size() != 2)
4382 return llvm::createStringError(
4383 std::errc::illegal_byte_sequence,
4384 "invalid pragma pointers to members record");
4385 PragmaMSPointersToMembersState = Record[0];
4386 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4387 break;
4388
4390 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4391 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4392 break;
4393
4395 if (Record.size() != 1)
4396 return llvm::createStringError(std::errc::illegal_byte_sequence,
4397 "invalid cuda pragma options record");
4398 ForceHostDeviceDepth = Record[0];
4399 break;
4400
4402 if (Record.size() < 3)
4403 return llvm::createStringError(std::errc::illegal_byte_sequence,
4404 "invalid pragma pack record");
4405 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4406 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4407 unsigned NumStackEntries = Record[2];
4408 unsigned Idx = 3;
4409 // Reset the stack when importing a new module.
4410 PragmaAlignPackStack.clear();
4411 for (unsigned I = 0; I < NumStackEntries; ++I) {
4412 PragmaAlignPackStackEntry Entry;
4413 Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4414 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4415 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4416 PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4417 Entry.SlotLabel = PragmaAlignPackStrings.back();
4418 PragmaAlignPackStack.push_back(Entry);
4419 }
4420 break;
4421 }
4422
4424 if (Record.size() < 3)
4425 return llvm::createStringError(std::errc::illegal_byte_sequence,
4426 "invalid pragma float control record");
4427 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4428 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4429 unsigned NumStackEntries = Record[2];
4430 unsigned Idx = 3;
4431 // Reset the stack when importing a new module.
4432 FpPragmaStack.clear();
4433 for (unsigned I = 0; I < NumStackEntries; ++I) {
4434 FpPragmaStackEntry Entry;
4435 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4436 Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4437 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4438 FpPragmaStrings.push_back(ReadString(Record, Idx));
4439 Entry.SlotLabel = FpPragmaStrings.back();
4440 FpPragmaStack.push_back(Entry);
4441 }
4442 break;
4443 }
4444
4446 for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4447 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4448 break;
4449 }
4450 }
4451}
4452
4453void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4454 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4455
4456 // Additional remapping information.
4457 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4458 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4459 F.ModuleOffsetMap = StringRef();
4460
4462 RemapBuilder MacroRemap(F.MacroRemap);
4463 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
4464 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4465 RemapBuilder SelectorRemap(F.SelectorRemap);
4466
4467 auto &ImportedModuleVector = F.TransitiveImports;
4468 assert(ImportedModuleVector.empty());
4469
4470 while (Data < DataEnd) {
4471 // FIXME: Looking up dependency modules by filename is horrible. Let's
4472 // start fixing this with prebuilt, explicit and implicit modules and see
4473 // how it goes...
4474 using namespace llvm::support;
4475 ModuleKind Kind = static_cast<ModuleKind>(
4476 endian::readNext<uint8_t, llvm::endianness::little>(Data));
4477 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4478 StringRef Name = StringRef((const char*)Data, Len);
4479 Data += Len;
4482 ? ModuleMgr.lookupByModuleName(Name)
4483 : ModuleMgr.lookupByFileName(Name));
4484 if (!OM) {
4485 std::string Msg = "refers to unknown module, cannot find ";
4486 Msg.append(std::string(Name));
4487 Error(Msg);
4488 return;
4489 }
4490
4491 ImportedModuleVector.push_back(OM);
4492
4493 uint32_t MacroIDOffset =
4494 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4495 uint32_t PreprocessedEntityIDOffset =
4496 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4497 uint32_t SubmoduleIDOffset =
4498 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4499 uint32_t SelectorIDOffset =
4500 endian::readNext<uint32_t, llvm::endianness::little>(Data);
4501
4502 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4503 RemapBuilder &Remap) {
4504 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4505 if (Offset != None)
4506 Remap.insert(std::make_pair(Offset,
4507 static_cast<int>(BaseOffset - Offset)));
4508 };
4509
4510 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
4511 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
4512 PreprocessedEntityRemap);
4513 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4514 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4515 }
4516}
4517
4519ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4520 const ModuleFile *ImportedBy,
4521 unsigned ClientLoadCapabilities) {
4522 unsigned Idx = 0;
4523 F.ModuleMapPath = ReadPath(F, Record, Idx);
4524
4525 // Try to resolve ModuleName in the current header search context and
4526 // verify that it is found in the same module map file as we saved. If the
4527 // top-level AST file is a main file, skip this check because there is no
4528 // usable header search context.
4529 assert(!F.ModuleName.empty() &&
4530 "MODULE_NAME should come before MODULE_MAP_FILE");
4531 if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4532 F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
4533 // An implicitly-loaded module file should have its module listed in some
4534 // module map file that we've already loaded.
4535 Module *M =
4536 PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc);
4537 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4538 OptionalFileEntryRef ModMap =
4539 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4540 // Don't emit module relocation error if we have -fno-validate-pch
4541 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4543 !ModMap) {
4544 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4545 if (auto ASTFE = M ? M->getASTFile() : std::nullopt) {
4546 // This module was defined by an imported (explicit) module.
4547 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
4548 << ASTFE->getName();
4549 // TODO: Add a note with the module map paths if they differ.
4550 } else {
4551 // This module was built with a different module map.
4552 Diag(diag::err_imported_module_not_found)
4553 << F.ModuleName << F.FileName
4554 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
4555 << !ImportedBy;
4556 // In case it was imported by a PCH, there's a chance the user is
4557 // just missing to include the search path to the directory containing
4558 // the modulemap.
4559 if (ImportedBy && ImportedBy->Kind == MK_PCH)
4560 Diag(diag::note_imported_by_pch_module_not_found)
4561 << llvm::sys::path::parent_path(F.ModuleMapPath);
4562 }
4563 }
4564 return OutOfDate;
4565 }
4566
4567 assert(M && M->Name == F.ModuleName && "found module with different name");
4568
4569 // Check the primary module map file.
4570 auto StoredModMap = FileMgr.getOptionalFileRef(F.ModuleMapPath);
4571 if (!StoredModMap || *StoredModMap != ModMap) {
4572 assert(ModMap && "found module is missing module map file");
4573 assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4574 "top-level import should be verified");
4575 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4576 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4577 Diag(diag::err_imported_module_modmap_changed)
4578 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4579 << ModMap->getName() << F.ModuleMapPath << NotImported;
4580 return OutOfDate;
4581 }
4582
4583 ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4584 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4585 // FIXME: we should use input files rather than storing names.
4586 std::string Filename = ReadPath(F, Record, Idx);
4587 auto SF = FileMgr.getOptionalFileRef(Filename, false, false);
4588 if (!SF) {
4589 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4590 Error("could not find file '" + Filename +"' referenced by AST file");
4591 return OutOfDate;
4592 }
4593 AdditionalStoredMaps.insert(*SF);
4594 }
4595
4596 // Check any additional module map files (e.g. module.private.modulemap)
4597 // that are not in the pcm.
4598 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4599 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4600 // Remove files that match
4601 // Note: SmallPtrSet::erase is really remove
4602 if (!AdditionalStoredMaps.erase(ModMap)) {
4603 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4604 Diag(diag::err_module_different_modmap)
4605 << F.ModuleName << /*new*/0 << ModMap.getName();
4606 return OutOfDate;
4607 }
4608 }
4609 }
4610
4611 // Check any additional module map files that are in the pcm, but not
4612 // found in header search. Cases that match are already removed.
4613 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4614 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4615 Diag(diag::err_module_different_modmap)
4616 << F.ModuleName << /*not new*/1 << ModMap.getName();
4617 return OutOfDate;
4618 }
4619 }
4620
4621 if (Listener)
4622 Listener->ReadModuleMapFile(F.ModuleMapPath);
4623 return Success;
4624}
4625
4626/// Move the given method to the back of the global list of methods.
4628 // Find the entry for this selector in the method pool.
4629 SemaObjC::GlobalMethodPool::iterator Known =
4630 S.ObjC().MethodPool.find(Method->getSelector());
4631 if (Known == S.ObjC().MethodPool.end())
4632 return;
4633
4634 // Retrieve the appropriate method list.
4635 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4636 : Known->second.second;
4637 bool Found = false;
4638 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4639 if (!Found) {
4640 if (List->getMethod() == Method) {
4641 Found = true;
4642 } else {
4643 // Keep searching.
4644 continue;
4645 }
4646 }
4647
4648 if (List->getNext())
4649 List->setMethod(List->getNext()->getMethod());
4650 else
4651 List->setMethod(Method);
4652 }
4653}
4654
4655void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4656 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4657 for (Decl *D : Names) {
4658 bool wasHidden = !D->isUnconditionallyVisible();
4660
4661 if (wasHidden && SemaObj) {
4662 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4664 }
4665 }
4666 }
4667}
4668
4670 Module::NameVisibilityKind NameVisibility,
4671 SourceLocation ImportLoc) {
4674 Stack.push_back(Mod);
4675 while (!Stack.empty()) {
4676 Mod = Stack.pop_back_val();
4677
4678 if (NameVisibility <= Mod->NameVisibility) {
4679 // This module already has this level of visibility (or greater), so
4680 // there is nothing more to do.
4681 continue;
4682 }
4683
4684 if (Mod->isUnimportable()) {
4685 // Modules that aren't importable cannot be made visible.
4686 continue;
4687 }
4688
4689 // Update the module's name visibility.
4690 Mod->NameVisibility = NameVisibility;
4691
4692 // If we've already deserialized any names from this module,
4693 // mark them as visible.
4694 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4695 if (Hidden != HiddenNamesMap.end()) {
4696 auto HiddenNames = std::move(*Hidden);
4697 HiddenNamesMap.erase(Hidden);
4698 makeNamesVisible(HiddenNames.second, HiddenNames.first);
4699 assert(!HiddenNamesMap.contains(Mod) &&
4700 "making names visible added hidden names");
4701 }
4702
4703 // Push any exported modules onto the stack to be marked as visible.
4705 Mod->getExportedModules(Exports);
4707 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4708 Module *Exported = *I;
4709 if (Visited.insert(Exported).second)
4710 Stack.push_back(Exported);
4711 }
4712 }
4713}
4714
4715/// We've merged the definition \p MergedDef into the existing definition
4716/// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4717/// visible.
4719 NamedDecl *MergedDef) {
4720 if (!Def->isUnconditionallyVisible()) {
4721 // If MergedDef is visible or becomes visible, make the definition visible.
4722 if (MergedDef->isUnconditionallyVisible())
4724 else {
4725 getContext().mergeDefinitionIntoModule(
4726 Def, MergedDef->getImportedOwningModule(),
4727 /*NotifyListeners*/ false);
4728 PendingMergedDefinitionsToDeduplicate.insert(Def);
4729 }
4730 }
4731}
4732
4734 if (GlobalIndex)
4735 return false;
4736
4737 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4738 !PP.getLangOpts().Modules)
4739 return true;
4740
4741 // Try to load the global index.
4742 TriedLoadingGlobalIndex = true;
4743 StringRef ModuleCachePath
4744 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
4745 std::pair<GlobalModuleIndex *, llvm::Error> Result =
4746 GlobalModuleIndex::readIndex(ModuleCachePath);
4747 if (llvm::Error Err = std::move(Result.second)) {
4748 assert(!Result.first);
4749 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4750 return true;
4751 }
4752
4753 GlobalIndex.reset(Result.first);
4754 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4755 return false;
4756}
4757
4759 return PP.getLangOpts().Modules && UseGlobalIndex &&
4760 !hasGlobalIndex() && TriedLoadingGlobalIndex;
4761}
4762
4763/// Given a cursor at the start of an AST file, scan ahead and drop the
4764/// cursor into the start of the given block ID, returning false on success and
4765/// true on failure.
4766static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4767 while (true) {
4768 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4769 if (!MaybeEntry) {
4770 // FIXME this drops errors on the floor.
4771 consumeError(MaybeEntry.takeError());
4772 return true;
4773 }
4774 llvm::BitstreamEntry Entry = MaybeEntry.get();
4775
4776 switch (Entry.Kind) {
4777 case llvm::BitstreamEntry::Error:
4778 case llvm::BitstreamEntry::EndBlock:
4779 return true;
4780
4781 case llvm::BitstreamEntry::Record:
4782 // Ignore top-level records.
4783 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4784 break;
4785 else {
4786 // FIXME this drops errors on the floor.
4787 consumeError(Skipped.takeError());
4788 return true;
4789 }
4790
4791 case llvm::BitstreamEntry::SubBlock:
4792 if (Entry.ID == BlockID) {
4793 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4794 // FIXME this drops the error on the floor.
4795 consumeError(std::move(Err));
4796 return true;
4797 }
4798 // Found it!
4799 return false;
4800 }
4801
4802 if (llvm::Error Err = Cursor.SkipBlock()) {
4803 // FIXME this drops the error on the floor.
4804 consumeError(std::move(Err));
4805 return true;
4806 }
4807 }
4808 }
4809}
4810
4812 SourceLocation ImportLoc,
4813 unsigned ClientLoadCapabilities,
4814 ModuleFile **NewLoadedModuleFile) {
4815 llvm::TimeTraceScope scope("ReadAST", FileName);
4816
4817 llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4819 CurrentDeserializingModuleKind, Type);
4820
4821 // Defer any pending actions until we get to the end of reading the AST file.
4822 Deserializing AnASTFile(this);
4823
4824 // Bump the generation number.
4825 unsigned PreviousGeneration = 0;
4826 if (ContextObj)
4827 PreviousGeneration = incrementGeneration(*ContextObj);
4828
4829 unsigned NumModules = ModuleMgr.size();
4831 if (ASTReadResult ReadResult =
4832 ReadASTCore(FileName, Type, ImportLoc,
4833 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
4834 ClientLoadCapabilities)) {
4835 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4836
4837 // If we find that any modules are unusable, the global index is going
4838 // to be out-of-date. Just remove it.
4839 GlobalIndex.reset();
4840 ModuleMgr.setGlobalIndex(nullptr);
4841 return ReadResult;
4842 }
4843
4844 if (NewLoadedModuleFile && !Loaded.empty())
4845 *NewLoadedModuleFile = Loaded.back().Mod;
4846
4847 // Here comes stuff that we only do once the entire chain is loaded. Do *not*
4848 // remove modules from this point. Various fields are updated during reading
4849 // the AST block and removing the modules would result in dangling pointers.
4850 // They are generally only incidentally dereferenced, ie. a binary search
4851 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
4852 // be dereferenced but it wouldn't actually be used.
4853
4854 // Load the AST blocks of all of the modules that we loaded. We can still
4855 // hit errors parsing the ASTs at this point.
4856 for (ImportedModule &M : Loaded) {
4857 ModuleFile &F = *M.Mod;
4858 llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
4859
4860 // Read the AST block.
4861 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4862 Error(std::move(Err));
4863 return Failure;
4864 }
4865
4866 // The AST block should always have a definition for the main module.
4867 if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4868 Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4869 return Failure;
4870 }
4871
4872 // Read the extension blocks.
4874 if (llvm::Error Err = ReadExtensionBlock(F)) {
4875 Error(std::move(Err));
4876 return Failure;
4877 }
4878 }
4879
4880 // Once read, set the ModuleFile bit base offset and update the size in
4881 // bits of all files we've seen.
4882 F.GlobalBitOffset = TotalModulesSizeInBits;
4883 TotalModulesSizeInBits += F.SizeInBits;
4884 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4885 }
4886
4887 // Preload source locations and interesting indentifiers.
4888 for (ImportedModule &M : Loaded) {
4889 ModuleFile &F = *M.Mod;
4890
4891 // Map the original source file ID into the ID space of the current
4892 // compilation.
4895
4896 for (auto Offset : F.PreloadIdentifierOffsets) {
4897 const unsigned char *Data = F.IdentifierTableData + Offset;
4898
4899 ASTIdentifierLookupTrait Trait(*this, F);
4900 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4901 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4902
4903 IdentifierInfo *II;
4904 if (!PP.getLangOpts().CPlusPlus) {
4905 // Identifiers present in both the module file and the importing
4906 // instance are marked out-of-date so that they can be deserialized
4907 // on next use via ASTReader::updateOutOfDateIdentifier().
4908 // Identifiers present in the module file but not in the importing
4909 // instance are ignored for now, preventing growth of the identifier
4910 // table. They will be deserialized on first use via ASTReader::get().
4911 auto It = PP.getIdentifierTable().find(Key);
4912 if (It == PP.getIdentifierTable().end())
4913 continue;
4914 II = It->second;
4915 } else {
4916 // With C++ modules, not many identifiers are considered interesting.
4917 // All identifiers in the module file can be placed into the identifier
4918 // table of the importing instance and marked as out-of-date. This makes
4919 // ASTReader::get() a no-op, and deserialization will take place on
4920 // first/next use via ASTReader::updateOutOfDateIdentifier().
4921 II = &PP.getIdentifierTable().getOwn(Key);
4922 }
4923
4924 II->setOutOfDate(true);
4925
4926 // Mark this identifier as being from an AST file so that we can track
4927 // whether we need to serialize it.
4928 markIdentifierFromAST(*this, *II, /*IsModule=*/true);
4929
4930 // Associate the ID with the identifier so that the writer can reuse it.
4931 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4932 SetIdentifierInfo(ID, II);
4933 }
4934 }
4935
4936 // Builtins and library builtins have already been initialized. Mark all
4937 // identifiers as out-of-date, so that they are deserialized on first use.
4938 if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
4939 for (auto &Id : PP.getIdentifierTable())
4940 Id.second->setOutOfDate(true);
4941
4942 // Mark selectors as out of date.
4943 for (const auto &Sel : SelectorGeneration)
4944 SelectorOutOfDate[Sel.first] = true;
4945
4946 // Setup the import locations and notify the module manager that we've
4947 // committed to these module files.
4948 for (ImportedModule &M : Loaded) {
4949 ModuleFile &F = *M.Mod;
4950
4951 ModuleMgr.moduleFileAccepted(&F);
4952
4953 // Set the import location.
4954 F.DirectImportLoc = ImportLoc;
4955 // FIXME: We assume that locations from PCH / preamble do not need
4956 // any translation.
4957 if (!M.ImportedBy)
4958 F.ImportLoc = M.ImportLoc;
4959 else
4960 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
4961 }
4962
4963 // Resolve any unresolved module exports.
4964 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4965 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4967 Module *ResolvedMod = getSubmodule(GlobalID);
4968
4969 switch (Unresolved.Kind) {
4970 case UnresolvedModuleRef::Conflict:
4971 if (ResolvedMod) {
4972 Module::Conflict Conflict;
4973 Conflict.Other = ResolvedMod;
4974 Conflict.Message = Unresolved.String.str();
4975 Unresolved.Mod->Conflicts.push_back(Conflict);
4976 }
4977 continue;
4978
4979 case UnresolvedModuleRef::Import:
4980 if (ResolvedMod)
4981 Unresolved.Mod->Imports.insert(ResolvedMod);
4982 continue;
4983
4984 case UnresolvedModuleRef::Affecting:
4985 if (ResolvedMod)
4986 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4987 continue;
4988
4989 case UnresolvedModuleRef::Export:
4990 if (ResolvedMod || Unresolved.IsWildcard)
4991 Unresolved.Mod->Exports.push_back(
4992 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4993 continue;
4994 }
4995 }
4996 UnresolvedModuleRefs.clear();
4997
4998 // FIXME: How do we load the 'use'd modules? They may not be submodules.
4999 // Might be unnecessary as use declarations are only used to build the
5000 // module itself.
5001
5002 if (ContextObj)
5004
5005 if (SemaObj)
5006 UpdateSema();
5007
5008 if (DeserializationListener)
5009 DeserializationListener->ReaderInitialized(this);
5010
5011 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5012 if (PrimaryModule.OriginalSourceFileID.isValid()) {
5013 // If this AST file is a precompiled preamble, then set the
5014 // preamble file ID of the source manager to the file source file
5015 // from which the preamble was built.
5016 if (Type == MK_Preamble) {
5017 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
5018 } else if (Type == MK_MainFile) {
5019 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
5020 }
5021 }
5022
5023 // For any Objective-C class definitions we have already loaded, make sure
5024 // that we load any additional categories.
5025 if (ContextObj) {
5026 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5027 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5028 ObjCClassesLoaded[I], PreviousGeneration);
5029 }
5030 }
5031
5032 const HeaderSearchOptions &HSOpts =
5033 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5035 // Now we are certain that the module and all modules it depends on are
5036 // up-to-date. For implicitly-built module files, ensure the corresponding
5037 // timestamp files are up-to-date in this build session.
5038 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5039 ImportedModule &M = Loaded[I];
5040 if (M.Mod->Kind == MK_ImplicitModule &&
5042 getModuleManager().getModuleCache().updateModuleTimestamp(
5043 M.Mod->FileName);
5044 }
5045 }
5046
5047 return Success;
5048}
5049
5050static ASTFileSignature readASTFileSignature(StringRef PCH);
5051
5052/// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
5053static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
5054 // FIXME checking magic headers is done in other places such as
5055 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
5056 // always done the same. Unify it all with a helper.
5057 if (!Stream.canSkipToPos(4))
5058 return llvm::createStringError(
5059 std::errc::illegal_byte_sequence,
5060 "file too small to contain precompiled file magic");
5061 for (unsigned C : {'C', 'P', 'C', 'H'})
5062 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
5063 if (Res.get() != C)
5064 return llvm::createStringError(
5065 std::errc::illegal_byte_sequence,
5066 "file doesn't start with precompiled file magic");
5067 } else
5068 return Res.takeError();
5069 return llvm::Error::success();
5070}
5071
5073 switch (Kind) {
5074 case MK_PCH:
5075 return 0; // PCH
5076 case MK_ImplicitModule:
5077 case MK_ExplicitModule:
5078 case MK_PrebuiltModule:
5079 return 1; // module
5080 case MK_MainFile:
5081 case MK_Preamble:
5082 return 2; // main source file
5083 }
5084 llvm_unreachable("unknown module kind");
5085}
5086
5088ASTReader::ReadASTCore(StringRef FileName,
5090 SourceLocation ImportLoc,
5091 ModuleFile *ImportedBy,
5092 SmallVectorImpl<ImportedModule> &Loaded,
5093 off_t ExpectedSize, time_t ExpectedModTime,
5094 ASTFileSignature ExpectedSignature,
5095 unsigned ClientLoadCapabilities) {
5096 ModuleFile *M;
5097 std::string ErrorStr;
5099 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
5100 getGeneration(), ExpectedSize, ExpectedModTime,
5101 ExpectedSignature, readASTFileSignature,
5102 M, ErrorStr);
5103
5104 switch (AddResult) {
5106 Diag(diag::remark_module_import)
5107 << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5108 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5109 return Success;
5110
5112 // Load module file below.
5113 break;
5114
5116 // The module file was missing; if the client can handle that, return
5117 // it.
5118 if (ClientLoadCapabilities & ARR_Missing)
5119 return Missing;
5120
5121 // Otherwise, return an error.
5122 Diag(diag::err_ast_file_not_found)
5123 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
5124 << ErrorStr;
5125 return Failure;
5126
5128 // We couldn't load the module file because it is out-of-date. If the
5129 // client can handle out-of-date, return it.
5130 if (ClientLoadCapabilities & ARR_OutOfDate)
5131 return OutOfDate;
5132
5133 // Otherwise, return an error.
5134 Diag(diag::err_ast_file_out_of_date)
5135 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
5136 << ErrorStr;
5137 return Failure;
5138 }
5139
5140 assert(M && "Missing module file");
5141
5142 bool ShouldFinalizePCM = false;
5143 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
5144 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5145 if (ShouldFinalizePCM)
5146 MC.finalizePCM(FileName);
5147 else
5148 MC.tryToDropPCM(FileName);
5149 });
5150 ModuleFile &F = *M;
5151 BitstreamCursor &Stream = F.Stream;
5152 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5153 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5154
5155 // Sniff for the signature.
5156 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5157 Diag(diag::err_ast_file_invalid)
5158 << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5159 return Failure;
5160 }
5161
5162 // This is used for compatibility with older PCH formats.
5163 bool HaveReadControlBlock = false;
5164 while (true) {
5165 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5166 if (!MaybeEntry) {
5167 Error(MaybeEntry.takeError());
5168 return Failure;
5169 }
5170 llvm::BitstreamEntry Entry = MaybeEntry.get();
5171
5172 switch (Entry.Kind) {
5173 case llvm::BitstreamEntry::Error:
5174 case llvm::BitstreamEntry::Record:
5175 case llvm::BitstreamEntry::EndBlock:
5176 Error("invalid record at top-level of AST file");
5177 return Failure;
5178
5179 case llvm::BitstreamEntry::SubBlock:
5180 break;
5181 }
5182
5183 switch (Entry.ID) {
5184 case CONTROL_BLOCK_ID:
5185 HaveReadControlBlock = true;
5186 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5187 case Success:
5188 // Check that we didn't try to load a non-module AST file as a module.
5189 //
5190 // FIXME: Should we also perform the converse check? Loading a module as
5191 // a PCH file sort of works, but it's a bit wonky.
5193 Type == MK_PrebuiltModule) &&
5194 F.ModuleName.empty()) {
5195 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
5196 if (Result != OutOfDate ||
5197 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5198 Diag(diag::err_module_file_not_module) << FileName;
5199 return Result;
5200 }
5201 break;
5202
5203 case Failure: return Failure;
5204 case Missing: return Missing;
5205 case OutOfDate: return OutOfDate;
5206 case VersionMismatch: return VersionMismatch;
5207 case ConfigurationMismatch: return ConfigurationMismatch;
5208 case HadErrors: return HadErrors;
5209 }
5210 break;
5211
5212 case AST_BLOCK_ID:
5213 if (!HaveReadControlBlock) {
5214 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5215 Diag(diag::err_ast_file_version_too_old)
5217 return VersionMismatch;
5218 }
5219
5220 // Record that we've loaded this module.
5221 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5222 ShouldFinalizePCM = true;
5223 return Success;
5224
5225 default:
5226 if (llvm::Error Err = Stream.SkipBlock()) {
5227 Error(std::move(Err));
5228 return Failure;
5229 }
5230 break;
5231 }
5232 }
5233
5234 llvm_unreachable("unexpected break; expected return");
5235}
5236
5238ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5239 unsigned ClientLoadCapabilities) {
5240 const HeaderSearchOptions &HSOpts =
5241 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5242 bool AllowCompatibleConfigurationMismatch =
5244 bool DisableValidation = shouldDisableValidationForFile(F);
5245
5246 ASTReadResult Result = readUnhashedControlBlockImpl(
5247 &F, F.Data, F.FileName, ClientLoadCapabilities,
5248 AllowCompatibleConfigurationMismatch, Listener.get(),
5249 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5250
5251 // If F was directly imported by another module, it's implicitly validated by
5252 // the importing module.
5253 if (DisableValidation || WasImportedBy ||
5254 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5255 return Success;
5256
5257 if (Result == Failure) {
5258 Error("malformed block record in AST file");
5259 return Failure;
5260 }
5261
5262 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5263 // If this module has already been finalized in the ModuleCache, we're stuck
5264 // with it; we can only load a single version of each module.
5265 //
5266 // This can happen when a module is imported in two contexts: in one, as a
5267 // user module; in another, as a system module (due to an import from
5268 // another module marked with the [system] flag). It usually indicates a
5269 // bug in the module map: this module should also be marked with [system].
5270 //
5271 // If -Wno-system-headers (the default), and the first import is as a
5272 // system module, then validation will fail during the as-user import,
5273 // since -Werror flags won't have been validated. However, it's reasonable
5274 // to treat this consistently as a system module.
5275 //
5276 // If -Wsystem-headers, the PCM on disk was built with
5277 // -Wno-system-headers, and the first import is as a user module, then
5278 // validation will fail during the as-system import since the PCM on disk
5279 // doesn't guarantee that -Werror was respected. However, the -Werror
5280 // flags were checked during the initial as-user import.
5281 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5282 F.FileName)) {
5283 Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5284 return Success;
5285 }
5286 }
5287
5288 return Result;
5289}
5290
5291ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5292 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5293 unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5294 ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5295 // Initialize a stream.
5296 BitstreamCursor Stream(StreamData);
5297
5298 // Sniff for the signature.
5299 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5300 // FIXME this drops the error on the floor.
5301 consumeError(std::move(Err));
5302 return Failure;
5303 }
5304
5305 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5307 return Failure;
5308
5309 // Read all of the records in the options block.
5310 RecordData Record;
5311 ASTReadResult Result = Success;
5312 while (true) {
5313 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5314 if (!MaybeEntry) {
5315 // FIXME this drops the error on the floor.
5316 consumeError(MaybeEntry.takeError());
5317 return Failure;
5318 }
5319 llvm::BitstreamEntry Entry = MaybeEntry.get();
5320
5321 switch (Entry.Kind) {
5322 case llvm::BitstreamEntry::Error:
5323 case llvm::BitstreamEntry::SubBlock:
5324 return Failure;
5325
5326 case llvm::BitstreamEntry::EndBlock:
5327 return Result;
5328
5329 case llvm::BitstreamEntry::Record:
5330 // The interesting case.
5331 break;
5332 }
5333
5334 // Read and process a record.
5335 Record.clear();
5336 StringRef Blob;
5337 Expected<unsigned> MaybeRecordType =
5338 Stream.readRecord(Entry.ID, Record, &Blob);
5339 if (!MaybeRecordType) {
5340 // FIXME this drops the error.
5341 return Failure;
5342 }
5343 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5344 case SIGNATURE:
5345 if (F) {
5346 F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5348 "Dummy AST file signature not backpatched in ASTWriter.");
5349 }
5350 break;
5351 case AST_BLOCK_HASH:
5352 if (F) {
5353 F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5355 "Dummy AST block hash not backpatched in ASTWriter.");
5356 }
5357 break;
5358 case DIAGNOSTIC_OPTIONS: {
5359 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5360 if (Listener && ValidateDiagnosticOptions &&
5361 !AllowCompatibleConfigurationMismatch &&
5362 ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5363 Result = OutOfDate; // Don't return early. Read the signature.
5364 break;
5365 }
5366 case HEADER_SEARCH_PATHS: {
5367 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5368 if (Listener && !AllowCompatibleConfigurationMismatch &&
5369 ParseHeaderSearchPaths(Record, Complain, *Listener))
5370 Result = ConfigurationMismatch;
5371 break;
5372 }
5374 if (!F)
5375 break;
5376 if (F->PragmaDiagMappings.empty())
5377 F->PragmaDiagMappings.swap(Record);
5378 else
5379 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5380 Record.begin(), Record.end());
5381 break;
5383 if (F)
5384 F->SearchPathUsage = ReadBitVector(Record, Blob);
5385 break;
5386 case VFS_USAGE:
5387 if (F)
5388 F->VFSUsage = ReadBitVector(Record, Blob);
5389 break;
5390 }
5391 }
5392}
5393
5394/// Parse a record and blob containing module file extension metadata.
5397 StringRef Blob,
5398 ModuleFileExtensionMetadata &Metadata) {
5399 if (Record.size() < 4) return true;
5400
5401 Metadata.MajorVersion = Record[0];
5402 Metadata.MinorVersion = Record[1];
5403
5404 unsigned BlockNameLen = Record[2];
5405 unsigned UserInfoLen = Record[3];
5406
5407 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5408
5409 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5410 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5411 Blob.data() + BlockNameLen + UserInfoLen);
5412 return false;
5413}
5414
5415llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5416 BitstreamCursor &Stream = F.Stream;
5417
5418 RecordData Record;
5419 while (true) {
5420 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5421 if (!MaybeEntry)
5422 return MaybeEntry.takeError();
5423 llvm::BitstreamEntry Entry = MaybeEntry.get();
5424
5425 switch (Entry.Kind) {
5426 case llvm::BitstreamEntry::SubBlock:
5427 if (llvm::Error Err = Stream.SkipBlock())
5428 return Err;
5429 continue;
5430 case llvm::BitstreamEntry::EndBlock:
5431 return llvm::Error::success();
5432 case llvm::BitstreamEntry::Error:
5433 return llvm::createStringError(std::errc::illegal_byte_sequence,
5434 "malformed block record in AST file");
5435 case llvm::BitstreamEntry::Record:
5436 break;
5437 }
5438
5439 Record.clear();
5440 StringRef Blob;
5441 Expected<unsigned> MaybeRecCode =
5442 Stream.readRecord(Entry.ID, Record, &Blob);
5443 if (!MaybeRecCode)
5444 return MaybeRecCode.takeError();
5445 switch (MaybeRecCode.get()) {
5446 case EXTENSION_METADATA: {
5447 ModuleFileExtensionMetadata Metadata;
5448 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5449 return llvm::createStringError(
5450 std::errc::illegal_byte_sequence,
5451 "malformed EXTENSION_METADATA in AST file");
5452
5453 // Find a module file extension with this block name.
5454 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5455 if (Known == ModuleFileExtensions.end()) break;
5456
5457 // Form a reader.
5458 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5459 F, Stream)) {
5460 F.ExtensionReaders.push_back(std::move(Reader));
5461 }
5462
5463 break;
5464 }
5465 }
5466 }
5467
5468 llvm_unreachable("ReadExtensionBlock should return from while loop");
5469}
5470
5472 assert(ContextObj && "no context to initialize");
5473 ASTContext &Context = *ContextObj;
5474
5475 // If there's a listener, notify them that we "read" the translation unit.
5476 if (DeserializationListener)
5477 DeserializationListener->DeclRead(
5479 Context.getTranslationUnitDecl());
5480
5481 // FIXME: Find a better way to deal with collisions between these
5482 // built-in types. Right now, we just ignore the problem.
5483
5484 // Load the special types.
5485 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5486 if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5487 if (!Context.CFConstantStringTypeDecl)
5488 Context.setCFConstantStringType(GetType(String));
5489 }
5490
5491 if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5492 QualType FileType = GetType(File);
5493 if (FileType.isNull()) {
5494 Error("FILE type is NULL");
5495 return;
5496 }
5497
5498 if (!Context.FILEDecl) {
5499 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5500 Context.setFILEDecl(Typedef->getDecl());
5501 else {
5502 const TagType *Tag = FileType->getAs<TagType>();
5503 if (!Tag) {
5504 Error("Invalid FILE type in AST file");
5505 return;
5506 }
5507 Context.setFILEDecl(Tag->getDecl());
5508 }
5509 }
5510 }
5511
5512 if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5513 QualType Jmp_bufType = GetType(Jmp_buf);
5514 if (Jmp_bufType.isNull()) {
5515 Error("jmp_buf type is NULL");
5516 return;
5517 }
5518
5519 if (!Context.jmp_bufDecl) {
5520 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5521 Context.setjmp_bufDecl(Typedef->getDecl());
5522 else {
5523 const TagType *Tag = Jmp_bufType->getAs<TagType>();
5524 if (!Tag) {
5525 Error("Invalid jmp_buf type in AST file");
5526 return;
5527 }
5528 Context.setjmp_bufDecl(Tag->getDecl());
5529 }
5530 }
5531 }
5532
5533 if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5534 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5535 if (Sigjmp_bufType.isNull()) {
5536 Error("sigjmp_buf type is NULL");
5537 return;
5538 }
5539
5540 if (!Context.sigjmp_bufDecl) {
5541 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5542 Context.setsigjmp_bufDecl(Typedef->getDecl());
5543 else {
5544 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5545 assert(Tag && "Invalid sigjmp_buf type in AST file");
5546 Context.setsigjmp_bufDecl(Tag->getDecl());
5547 }
5548 }
5549 }
5550
5551 if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5552 if (Context.ObjCIdRedefinitionType.isNull())
5553 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5554 }
5555
5556 if (TypeID ObjCClassRedef =
5558 if (Context.ObjCClassRedefinitionType.isNull())
5559 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5560 }
5561
5562 if (TypeID ObjCSelRedef =
5563 SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5564 if (Context.ObjCSelRedefinitionType.isNull())
5565 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5566 }
5567
5568 if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5569 QualType Ucontext_tType = GetType(Ucontext_t);
5570 if (Ucontext_tType.isNull()) {
5571 Error("ucontext_t type is NULL");
5572 return;
5573 }
5574
5575 if (!Context.ucontext_tDecl) {
5576 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5577 Context.setucontext_tDecl(Typedef->getDecl());
5578 else {
5579 const TagType *Tag = Ucontext_tType->getAs<TagType>();
5580 assert(Tag && "Invalid ucontext_t type in AST file");
5581 Context.setucontext_tDecl(Tag->getDecl());
5582 }
5583 }
5584 }
5585 }
5586
5587 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5588
5589 // If there were any CUDA special declarations, deserialize them.
5590 if (!CUDASpecialDeclRefs.empty()) {
5591 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
5592 Context.setcudaConfigureCallDecl(
5593 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5594 }
5595
5596 // Re-export any modules that were imported by a non-module AST file.
5597 // FIXME: This does not make macro-only imports visible again.
5598 for (auto &Import : PendingImportedModules) {
5599 if (Module *Imported = getSubmodule(Import.ID)) {
5601 /*ImportLoc=*/Import.ImportLoc);
5602 if (Import.ImportLoc.isValid())
5603 PP.makeModuleVisible(Imported, Import.ImportLoc);
5604 // This updates visibility for Preprocessor only. For Sema, which can be
5605 // nullptr here, we do the same later, in UpdateSema().
5606 }
5607 }
5608
5609 // Hand off these modules to Sema.
5610 PendingImportedModulesSema.append(PendingImportedModules);
5611 PendingImportedModules.clear();
5612}
5613
5615 // Nothing to do for now.
5616}
5617
5618/// Reads and return the signature record from \p PCH's control block, or
5619/// else returns 0.
5621 BitstreamCursor Stream(PCH);
5622 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5623 // FIXME this drops the error on the floor.
5624 consumeError(std::move(Err));
5625 return ASTFileSignature();
5626 }
5627
5628 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5630 return ASTFileSignature();
5631
5632 // Scan for SIGNATURE inside the diagnostic options block.
5634 while (true) {
5636 Stream.advanceSkippingSubblocks();
5637 if (!MaybeEntry) {
5638 // FIXME this drops the error on the floor.
5639 consumeError(MaybeEntry.takeError());
5640 return ASTFileSignature();
5641 }
5642 llvm::BitstreamEntry Entry = MaybeEntry.get();
5643
5644 if (Entry.Kind != llvm::BitstreamEntry::Record)
5645 return ASTFileSignature();
5646
5647 Record.clear();
5648 StringRef Blob;
5649 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5650 if (!MaybeRecord) {
5651 // FIXME this drops the error on the floor.
5652 consumeError(MaybeRecord.takeError());
5653 return ASTFileSignature();
5654 }
5655 if (SIGNATURE == MaybeRecord.get()) {
5656 auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5657 assert(Signature != ASTFileSignature::createDummy() &&
5658 "Dummy AST file signature not backpatched in ASTWriter.");
5659 return Signature;
5660 }
5661 }
5662}
5663
5664/// Retrieve the name of the original source file name
5665/// directly from the AST file, without actually loading the AST
5666/// file.
5668 const std::string &ASTFileName, FileManager &FileMgr,
5669 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5670 // Open the AST file.
5671 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5672 /*RequiresNullTerminator=*/false,
5673 /*MaybeLimit=*/std::nullopt,
5674 /*IsText=*/false);
5675 if (!Buffer) {
5676 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5677 << ASTFileName << Buffer.getError().message();
5678 return std::string();
5679 }
5680
5681 // Initialize the stream
5682 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5683
5684 // Sniff for the signature.
5685 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5686 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5687 return std::string();
5688 }
5689
5690 // Scan for the CONTROL_BLOCK_ID block.
5691 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5692 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5693 return std::string();
5694 }
5695
5696 // Scan for ORIGINAL_FILE inside the control block.
5698 while (true) {
5700 Stream.advanceSkippingSubblocks();
5701 if (!MaybeEntry) {
5702 // FIXME this drops errors on the floor.
5703 consumeError(MaybeEntry.takeError());
5704 return std::string();
5705 }
5706 llvm::BitstreamEntry Entry = MaybeEntry.get();
5707
5708 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5709 return std::string();
5710
5711 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5712 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5713 return std::string();
5714 }
5715
5716 Record.clear();
5717 StringRef Blob;
5718 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5719 if (!MaybeRecord) {
5720 // FIXME this drops the errors on the floor.
5721 consumeError(MaybeRecord.takeError());
5722 return std::string();
5723 }
5724 if (ORIGINAL_FILE == MaybeRecord.get())
5725 return Blob.str();
5726 }
5727}
5728
5729namespace {
5730
5731 class SimplePCHValidator : public ASTReaderListener {
5732 const LangOptions &ExistingLangOpts;
5733 const CodeGenOptions &ExistingCGOpts;
5734 const TargetOptions &ExistingTargetOpts;
5735 const PreprocessorOptions &ExistingPPOpts;
5736 std::string ExistingModuleCachePath;
5738 bool StrictOptionMatches;
5739
5740 public:
5741 SimplePCHValidator(const LangOptions &ExistingLangOpts,
5742 const CodeGenOptions &ExistingCGOpts,
5743 const TargetOptions &ExistingTargetOpts,
5744 const PreprocessorOptions &ExistingPPOpts,
5745 StringRef ExistingModuleCachePath, FileManager &FileMgr,
5746 bool StrictOptionMatches)
5747 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5748 ExistingTargetOpts(ExistingTargetOpts),
5749 ExistingPPOpts(ExistingPPOpts),
5750 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr),
5751 StrictOptionMatches(StrictOptionMatches) {}
5752
5753 bool ReadLanguageOptions(const LangOptions &LangOpts,
5754 StringRef ModuleFilename, bool Complain,
5755 bool AllowCompatibleDifferences) override {
5756 return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
5757 nullptr, AllowCompatibleDifferences);
5758 }
5759
5760 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
5761 StringRef ModuleFilename, bool Complain,
5762 bool AllowCompatibleDifferences) override {
5763 return checkCodegenOptions(ExistingCGOpts, CGOpts, ModuleFilename,
5764 nullptr, AllowCompatibleDifferences);
5765 }
5766
5767 bool ReadTargetOptions(const TargetOptions &TargetOpts,
5768 StringRef ModuleFilename, bool Complain,
5769 bool AllowCompatibleDifferences) override {
5770 return checkTargetOptions(ExistingTargetOpts, TargetOpts, ModuleFilename,
5771 nullptr, AllowCompatibleDifferences);
5772 }
5773
5774 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5775 StringRef ModuleFilename,
5776 StringRef SpecificModuleCachePath,
5777 bool Complain) override {
5779 SpecificModuleCachePath,
5780 ExistingModuleCachePath, ModuleFilename,
5781 nullptr, ExistingLangOpts, ExistingPPOpts);
5782 }
5783
5784 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5785 StringRef ModuleFilename, bool ReadMacros,
5786 bool Complain,
5787 std::string &SuggestedPredefines) override {
5789 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
5790 FileMgr, SuggestedPredefines, ExistingLangOpts,
5791 StrictOptionMatches ? OptionValidateStrictMatches
5793 }
5794 };
5795
5796} // namespace
5797
5799 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
5800 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5801 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5802 unsigned ClientLoadCapabilities) {
5803 // Open the AST file.
5804 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5805 llvm::MemoryBuffer *Buffer =
5806 ModCache.getInMemoryModuleCache().lookupPCM(Filename);
5807 if (!Buffer) {
5808 // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5809 // read again later, but we do not have the context here to determine if it
5810 // is safe to change the result of InMemoryModuleCache::getPCMState().
5811
5812 // FIXME: This allows use of the VFS; we do not allow use of the
5813 // VFS when actually loading a module.
5814 auto Entry =
5815 Filename == "-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5816 if (!Entry) {
5817 llvm::consumeError(Entry.takeError());
5818 return true;
5819 }
5820 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5821 if (!BufferOrErr)
5822 return true;
5823 OwnedBuffer = std::move(*BufferOrErr);
5824 Buffer = OwnedBuffer.get();
5825 }
5826
5827 // Initialize the stream
5828 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5829 BitstreamCursor Stream(Bytes);
5830
5831 // Sniff for the signature.
5832 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5833 consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5834 return true;
5835 }
5836
5837 // Scan for the CONTROL_BLOCK_ID block.
5839 return true;
5840
5841 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5842 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5843 bool NeedsImports = Listener.needsImportVisitation();
5844 BitstreamCursor InputFilesCursor;
5845 uint64_t InputFilesOffsetBase = 0;
5846
5848 std::string ModuleDir;
5849 bool DoneWithControlBlock = false;
5850 SmallString<0> PathBuf;
5851 PathBuf.reserve(256);
5852 // Additional path buffer to use when multiple paths need to be resolved.
5853 // For example, when deserializing input files that contains a path that was
5854 // resolved from a vfs overlay and an external location.
5855 SmallString<0> AdditionalPathBuf;
5856 AdditionalPathBuf.reserve(256);
5857 while (!DoneWithControlBlock) {
5858 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5859 if (!MaybeEntry) {
5860 // FIXME this drops the error on the floor.
5861 consumeError(MaybeEntry.takeError());
5862 return true;
5863 }
5864 llvm::BitstreamEntry Entry = MaybeEntry.get();
5865
5866 switch (Entry.Kind) {
5867 case llvm::BitstreamEntry::SubBlock: {
5868 switch (Entry.ID) {
5869 case OPTIONS_BLOCK_ID: {
5870 std::string IgnoredSuggestedPredefines;
5871 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5872 /*AllowCompatibleConfigurationMismatch*/ false,
5873 Listener, IgnoredSuggestedPredefines) != Success)
5874 return true;
5875 break;
5876 }
5877
5879 InputFilesCursor = Stream;
5880 if (llvm::Error Err = Stream.SkipBlock()) {
5881 // FIXME this drops the error on the floor.
5882 consumeError(std::move(Err));
5883 return true;
5884 }
5885 if (NeedsInputFiles &&
5886 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
5887 return true;
5888 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5889 break;
5890
5891 default:
5892 if (llvm::Error Err = Stream.SkipBlock()) {
5893 // FIXME this drops the error on the floor.
5894 consumeError(std::move(Err));
5895 return true;
5896 }
5897 break;
5898 }
5899
5900 continue;
5901 }
5902
5903 case llvm::BitstreamEntry::EndBlock:
5904 DoneWithControlBlock = true;
5905 break;
5906
5907 case llvm::BitstreamEntry::Error:
5908 return true;
5909
5910 case llvm::BitstreamEntry::Record:
5911 break;
5912 }
5913
5914 if (DoneWithControlBlock) break;
5915
5916 Record.clear();
5917 StringRef Blob;
5918 Expected<unsigned> MaybeRecCode =
5919 Stream.readRecord(Entry.ID, Record, &Blob);
5920 if (!MaybeRecCode) {
5921 // FIXME this drops the error.
5922 return Failure;
5923 }
5924 switch ((ControlRecordTypes)MaybeRecCode.get()) {
5925 case METADATA:
5926 if (Record[0] != VERSION_MAJOR)
5927 return true;
5928 if (Listener.ReadFullVersionInformation(Blob))
5929 return true;
5930 break;
5931 case MODULE_NAME:
5932 Listener.ReadModuleName(Blob);
5933 break;
5934 case MODULE_DIRECTORY:
5935 ModuleDir = std::string(Blob);
5936 break;
5937 case MODULE_MAP_FILE: {
5938 unsigned Idx = 0;
5939 std::string PathStr = ReadString(Record, Idx);
5940 auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
5941 Listener.ReadModuleMapFile(*Path);
5942 break;
5943 }
5944 case INPUT_FILE_OFFSETS: {
5945 if (!NeedsInputFiles)
5946 break;
5947
5948 unsigned NumInputFiles = Record[0];
5949 unsigned NumUserFiles = Record[1];
5950 const llvm::support::unaligned_uint64_t *InputFileOffs =
5951 (const llvm::support::unaligned_uint64_t *)Blob.data();
5952 for (unsigned I = 0; I != NumInputFiles; ++I) {
5953 // Go find this input file.
5954 bool isSystemFile = I >= NumUserFiles;
5955
5956 if (isSystemFile && !NeedsSystemInputFiles)
5957 break; // the rest are system input files
5958
5959 BitstreamCursor &Cursor = InputFilesCursor;
5960 SavedStreamPosition SavedPosition(Cursor);
5961 if (llvm::Error Err =
5962 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5963 // FIXME this drops errors on the floor.
5964 consumeError(std::move(Err));
5965 }
5966
5967 Expected<unsigned> MaybeCode = Cursor.ReadCode();
5968 if (!MaybeCode) {
5969 // FIXME this drops errors on the floor.
5970 consumeError(MaybeCode.takeError());
5971 }
5972 unsigned Code = MaybeCode.get();
5973
5975 StringRef Blob;
5976 bool shouldContinue = false;
5977 Expected<unsigned> MaybeRecordType =
5978 Cursor.readRecord(Code, Record, &Blob);
5979 if (!MaybeRecordType) {
5980 // FIXME this drops errors on the floor.
5981 consumeError(MaybeRecordType.takeError());
5982 }
5983 switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5984 case INPUT_FILE_HASH:
5985 break;
5986 case INPUT_FILE:
5987 bool Overridden = static_cast<bool>(Record[3]);
5988 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5990 auto FilenameAsRequestedBuf = ResolveImportedPath(
5991 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
5992 StringRef Filename;
5993 if (UnresolvedFilename.empty())
5994 Filename = *FilenameAsRequestedBuf;
5995 else {
5996 auto FilenameBuf = ResolveImportedPath(
5997 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
5998 Filename = *FilenameBuf;
5999 }
6000 shouldContinue = Listener.visitInputFileAsRequested(
6001 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6002 /*IsExplicitModule=*/false);
6003 break;
6004 }
6005 if (!shouldContinue)
6006 break;
6007 }
6008 break;
6009 }
6010
6011 case IMPORT: {
6012 if (!NeedsImports)
6013 break;
6014
6015 unsigned Idx = 0;
6016 // Read information about the AST file.
6017
6018 // Skip Kind
6019 Idx++;
6020
6021 // Skip ImportLoc
6022 Idx++;
6023
6024 StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
6025
6026 bool IsStandardCXXModule = Record[Idx++];
6027
6028 // In C++20 Modules, we don't record the path to imported
6029 // modules in the BMI files.
6030 if (IsStandardCXXModule) {
6031 Listener.visitImport(ModuleName, /*Filename=*/"");
6032 continue;
6033 }
6034
6035 // Skip Size and ModTime.
6036 Idx += 1 + 1;
6037 // Skip signature.
6038 Blob = Blob.substr(ASTFileSignature::size);
6039
6040 StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
6041 auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
6042 Listener.visitImport(ModuleName, *Filename);
6043 break;
6044 }
6045
6046 default:
6047 // No other validation to perform.
6048 break;
6049 }
6050 }
6051
6052 // Look for module file extension blocks, if requested.
6053 if (FindModuleFileExtensions) {
6054 BitstreamCursor SavedStream = Stream;
6055 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
6056 bool DoneWithExtensionBlock = false;
6057 while (!DoneWithExtensionBlock) {
6058 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
6059 if (!MaybeEntry) {
6060 // FIXME this drops the error.
6061 return true;
6062 }
6063 llvm::BitstreamEntry Entry = MaybeEntry.get();
6064
6065 switch (Entry.Kind) {
6066 case llvm::BitstreamEntry::SubBlock:
6067 if (llvm::Error Err = Stream.SkipBlock()) {
6068 // FIXME this drops the error on the floor.
6069 consumeError(std::move(Err));
6070 return true;
6071 }
6072 continue;
6073
6074 case llvm::BitstreamEntry::EndBlock:
6075 DoneWithExtensionBlock = true;
6076 continue;
6077
6078 case llvm::BitstreamEntry::Error:
6079 return true;
6080
6081 case llvm::BitstreamEntry::Record:
6082 break;
6083 }
6084
6085 Record.clear();
6086 StringRef Blob;
6087 Expected<unsigned> MaybeRecCode =
6088 Stream.readRecord(Entry.ID, Record, &Blob);
6089 if (!MaybeRecCode) {
6090 // FIXME this drops the error.
6091 return true;
6092 }
6093 switch (MaybeRecCode.get()) {
6094 case EXTENSION_METADATA: {
6096 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
6097 return true;
6098
6099 Listener.readModuleFileExtension(Metadata);
6100 break;
6101 }
6102 }
6103 }
6104 }
6105 Stream = std::move(SavedStream);
6106 }
6107
6108 // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6109 if (readUnhashedControlBlockImpl(
6110 nullptr, Bytes, Filename, ClientLoadCapabilities,
6111 /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6112 ValidateDiagnosticOptions) != Success)
6113 return true;
6114
6115 return false;
6116}
6117
6119 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6120 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6121 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
6122 const PreprocessorOptions &PPOpts, StringRef ExistingModuleCachePath,
6123 bool RequireStrictOptionMatches) {
6124 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts,
6125 ExistingModuleCachePath, FileMgr,
6126 RequireStrictOptionMatches);
6127 return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6128 /*FindModuleFileExtensions=*/false, validator,
6129 /*ValidateDiagnosticOptions=*/true);
6130}
6131
6132llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
6133 unsigned ClientLoadCapabilities) {
6134 // Enter the submodule block.
6135 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID))
6136 return Err;
6137
6138 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6139 bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6140 // If we don't know the top-level module, there's no point in doing qualified
6141 // lookup of its submodules; it won't find anything anywhere within this tree.
6142 // Let's skip that and avoid some string lookups.
6143 auto CreateModule = !KnowsTopLevelModule
6146
6147 bool First = true;
6148 Module *CurrentModule = nullptr;
6149 RecordData Record;
6150 while (true) {
6152 F.Stream.advanceSkippingSubblocks();
6153 if (!MaybeEntry)
6154 return MaybeEntry.takeError();
6155 llvm::BitstreamEntry Entry = MaybeEntry.get();
6156
6157 switch (Entry.Kind) {
6158 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
6159 case llvm::BitstreamEntry::Error:
6160 return llvm::createStringError(std::errc::illegal_byte_sequence,
6161 "malformed block record in AST file");
6162 case llvm::BitstreamEntry::EndBlock:
6163 return llvm::Error::success();
6164 case llvm::BitstreamEntry::Record:
6165 // The interesting case.
6166 break;
6167 }
6168
6169 // Read a record.
6170 StringRef Blob;
6171 Record.clear();
6172 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
6173 if (!MaybeKind)
6174 return MaybeKind.takeError();
6175 unsigned Kind = MaybeKind.get();
6176
6177 if ((Kind == SUBMODULE_METADATA) != First)
6178 return llvm::createStringError(
6179 std::errc::illegal_byte_sequence,
6180 "submodule metadata record should be at beginning of block");
6181 First = false;
6182
6183 // Submodule information is only valid if we have a current module.
6184 // FIXME: Should we error on these cases?
6185 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
6186 Kind != SUBMODULE_DEFINITION)
6187 continue;
6188
6189 switch (Kind) {
6190 default: // Default behavior: ignore.
6191 break;
6192
6193 case SUBMODULE_DEFINITION: {
6194 if (Record.size() < 13)
6195 return llvm::createStringError(std::errc::illegal_byte_sequence,
6196 "malformed module definition");
6197
6198 StringRef Name = Blob;
6199 unsigned Idx = 0;
6200 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
6201 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6203 SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6204 FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6205 bool IsFramework = Record[Idx++];
6206 bool IsExplicit = Record[Idx++];
6207 bool IsSystem = Record[Idx++];
6208 bool IsExternC = Record[Idx++];
6209 bool InferSubmodules = Record[Idx++];
6210 bool InferExplicitSubmodules = Record[Idx++];
6211 bool InferExportWildcard = Record[Idx++];
6212 bool ConfigMacrosExhaustive = Record[Idx++];
6213 bool ModuleMapIsPrivate = Record[Idx++];
6214 bool NamedModuleHasInit = Record[Idx++];
6215
6216 Module *ParentModule = nullptr;
6217 if (Parent)
6218 ParentModule = getSubmodule(Parent);
6219
6220 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6221 IsFramework, IsExplicit);
6222
6223 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6224 if (GlobalIndex >= SubmodulesLoaded.size() ||
6225 SubmodulesLoaded[GlobalIndex])
6226 return llvm::createStringError(std::errc::invalid_argument,
6227 "too many submodules");
6228
6229 if (!ParentModule) {
6230 if (OptionalFileEntryRef CurFile = CurrentModule->getASTFile()) {
6231 // Don't emit module relocation error if we have -fno-validate-pch
6232 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6234 assert(CurFile != F.File && "ModuleManager did not de-duplicate");
6235
6236 Diag(diag::err_module_file_conflict)
6237 << CurrentModule->getTopLevelModuleName() << CurFile->getName()
6238 << F.File.getName();
6239
6240 auto CurModMapFile =
6241 ModMap.getContainingModuleMapFile(CurrentModule);
6242 auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6243 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6244 Diag(diag::note_module_file_conflict)
6245 << CurModMapFile->getName() << ModMapFile->getName();
6246
6247 return llvm::make_error<AlreadyReportedDiagnosticError>();
6248 }
6249 }
6250
6251 F.DidReadTopLevelSubmodule = true;
6252 CurrentModule->setASTFile(F.File);
6253 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6254 }
6255
6256 CurrentModule->Kind = Kind;
6257 // Note that we may be rewriting an existing location and it is important
6258 // to keep doing that. In particular, we would like to prefer a
6259 // `DefinitionLoc` loaded from the module file instead of the location
6260 // created in the current source manager, because it allows the new
6261 // location to be marked as "unaffecting" when writing and avoid creating
6262 // duplicate locations for the same module map file.
6263 CurrentModule->DefinitionLoc = DefinitionLoc;
6264 CurrentModule->Signature = F.Signature;
6265 CurrentModule->IsFromModuleFile = true;
6266 if (InferredAllowedBy.isValid())
6267 ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6268 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6269 CurrentModule->IsExternC = IsExternC;
6270 CurrentModule->InferSubmodules = InferSubmodules;
6271 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6272 CurrentModule->InferExportWildcard = InferExportWildcard;
6273 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6274 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6275 CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6276 if (DeserializationListener)
6277 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6278
6279 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6280
6281 // Clear out data that will be replaced by what is in the module file.
6282 CurrentModule->LinkLibraries.clear();
6283 CurrentModule->ConfigMacros.clear();
6284 CurrentModule->UnresolvedConflicts.clear();
6285 CurrentModule->Conflicts.clear();
6286
6287 // The module is available unless it's missing a requirement; relevant
6288 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6289 // Missing headers that were present when the module was built do not
6290 // make it unavailable -- if we got this far, this must be an explicitly
6291 // imported module file.
6292 CurrentModule->Requirements.clear();
6293 CurrentModule->MissingHeaders.clear();
6294 CurrentModule->IsUnimportable =
6295 ParentModule && ParentModule->IsUnimportable;
6296 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6297 break;
6298 }
6299
6301 // FIXME: This doesn't work for framework modules as `Filename` is the
6302 // name as written in the module file and does not include
6303 // `Headers/`, so this path will never exist.
6304 auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6305 if (auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6306 if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6307 // FIXME: NameAsWritten
6308 ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob, "");
6309 }
6310 // Note that it's too late at this point to return out of date if the
6311 // name from the PCM doesn't match up with the one in the module map,
6312 // but also quite unlikely since we will have already checked the
6313 // modification time and size of the module map file itself.
6314 }
6315 break;
6316 }
6317
6318 case SUBMODULE_HEADER:
6321 // We lazily associate headers with their modules via the HeaderInfo table.
6322 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6323 // of complete filenames or remove it entirely.
6324 break;
6325
6328 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6329 // them here.
6330 break;
6331
6332 case SUBMODULE_TOPHEADER: {
6333 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6334 CurrentModule->addTopHeaderFilename(*HeaderName);
6335 break;
6336 }
6337
6339 // See comments in SUBMODULE_UMBRELLA_HEADER
6340 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6341 if (auto Umbrella =
6342 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6343 if (!CurrentModule->getUmbrellaDirAsWritten()) {
6344 // FIXME: NameAsWritten
6345 ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6346 }
6347 }
6348 break;
6349 }
6350
6351 case SUBMODULE_METADATA: {
6352 F.BaseSubmoduleID = getTotalNumSubmodules();
6354 unsigned LocalBaseSubmoduleID = Record[1];
6355 if (F.LocalNumSubmodules > 0) {
6356 // Introduce the global -> local mapping for submodules within this
6357 // module.
6358 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6359
6360 // Introduce the local -> global mapping for submodules within this
6361 // module.
6363 std::make_pair(LocalBaseSubmoduleID,
6364 F.BaseSubmoduleID - LocalBaseSubmoduleID));
6365
6366 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
6367 }
6368 break;
6369 }
6370
6371 case SUBMODULE_IMPORTS:
6372 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6373 UnresolvedModuleRef Unresolved;
6374 Unresolved.File = &F;
6375 Unresolved.Mod = CurrentModule;
6376 Unresolved.ID = Record[Idx];
6377 Unresolved.Kind = UnresolvedModuleRef::Import;
6378 Unresolved.IsWildcard = false;
6379 UnresolvedModuleRefs.push_back(Unresolved);
6380 }
6381 break;
6382
6384 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6385 UnresolvedModuleRef Unresolved;
6386 Unresolved.File = &F;
6387 Unresolved.Mod = CurrentModule;
6388 Unresolved.ID = Record[Idx];
6389 Unresolved.Kind = UnresolvedModuleRef::Affecting;
6390 Unresolved.IsWildcard = false;
6391 UnresolvedModuleRefs.push_back(Unresolved);
6392 }
6393 break;
6394
6395 case SUBMODULE_EXPORTS:
6396 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6397 UnresolvedModuleRef Unresolved;
6398 Unresolved.File = &F;
6399 Unresolved.Mod = CurrentModule;
6400 Unresolved.ID = Record[Idx];
6401 Unresolved.Kind = UnresolvedModuleRef::Export;
6402 Unresolved.IsWildcard = Record[Idx + 1];
6403 UnresolvedModuleRefs.push_back(Unresolved);
6404 }
6405
6406 // Once we've loaded the set of exports, there's no reason to keep
6407 // the parsed, unresolved exports around.
6408 CurrentModule->UnresolvedExports.clear();
6409 break;
6410
6411 case SUBMODULE_REQUIRES:
6412 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6413 PP.getTargetInfo());
6414 break;
6415
6417 ModMap.resolveLinkAsDependencies(CurrentModule);
6418 CurrentModule->LinkLibraries.push_back(
6419 Module::LinkLibrary(std::string(Blob), Record[0]));
6420 break;
6421
6423 CurrentModule->ConfigMacros.push_back(Blob.str());
6424 break;
6425
6426 case SUBMODULE_CONFLICT: {
6427 UnresolvedModuleRef Unresolved;
6428 Unresolved.File = &F;
6429 Unresolved.Mod = CurrentModule;
6430 Unresolved.ID = Record[0];
6431 Unresolved.Kind = UnresolvedModuleRef::Conflict;
6432 Unresolved.IsWildcard = false;
6433 Unresolved.String = Blob;
6434 UnresolvedModuleRefs.push_back(Unresolved);
6435 break;
6436 }
6437
6439 if (!ContextObj)
6440 break;
6441 SmallVector<GlobalDeclID, 16> Inits;
6442 for (unsigned I = 0; I < Record.size(); /*in loop*/)
6443 Inits.push_back(ReadDeclID(F, Record, I));
6444 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6445 break;
6446 }
6447
6449 CurrentModule->ExportAsModule = Blob.str();
6450 ModMap.addLinkAsDependency(CurrentModule);
6451 break;
6452 }
6453 }
6454}
6455
6456/// Parse the record that corresponds to a LangOptions data
6457/// structure.
6458///
6459/// This routine parses the language options from the AST file and then gives
6460/// them to the AST listener if one is set.
6461///
6462/// \returns true if the listener deems the file unacceptable, false otherwise.
6463bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6464 StringRef ModuleFilename, bool Complain,
6465 ASTReaderListener &Listener,
6466 bool AllowCompatibleDifferences) {
6467 LangOptions LangOpts;
6468 unsigned Idx = 0;
6469#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6470 LangOpts.Name = Record[Idx++];
6471#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6472 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6473#include "clang/Basic/LangOptions.def"
6474#define SANITIZER(NAME, ID) \
6475 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6476#include "clang/Basic/Sanitizers.def"
6477
6478 for (unsigned N = Record[Idx++]; N; --N)
6479 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6480
6481 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6482 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6483 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6484
6485 LangOpts.CurrentModule = ReadString(Record, Idx);
6486
6487 // Comment options.
6488 for (unsigned N = Record[Idx++]; N; --N) {
6489 LangOpts.CommentOpts.BlockCommandNames.push_back(
6490 ReadString(Record, Idx));
6491 }
6492 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6493
6494 // OpenMP offloading options.
6495 for (unsigned N = Record[Idx++]; N; --N) {
6496 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6497 }
6498
6499 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6500
6501 return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6502 AllowCompatibleDifferences);
6503}
6504
6505bool ASTReader::ParseCodeGenOptions(const RecordData &Record,
6506 StringRef ModuleFilename, bool Complain,
6507 ASTReaderListener &Listener,
6508 bool AllowCompatibleDifferences) {
6509 unsigned Idx = 0;
6510 CodeGenOptions CGOpts;
6512#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6513 if constexpr (CK::Compatibility != CK::Benign) \
6514 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6515#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6516 if constexpr (CK::Compatibility != CK::Benign) \
6517 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6518#define DEBUGOPT(Name, Bits, Default, Compatibility)
6519#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6520#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6521#include "clang/Basic/CodeGenOptions.def"
6522
6523 return Listener.ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
6524 AllowCompatibleDifferences);
6525}
6526
6527bool ASTReader::ParseTargetOptions(const RecordData &Record,
6528 StringRef ModuleFilename, bool Complain,
6529 ASTReaderListener &Listener,
6530 bool AllowCompatibleDifferences) {
6531 unsigned Idx = 0;
6532 TargetOptions TargetOpts;
6533 TargetOpts.Triple = ReadString(Record, Idx);
6534 TargetOpts.CPU = ReadString(Record, Idx);
6535 TargetOpts.TuneCPU = ReadString(Record, Idx);
6536 TargetOpts.ABI = ReadString(Record, Idx);
6537 for (unsigned N = Record[Idx++]; N; --N) {
6538 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6539 }
6540 for (unsigned N = Record[Idx++]; N; --N) {
6541 TargetOpts.Features.push_back(ReadString(Record, Idx));
6542 }
6543
6544 return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6545 AllowCompatibleDifferences);
6546}
6547
6548bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6549 StringRef ModuleFilename, bool Complain,
6550 ASTReaderListener &Listener) {
6551 DiagnosticOptions DiagOpts;
6552 unsigned Idx = 0;
6553#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6554#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6555 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6556#include "clang/Basic/DiagnosticOptions.def"
6557
6558 for (unsigned N = Record[Idx++]; N; --N)
6559 DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6560 for (unsigned N = Record[Idx++]; N; --N)
6561 DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6562
6563 return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6564}
6565
6566bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6567 ASTReaderListener &Listener) {
6568 FileSystemOptions FSOpts;
6569 unsigned Idx = 0;
6570 FSOpts.WorkingDir = ReadString(Record, Idx);
6571 return Listener.ReadFileSystemOptions(FSOpts, Complain);
6572}
6573
6574bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6575 StringRef ModuleFilename,
6576 bool Complain,
6577 ASTReaderListener &Listener) {
6578 HeaderSearchOptions HSOpts;
6579 unsigned Idx = 0;
6580 HSOpts.Sysroot = ReadString(Record, Idx);
6581
6582 HSOpts.ResourceDir = ReadString(Record, Idx);
6583 HSOpts.ModuleCachePath = ReadString(Record, Idx);
6584 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6585 HSOpts.DisableModuleHash = Record[Idx++];
6586 HSOpts.ImplicitModuleMaps = Record[Idx++];
6587 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6588 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6589 HSOpts.UseBuiltinIncludes = Record[Idx++];
6590 HSOpts.UseStandardSystemIncludes = Record[Idx++];
6591 HSOpts.UseStandardCXXIncludes = Record[Idx++];
6592 HSOpts.UseLibcxx = Record[Idx++];
6593 std::string SpecificModuleCachePath = ReadString(Record, Idx);
6594
6595 return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename,
6596 SpecificModuleCachePath, Complain);
6597}
6598
6599bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6600 ASTReaderListener &Listener) {
6601 HeaderSearchOptions HSOpts;
6602 unsigned Idx = 0;
6603
6604 // Include entries.
6605 for (unsigned N = Record[Idx++]; N; --N) {
6606 std::string Path = ReadString(Record, Idx);
6608 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6609 bool IsFramework = Record[Idx++];
6610 bool IgnoreSysRoot = Record[Idx++];
6611 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6612 IgnoreSysRoot);
6613 }
6614
6615 // System header prefixes.
6616 for (unsigned N = Record[Idx++]; N; --N) {
6617 std::string Prefix = ReadString(Record, Idx);
6618 bool IsSystemHeader = Record[Idx++];
6619 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6620 }
6621
6622 // VFS overlay files.
6623 for (unsigned N = Record[Idx++]; N; --N) {
6624 std::string VFSOverlayFile = ReadString(Record, Idx);
6625 HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6626 }
6627
6628 return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6629}
6630
6631bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6632 StringRef ModuleFilename,
6633 bool Complain,
6634 ASTReaderListener &Listener,
6635 std::string &SuggestedPredefines) {
6636 PreprocessorOptions PPOpts;
6637 unsigned Idx = 0;
6638
6639 // Macro definitions/undefs
6640 bool ReadMacros = Record[Idx++];
6641 if (ReadMacros) {
6642 for (unsigned N = Record[Idx++]; N; --N) {
6643 std::string Macro = ReadString(Record, Idx);
6644 bool IsUndef = Record[Idx++];
6645 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6646 }
6647 }
6648
6649 // Includes
6650 for (unsigned N = Record[Idx++]; N; --N) {
6651 PPOpts.Includes.push_back(ReadString(Record, Idx));
6652 }
6653
6654 // Macro Includes
6655 for (unsigned N = Record[Idx++]; N; --N) {
6656 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6657 }
6658
6659 PPOpts.UsePredefines = Record[Idx++];
6660 PPOpts.DetailedRecord = Record[Idx++];
6661 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6663 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6664 SuggestedPredefines.clear();
6665 return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6666 Complain, SuggestedPredefines);
6667}
6668
6669std::pair<ModuleFile *, unsigned>
6670ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6671 GlobalPreprocessedEntityMapType::iterator
6672 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6673 assert(I != GlobalPreprocessedEntityMap.end() &&
6674 "Corrupted global preprocessed entity map");
6675 ModuleFile *M = I->second;
6676 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6677 return std::make_pair(M, LocalIndex);
6678}
6679
6680llvm::iterator_range<PreprocessingRecord::iterator>
6681ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6682 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6683 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6685
6686 return llvm::make_range(PreprocessingRecord::iterator(),
6687 PreprocessingRecord::iterator());
6688}
6689
6690bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6691 unsigned int ClientLoadCapabilities) {
6692 return ClientLoadCapabilities & ARR_OutOfDate &&
6693 !getModuleManager()
6694 .getModuleCache()
6695 .getInMemoryModuleCache()
6696 .isPCMFinal(ModuleFileName);
6697}
6698
6699llvm::iterator_range<ASTReader::ModuleDeclIterator>
6701 return llvm::make_range(
6702 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
6703 ModuleDeclIterator(this, &Mod,
6705}
6706
6708 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6709 assert(I != GlobalSkippedRangeMap.end() &&
6710 "Corrupted global skipped range map");
6711 ModuleFile *M = I->second;
6712 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
6713 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6714 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
6715 SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
6716 ReadSourceLocation(*M, RawRange.getEnd()));
6717 assert(Range.isValid());
6718 return Range;
6719}
6720
6722 PreprocessedEntityID PPID = Index+1;
6723 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6724 ModuleFile &M = *PPInfo.first;
6725 unsigned LocalIndex = PPInfo.second;
6726 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6727
6728 if (!PP.getPreprocessingRecord()) {
6729 Error("no preprocessing record");
6730 return nullptr;
6731 }
6732
6734 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
6735 M.MacroOffsetsBase + PPOffs.getOffset())) {
6736 Error(std::move(Err));
6737 return nullptr;
6738 }
6739
6741 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
6742 if (!MaybeEntry) {
6743 Error(MaybeEntry.takeError());
6744 return nullptr;
6745 }
6746 llvm::BitstreamEntry Entry = MaybeEntry.get();
6747
6748 if (Entry.Kind != llvm::BitstreamEntry::Record)
6749 return nullptr;
6750
6751 // Read the record.
6752 SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
6753 ReadSourceLocation(M, PPOffs.getEnd()));
6754 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6755 StringRef Blob;
6757 Expected<unsigned> MaybeRecType =
6758 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6759 if (!MaybeRecType) {
6760 Error(MaybeRecType.takeError());
6761 return nullptr;
6762 }
6763 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6764 case PPD_MACRO_EXPANSION: {
6765 bool isBuiltin = Record[0];
6766 IdentifierInfo *Name = nullptr;
6767 MacroDefinitionRecord *Def = nullptr;
6768 if (isBuiltin)
6769 Name = getLocalIdentifier(M, Record[1]);
6770 else {
6771 PreprocessedEntityID GlobalID =
6774 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
6775 }
6776
6777 MacroExpansion *ME;
6778 if (isBuiltin)
6779 ME = new (PPRec) MacroExpansion(Name, Range);
6780 else
6781 ME = new (PPRec) MacroExpansion(Def, Range);
6782
6783 return ME;
6784 }
6785
6786 case PPD_MACRO_DEFINITION: {
6787 // Decode the identifier info and then check again; if the macro is
6788 // still defined and associated with the identifier,
6790 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
6791
6792 if (DeserializationListener)
6793 DeserializationListener->MacroDefinitionRead(PPID, MD);
6794
6795 return MD;
6796 }
6797
6799 const char *FullFileNameStart = Blob.data() + Record[0];
6800 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6802 if (!FullFileName.empty())
6803 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6804
6805 // FIXME: Stable encoding
6807 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
6809 = new (PPRec) InclusionDirective(PPRec, Kind,
6810 StringRef(Blob.data(), Record[0]),
6811 Record[1], Record[3],
6812 File,
6813 Range);
6814 return ID;
6815 }
6816 }
6817
6818 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
6819}
6820
6821/// Find the next module that contains entities and return the ID
6822/// of the first entry.
6823///
6824/// \param SLocMapI points at a chunk of a module that contains no
6825/// preprocessed entities or the entities it contains are not the ones we are
6826/// looking for.
6827PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6828 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6829 ++SLocMapI;
6830 for (GlobalSLocOffsetMapType::const_iterator
6831 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6832 ModuleFile &M = *SLocMapI->second;
6834 return M.BasePreprocessedEntityID;
6835 }
6836
6837 return getTotalNumPreprocessedEntities();
6838}
6839
6840namespace {
6841
6842struct PPEntityComp {
6843 const ASTReader &Reader;
6844 ModuleFile &M;
6845
6846 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6847
6848 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6849 SourceLocation LHS = getLoc(L);
6850 SourceLocation RHS = getLoc(R);
6851 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6852 }
6853
6854 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6855 SourceLocation LHS = getLoc(L);
6856 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6857 }
6858
6859 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6860 SourceLocation RHS = getLoc(R);
6861 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6862 }
6863
6864 SourceLocation getLoc(const PPEntityOffset &PPE) const {
6865 return Reader.ReadSourceLocation(M, PPE.getBegin());
6866 }
6867};
6868
6869} // namespace
6870
6871PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6872 bool EndsAfter) const {
6873 if (SourceMgr.isLocalSourceLocation(Loc))
6874 return getTotalNumPreprocessedEntities();
6875
6876 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6877 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6878 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6879 "Corrupted global sloc offset map");
6880
6881 if (SLocMapI->second->NumPreprocessedEntities == 0)
6882 return findNextPreprocessedEntity(SLocMapI);
6883
6884 ModuleFile &M = *SLocMapI->second;
6885
6886 using pp_iterator = const PPEntityOffset *;
6887
6888 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6889 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6890
6891 size_t Count = M.NumPreprocessedEntities;
6892 size_t Half;
6893 pp_iterator First = pp_begin;
6894 pp_iterator PPI;
6895
6896 if (EndsAfter) {
6897 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6898 PPEntityComp(*this, M));
6899 } else {
6900 // Do a binary search manually instead of using std::lower_bound because
6901 // The end locations of entities may be unordered (when a macro expansion
6902 // is inside another macro argument), but for this case it is not important
6903 // whether we get the first macro expansion or its containing macro.
6904 while (Count > 0) {
6905 Half = Count / 2;
6906 PPI = First;
6907 std::advance(PPI, Half);
6908 if (SourceMgr.isBeforeInTranslationUnit(
6909 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6910 First = PPI;
6911 ++First;
6912 Count = Count - Half - 1;
6913 } else
6914 Count = Half;
6915 }
6916 }
6917
6918 if (PPI == pp_end)
6919 return findNextPreprocessedEntity(SLocMapI);
6920
6921 return M.BasePreprocessedEntityID + (PPI - pp_begin);
6922}
6923
6924/// Returns a pair of [Begin, End) indices of preallocated
6925/// preprocessed entities that \arg Range encompasses.
6926std::pair<unsigned, unsigned>
6928 if (Range.isInvalid())
6929 return std::make_pair(0,0);
6930 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6931
6932 PreprocessedEntityID BeginID =
6933 findPreprocessedEntity(Range.getBegin(), false);
6934 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
6935 return std::make_pair(BeginID, EndID);
6936}
6937
6938/// Optionally returns true or false if the preallocated preprocessed
6939/// entity with index \arg Index came from file \arg FID.
6940std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
6941 FileID FID) {
6942 if (FID.isInvalid())
6943 return false;
6944
6945 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6946 ModuleFile &M = *PPInfo.first;
6947 unsigned LocalIndex = PPInfo.second;
6948 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6949
6950 SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
6951 if (Loc.isInvalid())
6952 return false;
6953
6954 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6955 return true;
6956 else
6957 return false;
6958}
6959
6960namespace {
6961
6962 /// Visitor used to search for information about a header file.
6963 class HeaderFileInfoVisitor {
6964 FileEntryRef FE;
6965 std::optional<HeaderFileInfo> HFI;
6966
6967 public:
6968 explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
6969
6970 bool operator()(ModuleFile &M) {
6973 if (!Table)
6974 return false;
6975
6976 // Look in the on-disk hash table for an entry for this file name.
6977 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6978 if (Pos == Table->end())
6979 return false;
6980
6981 HFI = *Pos;
6982 return true;
6983 }
6984
6985 std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
6986 };
6987
6988} // namespace
6989
6991 HeaderFileInfoVisitor Visitor(FE);
6992 ModuleMgr.visit(Visitor);
6993 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
6994 return *HFI;
6995
6996 return HeaderFileInfo();
6997}
6998
7000 using DiagState = DiagnosticsEngine::DiagState;
7002
7003 for (ModuleFile &F : ModuleMgr) {
7004 unsigned Idx = 0;
7005 auto &Record = F.PragmaDiagMappings;
7006 if (Record.empty())
7007 continue;
7008
7009 DiagStates.clear();
7010
7011 auto ReadDiagState = [&](const DiagState &BasedOn,
7012 bool IncludeNonPragmaStates) {
7013 unsigned BackrefID = Record[Idx++];
7014 if (BackrefID != 0)
7015 return DiagStates[BackrefID - 1];
7016
7017 // A new DiagState was created here.
7018 Diag.DiagStates.push_back(BasedOn);
7019 DiagState *NewState = &Diag.DiagStates.back();
7020 DiagStates.push_back(NewState);
7021 unsigned Size = Record[Idx++];
7022 assert(Idx + Size * 2 <= Record.size() &&
7023 "Invalid data, not enough diag/map pairs");
7024 while (Size--) {
7025 unsigned DiagID = Record[Idx++];
7026 DiagnosticMapping NewMapping =
7028 if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
7029 continue;
7030
7031 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
7032
7033 // If this mapping was specified as a warning but the severity was
7034 // upgraded due to diagnostic settings, simulate the current diagnostic
7035 // settings (and use a warning).
7036 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
7038 NewMapping.setUpgradedFromWarning(false);
7039 }
7040
7041 Mapping = NewMapping;
7042 }
7043 return NewState;
7044 };
7045
7046 // Read the first state.
7047 DiagState *FirstState;
7048 if (F.Kind == MK_ImplicitModule) {
7049 // Implicitly-built modules are reused with different diagnostic
7050 // settings. Use the initial diagnostic state from Diag to simulate this
7051 // compilation's diagnostic settings.
7052 FirstState = Diag.DiagStatesByLoc.FirstDiagState;
7053 DiagStates.push_back(FirstState);
7054
7055 // Skip the initial diagnostic state from the serialized module.
7056 assert(Record[1] == 0 &&
7057 "Invalid data, unexpected backref in initial state");
7058 Idx = 3 + Record[2] * 2;
7059 assert(Idx < Record.size() &&
7060 "Invalid data, not enough state change pairs in initial state");
7061 } else if (F.isModule()) {
7062 // For an explicit module, preserve the flags from the module build
7063 // command line (-w, -Weverything, -Werror, ...) along with any explicit
7064 // -Wblah flags.
7065 unsigned Flags = Record[Idx++];
7066 DiagState Initial(*Diag.getDiagnosticIDs());
7067 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7068 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7069 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7070 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7071 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7072 Initial.ExtBehavior = (diag::Severity)Flags;
7073 FirstState = ReadDiagState(Initial, true);
7074
7075 assert(F.OriginalSourceFileID.isValid());
7076
7077 // Set up the root buffer of the module to start with the initial
7078 // diagnostic state of the module itself, to cover files that contain no
7079 // explicit transitions (for which we did not serialize anything).
7080 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
7081 .StateTransitions.push_back({FirstState, 0});
7082 } else {
7083 // For prefix ASTs, start with whatever the user configured on the
7084 // command line.
7085 Idx++; // Skip flags.
7086 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
7087 }
7088
7089 // Read the state transitions.
7090 unsigned NumLocations = Record[Idx++];
7091 while (NumLocations--) {
7092 assert(Idx < Record.size() &&
7093 "Invalid data, missing pragma diagnostic states");
7094 FileID FID = ReadFileID(F, Record, Idx);
7095 assert(FID.isValid() && "invalid FileID for transition");
7096 unsigned Transitions = Record[Idx++];
7097
7098 // Note that we don't need to set up Parent/ParentOffset here, because
7099 // we won't be changing the diagnostic state within imported FileIDs
7100 // (other than perhaps appending to the main source file, which has no
7101 // parent).
7102 auto &F = Diag.DiagStatesByLoc.Files[FID];
7103 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7104 for (unsigned I = 0; I != Transitions; ++I) {
7105 unsigned Offset = Record[Idx++];
7106 auto *State = ReadDiagState(*FirstState, false);
7107 F.StateTransitions.push_back({State, Offset});
7108 }
7109 }
7110
7111 // Read the final state.
7112 assert(Idx < Record.size() &&
7113 "Invalid data, missing final pragma diagnostic state");
7114 SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
7115 auto *CurState = ReadDiagState(*FirstState, false);
7116
7117 if (!F.isModule()) {
7118 Diag.DiagStatesByLoc.CurDiagState = CurState;
7119 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7120
7121 // Preserve the property that the imaginary root file describes the
7122 // current state.
7123 FileID NullFile;
7124 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7125 if (T.empty())
7126 T.push_back({CurState, 0});
7127 else
7128 T[0].State = CurState;
7129 }
7130
7131 // Don't try to read these mappings again.
7132 Record.clear();
7133 }
7134}
7135
7136/// Get the correct cursor and offset for loading a type.
7137ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7138 auto [M, Index] = translateTypeIDToIndex(ID);
7139 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7141}
7142
7143static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7144 switch (code) {
7145#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7146 case TYPE_##CODE_ID: return Type::CLASS_ID;
7147#include "clang/Serialization/TypeBitCodes.def"
7148 default:
7149 return std::nullopt;
7150 }
7151}
7152
7153/// Read and return the type with the given index..
7154///
7155/// The index is the type ID, shifted and minus the number of predefs. This
7156/// routine actually reads the record corresponding to the type at the given
7157/// location. It is a helper routine for GetType, which deals with reading type
7158/// IDs.
7159QualType ASTReader::readTypeRecord(TypeID ID) {
7160 assert(ContextObj && "reading type with no AST context");
7161 ASTContext &Context = *ContextObj;
7162 RecordLocation Loc = TypeCursorForIndex(ID);
7163 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7164
7165 // Keep track of where we are in the stream, then jump back there
7166 // after reading this type.
7167 SavedStreamPosition SavedPosition(DeclsCursor);
7168
7169 ReadingKindTracker ReadingKind(Read_Type, *this);
7170
7171 // Note that we are loading a type record.
7172 Deserializing AType(this);
7173
7174 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7175 Error(std::move(Err));
7176 return QualType();
7177 }
7178 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7179 if (!RawCode) {
7180 Error(RawCode.takeError());
7181 return QualType();
7182 }
7183
7184 ASTRecordReader Record(*this, *Loc.F);
7185 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7186 if (!Code) {
7187 Error(Code.takeError());
7188 return QualType();
7189 }
7190 if (Code.get() == TYPE_EXT_QUAL) {
7191 QualType baseType = Record.readQualType();
7192 Qualifiers quals = Record.readQualifiers();
7193 return Context.getQualifiedType(baseType, quals);
7194 }
7195
7196 auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7197 if (!maybeClass) {
7198 Error("Unexpected code for type");
7199 return QualType();
7200 }
7201
7202 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7203 return TypeReader.read(*maybeClass);
7204}
7205
7206namespace clang {
7207
7208class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7209 ASTRecordReader &Reader;
7210
7211 SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
7212 SourceRange readSourceRange() { return Reader.readSourceRange(); }
7213
7214 TypeSourceInfo *GetTypeSourceInfo() {
7215 return Reader.readTypeSourceInfo();
7216 }
7217
7218 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7219 return Reader.readNestedNameSpecifierLoc();
7220 }
7221
7222 Attr *ReadAttr() {
7223 return Reader.readAttr();
7224 }
7225
7226public:
7227 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7228
7229 // We want compile-time assurance that we've enumerated all of
7230 // these, so unfortunately we have to declare them first, then
7231 // define them out-of-line.
7232#define ABSTRACT_TYPELOC(CLASS, PARENT)
7233#define TYPELOC(CLASS, PARENT) \
7234 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7235#include "clang/AST/TypeLocNodes.def"
7236
7239 void VisitTagTypeLoc(TagTypeLoc TL);
7240};
7241
7242} // namespace clang
7243
7244void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7245 // nothing to do
7246}
7247
7248void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7249 TL.setBuiltinLoc(readSourceLocation());
7250 if (TL.needsExtraLocalData()) {
7251 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7252 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7253 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7254 TL.setModeAttr(Reader.readInt());
7255 }
7256}
7257
7258void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7259 TL.setNameLoc(readSourceLocation());
7260}
7261
7262void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7263 TL.setStarLoc(readSourceLocation());
7264}
7265
7266void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7267 // nothing to do
7268}
7269
7270void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7271 // nothing to do
7272}
7273
7274void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7275 // nothing to do
7276}
7277
7278void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7279 TL.setExpansionLoc(readSourceLocation());
7280}
7281
7282void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7283 TL.setCaretLoc(readSourceLocation());
7284}
7285
7286void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7287 TL.setAmpLoc(readSourceLocation());
7288}
7289
7290void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7291 TL.setAmpAmpLoc(readSourceLocation());
7292}
7293
7294void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7295 TL.setStarLoc(readSourceLocation());
7296 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7297}
7298
7300 TL.setLBracketLoc(readSourceLocation());
7301 TL.setRBracketLoc(readSourceLocation());
7302 if (Reader.readBool())
7303 TL.setSizeExpr(Reader.readExpr());
7304 else
7305 TL.setSizeExpr(nullptr);
7306}
7307
7308void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7309 VisitArrayTypeLoc(TL);
7310}
7311
7312void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7313 VisitArrayTypeLoc(TL);
7314}
7315
7316void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7317 VisitArrayTypeLoc(TL);
7318}
7319
7320void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7321 DependentSizedArrayTypeLoc TL) {
7322 VisitArrayTypeLoc(TL);
7323}
7324
7325void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7326 DependentAddressSpaceTypeLoc TL) {
7327
7328 TL.setAttrNameLoc(readSourceLocation());
7329 TL.setAttrOperandParensRange(readSourceRange());
7330 TL.setAttrExprOperand(Reader.readExpr());
7331}
7332
7333void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7334 DependentSizedExtVectorTypeLoc TL) {
7335 TL.setNameLoc(readSourceLocation());
7336}
7337
7338void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7339 TL.setNameLoc(readSourceLocation());
7340}
7341
7342void TypeLocReader::VisitDependentVectorTypeLoc(
7343 DependentVectorTypeLoc TL) {
7344 TL.setNameLoc(readSourceLocation());
7345}
7346
7347void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7348 TL.setNameLoc(readSourceLocation());
7349}
7350
7351void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7352 TL.setAttrNameLoc(readSourceLocation());
7353 TL.setAttrOperandParensRange(readSourceRange());
7354 TL.setAttrRowOperand(Reader.readExpr());
7355 TL.setAttrColumnOperand(Reader.readExpr());
7356}
7357
7358void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7359 DependentSizedMatrixTypeLoc TL) {
7360 TL.setAttrNameLoc(readSourceLocation());
7361 TL.setAttrOperandParensRange(readSourceRange());
7362 TL.setAttrRowOperand(Reader.readExpr());
7363 TL.setAttrColumnOperand(Reader.readExpr());
7364}
7365
7367 TL.setLocalRangeBegin(readSourceLocation());
7368 TL.setLParenLoc(readSourceLocation());
7369 TL.setRParenLoc(readSourceLocation());
7370 TL.setExceptionSpecRange(readSourceRange());
7371 TL.setLocalRangeEnd(readSourceLocation());
7372 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7373 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7374 }
7375}
7376
7377void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7378 VisitFunctionTypeLoc(TL);
7379}
7380
7381void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7382 VisitFunctionTypeLoc(TL);
7383}
7384
7385void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7386 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7387 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7388 SourceLocation NameLoc = readSourceLocation();
7389 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7390}
7391
7392void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7393 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7394 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7395 SourceLocation NameLoc = readSourceLocation();
7396 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7397}
7398
7399void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7400 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7401 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7402 SourceLocation NameLoc = readSourceLocation();
7403 TL.set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7404}
7405
7406void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7407 TL.setTypeofLoc(readSourceLocation());
7408 TL.setLParenLoc(readSourceLocation());
7409 TL.setRParenLoc(readSourceLocation());
7410}
7411
7412void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7413 TL.setTypeofLoc(readSourceLocation());
7414 TL.setLParenLoc(readSourceLocation());
7415 TL.setRParenLoc(readSourceLocation());
7416 TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7417}
7418
7419void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7420 TL.setDecltypeLoc(readSourceLocation());
7421 TL.setRParenLoc(readSourceLocation());
7422}
7423
7424void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7425 TL.setEllipsisLoc(readSourceLocation());
7426}
7427
7428void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7429 TL.setKWLoc(readSourceLocation());
7430 TL.setLParenLoc(readSourceLocation());
7431 TL.setRParenLoc(readSourceLocation());
7432 TL.setUnderlyingTInfo(GetTypeSourceInfo());
7433}
7434
7436 auto NNS = readNestedNameSpecifierLoc();
7437 auto TemplateKWLoc = readSourceLocation();
7438 auto ConceptNameLoc = readDeclarationNameInfo();
7439 auto FoundDecl = readDeclAs<NamedDecl>();
7440 auto NamedConcept = readDeclAs<ConceptDecl>();
7441 auto *CR = ConceptReference::Create(
7442 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7443 (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7444 return CR;
7445}
7446
7447void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7448 TL.setNameLoc(readSourceLocation());
7449 if (Reader.readBool())
7450 TL.setConceptReference(Reader.readConceptReference());
7451 if (Reader.readBool())
7452 TL.setRParenLoc(readSourceLocation());
7453}
7454
7455void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7457 TL.setElaboratedKeywordLoc(readSourceLocation());
7458 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7459 TL.setTemplateNameLoc(readSourceLocation());
7460}
7461
7463 TL.setElaboratedKeywordLoc(readSourceLocation());
7464 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7465 TL.setNameLoc(readSourceLocation());
7466}
7467
7468void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7469 VisitTagTypeLoc(TL);
7470}
7471
7472void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7473 VisitTagTypeLoc(TL);
7474}
7475
7476void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7477
7478void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7479 TL.setAttr(ReadAttr());
7480}
7481
7482void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7483 // Nothing to do
7484}
7485
7486void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7487 // Nothing to do.
7488}
7489
7490void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7491 HLSLAttributedResourceTypeLoc TL) {
7492 // Nothing to do.
7493}
7494
7495void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7496 // Nothing to do.
7497}
7498
7499void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7500 TL.setNameLoc(readSourceLocation());
7501}
7502
7503void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7504 SubstTemplateTypeParmTypeLoc TL) {
7505 TL.setNameLoc(readSourceLocation());
7506}
7507
7508void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7509 SubstTemplateTypeParmPackTypeLoc TL) {
7510 TL.setNameLoc(readSourceLocation());
7511}
7512
7513void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7514 SubstBuiltinTemplatePackTypeLoc TL) {
7515 TL.setNameLoc(readSourceLocation());
7516}
7517
7518void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7519 TemplateSpecializationTypeLoc TL) {
7520 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7521 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7522 SourceLocation TemplateKeywordLoc = readSourceLocation();
7523 SourceLocation NameLoc = readSourceLocation();
7524 SourceLocation LAngleLoc = readSourceLocation();
7525 SourceLocation RAngleLoc = readSourceLocation();
7526 TL.set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7527 LAngleLoc, RAngleLoc);
7528 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.getArgLocInfos();
7529 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7530 Args[I] = Reader.readTemplateArgumentLocInfo(
7531 TL.getTypePtr()->template_arguments()[I].getKind());
7532}
7533
7534void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7535 TL.setLParenLoc(readSourceLocation());
7536 TL.setRParenLoc(readSourceLocation());
7537}
7538
7539void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7540 TL.setElaboratedKeywordLoc(readSourceLocation());
7541 TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7542 TL.setNameLoc(readSourceLocation());
7543}
7544
7545void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7546 TL.setEllipsisLoc(readSourceLocation());
7547}
7548
7549void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7550 TL.setNameLoc(readSourceLocation());
7551 TL.setNameEndLoc(readSourceLocation());
7552}
7553
7554void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7555 if (TL.getNumProtocols()) {
7556 TL.setProtocolLAngleLoc(readSourceLocation());
7557 TL.setProtocolRAngleLoc(readSourceLocation());
7558 }
7559 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7560 TL.setProtocolLoc(i, readSourceLocation());
7561}
7562
7563void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7564 TL.setHasBaseTypeAsWritten(Reader.readBool());
7565 TL.setTypeArgsLAngleLoc(readSourceLocation());
7566 TL.setTypeArgsRAngleLoc(readSourceLocation());
7567 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7568 TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7569 TL.setProtocolLAngleLoc(readSourceLocation());
7570 TL.setProtocolRAngleLoc(readSourceLocation());
7571 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7572 TL.setProtocolLoc(i, readSourceLocation());
7573}
7574
7575void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7576 TL.setStarLoc(readSourceLocation());
7577}
7578
7579void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7580 TL.setKWLoc(readSourceLocation());
7581 TL.setLParenLoc(readSourceLocation());
7582 TL.setRParenLoc(readSourceLocation());
7583}
7584
7585void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7586 TL.setKWLoc(readSourceLocation());
7587}
7588
7589void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7590 TL.setNameLoc(readSourceLocation());
7591}
7592
7593void TypeLocReader::VisitDependentBitIntTypeLoc(
7594 clang::DependentBitIntTypeLoc TL) {
7595 TL.setNameLoc(readSourceLocation());
7596}
7597
7598void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7599 // Nothing to do.
7600}
7601
7603 TypeLocReader TLR(*this);
7604 for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7605 TLR.Visit(TL);
7606}
7607
7609 QualType InfoTy = readType();
7610 if (InfoTy.isNull())
7611 return nullptr;
7612
7613 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7614 readTypeLoc(TInfo->getTypeLoc());
7615 return TInfo;
7616}
7617
7619 return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7620}
7621
7623 return ID >> 32;
7624}
7625
7627 // We don't need to erase the higher bits since if these bits are not 0,
7628 // it must be larger than NUM_PREDEF_TYPE_IDS.
7630}
7631
7632std::pair<ModuleFile *, unsigned>
7633ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7634 assert(!isPredefinedType(ID) &&
7635 "Predefined type shouldn't be in TypesLoaded");
7636 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7637 assert(ModuleFileIndex && "Untranslated Local Decl?");
7638
7639 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7640 assert(OwningModuleFile &&
7641 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7642
7643 return {OwningModuleFile,
7644 OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7645}
7646
7648 assert(ContextObj && "reading type with no AST context");
7649 ASTContext &Context = *ContextObj;
7650
7651 unsigned FastQuals = ID & Qualifiers::FastMask;
7652
7653 if (isPredefinedType(ID)) {
7654 QualType T;
7655 unsigned Index = getIndexForTypeID(ID);
7656 switch ((PredefinedTypeIDs)Index) {
7658 // We should never use this one.
7659 llvm_unreachable("Invalid predefined type");
7660 break;
7662 return QualType();
7664 T = Context.VoidTy;
7665 break;
7667 T = Context.BoolTy;
7668 break;
7671 // FIXME: Check that the signedness of CharTy is correct!
7672 T = Context.CharTy;
7673 break;
7675 T = Context.UnsignedCharTy;
7676 break;
7678 T = Context.UnsignedShortTy;
7679 break;
7681 T = Context.UnsignedIntTy;
7682 break;
7684 T = Context.UnsignedLongTy;
7685 break;
7687 T = Context.UnsignedLongLongTy;
7688 break;
7690 T = Context.UnsignedInt128Ty;
7691 break;
7693 T = Context.SignedCharTy;
7694 break;
7696 T = Context.WCharTy;
7697 break;
7699 T = Context.ShortTy;
7700 break;
7701 case PREDEF_TYPE_INT_ID:
7702 T = Context.IntTy;
7703 break;
7705 T = Context.LongTy;
7706 break;
7708 T = Context.LongLongTy;
7709 break;
7711 T = Context.Int128Ty;
7712 break;
7714 T = Context.BFloat16Ty;
7715 break;
7717 T = Context.HalfTy;
7718 break;
7720 T = Context.FloatTy;
7721 break;
7723 T = Context.DoubleTy;
7724 break;
7726 T = Context.LongDoubleTy;
7727 break;
7729 T = Context.ShortAccumTy;
7730 break;
7732 T = Context.AccumTy;
7733 break;
7735 T = Context.LongAccumTy;
7736 break;
7738 T = Context.UnsignedShortAccumTy;
7739 break;
7741 T = Context.UnsignedAccumTy;
7742 break;
7744 T = Context.UnsignedLongAccumTy;
7745 break;
7747 T = Context.ShortFractTy;
7748 break;
7750 T = Context.FractTy;
7751 break;
7753 T = Context.LongFractTy;
7754 break;
7756 T = Context.UnsignedShortFractTy;
7757 break;
7759 T = Context.UnsignedFractTy;
7760 break;
7762 T = Context.UnsignedLongFractTy;
7763 break;
7765 T = Context.SatShortAccumTy;
7766 break;
7768 T = Context.SatAccumTy;
7769 break;
7771 T = Context.SatLongAccumTy;
7772 break;
7774 T = Context.SatUnsignedShortAccumTy;
7775 break;
7777 T = Context.SatUnsignedAccumTy;
7778 break;
7780 T = Context.SatUnsignedLongAccumTy;
7781 break;
7783 T = Context.SatShortFractTy;
7784 break;
7786 T = Context.SatFractTy;
7787 break;
7789 T = Context.SatLongFractTy;
7790 break;
7792 T = Context.SatUnsignedShortFractTy;
7793 break;
7795 T = Context.SatUnsignedFractTy;
7796 break;
7798 T = Context.SatUnsignedLongFractTy;
7799 break;
7801 T = Context.Float16Ty;
7802 break;
7804 T = Context.Float128Ty;
7805 break;
7807 T = Context.Ibm128Ty;
7808 break;
7810 T = Context.OverloadTy;
7811 break;
7813 T = Context.UnresolvedTemplateTy;
7814 break;
7816 T = Context.BoundMemberTy;
7817 break;
7819 T = Context.PseudoObjectTy;
7820 break;
7822 T = Context.DependentTy;
7823 break;
7825 T = Context.UnknownAnyTy;
7826 break;
7828 T = Context.NullPtrTy;
7829 break;
7831 T = Context.Char8Ty;
7832 break;
7834 T = Context.Char16Ty;
7835 break;
7837 T = Context.Char32Ty;
7838 break;
7840 T = Context.ObjCBuiltinIdTy;
7841 break;
7843 T = Context.ObjCBuiltinClassTy;
7844 break;
7846 T = Context.ObjCBuiltinSelTy;
7847 break;
7848#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7849 case PREDEF_TYPE_##Id##_ID: \
7850 T = Context.SingletonId; \
7851 break;
7852#include "clang/Basic/OpenCLImageTypes.def"
7853#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7854 case PREDEF_TYPE_##Id##_ID: \
7855 T = Context.Id##Ty; \
7856 break;
7857#include "clang/Basic/OpenCLExtensionTypes.def"
7859 T = Context.OCLSamplerTy;
7860 break;
7862 T = Context.OCLEventTy;
7863 break;
7865 T = Context.OCLClkEventTy;
7866 break;
7868 T = Context.OCLQueueTy;
7869 break;
7871 T = Context.OCLReserveIDTy;
7872 break;
7874 T = Context.getAutoDeductType();
7875 break;
7877 T = Context.getAutoRRefDeductType();
7878 break;
7880 T = Context.ARCUnbridgedCastTy;
7881 break;
7883 T = Context.BuiltinFnTy;
7884 break;
7886 T = Context.IncompleteMatrixIdxTy;
7887 break;
7889 T = Context.ArraySectionTy;
7890 break;
7892 T = Context.OMPArrayShapingTy;
7893 break;
7895 T = Context.OMPIteratorTy;
7896 break;
7897#define SVE_TYPE(Name, Id, SingletonId) \
7898 case PREDEF_TYPE_##Id##_ID: \
7899 T = Context.SingletonId; \
7900 break;
7901#include "clang/Basic/AArch64ACLETypes.def"
7902#define PPC_VECTOR_TYPE(Name, Id, Size) \
7903 case PREDEF_TYPE_##Id##_ID: \
7904 T = Context.Id##Ty; \
7905 break;
7906#include "clang/Basic/PPCTypes.def"
7907#define RVV_TYPE(Name, Id, SingletonId) \
7908 case PREDEF_TYPE_##Id##_ID: \
7909 T = Context.SingletonId; \
7910 break;
7911#include "clang/Basic/RISCVVTypes.def"
7912#define WASM_TYPE(Name, Id, SingletonId) \
7913 case PREDEF_TYPE_##Id##_ID: \
7914 T = Context.SingletonId; \
7915 break;
7916#include "clang/Basic/WebAssemblyReferenceTypes.def"
7917#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
7918 case PREDEF_TYPE_##Id##_ID: \
7919 T = Context.SingletonId; \
7920 break;
7921#include "clang/Basic/AMDGPUTypes.def"
7922#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
7923 case PREDEF_TYPE_##Id##_ID: \
7924 T = Context.SingletonId; \
7925 break;
7926#include "clang/Basic/HLSLIntangibleTypes.def"
7927 }
7928
7929 assert(!T.isNull() && "Unknown predefined type");
7930 return T.withFastQualifiers(FastQuals);
7931 }
7932
7933 unsigned Index = translateTypeIDToIndex(ID).second;
7934
7935 assert(Index < TypesLoaded.size() && "Type index out-of-range");
7936 if (TypesLoaded[Index].isNull()) {
7937 TypesLoaded[Index] = readTypeRecord(ID);
7938 if (TypesLoaded[Index].isNull())
7939 return QualType();
7940
7941 TypesLoaded[Index]->setFromAST();
7942 if (DeserializationListener)
7943 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7944 TypesLoaded[Index]);
7945 }
7946
7947 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7948}
7949
7951 return GetType(getGlobalTypeID(F, LocalID));
7952}
7953
7955 LocalTypeID LocalID) const {
7956 if (isPredefinedType(LocalID))
7957 return LocalID;
7958
7959 if (!F.ModuleOffsetMap.empty())
7960 ReadModuleOffsetMap(F);
7961
7962 unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
7963 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
7964
7965 if (ModuleFileIndex == 0)
7967
7968 ModuleFile &MF =
7969 ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
7970 ModuleFileIndex = MF.Index + 1;
7971 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
7972}
7973
7976 switch (Kind) {
7978 return readExpr();
7980 return readTypeSourceInfo();
7983 SourceLocation TemplateKWLoc = readSourceLocation();
7985 SourceLocation TemplateNameLoc = readSourceLocation();
7988 : SourceLocation();
7989 return TemplateArgumentLocInfo(getASTContext(), TemplateKWLoc, QualifierLoc,
7990 TemplateNameLoc, EllipsisLoc);
7991 }
7998 // FIXME: Is this right?
7999 return TemplateArgumentLocInfo();
8000 }
8001 llvm_unreachable("unexpected template argument loc");
8002}
8003
8013
8016 Result.setLAngleLoc(readSourceLocation());
8017 Result.setRAngleLoc(readSourceLocation());
8018 unsigned NumArgsAsWritten = readInt();
8019 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
8020 Result.addArgument(readTemplateArgumentLoc());
8021}
8022
8029
8031
8033 if (NumCurrentElementsDeserializing) {
8034 // We arrange to not care about the complete redeclaration chain while we're
8035 // deserializing. Just remember that the AST has marked this one as complete
8036 // but that it's not actually complete yet, so we know we still need to
8037 // complete it later.
8038 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
8039 return;
8040 }
8041
8042 if (!D->getDeclContext()) {
8043 assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
8044 return;
8045 }
8046
8047 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
8048
8049 // If this is a named declaration, complete it by looking it up
8050 // within its context.
8051 //
8052 // FIXME: Merging a function definition should merge
8053 // all mergeable entities within it.
8055 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
8056 if (!getContext().getLangOpts().CPlusPlus &&
8058 // Outside of C++, we don't have a lookup table for the TU, so update
8059 // the identifier instead. (For C++ modules, we don't store decls
8060 // in the serialized identifier table, so we do the lookup in the TU.)
8061 auto *II = Name.getAsIdentifierInfo();
8062 assert(II && "non-identifier name in C?");
8063 if (II->isOutOfDate())
8065 } else
8066 DC->lookup(Name);
8068 // Find all declarations of this kind from the relevant context.
8069 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
8070 auto *DC = cast<DeclContext>(DCDecl);
8073 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
8074 }
8075 }
8076 }
8077
8080 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8081 Template = CTSD->getSpecializedTemplate();
8082 Args = CTSD->getTemplateArgs().asArray();
8083 } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8084 Template = VTSD->getSpecializedTemplate();
8085 Args = VTSD->getTemplateArgs().asArray();
8086 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
8087 if (auto *Tmplt = FD->getPrimaryTemplate()) {
8088 Template = Tmplt;
8089 Args = FD->getTemplateSpecializationArgs()->asArray();
8090 }
8091 }
8092
8093 if (Template) {
8094 // For partitial specialization, load all the specializations for safety.
8097 Template->loadLazySpecializationsImpl();
8098 else
8099 Template->loadLazySpecializationsImpl(Args);
8100 }
8101}
8102
8105 RecordLocation Loc = getLocalBitOffset(Offset);
8106 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8107 SavedStreamPosition SavedPosition(Cursor);
8108 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8109 Error(std::move(Err));
8110 return nullptr;
8111 }
8112 ReadingKindTracker ReadingKind(Read_Decl, *this);
8113 Deserializing D(this);
8114
8115 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8116 if (!MaybeCode) {
8117 Error(MaybeCode.takeError());
8118 return nullptr;
8119 }
8120 unsigned Code = MaybeCode.get();
8121
8122 ASTRecordReader Record(*this, *Loc.F);
8123 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8124 if (!MaybeRecCode) {
8125 Error(MaybeRecCode.takeError());
8126 return nullptr;
8127 }
8128 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
8129 Error("malformed AST file: missing C++ ctor initializers");
8130 return nullptr;
8131 }
8132
8133 return Record.readCXXCtorInitializers();
8134}
8135
8137 assert(ContextObj && "reading base specifiers with no AST context");
8138 ASTContext &Context = *ContextObj;
8139
8140 RecordLocation Loc = getLocalBitOffset(Offset);
8141 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8142 SavedStreamPosition SavedPosition(Cursor);
8143 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8144 Error(std::move(Err));
8145 return nullptr;
8146 }
8147 ReadingKindTracker ReadingKind(Read_Decl, *this);
8148 Deserializing D(this);
8149
8150 Expected<unsigned> MaybeCode = Cursor.ReadCode();
8151 if (!MaybeCode) {
8152 Error(MaybeCode.takeError());
8153 return nullptr;
8154 }
8155 unsigned Code = MaybeCode.get();
8156
8157 ASTRecordReader Record(*this, *Loc.F);
8158 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8159 if (!MaybeRecCode) {
8160 Error(MaybeCode.takeError());
8161 return nullptr;
8162 }
8163 unsigned RecCode = MaybeRecCode.get();
8164
8165 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8166 Error("malformed AST file: missing C++ base specifiers");
8167 return nullptr;
8168 }
8169
8170 unsigned NumBases = Record.readInt();
8171 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8172 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8173 for (unsigned I = 0; I != NumBases; ++I)
8174 Bases[I] = Record.readCXXBaseSpecifier();
8175 return Bases;
8176}
8177
8179 LocalDeclID LocalID) const {
8180 if (LocalID < NUM_PREDEF_DECL_IDS)
8181 return GlobalDeclID(LocalID.getRawValue());
8182
8183 unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8184 DeclID ID = LocalID.getLocalDeclIndex();
8185
8186 if (!F.ModuleOffsetMap.empty())
8187 ReadModuleOffsetMap(F);
8188
8189 ModuleFile *OwningModuleFile =
8190 OwningModuleFileIndex == 0
8191 ? &F
8192 : F.TransitiveImports[OwningModuleFileIndex - 1];
8193
8194 if (OwningModuleFileIndex == 0)
8195 ID -= NUM_PREDEF_DECL_IDS;
8196
8197 uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8198 return GlobalDeclID(NewModuleFileIndex, ID);
8199}
8200
8202 // Predefined decls aren't from any module.
8203 if (ID < NUM_PREDEF_DECL_IDS)
8204 return false;
8205
8206 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8207 return M.Index == ModuleFileIndex - 1;
8208}
8209
8211 // Predefined decls aren't from any module.
8212 if (ID < NUM_PREDEF_DECL_IDS)
8213 return nullptr;
8214
8215 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8216 assert(ModuleFileIndex && "Untranslated Local Decl?");
8217
8218 return &getModuleManager()[ModuleFileIndex - 1];
8219}
8220
8222 if (!D->isFromASTFile())
8223 return nullptr;
8224
8225 return getOwningModuleFile(D->getGlobalID());
8226}
8227
8229 if (ID < NUM_PREDEF_DECL_IDS)
8230 return SourceLocation();
8231
8232 if (Decl *D = GetExistingDecl(ID))
8233 return D->getLocation();
8234
8235 SourceLocation Loc;
8236 DeclCursorForID(ID, Loc);
8237 return Loc;
8238}
8239
8240Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8241 assert(ContextObj && "reading predefined decl without AST context");
8242 ASTContext &Context = *ContextObj;
8243 Decl *NewLoaded = nullptr;
8244 switch (ID) {
8246 return nullptr;
8247
8249 return Context.getTranslationUnitDecl();
8250
8252 if (Context.ObjCIdDecl)
8253 return Context.ObjCIdDecl;
8254 NewLoaded = Context.getObjCIdDecl();
8255 break;
8256
8258 if (Context.ObjCSelDecl)
8259 return Context.ObjCSelDecl;
8260 NewLoaded = Context.getObjCSelDecl();
8261 break;
8262
8264 if (Context.ObjCClassDecl)
8265 return Context.ObjCClassDecl;
8266 NewLoaded = Context.getObjCClassDecl();
8267 break;
8268
8270 if (Context.ObjCProtocolClassDecl)
8271 return Context.ObjCProtocolClassDecl;
8272 NewLoaded = Context.getObjCProtocolDecl();
8273 break;
8274
8276 if (Context.Int128Decl)
8277 return Context.Int128Decl;
8278 NewLoaded = Context.getInt128Decl();
8279 break;
8280
8282 if (Context.UInt128Decl)
8283 return Context.UInt128Decl;
8284 NewLoaded = Context.getUInt128Decl();
8285 break;
8286
8288 if (Context.ObjCInstanceTypeDecl)
8289 return Context.ObjCInstanceTypeDecl;
8290 NewLoaded = Context.getObjCInstanceTypeDecl();
8291 break;
8292
8294 if (Context.BuiltinVaListDecl)
8295 return Context.BuiltinVaListDecl;
8296 NewLoaded = Context.getBuiltinVaListDecl();
8297 break;
8298
8300 if (Context.VaListTagDecl)
8301 return Context.VaListTagDecl;
8302 NewLoaded = Context.getVaListTagDecl();
8303 break;
8304
8306 if (Context.BuiltinMSVaListDecl)
8307 return Context.BuiltinMSVaListDecl;
8308 NewLoaded = Context.getBuiltinMSVaListDecl();
8309 break;
8310
8312 // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8313 return Context.getMSGuidTagDecl();
8314
8316 if (Context.ExternCContext)
8317 return Context.ExternCContext;
8318 NewLoaded = Context.getExternCContextDecl();
8319 break;
8320
8322 if (Context.CFConstantStringTypeDecl)
8323 return Context.CFConstantStringTypeDecl;
8324 NewLoaded = Context.getCFConstantStringDecl();
8325 break;
8326
8328 if (Context.CFConstantStringTagDecl)
8329 return Context.CFConstantStringTagDecl;
8330 NewLoaded = Context.getCFConstantStringTagDecl();
8331 break;
8332
8334 return Context.getMSTypeInfoTagDecl();
8335
8336#define BuiltinTemplate(BTName) \
8337 case PREDEF_DECL##BTName##_ID: \
8338 if (Context.Decl##BTName) \
8339 return Context.Decl##BTName; \
8340 NewLoaded = Context.get##BTName##Decl(); \
8341 break;
8342#include "clang/Basic/BuiltinTemplates.inc"
8343
8345 llvm_unreachable("Invalid decl ID");
8346 break;
8347 }
8348
8349 assert(NewLoaded && "Failed to load predefined decl?");
8350
8351 if (DeserializationListener)
8352 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8353
8354 return NewLoaded;
8355}
8356
8357unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8358 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8359 if (!OwningModuleFile) {
8360 assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8361 return GlobalID.getRawValue();
8362 }
8363
8364 return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8365}
8366
8368 assert(ContextObj && "reading decl with no AST context");
8369
8370 if (ID < NUM_PREDEF_DECL_IDS) {
8371 Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8372 if (D) {
8373 // Track that we have merged the declaration with ID \p ID into the
8374 // pre-existing predefined declaration \p D.
8375 auto &Merged = KeyDecls[D->getCanonicalDecl()];
8376 if (Merged.empty())
8377 Merged.push_back(ID);
8378 }
8379 return D;
8380 }
8381
8382 unsigned Index = translateGlobalDeclIDToIndex(ID);
8383
8384 if (Index >= DeclsLoaded.size()) {
8385 assert(0 && "declaration ID out-of-range for AST file");
8386 Error("declaration ID out-of-range for AST file");
8387 return nullptr;
8388 }
8389
8390 return DeclsLoaded[Index];
8391}
8392
8394 if (ID < NUM_PREDEF_DECL_IDS)
8395 return GetExistingDecl(ID);
8396
8397 unsigned Index = translateGlobalDeclIDToIndex(ID);
8398
8399 if (Index >= DeclsLoaded.size()) {
8400 assert(0 && "declaration ID out-of-range for AST file");
8401 Error("declaration ID out-of-range for AST file");
8402 return nullptr;
8403 }
8404
8405 if (!DeclsLoaded[Index]) {
8406 ReadDeclRecord(ID);
8407 if (DeserializationListener)
8408 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8409 }
8410
8411 return DeclsLoaded[Index];
8412}
8413
8415 GlobalDeclID GlobalID) {
8416 if (GlobalID < NUM_PREDEF_DECL_IDS)
8417 return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8418
8419 if (!M.ModuleOffsetMap.empty())
8420 ReadModuleOffsetMap(M);
8421
8422 ModuleFile *Owner = getOwningModuleFile(GlobalID);
8423 DeclID ID = GlobalID.getLocalDeclIndex();
8424
8425 if (Owner == &M) {
8426 ID += NUM_PREDEF_DECL_IDS;
8427 return LocalDeclID::get(*this, M, ID);
8428 }
8429
8430 uint64_t OrignalModuleFileIndex = 0;
8431 for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8432 if (M.TransitiveImports[I] == Owner) {
8433 OrignalModuleFileIndex = I + 1;
8434 break;
8435 }
8436
8437 if (!OrignalModuleFileIndex)
8438 return LocalDeclID();
8439
8440 return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8441}
8442
8444 unsigned &Idx) {
8445 if (Idx >= Record.size()) {
8446 Error("Corrupted AST file");
8447 return GlobalDeclID(0);
8448 }
8449
8450 return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8451}
8452
8453/// Resolve the offset of a statement into a statement.
8454///
8455/// This operation will read a new statement from the external
8456/// source each time it is called, and is meant to be used via a
8457/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
8459 // Switch case IDs are per Decl.
8461
8462 // Offset here is a global offset across the entire chain.
8463 RecordLocation Loc = getLocalBitOffset(Offset);
8464 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8465 Error(std::move(Err));
8466 return nullptr;
8467 }
8468 assert(NumCurrentElementsDeserializing == 0 &&
8469 "should not be called while already deserializing");
8470 Deserializing D(this);
8471 return ReadStmtFromStream(*Loc.F);
8472}
8473
8474bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8475 const Decl *D) {
8476 assert(D);
8477
8478 auto It = SpecLookups.find(D);
8479 if (It == SpecLookups.end())
8480 return false;
8481
8482 // Get Decl may violate the iterator from SpecializationsLookups so we store
8483 // the DeclIDs in ahead.
8485 It->second.Table.findAll();
8486
8487 // Since we've loaded all the specializations, we can erase it from
8488 // the lookup table.
8489 SpecLookups.erase(It);
8490
8491 bool NewSpecsFound = false;
8492 Deserializing LookupResults(this);
8493 for (auto &Info : Infos) {
8494 if (GetExistingDecl(Info))
8495 continue;
8496 NewSpecsFound = true;
8497 GetDecl(Info);
8498 }
8499
8500 return NewSpecsFound;
8501}
8502
8503bool ASTReader::LoadExternalSpecializations(const Decl *D, bool OnlyPartial) {
8504 assert(D);
8505
8507 bool NewSpecsFound =
8508 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8509 if (OnlyPartial)
8510 return NewSpecsFound;
8511
8512 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8513 return NewSpecsFound;
8514}
8515
8516bool ASTReader::LoadExternalSpecializationsImpl(
8517 SpecLookupTableTy &SpecLookups, const Decl *D,
8518 ArrayRef<TemplateArgument> TemplateArgs) {
8519 assert(D);
8520
8521 auto It = SpecLookups.find(D);
8522 if (It == SpecLookups.end())
8523 return false;
8524
8525 llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8526 std::string Name;
8527 llvm::raw_string_ostream OS(Name);
8528 auto *ND = cast<NamedDecl>(D);
8529 ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
8530 /*Qualified=*/true);
8531 return Name;
8532 });
8533
8534 Deserializing LookupResults(this);
8535 auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8536
8537 // Get Decl may violate the iterator from SpecLookups
8539 It->second.Table.find(HashValue);
8540
8541 bool NewSpecsFound = false;
8542 for (auto &Info : Infos) {
8543 if (GetExistingDecl(Info))
8544 continue;
8545 NewSpecsFound = true;
8546 GetDecl(Info);
8547 }
8548
8549 return NewSpecsFound;
8550}
8551
8553 const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8554 assert(D);
8555
8556 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8557 PartialSpecializationsLookups, D, TemplateArgs);
8558 NewDeclsFound |=
8559 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8560
8561 return NewDeclsFound;
8562}
8563
8565 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8566 SmallVectorImpl<Decl *> &Decls) {
8567 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8568
8569 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8570 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8571 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8572 auto K = (Decl::Kind)+LexicalDecls[I];
8573 if (!IsKindWeWant(K))
8574 continue;
8575
8576 auto ID = (DeclID) + LexicalDecls[I + 1];
8577
8578 // Don't add predefined declarations to the lexical context more
8579 // than once.
8580 if (ID < NUM_PREDEF_DECL_IDS) {
8581 if (PredefsVisited[ID])
8582 continue;
8583
8584 PredefsVisited[ID] = true;
8585 }
8586
8587 if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8588 assert(D->getKind() == K && "wrong kind for lexical decl");
8589 if (!DC->isDeclInLexicalTraversal(D))
8590 Decls.push_back(D);
8591 }
8592 }
8593 };
8594
8595 if (isa<TranslationUnitDecl>(DC)) {
8596 for (const auto &Lexical : TULexicalDecls)
8597 Visit(Lexical.first, Lexical.second);
8598 } else {
8599 auto I = LexicalDecls.find(DC);
8600 if (I != LexicalDecls.end())
8601 Visit(I->second.first, I->second.second);
8602 }
8603
8604 ++NumLexicalDeclContextsRead;
8605}
8606
8607namespace {
8608
8609class UnalignedDeclIDComp {
8610 ASTReader &Reader;
8611 ModuleFile &Mod;
8612
8613public:
8614 UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8615 : Reader(Reader), Mod(M) {}
8616
8617 bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8618 SourceLocation LHS = getLocation(L);
8619 SourceLocation RHS = getLocation(R);
8620 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8621 }
8622
8623 bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8624 SourceLocation RHS = getLocation(R);
8625 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8626 }
8627
8628 bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8629 SourceLocation LHS = getLocation(L);
8630 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8631 }
8632
8633 SourceLocation getLocation(unaligned_decl_id_t ID) const {
8634 return Reader.getSourceManager().getFileLoc(
8636 Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8637 }
8638};
8639
8640} // namespace
8641
8643 unsigned Offset, unsigned Length,
8644 SmallVectorImpl<Decl *> &Decls) {
8646
8647 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
8648 if (I == FileDeclIDs.end())
8649 return;
8650
8651 FileDeclsInfo &DInfo = I->second;
8652 if (DInfo.Decls.empty())
8653 return;
8654
8656 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
8657 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
8658
8659 UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
8661 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8662 if (BeginIt != DInfo.Decls.begin())
8663 --BeginIt;
8664
8665 // If we are pointing at a top-level decl inside an objc container, we need
8666 // to backtrack until we find it otherwise we will fail to report that the
8667 // region overlaps with an objc container.
8668 while (BeginIt != DInfo.Decls.begin() &&
8669 GetDecl(getGlobalDeclID(*DInfo.Mod,
8670 LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
8671 ->isTopLevelDeclInObjCContainer())
8672 --BeginIt;
8673
8675 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8676 if (EndIt != DInfo.Decls.end())
8677 ++EndIt;
8678
8679 for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
8680 ++DIt)
8681 Decls.push_back(GetDecl(getGlobalDeclID(
8682 *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
8683}
8684
8686 DeclarationName Name,
8687 const DeclContext *OriginalDC) {
8688 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
8689 "DeclContext has no visible decls in storage");
8690 if (!Name)
8691 return false;
8692
8693 // Load the list of declarations.
8696
8697 auto Find = [&, this](auto &&Table, auto &&Key) {
8698 for (GlobalDeclID ID : Table.find(Key)) {
8700 if (ND->getDeclName() == Name && Found.insert(ND).second)
8701 Decls.push_back(ND);
8702 }
8703 };
8704
8705 Deserializing LookupResults(this);
8706
8707 // FIXME: Clear the redundancy with templated lambda in C++20 when that's
8708 // available.
8709 if (auto It = Lookups.find(DC); It != Lookups.end()) {
8710 ++NumVisibleDeclContextsRead;
8711 Find(It->second.Table, Name);
8712 }
8713
8714 auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
8715 if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8716 ++NumModuleLocalVisibleDeclContexts;
8717 Find(It->second.Table, std::make_pair(Name, NamedModule));
8718 }
8719 };
8720 if (auto *NamedModule =
8721 OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8722 : nullptr)
8723 FindModuleLocalLookup(NamedModule);
8724 // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
8725 // We're going to find a decl but the decl context of the lookup is
8726 // unspecified. In this case, the OriginalDC may be the decl context in other
8727 // module.
8728 if (ContextObj && ContextObj->getCurrentNamedModule())
8729 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8730
8731 if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8732 ++NumTULocalVisibleDeclContexts;
8733 Find(It->second.Table, Name);
8734 }
8735
8736 SetExternalVisibleDeclsForName(DC, Name, Decls);
8737 return !Decls.empty();
8738}
8739
8741 if (!DC->hasExternalVisibleStorage())
8742 return;
8743
8744 DeclsMap Decls;
8745
8746 auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
8747 auto It = LookupTables.find(DC);
8748 if (It == LookupTables.end())
8749 return;
8750
8751 NumRead++;
8752
8753 for (GlobalDeclID ID : It->second.Table.findAll()) {
8755 Decls[ND->getDeclName()].push_back(ND);
8756 }
8757
8758 // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
8759 };
8760
8761 findAll(Lookups, NumVisibleDeclContextsRead);
8762 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8763 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8764
8765 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
8766 SetExternalVisibleDeclsForName(DC, I->first, I->second);
8767 }
8768 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
8769}
8770
8773 auto I = Lookups.find(Primary);
8774 return I == Lookups.end() ? nullptr : &I->second;
8775}
8776
8779 auto I = ModuleLocalLookups.find(Primary);
8780 return I == ModuleLocalLookups.end() ? nullptr : &I->second;
8781}
8782
8785 auto I = TULocalLookups.find(Primary);
8786 return I == TULocalLookups.end() ? nullptr : &I->second;
8787}
8788
8791 assert(D->isCanonicalDecl());
8792 auto &LookupTable =
8793 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8794 auto I = LookupTable.find(D);
8795 return I == LookupTable.end() ? nullptr : &I->second;
8796}
8797
8799 assert(D->isCanonicalDecl());
8800 return PartialSpecializationsLookups.contains(D) ||
8801 SpecializationsLookups.contains(D);
8802}
8803
8804/// Under non-PCH compilation the consumer receives the objc methods
8805/// before receiving the implementation, and codegen depends on this.
8806/// We simulate this by deserializing and passing to consumer the methods of the
8807/// implementation before passing the deserialized implementation decl.
8809 ASTConsumer *Consumer) {
8810 assert(ImplD && Consumer);
8811
8812 for (auto *I : ImplD->methods())
8813 Consumer->HandleInterestingDecl(DeclGroupRef(I));
8814
8815 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
8816}
8817
8818void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8819 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8820 PassObjCImplDeclToConsumer(ImplD, Consumer);
8821 else
8822 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8823}
8824
8825void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8826 Consumer->HandleVTable(RD);
8827}
8828
8830 this->Consumer = Consumer;
8831
8832 if (Consumer)
8833 PassInterestingDeclsToConsumer();
8834
8835 if (DeserializationListener)
8836 DeserializationListener->ReaderInitialized(this);
8837}
8838
8840 std::fprintf(stderr, "*** AST File Statistics:\n");
8841
8842 unsigned NumTypesLoaded =
8843 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
8844 unsigned NumDeclsLoaded =
8845 DeclsLoaded.size() -
8846 llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
8847 unsigned NumIdentifiersLoaded =
8848 IdentifiersLoaded.size() -
8849 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
8850 unsigned NumMacrosLoaded =
8851 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
8852 unsigned NumSelectorsLoaded =
8853 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
8854
8855 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
8856 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
8857 NumSLocEntriesRead, TotalNumSLocEntries,
8858 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8859 if (!TypesLoaded.empty())
8860 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
8861 NumTypesLoaded, (unsigned)TypesLoaded.size(),
8862 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
8863 if (!DeclsLoaded.empty())
8864 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
8865 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
8866 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8867 if (!IdentifiersLoaded.empty())
8868 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
8869 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
8870 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8871 if (!MacrosLoaded.empty())
8872 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
8873 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
8874 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8875 if (!SelectorsLoaded.empty())
8876 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
8877 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
8878 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8879 if (TotalNumStatements)
8880 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
8881 NumStatementsRead, TotalNumStatements,
8882 ((float)NumStatementsRead/TotalNumStatements * 100));
8883 if (TotalNumMacros)
8884 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
8885 NumMacrosRead, TotalNumMacros,
8886 ((float)NumMacrosRead/TotalNumMacros * 100));
8887 if (TotalLexicalDeclContexts)
8888 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
8889 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8890 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8891 * 100));
8892 if (TotalVisibleDeclContexts)
8893 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
8894 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8895 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8896 * 100));
8897 if (TotalModuleLocalVisibleDeclContexts)
8898 std::fprintf(
8899 stderr, " %u/%u module local visible declcontexts read (%f%%)\n",
8900 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8901 ((float)NumModuleLocalVisibleDeclContexts /
8902 TotalModuleLocalVisibleDeclContexts * 100));
8903 if (TotalTULocalVisibleDeclContexts)
8904 std::fprintf(stderr, " %u/%u visible declcontexts in GMF read (%f%%)\n",
8905 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8906 ((float)NumTULocalVisibleDeclContexts /
8907 TotalTULocalVisibleDeclContexts * 100));
8908 if (TotalNumMethodPoolEntries)
8909 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
8910 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8911 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8912 * 100));
8913 if (NumMethodPoolLookups)
8914 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
8915 NumMethodPoolHits, NumMethodPoolLookups,
8916 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8917 if (NumMethodPoolTableLookups)
8918 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
8919 NumMethodPoolTableHits, NumMethodPoolTableLookups,
8920 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8921 * 100.0));
8922 if (NumIdentifierLookupHits)
8923 std::fprintf(stderr,
8924 " %u / %u identifier table lookups succeeded (%f%%)\n",
8925 NumIdentifierLookupHits, NumIdentifierLookups,
8926 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8927
8928 if (GlobalIndex) {
8929 std::fprintf(stderr, "\n");
8930 GlobalIndex->printStats();
8931 }
8932
8933 std::fprintf(stderr, "\n");
8934 dump();
8935 std::fprintf(stderr, "\n");
8936}
8937
8938template<typename Key, typename ModuleFile, unsigned InitialCapacity>
8939LLVM_DUMP_METHOD static void
8940dumpModuleIDMap(StringRef Name,
8941 const ContinuousRangeMap<Key, ModuleFile *,
8942 InitialCapacity> &Map) {
8943 if (Map.begin() == Map.end())
8944 return;
8945
8947
8948 llvm::errs() << Name << ":\n";
8949 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
8950 I != IEnd; ++I)
8951 llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName
8952 << "\n";
8953}
8954
8955LLVM_DUMP_METHOD void ASTReader::dump() {
8956 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
8957 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
8958 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
8959 dumpModuleIDMap("Global macro map", GlobalMacroMap);
8960 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
8961 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
8962 dumpModuleIDMap("Global preprocessed entity map",
8963 GlobalPreprocessedEntityMap);
8964
8965 llvm::errs() << "\n*** PCH/Modules Loaded:";
8966 for (ModuleFile &M : ModuleMgr)
8967 M.dump();
8968}
8969
8970/// Return the amount of memory used by memory buffers, breaking down
8971/// by heap-backed versus mmap'ed memory.
8973 for (ModuleFile &I : ModuleMgr) {
8974 if (llvm::MemoryBuffer *buf = I.Buffer) {
8975 size_t bytes = buf->getBufferSize();
8976 switch (buf->getBufferKind()) {
8977 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
8978 sizes.malloc_bytes += bytes;
8979 break;
8980 case llvm::MemoryBuffer::MemoryBuffer_MMap:
8981 sizes.mmap_bytes += bytes;
8982 break;
8983 }
8984 }
8985 }
8986}
8987
8989 SemaObj = &S;
8990 S.addExternalSource(this);
8991
8992 // Makes sure any declarations that were deserialized "too early"
8993 // still get added to the identifier's declaration chains.
8994 for (GlobalDeclID ID : PreloadedDeclIDs) {
8996 pushExternalDeclIntoScope(D, D->getDeclName());
8997 }
8998 PreloadedDeclIDs.clear();
8999
9000 // FIXME: What happens if these are changed by a module import?
9001 if (!FPPragmaOptions.empty()) {
9002 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
9003 FPOptionsOverride NewOverrides =
9004 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
9005 SemaObj->CurFPFeatures =
9006 NewOverrides.applyOverrides(SemaObj->getLangOpts());
9007 }
9008
9009 for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
9010 Decl *D = GetDecl(ID);
9011 if (auto *FD = dyn_cast<FunctionDecl>(D))
9012 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9013 else if (auto *BD = dyn_cast<BlockDecl>(D))
9014 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9015 else
9016 llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
9017 }
9018 DeclsWithEffectsToVerify.clear();
9019
9020 SemaObj->OpenCLFeatures = OpenCLExtensions;
9021
9022 UpdateSema();
9023}
9024
9026 assert(SemaObj && "no Sema to update");
9027
9028 // Load the offsets of the declarations that Sema references.
9029 // They will be lazily deserialized when needed.
9030 if (!SemaDeclRefs.empty()) {
9031 assert(SemaDeclRefs.size() % 3 == 0);
9032 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9033 if (!SemaObj->StdNamespace)
9034 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9035 if (!SemaObj->StdBadAlloc)
9036 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9037 if (!SemaObj->StdAlignValT)
9038 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9039 }
9040 SemaDeclRefs.clear();
9041 }
9042
9043 // Update the state of pragmas. Use the same API as if we had encountered the
9044 // pragma in the source.
9045 if(OptimizeOffPragmaLocation.isValid())
9046 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
9047 if (PragmaMSStructState != -1)
9048 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
9049 if (PointersToMembersPragmaLocation.isValid()) {
9050 SemaObj->ActOnPragmaMSPointersToMembers(
9052 PragmaMSPointersToMembersState,
9053 PointersToMembersPragmaLocation);
9054 }
9055 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9056
9057 if (PragmaAlignPackCurrentValue) {
9058 // The bottom of the stack might have a default value. It must be adjusted
9059 // to the current value to ensure that the packing state is preserved after
9060 // popping entries that were included/imported from a PCH/module.
9061 bool DropFirst = false;
9062 if (!PragmaAlignPackStack.empty() &&
9063 PragmaAlignPackStack.front().Location.isInvalid()) {
9064 assert(PragmaAlignPackStack.front().Value ==
9065 SemaObj->AlignPackStack.DefaultValue &&
9066 "Expected a default alignment value");
9067 SemaObj->AlignPackStack.Stack.emplace_back(
9068 PragmaAlignPackStack.front().SlotLabel,
9069 SemaObj->AlignPackStack.CurrentValue,
9070 SemaObj->AlignPackStack.CurrentPragmaLocation,
9071 PragmaAlignPackStack.front().PushLocation);
9072 DropFirst = true;
9073 }
9074 for (const auto &Entry :
9075 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9076 SemaObj->AlignPackStack.Stack.emplace_back(
9077 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9078 }
9079 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9080 assert(*PragmaAlignPackCurrentValue ==
9081 SemaObj->AlignPackStack.DefaultValue &&
9082 "Expected a default align and pack value");
9083 // Keep the current values.
9084 } else {
9085 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9086 SemaObj->AlignPackStack.CurrentPragmaLocation =
9087 PragmaAlignPackCurrentLocation;
9088 }
9089 }
9090 if (FpPragmaCurrentValue) {
9091 // The bottom of the stack might have a default value. It must be adjusted
9092 // to the current value to ensure that fp-pragma state is preserved after
9093 // popping entries that were included/imported from a PCH/module.
9094 bool DropFirst = false;
9095 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9096 assert(FpPragmaStack.front().Value ==
9097 SemaObj->FpPragmaStack.DefaultValue &&
9098 "Expected a default pragma float_control value");
9099 SemaObj->FpPragmaStack.Stack.emplace_back(
9100 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9101 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9102 FpPragmaStack.front().PushLocation);
9103 DropFirst = true;
9104 }
9105 for (const auto &Entry :
9106 llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
9107 SemaObj->FpPragmaStack.Stack.emplace_back(
9108 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9109 if (FpPragmaCurrentLocation.isInvalid()) {
9110 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9111 "Expected a default pragma float_control value");
9112 // Keep the current values.
9113 } else {
9114 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9115 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9116 }
9117 }
9118
9119 // For non-modular AST files, restore visiblity of modules.
9120 for (auto &Import : PendingImportedModulesSema) {
9121 if (Import.ImportLoc.isInvalid())
9122 continue;
9123 if (Module *Imported = getSubmodule(Import.ID)) {
9124 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9125 }
9126 }
9127 PendingImportedModulesSema.clear();
9128}
9129
9131 // Note that we are loading an identifier.
9132 Deserializing AnIdentifier(this);
9133
9134 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
9135 NumIdentifierLookups,
9136 NumIdentifierLookupHits);
9137
9138 // We don't need to do identifier table lookups in C++ modules (we preload
9139 // all interesting declarations, and don't need to use the scope for name
9140 // lookups). Perform the lookup in PCH files, though, since we don't build
9141 // a complete initial identifier table if we're carrying on from a PCH.
9142 if (PP.getLangOpts().CPlusPlus) {
9143 for (auto *F : ModuleMgr.pch_modules())
9144 if (Visitor(*F))
9145 break;
9146 } else {
9147 // If there is a global index, look there first to determine which modules
9148 // provably do not have any results for this identifier.
9150 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9151 if (!loadGlobalIndex()) {
9152 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9153 HitsPtr = &Hits;
9154 }
9155 }
9156
9157 ModuleMgr.visit(Visitor, HitsPtr);
9158 }
9159
9160 IdentifierInfo *II = Visitor.getIdentifierInfo();
9162 return II;
9163}
9164
9165namespace clang {
9166
9167 /// An identifier-lookup iterator that enumerates all of the
9168 /// identifiers stored within a set of AST files.
9170 /// The AST reader whose identifiers are being enumerated.
9171 const ASTReader &Reader;
9172
9173 /// The current index into the chain of AST files stored in
9174 /// the AST reader.
9175 unsigned Index;
9176
9177 /// The current position within the identifier lookup table
9178 /// of the current AST file.
9179 ASTIdentifierLookupTable::key_iterator Current;
9180
9181 /// The end position within the identifier lookup table of
9182 /// the current AST file.
9183 ASTIdentifierLookupTable::key_iterator End;
9184
9185 /// Whether to skip any modules in the ASTReader.
9186 bool SkipModules;
9187
9188 public:
9189 explicit ASTIdentifierIterator(const ASTReader &Reader,
9190 bool SkipModules = false);
9191
9192 StringRef Next() override;
9193 };
9194
9195} // namespace clang
9196
9198 bool SkipModules)
9199 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9200}
9201
9203 while (Current == End) {
9204 // If we have exhausted all of our AST files, we're done.
9205 if (Index == 0)
9206 return StringRef();
9207
9208 --Index;
9209 ModuleFile &F = Reader.ModuleMgr[Index];
9210 if (SkipModules && F.isModule())
9211 continue;
9212
9213 ASTIdentifierLookupTable *IdTable =
9215 Current = IdTable->key_begin();
9216 End = IdTable->key_end();
9217 }
9218
9219 // We have any identifiers remaining in the current AST file; return
9220 // the next one.
9221 StringRef Result = *Current;
9222 ++Current;
9223 return Result;
9224}
9225
9226namespace {
9227
9228/// A utility for appending two IdentifierIterators.
9229class ChainedIdentifierIterator : public IdentifierIterator {
9230 std::unique_ptr<IdentifierIterator> Current;
9231 std::unique_ptr<IdentifierIterator> Queued;
9232
9233public:
9234 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9235 std::unique_ptr<IdentifierIterator> Second)
9236 : Current(std::move(First)), Queued(std::move(Second)) {}
9237
9238 StringRef Next() override {
9239 if (!Current)
9240 return StringRef();
9241
9242 StringRef result = Current->Next();
9243 if (!result.empty())
9244 return result;
9245
9246 // Try the queued iterator, which may itself be empty.
9247 Current.reset();
9248 std::swap(Current, Queued);
9249 return Next();
9250 }
9251};
9252
9253} // namespace
9254
9256 if (!loadGlobalIndex()) {
9257 std::unique_ptr<IdentifierIterator> ReaderIter(
9258 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9259 std::unique_ptr<IdentifierIterator> ModulesIter(
9260 GlobalIndex->createIdentifierIterator());
9261 return new ChainedIdentifierIterator(std::move(ReaderIter),
9262 std::move(ModulesIter));
9263 }
9264
9265 return new ASTIdentifierIterator(*this);
9266}
9267
9268namespace clang {
9269namespace serialization {
9270
9272 ASTReader &Reader;
9273 Selector Sel;
9274 unsigned PriorGeneration;
9275 unsigned InstanceBits = 0;
9276 unsigned FactoryBits = 0;
9277 bool InstanceHasMoreThanOneDecl = false;
9278 bool FactoryHasMoreThanOneDecl = false;
9279 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9280 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9281
9282 public:
9284 unsigned PriorGeneration)
9285 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9286
9288 if (!M.SelectorLookupTable)
9289 return false;
9290
9291 // If we've already searched this module file, skip it now.
9292 if (M.Generation <= PriorGeneration)
9293 return true;
9294
9295 ++Reader.NumMethodPoolTableLookups;
9296 ASTSelectorLookupTable *PoolTable
9298 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9299 if (Pos == PoolTable->end())
9300 return false;
9301
9302 ++Reader.NumMethodPoolTableHits;
9303 ++Reader.NumSelectorsRead;
9304 // FIXME: Not quite happy with the statistics here. We probably should
9305 // disable this tracking when called via LoadSelector.
9306 // Also, should entries without methods count as misses?
9307 ++Reader.NumMethodPoolEntriesRead;
9309 if (Reader.DeserializationListener)
9310 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9311
9312 // Append methods in the reverse order, so that later we can process them
9313 // in the order they appear in the source code by iterating through
9314 // the vector in the reverse order.
9315 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9316 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9317 InstanceBits = Data.InstanceBits;
9318 FactoryBits = Data.FactoryBits;
9319 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9320 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9321 return false;
9322 }
9323
9324 /// Retrieve the instance methods found by this visitor.
9326 return InstanceMethods;
9327 }
9328
9329 /// Retrieve the instance methods found by this visitor.
9331 return FactoryMethods;
9332 }
9333
9334 unsigned getInstanceBits() const { return InstanceBits; }
9335 unsigned getFactoryBits() const { return FactoryBits; }
9336
9338 return InstanceHasMoreThanOneDecl;
9339 }
9340
9341 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9342 };
9343
9344} // namespace serialization
9345} // namespace clang
9346
9347/// Add the given set of methods to the method list.
9349 ObjCMethodList &List) {
9350 for (ObjCMethodDecl *M : llvm::reverse(Methods))
9351 S.ObjC().addMethodToGlobalList(&List, M);
9352}
9353
9355 // Get the selector generation and update it to the current generation.
9356 unsigned &Generation = SelectorGeneration[Sel];
9357 unsigned PriorGeneration = Generation;
9358 Generation = getGeneration();
9359 SelectorOutOfDate[Sel] = false;
9360
9361 // Search for methods defined with this selector.
9362 ++NumMethodPoolLookups;
9363 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9364 ModuleMgr.visit(Visitor);
9365
9366 if (Visitor.getInstanceMethods().empty() &&
9367 Visitor.getFactoryMethods().empty())
9368 return;
9369
9370 ++NumMethodPoolHits;
9371
9372 if (!getSema())
9373 return;
9374
9375 Sema &S = *getSema();
9376 auto &Methods = S.ObjC().MethodPool[Sel];
9377
9378 Methods.first.setBits(Visitor.getInstanceBits());
9379 Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9380 Methods.second.setBits(Visitor.getFactoryBits());
9381 Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9382
9383 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9384 // when building a module we keep every method individually and may need to
9385 // update hasMoreThanOneDecl as we add the methods.
9386 addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9387 addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9388}
9389
9391 if (SelectorOutOfDate[Sel])
9392 ReadMethodPool(Sel);
9393}
9394
9397 Namespaces.clear();
9398
9399 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9400 if (NamespaceDecl *Namespace
9401 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9402 Namespaces.push_back(Namespace);
9403 }
9404}
9405
9407 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9408 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9409 UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9412 Undefined.insert(std::make_pair(D, Loc));
9413 }
9414 UndefinedButUsed.clear();
9415}
9416
9418 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9419 Exprs) {
9420 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9421 FieldDecl *FD =
9422 cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9423 uint64_t Count = DelayedDeleteExprs[Idx++];
9424 for (uint64_t C = 0; C < Count; ++C) {
9425 SourceLocation DeleteLoc =
9426 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9427 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9428 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9429 }
9430 }
9431}
9432
9434 SmallVectorImpl<VarDecl *> &TentativeDefs) {
9435 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9436 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9437 if (Var)
9438 TentativeDefs.push_back(Var);
9439 }
9440 TentativeDefinitions.clear();
9441}
9442
9445 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9447 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9448 if (D)
9449 Decls.push_back(D);
9450 }
9451 UnusedFileScopedDecls.clear();
9452}
9453
9456 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9458 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9459 if (D)
9460 Decls.push_back(D);
9461 }
9462 DelegatingCtorDecls.clear();
9463}
9464
9466 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9468 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9469 if (D)
9470 Decls.push_back(D);
9471 }
9472 ExtVectorDecls.clear();
9473}
9474
9477 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9478 ++I) {
9479 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9480 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9481 if (D)
9482 Decls.insert(D);
9483 }
9484 UnusedLocalTypedefNameCandidates.clear();
9485}
9486
9489 for (auto I : DeclsToCheckForDeferredDiags) {
9490 auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9491 if (D)
9492 Decls.insert(D);
9493 }
9494 DeclsToCheckForDeferredDiags.clear();
9495}
9496
9498 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9499 if (ReferencedSelectorsData.empty())
9500 return;
9501
9502 // If there are @selector references added them to its pool. This is for
9503 // implementation of -Wselector.
9504 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9505 unsigned I = 0;
9506 while (I < DataSize) {
9507 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9508 SourceLocation SelLoc
9509 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9510 Sels.push_back(std::make_pair(Sel, SelLoc));
9511 }
9512 ReferencedSelectorsData.clear();
9513}
9514
9516 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9517 if (WeakUndeclaredIdentifiers.empty())
9518 return;
9519
9520 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9521 IdentifierInfo *WeakId
9522 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9523 IdentifierInfo *AliasId
9524 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9525 SourceLocation Loc =
9526 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9527 WeakInfo WI(AliasId, Loc);
9528 WeakIDs.push_back(std::make_pair(WeakId, WI));
9529 }
9530 WeakUndeclaredIdentifiers.clear();
9531}
9532
9534 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9536 VTableUse &TableInfo = VTableUses[Idx++];
9537 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9538 VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9539 VT.DefinitionRequired = TableInfo.Used;
9540 VTables.push_back(VT);
9541 }
9542
9543 VTableUses.clear();
9544}
9545
9547 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9548 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9549 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9550 ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9552
9553 Pending.push_back(std::make_pair(D, Loc));
9554 }
9555 PendingInstantiations.clear();
9556}
9557
9559 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9560 &LPTMap) {
9561 for (auto &LPT : LateParsedTemplates) {
9562 ModuleFile *FMod = LPT.first;
9563 RecordDataImpl &LateParsed = LPT.second;
9564 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9565 /* In loop */) {
9566 FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9567
9568 auto LT = std::make_unique<LateParsedTemplate>();
9569 LT->D = ReadDecl(*FMod, LateParsed, Idx);
9570 LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9571
9572 ModuleFile *F = getOwningModuleFile(LT->D);
9573 assert(F && "No module");
9574
9575 unsigned TokN = LateParsed[Idx++];
9576 LT->Toks.reserve(TokN);
9577 for (unsigned T = 0; T < TokN; ++T)
9578 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9579
9580 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9581 }
9582 }
9583
9584 LateParsedTemplates.clear();
9585}
9586
9588 if (!Lambda->getLambdaContextDecl())
9589 return;
9590
9591 auto LambdaInfo =
9592 std::make_pair(Lambda->getLambdaContextDecl()->getCanonicalDecl(),
9593 Lambda->getLambdaIndexInContext());
9594
9595 // Handle the import and then include case for lambdas.
9596 if (auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9597 Iter != LambdaDeclarationsForMerging.end() &&
9598 Iter->second->isFromASTFile() && Lambda->getFirstDecl() == Lambda) {
9600 cast<CXXRecordDecl>(Iter->second)->getMostRecentDecl();
9601 Lambda->setPreviousDecl(Previous);
9602 return;
9603 }
9604
9605 // Keep track of this lambda so it can be merged with another lambda that
9606 // is loaded later.
9607 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9608}
9609
9611 // It would be complicated to avoid reading the methods anyway. So don't.
9612 ReadMethodPool(Sel);
9613}
9614
9616 assert(ID && "Non-zero identifier ID required");
9617 unsigned Index = translateIdentifierIDToIndex(ID).second;
9618 assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
9619 IdentifiersLoaded[Index] = II;
9620 if (DeserializationListener)
9621 DeserializationListener->IdentifierRead(ID, II);
9622}
9623
9624/// Set the globally-visible declarations associated with the given
9625/// identifier.
9626///
9627/// If the AST reader is currently in a state where the given declaration IDs
9628/// cannot safely be resolved, they are queued until it is safe to resolve
9629/// them.
9630///
9631/// \param II an IdentifierInfo that refers to one or more globally-visible
9632/// declarations.
9633///
9634/// \param DeclIDs the set of declaration IDs with the name @p II that are
9635/// visible at global scope.
9636///
9637/// \param Decls if non-null, this vector will be populated with the set of
9638/// deserialized declarations. These declarations will not be pushed into
9639/// scope.
9642 SmallVectorImpl<Decl *> *Decls) {
9643 if (NumCurrentElementsDeserializing && !Decls) {
9644 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9645 return;
9646 }
9647
9648 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9649 if (!SemaObj) {
9650 // Queue this declaration so that it will be added to the
9651 // translation unit scope and identifier's declaration chain
9652 // once a Sema object is known.
9653 PreloadedDeclIDs.push_back(DeclIDs[I]);
9654 continue;
9655 }
9656
9657 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
9658
9659 // If we're simply supposed to record the declarations, do so now.
9660 if (Decls) {
9661 Decls->push_back(D);
9662 continue;
9663 }
9664
9665 // Introduce this declaration into the translation-unit scope
9666 // and add it to the declaration chain for this identifier, so
9667 // that (unqualified) name lookup will find it.
9668 pushExternalDeclIntoScope(D, II);
9669 }
9670}
9671
9672std::pair<ModuleFile *, unsigned>
9673ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
9674 if (ID == 0)
9675 return {nullptr, 0};
9676
9677 unsigned ModuleFileIndex = ID >> 32;
9678 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9679
9680 assert(ModuleFileIndex && "not translating loaded IdentifierID?");
9681 assert(getModuleManager().size() > ModuleFileIndex - 1);
9682
9683 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
9684 assert(LocalID < MF.LocalNumIdentifiers);
9685 return {&MF, MF.BaseIdentifierID + LocalID};
9686}
9687
9689 if (ID == 0)
9690 return nullptr;
9691
9692 if (IdentifiersLoaded.empty()) {
9693 Error("no identifier table in AST file");
9694 return nullptr;
9695 }
9696
9697 auto [M, Index] = translateIdentifierIDToIndex(ID);
9698 if (!IdentifiersLoaded[Index]) {
9699 assert(M != nullptr && "Untranslated Identifier ID?");
9700 assert(Index >= M->BaseIdentifierID);
9701 unsigned LocalIndex = Index - M->BaseIdentifierID;
9702 const unsigned char *Data =
9703 M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
9704
9705 ASTIdentifierLookupTrait Trait(*this, *M);
9706 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
9707 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
9708 auto &II = PP.getIdentifierTable().get(Key);
9709 IdentifiersLoaded[Index] = &II;
9710 bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
9711 markIdentifierFromAST(*this, II, IsModule);
9712 if (DeserializationListener)
9713 DeserializationListener->IdentifierRead(ID, &II);
9714 }
9715
9716 return IdentifiersLoaded[Index];
9717}
9718
9722
9724 if (LocalID < NUM_PREDEF_IDENT_IDS)
9725 return LocalID;
9726
9727 if (!M.ModuleOffsetMap.empty())
9728 ReadModuleOffsetMap(M);
9729
9730 unsigned ModuleFileIndex = LocalID >> 32;
9731 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9732 ModuleFile *MF =
9733 ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
9734 assert(MF && "malformed identifier ID encoding?");
9735
9736 if (!ModuleFileIndex)
9737 LocalID -= NUM_PREDEF_IDENT_IDS;
9738
9739 return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
9740}
9741
9743 if (ID == 0)
9744 return nullptr;
9745
9746 if (MacrosLoaded.empty()) {
9747 Error("no macro table in AST file");
9748 return nullptr;
9749 }
9750
9752 if (!MacrosLoaded[ID]) {
9754 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
9755 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
9756 ModuleFile *M = I->second;
9757 unsigned Index = ID - M->BaseMacroID;
9758 MacrosLoaded[ID] =
9759 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
9760
9761 if (DeserializationListener)
9762 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
9763 MacrosLoaded[ID]);
9764 }
9765
9766 return MacrosLoaded[ID];
9767}
9768
9770 if (LocalID < NUM_PREDEF_MACRO_IDS)
9771 return LocalID;
9772
9773 if (!M.ModuleOffsetMap.empty())
9774 ReadModuleOffsetMap(M);
9775
9777 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
9778 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
9779
9780 return LocalID + I->second;
9781}
9782
9784ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
9785 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
9786 return LocalID;
9787
9788 if (!M.ModuleOffsetMap.empty())
9789 ReadModuleOffsetMap(M);
9790
9793 assert(I != M.SubmoduleRemap.end()
9794 && "Invalid index into submodule index remap");
9795
9796 return LocalID + I->second;
9797}
9798
9800 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
9801 assert(GlobalID == 0 && "Unhandled global submodule ID");
9802 return nullptr;
9803 }
9804
9805 if (GlobalID > SubmodulesLoaded.size()) {
9806 Error("submodule ID out of range in AST file");
9807 return nullptr;
9808 }
9809
9810 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
9811}
9812
9814 return getSubmodule(ID);
9815}
9816
9818 if (ID & 1) {
9819 // It's a module, look it up by submodule ID.
9820 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
9821 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
9822 } else {
9823 // It's a prefix (preamble, PCH, ...). Look it up by index.
9824 int IndexFromEnd = static_cast<int>(ID >> 1);
9825 assert(IndexFromEnd && "got reference to unknown module file");
9826 return getModuleManager().pch_modules().end()[-IndexFromEnd];
9827 }
9828}
9829
9831 if (!M)
9832 return 1;
9833
9834 // For a file representing a module, use the submodule ID of the top-level
9835 // module as the file ID. For any other kind of file, the number of such
9836 // files loaded beforehand will be the same on reload.
9837 // FIXME: Is this true even if we have an explicit module file and a PCH?
9838 if (M->isModule())
9839 return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
9840
9841 auto PCHModules = getModuleManager().pch_modules();
9842 auto I = llvm::find(PCHModules, M);
9843 assert(I != PCHModules.end() && "emitting reference to unknown file");
9844 return std::distance(I, PCHModules.end()) << 1;
9845}
9846
9847std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
9848 if (Module *M = getSubmodule(ID))
9849 return ASTSourceDescriptor(*M);
9850
9851 // If there is only a single PCH, return it instead.
9852 // Chained PCH are not supported.
9853 const auto &PCHChain = ModuleMgr.pch_modules();
9854 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9855 ModuleFile &MF = ModuleMgr.getPrimaryModule();
9856 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
9857 StringRef FileName = llvm::sys::path::filename(MF.FileName);
9858 return ASTSourceDescriptor(ModuleName,
9859 llvm::sys::path::parent_path(MF.FileName),
9860 FileName, MF.Signature);
9861 }
9862 return std::nullopt;
9863}
9864
9866 auto I = DefinitionSource.find(FD);
9867 if (I == DefinitionSource.end())
9868 return EK_ReplyHazy;
9869 return I->second ? EK_Never : EK_Always;
9870}
9871
9873 return ThisDeclarationWasADefinitionSet.contains(FD);
9874}
9875
9877 return DecodeSelector(getGlobalSelectorID(M, LocalID));
9878}
9879
9881 if (ID == 0)
9882 return Selector();
9883
9884 if (ID > SelectorsLoaded.size()) {
9885 Error("selector ID out of range in AST file");
9886 return Selector();
9887 }
9888
9889 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
9890 // Load this selector from the selector table.
9891 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
9892 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
9893 ModuleFile &M = *I->second;
9894 ASTSelectorLookupTrait Trait(*this, M);
9895 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
9896 SelectorsLoaded[ID - 1] =
9897 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
9898 if (DeserializationListener)
9899 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9900 }
9901
9902 return SelectorsLoaded[ID - 1];
9903}
9904
9908
9910 // ID 0 (the null selector) is considered an external selector.
9911 return getTotalNumSelectors() + 1;
9912}
9913
9915ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
9916 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
9917 return LocalID;
9918
9919 if (!M.ModuleOffsetMap.empty())
9920 ReadModuleOffsetMap(M);
9921
9924 assert(I != M.SelectorRemap.end()
9925 && "Invalid index into selector index remap");
9926
9927 return LocalID + I->second;
9928}
9929
9955
9957 DeclarationNameInfo NameInfo;
9958 NameInfo.setName(readDeclarationName());
9959 NameInfo.setLoc(readSourceLocation());
9960 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
9961 return NameInfo;
9962}
9963
9967
9969 auto Kind = readInt();
9970 auto ResultType = readQualType();
9971 auto Value = readAPInt();
9972 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
9973 assert(Op.isValid());
9974 return Op;
9975}
9976
9979 unsigned NumTPLists = readInt();
9980 Info.NumTemplParamLists = NumTPLists;
9981 if (NumTPLists) {
9982 Info.TemplParamLists =
9983 new (getContext()) TemplateParameterList *[NumTPLists];
9984 for (unsigned i = 0; i != NumTPLists; ++i)
9986 }
9987}
9988
9991 SourceLocation TemplateLoc = readSourceLocation();
9992 SourceLocation LAngleLoc = readSourceLocation();
9993 SourceLocation RAngleLoc = readSourceLocation();
9994
9995 unsigned NumParams = readInt();
9997 Params.reserve(NumParams);
9998 while (NumParams--)
9999 Params.push_back(readDeclAs<NamedDecl>());
10000
10001 bool HasRequiresClause = readBool();
10002 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
10003
10005 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10006 return TemplateParams;
10007}
10008
10011 bool Canonicalize) {
10012 unsigned NumTemplateArgs = readInt();
10013 TemplArgs.reserve(NumTemplateArgs);
10014 while (NumTemplateArgs--)
10015 TemplArgs.push_back(readTemplateArgument(Canonicalize));
10016}
10017
10018/// Read a UnresolvedSet structure.
10020 unsigned NumDecls = readInt();
10021 Set.reserve(getContext(), NumDecls);
10022 while (NumDecls--) {
10023 GlobalDeclID ID = readDeclID();
10025 Set.addLazyDecl(getContext(), ID, AS);
10026 }
10027}
10028
10031 bool isVirtual = readBool();
10032 bool isBaseOfClass = readBool();
10033 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
10034 bool inheritConstructors = readBool();
10036 SourceRange Range = readSourceRange();
10037 SourceLocation EllipsisLoc = readSourceLocation();
10038 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
10039 EllipsisLoc);
10040 Result.setInheritConstructors(inheritConstructors);
10041 return Result;
10042}
10043
10046 ASTContext &Context = getContext();
10047 unsigned NumInitializers = readInt();
10048 assert(NumInitializers && "wrote ctor initializers but have no inits");
10049 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
10050 for (unsigned i = 0; i != NumInitializers; ++i) {
10051 TypeSourceInfo *TInfo = nullptr;
10052 bool IsBaseVirtual = false;
10053 FieldDecl *Member = nullptr;
10054 IndirectFieldDecl *IndirectMember = nullptr;
10055
10057 switch (Type) {
10059 TInfo = readTypeSourceInfo();
10060 IsBaseVirtual = readBool();
10061 break;
10062
10064 TInfo = readTypeSourceInfo();
10065 break;
10066
10069 break;
10070
10072 IndirectMember = readDeclAs<IndirectFieldDecl>();
10073 break;
10074 }
10075
10076 SourceLocation MemberOrEllipsisLoc = readSourceLocation();
10077 Expr *Init = readExpr();
10078 SourceLocation LParenLoc = readSourceLocation();
10079 SourceLocation RParenLoc = readSourceLocation();
10080
10081 CXXCtorInitializer *BOMInit;
10083 BOMInit = new (Context)
10084 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
10085 RParenLoc, MemberOrEllipsisLoc);
10087 BOMInit = new (Context)
10088 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
10089 else if (Member)
10090 BOMInit = new (Context)
10091 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
10092 Init, RParenLoc);
10093 else
10094 BOMInit = new (Context)
10095 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
10096 LParenLoc, Init, RParenLoc);
10097
10098 if (/*IsWritten*/readBool()) {
10099 unsigned SourceOrder = readInt();
10100 BOMInit->setSourceOrder(SourceOrder);
10101 }
10102
10103 CtorInitializers[i] = BOMInit;
10104 }
10105
10106 return CtorInitializers;
10107}
10108
10111 ASTContext &Context = getContext();
10112 unsigned N = readInt();
10114 for (unsigned I = 0; I != N; ++I) {
10115 auto Kind = readNestedNameSpecifierKind();
10116 switch (Kind) {
10118 auto *NS = readDeclAs<NamespaceBaseDecl>();
10119 SourceRange Range = readSourceRange();
10120 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10121 break;
10122 }
10123
10126 if (!T)
10127 return NestedNameSpecifierLoc();
10128 SourceLocation ColonColonLoc = readSourceLocation();
10129 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10130 break;
10131 }
10132
10134 SourceLocation ColonColonLoc = readSourceLocation();
10135 Builder.MakeGlobal(Context, ColonColonLoc);
10136 break;
10137 }
10138
10141 SourceRange Range = readSourceRange();
10142 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10143 break;
10144 }
10145
10147 llvm_unreachable("unexpected null nested name specifier");
10148 }
10149 }
10150
10151 return Builder.getWithLocInContext(Context);
10152}
10153
10155 unsigned &Idx) {
10158 return SourceRange(beg, end);
10159}
10160
10162 const StringRef Blob) {
10163 unsigned Count = Record[0];
10164 const char *Byte = Blob.data();
10165 llvm::BitVector Ret = llvm::BitVector(Count, false);
10166 for (unsigned I = 0; I < Count; ++Byte)
10167 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10168 if (*Byte & (1 << Bit))
10169 Ret[I] = true;
10170 return Ret;
10171}
10172
10173/// Read a floating-point value
10174llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10175 return llvm::APFloat(Sem, readAPInt());
10176}
10177
10178// Read a string
10179std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10180 unsigned Len = Record[Idx++];
10181 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10182 Idx += Len;
10183 return Result;
10184}
10185
10186StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10187 StringRef &Blob) {
10188 unsigned Len = Record[Idx++];
10189 StringRef Result = Blob.substr(0, Len);
10190 Blob = Blob.substr(Len);
10191 return Result;
10192}
10193
10195 unsigned &Idx) {
10196 return ReadPath(F.BaseDirectory, Record, Idx);
10197}
10198
10199std::string ASTReader::ReadPath(StringRef BaseDirectory,
10200 const RecordData &Record, unsigned &Idx) {
10201 std::string Filename = ReadString(Record, Idx);
10202 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10203}
10204
10205std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10206 const RecordData &Record, unsigned &Idx,
10207 StringRef &Blob) {
10208 StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10209 return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10210}
10211
10213 unsigned &Idx) {
10214 unsigned Major = Record[Idx++];
10215 unsigned Minor = Record[Idx++];
10216 unsigned Subminor = Record[Idx++];
10217 if (Minor == 0)
10218 return VersionTuple(Major);
10219 if (Subminor == 0)
10220 return VersionTuple(Major, Minor - 1);
10221 return VersionTuple(Major, Minor - 1, Subminor - 1);
10222}
10223
10230
10231DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10232 return Diag(CurrentImportLoc, DiagID);
10233}
10234
10236 return Diags.Report(Loc, DiagID);
10237}
10238
10240 llvm::function_ref<void()> Fn) {
10241 // When Sema is available, avoid duplicate errors.
10242 if (SemaObj) {
10243 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10244 return;
10245 }
10246
10247 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10248}
10249
10250/// Retrieve the identifier table associated with the
10251/// preprocessor.
10253 return PP.getIdentifierTable();
10254}
10255
10256/// Record that the given ID maps to the given switch-case
10257/// statement.
10259 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10260 "Already have a SwitchCase with this ID");
10261 (*CurrSwitchCaseStmts)[ID] = SC;
10262}
10263
10264/// Retrieve the switch-case statement with the given ID.
10266 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10267 return (*CurrSwitchCaseStmts)[ID];
10268}
10269
10271 CurrSwitchCaseStmts->clear();
10272}
10273
10275 ASTContext &Context = getContext();
10276 std::vector<RawComment *> Comments;
10277 for (SmallVectorImpl<std::pair<BitstreamCursor,
10279 I = CommentsCursors.begin(),
10280 E = CommentsCursors.end();
10281 I != E; ++I) {
10282 Comments.clear();
10283 BitstreamCursor &Cursor = I->first;
10284 serialization::ModuleFile &F = *I->second;
10285 SavedStreamPosition SavedPosition(Cursor);
10286
10288 while (true) {
10290 Cursor.advanceSkippingSubblocks(
10291 BitstreamCursor::AF_DontPopBlockAtEnd);
10292 if (!MaybeEntry) {
10293 Error(MaybeEntry.takeError());
10294 return;
10295 }
10296 llvm::BitstreamEntry Entry = MaybeEntry.get();
10297
10298 switch (Entry.Kind) {
10299 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10300 case llvm::BitstreamEntry::Error:
10301 Error("malformed block record in AST file");
10302 return;
10303 case llvm::BitstreamEntry::EndBlock:
10304 goto NextCursor;
10305 case llvm::BitstreamEntry::Record:
10306 // The interesting case.
10307 break;
10308 }
10309
10310 // Read a record.
10311 Record.clear();
10312 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10313 if (!MaybeComment) {
10314 Error(MaybeComment.takeError());
10315 return;
10316 }
10317 switch ((CommentRecordTypes)MaybeComment.get()) {
10318 case COMMENTS_RAW_COMMENT: {
10319 unsigned Idx = 0;
10320 SourceRange SR = ReadSourceRange(F, Record, Idx);
10323 bool IsTrailingComment = Record[Idx++];
10324 bool IsAlmostTrailingComment = Record[Idx++];
10325 Comments.push_back(new (Context) RawComment(
10326 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10327 break;
10328 }
10329 }
10330 }
10331 NextCursor:
10332 for (RawComment *C : Comments) {
10333 SourceLocation CommentLoc = C->getBeginLoc();
10334 if (CommentLoc.isValid()) {
10335 FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10336 if (Loc.first.isValid())
10337 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10338 }
10339 }
10340 }
10341}
10342
10344 serialization::ModuleFile &MF, bool IncludeSystem,
10345 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10346 bool IsSystem)>
10347 Visitor) {
10348 unsigned NumUserInputs = MF.NumUserInputFiles;
10349 unsigned NumInputs = MF.InputFilesLoaded.size();
10350 assert(NumUserInputs <= NumInputs);
10351 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10352 for (unsigned I = 0; I < N; ++I) {
10353 bool IsSystem = I >= NumUserInputs;
10354 InputFileInfo IFI = getInputFileInfo(MF, I+1);
10355 Visitor(IFI, IsSystem);
10356 }
10357}
10358
10360 bool IncludeSystem, bool Complain,
10361 llvm::function_ref<void(const serialization::InputFile &IF,
10362 bool isSystem)> Visitor) {
10363 unsigned NumUserInputs = MF.NumUserInputFiles;
10364 unsigned NumInputs = MF.InputFilesLoaded.size();
10365 assert(NumUserInputs <= NumInputs);
10366 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10367 for (unsigned I = 0; I < N; ++I) {
10368 bool IsSystem = I >= NumUserInputs;
10369 InputFile IF = getInputFile(MF, I+1, Complain);
10370 Visitor(IF, IsSystem);
10371 }
10372}
10373
10376 llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10377 unsigned NumInputs = MF.InputFilesLoaded.size();
10378 for (unsigned I = 0; I < NumInputs; ++I) {
10379 InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10380 if (IFI.TopLevel && IFI.ModuleMap)
10381 if (auto FE = getInputFile(MF, I + 1).getFile())
10382 Visitor(*FE);
10383 }
10384}
10385
10386void ASTReader::finishPendingActions() {
10387 while (!PendingIdentifierInfos.empty() ||
10388 !PendingDeducedFunctionTypes.empty() ||
10389 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10390 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10391 !PendingUpdateRecords.empty() ||
10392 !PendingObjCExtensionIvarRedeclarations.empty()) {
10393 // If any identifiers with corresponding top-level declarations have
10394 // been loaded, load those declarations now.
10395 using TopLevelDeclsMap =
10396 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10397 TopLevelDeclsMap TopLevelDecls;
10398
10399 while (!PendingIdentifierInfos.empty()) {
10400 IdentifierInfo *II = PendingIdentifierInfos.back().first;
10402 std::move(PendingIdentifierInfos.back().second);
10403 PendingIdentifierInfos.pop_back();
10404
10405 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10406 }
10407
10408 // Load each function type that we deferred loading because it was a
10409 // deduced type that might refer to a local type declared within itself.
10410 for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10411 auto *FD = PendingDeducedFunctionTypes[I].first;
10412 FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10413
10414 if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10415 // If we gave a function a deduced return type, remember that we need to
10416 // propagate that along the redeclaration chain.
10417 if (DT->isDeduced()) {
10418 PendingDeducedTypeUpdates.insert(
10419 {FD->getCanonicalDecl(), FD->getReturnType()});
10420 continue;
10421 }
10422
10423 // The function has undeduced DeduceType return type. We hope we can
10424 // find the deduced type by iterating the redecls in other modules
10425 // later.
10426 PendingUndeducedFunctionDecls.push_back(FD);
10427 continue;
10428 }
10429 }
10430 PendingDeducedFunctionTypes.clear();
10431
10432 // Load each variable type that we deferred loading because it was a
10433 // deduced type that might refer to a local type declared within itself.
10434 for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10435 auto *VD = PendingDeducedVarTypes[I].first;
10436 VD->setType(GetType(PendingDeducedVarTypes[I].second));
10437 }
10438 PendingDeducedVarTypes.clear();
10439
10440 // Load pending declaration chains.
10441 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10442 loadPendingDeclChain(PendingDeclChains[I].first,
10443 PendingDeclChains[I].second);
10444 PendingDeclChains.clear();
10445
10446 // Make the most recent of the top-level declarations visible.
10447 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10448 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10449 IdentifierInfo *II = TLD->first;
10450 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10451 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10452 }
10453 }
10454
10455 // Load any pending macro definitions.
10456 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10457 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10458 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10459 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10460 // Initialize the macro history from chained-PCHs ahead of module imports.
10461 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10462 ++IDIdx) {
10463 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10464 if (!Info.M->isModule())
10465 resolvePendingMacro(II, Info);
10466 }
10467 // Handle module imports.
10468 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10469 ++IDIdx) {
10470 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10471 if (Info.M->isModule())
10472 resolvePendingMacro(II, Info);
10473 }
10474 }
10475 PendingMacroIDs.clear();
10476
10477 // Wire up the DeclContexts for Decls that we delayed setting until
10478 // recursive loading is completed.
10479 while (!PendingDeclContextInfos.empty()) {
10480 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10481 PendingDeclContextInfos.pop_front();
10482 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10483 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10484 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10485 }
10486
10487 // Perform any pending declaration updates.
10488 while (!PendingUpdateRecords.empty()) {
10489 auto Update = PendingUpdateRecords.pop_back_val();
10490 ReadingKindTracker ReadingKind(Read_Decl, *this);
10491 loadDeclUpdateRecords(Update);
10492 }
10493
10494 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10495 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10496 auto DuplicateIvars =
10497 PendingObjCExtensionIvarRedeclarations.back().second;
10499 StructuralEquivalenceContext Ctx(
10500 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10501 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10502 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10503 /*Complain =*/false,
10504 /*ErrorOnTagTypeMismatch =*/true);
10505 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10506 // Merge redeclared ivars with their predecessors.
10507 for (auto IvarPair : DuplicateIvars) {
10508 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10509 // Change semantic DeclContext but keep the lexical one.
10510 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10511 Ivar->getLexicalDeclContext(),
10512 getContext());
10513 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10514 }
10515 // Invalidate duplicate extension and the cached ivar list.
10516 ExtensionsPair.first->setInvalidDecl();
10517 ExtensionsPair.second->getClassInterface()
10518 ->getDefinition()
10519 ->setIvarList(nullptr);
10520 } else {
10521 for (auto IvarPair : DuplicateIvars) {
10522 Diag(IvarPair.first->getLocation(),
10523 diag::err_duplicate_ivar_declaration)
10524 << IvarPair.first->getIdentifier();
10525 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10526 }
10527 }
10528 PendingObjCExtensionIvarRedeclarations.pop_back();
10529 }
10530 }
10531
10532 // At this point, all update records for loaded decls are in place, so any
10533 // fake class definitions should have become real.
10534 assert(PendingFakeDefinitionData.empty() &&
10535 "faked up a class definition but never saw the real one");
10536
10537 // If we deserialized any C++ or Objective-C class definitions, any
10538 // Objective-C protocol definitions, or any redeclarable templates, make sure
10539 // that all redeclarations point to the definitions. Note that this can only
10540 // happen now, after the redeclaration chains have been fully wired.
10541 for (Decl *D : PendingDefinitions) {
10542 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10543 if (auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10544 for (auto *R = getMostRecentExistingDecl(RD); R;
10545 R = R->getPreviousDecl()) {
10546 assert((R == D) ==
10547 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10548 "declaration thinks it's the definition but it isn't");
10549 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10550 }
10551 }
10552
10553 continue;
10554 }
10555
10556 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10557 // Make sure that the ObjCInterfaceType points at the definition.
10558 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10559 ->Decl = ID;
10560
10561 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10562 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10563
10564 continue;
10565 }
10566
10567 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10568 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10569 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10570
10571 continue;
10572 }
10573
10574 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10575 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10576 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10577 }
10578 PendingDefinitions.clear();
10579
10580 for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10581 auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10582 if (auto *VD = dyn_cast<VarDecl>(D))
10583 return VD->isThisDeclarationADefinition() ||
10584 VD->isThisDeclarationADemotedDefinition();
10585
10586 if (auto *TD = dyn_cast<TagDecl>(D))
10587 return TD->isThisDeclarationADefinition() ||
10588 TD->isThisDeclarationADemotedDefinition();
10589
10590 if (auto *FD = dyn_cast<FunctionDecl>(D))
10591 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10592
10593 if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10594 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10595
10596 // Conservatively return false here.
10597 return false;
10598 };
10599
10600 auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10601 return hasDefinitionImpl(D, hasDefinitionImpl);
10602 };
10603
10604 // It is not good to prevent multiple declarations since the forward
10605 // declaration is common. Let's try to avoid duplicated definitions
10606 // only.
10608 continue;
10609
10610 Module *PM = Previous->getOwningModule();
10611 Module *DM = D->getOwningModule();
10612 Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
10614 << (DM ? DM->getTopLevelModuleName() : "global module");
10615 Diag(Previous->getLocation(), diag::note_also_found);
10616 }
10617 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10618
10619 // Load the bodies of any functions or methods we've encountered. We do
10620 // this now (delayed) so that we can be sure that the declaration chains
10621 // have been fully wired up (hasBody relies on this).
10622 // FIXME: We shouldn't require complete redeclaration chains here.
10623 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10624 PBEnd = PendingBodies.end();
10625 PB != PBEnd; ++PB) {
10626 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10627 // FIXME: Check for =delete/=default?
10628 const FunctionDecl *Defn = nullptr;
10629 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10630 FD->setLazyBody(PB->second);
10631 } else {
10632 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
10633 mergeDefinitionVisibility(NonConstDefn, FD);
10634
10635 if (!FD->isLateTemplateParsed() &&
10636 !NonConstDefn->isLateTemplateParsed() &&
10637 // We only perform ODR checks for decls not in the explicit
10638 // global module fragment.
10639 !shouldSkipCheckingODR(FD) &&
10640 !shouldSkipCheckingODR(NonConstDefn) &&
10641 FD->getODRHash() != NonConstDefn->getODRHash()) {
10642 if (!isa<CXXMethodDecl>(FD)) {
10643 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10644 } else if (FD->getLexicalParent()->isFileContext() &&
10645 NonConstDefn->getLexicalParent()->isFileContext()) {
10646 // Only diagnose out-of-line method definitions. If they are
10647 // in class definitions, then an error will be generated when
10648 // processing the class bodies.
10649 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10650 }
10651 }
10652 }
10653 continue;
10654 }
10655
10656 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
10657 if (!getContext().getLangOpts().Modules || !MD->hasBody())
10658 MD->setLazyBody(PB->second);
10659 }
10660 PendingBodies.clear();
10661
10662 // Inform any classes that had members added that they now have more members.
10663 for (auto [RD, MD] : PendingAddedClassMembers) {
10664 RD->addedMember(MD);
10665 }
10666 PendingAddedClassMembers.clear();
10667
10668 // Do some cleanup.
10669 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
10671 PendingMergedDefinitionsToDeduplicate.clear();
10672
10673 // For each decl chain that we wanted to complete while deserializing, mark
10674 // it as "still needs to be completed".
10675 for (Decl *D : PendingIncompleteDeclChains)
10676 markIncompleteDeclChain(D);
10677 PendingIncompleteDeclChains.clear();
10678
10679 assert(PendingIdentifierInfos.empty() &&
10680 "Should be empty at the end of finishPendingActions");
10681 assert(PendingDeducedFunctionTypes.empty() &&
10682 "Should be empty at the end of finishPendingActions");
10683 assert(PendingDeducedVarTypes.empty() &&
10684 "Should be empty at the end of finishPendingActions");
10685 assert(PendingDeclChains.empty() &&
10686 "Should be empty at the end of finishPendingActions");
10687 assert(PendingMacroIDs.empty() &&
10688 "Should be empty at the end of finishPendingActions");
10689 assert(PendingDeclContextInfos.empty() &&
10690 "Should be empty at the end of finishPendingActions");
10691 assert(PendingUpdateRecords.empty() &&
10692 "Should be empty at the end of finishPendingActions");
10693 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10694 "Should be empty at the end of finishPendingActions");
10695 assert(PendingFakeDefinitionData.empty() &&
10696 "Should be empty at the end of finishPendingActions");
10697 assert(PendingDefinitions.empty() &&
10698 "Should be empty at the end of finishPendingActions");
10699 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10700 "Should be empty at the end of finishPendingActions");
10701 assert(PendingBodies.empty() &&
10702 "Should be empty at the end of finishPendingActions");
10703 assert(PendingAddedClassMembers.empty() &&
10704 "Should be empty at the end of finishPendingActions");
10705 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10706 "Should be empty at the end of finishPendingActions");
10707 assert(PendingIncompleteDeclChains.empty() &&
10708 "Should be empty at the end of finishPendingActions");
10709}
10710
10711void ASTReader::diagnoseOdrViolations() {
10712 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10713 PendingRecordOdrMergeFailures.empty() &&
10714 PendingFunctionOdrMergeFailures.empty() &&
10715 PendingEnumOdrMergeFailures.empty() &&
10716 PendingObjCInterfaceOdrMergeFailures.empty() &&
10717 PendingObjCProtocolOdrMergeFailures.empty())
10718 return;
10719
10720 // Trigger the import of the full definition of each class that had any
10721 // odr-merging problems, so we can produce better diagnostics for them.
10722 // These updates may in turn find and diagnose some ODR failures, so take
10723 // ownership of the set first.
10724 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10725 PendingOdrMergeFailures.clear();
10726 for (auto &Merge : OdrMergeFailures) {
10727 Merge.first->buildLookup();
10728 Merge.first->decls_begin();
10729 Merge.first->bases_begin();
10730 Merge.first->vbases_begin();
10731 for (auto &RecordPair : Merge.second) {
10732 auto *RD = RecordPair.first;
10733 RD->decls_begin();
10734 RD->bases_begin();
10735 RD->vbases_begin();
10736 }
10737 }
10738
10739 // Trigger the import of the full definition of each record in C/ObjC.
10740 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10741 PendingRecordOdrMergeFailures.clear();
10742 for (auto &Merge : RecordOdrMergeFailures) {
10743 Merge.first->decls_begin();
10744 for (auto &D : Merge.second)
10745 D->decls_begin();
10746 }
10747
10748 // Trigger the import of the full interface definition.
10749 auto ObjCInterfaceOdrMergeFailures =
10750 std::move(PendingObjCInterfaceOdrMergeFailures);
10751 PendingObjCInterfaceOdrMergeFailures.clear();
10752 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
10753 Merge.first->decls_begin();
10754 for (auto &InterfacePair : Merge.second)
10755 InterfacePair.first->decls_begin();
10756 }
10757
10758 // Trigger the import of functions.
10759 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10760 PendingFunctionOdrMergeFailures.clear();
10761 for (auto &Merge : FunctionOdrMergeFailures) {
10762 Merge.first->buildLookup();
10763 Merge.first->decls_begin();
10764 Merge.first->getBody();
10765 for (auto &FD : Merge.second) {
10766 FD->buildLookup();
10767 FD->decls_begin();
10768 FD->getBody();
10769 }
10770 }
10771
10772 // Trigger the import of enums.
10773 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10774 PendingEnumOdrMergeFailures.clear();
10775 for (auto &Merge : EnumOdrMergeFailures) {
10776 Merge.first->decls_begin();
10777 for (auto &Enum : Merge.second) {
10778 Enum->decls_begin();
10779 }
10780 }
10781
10782 // Trigger the import of the full protocol definition.
10783 auto ObjCProtocolOdrMergeFailures =
10784 std::move(PendingObjCProtocolOdrMergeFailures);
10785 PendingObjCProtocolOdrMergeFailures.clear();
10786 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
10787 Merge.first->decls_begin();
10788 for (auto &ProtocolPair : Merge.second)
10789 ProtocolPair.first->decls_begin();
10790 }
10791
10792 // For each declaration from a merged context, check that the canonical
10793 // definition of that context also contains a declaration of the same
10794 // entity.
10795 //
10796 // Caution: this loop does things that might invalidate iterators into
10797 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
10798 while (!PendingOdrMergeChecks.empty()) {
10799 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10800
10801 // FIXME: Skip over implicit declarations for now. This matters for things
10802 // like implicitly-declared special member functions. This isn't entirely
10803 // correct; we can end up with multiple unmerged declarations of the same
10804 // implicit entity.
10805 if (D->isImplicit())
10806 continue;
10807
10808 DeclContext *CanonDef = D->getDeclContext();
10809
10810 bool Found = false;
10811 const Decl *DCanon = D->getCanonicalDecl();
10812
10813 for (auto *RI : D->redecls()) {
10814 if (RI->getLexicalDeclContext() == CanonDef) {
10815 Found = true;
10816 break;
10817 }
10818 }
10819 if (Found)
10820 continue;
10821
10822 // Quick check failed, time to do the slow thing. Note, we can't just
10823 // look up the name of D in CanonDef here, because the member that is
10824 // in CanonDef might not be found by name lookup (it might have been
10825 // replaced by a more recent declaration in the lookup table), and we
10826 // can't necessarily find it in the redeclaration chain because it might
10827 // be merely mergeable, not redeclarable.
10828 llvm::SmallVector<const NamedDecl*, 4> Candidates;
10829 for (auto *CanonMember : CanonDef->decls()) {
10830 if (CanonMember->getCanonicalDecl() == DCanon) {
10831 // This can happen if the declaration is merely mergeable and not
10832 // actually redeclarable (we looked for redeclarations earlier).
10833 //
10834 // FIXME: We should be able to detect this more efficiently, without
10835 // pulling in all of the members of CanonDef.
10836 Found = true;
10837 break;
10838 }
10839 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
10840 if (ND->getDeclName() == D->getDeclName())
10841 Candidates.push_back(ND);
10842 }
10843
10844 if (!Found) {
10845 // The AST doesn't like TagDecls becoming invalid after they've been
10846 // completed. We only really need to mark FieldDecls as invalid here.
10847 if (!isa<TagDecl>(D))
10848 D->setInvalidDecl();
10849
10850 // Ensure we don't accidentally recursively enter deserialization while
10851 // we're producing our diagnostic.
10852 Deserializing RecursionGuard(this);
10853
10854 std::string CanonDefModule =
10856 cast<Decl>(CanonDef));
10857 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
10859 << CanonDef << CanonDefModule.empty() << CanonDefModule;
10860
10861 if (Candidates.empty())
10862 Diag(cast<Decl>(CanonDef)->getLocation(),
10863 diag::note_module_odr_violation_no_possible_decls) << D;
10864 else {
10865 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
10866 Diag(Candidates[I]->getLocation(),
10867 diag::note_module_odr_violation_possible_decl)
10868 << Candidates[I];
10869 }
10870
10871 DiagnosedOdrMergeFailures.insert(CanonDef);
10872 }
10873 }
10874
10875 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10876 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10877 ObjCInterfaceOdrMergeFailures.empty() &&
10878 ObjCProtocolOdrMergeFailures.empty())
10879 return;
10880
10881 ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
10882 getPreprocessor().getLangOpts());
10883
10884 // Issue any pending ODR-failure diagnostics.
10885 for (auto &Merge : OdrMergeFailures) {
10886 // If we've already pointed out a specific problem with this class, don't
10887 // bother issuing a general "something's different" diagnostic.
10888 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10889 continue;
10890
10891 bool Diagnosed = false;
10892 CXXRecordDecl *FirstRecord = Merge.first;
10893 for (auto &RecordPair : Merge.second) {
10894 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10895 RecordPair.second)) {
10896 Diagnosed = true;
10897 break;
10898 }
10899 }
10900
10901 if (!Diagnosed) {
10902 // All definitions are updates to the same declaration. This happens if a
10903 // module instantiates the declaration of a class template specialization
10904 // and two or more other modules instantiate its definition.
10905 //
10906 // FIXME: Indicate which modules had instantiations of this definition.
10907 // FIXME: How can this even happen?
10908 Diag(Merge.first->getLocation(),
10909 diag::err_module_odr_violation_different_instantiations)
10910 << Merge.first;
10911 }
10912 }
10913
10914 // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
10915 // that in C++ this is done as a part of CXXRecordDecl ODR checking.
10916 for (auto &Merge : RecordOdrMergeFailures) {
10917 // If we've already pointed out a specific problem with this class, don't
10918 // bother issuing a general "something's different" diagnostic.
10919 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10920 continue;
10921
10922 RecordDecl *FirstRecord = Merge.first;
10923 bool Diagnosed = false;
10924 for (auto *SecondRecord : Merge.second) {
10925 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
10926 Diagnosed = true;
10927 break;
10928 }
10929 }
10930 (void)Diagnosed;
10931 assert(Diagnosed && "Unable to emit ODR diagnostic.");
10932 }
10933
10934 // Issue ODR failures diagnostics for functions.
10935 for (auto &Merge : FunctionOdrMergeFailures) {
10936 FunctionDecl *FirstFunction = Merge.first;
10937 bool Diagnosed = false;
10938 for (auto &SecondFunction : Merge.second) {
10939 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
10940 Diagnosed = true;
10941 break;
10942 }
10943 }
10944 (void)Diagnosed;
10945 assert(Diagnosed && "Unable to emit ODR diagnostic.");
10946 }
10947
10948 // Issue ODR failures diagnostics for enums.
10949 for (auto &Merge : EnumOdrMergeFailures) {
10950 // If we've already pointed out a specific problem with this enum, don't
10951 // bother issuing a general "something's different" diagnostic.
10952 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10953 continue;
10954
10955 EnumDecl *FirstEnum = Merge.first;
10956 bool Diagnosed = false;
10957 for (auto &SecondEnum : Merge.second) {
10958 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
10959 Diagnosed = true;
10960 break;
10961 }
10962 }
10963 (void)Diagnosed;
10964 assert(Diagnosed && "Unable to emit ODR diagnostic.");
10965 }
10966
10967 for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
10968 // If we've already pointed out a specific problem with this interface,
10969 // don't bother issuing a general "something's different" diagnostic.
10970 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10971 continue;
10972
10973 bool Diagnosed = false;
10974 ObjCInterfaceDecl *FirstID = Merge.first;
10975 for (auto &InterfacePair : Merge.second) {
10976 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
10977 InterfacePair.second)) {
10978 Diagnosed = true;
10979 break;
10980 }
10981 }
10982 (void)Diagnosed;
10983 assert(Diagnosed && "Unable to emit ODR diagnostic.");
10984 }
10985
10986 for (auto &Merge : ObjCProtocolOdrMergeFailures) {
10987 // If we've already pointed out a specific problem with this protocol,
10988 // don't bother issuing a general "something's different" diagnostic.
10989 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10990 continue;
10991
10992 ObjCProtocolDecl *FirstProtocol = Merge.first;
10993 bool Diagnosed = false;
10994 for (auto &ProtocolPair : Merge.second) {
10995 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
10996 ProtocolPair.second)) {
10997 Diagnosed = true;
10998 break;
10999 }
11000 }
11001 (void)Diagnosed;
11002 assert(Diagnosed && "Unable to emit ODR diagnostic.");
11003 }
11004}
11005
11007 if (llvm::Timer *T = ReadTimer.get();
11008 ++NumCurrentElementsDeserializing == 1 && T)
11009 ReadTimeRegion.emplace(T);
11010}
11011
11013 assert(NumCurrentElementsDeserializing &&
11014 "FinishedDeserializing not paired with StartedDeserializing");
11015 if (NumCurrentElementsDeserializing == 1) {
11016 // We decrease NumCurrentElementsDeserializing only after pending actions
11017 // are finished, to avoid recursively re-calling finishPendingActions().
11018 finishPendingActions();
11019 }
11020 --NumCurrentElementsDeserializing;
11021
11022 if (NumCurrentElementsDeserializing == 0) {
11023 {
11024 // Guard variable to avoid recursively entering the process of passing
11025 // decls to consumer.
11026 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11027 /*NewValue=*/false);
11028
11029 // Propagate exception specification and deduced type updates along
11030 // redeclaration chains.
11031 //
11032 // We do this now rather than in finishPendingActions because we want to
11033 // be able to walk the complete redeclaration chains of the updated decls.
11034 while (!PendingExceptionSpecUpdates.empty() ||
11035 !PendingDeducedTypeUpdates.empty() ||
11036 !PendingUndeducedFunctionDecls.empty()) {
11037 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11038 PendingExceptionSpecUpdates.clear();
11039 for (auto Update : ESUpdates) {
11040 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11041 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
11042 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
11043 if (auto *Listener = getContext().getASTMutationListener())
11044 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
11045 for (auto *Redecl : Update.second->redecls())
11047 }
11048
11049 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11050 PendingDeducedTypeUpdates.clear();
11051 for (auto Update : DTUpdates) {
11052 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
11053 // FIXME: If the return type is already deduced, check that it
11054 // matches.
11056 Update.second);
11057 }
11058
11059 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11060 PendingUndeducedFunctionDecls.clear();
11061 // We hope we can find the deduced type for the functions by iterating
11062 // redeclarations in other modules.
11063 for (FunctionDecl *UndeducedFD : UDTUpdates)
11064 (void)UndeducedFD->getMostRecentDecl();
11065 }
11066
11067 ReadTimeRegion.reset();
11068
11069 diagnoseOdrViolations();
11070 }
11071
11072 // We are not in recursive loading, so it's safe to pass the "interesting"
11073 // decls to the consumer.
11074 if (Consumer)
11075 PassInterestingDeclsToConsumer();
11076 }
11077}
11078
11079void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
11080 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
11081 // Remove any fake results before adding any real ones.
11082 auto It = PendingFakeLookupResults.find(II);
11083 if (It != PendingFakeLookupResults.end()) {
11084 for (auto *ND : It->second)
11085 SemaObj->IdResolver.RemoveDecl(ND);
11086 // FIXME: this works around module+PCH performance issue.
11087 // Rather than erase the result from the map, which is O(n), just clear
11088 // the vector of NamedDecls.
11089 It->second.clear();
11090 }
11091 }
11092
11093 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11094 SemaObj->TUScope->AddDecl(D);
11095 } else if (SemaObj->TUScope) {
11096 // Adding the decl to IdResolver may have failed because it was already in
11097 // (even though it was not added in scope). If it is already in, make sure
11098 // it gets in the scope as well.
11099 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11100 SemaObj->TUScope->AddDecl(D);
11101 }
11102}
11103
11105 ASTContext *Context,
11106 const PCHContainerReader &PCHContainerRdr,
11107 const CodeGenOptions &CodeGenOpts,
11108 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11109 StringRef isysroot,
11110 DisableValidationForModuleKind DisableValidationKind,
11111 bool AllowASTWithCompilerErrors,
11112 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
11113 bool ForceValidateUserInputs,
11114 bool ValidateASTInputFilesContent, bool UseGlobalIndex,
11115 std::unique_ptr<llvm::Timer> ReadTimer)
11116 : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11118 : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11119 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11120 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11121 StackHandler(Diags), PP(PP), ContextObj(Context),
11122 CodeGenOpts(CodeGenOpts),
11123 ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11124 PP.getHeaderSearchInfo()),
11125 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11126 DisableValidationKind(DisableValidationKind),
11127 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11128 AllowConfigurationMismatch(AllowConfigurationMismatch),
11129 ValidateSystemInputs(ValidateSystemInputs),
11130 ForceValidateUserInputs(ForceValidateUserInputs),
11131 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11132 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11133 SourceMgr.setExternalSLocEntrySource(this);
11134
11135 PathBuf.reserve(256);
11136
11137 for (const auto &Ext : Extensions) {
11138 auto BlockName = Ext->getExtensionMetadata().BlockName;
11139 auto Known = ModuleFileExtensions.find(BlockName);
11140 if (Known != ModuleFileExtensions.end()) {
11141 Diags.Report(diag::warn_duplicate_module_file_extension)
11142 << BlockName;
11143 continue;
11144 }
11145
11146 ModuleFileExtensions.insert({BlockName, Ext});
11147 }
11148}
11149
11151 if (OwnsDeserializationListener)
11152 delete DeserializationListener;
11153}
11154
11156 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11157}
11158
11160 unsigned AbbrevID) {
11161 Idx = 0;
11162 Record.clear();
11163 return Cursor.readRecord(AbbrevID, Record);
11164}
11165//===----------------------------------------------------------------------===//
11166//// OMPClauseReader implementation
11167////===----------------------------------------------------------------------===//
11168
11169// This has to be in namespace clang because it's friended by all
11170// of the OMP clauses.
11171namespace clang {
11172
11173class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11174 ASTRecordReader &Record;
11175 ASTContext &Context;
11176
11177public:
11179 : Record(Record), Context(Record.getContext()) {}
11180#define GEN_CLANG_CLAUSE_CLASS
11181#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11182#include "llvm/Frontend/OpenMP/OMP.inc"
11186};
11187
11188} // end namespace clang
11189
11193
11195 OMPClause *C = nullptr;
11196 switch (llvm::omp::Clause(Record.readInt())) {
11197 case llvm::omp::OMPC_if:
11198 C = new (Context) OMPIfClause();
11199 break;
11200 case llvm::omp::OMPC_final:
11201 C = new (Context) OMPFinalClause();
11202 break;
11203 case llvm::omp::OMPC_num_threads:
11204 C = new (Context) OMPNumThreadsClause();
11205 break;
11206 case llvm::omp::OMPC_safelen:
11207 C = new (Context) OMPSafelenClause();
11208 break;
11209 case llvm::omp::OMPC_simdlen:
11210 C = new (Context) OMPSimdlenClause();
11211 break;
11212 case llvm::omp::OMPC_sizes: {
11213 unsigned NumSizes = Record.readInt();
11214 C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11215 break;
11216 }
11217 case llvm::omp::OMPC_permutation: {
11218 unsigned NumLoops = Record.readInt();
11219 C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11220 break;
11221 }
11222 case llvm::omp::OMPC_full:
11223 C = OMPFullClause::CreateEmpty(Context);
11224 break;
11225 case llvm::omp::OMPC_partial:
11227 break;
11228 case llvm::omp::OMPC_looprange:
11230 break;
11231 case llvm::omp::OMPC_allocator:
11232 C = new (Context) OMPAllocatorClause();
11233 break;
11234 case llvm::omp::OMPC_collapse:
11235 C = new (Context) OMPCollapseClause();
11236 break;
11237 case llvm::omp::OMPC_default:
11238 C = new (Context) OMPDefaultClause();
11239 break;
11240 case llvm::omp::OMPC_proc_bind:
11241 C = new (Context) OMPProcBindClause();
11242 break;
11243 case llvm::omp::OMPC_schedule:
11244 C = new (Context) OMPScheduleClause();
11245 break;
11246 case llvm::omp::OMPC_ordered:
11247 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11248 break;
11249 case llvm::omp::OMPC_nowait:
11250 C = new (Context) OMPNowaitClause();
11251 break;
11252 case llvm::omp::OMPC_untied:
11253 C = new (Context) OMPUntiedClause();
11254 break;
11255 case llvm::omp::OMPC_mergeable:
11256 C = new (Context) OMPMergeableClause();
11257 break;
11258 case llvm::omp::OMPC_threadset:
11259 C = new (Context) OMPThreadsetClause();
11260 break;
11261 case llvm::omp::OMPC_read:
11262 C = new (Context) OMPReadClause();
11263 break;
11264 case llvm::omp::OMPC_write:
11265 C = new (Context) OMPWriteClause();
11266 break;
11267 case llvm::omp::OMPC_update:
11268 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11269 break;
11270 case llvm::omp::OMPC_capture:
11271 C = new (Context) OMPCaptureClause();
11272 break;
11273 case llvm::omp::OMPC_compare:
11274 C = new (Context) OMPCompareClause();
11275 break;
11276 case llvm::omp::OMPC_fail:
11277 C = new (Context) OMPFailClause();
11278 break;
11279 case llvm::omp::OMPC_seq_cst:
11280 C = new (Context) OMPSeqCstClause();
11281 break;
11282 case llvm::omp::OMPC_acq_rel:
11283 C = new (Context) OMPAcqRelClause();
11284 break;
11285 case llvm::omp::OMPC_absent: {
11286 unsigned NumKinds = Record.readInt();
11287 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11288 break;
11289 }
11290 case llvm::omp::OMPC_holds:
11291 C = new (Context) OMPHoldsClause();
11292 break;
11293 case llvm::omp::OMPC_contains: {
11294 unsigned NumKinds = Record.readInt();
11295 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11296 break;
11297 }
11298 case llvm::omp::OMPC_no_openmp:
11299 C = new (Context) OMPNoOpenMPClause();
11300 break;
11301 case llvm::omp::OMPC_no_openmp_routines:
11302 C = new (Context) OMPNoOpenMPRoutinesClause();
11303 break;
11304 case llvm::omp::OMPC_no_openmp_constructs:
11305 C = new (Context) OMPNoOpenMPConstructsClause();
11306 break;
11307 case llvm::omp::OMPC_no_parallelism:
11308 C = new (Context) OMPNoParallelismClause();
11309 break;
11310 case llvm::omp::OMPC_acquire:
11311 C = new (Context) OMPAcquireClause();
11312 break;
11313 case llvm::omp::OMPC_release:
11314 C = new (Context) OMPReleaseClause();
11315 break;
11316 case llvm::omp::OMPC_relaxed:
11317 C = new (Context) OMPRelaxedClause();
11318 break;
11319 case llvm::omp::OMPC_weak:
11320 C = new (Context) OMPWeakClause();
11321 break;
11322 case llvm::omp::OMPC_threads:
11323 C = new (Context) OMPThreadsClause();
11324 break;
11325 case llvm::omp::OMPC_simd:
11326 C = new (Context) OMPSIMDClause();
11327 break;
11328 case llvm::omp::OMPC_nogroup:
11329 C = new (Context) OMPNogroupClause();
11330 break;
11331 case llvm::omp::OMPC_unified_address:
11332 C = new (Context) OMPUnifiedAddressClause();
11333 break;
11334 case llvm::omp::OMPC_unified_shared_memory:
11335 C = new (Context) OMPUnifiedSharedMemoryClause();
11336 break;
11337 case llvm::omp::OMPC_reverse_offload:
11338 C = new (Context) OMPReverseOffloadClause();
11339 break;
11340 case llvm::omp::OMPC_dynamic_allocators:
11341 C = new (Context) OMPDynamicAllocatorsClause();
11342 break;
11343 case llvm::omp::OMPC_atomic_default_mem_order:
11344 C = new (Context) OMPAtomicDefaultMemOrderClause();
11345 break;
11346 case llvm::omp::OMPC_self_maps:
11347 C = new (Context) OMPSelfMapsClause();
11348 break;
11349 case llvm::omp::OMPC_at:
11350 C = new (Context) OMPAtClause();
11351 break;
11352 case llvm::omp::OMPC_severity:
11353 C = new (Context) OMPSeverityClause();
11354 break;
11355 case llvm::omp::OMPC_message:
11356 C = new (Context) OMPMessageClause();
11357 break;
11358 case llvm::omp::OMPC_private:
11359 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11360 break;
11361 case llvm::omp::OMPC_firstprivate:
11362 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11363 break;
11364 case llvm::omp::OMPC_lastprivate:
11365 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11366 break;
11367 case llvm::omp::OMPC_shared:
11368 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11369 break;
11370 case llvm::omp::OMPC_reduction: {
11371 unsigned N = Record.readInt();
11372 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11373 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11374 break;
11375 }
11376 case llvm::omp::OMPC_task_reduction:
11377 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11378 break;
11379 case llvm::omp::OMPC_in_reduction:
11380 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11381 break;
11382 case llvm::omp::OMPC_linear:
11383 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11384 break;
11385 case llvm::omp::OMPC_aligned:
11386 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11387 break;
11388 case llvm::omp::OMPC_copyin:
11389 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11390 break;
11391 case llvm::omp::OMPC_copyprivate:
11392 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11393 break;
11394 case llvm::omp::OMPC_flush:
11395 C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11396 break;
11397 case llvm::omp::OMPC_depobj:
11399 break;
11400 case llvm::omp::OMPC_depend: {
11401 unsigned NumVars = Record.readInt();
11402 unsigned NumLoops = Record.readInt();
11403 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11404 break;
11405 }
11406 case llvm::omp::OMPC_device:
11407 C = new (Context) OMPDeviceClause();
11408 break;
11409 case llvm::omp::OMPC_map: {
11411 Sizes.NumVars = Record.readInt();
11412 Sizes.NumUniqueDeclarations = Record.readInt();
11413 Sizes.NumComponentLists = Record.readInt();
11414 Sizes.NumComponents = Record.readInt();
11415 C = OMPMapClause::CreateEmpty(Context, Sizes);
11416 break;
11417 }
11418 case llvm::omp::OMPC_num_teams:
11419 C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11420 break;
11421 case llvm::omp::OMPC_thread_limit:
11422 C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11423 break;
11424 case llvm::omp::OMPC_priority:
11425 C = new (Context) OMPPriorityClause();
11426 break;
11427 case llvm::omp::OMPC_grainsize:
11428 C = new (Context) OMPGrainsizeClause();
11429 break;
11430 case llvm::omp::OMPC_num_tasks:
11431 C = new (Context) OMPNumTasksClause();
11432 break;
11433 case llvm::omp::OMPC_hint:
11434 C = new (Context) OMPHintClause();
11435 break;
11436 case llvm::omp::OMPC_dist_schedule:
11437 C = new (Context) OMPDistScheduleClause();
11438 break;
11439 case llvm::omp::OMPC_defaultmap:
11440 C = new (Context) OMPDefaultmapClause();
11441 break;
11442 case llvm::omp::OMPC_to: {
11444 Sizes.NumVars = Record.readInt();
11445 Sizes.NumUniqueDeclarations = Record.readInt();
11446 Sizes.NumComponentLists = Record.readInt();
11447 Sizes.NumComponents = Record.readInt();
11448 C = OMPToClause::CreateEmpty(Context, Sizes);
11449 break;
11450 }
11451 case llvm::omp::OMPC_from: {
11453 Sizes.NumVars = Record.readInt();
11454 Sizes.NumUniqueDeclarations = Record.readInt();
11455 Sizes.NumComponentLists = Record.readInt();
11456 Sizes.NumComponents = Record.readInt();
11457 C = OMPFromClause::CreateEmpty(Context, Sizes);
11458 break;
11459 }
11460 case llvm::omp::OMPC_use_device_ptr: {
11462 Sizes.NumVars = Record.readInt();
11463 Sizes.NumUniqueDeclarations = Record.readInt();
11464 Sizes.NumComponentLists = Record.readInt();
11465 Sizes.NumComponents = Record.readInt();
11466 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11467 break;
11468 }
11469 case llvm::omp::OMPC_use_device_addr: {
11471 Sizes.NumVars = Record.readInt();
11472 Sizes.NumUniqueDeclarations = Record.readInt();
11473 Sizes.NumComponentLists = Record.readInt();
11474 Sizes.NumComponents = Record.readInt();
11475 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11476 break;
11477 }
11478 case llvm::omp::OMPC_is_device_ptr: {
11480 Sizes.NumVars = Record.readInt();
11481 Sizes.NumUniqueDeclarations = Record.readInt();
11482 Sizes.NumComponentLists = Record.readInt();
11483 Sizes.NumComponents = Record.readInt();
11484 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11485 break;
11486 }
11487 case llvm::omp::OMPC_has_device_addr: {
11489 Sizes.NumVars = Record.readInt();
11490 Sizes.NumUniqueDeclarations = Record.readInt();
11491 Sizes.NumComponentLists = Record.readInt();
11492 Sizes.NumComponents = Record.readInt();
11493 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11494 break;
11495 }
11496 case llvm::omp::OMPC_allocate:
11497 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11498 break;
11499 case llvm::omp::OMPC_nontemporal:
11500 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11501 break;
11502 case llvm::omp::OMPC_inclusive:
11503 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11504 break;
11505 case llvm::omp::OMPC_exclusive:
11506 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11507 break;
11508 case llvm::omp::OMPC_order:
11509 C = new (Context) OMPOrderClause();
11510 break;
11511 case llvm::omp::OMPC_init:
11512 C = OMPInitClause::CreateEmpty(Context, Record.readInt());
11513 break;
11514 case llvm::omp::OMPC_use:
11515 C = new (Context) OMPUseClause();
11516 break;
11517 case llvm::omp::OMPC_destroy:
11518 C = new (Context) OMPDestroyClause();
11519 break;
11520 case llvm::omp::OMPC_novariants:
11521 C = new (Context) OMPNovariantsClause();
11522 break;
11523 case llvm::omp::OMPC_nocontext:
11524 C = new (Context) OMPNocontextClause();
11525 break;
11526 case llvm::omp::OMPC_detach:
11527 C = new (Context) OMPDetachClause();
11528 break;
11529 case llvm::omp::OMPC_uses_allocators:
11530 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11531 break;
11532 case llvm::omp::OMPC_affinity:
11533 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11534 break;
11535 case llvm::omp::OMPC_filter:
11536 C = new (Context) OMPFilterClause();
11537 break;
11538 case llvm::omp::OMPC_bind:
11539 C = OMPBindClause::CreateEmpty(Context);
11540 break;
11541 case llvm::omp::OMPC_align:
11542 C = new (Context) OMPAlignClause();
11543 break;
11544 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11545 C = new (Context) OMPXDynCGroupMemClause();
11546 break;
11547 case llvm::omp::OMPC_doacross: {
11548 unsigned NumVars = Record.readInt();
11549 unsigned NumLoops = Record.readInt();
11550 C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
11551 break;
11552 }
11553 case llvm::omp::OMPC_ompx_attribute:
11554 C = new (Context) OMPXAttributeClause();
11555 break;
11556 case llvm::omp::OMPC_ompx_bare:
11557 C = new (Context) OMPXBareClause();
11558 break;
11559#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11560 case llvm::omp::Enum: \
11561 break;
11562#include "llvm/Frontend/OpenMP/OMPKinds.def"
11563 default:
11564 break;
11565 }
11566 assert(C && "Unknown OMPClause type");
11567
11568 Visit(C);
11569 C->setLocStart(Record.readSourceLocation());
11570 C->setLocEnd(Record.readSourceLocation());
11571
11572 return C;
11573}
11574
11576 C->setPreInitStmt(Record.readSubStmt(),
11577 static_cast<OpenMPDirectiveKind>(Record.readInt()));
11578}
11579
11582 C->setPostUpdateExpr(Record.readSubExpr());
11583}
11584
11585void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11587 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11588 C->setNameModifierLoc(Record.readSourceLocation());
11589 C->setColonLoc(Record.readSourceLocation());
11590 C->setCondition(Record.readSubExpr());
11591 C->setLParenLoc(Record.readSourceLocation());
11592}
11593
11594void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11596 C->setCondition(Record.readSubExpr());
11597 C->setLParenLoc(Record.readSourceLocation());
11598}
11599
11600void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11602 C->setModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
11603 C->setNumThreads(Record.readSubExpr());
11604 C->setModifierLoc(Record.readSourceLocation());
11605 C->setLParenLoc(Record.readSourceLocation());
11606}
11607
11608void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11609 C->setSafelen(Record.readSubExpr());
11610 C->setLParenLoc(Record.readSourceLocation());
11611}
11612
11613void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11614 C->setSimdlen(Record.readSubExpr());
11615 C->setLParenLoc(Record.readSourceLocation());
11616}
11617
11618void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
11619 for (Expr *&E : C->getSizesRefs())
11620 E = Record.readSubExpr();
11621 C->setLParenLoc(Record.readSourceLocation());
11622}
11623
11624void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
11625 for (Expr *&E : C->getArgsRefs())
11626 E = Record.readSubExpr();
11627 C->setLParenLoc(Record.readSourceLocation());
11628}
11629
11630void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
11631
11632void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
11633 C->setFactor(Record.readSubExpr());
11634 C->setLParenLoc(Record.readSourceLocation());
11635}
11636
11637void OMPClauseReader::VisitOMPLoopRangeClause(OMPLoopRangeClause *C) {
11638 C->setFirst(Record.readSubExpr());
11639 C->setCount(Record.readSubExpr());
11640 C->setLParenLoc(Record.readSourceLocation());
11641 C->setFirstLoc(Record.readSourceLocation());
11642 C->setCountLoc(Record.readSourceLocation());
11643}
11644
11645void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11646 C->setAllocator(Record.readExpr());
11647 C->setLParenLoc(Record.readSourceLocation());
11648}
11649
11650void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11651 C->setNumForLoops(Record.readSubExpr());
11652 C->setLParenLoc(Record.readSourceLocation());
11653}
11654
11655void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11656 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
11657 C->setLParenLoc(Record.readSourceLocation());
11658 C->setDefaultKindKwLoc(Record.readSourceLocation());
11659 C->setDefaultVariableCategory(
11660 Record.readEnum<OpenMPDefaultClauseVariableCategory>());
11661 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11662}
11663
11664// Read the parameter of threadset clause. This will have been saved when
11665// OMPClauseWriter is called.
11666void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) {
11667 C->setLParenLoc(Record.readSourceLocation());
11668 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11669 C->setThreadsetKindLoc(ThreadsetKindLoc);
11670 OpenMPThreadsetKind TKind =
11671 static_cast<OpenMPThreadsetKind>(Record.readInt());
11672 C->setThreadsetKind(TKind);
11673}
11674
11675void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11676 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
11677 C->setLParenLoc(Record.readSourceLocation());
11678 C->setProcBindKindKwLoc(Record.readSourceLocation());
11679}
11680
11681void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11683 C->setScheduleKind(
11684 static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11685 C->setFirstScheduleModifier(
11686 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11687 C->setSecondScheduleModifier(
11688 static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11689 C->setChunkSize(Record.readSubExpr());
11690 C->setLParenLoc(Record.readSourceLocation());
11691 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11692 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11693 C->setScheduleKindLoc(Record.readSourceLocation());
11694 C->setCommaLoc(Record.readSourceLocation());
11695}
11696
11697void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11698 C->setNumForLoops(Record.readSubExpr());
11699 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11700 C->setLoopNumIterations(I, Record.readSubExpr());
11701 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11702 C->setLoopCounter(I, Record.readSubExpr());
11703 C->setLParenLoc(Record.readSourceLocation());
11704}
11705
11706void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
11707 C->setEventHandler(Record.readSubExpr());
11708 C->setLParenLoc(Record.readSourceLocation());
11709}
11710
11711void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *C) {
11712 C->setCondition(Record.readSubExpr());
11713 C->setLParenLoc(Record.readSourceLocation());
11714}
11715
11716void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11717
11718void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11719
11720void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11721
11722void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11723
11724void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
11725 if (C->isExtended()) {
11726 C->setLParenLoc(Record.readSourceLocation());
11727 C->setArgumentLoc(Record.readSourceLocation());
11728 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
11729 }
11730}
11731
11732void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11733
11734void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
11735
11736// Read the parameter of fail clause. This will have been saved when
11737// OMPClauseWriter is called.
11738void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
11739 C->setLParenLoc(Record.readSourceLocation());
11740 SourceLocation FailParameterLoc = Record.readSourceLocation();
11741 C->setFailParameterLoc(FailParameterLoc);
11742 OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
11743 C->setFailParameter(CKind);
11744}
11745
11746void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
11747 unsigned Count = C->getDirectiveKinds().size();
11748 C->setLParenLoc(Record.readSourceLocation());
11749 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11750 DKVec.reserve(Count);
11751 for (unsigned I = 0; I < Count; I++) {
11752 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
11753 }
11754 C->setDirectiveKinds(DKVec);
11755}
11756
11757void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
11758 C->setExpr(Record.readExpr());
11759 C->setLParenLoc(Record.readSourceLocation());
11760}
11761
11762void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
11763 unsigned Count = C->getDirectiveKinds().size();
11764 C->setLParenLoc(Record.readSourceLocation());
11765 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11766 DKVec.reserve(Count);
11767 for (unsigned I = 0; I < Count; I++) {
11768 DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
11769 }
11770 C->setDirectiveKinds(DKVec);
11771}
11772
11773void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
11774
11775void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11777
11778void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11780
11781void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
11782
11783void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11784
11785void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11786
11787void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11788
11789void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11790
11791void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11792
11793void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
11794
11795void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11796
11797void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11798
11799void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11800
11801void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
11802 unsigned NumVars = C->varlist_size();
11803 SmallVector<Expr *, 16> Vars;
11804 Vars.reserve(NumVars);
11805 for (unsigned I = 0; I != NumVars; ++I)
11806 Vars.push_back(Record.readSubExpr());
11807 C->setVarRefs(Vars);
11808 C->setIsTarget(Record.readBool());
11809 C->setIsTargetSync(Record.readBool());
11810 C->setLParenLoc(Record.readSourceLocation());
11811 C->setVarLoc(Record.readSourceLocation());
11812}
11813
11814void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
11815 C->setInteropVar(Record.readSubExpr());
11816 C->setLParenLoc(Record.readSourceLocation());
11817 C->setVarLoc(Record.readSourceLocation());
11818}
11819
11820void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
11821 C->setInteropVar(Record.readSubExpr());
11822 C->setLParenLoc(Record.readSourceLocation());
11823 C->setVarLoc(Record.readSourceLocation());
11824}
11825
11826void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
11828 C->setCondition(Record.readSubExpr());
11829 C->setLParenLoc(Record.readSourceLocation());
11830}
11831
11832void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
11834 C->setCondition(Record.readSubExpr());
11835 C->setLParenLoc(Record.readSourceLocation());
11836}
11837
11838void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
11839
11840void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11842
11843void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
11844
11845void
11846OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
11847}
11848
11849void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11851 C->setAtomicDefaultMemOrderKind(
11852 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
11853 C->setLParenLoc(Record.readSourceLocation());
11854 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11855}
11856
11857void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
11858
11859void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
11860 C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
11861 C->setLParenLoc(Record.readSourceLocation());
11862 C->setAtKindKwLoc(Record.readSourceLocation());
11863}
11864
11865void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
11866 C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
11867 C->setLParenLoc(Record.readSourceLocation());
11868 C->setSeverityKindKwLoc(Record.readSourceLocation());
11869}
11870
11871void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
11873 C->setMessageString(Record.readSubExpr());
11874 C->setLParenLoc(Record.readSourceLocation());
11875}
11876
11877void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
11878 C->setLParenLoc(Record.readSourceLocation());
11879 unsigned NumVars = C->varlist_size();
11880 SmallVector<Expr *, 16> Vars;
11881 Vars.reserve(NumVars);
11882 for (unsigned i = 0; i != NumVars; ++i)
11883 Vars.push_back(Record.readSubExpr());
11884 C->setVarRefs(Vars);
11885 Vars.clear();
11886 for (unsigned i = 0; i != NumVars; ++i)
11887 Vars.push_back(Record.readSubExpr());
11888 C->setPrivateCopies(Vars);
11889}
11890
11891void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
11893 C->setLParenLoc(Record.readSourceLocation());
11894 unsigned NumVars = C->varlist_size();
11895 SmallVector<Expr *, 16> Vars;
11896 Vars.reserve(NumVars);
11897 for (unsigned i = 0; i != NumVars; ++i)
11898 Vars.push_back(Record.readSubExpr());
11899 C->setVarRefs(Vars);
11900 Vars.clear();
11901 for (unsigned i = 0; i != NumVars; ++i)
11902 Vars.push_back(Record.readSubExpr());
11903 C->setPrivateCopies(Vars);
11904 Vars.clear();
11905 for (unsigned i = 0; i != NumVars; ++i)
11906 Vars.push_back(Record.readSubExpr());
11907 C->setInits(Vars);
11908}
11909
11910void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
11912 C->setLParenLoc(Record.readSourceLocation());
11913 C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
11914 C->setKindLoc(Record.readSourceLocation());
11915 C->setColonLoc(Record.readSourceLocation());
11916 unsigned NumVars = C->varlist_size();
11917 SmallVector<Expr *, 16> Vars;
11918 Vars.reserve(NumVars);
11919 for (unsigned i = 0; i != NumVars; ++i)
11920 Vars.push_back(Record.readSubExpr());
11921 C->setVarRefs(Vars);
11922 Vars.clear();
11923 for (unsigned i = 0; i != NumVars; ++i)
11924 Vars.push_back(Record.readSubExpr());
11925 C->setPrivateCopies(Vars);
11926 Vars.clear();
11927 for (unsigned i = 0; i != NumVars; ++i)
11928 Vars.push_back(Record.readSubExpr());
11929 C->setSourceExprs(Vars);
11930 Vars.clear();
11931 for (unsigned i = 0; i != NumVars; ++i)
11932 Vars.push_back(Record.readSubExpr());
11933 C->setDestinationExprs(Vars);
11934 Vars.clear();
11935 for (unsigned i = 0; i != NumVars; ++i)
11936 Vars.push_back(Record.readSubExpr());
11937 C->setAssignmentOps(Vars);
11938}
11939
11940void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
11941 C->setLParenLoc(Record.readSourceLocation());
11942 unsigned NumVars = C->varlist_size();
11943 SmallVector<Expr *, 16> Vars;
11944 Vars.reserve(NumVars);
11945 for (unsigned i = 0; i != NumVars; ++i)
11946 Vars.push_back(Record.readSubExpr());
11947 C->setVarRefs(Vars);
11948}
11949
11950void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
11952 C->setLParenLoc(Record.readSourceLocation());
11953 C->setModifierLoc(Record.readSourceLocation());
11954 C->setColonLoc(Record.readSourceLocation());
11955 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11956 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11957 C->setQualifierLoc(NNSL);
11958 C->setNameInfo(DNI);
11959
11960 unsigned NumVars = C->varlist_size();
11961 SmallVector<Expr *, 16> Vars;
11962 Vars.reserve(NumVars);
11963 for (unsigned i = 0; i != NumVars; ++i)
11964 Vars.push_back(Record.readSubExpr());
11965 C->setVarRefs(Vars);
11966 Vars.clear();
11967 for (unsigned i = 0; i != NumVars; ++i)
11968 Vars.push_back(Record.readSubExpr());
11969 C->setPrivates(Vars);
11970 Vars.clear();
11971 for (unsigned i = 0; i != NumVars; ++i)
11972 Vars.push_back(Record.readSubExpr());
11973 C->setLHSExprs(Vars);
11974 Vars.clear();
11975 for (unsigned i = 0; i != NumVars; ++i)
11976 Vars.push_back(Record.readSubExpr());
11977 C->setRHSExprs(Vars);
11978 Vars.clear();
11979 for (unsigned i = 0; i != NumVars; ++i)
11980 Vars.push_back(Record.readSubExpr());
11981 C->setReductionOps(Vars);
11982 if (C->getModifier() == OMPC_REDUCTION_inscan) {
11983 Vars.clear();
11984 for (unsigned i = 0; i != NumVars; ++i)
11985 Vars.push_back(Record.readSubExpr());
11986 C->setInscanCopyOps(Vars);
11987 Vars.clear();
11988 for (unsigned i = 0; i != NumVars; ++i)
11989 Vars.push_back(Record.readSubExpr());
11990 C->setInscanCopyArrayTemps(Vars);
11991 Vars.clear();
11992 for (unsigned i = 0; i != NumVars; ++i)
11993 Vars.push_back(Record.readSubExpr());
11994 C->setInscanCopyArrayElems(Vars);
11995 }
11996 unsigned NumFlags = Record.readInt();
11997 SmallVector<bool, 16> Flags;
11998 Flags.reserve(NumFlags);
11999 for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
12000 Flags.push_back(Record.readInt());
12001 C->setPrivateVariableReductionFlags(Flags);
12002}
12003
12004void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
12006 C->setLParenLoc(Record.readSourceLocation());
12007 C->setColonLoc(Record.readSourceLocation());
12008 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12009 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12010 C->setQualifierLoc(NNSL);
12011 C->setNameInfo(DNI);
12012
12013 unsigned NumVars = C->varlist_size();
12014 SmallVector<Expr *, 16> Vars;
12015 Vars.reserve(NumVars);
12016 for (unsigned I = 0; I != NumVars; ++I)
12017 Vars.push_back(Record.readSubExpr());
12018 C->setVarRefs(Vars);
12019 Vars.clear();
12020 for (unsigned I = 0; I != NumVars; ++I)
12021 Vars.push_back(Record.readSubExpr());
12022 C->setPrivates(Vars);
12023 Vars.clear();
12024 for (unsigned I = 0; I != NumVars; ++I)
12025 Vars.push_back(Record.readSubExpr());
12026 C->setLHSExprs(Vars);
12027 Vars.clear();
12028 for (unsigned I = 0; I != NumVars; ++I)
12029 Vars.push_back(Record.readSubExpr());
12030 C->setRHSExprs(Vars);
12031 Vars.clear();
12032 for (unsigned I = 0; I != NumVars; ++I)
12033 Vars.push_back(Record.readSubExpr());
12034 C->setReductionOps(Vars);
12035}
12036
12037void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
12039 C->setLParenLoc(Record.readSourceLocation());
12040 C->setColonLoc(Record.readSourceLocation());
12041 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12042 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12043 C->setQualifierLoc(NNSL);
12044 C->setNameInfo(DNI);
12045
12046 unsigned NumVars = C->varlist_size();
12047 SmallVector<Expr *, 16> Vars;
12048 Vars.reserve(NumVars);
12049 for (unsigned I = 0; I != NumVars; ++I)
12050 Vars.push_back(Record.readSubExpr());
12051 C->setVarRefs(Vars);
12052 Vars.clear();
12053 for (unsigned I = 0; I != NumVars; ++I)
12054 Vars.push_back(Record.readSubExpr());
12055 C->setPrivates(Vars);
12056 Vars.clear();
12057 for (unsigned I = 0; I != NumVars; ++I)
12058 Vars.push_back(Record.readSubExpr());
12059 C->setLHSExprs(Vars);
12060 Vars.clear();
12061 for (unsigned I = 0; I != NumVars; ++I)
12062 Vars.push_back(Record.readSubExpr());
12063 C->setRHSExprs(Vars);
12064 Vars.clear();
12065 for (unsigned I = 0; I != NumVars; ++I)
12066 Vars.push_back(Record.readSubExpr());
12067 C->setReductionOps(Vars);
12068 Vars.clear();
12069 for (unsigned I = 0; I != NumVars; ++I)
12070 Vars.push_back(Record.readSubExpr());
12071 C->setTaskgroupDescriptors(Vars);
12072}
12073
12074void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
12076 C->setLParenLoc(Record.readSourceLocation());
12077 C->setColonLoc(Record.readSourceLocation());
12078 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
12079 C->setModifierLoc(Record.readSourceLocation());
12080 unsigned NumVars = C->varlist_size();
12081 SmallVector<Expr *, 16> Vars;
12082 Vars.reserve(NumVars);
12083 for (unsigned i = 0; i != NumVars; ++i)
12084 Vars.push_back(Record.readSubExpr());
12085 C->setVarRefs(Vars);
12086 Vars.clear();
12087 for (unsigned i = 0; i != NumVars; ++i)
12088 Vars.push_back(Record.readSubExpr());
12089 C->setPrivates(Vars);
12090 Vars.clear();
12091 for (unsigned i = 0; i != NumVars; ++i)
12092 Vars.push_back(Record.readSubExpr());
12093 C->setInits(Vars);
12094 Vars.clear();
12095 for (unsigned i = 0; i != NumVars; ++i)
12096 Vars.push_back(Record.readSubExpr());
12097 C->setUpdates(Vars);
12098 Vars.clear();
12099 for (unsigned i = 0; i != NumVars; ++i)
12100 Vars.push_back(Record.readSubExpr());
12101 C->setFinals(Vars);
12102 C->setStep(Record.readSubExpr());
12103 C->setCalcStep(Record.readSubExpr());
12104 Vars.clear();
12105 for (unsigned I = 0; I != NumVars + 1; ++I)
12106 Vars.push_back(Record.readSubExpr());
12107 C->setUsedExprs(Vars);
12108}
12109
12110void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
12111 C->setLParenLoc(Record.readSourceLocation());
12112 C->setColonLoc(Record.readSourceLocation());
12113 unsigned NumVars = C->varlist_size();
12114 SmallVector<Expr *, 16> Vars;
12115 Vars.reserve(NumVars);
12116 for (unsigned i = 0; i != NumVars; ++i)
12117 Vars.push_back(Record.readSubExpr());
12118 C->setVarRefs(Vars);
12119 C->setAlignment(Record.readSubExpr());
12120}
12121
12122void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
12123 C->setLParenLoc(Record.readSourceLocation());
12124 unsigned NumVars = C->varlist_size();
12125 SmallVector<Expr *, 16> Exprs;
12126 Exprs.reserve(NumVars);
12127 for (unsigned i = 0; i != NumVars; ++i)
12128 Exprs.push_back(Record.readSubExpr());
12129 C->setVarRefs(Exprs);
12130 Exprs.clear();
12131 for (unsigned i = 0; i != NumVars; ++i)
12132 Exprs.push_back(Record.readSubExpr());
12133 C->setSourceExprs(Exprs);
12134 Exprs.clear();
12135 for (unsigned i = 0; i != NumVars; ++i)
12136 Exprs.push_back(Record.readSubExpr());
12137 C->setDestinationExprs(Exprs);
12138 Exprs.clear();
12139 for (unsigned i = 0; i != NumVars; ++i)
12140 Exprs.push_back(Record.readSubExpr());
12141 C->setAssignmentOps(Exprs);
12142}
12143
12144void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
12145 C->setLParenLoc(Record.readSourceLocation());
12146 unsigned NumVars = C->varlist_size();
12147 SmallVector<Expr *, 16> Exprs;
12148 Exprs.reserve(NumVars);
12149 for (unsigned i = 0; i != NumVars; ++i)
12150 Exprs.push_back(Record.readSubExpr());
12151 C->setVarRefs(Exprs);
12152 Exprs.clear();
12153 for (unsigned i = 0; i != NumVars; ++i)
12154 Exprs.push_back(Record.readSubExpr());
12155 C->setSourceExprs(Exprs);
12156 Exprs.clear();
12157 for (unsigned i = 0; i != NumVars; ++i)
12158 Exprs.push_back(Record.readSubExpr());
12159 C->setDestinationExprs(Exprs);
12160 Exprs.clear();
12161 for (unsigned i = 0; i != NumVars; ++i)
12162 Exprs.push_back(Record.readSubExpr());
12163 C->setAssignmentOps(Exprs);
12164}
12165
12166void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12167 C->setLParenLoc(Record.readSourceLocation());
12168 unsigned NumVars = C->varlist_size();
12169 SmallVector<Expr *, 16> Vars;
12170 Vars.reserve(NumVars);
12171 for (unsigned i = 0; i != NumVars; ++i)
12172 Vars.push_back(Record.readSubExpr());
12173 C->setVarRefs(Vars);
12174}
12175
12176void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12177 C->setDepobj(Record.readSubExpr());
12178 C->setLParenLoc(Record.readSourceLocation());
12179}
12180
12181void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12182 C->setLParenLoc(Record.readSourceLocation());
12183 C->setModifier(Record.readSubExpr());
12184 C->setDependencyKind(
12185 static_cast<OpenMPDependClauseKind>(Record.readInt()));
12186 C->setDependencyLoc(Record.readSourceLocation());
12187 C->setColonLoc(Record.readSourceLocation());
12188 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12189 unsigned NumVars = C->varlist_size();
12190 SmallVector<Expr *, 16> Vars;
12191 Vars.reserve(NumVars);
12192 for (unsigned I = 0; I != NumVars; ++I)
12193 Vars.push_back(Record.readSubExpr());
12194 C->setVarRefs(Vars);
12195 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12196 C->setLoopData(I, Record.readSubExpr());
12197}
12198
12199void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12201 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12202 C->setDevice(Record.readSubExpr());
12203 C->setModifierLoc(Record.readSourceLocation());
12204 C->setLParenLoc(Record.readSourceLocation());
12205}
12206
12207void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12208 C->setLParenLoc(Record.readSourceLocation());
12209 bool HasIteratorModifier = false;
12210 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12211 C->setMapTypeModifier(
12212 I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12213 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12214 if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12215 HasIteratorModifier = true;
12216 }
12217 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12218 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12219 C->setMapType(
12220 static_cast<OpenMPMapClauseKind>(Record.readInt()));
12221 C->setMapLoc(Record.readSourceLocation());
12222 C->setColonLoc(Record.readSourceLocation());
12223 auto NumVars = C->varlist_size();
12224 auto UniqueDecls = C->getUniqueDeclarationsNum();
12225 auto TotalLists = C->getTotalComponentListNum();
12226 auto TotalComponents = C->getTotalComponentsNum();
12227
12228 SmallVector<Expr *, 16> Vars;
12229 Vars.reserve(NumVars);
12230 for (unsigned i = 0; i != NumVars; ++i)
12231 Vars.push_back(Record.readExpr());
12232 C->setVarRefs(Vars);
12233
12234 SmallVector<Expr *, 16> UDMappers;
12235 UDMappers.reserve(NumVars);
12236 for (unsigned I = 0; I < NumVars; ++I)
12237 UDMappers.push_back(Record.readExpr());
12238 C->setUDMapperRefs(UDMappers);
12239
12240 if (HasIteratorModifier)
12241 C->setIteratorModifier(Record.readExpr());
12242
12243 SmallVector<ValueDecl *, 16> Decls;
12244 Decls.reserve(UniqueDecls);
12245 for (unsigned i = 0; i < UniqueDecls; ++i)
12246 Decls.push_back(Record.readDeclAs<ValueDecl>());
12247 C->setUniqueDecls(Decls);
12248
12249 SmallVector<unsigned, 16> ListsPerDecl;
12250 ListsPerDecl.reserve(UniqueDecls);
12251 for (unsigned i = 0; i < UniqueDecls; ++i)
12252 ListsPerDecl.push_back(Record.readInt());
12253 C->setDeclNumLists(ListsPerDecl);
12254
12255 SmallVector<unsigned, 32> ListSizes;
12256 ListSizes.reserve(TotalLists);
12257 for (unsigned i = 0; i < TotalLists; ++i)
12258 ListSizes.push_back(Record.readInt());
12259 C->setComponentListSizes(ListSizes);
12260
12261 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12262 Components.reserve(TotalComponents);
12263 for (unsigned i = 0; i < TotalComponents; ++i) {
12264 Expr *AssociatedExprPr = Record.readExpr();
12265 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12266 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12267 /*IsNonContiguous=*/false);
12268 }
12269 C->setComponents(Components, ListSizes);
12270}
12271
12272void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12273 C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12274 C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12275 C->setLParenLoc(Record.readSourceLocation());
12276 C->setColonLoc(Record.readSourceLocation());
12277 C->setAllocator(Record.readSubExpr());
12278 C->setAlignment(Record.readSubExpr());
12279 unsigned NumVars = C->varlist_size();
12280 SmallVector<Expr *, 16> Vars;
12281 Vars.reserve(NumVars);
12282 for (unsigned i = 0; i != NumVars; ++i)
12283 Vars.push_back(Record.readSubExpr());
12284 C->setVarRefs(Vars);
12285}
12286
12287void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12289 C->setLParenLoc(Record.readSourceLocation());
12290 unsigned NumVars = C->varlist_size();
12291 SmallVector<Expr *, 16> Vars;
12292 Vars.reserve(NumVars);
12293 for (unsigned I = 0; I != NumVars; ++I)
12294 Vars.push_back(Record.readSubExpr());
12295 C->setVarRefs(Vars);
12296}
12297
12298void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12300 C->setLParenLoc(Record.readSourceLocation());
12301 unsigned NumVars = C->varlist_size();
12302 SmallVector<Expr *, 16> Vars;
12303 Vars.reserve(NumVars);
12304 for (unsigned I = 0; I != NumVars; ++I)
12305 Vars.push_back(Record.readSubExpr());
12306 C->setVarRefs(Vars);
12307}
12308
12309void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12311 C->setPriority(Record.readSubExpr());
12312 C->setLParenLoc(Record.readSourceLocation());
12313}
12314
12315void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12317 C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12318 C->setGrainsize(Record.readSubExpr());
12319 C->setModifierLoc(Record.readSourceLocation());
12320 C->setLParenLoc(Record.readSourceLocation());
12321}
12322
12323void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12325 C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12326 C->setNumTasks(Record.readSubExpr());
12327 C->setModifierLoc(Record.readSourceLocation());
12328 C->setLParenLoc(Record.readSourceLocation());
12329}
12330
12331void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12332 C->setHint(Record.readSubExpr());
12333 C->setLParenLoc(Record.readSourceLocation());
12334}
12335
12336void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12338 C->setDistScheduleKind(
12339 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12340 C->setChunkSize(Record.readSubExpr());
12341 C->setLParenLoc(Record.readSourceLocation());
12342 C->setDistScheduleKindLoc(Record.readSourceLocation());
12343 C->setCommaLoc(Record.readSourceLocation());
12344}
12345
12346void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12347 C->setDefaultmapKind(
12348 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12349 C->setDefaultmapModifier(
12350 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12351 C->setLParenLoc(Record.readSourceLocation());
12352 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12353 C->setDefaultmapKindLoc(Record.readSourceLocation());
12354}
12355
12356void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12357 C->setLParenLoc(Record.readSourceLocation());
12358 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12359 C->setMotionModifier(
12360 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12361 C->setMotionModifierLoc(I, Record.readSourceLocation());
12362 }
12363 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12364 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12365 C->setColonLoc(Record.readSourceLocation());
12366 auto NumVars = C->varlist_size();
12367 auto UniqueDecls = C->getUniqueDeclarationsNum();
12368 auto TotalLists = C->getTotalComponentListNum();
12369 auto TotalComponents = C->getTotalComponentsNum();
12370
12371 SmallVector<Expr *, 16> Vars;
12372 Vars.reserve(NumVars);
12373 for (unsigned i = 0; i != NumVars; ++i)
12374 Vars.push_back(Record.readSubExpr());
12375 C->setVarRefs(Vars);
12376
12377 SmallVector<Expr *, 16> UDMappers;
12378 UDMappers.reserve(NumVars);
12379 for (unsigned I = 0; I < NumVars; ++I)
12380 UDMappers.push_back(Record.readSubExpr());
12381 C->setUDMapperRefs(UDMappers);
12382
12383 SmallVector<ValueDecl *, 16> Decls;
12384 Decls.reserve(UniqueDecls);
12385 for (unsigned i = 0; i < UniqueDecls; ++i)
12386 Decls.push_back(Record.readDeclAs<ValueDecl>());
12387 C->setUniqueDecls(Decls);
12388
12389 SmallVector<unsigned, 16> ListsPerDecl;
12390 ListsPerDecl.reserve(UniqueDecls);
12391 for (unsigned i = 0; i < UniqueDecls; ++i)
12392 ListsPerDecl.push_back(Record.readInt());
12393 C->setDeclNumLists(ListsPerDecl);
12394
12395 SmallVector<unsigned, 32> ListSizes;
12396 ListSizes.reserve(TotalLists);
12397 for (unsigned i = 0; i < TotalLists; ++i)
12398 ListSizes.push_back(Record.readInt());
12399 C->setComponentListSizes(ListSizes);
12400
12401 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12402 Components.reserve(TotalComponents);
12403 for (unsigned i = 0; i < TotalComponents; ++i) {
12404 Expr *AssociatedExprPr = Record.readSubExpr();
12405 bool IsNonContiguous = Record.readBool();
12406 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12407 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12408 }
12409 C->setComponents(Components, ListSizes);
12410}
12411
12412void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12413 C->setLParenLoc(Record.readSourceLocation());
12414 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12415 C->setMotionModifier(
12416 I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12417 C->setMotionModifierLoc(I, Record.readSourceLocation());
12418 }
12419 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12420 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12421 C->setColonLoc(Record.readSourceLocation());
12422 auto NumVars = C->varlist_size();
12423 auto UniqueDecls = C->getUniqueDeclarationsNum();
12424 auto TotalLists = C->getTotalComponentListNum();
12425 auto TotalComponents = C->getTotalComponentsNum();
12426
12427 SmallVector<Expr *, 16> Vars;
12428 Vars.reserve(NumVars);
12429 for (unsigned i = 0; i != NumVars; ++i)
12430 Vars.push_back(Record.readSubExpr());
12431 C->setVarRefs(Vars);
12432
12433 SmallVector<Expr *, 16> UDMappers;
12434 UDMappers.reserve(NumVars);
12435 for (unsigned I = 0; I < NumVars; ++I)
12436 UDMappers.push_back(Record.readSubExpr());
12437 C->setUDMapperRefs(UDMappers);
12438
12439 SmallVector<ValueDecl *, 16> Decls;
12440 Decls.reserve(UniqueDecls);
12441 for (unsigned i = 0; i < UniqueDecls; ++i)
12442 Decls.push_back(Record.readDeclAs<ValueDecl>());
12443 C->setUniqueDecls(Decls);
12444
12445 SmallVector<unsigned, 16> ListsPerDecl;
12446 ListsPerDecl.reserve(UniqueDecls);
12447 for (unsigned i = 0; i < UniqueDecls; ++i)
12448 ListsPerDecl.push_back(Record.readInt());
12449 C->setDeclNumLists(ListsPerDecl);
12450
12451 SmallVector<unsigned, 32> ListSizes;
12452 ListSizes.reserve(TotalLists);
12453 for (unsigned i = 0; i < TotalLists; ++i)
12454 ListSizes.push_back(Record.readInt());
12455 C->setComponentListSizes(ListSizes);
12456
12457 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12458 Components.reserve(TotalComponents);
12459 for (unsigned i = 0; i < TotalComponents; ++i) {
12460 Expr *AssociatedExprPr = Record.readSubExpr();
12461 bool IsNonContiguous = Record.readBool();
12462 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12463 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12464 }
12465 C->setComponents(Components, ListSizes);
12466}
12467
12468void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12469 C->setLParenLoc(Record.readSourceLocation());
12470 auto NumVars = C->varlist_size();
12471 auto UniqueDecls = C->getUniqueDeclarationsNum();
12472 auto TotalLists = C->getTotalComponentListNum();
12473 auto TotalComponents = C->getTotalComponentsNum();
12474
12475 SmallVector<Expr *, 16> Vars;
12476 Vars.reserve(NumVars);
12477 for (unsigned i = 0; i != NumVars; ++i)
12478 Vars.push_back(Record.readSubExpr());
12479 C->setVarRefs(Vars);
12480 Vars.clear();
12481 for (unsigned i = 0; i != NumVars; ++i)
12482 Vars.push_back(Record.readSubExpr());
12483 C->setPrivateCopies(Vars);
12484 Vars.clear();
12485 for (unsigned i = 0; i != NumVars; ++i)
12486 Vars.push_back(Record.readSubExpr());
12487 C->setInits(Vars);
12488
12489 SmallVector<ValueDecl *, 16> Decls;
12490 Decls.reserve(UniqueDecls);
12491 for (unsigned i = 0; i < UniqueDecls; ++i)
12492 Decls.push_back(Record.readDeclAs<ValueDecl>());
12493 C->setUniqueDecls(Decls);
12494
12495 SmallVector<unsigned, 16> ListsPerDecl;
12496 ListsPerDecl.reserve(UniqueDecls);
12497 for (unsigned i = 0; i < UniqueDecls; ++i)
12498 ListsPerDecl.push_back(Record.readInt());
12499 C->setDeclNumLists(ListsPerDecl);
12500
12501 SmallVector<unsigned, 32> ListSizes;
12502 ListSizes.reserve(TotalLists);
12503 for (unsigned i = 0; i < TotalLists; ++i)
12504 ListSizes.push_back(Record.readInt());
12505 C->setComponentListSizes(ListSizes);
12506
12507 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12508 Components.reserve(TotalComponents);
12509 for (unsigned i = 0; i < TotalComponents; ++i) {
12510 auto *AssociatedExprPr = Record.readSubExpr();
12511 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12512 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12513 /*IsNonContiguous=*/false);
12514 }
12515 C->setComponents(Components, ListSizes);
12516}
12517
12518void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12519 C->setLParenLoc(Record.readSourceLocation());
12520 auto NumVars = C->varlist_size();
12521 auto UniqueDecls = C->getUniqueDeclarationsNum();
12522 auto TotalLists = C->getTotalComponentListNum();
12523 auto TotalComponents = C->getTotalComponentsNum();
12524
12525 SmallVector<Expr *, 16> Vars;
12526 Vars.reserve(NumVars);
12527 for (unsigned i = 0; i != NumVars; ++i)
12528 Vars.push_back(Record.readSubExpr());
12529 C->setVarRefs(Vars);
12530
12531 SmallVector<ValueDecl *, 16> Decls;
12532 Decls.reserve(UniqueDecls);
12533 for (unsigned i = 0; i < UniqueDecls; ++i)
12534 Decls.push_back(Record.readDeclAs<ValueDecl>());
12535 C->setUniqueDecls(Decls);
12536
12537 SmallVector<unsigned, 16> ListsPerDecl;
12538 ListsPerDecl.reserve(UniqueDecls);
12539 for (unsigned i = 0; i < UniqueDecls; ++i)
12540 ListsPerDecl.push_back(Record.readInt());
12541 C->setDeclNumLists(ListsPerDecl);
12542
12543 SmallVector<unsigned, 32> ListSizes;
12544 ListSizes.reserve(TotalLists);
12545 for (unsigned i = 0; i < TotalLists; ++i)
12546 ListSizes.push_back(Record.readInt());
12547 C->setComponentListSizes(ListSizes);
12548
12549 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12550 Components.reserve(TotalComponents);
12551 for (unsigned i = 0; i < TotalComponents; ++i) {
12552 Expr *AssociatedExpr = Record.readSubExpr();
12553 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12554 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12555 /*IsNonContiguous*/ false);
12556 }
12557 C->setComponents(Components, ListSizes);
12558}
12559
12560void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12561 C->setLParenLoc(Record.readSourceLocation());
12562 auto NumVars = C->varlist_size();
12563 auto UniqueDecls = C->getUniqueDeclarationsNum();
12564 auto TotalLists = C->getTotalComponentListNum();
12565 auto TotalComponents = C->getTotalComponentsNum();
12566
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 Vars.clear();
12573
12574 SmallVector<ValueDecl *, 16> Decls;
12575 Decls.reserve(UniqueDecls);
12576 for (unsigned i = 0; i < UniqueDecls; ++i)
12577 Decls.push_back(Record.readDeclAs<ValueDecl>());
12578 C->setUniqueDecls(Decls);
12579
12580 SmallVector<unsigned, 16> ListsPerDecl;
12581 ListsPerDecl.reserve(UniqueDecls);
12582 for (unsigned i = 0; i < UniqueDecls; ++i)
12583 ListsPerDecl.push_back(Record.readInt());
12584 C->setDeclNumLists(ListsPerDecl);
12585
12586 SmallVector<unsigned, 32> ListSizes;
12587 ListSizes.reserve(TotalLists);
12588 for (unsigned i = 0; i < TotalLists; ++i)
12589 ListSizes.push_back(Record.readInt());
12590 C->setComponentListSizes(ListSizes);
12591
12592 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12593 Components.reserve(TotalComponents);
12594 for (unsigned i = 0; i < TotalComponents; ++i) {
12595 Expr *AssociatedExpr = Record.readSubExpr();
12596 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12597 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12598 /*IsNonContiguous=*/false);
12599 }
12600 C->setComponents(Components, ListSizes);
12601}
12602
12603void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
12604 C->setLParenLoc(Record.readSourceLocation());
12605 auto NumVars = C->varlist_size();
12606 auto UniqueDecls = C->getUniqueDeclarationsNum();
12607 auto TotalLists = C->getTotalComponentListNum();
12608 auto TotalComponents = C->getTotalComponentsNum();
12609
12610 SmallVector<Expr *, 16> Vars;
12611 Vars.reserve(NumVars);
12612 for (unsigned I = 0; I != NumVars; ++I)
12613 Vars.push_back(Record.readSubExpr());
12614 C->setVarRefs(Vars);
12615 Vars.clear();
12616
12617 SmallVector<ValueDecl *, 16> Decls;
12618 Decls.reserve(UniqueDecls);
12619 for (unsigned I = 0; I < UniqueDecls; ++I)
12620 Decls.push_back(Record.readDeclAs<ValueDecl>());
12621 C->setUniqueDecls(Decls);
12622
12623 SmallVector<unsigned, 16> ListsPerDecl;
12624 ListsPerDecl.reserve(UniqueDecls);
12625 for (unsigned I = 0; I < UniqueDecls; ++I)
12626 ListsPerDecl.push_back(Record.readInt());
12627 C->setDeclNumLists(ListsPerDecl);
12628
12629 SmallVector<unsigned, 32> ListSizes;
12630 ListSizes.reserve(TotalLists);
12631 for (unsigned i = 0; i < TotalLists; ++i)
12632 ListSizes.push_back(Record.readInt());
12633 C->setComponentListSizes(ListSizes);
12634
12635 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12636 Components.reserve(TotalComponents);
12637 for (unsigned I = 0; I < TotalComponents; ++I) {
12638 Expr *AssociatedExpr = Record.readSubExpr();
12639 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12640 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12641 /*IsNonContiguous=*/false);
12642 }
12643 C->setComponents(Components, ListSizes);
12644}
12645
12646void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12647 C->setLParenLoc(Record.readSourceLocation());
12648 unsigned NumVars = C->varlist_size();
12649 SmallVector<Expr *, 16> Vars;
12650 Vars.reserve(NumVars);
12651 for (unsigned i = 0; i != NumVars; ++i)
12652 Vars.push_back(Record.readSubExpr());
12653 C->setVarRefs(Vars);
12654 Vars.clear();
12655 Vars.reserve(NumVars);
12656 for (unsigned i = 0; i != NumVars; ++i)
12657 Vars.push_back(Record.readSubExpr());
12658 C->setPrivateRefs(Vars);
12659}
12660
12661void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12662 C->setLParenLoc(Record.readSourceLocation());
12663 unsigned NumVars = C->varlist_size();
12664 SmallVector<Expr *, 16> Vars;
12665 Vars.reserve(NumVars);
12666 for (unsigned i = 0; i != NumVars; ++i)
12667 Vars.push_back(Record.readSubExpr());
12668 C->setVarRefs(Vars);
12669}
12670
12671void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12672 C->setLParenLoc(Record.readSourceLocation());
12673 unsigned NumVars = C->varlist_size();
12674 SmallVector<Expr *, 16> Vars;
12675 Vars.reserve(NumVars);
12676 for (unsigned i = 0; i != NumVars; ++i)
12677 Vars.push_back(Record.readSubExpr());
12678 C->setVarRefs(Vars);
12679}
12680
12681void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
12682 C->setLParenLoc(Record.readSourceLocation());
12683 unsigned NumOfAllocators = C->getNumberOfAllocators();
12684 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
12685 Data.reserve(NumOfAllocators);
12686 for (unsigned I = 0; I != NumOfAllocators; ++I) {
12687 OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
12688 D.Allocator = Record.readSubExpr();
12689 D.AllocatorTraits = Record.readSubExpr();
12690 D.LParenLoc = Record.readSourceLocation();
12691 D.RParenLoc = Record.readSourceLocation();
12692 }
12693 C->setAllocatorsData(Data);
12694}
12695
12696void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
12697 C->setLParenLoc(Record.readSourceLocation());
12698 C->setModifier(Record.readSubExpr());
12699 C->setColonLoc(Record.readSourceLocation());
12700 unsigned NumOfLocators = C->varlist_size();
12701 SmallVector<Expr *, 4> Locators;
12702 Locators.reserve(NumOfLocators);
12703 for (unsigned I = 0; I != NumOfLocators; ++I)
12704 Locators.push_back(Record.readSubExpr());
12705 C->setVarRefs(Locators);
12706}
12707
12708void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
12709 C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
12710 C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
12711 C->setLParenLoc(Record.readSourceLocation());
12712 C->setKindKwLoc(Record.readSourceLocation());
12713 C->setModifierKwLoc(Record.readSourceLocation());
12714}
12715
12716void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
12718 C->setThreadID(Record.readSubExpr());
12719 C->setLParenLoc(Record.readSourceLocation());
12720}
12721
12722void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
12723 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
12724 C->setLParenLoc(Record.readSourceLocation());
12725 C->setBindKindLoc(Record.readSourceLocation());
12726}
12727
12728void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
12729 C->setAlignment(Record.readExpr());
12730 C->setLParenLoc(Record.readSourceLocation());
12731}
12732
12733void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
12735 C->setSize(Record.readSubExpr());
12736 C->setLParenLoc(Record.readSourceLocation());
12737}
12738
12739void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
12740 C->setLParenLoc(Record.readSourceLocation());
12741 C->setDependenceType(
12742 static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
12743 C->setDependenceLoc(Record.readSourceLocation());
12744 C->setColonLoc(Record.readSourceLocation());
12745 unsigned NumVars = C->varlist_size();
12746 SmallVector<Expr *, 16> Vars;
12747 Vars.reserve(NumVars);
12748 for (unsigned I = 0; I != NumVars; ++I)
12749 Vars.push_back(Record.readSubExpr());
12750 C->setVarRefs(Vars);
12751 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12752 C->setLoopData(I, Record.readSubExpr());
12753}
12754
12755void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
12756 AttrVec Attrs;
12757 Record.readAttributes(Attrs);
12758 C->setAttrs(Attrs);
12759 C->setLocStart(Record.readSourceLocation());
12760 C->setLParenLoc(Record.readSourceLocation());
12761 C->setLocEnd(Record.readSourceLocation());
12762}
12763
12764void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
12765
12768 TI.Sets.resize(readUInt32());
12769 for (auto &Set : TI.Sets) {
12771 Set.Selectors.resize(readUInt32());
12772 for (auto &Selector : Set.Selectors) {
12774 Selector.ScoreOrCondition = nullptr;
12775 if (readBool())
12776 Selector.ScoreOrCondition = readExprRef();
12777 Selector.Properties.resize(readUInt32());
12778 for (auto &Property : Selector.Properties)
12780 }
12781 }
12782 return &TI;
12783}
12784
12786 if (!Data)
12787 return;
12788 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12789 // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
12790 skipInts(3);
12791 }
12792 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
12793 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
12794 Clauses[I] = readOMPClause();
12795 Data->setClauses(Clauses);
12796 if (Data->hasAssociatedStmt())
12797 Data->setAssociatedStmt(readStmt());
12798 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
12799 Data->getChildren()[I] = readStmt();
12800}
12801
12803 unsigned NumVars = readInt();
12805 for (unsigned I = 0; I < NumVars; ++I)
12806 VarList.push_back(readExpr());
12807 return VarList;
12808}
12809
12811 unsigned NumExprs = readInt();
12813 for (unsigned I = 0; I < NumExprs; ++I)
12814 ExprList.push_back(readSubExpr());
12815 return ExprList;
12816}
12817
12822
12823 switch (ClauseKind) {
12825 SourceLocation LParenLoc = readSourceLocation();
12827 return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
12828 EndLoc);
12829 }
12830 case OpenACCClauseKind::If: {
12831 SourceLocation LParenLoc = readSourceLocation();
12832 Expr *CondExpr = readSubExpr();
12833 return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
12834 EndLoc);
12835 }
12837 SourceLocation LParenLoc = readSourceLocation();
12838 bool isConditionExprClause = readBool();
12839 if (isConditionExprClause) {
12840 Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
12841 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
12842 CondExpr, EndLoc);
12843 }
12844 unsigned NumVars = readInt();
12846 for (unsigned I = 0; I < NumVars; ++I)
12847 VarList.push_back(readSubExpr());
12848 return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
12849 EndLoc);
12850 }
12852 SourceLocation LParenLoc = readSourceLocation();
12853 unsigned NumClauses = readInt();
12855 for (unsigned I = 0; I < NumClauses; ++I)
12856 IntExprs.push_back(readSubExpr());
12857 return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
12858 IntExprs, EndLoc);
12859 }
12861 SourceLocation LParenLoc = readSourceLocation();
12862 Expr *IntExpr = readSubExpr();
12863 return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
12864 IntExpr, EndLoc);
12865 }
12867 SourceLocation LParenLoc = readSourceLocation();
12868 Expr *IntExpr = readSubExpr();
12869 return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
12870 IntExpr, EndLoc);
12871 }
12873 SourceLocation LParenLoc = readSourceLocation();
12874 Expr *IntExpr = readSubExpr();
12875 return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
12876 IntExpr, EndLoc);
12877 }
12879 SourceLocation LParenLoc = readSourceLocation();
12880 Expr *IntExpr = readSubExpr();
12881 return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
12882 IntExpr, EndLoc);
12883 }
12885 SourceLocation LParenLoc = readSourceLocation();
12887
12889 for (unsigned I = 0; I < VarList.size(); ++I) {
12890 static_assert(sizeof(OpenACCPrivateRecipe) == 1 * sizeof(int *));
12891 VarDecl *Alloca = readDeclAs<VarDecl>();
12892 RecipeList.push_back({Alloca});
12893 }
12894
12895 return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
12896 VarList, RecipeList, EndLoc);
12897 }
12899 SourceLocation LParenLoc = readSourceLocation();
12901 return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
12902 EndLoc);
12903 }
12905 SourceLocation LParenLoc = readSourceLocation();
12907 return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
12908 VarList, EndLoc);
12909 }
12911 SourceLocation LParenLoc = readSourceLocation();
12914 for (unsigned I = 0; I < VarList.size(); ++I) {
12915 static_assert(sizeof(OpenACCFirstPrivateRecipe) == 2 * sizeof(int *));
12916 VarDecl *Recipe = readDeclAs<VarDecl>();
12917 VarDecl *RecipeTemp = readDeclAs<VarDecl>();
12918 RecipeList.push_back({Recipe, RecipeTemp});
12919 }
12920
12921 return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
12922 VarList, RecipeList, EndLoc);
12923 }
12925 SourceLocation LParenLoc = readSourceLocation();
12927 return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
12928 VarList, EndLoc);
12929 }
12931 SourceLocation LParenLoc = readSourceLocation();
12933 return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
12934 VarList, EndLoc);
12935 }
12937 SourceLocation LParenLoc = readSourceLocation();
12939 return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
12940 VarList, EndLoc);
12941 }
12943 SourceLocation LParenLoc = readSourceLocation();
12945 return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
12946 VarList, EndLoc);
12947 }
12949 SourceLocation LParenLoc = readSourceLocation();
12951 return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
12952 VarList, EndLoc);
12953 }
12955 SourceLocation LParenLoc = readSourceLocation();
12957 return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
12958 VarList, EndLoc);
12959 }
12961 SourceLocation LParenLoc = readSourceLocation();
12963 return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
12964 VarList, EndLoc);
12965 }
12969 SourceLocation LParenLoc = readSourceLocation();
12972 return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
12973 LParenLoc, ModList, VarList, EndLoc);
12974 }
12978 SourceLocation LParenLoc = readSourceLocation();
12981 return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
12982 LParenLoc, ModList, VarList, EndLoc);
12983 }
12987 SourceLocation LParenLoc = readSourceLocation();
12990 return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
12991 LParenLoc, ModList, VarList, EndLoc);
12992 }
12996 SourceLocation LParenLoc = readSourceLocation();
12999 return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
13000 LParenLoc, ModList, VarList, EndLoc);
13001 }
13003 SourceLocation LParenLoc = readSourceLocation();
13004 Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
13005 return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
13006 AsyncExpr, EndLoc);
13007 }
13009 SourceLocation LParenLoc = readSourceLocation();
13010 Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
13011 SourceLocation QueuesLoc = readSourceLocation();
13013 return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
13014 DevNumExpr, QueuesLoc, QueueIdExprs,
13015 EndLoc);
13016 }
13019 SourceLocation LParenLoc = readSourceLocation();
13021 unsigned NumArchs = readInt();
13022
13023 for (unsigned I = 0; I < NumArchs; ++I) {
13024 IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
13026 Archs.emplace_back(Loc, Ident);
13027 }
13028
13029 return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
13030 LParenLoc, Archs, EndLoc);
13031 }
13033 SourceLocation LParenLoc = readSourceLocation();
13037
13038 for (unsigned I = 0; I < VarList.size(); ++I) {
13039 VarDecl *Recipe = readDeclAs<VarDecl>();
13040
13041 static_assert(sizeof(OpenACCReductionRecipe::CombinerRecipe) ==
13042 3 * sizeof(int *));
13043
13045 unsigned NumCombiners = readInt();
13046 for (unsigned I = 0; I < NumCombiners; ++I) {
13049 Expr *Op = readExpr();
13050
13051 Combiners.push_back({LHS, RHS, Op});
13052 }
13053
13054 RecipeList.push_back({Recipe, Combiners});
13055 }
13056
13057 return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
13058 VarList, RecipeList, EndLoc);
13059 }
13061 return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
13063 return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
13065 return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
13067 return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
13069 return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
13071 return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
13073 SourceLocation LParenLoc = readSourceLocation();
13074 bool HasForce = readBool();
13075 Expr *LoopCount = readSubExpr();
13076 return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
13077 HasForce, LoopCount, EndLoc);
13078 }
13080 SourceLocation LParenLoc = readSourceLocation();
13081 unsigned NumClauses = readInt();
13082 llvm::SmallVector<Expr *> SizeExprs;
13083 for (unsigned I = 0; I < NumClauses; ++I)
13084 SizeExprs.push_back(readSubExpr());
13085 return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
13086 SizeExprs, EndLoc);
13087 }
13089 SourceLocation LParenLoc = readSourceLocation();
13090 unsigned NumExprs = readInt();
13093 for (unsigned I = 0; I < NumExprs; ++I) {
13094 GangKinds.push_back(readEnum<OpenACCGangKind>());
13095 // Can't use `readSubExpr` because this is usable from a 'decl' construct.
13096 Exprs.push_back(readExpr());
13097 }
13098 return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
13099 GangKinds, Exprs, EndLoc);
13100 }
13102 SourceLocation LParenLoc = readSourceLocation();
13103 Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
13104 return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
13105 WorkerExpr, EndLoc);
13106 }
13108 SourceLocation LParenLoc = readSourceLocation();
13109 Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
13110 return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
13111 VectorExpr, EndLoc);
13112 }
13114 SourceLocation LParenLoc = readSourceLocation();
13116 return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
13117 EndLoc);
13118 }
13120 SourceLocation LParenLoc = readSourceLocation();
13123 LParenLoc, VarList, EndLoc);
13124 }
13125
13127 SourceLocation LParenLoc = readSourceLocation();
13128 bool IsString = readBool();
13129 if (IsString)
13130 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13131 cast<StringLiteral>(readExpr()), EndLoc);
13132 return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
13133 readIdentifier(), EndLoc);
13134 }
13137 llvm_unreachable("Clause serialization not yet implemented");
13138 }
13139 llvm_unreachable("Invalid Clause Kind");
13140}
13141
13144 for (unsigned I = 0; I < Clauses.size(); ++I)
13145 Clauses[I] = readOpenACCClause();
13146}
13147
13148void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
13149 unsigned NumVars = readInt();
13150 A->Clauses.resize(NumVars);
13151 readOpenACCClauseList(A->Clauses);
13152}
13153
13154static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
13155 // TODO: Maybe it is better to check PrimaryModuleName is a valid
13156 // module name?
13157 llvm::FoldingSetNodeID ID;
13158 ID.AddString(PrimaryModuleName);
13159 return ID.computeStableHash();
13160}
13161
13163 if (!M)
13164 return std::nullopt;
13165
13166 if (M->isHeaderLikeModule())
13167 return std::nullopt;
13168
13169 if (M->isGlobalModule())
13170 return std::nullopt;
13171
13172 StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
13173 return getStableHashForModuleName(PrimaryModuleName);
13174}
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 bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath, StringRef ExistingModuleCachePath, StringRef ModuleFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts)
Check that the specified and the existing module cache paths are equivalent.
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)
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.
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:628
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
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:34
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:220
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,...
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 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:202
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
Definition ASTReader.h:173
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
Definition ASTReader.h:215
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
Definition ASTReader.h:186
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
Definition ASTReader.h:135
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
Definition ASTReader.h:227
virtual void ReadCounter(const serialization::ModuleFile &M, unsigned Value)
Receives COUNTER value.
Definition ASTReader.h:223
virtual void ReadModuleName(StringRef ModuleName)
Definition ASTReader.h:129
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:430
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:446
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:1991
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
Definition ASTReader.h:435
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:2600
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:2175
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:1833
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1846
@ 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:1837
@ 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:1841
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:2634
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:2185
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
friend class LocalDeclID
Definition ASTReader.h:443
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:477
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
Definition ASTReader.h:1817
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.
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:2612
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:2059
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.
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:439
friend class serialization::ReadMethodPoolVisitor
Definition ASTReader.h:441
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:2486
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)
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
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.
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, StringRef ExistingModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
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:2089
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.
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:2607
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)
ASTReadResult ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
Definition ASTReader.h:1999
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
Definition ASTReader.h:440
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
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:450
@ Success
The control block was read successfully.
Definition ASTReader.h:453
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
Definition ASTReader.h:470
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
Definition ASTReader.h:463
@ Failure
The AST file itself appears corrupted.
Definition ASTReader.h:456
@ VersionMismatch
The AST file was written by a different version of Clang.
Definition ASTReader.h:466
@ HadErrors
The AST file has errors.
Definition ASTReader.h:473
@ Missing
The AST file was missing.
Definition ASTReader.h:459
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:2514
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:2147
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:2470
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:1995
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...
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
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:436
SmallVector< uint64_t, 64 > RecordData
Definition ASTReader.h:445
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
Definition ASTReader.h:2508
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
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:1818
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.
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::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
serialization::ModuleFile ModuleFile
Definition ASTReader.h:476
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
Definition ASTReader.h:1954
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:1748
void setLBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1754
void setRBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1762
void setSizeExpr(Expr *Size)
Definition TypeLoc.h:1774
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2660
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2652
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2644
Attr - This represents one attribute.
Definition Attr.h:44
void setAttr(const Attr *A)
Definition TypeLoc.h:1034
void setConceptReference(ConceptReference *CR)
Definition TypeLoc.h:2376
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2370
void setCaretLoc(SourceLocation Loc)
Definition TypeLoc.h:1503
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:2604
Represents a C++ base or member initializer.
Definition DeclCXX.h:2369
void setSourceOrder(int Pos)
Set the source order of this initializer.
Definition DeclCXX.h:2556
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
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:1828
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
Definition DeclCXX.h:1790
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:1460
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition ExprCXX.cpp:1113
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 SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override
Receives COUNTER value.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
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.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
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)
typename Representation::const_iterator const_iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
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:2700
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:2673
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2688
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:2373
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
Definition DeclBase.h:2694
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:2714
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:247
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:593
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:859
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:984
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:842
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition DeclBase.h:812
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:793
SourceLocation getLocation() const
Definition DeclBase.h:439
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition DeclBase.h:1049
DeclContext * getDeclContext()
Definition DeclBase.h:448
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:918
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
Kind getKind() const
Definition DeclBase.h:442
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:870
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:2262
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2259
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2502
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2484
void setTemplateNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2490
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:1948
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:1969
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2572
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2552
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2561
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2067
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2039
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:232
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
Definition Diagnostic.h:597
bool getEnableAllWarnings() const
Definition Diagnostic.h:697
Level
The level of the diagnostic, after it has been through mapping.
Definition Diagnostic.h:237
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Definition Diagnostic.h:966
bool getSuppressSystemWarnings() const
Definition Diagnostic.h:723
bool getWarningsAsErrors() const
Definition Diagnostic.h:705
diag::Severity getExtensionHandlingBehavior() const
Definition Diagnostic.h:810
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
Definition Diagnostic.h:592
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:3160
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::vfs::FileSystem & getVirtualFileSystem() const
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,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
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...
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:2000
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5543
Wrapper for source info for functions.
Definition TypeLoc.h:1615
unsigned getNumParams() const
Definition TypeLoc.h:1687
void setLocalRangeBegin(SourceLocation L)
Definition TypeLoc.h:1635
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1651
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1694
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1659
void setLocalRangeEnd(SourceLocation L)
Definition TypeLoc.h:1643
void setExceptionSpecRange(SourceRange R)
Definition TypeLoc.h:1673
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.
Module * lookupModule(StringRef ModuleName, SourceLocation ImportLoc=SourceLocation(), bool AllowSearch=true, bool AllowExtraModuleMapSearch=false)
Lookup a module Search for a module with the given name.
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) const
Get a pointer to the pCM if it exists; else nullptr.
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:3467
Wrapper for source info for injected class names of class templates.
Definition TypeLoc.h:872
void setAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1585
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:1354
void setAttrRowOperand(Expr *e)
Definition TypeLoc.h:2102
void setAttrColumnOperand(Expr *e)
Definition TypeLoc.h:2108
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2117
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2096
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1521
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:1530
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:26
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
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:62
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella directory of the given module to the given directory.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella header of the given module to the given header.
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:539
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:51
ModuleHeaderRole
Flags describing the role of a module header.
Definition ModuleMap.h:126
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
Adds this header to the given module.
Describes a module or submodule.
Definition Module.h:144
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:732
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
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
Definition Module.h:406
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
Definition Module.h:528
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
Definition Module.h:361
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
Definition Module.h:451
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:443
@ Hidden
All of the names in this module are hidden.
Definition Module.h:445
@ AllVisible
All of the names in this module are visible.
Definition Module.h:447
SourceLocation DefinitionLoc
The location of the module definition.
Definition Module.h:150
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:341
ModuleKind Kind
The kind of this module.
Definition Module.h:189
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
Definition Module.h:772
bool isUnimportable() const
Determine whether this module has been declared unimportable.
Definition Module.h:563
void setASTFile(OptionalFileEntryRef File)
Set the serialized AST file for the top-level module of this module.
Definition Module.h:742
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
Definition Module.h:389
std::string Name
The name of this module.
Definition Module.h:147
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
Definition Module.h:395
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
Definition Module.h:434
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:520
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
Definition Module.h:489
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition Module.h:756
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
Definition Module.h:352
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
Definition Module.h:648
OptionalDirectoryEntryRef Directory
The build directory of this module.
Definition Module.h:198
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
Definition Module.h:439
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
Definition Module.h:687
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
Definition Module.h:424
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
Definition Module.h:202
ASTFileSignature Signature
The module signature.
Definition Module.h:208
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:239
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
Definition Module.h:416
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
Definition Module.cpp:383
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
Definition Module.h:541
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
Definition Module.h:376
llvm::PointerIntPair< Module *, 1, bool > ExportDecl
Describes an exported module.
Definition Module.h:468
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
Definition Module.h:748
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
Definition Module.h:218
unsigned IsAvailable
Whether this module is available in the current translation unit.
Definition Module.h:372
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Definition Module.h:411
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
Definition Module.h:737
std::vector< Conflict > Conflicts
The list of conflicts.
Definition Module.h:553
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
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 'absent' clause in the 'pragma omp assume' directive.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents 'acq_rel' clause in the 'pragma omp atomic|flush' directives.
This represents 'acquire' clause in the 'pragma omp atomic|flush' directives.
This represents clause 'affinity' in the 'pragma omp task'-based directives.
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'aligned' in the 'pragma omp ...' directives.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
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.
This represents 'at' clause in the 'pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the 'pragma omp requires' directive.
This represents 'bind' clause in the 'pragma omp ...' directives.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
This represents 'capture' clause in the 'pragma omp atomic' directive.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
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 'compare' clause in the 'pragma omp atomic' directive.
This represents the 'contains' clause in the 'pragma omp assume' directive.
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents clause 'copyin' in the 'pragma omp ...' directives.
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'copyprivate' in the 'pragma omp ...' directives.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
This represents implicit clause 'depend' for the 'pragma omp task' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive.
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.
This represents the 'doacross' clause for the 'pragma omp ordered' directive.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dynamic_allocators' clause in the 'pragma omp requires' directive.
This represents clause 'exclusive' in the 'pragma omp scan' directive.
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'fail' clause in the 'pragma omp atomic' directive.
This represents 'filter' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
This represents clause 'firstprivate' in the 'pragma omp ...' directives.
static OMPFirstprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents implicit clause 'flush' for the 'pragma omp flush' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'from' in the 'pragma omp ...' directives.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
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 'grainsize' clause in the 'pragma omp ...' directive.
This represents clause 'has_device_ptr' in the 'pragma omp ...' directives.
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.
This represents the 'holds' clause in the 'pragma omp assume' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This represents clause 'in_reduction' in the 'pragma omp task' directives.
static OMPInReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'inclusive' in the 'pragma omp scan' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents the 'init' clause in 'pragma omp ...' directives.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
This represents clause 'is_device_ptr' in the 'pragma omp ...' directives.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'lastprivate' in the 'pragma omp ...' directives.
static OMPLastprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'linear' in the 'pragma omp ...' directives.
static OMPLinearClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
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 clause 'map' in the 'pragma omp ...' directives.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
This represents the 'no_openmp_routines' clause in the 'pragma omp assume' directive.
This represents the 'no_parallelism' clause in the 'pragma omp assume' directive.
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
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 'nowait' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
This represents 'num_teams' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'ordered' clause in the 'pragma omp ...' directive.
static OMPOrderedClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty clause.
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 'priority' clause in the 'pragma omp ...' directive.
This represents clause 'private' in the 'pragma omp ...' directives.
static OMPPrivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'proc_bind' clause in the 'pragma omp ...' directive.
This represents 'read' clause in the 'pragma omp atomic' directive.
This represents clause 'reduction' in the 'pragma omp ...' directives.
static OMPReductionClause * CreateEmpty(const ASTContext &C, unsigned N, OpenMPReductionClauseModifier Modifier)
Creates an empty clause with the place for N variables.
This represents 'relaxed' clause in the 'pragma omp atomic' directives.
This represents 'release' clause in the 'pragma omp atomic|flush' directives.
This represents 'reverse_offload' clause in the 'pragma omp requires' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'schedule' clause in the 'pragma omp ...' directive.
This represents 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
This represents clause 'shared' in the 'pragma omp ...' directives.
static OMPSharedClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
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 clause 'task_reduction' in the 'pragma omp taskgroup' directives.
static OMPTaskReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'thread_limit' 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.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
This represents clause 'to' in the 'pragma omp ...' directives.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents 'unified_address' clause in the 'pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the 'pragma omp requires' directive.
This represents 'untied' clause in the 'pragma omp ...' directive.
This represents 'update' clause in the 'pragma omp atomic' directive.
static OMPUpdateClause * CreateEmpty(const ASTContext &C, bool IsExtended)
Creates an empty clause with the place for N variables.
This represents the 'use' clause in 'pragma omp ...' directives.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'uses_allocators' in the 'pragma omp target'-based directives.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'weak' clause in the 'pragma omp atomic' directives.
This represents 'write' clause in the 'pragma omp atomic' directive.
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.
method_range methods() const
Definition DeclObjC.h:1016
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:1284
void setNameEndLoc(SourceLocation Loc)
Definition TypeLoc.h:1296
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:1563
void setTypeArgsRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1167
unsigned getNumTypeArgs() const
Definition TypeLoc.h:1171
unsigned getNumProtocols() const
Definition TypeLoc.h:1201
void setTypeArgsLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1159
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
Definition TypeLoc.h:1180
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1189
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1197
void setHasBaseTypeAsWritten(bool HasBaseType)
Definition TypeLoc.h:1229
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:1210
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)
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.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
void ReadCounter(const serialization::ModuleFile &M, unsigned 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 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:2604
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2287
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1386
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1382
Represents a parameter to a function.
Definition Decl.h:1790
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2696
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1490
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:1599
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:5312
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:854
SemaObjC & ObjC()
Definition Sema.h:1486
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
Definition Sema.cpp:656
IdentifierResolver IdResolver
Definition Sema.h:3460
PragmaMsStackAction
Definition Sema.h:1817
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
Definition ASTReader.h:362
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:85
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:816
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:824
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:805
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
Definition TypeLoc.h:1884
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TypeLoc.cpp:644
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:3356
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:2236
A container of type source information.
Definition TypeBase.h:8249
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:1833
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2179
void setTypeofLoc(SourceLocation Loc)
Definition TypeLoc.h:2171
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2187
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2321
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2315
void setUnderlyingTInfo(TypeSourceInfo *TInfo)
Definition TypeLoc.h:2327
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2318
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:926
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2016
Captures information about a #pragma weak directive.
Definition Weak.h:25
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:84
OptionalFileEntryRef getFile() const
Definition ModuleFile.h:113
static InputFile getNotFound()
Definition ModuleFile.h:107
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:130
const PPEntityOffset * PreprocessedEntityOffsets
Definition ModuleFile.h:378
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
Definition ModuleFile.h:327
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
Definition ModuleFile.h:441
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
Definition ModuleFile.h:246
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
Definition ModuleFile.h:236
StringRef Data
The serialized bitstream data for this file.
Definition ModuleFile.h:222
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:469
ContinuousRangeMap< uint32_t, int, 2 > PreprocessedEntityRemap
Remapping table for preprocessed entity IDs in this module.
Definition ModuleFile.h:376
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:291
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
Definition ModuleFile.h:317
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
Definition ModuleFile.h:373
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
Definition ModuleFile.h:489
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:472
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
Definition ModuleFile.h:344
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
Definition ModuleFile.h:261
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
Definition ModuleFile.h:331
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
Definition ModuleFile.h:307
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:448
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
Definition ModuleFile.h:323
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
Definition ModuleFile.h:298
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
Definition ModuleFile.h:255
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
Definition ModuleFile.h:264
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
Definition ModuleFile.h:426
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
Definition ModuleFile.h:497
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
Definition ModuleFile.h:397
SourceLocation ImportLoc
The source location where this module was first imported.
Definition ModuleFile.h:239
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
Definition ModuleFile.h:464
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
Definition ModuleFile.h:302
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
Definition ModuleFile.h:337
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
Definition ModuleFile.h:168
FileEntryRef File
The file entry for the module file.
Definition ModuleFile.h:185
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
Definition ModuleFile.h:164
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
Definition ModuleFile.h:369
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
Definition ModuleFile.h:267
unsigned LocalNumSubmodules
The number of submodules in this module.
Definition ModuleFile.h:406
SourceLocation FirstLoc
The first source location in this module.
Definition ModuleFile.h:242
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:193
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
Definition ModuleFile.h:285
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
Definition ModuleFile.h:182
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:160
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
Definition ModuleFile.h:515
bool HasTimestamps
Whether timestamps are included in this module file.
Definition ModuleFile.h:179
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
Definition ModuleFile.h:258
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
Definition ModuleFile.h:282
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
Definition ModuleFile.h:173
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
Definition ModuleFile.h:423
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
Definition ModuleFile.h:461
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
Definition ModuleFile.h:288
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
Definition ModuleFile.h:401
unsigned Index
The index of this module in the list of modules.
Definition ModuleFile.h:139
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
Definition ModuleFile.h:225
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
Definition ModuleFile.h:409
uint64_t SizeInBits
The size of this file, in bits.
Definition ModuleFile.h:213
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
Definition ModuleFile.h:485
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition ModuleFile.h:216
bool StandardCXXModule
Whether this module file is a standard C++ module.
Definition ModuleFile.h:176
unsigned LocalNumTypes
The number of types in this AST file.
Definition ModuleFile.h:481
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:250
const PPSkippedRange * PreprocessedSkippedRangeOffsets
Definition ModuleFile.h:384
std::string FileName
The file name of the module file.
Definition ModuleFile.h:145
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
Definition ModuleFile.h:277
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
Definition ModuleFile.h:366
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
Definition ModuleFile.h:294
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition ModuleFile.h:458
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
Definition ModuleFile.h:360
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
Definition ModuleFile.h:189
unsigned LocalNumMacros
The number of macros in this AST file.
Definition ModuleFile.h:340
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
Definition ModuleFile.h:434
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
Definition ModuleFile.h:454
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
Definition ModuleFile.h:390
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
Definition ModuleFile.h:196
unsigned Generation
The generation of which this module file is a part.
Definition ModuleFile.h:206
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
Definition ModuleFile.h:314
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
Definition ModuleFile.h:429
ContinuousRangeMap< uint32_t, int, 2 > MacroRemap
Remapping table for macro IDs in this module.
Definition ModuleFile.h:357
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
Definition ModuleFile.h:351
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
Definition ModuleFile.h:219
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
Definition ModuleFile.h:412
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
Definition ModuleFile.h:199
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:451
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
Definition ModuleFile.h:494
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
Definition ModuleFile.h:382
unsigned LocalNumSelectors
The number of selectors new to this file.
Definition ModuleFile.h:419
ModuleKind Kind
The type of this module.
Definition ModuleFile.h:142
std::string ModuleName
The name of the module.
Definition ModuleFile.h:148
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
Definition ModuleFile.h:354
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:476
std::string BaseDirectory
The base directory of the module.
Definition ModuleFile.h:151
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Definition ModuleFile.h:508
Manages the set of modules loaded by an AST reader.
AddModuleResult
The result of attempting to add a new module.
@ 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.
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)
#define bool
Definition gpuintrin.h:32
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.
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.
@ 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_METADATA
Metadata for submodules as a whole.
@ 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_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ 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.
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
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.
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
uint32_t MacroID
An ID number that refers to a macro in an AST file.
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:43
@ MK_PCH
File is a PCH file treated as such.
Definition ModuleFile.h:51
@ MK_Preamble
File is a PCH file treated as the preamble.
Definition ModuleFile.h:54
@ MK_MainFile
File is a PCH file treated as the actual main file.
Definition ModuleFile.h:57
@ MK_ExplicitModule
File is an explicitly-loaded module.
Definition ModuleFile.h:48
@ MK_ImplicitModule
File is an implicitly-loaded module.
Definition ModuleFile.h:45
@ MK_PrebuiltModule
File is from a prebuilt module path.
Definition ModuleFile.h:60
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.
@ 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.
@ 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.
@ 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.
uint32_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
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
@ ModuleFile
The module file (.pcm). Required.
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:3545
@ 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:123
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
@ 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.
const FunctionProtoType * T
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
@ Type
The name was classified as a type.
Definition Sema.h:562
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:47
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:50
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:2704
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:178
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:5867
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
The signature of a module, which is a hash of the AST content.
Definition Module.h:58
static constexpr size_t size
Definition Module.h:61
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
Definition Module.h:81
static ASTFileSignature createDummy()
Definition Module.h:91
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:544
Module * Other
The module that this module conflicts with.
Definition Module.h:546
std::string Message
The message provided to the user when there is a conflict.
Definition Module.h:549
Information about a header directive as found in the module map file.
Definition Module.h:287
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
unsigned NumVars
Number of expressions listed.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
Expr * AllocatorTraits
Allocator traits.
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:1828
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
The input file info that has been loaded from an AST file.
Definition ModuleFile.h:64
Describes the categories of an Objective-C class.
#define log(__x)
Definition tgmath.h:460