clang 23.0.0git
ASTReader.h
Go to the documentation of this file.
1//===- ASTReader.h - AST File Reader ----------------------------*- C++ -*-===//
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#ifndef LLVM_CLANG_SERIALIZATION_ASTREADER_H
14#define LLVM_CLANG_SERIALIZATION_ASTREADER_H
15
16#include "clang/AST/Type.h"
23#include "clang/Basic/Version.h"
30#include "clang/Sema/Sema.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/DenseMap.h"
39#include "llvm/ADT/DenseSet.h"
40#include "llvm/ADT/IntrusiveRefCntPtr.h"
41#include "llvm/ADT/MapVector.h"
42#include "llvm/ADT/PagedVector.h"
43#include "llvm/ADT/STLExtras.h"
44#include "llvm/ADT/SetVector.h"
45#include "llvm/ADT/SmallPtrSet.h"
46#include "llvm/ADT/SmallVector.h"
47#include "llvm/ADT/StringMap.h"
48#include "llvm/ADT/StringRef.h"
49#include "llvm/ADT/iterator.h"
50#include "llvm/ADT/iterator_range.h"
51#include "llvm/Bitstream/BitstreamReader.h"
52#include "llvm/Support/MemoryBuffer.h"
53#include "llvm/Support/SaveAndRestore.h"
54#include "llvm/Support/Timer.h"
55#include "llvm/Support/VersionTuple.h"
56#include <cassert>
57#include <cstddef>
58#include <cstdint>
59#include <ctime>
60#include <deque>
61#include <memory>
62#include <optional>
63#include <set>
64#include <string>
65#include <utility>
66#include <vector>
67
68namespace clang {
69
70class ASTConsumer;
71class ASTContext;
73class ASTReader;
74class ASTRecordReader;
75class CodeGenOptions;
76class CXXTemporary;
77class Decl;
78class DeclarationName;
79class DeclaratorDecl;
80class DeclContext;
81class EnumDecl;
82class Expr;
83class FieldDecl;
84class FileEntry;
85class FileManager;
87class FunctionDecl;
89struct HeaderFileInfo;
91class LangOptions;
92class MacroInfo;
93class ModuleCache;
94class NamedDecl;
95class NamespaceDecl;
99class Preprocessor;
101class Sema;
102class SourceManager;
103class Stmt;
104class SwitchCase;
105class TargetOptions;
106class Token;
107class TypedefNameDecl;
108class ValueDecl;
109class VarDecl;
110
111/// Abstract interface for callback invocations by the ASTReader.
112///
113/// While reading an AST file, the ASTReader will call the methods of the
114/// listener to pass on specific information. Some of the listener methods can
115/// return true to indicate to the ASTReader that the information (and
116/// consequently the AST file) is invalid.
118public:
120
121 /// Receives the full Clang version information.
122 ///
123 /// \returns true to indicate that the version is invalid. Subclasses should
124 /// generally defer to this implementation.
125 virtual bool ReadFullVersionInformation(StringRef FullVersion) {
126 return FullVersion != getClangFullRepositoryVersion();
127 }
128
129 virtual void ReadModuleName(StringRef ModuleName) {}
130 virtual void ReadModuleMapFile(StringRef ModuleMapPath) {}
131
132 /// Receives the language options.
133 ///
134 /// \returns true to indicate the options are invalid or false otherwise.
135 virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
136 StringRef ModuleFilename, bool Complain,
137 bool AllowCompatibleDifferences) {
138 return false;
139 }
140
141 /// Receives the codegen options.
142 ///
143 /// \returns true to indicate the options are invalid or false otherwise.
144 virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
145 StringRef ModuleFilename, bool Complain,
146 bool AllowCompatibleDifferences) {
147 return false;
148 }
149
150 /// Receives the target options.
151 ///
152 /// \returns true to indicate the target options are invalid, or false
153 /// otherwise.
154 virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
155 StringRef ModuleFilename, bool Complain,
156 bool AllowCompatibleDifferences) {
157 return false;
158 }
159
160 /// Receives the diagnostic options.
161 ///
162 /// \returns true to indicate the diagnostic options are invalid, or false
163 /// otherwise.
165 StringRef ModuleFilename, bool Complain) {
166 return false;
167 }
168
169 /// Receives the file system options.
170 ///
171 /// \returns true to indicate the file system options are invalid, or false
172 /// otherwise.
173 virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
174 bool Complain) {
175 return false;
176 }
177
178 /// Receives the header search options.
179 ///
180 /// \param HSOpts The read header search options. The following fields are
181 /// missing and are reported in ReadHeaderSearchPaths():
182 /// UserEntries, SystemHeaderPrefixes, VFSOverlayFiles.
183 ///
184 /// \returns true to indicate the header search options are invalid, or false
185 /// otherwise.
187 StringRef ModuleFilename,
188 StringRef ContextHash, bool Complain) {
189 return false;
190 }
191
192 /// Receives the header search paths.
193 ///
194 /// \param HSOpts The read header search paths. Only the following fields are
195 /// initialized: UserEntries, SystemHeaderPrefixes,
196 /// VFSOverlayFiles. The rest is reported in
197 /// ReadHeaderSearchOptions().
198 ///
199 /// \returns true to indicate the header search paths are invalid, or false
200 /// otherwise.
201 virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts,
202 bool Complain) {
203 return false;
204 }
205
206 /// Receives the preprocessor options.
207 ///
208 /// \param SuggestedPredefines Can be filled in with the set of predefines
209 /// that are suggested by the preprocessor options. Typically only used when
210 /// loading a precompiled header.
211 ///
212 /// \returns true to indicate the preprocessor options are invalid, or false
213 /// otherwise.
215 StringRef ModuleFilename,
216 bool ReadMacros, bool Complain,
217 std::string &SuggestedPredefines) {
218 return false;
219 }
220
221 /// Receives __COUNTER__ value.
222 virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) {
223 }
224
225 /// This is called for each AST file loaded.
226 virtual void visitModuleFile(ModuleFileName Filename,
228
229 /// Returns true if this \c ASTReaderListener wants to receive the
230 /// input files of the AST file via \c visitInputFile, false otherwise.
231 virtual bool needsInputFileVisitation() { return false; }
232
233 /// Returns true if this \c ASTReaderListener wants to receive the
234 /// system input files of the AST file via \c visitInputFile, false otherwise.
235 virtual bool needsSystemInputFileVisitation() { return false; }
236
237 /// if \c needsInputFileVisitation returns true, this is called for
238 /// each non-system input file of the AST File. If
239 /// \c needsSystemInputFileVisitation is true, then it is called for all
240 /// system input files as well.
241 ///
242 /// \returns true to continue receiving the next input file, false to stop.
243 virtual bool visitInputFile(StringRef Filename, bool isSystem,
244 bool isOverridden, bool isExplicitModule) {
245 return true;
246 }
247
248 /// Similiar to member function of \c visitInputFile but should
249 /// be defined when there is a distinction between the file name
250 /// and the name-as-requested. For example, when deserializing input
251 /// files from precompiled AST files.
252 ///
253 /// \returns true to continue receiving the next input file, false to stop.
254 virtual bool visitInputFileAsRequested(StringRef FilenameAsRequested,
255 StringRef Filename, bool isSystem,
256 bool isOverridden, time_t StoredTime,
257 bool isExplicitModule) {
258 return true;
259 }
260
261 /// Returns true if this \c ASTReaderListener wants to receive the
262 /// imports of the AST file via \c visitImport, false otherwise.
263 virtual bool needsImportVisitation() const { return false; }
264
265 /// If needsImportVisitation returns \c true, this is called for each
266 /// AST file imported by this AST file.
267 virtual void visitImport(StringRef ModuleName, StringRef Filename) {}
268
269 /// Indicates that a particular module file extension has been read.
271 const ModuleFileExtensionMetadata &Metadata) {}
272};
273
274/// Simple wrapper class for chaining listeners.
276 std::unique_ptr<ASTReaderListener> First;
277 std::unique_ptr<ASTReaderListener> Second;
278
279public:
280 /// Takes ownership of \p First and \p Second.
281 ChainedASTReaderListener(std::unique_ptr<ASTReaderListener> First,
282 std::unique_ptr<ASTReaderListener> Second)
283 : First(std::move(First)), Second(std::move(Second)) {}
284
285 std::unique_ptr<ASTReaderListener> takeFirst() { return std::move(First); }
286 std::unique_ptr<ASTReaderListener> takeSecond() { return std::move(Second); }
287
288 bool ReadFullVersionInformation(StringRef FullVersion) override;
289 void ReadModuleName(StringRef ModuleName) override;
290 void ReadModuleMapFile(StringRef ModuleMapPath) override;
291 bool ReadLanguageOptions(const LangOptions &LangOpts,
292 StringRef ModuleFilename, bool Complain,
293 bool AllowCompatibleDifferences) override;
294 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
295 StringRef ModuleFilename, bool Complain,
296 bool AllowCompatibleDifferences) override;
297 bool ReadTargetOptions(const TargetOptions &TargetOpts,
298 StringRef ModuleFilename, bool Complain,
299 bool AllowCompatibleDifferences) override;
301 StringRef ModuleFilename, bool Complain) override;
302 bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
303 bool Complain) override;
304
306 StringRef ModuleFilename, StringRef ContextHash,
307 bool Complain) override;
309 StringRef ModuleFilename, bool ReadMacros,
310 bool Complain,
311 std::string &SuggestedPredefines) override;
312
313 void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
314 bool needsInputFileVisitation() override;
315 bool needsSystemInputFileVisitation() override;
316 void visitModuleFile(ModuleFileName Filename,
317 serialization::ModuleKind Kind) override;
318 bool visitInputFile(StringRef Filename, bool isSystem,
319 bool isOverridden, bool isExplicitModule) override;
321 const ModuleFileExtensionMetadata &Metadata) override;
322};
323
324/// ASTReaderListener implementation to validate the information of
325/// the PCH file against an initialized Preprocessor.
327 Preprocessor &PP;
328 ASTReader &Reader;
329
330public:
332 : PP(PP), Reader(Reader) {}
333
334 bool ReadLanguageOptions(const LangOptions &LangOpts,
335 StringRef ModuleFilename, bool Complain,
336 bool AllowCompatibleDifferences) override;
337 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
338 StringRef ModuleFilename, bool Complain,
339 bool AllowCompatibleDifferences) override;
340 bool ReadTargetOptions(const TargetOptions &TargetOpts,
341 StringRef ModuleFilename, bool Complain,
342 bool AllowCompatibleDifferences) override;
344 StringRef ModuleFilename, bool Complain) override;
346 StringRef ModuleFilename, bool ReadMacros,
347 bool Complain,
348 std::string &SuggestedPredefines) override;
350 StringRef ModuleFilename, StringRef ContextHash,
351 bool Complain) override;
352 void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
353};
354
355/// ASTReaderListenter implementation to set SuggestedPredefines of
356/// ASTReader which is required to use a pch file. This is the replacement
357/// of PCHValidator or SimplePCHValidator when using a pch file without
358/// validating it.
360 Preprocessor &PP;
361
362public:
364
366 StringRef ModuleFilename, bool ReadMacros,
367 bool Complain,
368 std::string &SuggestedPredefines) override;
369};
370
371namespace serialization {
372
373class ReadMethodPoolVisitor;
374
375namespace reader {
376
378
379/// The on-disk hash table(s) used for DeclContext name lookup.
382
383/// The on-disk hash table(s) used for specialization decls.
385
386} // namespace reader
387
388} // namespace serialization
389
391 uint64_t VisibleOffset = 0;
392 uint64_t ModuleLocalOffset = 0;
393 uint64_t TULocalOffset = 0;
394
395 operator bool() const {
397 }
398};
399
401 uint64_t LexicalOffset = 0;
402
403 operator bool() const {
404 return VisibleLookupBlockOffsets::operator bool() || LexicalOffset;
405 }
406};
407
408/// Reads an AST files chain containing the contents of a translation
409/// unit.
410///
411/// The ASTReader class reads bitstreams (produced by the ASTWriter
412/// class) containing the serialized representation of a given
413/// abstract syntax tree and its supporting data structures. An
414/// instance of the ASTReader can be attached to an ASTContext object,
415/// which will provide access to the contents of the AST files.
416///
417/// The AST reader provides lazy de-serialization of declarations, as
418/// required when traversing the AST. Only those AST nodes that are
419/// actually required will be de-serialized.
424 public ExternalSemaSource,
427{
428public:
429 /// Types of AST files.
430 friend class ASTDeclMerger;
431 friend class ASTDeclReader;
433 friend class ASTRecordReader;
434 friend class ASTUnit; // ASTUnit needs to remap source locations.
435 friend class ASTWriter;
436 friend class PCHValidator;
439 friend class TypeLocReader;
440 friend class LocalDeclID;
441
444
445 /// The result of reading the control block of an AST file, which
446 /// can fail for various reasons.
448 /// The control block was read successfully. Aside from failures,
449 /// the AST file is safe to read into the current context.
451
452 /// The AST file itself appears corrupted.
454
455 /// The AST file was missing.
457
458 /// The AST file is out-of-date relative to its input files,
459 /// and needs to be regenerated.
461
462 /// The AST file was written by a different version of Clang.
464
465 /// The AST file was written with a different language/target
466 /// configuration.
468
469 /// The AST file has errors.
471 };
472
479
480private:
481 /// The receiver of some callbacks invoked by ASTReader.
482 std::unique_ptr<ASTReaderListener> Listener;
483
484 /// The receiver of deserialization events.
485 ASTDeserializationListener *DeserializationListener = nullptr;
486
487 bool OwnsDeserializationListener = false;
488
489 SourceManager &SourceMgr;
490 FileManager &FileMgr;
491 const PCHContainerReader &PCHContainerRdr;
492 DiagnosticsEngine &Diags;
493 // Sema has duplicate logic, but SemaObj can sometimes be null so ASTReader
494 // has its own version.
495 StackExhaustionHandler StackHandler;
496
497 /// The semantic analysis object that will be processing the
498 /// AST files and the translation unit that uses it.
499 Sema *SemaObj = nullptr;
500
501 /// The preprocessor that will be loading the source file.
502 Preprocessor &PP;
503
504 /// The AST context into which we'll read the AST files.
505 ASTContext *ContextObj = nullptr;
506
507 /// The AST consumer.
508 ASTConsumer *Consumer = nullptr;
509
510 /// The codegen options.
511 const CodeGenOptions &CodeGenOpts;
512
513 /// The module manager which manages modules and their dependencies
514 ModuleManager ModuleMgr;
515
516 /// A dummy identifier resolver used to merge TU-scope declarations in
517 /// C, for the cases where we don't have a Sema object to provide a real
518 /// identifier resolver.
519 IdentifierResolver DummyIdResolver;
520
521 /// A mapping from extension block names to module file extensions.
522 llvm::StringMap<std::shared_ptr<ModuleFileExtension>> ModuleFileExtensions;
523
524 /// A timer used to track the time spent deserializing.
525 std::unique_ptr<llvm::Timer> ReadTimer;
526
527 // A TimeRegion used to start and stop ReadTimer via RAII.
528 std::optional<llvm::TimeRegion> ReadTimeRegion;
529
530 /// The location where the module file will be considered as
531 /// imported from. For non-module AST types it should be invalid.
532 SourceLocation CurrentImportLoc;
533
534 /// The module kind that is currently deserializing.
535 std::optional<ModuleKind> CurrentDeserializingModuleKind;
536
537 /// The global module index, if loaded.
538 std::unique_ptr<GlobalModuleIndex> GlobalIndex;
539
540 /// A map of global bit offsets to the module that stores entities
541 /// at those bit offsets.
543
544 /// A map of negated SLocEntryIDs to the modules containing them.
546
547 using GlobalSLocOffsetMapType =
549
550 /// A map of reversed (SourceManager::MaxLoadedOffset - SLocOffset)
551 /// SourceLocation offsets to the modules containing them.
552 GlobalSLocOffsetMapType GlobalSLocOffsetMap;
553
554 /// Types that have already been loaded from the chain.
555 ///
556 /// When the pointer at index I is non-NULL, the type with
557 /// ID = (I + 1) << FastQual::Width has already been loaded
558 llvm::PagedVector<QualType> TypesLoaded;
559
560 /// Declarations that have already been loaded from the chain.
561 ///
562 /// When the pointer at index I is non-NULL, the declaration with ID
563 /// = I + 1 has already been loaded.
564 llvm::PagedVector<Decl *> DeclsLoaded;
565
566 using FileOffset = std::pair<ModuleFile *, uint64_t>;
567 using FileOffsetsTy = SmallVector<FileOffset, 2>;
568 using DeclUpdateOffsetsMap = llvm::DenseMap<GlobalDeclID, FileOffsetsTy>;
569
570 /// Declarations that have modifications residing in a later file
571 /// in the chain.
572 DeclUpdateOffsetsMap DeclUpdateOffsets;
573
574 using DelayedNamespaceOffsetMapTy =
575 llvm::DenseMap<GlobalDeclID, LookupBlockOffsets>;
576
577 /// Mapping from global declaration IDs to the lexical and visible block
578 /// offset for delayed namespace in reduced BMI.
579 ///
580 /// We can't use the existing DeclUpdate mechanism since the DeclUpdate
581 /// may only be applied in an outer most read. However, we need to know
582 /// whether or not a DeclContext has external storage during the recursive
583 /// reading. So we need to apply the offset immediately after we read the
584 /// namespace as if it is not delayed.
585 DelayedNamespaceOffsetMapTy DelayedNamespaceOffsetMap;
586
587 /// Mapping from main decl ID to the related decls IDs.
588 ///
589 /// The key is the main decl ID, and the value is a vector of related decls
590 /// that must be loaded immediately after the main decl. This is necessary
591 /// to ensure that the definition for related decls comes from the same module
592 /// as the enclosing main decl. Without this, due to lazy deserialization,
593 /// the definition for the main decl and related decls may come from different
594 /// modules. It is used for the following cases:
595 /// - Lambda inside a template function definition: The main declaration is
596 /// the enclosing function, and the related declarations are the lambda
597 /// call operators.
598 /// - Friend function defined inside a template CXXRecord declaration: The
599 /// main declaration is the enclosing record, and the related declarations
600 /// are the friend functions.
601 llvm::DenseMap<GlobalDeclID, SmallVector<GlobalDeclID, 4>> RelatedDeclsMap;
602
603 struct PendingUpdateRecord {
604 Decl *D;
605 GlobalDeclID ID;
606
607 // Whether the declaration was just deserialized.
608 bool JustLoaded;
609
610 PendingUpdateRecord(GlobalDeclID ID, Decl *D, bool JustLoaded)
611 : D(D), ID(ID), JustLoaded(JustLoaded) {}
612 };
613
614 /// Declaration updates for already-loaded declarations that we need
615 /// to apply once we finish processing an import.
617
618 enum class PendingFakeDefinitionKind { NotFake, Fake, FakeLoaded };
619
620 /// The DefinitionData pointers that we faked up for class definitions
621 /// that we needed but hadn't loaded yet.
622 llvm::DenseMap<void *, PendingFakeDefinitionKind> PendingFakeDefinitionData;
623
624 /// Exception specification updates that have been loaded but not yet
625 /// propagated across the relevant redeclaration chain. The map key is the
626 /// canonical declaration (used only for deduplication) and the value is a
627 /// declaration that has an exception specification.
628 llvm::SmallMapVector<Decl *, FunctionDecl *, 4> PendingExceptionSpecUpdates;
629
630 /// Deduced return type updates that have been loaded but not yet propagated
631 /// across the relevant redeclaration chain. The map key is the canonical
632 /// declaration and the value is the deduced return type.
633 llvm::SmallMapVector<FunctionDecl *, QualType, 4> PendingDeducedTypeUpdates;
634
635 /// Functions has undededuced return type and we wish we can find the deduced
636 /// return type by iterating the redecls in other modules.
637 llvm::SmallVector<FunctionDecl *, 4> PendingUndeducedFunctionDecls;
638
639 /// Declarations that have been imported and have typedef names for
640 /// linkage purposes.
641 llvm::DenseMap<std::pair<DeclContext *, IdentifierInfo *>, NamedDecl *>
642 ImportedTypedefNamesForLinkage;
643
644 /// Mergeable declaration contexts that have anonymous declarations
645 /// within them, and those anonymous declarations.
646 llvm::DenseMap<Decl*, llvm::SmallVector<NamedDecl*, 2>>
647 AnonymousDeclarationsForMerging;
648
649 /// Map from numbering information for lambdas to the corresponding lambdas.
650 llvm::DenseMap<std::pair<const Decl *, unsigned>, NamedDecl *>
651 LambdaDeclarationsForMerging;
652
653 /// Key used to identify LifetimeExtendedTemporaryDecl for merging,
654 /// containing the lifetime-extending declaration and the mangling number.
655 using LETemporaryKey = std::pair<Decl *, unsigned>;
656
657 /// Map of already deserialiazed temporaries.
658 llvm::DenseMap<LETemporaryKey, LifetimeExtendedTemporaryDecl *>
659 LETemporaryForMerging;
660
661 struct FileDeclsInfo {
662 ModuleFile *Mod = nullptr;
664
665 FileDeclsInfo() = default;
666 FileDeclsInfo(ModuleFile *Mod,
668 : Mod(Mod), Decls(Decls) {}
669 };
670
671 /// Map from a FileID to the file-level declarations that it contains.
672 llvm::DenseMap<FileID, FileDeclsInfo> FileDeclIDs;
673
674 /// An array of lexical contents of a declaration context, as a sequence of
675 /// Decl::Kind, DeclID pairs.
676 using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>;
677
678 /// Map from a DeclContext to its lexical contents.
679 llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>>
680 LexicalDecls;
681
682 /// Map from the TU to its lexical contents from each module file.
683 std::vector<std::pair<ModuleFile*, LexicalContents>> TULexicalDecls;
684
685 /// Map from a DeclContext to its lookup tables.
686 llvm::DenseMap<const DeclContext *,
687 serialization::reader::DeclContextLookupTable> Lookups;
688 llvm::DenseMap<const DeclContext *,
689 serialization::reader::ModuleLocalLookupTable>
690 ModuleLocalLookups;
691 llvm::DenseMap<const DeclContext *,
692 serialization::reader::DeclContextLookupTable>
693 TULocalLookups;
694
695 using SpecLookupTableTy =
696 llvm::DenseMap<const Decl *,
697 serialization::reader::LazySpecializationInfoLookupTable>;
698 /// Map from decls to specialized decls.
699 SpecLookupTableTy SpecializationsLookups;
700 /// Split partial specialization from specialization to speed up lookups.
701 SpecLookupTableTy PartialSpecializationsLookups;
702
703 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
704 const Decl *D);
705 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
706 const Decl *D,
707 ArrayRef<TemplateArgument> TemplateArgs);
708
709 // Updates for visible decls can occur for other contexts than just the
710 // TU, and when we read those update records, the actual context may not
711 // be available yet, so have this pending map using the ID as a key. It
712 // will be realized when the data is actually loaded.
713 struct UpdateData {
714 ModuleFile *Mod;
715 const unsigned char *Data;
716 };
717 using DeclContextVisibleUpdates = SmallVector<UpdateData, 1>;
718
719 /// Updates to the visible declarations of declaration contexts that
720 /// haven't been loaded yet.
721 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> PendingVisibleUpdates;
722 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates>
723 PendingModuleLocalVisibleUpdates;
724 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> TULocalUpdates;
725
726 using SpecializationsUpdate = SmallVector<UpdateData, 1>;
727 using SpecializationsUpdateMap =
728 llvm::DenseMap<GlobalDeclID, SpecializationsUpdate>;
729 SpecializationsUpdateMap PendingSpecializationsUpdates;
730 SpecializationsUpdateMap PendingPartialSpecializationsUpdates;
731
732 /// The set of C++ or Objective-C classes that have forward
733 /// declarations that have not yet been linked to their definitions.
734 llvm::SmallPtrSet<Decl *, 4> PendingDefinitions;
735
736 using PendingBodiesMap =
737 llvm::MapVector<Decl *, uint64_t,
738 llvm::SmallDenseMap<Decl *, unsigned, 4>,
739 SmallVector<std::pair<Decl *, uint64_t>, 4>>;
740
741 /// Functions or methods that have bodies that will be attached.
742 PendingBodiesMap PendingBodies;
743
744 /// Definitions for which we have added merged definitions but not yet
745 /// performed deduplication.
746 llvm::SetVector<NamedDecl *> PendingMergedDefinitionsToDeduplicate;
747
748 /// The duplicated definitions in module units which are pending to be warned.
749 /// We need to delay it to wait for the loading of definitions since we don't
750 /// want to warn for forward declarations.
751 llvm::SmallVector<std::pair<Decl *, Decl *>>
752 PendingWarningForDuplicatedDefsInModuleUnits;
753
754 /// Read the record that describes the lexical contents of a DC.
755 bool ReadLexicalDeclContextStorage(ModuleFile &M,
756 llvm::BitstreamCursor &Cursor,
757 uint64_t Offset, DeclContext *DC);
758
759 enum class VisibleDeclContextStorageKind {
760 GenerallyVisible,
761 ModuleLocalVisible,
762 TULocalVisible,
763 };
764
765 /// Read the record that describes the visible contents of a DC.
766 bool ReadVisibleDeclContextStorage(ModuleFile &M,
767 llvm::BitstreamCursor &Cursor,
768 uint64_t Offset, GlobalDeclID ID,
769 VisibleDeclContextStorageKind VisibleKind);
770
771 bool ReadSpecializations(ModuleFile &M, llvm::BitstreamCursor &Cursor,
772 uint64_t Offset, Decl *D, bool IsPartial);
773 void AddSpecializations(const Decl *D, const unsigned char *Data,
774 ModuleFile &M, bool IsPartial);
775
776 /// A vector containing identifiers that have already been
777 /// loaded.
778 ///
779 /// If the pointer at index I is non-NULL, then it refers to the
780 /// IdentifierInfo for the identifier with ID=I+1 that has already
781 /// been loaded.
782 std::vector<IdentifierInfo *> IdentifiersLoaded;
783
784 /// A vector containing macros that have already been
785 /// loaded.
786 ///
787 /// If the pointer at index I is non-NULL, then it refers to the
788 /// MacroInfo for the identifier with ID=I+1 that has already
789 /// been loaded.
790 std::vector<MacroInfo *> MacrosLoaded;
791
792 using LoadedMacroInfo =
793 std::pair<IdentifierInfo *, serialization::SubmoduleID>;
794
795 /// A set of #undef directives that we have loaded; used to
796 /// deduplicate the same #undef information coming from multiple module
797 /// files.
798 llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
799
800 /// A vector containing submodules that have already been loaded.
801 ///
802 /// This vector is indexed by the Submodule ID (-1). NULL submodule entries
803 /// indicate that the particular submodule ID has not yet been loaded.
804 SmallVector<Module *, 2> SubmodulesLoaded;
805
806 using GlobalSubmoduleMapType =
807 ContinuousRangeMap<serialization::SubmoduleID, ModuleFile *, 4>;
808
809 /// Mapping from global submodule IDs to the module file in which the
810 /// submodule resides along with the offset that should be added to the
811 /// global submodule ID to produce a local ID.
812 GlobalSubmoduleMapType GlobalSubmoduleMap;
813
814 /// A set of hidden declarations.
815 using HiddenNames = SmallVector<Decl *, 2>;
816 using HiddenNamesMapType = llvm::DenseMap<Module *, HiddenNames>;
817
818 /// A mapping from each of the hidden submodules to the deserialized
819 /// declarations in that submodule that could be made visible.
820 HiddenNamesMapType HiddenNamesMap;
821
822 /// A module import, export, or conflict that hasn't yet been resolved.
823 struct UnresolvedModuleRef {
824 /// The file in which this module resides.
825 ModuleFile *File;
826
827 /// The module that is importing or exporting.
828 Module *Mod;
829
830 /// The kind of module reference.
831 enum { Import, Export, Conflict, Affecting } Kind;
832
833 /// The local ID of the module that is being exported.
834 unsigned ID;
835
836 /// Whether this is a wildcard export.
837 LLVM_PREFERRED_TYPE(bool)
838 unsigned IsWildcard : 1;
839
840 /// String data.
841 StringRef String;
842 };
843
844 /// The set of module imports and exports that still need to be
845 /// resolved.
846 SmallVector<UnresolvedModuleRef, 2> UnresolvedModuleRefs;
847
848 /// A vector containing selectors that have already been loaded.
849 ///
850 /// This vector is indexed by the Selector ID (-1). NULL selector
851 /// entries indicate that the particular selector ID has not yet
852 /// been loaded.
853 SmallVector<Selector, 16> SelectorsLoaded;
854
855 using GlobalSelectorMapType =
856 ContinuousRangeMap<serialization::SelectorID, ModuleFile *, 4>;
857
858 /// Mapping from global selector IDs to the module in which the
859 /// global selector ID to produce a local ID.
860 GlobalSelectorMapType GlobalSelectorMap;
861
862 /// The generation number of the last time we loaded data from the
863 /// global method pool for this selector.
864 llvm::DenseMap<Selector, unsigned> SelectorGeneration;
865
866 /// Whether a selector is out of date. We mark a selector as out of date
867 /// if we load another module after the method pool entry was pulled in.
868 llvm::DenseMap<Selector, bool> SelectorOutOfDate;
869
870 struct PendingMacroInfo {
871 ModuleFile *M;
872 /// Offset relative to ModuleFile::MacroOffsetsBase.
873 uint32_t MacroDirectivesOffset;
874
875 PendingMacroInfo(ModuleFile *M, uint32_t MacroDirectivesOffset)
876 : M(M), MacroDirectivesOffset(MacroDirectivesOffset) {}
877 };
878
879 using PendingMacroIDsMap =
880 llvm::MapVector<IdentifierInfo *, SmallVector<PendingMacroInfo, 2>>;
881
882 /// Mapping from identifiers that have a macro history to the global
883 /// IDs have not yet been deserialized to the global IDs of those macros.
884 PendingMacroIDsMap PendingMacroIDs;
885
886 using GlobalPreprocessedEntityMapType =
887 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
888
889 /// Mapping from global preprocessing entity IDs to the module in
890 /// which the preprocessed entity resides along with the offset that should be
891 /// added to the global preprocessing entity ID to produce a local ID.
892 GlobalPreprocessedEntityMapType GlobalPreprocessedEntityMap;
893
894 using GlobalSkippedRangeMapType =
895 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
896
897 /// Mapping from global skipped range base IDs to the module in which
898 /// the skipped ranges reside.
899 GlobalSkippedRangeMapType GlobalSkippedRangeMap;
900
901 /// \name CodeGen-relevant special data
902 /// Fields containing data that is relevant to CodeGen.
903 //@{
904
905 /// The IDs of all declarations that fulfill the criteria of
906 /// "interesting" decls.
907 ///
908 /// This contains the data loaded from all EAGERLY_DESERIALIZED_DECLS blocks
909 /// in the chain. The referenced declarations are deserialized and passed to
910 /// the consumer eagerly.
911 SmallVector<GlobalDeclID, 16> EagerlyDeserializedDecls;
912
913 /// The IDs of all vtables to emit. The referenced declarations are passed
914 /// to the consumers' HandleVTable eagerly after passing
915 /// EagerlyDeserializedDecls.
916 SmallVector<GlobalDeclID, 16> VTablesToEmit;
917
918 /// The IDs of all tentative definitions stored in the chain.
919 ///
920 /// Sema keeps track of all tentative definitions in a TU because it has to
921 /// complete them and pass them on to CodeGen. Thus, tentative definitions in
922 /// the PCH chain must be eagerly deserialized.
923 SmallVector<GlobalDeclID, 16> TentativeDefinitions;
924
925 /// The IDs of all CXXRecordDecls stored in the chain whose VTables are
926 /// used.
927 ///
928 /// CodeGen has to emit VTables for these records, so they have to be eagerly
929 /// deserialized.
930 struct VTableUse {
931 GlobalDeclID ID;
933 bool Used;
934 };
935 SmallVector<VTableUse> VTableUses;
936
937 /// A snapshot of the pending instantiations in the chain.
938 ///
939 /// This record tracks the instantiations that Sema has to perform at the
940 /// end of the TU. It consists of a pair of values for every pending
941 /// instantiation where the first value is the ID of the decl and the second
942 /// is the instantiation location.
943 struct PendingInstantiation {
944 GlobalDeclID ID;
946 };
947 SmallVector<PendingInstantiation, 64> PendingInstantiations;
948
949 //@}
950
951 /// \name DiagnosticsEngine-relevant special data
952 /// Fields containing data that is used for generating diagnostics
953 //@{
954
955 /// A snapshot of Sema's unused file-scoped variable tracking, for
956 /// generating warnings.
957 SmallVector<GlobalDeclID, 16> UnusedFileScopedDecls;
958
959 /// A list of all the delegating constructors we've seen, to diagnose
960 /// cycles.
961 SmallVector<GlobalDeclID, 4> DelegatingCtorDecls;
962
963 /// Method selectors used in a @selector expression. Used for
964 /// implementation of -Wselector.
965 SmallVector<serialization::SelectorID, 64> ReferencedSelectorsData;
966
967 /// A snapshot of Sema's weak undeclared identifier tracking, for
968 /// generating warnings.
969 SmallVector<serialization::IdentifierID, 64> WeakUndeclaredIdentifiers;
970
971 /// The IDs of type aliases for ext_vectors that exist in the chain.
972 ///
973 /// Used by Sema for finding sugared names for ext_vectors in diagnostics.
974 SmallVector<GlobalDeclID, 4> ExtVectorDecls;
975
976 //@}
977
978 /// \name Sema-relevant special data
979 /// Fields containing data that is used for semantic analysis
980 //@{
981
982 /// The IDs of all potentially unused typedef names in the chain.
983 ///
984 /// Sema tracks these to emit warnings.
985 SmallVector<GlobalDeclID, 16> UnusedLocalTypedefNameCandidates;
986
987 /// Our current depth in #pragma cuda force_host_device begin/end
988 /// macros.
989 unsigned ForceHostDeviceDepth = 0;
990
991 /// The IDs of the declarations Sema stores directly.
992 ///
993 /// Sema tracks a few important decls, such as namespace std, directly.
994 SmallVector<GlobalDeclID, 4> SemaDeclRefs;
995
996 /// The IDs of the types ASTContext stores directly.
997 ///
998 /// The AST context tracks a few important types, such as va_list, directly.
999 SmallVector<serialization::TypeID, 16> SpecialTypes;
1000
1001 /// The IDs of CUDA-specific declarations ASTContext stores directly.
1002 ///
1003 /// The AST context tracks a few important decls, currently cudaConfigureCall,
1004 /// directly.
1005 SmallVector<GlobalDeclID, 4> CUDASpecialDeclRefs;
1006
1007 /// The floating point pragma option settings.
1008 SmallVector<uint64_t, 1> FPPragmaOptions;
1009
1010 /// The pragma clang optimize location (if the pragma state is "off").
1011 SourceLocation OptimizeOffPragmaLocation;
1012
1013 /// The PragmaMSStructKind pragma ms_struct state if set, or -1.
1014 int PragmaMSStructState = -1;
1015
1016 /// The PragmaMSPointersToMembersKind pragma pointers_to_members state.
1017 int PragmaMSPointersToMembersState = -1;
1018 SourceLocation PointersToMembersPragmaLocation;
1019
1020 /// The pragma float_control state.
1021 std::optional<FPOptionsOverride> FpPragmaCurrentValue;
1022 SourceLocation FpPragmaCurrentLocation;
1023 struct FpPragmaStackEntry {
1024 FPOptionsOverride Value;
1025 SourceLocation Location;
1026 SourceLocation PushLocation;
1027 StringRef SlotLabel;
1028 };
1029 llvm::SmallVector<FpPragmaStackEntry, 2> FpPragmaStack;
1030 llvm::SmallVector<std::string, 2> FpPragmaStrings;
1031
1032 /// The pragma align/pack state.
1033 std::optional<Sema::AlignPackInfo> PragmaAlignPackCurrentValue;
1034 SourceLocation PragmaAlignPackCurrentLocation;
1035 struct PragmaAlignPackStackEntry {
1036 Sema::AlignPackInfo Value;
1037 SourceLocation Location;
1038 SourceLocation PushLocation;
1039 StringRef SlotLabel;
1040 };
1041 llvm::SmallVector<PragmaAlignPackStackEntry, 2> PragmaAlignPackStack;
1042 llvm::SmallVector<std::string, 2> PragmaAlignPackStrings;
1043
1044 /// The OpenCL extension settings.
1045 OpenCLOptions OpenCLExtensions;
1046
1047 /// Extensions required by an OpenCL type.
1048 llvm::DenseMap<const Type *, std::set<std::string>> OpenCLTypeExtMap;
1049
1050 /// Extensions required by an OpenCL declaration.
1051 llvm::DenseMap<const Decl *, std::set<std::string>> OpenCLDeclExtMap;
1052
1053 /// A list of the namespaces we've seen.
1054 SmallVector<GlobalDeclID, 4> KnownNamespaces;
1055
1056 /// A list of undefined decls with internal linkage followed by the
1057 /// SourceLocation of a matching ODR-use.
1058 struct UndefinedButUsedDecl {
1059 GlobalDeclID ID;
1061 };
1062 SmallVector<UndefinedButUsedDecl, 8> UndefinedButUsed;
1063
1064 /// Delete expressions to analyze at the end of translation unit.
1065 SmallVector<uint64_t, 8> DelayedDeleteExprs;
1066
1067 // A list of late parsed template function data with their module files.
1068 SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
1069 LateParsedTemplates;
1070
1071 /// The IDs of all decls to be checked for deferred diags.
1072 ///
1073 /// Sema tracks these to emit deferred diags.
1074 llvm::SmallSetVector<GlobalDeclID, 4> DeclsToCheckForDeferredDiags;
1075
1076 /// The IDs of all decls with function effects to be checked.
1077 SmallVector<GlobalDeclID> DeclsWithEffectsToVerify;
1078
1079 /// The RISC-V intrinsic pragma(including RVV, SiFive and Andes).
1080 SmallVector<bool, 3> RISCVVecIntrinsicPragma;
1081
1082private:
1083 struct ImportedSubmodule {
1085 SourceLocation ImportLoc;
1086
1087 ImportedSubmodule(serialization::SubmoduleID ID, SourceLocation ImportLoc)
1088 : ID(ID), ImportLoc(ImportLoc) {}
1089 };
1090
1091 /// A list of modules that were imported by precompiled headers or
1092 /// any other non-module AST file and have not yet been made visible. If a
1093 /// module is made visible in the ASTReader, it will be transfered to
1094 /// \c PendingImportedModulesSema.
1095 SmallVector<ImportedSubmodule, 2> PendingImportedModules;
1096
1097 /// A list of modules that were imported by precompiled headers or
1098 /// any other non-module AST file and have not yet been made visible for Sema.
1099 SmallVector<ImportedSubmodule, 2> PendingImportedModulesSema;
1100 //@}
1101
1102 /// The system include root to be used when loading the
1103 /// precompiled header.
1104 std::string isysroot;
1105
1106 /// Whether to disable the normal validation performed on precompiled
1107 /// headers and module files when they are loaded.
1108 DisableValidationForModuleKind DisableValidationKind;
1109
1110 /// Whether to accept an AST file with compiler errors.
1111 bool AllowASTWithCompilerErrors;
1112
1113 /// Whether to accept an AST file that has a different configuration
1114 /// from the current compiler instance.
1115 bool AllowConfigurationMismatch;
1116
1117 /// Whether to validate system input files.
1118 bool ValidateSystemInputs;
1119
1120 /// Whether to force the validation of user input files.
1121 bool ForceValidateUserInputs;
1122
1123 /// Whether validate headers and module maps using hash based on contents.
1124 bool ValidateASTInputFilesContent;
1125
1126 /// Whether we are allowed to use the global module index.
1127 bool UseGlobalIndex;
1128
1129 /// Whether we have tried loading the global module index yet.
1130 bool TriedLoadingGlobalIndex = false;
1131
1132 ///Whether we are currently processing update records.
1133 bool ProcessingUpdateRecords = false;
1134
1135 using SwitchCaseMapTy = llvm::DenseMap<unsigned, SwitchCase *>;
1136
1137 /// Mapping from switch-case IDs in the chain to switch-case statements
1138 ///
1139 /// Statements usually don't have IDs, but switch cases need them, so that the
1140 /// switch statement can refer to them.
1141 SwitchCaseMapTy SwitchCaseStmts;
1142
1143 SwitchCaseMapTy *CurrSwitchCaseStmts;
1144
1145 /// The number of source location entries de-serialized from
1146 /// the PCH file.
1147 unsigned NumSLocEntriesRead = 0;
1148
1149 /// The number of source location entries in the chain.
1150 unsigned TotalNumSLocEntries = 0;
1151
1152 /// The number of statements (and expressions) de-serialized
1153 /// from the chain.
1154 unsigned NumStatementsRead = 0;
1155
1156 /// The total number of statements (and expressions) stored
1157 /// in the chain.
1158 unsigned TotalNumStatements = 0;
1159
1160 /// The number of macros de-serialized from the chain.
1161 unsigned NumMacrosRead = 0;
1162
1163 /// The total number of macros stored in the chain.
1164 unsigned TotalNumMacros = 0;
1165
1166 /// The number of lookups into identifier tables.
1167 unsigned NumIdentifierLookups = 0;
1168
1169 /// The number of lookups into identifier tables that succeed.
1170 unsigned NumIdentifierLookupHits = 0;
1171
1172 /// The number of selectors that have been read.
1173 unsigned NumSelectorsRead = 0;
1174
1175 /// The number of method pool entries that have been read.
1176 unsigned NumMethodPoolEntriesRead = 0;
1177
1178 /// The number of times we have looked up a selector in the method
1179 /// pool.
1180 unsigned NumMethodPoolLookups = 0;
1181
1182 /// The number of times we have looked up a selector in the method
1183 /// pool and found something.
1184 unsigned NumMethodPoolHits = 0;
1185
1186 /// The number of times we have looked up a selector in the method
1187 /// pool within a specific module.
1188 unsigned NumMethodPoolTableLookups = 0;
1189
1190 /// The number of times we have looked up a selector in the method
1191 /// pool within a specific module and found something.
1192 unsigned NumMethodPoolTableHits = 0;
1193
1194 /// The total number of method pool entries in the selector table.
1195 unsigned TotalNumMethodPoolEntries = 0;
1196
1197 /// Number of lexical decl contexts read/total.
1198 unsigned NumLexicalDeclContextsRead = 0, TotalLexicalDeclContexts = 0;
1199
1200 /// Number of visible decl contexts read/total.
1201 unsigned NumVisibleDeclContextsRead = 0, TotalVisibleDeclContexts = 0;
1202
1203 /// Number of module local visible decl contexts read/total.
1204 unsigned NumModuleLocalVisibleDeclContexts = 0,
1205 TotalModuleLocalVisibleDeclContexts = 0;
1206
1207 /// Number of TU Local decl contexts read/total
1208 unsigned NumTULocalVisibleDeclContexts = 0,
1209 TotalTULocalVisibleDeclContexts = 0;
1210
1211 /// Total size of modules, in bits, currently loaded
1212 uint64_t TotalModulesSizeInBits = 0;
1213
1214 /// Number of Decl/types that are currently deserializing.
1215 unsigned NumCurrentElementsDeserializing = 0;
1216
1217 /// Set false while we are in a state where we cannot safely pass deserialized
1218 /// "interesting" decls to the consumer inside FinishedDeserializing().
1219 /// This is used as a guard to avoid recursively entering the process of
1220 /// passing decls to consumer.
1221 bool CanPassDeclsToConsumer = true;
1222
1223 /// The set of identifiers that were read while the AST reader was
1224 /// (recursively) loading declarations.
1225 ///
1226 /// The declarations on the identifier chain for these identifiers will be
1227 /// loaded once the recursive loading has completed.
1228 llvm::MapVector<IdentifierInfo *, SmallVector<GlobalDeclID, 4>>
1229 PendingIdentifierInfos;
1230
1231 /// The set of lookup results that we have faked in order to support
1232 /// merging of partially deserialized decls but that we have not yet removed.
1233 llvm::SmallMapVector<const IdentifierInfo *, SmallVector<NamedDecl *, 2>, 16>
1234 PendingFakeLookupResults;
1235
1236 /// The generation number of each identifier, which keeps track of
1237 /// the last time we loaded information about this identifier.
1238 llvm::DenseMap<const IdentifierInfo *, unsigned> IdentifierGeneration;
1239
1240 /// Contains declarations and definitions that could be
1241 /// "interesting" to the ASTConsumer, when we get that AST consumer.
1242 ///
1243 /// "Interesting" declarations are those that have data that may
1244 /// need to be emitted, such as inline function definitions or
1245 /// Objective-C protocols.
1246 std::deque<Decl *> PotentiallyInterestingDecls;
1247
1248 /// The list of deduced function types that we have not yet read, because
1249 /// they might contain a deduced return type that refers to a local type
1250 /// declared within the function.
1251 SmallVector<std::pair<FunctionDecl *, serialization::TypeID>, 16>
1252 PendingDeducedFunctionTypes;
1253
1254 /// The list of deduced variable types that we have not yet read, because
1255 /// they might contain a deduced type that refers to a local type declared
1256 /// within the variable.
1257 SmallVector<std::pair<VarDecl *, serialization::TypeID>, 16>
1258 PendingDeducedVarTypes;
1259
1260 /// The list of redeclaration chains that still need to be
1261 /// reconstructed, and the local offset to the corresponding list
1262 /// of redeclarations.
1263 SmallVector<std::pair<Decl *, uint64_t>, 16> PendingDeclChains;
1264
1265 /// The list of canonical declarations whose redeclaration chains
1266 /// need to be marked as incomplete once we're done deserializing things.
1267 SmallVector<Decl *, 16> PendingIncompleteDeclChains;
1268
1269 /// The Decl IDs for the Sema/Lexical DeclContext of a Decl that has
1270 /// been loaded but its DeclContext was not set yet.
1271 struct PendingDeclContextInfo {
1272 Decl *D;
1273 GlobalDeclID SemaDC;
1274 GlobalDeclID LexicalDC;
1275 };
1276
1277 /// The set of Decls that have been loaded but their DeclContexts are
1278 /// not set yet.
1279 ///
1280 /// The DeclContexts for these Decls will be set once recursive loading has
1281 /// been completed.
1282 std::deque<PendingDeclContextInfo> PendingDeclContextInfos;
1283
1284 template <typename DeclTy>
1285 using DuplicateObjCDecls = std::pair<DeclTy *, DeclTy *>;
1286
1287 /// When resolving duplicate ivars from Objective-C extensions we don't error
1288 /// out immediately but check if can merge identical extensions. Not checking
1289 /// extensions for equality immediately because ivar deserialization isn't
1290 /// over yet at that point.
1291 llvm::SmallMapVector<DuplicateObjCDecls<ObjCCategoryDecl>,
1292 llvm::SmallVector<DuplicateObjCDecls<ObjCIvarDecl>, 4>,
1293 2>
1294 PendingObjCExtensionIvarRedeclarations;
1295
1296 /// Members that have been added to classes, for which the class has not yet
1297 /// been notified. CXXRecordDecl::addedMember will be called for each of
1298 /// these once recursive deserialization is complete.
1299 SmallVector<std::pair<CXXRecordDecl*, Decl*>, 4> PendingAddedClassMembers;
1300
1301 /// The set of NamedDecls that have been loaded, but are members of a
1302 /// context that has been merged into another context where the corresponding
1303 /// declaration is either missing or has not yet been loaded.
1304 ///
1305 /// We will check whether the corresponding declaration is in fact missing
1306 /// once recursing loading has been completed.
1307 llvm::SmallVector<NamedDecl *, 16> PendingOdrMergeChecks;
1308
1309 using DataPointers =
1310 std::pair<CXXRecordDecl *, struct CXXRecordDecl::DefinitionData *>;
1311 using ObjCInterfaceDataPointers =
1312 std::pair<ObjCInterfaceDecl *,
1313 struct ObjCInterfaceDecl::DefinitionData *>;
1314 using ObjCProtocolDataPointers =
1315 std::pair<ObjCProtocolDecl *, struct ObjCProtocolDecl::DefinitionData *>;
1316
1317 /// Record definitions in which we found an ODR violation.
1318 llvm::SmallDenseMap<CXXRecordDecl *, llvm::SmallVector<DataPointers, 2>, 2>
1319 PendingOdrMergeFailures;
1320
1321 /// C/ObjC record definitions in which we found an ODR violation.
1322 llvm::SmallDenseMap<RecordDecl *, llvm::SmallVector<RecordDecl *, 2>, 2>
1323 PendingRecordOdrMergeFailures;
1324
1325 /// Function definitions in which we found an ODR violation.
1326 llvm::SmallDenseMap<FunctionDecl *, llvm::SmallVector<FunctionDecl *, 2>, 2>
1327 PendingFunctionOdrMergeFailures;
1328
1329 /// Enum definitions in which we found an ODR violation.
1330 llvm::SmallDenseMap<EnumDecl *, llvm::SmallVector<EnumDecl *, 2>, 2>
1331 PendingEnumOdrMergeFailures;
1332
1333 /// ObjCInterfaceDecl in which we found an ODR violation.
1334 llvm::SmallDenseMap<ObjCInterfaceDecl *,
1335 llvm::SmallVector<ObjCInterfaceDataPointers, 2>, 2>
1336 PendingObjCInterfaceOdrMergeFailures;
1337
1338 /// ObjCProtocolDecl in which we found an ODR violation.
1339 llvm::SmallDenseMap<ObjCProtocolDecl *,
1340 llvm::SmallVector<ObjCProtocolDataPointers, 2>, 2>
1341 PendingObjCProtocolOdrMergeFailures;
1342
1343 /// DeclContexts in which we have diagnosed an ODR violation.
1344 llvm::SmallPtrSet<DeclContext*, 2> DiagnosedOdrMergeFailures;
1345
1346 /// The set of Objective-C categories that have been deserialized
1347 /// since the last time the declaration chains were linked.
1348 llvm::SmallPtrSet<ObjCCategoryDecl *, 16> CategoriesDeserialized;
1349
1350 /// The set of Objective-C class definitions that have already been
1351 /// loaded, for which we will need to check for categories whenever a new
1352 /// module is loaded.
1353 SmallVector<ObjCInterfaceDecl *, 16> ObjCClassesLoaded;
1354
1355 using KeyDeclsMap = llvm::DenseMap<Decl *, SmallVector<GlobalDeclID, 2>>;
1356
1357 /// A mapping from canonical declarations to the set of global
1358 /// declaration IDs for key declaration that have been merged with that
1359 /// canonical declaration. A key declaration is a formerly-canonical
1360 /// declaration whose module did not import any other key declaration for that
1361 /// entity. These are the IDs that we use as keys when finding redecl chains.
1362 KeyDeclsMap KeyDecls;
1363
1364 /// A mapping from DeclContexts to the semantic DeclContext that we
1365 /// are treating as the definition of the entity. This is used, for instance,
1366 /// when merging implicit instantiations of class templates across modules.
1367 llvm::DenseMap<DeclContext *, DeclContext *> MergedDeclContexts;
1368
1369 /// A mapping from canonical declarations of enums to their canonical
1370 /// definitions. Only populated when using modules in C++.
1371 llvm::DenseMap<EnumDecl *, EnumDecl *> EnumDefinitions;
1372
1373 /// A mapping from canonical declarations of records to their canonical
1374 /// definitions. Doesn't cover CXXRecordDecl.
1375 llvm::DenseMap<RecordDecl *, RecordDecl *> RecordDefinitions;
1376
1377 /// When reading a Stmt tree, Stmt operands are placed in this stack.
1378 SmallVector<Stmt *, 16> StmtStack;
1379
1380 /// What kind of records we are reading.
1381 enum ReadingKind {
1382 Read_None, Read_Decl, Read_Type, Read_Stmt
1383 };
1384
1385 /// What kind of records we are reading.
1386 ReadingKind ReadingKind = Read_None;
1387
1388 /// RAII object to change the reading kind.
1389 class ReadingKindTracker {
1390 ASTReader &Reader;
1391 enum ReadingKind PrevKind;
1392
1393 public:
1394 ReadingKindTracker(enum ReadingKind newKind, ASTReader &reader)
1395 : Reader(reader), PrevKind(Reader.ReadingKind) {
1396 Reader.ReadingKind = newKind;
1397 }
1398
1399 ReadingKindTracker(const ReadingKindTracker &) = delete;
1400 ReadingKindTracker &operator=(const ReadingKindTracker &) = delete;
1401 ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; }
1402 };
1403
1404 /// RAII object to mark the start of processing updates.
1405 class ProcessingUpdatesRAIIObj {
1406 ASTReader &Reader;
1407 bool PrevState;
1408
1409 public:
1410 ProcessingUpdatesRAIIObj(ASTReader &reader)
1411 : Reader(reader), PrevState(Reader.ProcessingUpdateRecords) {
1412 Reader.ProcessingUpdateRecords = true;
1413 }
1414
1415 ProcessingUpdatesRAIIObj(const ProcessingUpdatesRAIIObj &) = delete;
1416 ProcessingUpdatesRAIIObj &
1417 operator=(const ProcessingUpdatesRAIIObj &) = delete;
1418 ~ProcessingUpdatesRAIIObj() { Reader.ProcessingUpdateRecords = PrevState; }
1419 };
1420
1421 /// Suggested contents of the predefines buffer, after this
1422 /// PCH file has been processed.
1423 ///
1424 /// In most cases, this string will be empty, because the predefines
1425 /// buffer computed to build the PCH file will be identical to the
1426 /// predefines buffer computed from the command line. However, when
1427 /// there are differences that the PCH reader can work around, this
1428 /// predefines buffer may contain additional definitions.
1429 std::string SuggestedPredefines;
1430
1431 llvm::DenseMap<const Decl *, bool> DefinitionSource;
1432
1433 /// Friend functions that were defined but might have had their bodies
1434 /// removed.
1435 llvm::DenseSet<const FunctionDecl *> ThisDeclarationWasADefinitionSet;
1436
1437 bool shouldDisableValidationForFile(const serialization::ModuleFile &M) const;
1438
1439 /// Reads a statement from the specified cursor.
1440 Stmt *ReadStmtFromStream(ModuleFile &F);
1441
1442 /// Retrieve the stored information about an input file.
1443 serialization::InputFileInfo getInputFileInfo(ModuleFile &F, unsigned ID);
1444
1445 /// Retrieve the file entry and 'overridden' bit for an input
1446 /// file in the given module file.
1447 serialization::InputFile getInputFile(ModuleFile &F, unsigned ID,
1448 bool Complain = true);
1449
1450 /// The buffer used as the temporary backing storage for resolved paths.
1451 SmallString<0> PathBuf;
1452
1453 /// A wrapper around StringRef that temporarily borrows the underlying buffer.
1454 class TemporarilyOwnedStringRef {
1455 StringRef String;
1456 llvm::SaveAndRestore<SmallString<0>> UnderlyingBuffer;
1457
1458 public:
1459 TemporarilyOwnedStringRef(StringRef S, SmallString<0> &UnderlyingBuffer)
1460 : String(S), UnderlyingBuffer(UnderlyingBuffer, {}) {}
1461
1462 /// Return the wrapped \c StringRef that must be outlived by \c this.
1463 const StringRef *operator->() const & { return &String; }
1464 const StringRef &operator*() const & { return String; }
1465
1466 /// Make it harder to get a \c StringRef that outlives \c this.
1467 const StringRef *operator->() && = delete;
1468 const StringRef &operator*() && = delete;
1469 };
1470
1471public:
1472 /// Get the buffer for resolving paths.
1473 SmallString<0> &getPathBuf() { return PathBuf; }
1474
1475 /// Resolve \c Path in the context of module file \c M. The return value
1476 /// must go out of scope before the next call to \c ResolveImportedPath.
1477 static TemporarilyOwnedStringRef
1478 ResolveImportedPath(SmallString<0> &Buf, StringRef Path, ModuleFile &ModF);
1479 /// Resolve \c Path in the context of the \c Prefix directory. The return
1480 /// value must go out of scope before the next call to \c ResolveImportedPath.
1481 static TemporarilyOwnedStringRef
1482 ResolveImportedPath(SmallString<0> &Buf, StringRef Path, StringRef Prefix);
1483
1484 /// Resolve \c Path in the context of module file \c M.
1485 static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1486 StringRef Path,
1487 ModuleFile &ModF);
1488 /// Resolve \c Path in the context of the \c Prefix directory.
1489 static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1490 StringRef Path,
1491 StringRef Prefix);
1492
1493 /// Returns the first key declaration for the given declaration. This
1494 /// is one that is formerly-canonical (or still canonical) and whose module
1495 /// did not import any other key declaration of the entity.
1497 D = D->getCanonicalDecl();
1498 if (D->isFromASTFile())
1499 return D;
1500
1501 auto I = KeyDecls.find(D);
1502 if (I == KeyDecls.end() || I->second.empty())
1503 return D;
1504 return GetExistingDecl(I->second[0]);
1505 }
1506 const Decl *getKeyDeclaration(const Decl *D) {
1507 return getKeyDeclaration(const_cast<Decl*>(D));
1508 }
1509
1510 /// Run a callback on each imported key declaration of \p D.
1511 template <typename Fn>
1512 void forEachImportedKeyDecl(const Decl *D, Fn Visit) {
1513 D = D->getCanonicalDecl();
1514 if (D->isFromASTFile())
1515 Visit(D);
1516
1517 auto It = KeyDecls.find(const_cast<Decl*>(D));
1518 if (It != KeyDecls.end())
1519 for (auto ID : It->second)
1520 Visit(GetExistingDecl(ID));
1521 }
1522
1523 /// Get the loaded lookup tables for \p Primary, if any.
1525 getLoadedLookupTables(DeclContext *Primary) const;
1526
1529
1531 getTULocalLookupTables(DeclContext *Primary) const;
1532
1533 /// Get the loaded specializations lookup tables for \p D,
1534 /// if any.
1536 getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial);
1537
1538 /// If we have any unloaded specialization for \p D
1539 bool haveUnloadedSpecializations(const Decl *D) const;
1540
1551
1553 SourceLocation ImportLoc, ModuleFile *ImportedBy,
1555 off_t ExpectedSize, time_t ExpectedModTime,
1556 ASTFileSignature ExpectedSignature,
1557 unsigned ClientLoadCapabilities);
1558
1559private:
1560 ASTReadResult ReadControlBlock(ModuleFile &F,
1562 const ModuleFile *ImportedBy,
1563 unsigned ClientLoadCapabilities);
1564 static ASTReadResult
1565 ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef Filename,
1566 unsigned ClientLoadCapabilities,
1567 bool AllowCompatibleConfigurationMismatch,
1568 ASTReaderListener &Listener,
1569 std::string &SuggestedPredefines);
1570
1571 /// Read the unhashed control block.
1572 ///
1573 /// This has no effect on \c F.Stream, instead creating a fresh cursor from
1574 /// \c F.Data and reading ahead.
1575 ASTReadResult readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
1576 unsigned ClientLoadCapabilities);
1577
1578 static ASTReadResult readUnhashedControlBlockImpl(
1579 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
1580 unsigned ClientLoadCapabilities,
1581 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
1582 bool ValidateDiagnosticOptions);
1583
1584 llvm::Error ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities);
1585 llvm::Error ReadExtensionBlock(ModuleFile &F);
1586 void ReadModuleOffsetMap(ModuleFile &F) const;
1587 void ParseLineTable(ModuleFile &F, const RecordData &Record);
1588 llvm::Error ReadSourceManagerBlock(ModuleFile &F);
1589 SourceLocation getImportLocation(ModuleFile *F);
1590
1591 /// The first element is `std::nullopt` if relocation check should be skipped.
1592 /// Otherwise, the optional holds a pointer to the discovered module.
1593 /// The pointer can be `nullptr` if the discovery was unsuccessful.
1594 /// The second element determines whether to emit related errors.
1595 using RelocationResult = std::pair<std::optional<Module *>, bool>;
1596
1597 /// Determine whether a relocation check for a module should be performed
1598 /// by attempting to resolve the same module via lookup.
1599 /// If so, also determine whether to emit errors for the relocation.
1600 /// A relocated module is defined as a module that is either no longer
1601 /// resolvable from the modulemap or search path it originally compiled it's
1602 /// definition from.
1603 RelocationResult getModuleForRelocationChecks(ModuleFile &F,
1604 bool DirectoryCheck = false);
1605 ASTReadResult ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
1606 const ModuleFile *ImportedBy,
1607 unsigned ClientLoadCapabilities);
1608 llvm::Error ReadSubmoduleBlock(ModuleFile &F,
1609 unsigned ClientLoadCapabilities);
1610 static bool ParseLanguageOptions(const RecordData &Record,
1611 StringRef ModuleFilename, bool Complain,
1612 ASTReaderListener &Listener,
1613 bool AllowCompatibleDifferences);
1614 static bool ParseCodeGenOptions(const RecordData &Record,
1615 StringRef ModuleFilename, bool Complain,
1616 ASTReaderListener &Listener,
1617 bool AllowCompatibleDifferences);
1618 static bool ParseTargetOptions(const RecordData &Record,
1619 StringRef ModuleFilename, bool Complain,
1620 ASTReaderListener &Listener,
1621 bool AllowCompatibleDifferences);
1622 static bool ParseDiagnosticOptions(const RecordData &Record,
1623 StringRef ModuleFilename, bool Complain,
1624 ASTReaderListener &Listener);
1625 static bool ParseFileSystemOptions(const RecordData &Record, bool Complain,
1626 ASTReaderListener &Listener);
1627 static bool ParseHeaderSearchOptions(const RecordData &Record,
1628 StringRef ModuleFilename, bool Complain,
1629 ASTReaderListener &Listener);
1630 static bool ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
1631 ASTReaderListener &Listener);
1632 static bool ParsePreprocessorOptions(const RecordData &Record,
1633 StringRef ModuleFilename, bool Complain,
1634 ASTReaderListener &Listener,
1635 std::string &SuggestedPredefines);
1636
1637 struct RecordLocation {
1638 ModuleFile *F;
1639 uint64_t Offset;
1640
1641 RecordLocation(ModuleFile *M, uint64_t O) : F(M), Offset(O) {}
1642 };
1643
1644 QualType readTypeRecord(serialization::TypeID ID);
1645 RecordLocation TypeCursorForIndex(serialization::TypeID ID);
1646 void LoadedDecl(unsigned Index, Decl *D);
1647 Decl *ReadDeclRecord(GlobalDeclID ID);
1648 void markIncompleteDeclChain(Decl *D);
1649
1650 /// Returns the most recent declaration of a declaration (which must be
1651 /// of a redeclarable kind) that is either local or has already been loaded
1652 /// merged into its redecl chain.
1653 Decl *getMostRecentExistingDecl(Decl *D);
1654
1655 RecordLocation DeclCursorForID(GlobalDeclID ID, SourceLocation &Location);
1656 void loadDeclUpdateRecords(PendingUpdateRecord &Record);
1657 void loadPendingDeclChain(Decl *D, uint64_t LocalOffset);
1658 void loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
1659 unsigned PreviousGeneration = 0);
1660
1661 RecordLocation getLocalBitOffset(uint64_t GlobalOffset);
1662 uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset);
1663
1664 /// Returns the first preprocessed entity ID that begins or ends after
1665 /// \arg Loc.
1666 unsigned findPreprocessedEntity(SourceLocation Loc, bool EndsAfter) const;
1667
1668 /// Find the next module that contains entities and return the ID
1669 /// of the first entry.
1670 ///
1671 /// \param SLocMapI points at a chunk of a module that contains no
1672 /// preprocessed entities or the entities it contains are not the
1673 /// ones we are looking for.
1674 unsigned findNextPreprocessedEntity(
1676
1677 /// Returns (ModuleFile, Local index) pair for \p GlobalIndex of a
1678 /// preprocessed entity.
1679 std::pair<ModuleFile *, unsigned>
1680 getModulePreprocessedEntity(unsigned GlobalIndex);
1681
1682 /// Returns (begin, end) pair for the preprocessed entities of a
1683 /// particular module.
1684 llvm::iterator_range<PreprocessingRecord::iterator>
1685 getModulePreprocessedEntities(ModuleFile &Mod) const;
1686
1687 bool canRecoverFromOutOfDate(StringRef ModuleFileName,
1688 unsigned ClientLoadCapabilities);
1689
1690public:
1692 : public llvm::iterator_adaptor_base<
1693 ModuleDeclIterator, const serialization::unaligned_decl_id_t *,
1694 std::random_access_iterator_tag, const Decl *, ptrdiff_t,
1695 const Decl *, const Decl *> {
1696 ASTReader *Reader = nullptr;
1697 ModuleFile *Mod = nullptr;
1698
1699 public:
1700 ModuleDeclIterator() : iterator_adaptor_base(nullptr) {}
1701
1704 : iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
1705
1706 value_type operator*() const {
1707 LocalDeclID ID = LocalDeclID::get(*Reader, *Mod, *I);
1708 return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, ID));
1709 }
1710
1711 value_type operator->() const { return **this; }
1712
1713 bool operator==(const ModuleDeclIterator &RHS) const {
1714 assert(Reader == RHS.Reader && Mod == RHS.Mod);
1715 return I == RHS.I;
1716 }
1717 };
1718
1719 llvm::iterator_range<ModuleDeclIterator>
1721
1722private:
1723 bool isConsumerInterestedIn(Decl *D);
1724 void PassInterestingDeclsToConsumer();
1725 void PassInterestingDeclToConsumer(Decl *D);
1726 void PassVTableToConsumer(CXXRecordDecl *RD);
1727
1728 void finishPendingActions();
1729 void diagnoseOdrViolations();
1730
1731 void pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name);
1732
1733 void addPendingDeclContextInfo(Decl *D, GlobalDeclID SemaDC,
1734 GlobalDeclID LexicalDC) {
1735 assert(D);
1736 PendingDeclContextInfo Info = { D, SemaDC, LexicalDC };
1737 PendingDeclContextInfos.push_back(Info);
1738 }
1739
1740 /// Produce an error diagnostic and return true.
1741 ///
1742 /// This routine should only be used for fatal errors that have to
1743 /// do with non-routine failures (e.g., corrupted AST file).
1744 void Error(StringRef Msg) const;
1745 void Error(unsigned DiagID, StringRef Arg1 = StringRef(),
1746 StringRef Arg2 = StringRef(), StringRef Arg3 = StringRef()) const;
1747 void Error(llvm::Error &&Err) const;
1748
1749 /// Translate a \param GlobalDeclID to the index of DeclsLoaded array.
1750 unsigned translateGlobalDeclIDToIndex(GlobalDeclID ID) const;
1751
1752 /// Translate an \param IdentifierID ID to the index of IdentifiersLoaded
1753 /// array and the corresponding module file.
1754 std::pair<ModuleFile *, unsigned>
1755 translateIdentifierIDToIndex(serialization::IdentifierID ID) const;
1756
1757 /// Translate an \param MacroID ID to the index of MacrosLoaded
1758 /// array and the corresponding module file.
1759 std::pair<ModuleFile *, unsigned>
1760 translateMacroIDToIndex(serialization::MacroID ID) const;
1761
1762 unsigned translatePreprocessedEntityIDToIndex(
1764
1765 /// Translate an \param TypeID ID to the index of TypesLoaded
1766 /// array and the corresponding module file.
1767 std::pair<ModuleFile *, unsigned>
1768 translateTypeIDToIndex(serialization::TypeID ID) const;
1769
1770 /// Get a predefined Decl from ASTContext.
1771 Decl *getPredefinedDecl(PredefinedDeclIDs ID);
1772
1773public:
1774 /// Load the AST file and validate its contents against the given
1775 /// Preprocessor.
1776 ///
1777 /// \param PP the preprocessor associated with the context in which this
1778 /// precompiled header will be loaded.
1779 ///
1780 /// \param Context the AST context that this precompiled header will be
1781 /// loaded into, if any.
1782 ///
1783 /// \param PCHContainerRdr the PCHContainerOperations to use for loading and
1784 /// creating modules.
1785 ///
1786 /// \param Extensions the list of module file extensions that can be loaded
1787 /// from the AST files.
1788 ///
1789 /// \param isysroot If non-NULL, the system include path specified by the
1790 /// user. This is only used with relocatable PCH files. If non-NULL,
1791 /// a relocatable PCH file will use the default path "/".
1792 ///
1793 /// \param DisableValidationKind If set, the AST reader will suppress most
1794 /// of its regular consistency checking, allowing the use of precompiled
1795 /// headers and module files that cannot be determined to be compatible.
1796 ///
1797 /// \param AllowASTWithCompilerErrors If true, the AST reader will accept an
1798 /// AST file the was created out of an AST with compiler errors,
1799 /// otherwise it will reject it.
1800 ///
1801 /// \param AllowConfigurationMismatch If true, the AST reader will not check
1802 /// for configuration differences between the AST file and the invocation.
1803 ///
1804 /// \param ValidateSystemInputs If true, the AST reader will validate
1805 /// system input files in addition to user input files. This is only
1806 /// meaningful if \p DisableValidation is false.
1807 ///
1808 /// \param UseGlobalIndex If true, the AST reader will try to load and use
1809 /// the global module index.
1810 ///
1811 /// \param ReadTimer If non-null, a timer used to track the time spent
1812 /// deserializing.
1813 ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context,
1814 const PCHContainerReader &PCHContainerRdr,
1815 const CodeGenOptions &CodeGenOpts,
1816 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
1817 StringRef isysroot = "",
1818 DisableValidationForModuleKind DisableValidationKind =
1820 bool AllowASTWithCompilerErrors = false,
1821 bool AllowConfigurationMismatch = false,
1822 bool ValidateSystemInputs = false,
1823 bool ForceValidateUserInputs = true,
1824 bool ValidateASTInputFilesContent = false,
1825 bool UseGlobalIndex = true,
1826 std::unique_ptr<llvm::Timer> ReadTimer = {});
1827 ASTReader(const ASTReader &) = delete;
1828 ASTReader &operator=(const ASTReader &) = delete;
1829 ~ASTReader() override;
1830
1831 SourceManager &getSourceManager() const { return SourceMgr; }
1832 FileManager &getFileManager() const { return FileMgr; }
1833 DiagnosticsEngine &getDiags() const { return Diags; }
1834 const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
1835
1836 /// Flags that indicate what kind of AST loading failures the client
1837 /// of the AST reader can directly handle.
1838 ///
1839 /// When a client states that it can handle a particular kind of failure,
1840 /// the AST reader will not emit errors when producing that kind of failure.
1842 /// The client can't handle any AST loading failures.
1844
1845 /// The client can handle an AST file that cannot load because it
1846 /// is missing.
1848
1849 /// The client can handle an AST file that cannot load because it
1850 /// is out-of-date relative to its input files.
1852
1853 /// The client can handle an AST file that cannot load because it
1854 /// was built with a different version of Clang.
1856
1857 /// The client can handle an AST file that cannot load because it's
1858 /// compiled configuration doesn't match that of the context it was
1859 /// loaded into.
1861
1862 /// If a module file is marked with errors treat it as out-of-date so the
1863 /// caller can rebuild it.
1865 };
1866
1867 /// Load the AST file designated by the given file name.
1868 ///
1869 /// \param FileName The name of the AST file to load.
1870 ///
1871 /// \param Type The kind of AST being loaded, e.g., PCH, module, main file,
1872 /// or preamble.
1873 ///
1874 /// \param ImportLoc the location where the module file will be considered as
1875 /// imported from. For non-module AST types it should be invalid.
1876 ///
1877 /// \param ClientLoadCapabilities The set of client load-failure
1878 /// capabilities, represented as a bitset of the enumerators of
1879 /// LoadFailureCapabilities.
1880 ///
1881 /// \param LoadedModuleFile The optional out-parameter refers to the new
1882 /// loaded modules. In case the module specified by FileName is already
1883 /// loaded, the module file pointer referred by NewLoadedModuleFile wouldn't
1884 /// change. Otherwise if the AST file get loaded successfully,
1885 /// NewLoadedModuleFile would refer to the address of the new loaded top level
1886 /// module. The state of NewLoadedModuleFile is unspecified if the AST file
1887 /// isn't loaded successfully.
1889 SourceLocation ImportLoc,
1890 unsigned ClientLoadCapabilities,
1891 ModuleFile **NewLoadedModuleFile = nullptr);
1892
1893 /// Make the entities in the given module and any of its (non-explicit)
1894 /// submodules visible to name lookup.
1895 ///
1896 /// \param Mod The module whose names should be made visible.
1897 ///
1898 /// \param NameVisibility The level of visibility to give the names in the
1899 /// module. Visibility can only be increased over time.
1900 ///
1901 /// \param ImportLoc The location at which the import occurs.
1902 void makeModuleVisible(Module *Mod,
1903 Module::NameVisibilityKind NameVisibility,
1904 SourceLocation ImportLoc);
1905
1906 /// Make the names within this set of hidden names visible.
1907 void makeNamesVisible(const HiddenNames &Names, Module *Owner);
1908
1909 /// Note that MergedDef is a redefinition of the canonical definition
1910 /// Def, so Def should be visible whenever MergedDef is.
1911 void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef);
1912
1913 /// Take the AST callbacks listener.
1914 std::unique_ptr<ASTReaderListener> takeListener() {
1915 return std::move(Listener);
1916 }
1917
1918 /// Set the AST callbacks listener.
1919 void setListener(std::unique_ptr<ASTReaderListener> Listener) {
1920 this->Listener = std::move(Listener);
1921 }
1922
1923 /// Add an AST callback listener.
1924 ///
1925 /// Takes ownership of \p L.
1926 void addListener(std::unique_ptr<ASTReaderListener> L) {
1927 if (Listener)
1928 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1929 std::move(Listener));
1930 Listener = std::move(L);
1931 }
1932
1933 /// RAII object to temporarily add an AST callback listener.
1935 ASTReader &Reader;
1936 bool Chained = false;
1937
1938 public:
1939 ListenerScope(ASTReader &Reader, std::unique_ptr<ASTReaderListener> L)
1940 : Reader(Reader) {
1941 auto Old = Reader.takeListener();
1942 if (Old) {
1943 Chained = true;
1944 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1945 std::move(Old));
1946 }
1947 Reader.setListener(std::move(L));
1948 }
1949
1951 auto New = Reader.takeListener();
1952 if (Chained)
1953 Reader.setListener(static_cast<ChainedASTReaderListener *>(New.get())
1954 ->takeSecond());
1955 }
1956 };
1957
1958 /// Set the AST deserialization listener.
1960 bool TakeOwnership = false);
1961
1962 /// Get the AST deserialization listener.
1964 return DeserializationListener;
1965 }
1966
1967 /// Determine whether this AST reader has a global index.
1968 bool hasGlobalIndex() const { return (bool)GlobalIndex; }
1969
1970 /// Return global module index.
1971 GlobalModuleIndex *getGlobalIndex() { return GlobalIndex.get(); }
1972
1973 /// Reset reader for a reload try.
1974 void resetForReload() { TriedLoadingGlobalIndex = false; }
1975
1976 /// Attempts to load the global index.
1977 ///
1978 /// \returns true if loading the global index has failed for any reason.
1979 bool loadGlobalIndex();
1980
1981 /// Determine whether we tried to load the global index, but failed,
1982 /// e.g., because it is out-of-date or does not exist.
1983 bool isGlobalIndexUnavailable() const;
1984
1985 /// Initializes the ASTContext
1986 void InitializeContext();
1987
1988 /// Update the state of Sema after loading some additional modules.
1989 void UpdateSema();
1990
1991 /// Add in-memory (virtual file) buffer.
1993 std::unique_ptr<llvm::MemoryBuffer> Buffer) {
1994 ModuleMgr.addInMemoryBuffer(FileName, std::move(Buffer));
1995 }
1996
1997 /// Finalizes the AST reader's state before writing an AST file to
1998 /// disk.
1999 ///
2000 /// This operation may undo temporary state in the AST that should not be
2001 /// emitted.
2002 void finalizeForWriting();
2003
2004 /// Retrieve the module manager.
2005 ModuleManager &getModuleManager() { return ModuleMgr; }
2006 const ModuleManager &getModuleManager() const { return ModuleMgr; }
2007
2008 /// Retrieve the preprocessor.
2009 Preprocessor &getPreprocessor() const { return PP; }
2010
2011 /// Retrieve the name of the original source file name for the primary
2012 /// module file.
2014 return ModuleMgr.getPrimaryModule().OriginalSourceFileName;
2015 }
2016
2017 /// Retrieve the name of the original source file name directly from
2018 /// the AST file, without actually loading the AST file.
2019 static std::string
2020 getOriginalSourceFile(const std::string &ASTFileName, FileManager &FileMgr,
2021 const PCHContainerReader &PCHContainerRdr,
2022 DiagnosticsEngine &Diags);
2023
2024 /// Read the control block for the named AST file.
2025 ///
2026 /// \returns true if an error occurred, false otherwise.
2027 static bool readASTFileControlBlock(
2028 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
2029 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
2030 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
2031 unsigned ClientLoadCapabilities = ARR_ConfigurationMismatch |
2033
2034 /// Determine whether the given AST file is acceptable to load into a
2035 /// translation unit with the given language and target options.
2036 static bool isAcceptableASTFile(
2037 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
2038 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
2039 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
2040 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
2041 StringRef SpecificModuleCachePath,
2042 bool RequireStrictOptionMatches = false);
2043
2044 /// Returns the suggested contents of the predefines buffer,
2045 /// which contains a (typically-empty) subset of the predefines
2046 /// build prior to including the precompiled header.
2047 const std::string &getSuggestedPredefines() { return SuggestedPredefines; }
2048
2049 /// Read a preallocated preprocessed entity from the external source.
2050 ///
2051 /// \returns null if an error occurred that prevented the preprocessed
2052 /// entity from being loaded.
2053 PreprocessedEntity *ReadPreprocessedEntity(unsigned Index) override;
2054
2055 /// Returns a pair of [Begin, End) indices of preallocated
2056 /// preprocessed entities that \p Range encompasses.
2057 std::pair<unsigned, unsigned>
2059
2060 /// Optionally returns true or false if the preallocated preprocessed
2061 /// entity with index \p Index came from file \p FID.
2062 std::optional<bool> isPreprocessedEntityInFileID(unsigned Index,
2063 FileID FID) override;
2064
2065 /// Read a preallocated skipped range from the external source.
2066 SourceRange ReadSkippedRange(unsigned Index) override;
2067
2068 /// Read the header file information for the given file entry.
2070
2072
2073 /// Returns the number of source locations found in the chain.
2074 unsigned getTotalNumSLocs() const {
2075 return TotalNumSLocEntries;
2076 }
2077
2078 /// Returns the number of identifiers found in the chain.
2079 unsigned getTotalNumIdentifiers() const {
2080 return static_cast<unsigned>(IdentifiersLoaded.size());
2081 }
2082
2083 /// Returns the number of macros found in the chain.
2084 unsigned getTotalNumMacros() const {
2085 return static_cast<unsigned>(MacrosLoaded.size());
2086 }
2087
2088 /// Returns the number of types found in the chain.
2089 unsigned getTotalNumTypes() const {
2090 return static_cast<unsigned>(TypesLoaded.size());
2091 }
2092
2093 /// Returns the number of declarations found in the chain.
2094 unsigned getTotalNumDecls() const {
2095 return static_cast<unsigned>(DeclsLoaded.size());
2096 }
2097
2098 /// Returns the number of submodules known.
2099 unsigned getTotalNumSubmodules() const {
2100 return static_cast<unsigned>(SubmodulesLoaded.size());
2101 }
2102
2103 /// Returns the number of selectors found in the chain.
2104 unsigned getTotalNumSelectors() const {
2105 return static_cast<unsigned>(SelectorsLoaded.size());
2106 }
2107
2108 /// Returns the number of preprocessed entities known to the AST
2109 /// reader.
2111 unsigned Result = 0;
2112 for (const auto &M : ModuleMgr)
2113 Result += M.NumPreprocessedEntities;
2114 return Result;
2115 }
2116
2117 /// Resolve a type ID into a type, potentially building a new
2118 /// type.
2120
2121 /// Resolve a local type ID within a given AST file into a type.
2123
2124 /// Map a local type ID within a given AST file into a global type ID.
2127
2128 /// Read a type from the current position in the given record, which
2129 /// was read from the given AST file.
2130 QualType readType(ModuleFile &F, const RecordData &Record, unsigned &Idx) {
2131 if (Idx >= Record.size())
2132 return {};
2133
2134 return getLocalType(F, Record[Idx++]);
2135 }
2136
2137 /// Map from a local declaration ID within a given module to a
2138 /// global declaration ID.
2140
2141 /// Returns true if global DeclID \p ID originated from module \p M.
2142 bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const;
2143
2144 /// Retrieve the module file that owns the given declaration, or NULL
2145 /// if the declaration is not from a module file.
2146 ModuleFile *getOwningModuleFile(const Decl *D) const;
2148
2149 /// Returns the source location for the decl \p ID.
2151
2152 /// Resolve a declaration ID into a declaration, potentially
2153 /// building a new declaration.
2155 Decl *GetExternalDecl(GlobalDeclID ID) override;
2156
2157 /// Resolve a declaration ID into a declaration. Return 0 if it's not
2158 /// been loaded yet.
2160
2161 /// Reads a declaration with the given local ID in the given module.
2163 return GetDecl(getGlobalDeclID(F, LocalID));
2164 }
2165
2166 /// Reads a declaration with the given local ID in the given module.
2167 ///
2168 /// \returns The requested declaration, casted to the given return type.
2169 template <typename T> T *GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID) {
2170 return cast_or_null<T>(GetLocalDecl(F, LocalID));
2171 }
2172
2173 /// Map a global declaration ID into the declaration ID used to
2174 /// refer to this declaration within the given module fule.
2175 ///
2176 /// \returns the global ID of the given declaration as known in the given
2177 /// module file.
2179 GlobalDeclID GlobalID);
2180
2181 /// Reads a macro ID from the given position in a record in the
2182 /// given module.
2183 ///
2184 /// \returns The declaration ID read from the record, adjusted to a global
2185 /// Macro ID.
2187 ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx);
2188
2189 /// Reads a declaration ID from the given position in a record in the
2190 /// given module.
2191 ///
2192 /// \returns The declaration ID read from the record, adjusted to a global ID.
2194 unsigned &Idx);
2195
2196 /// Reads a declaration from the given position in a record in the
2197 /// given module.
2198 Decl *ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2199 return GetDecl(ReadDeclID(F, R, I));
2200 }
2201
2202 /// Reads a declaration from the given position in a record in the
2203 /// given module.
2204 ///
2205 /// \returns The declaration read from this location, casted to the given
2206 /// result type.
2207 template <typename T>
2208 T *ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2209 return cast_or_null<T>(GetDecl(ReadDeclID(F, R, I)));
2210 }
2211
2212 /// If any redeclarations of \p D have been imported since it was
2213 /// last checked, this digs out those redeclarations and adds them to the
2214 /// redeclaration chain for \p D.
2215 void CompleteRedeclChain(const Decl *D) override;
2216
2217 CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override;
2218
2219 /// Resolve the offset of a statement into a statement.
2220 ///
2221 /// This operation will read a new statement from the external
2222 /// source each time it is called, and is meant to be used via a
2223 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
2224 Stmt *GetExternalDeclStmt(uint64_t Offset) override;
2225
2226 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
2227 /// specified cursor. Read the abbreviations that are at the top of the block
2228 /// and then leave the cursor pointing into the block.
2229 static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
2230 unsigned BlockID,
2231 uint64_t *StartOfBlockOffset = nullptr);
2232
2233 bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override;
2234
2235 bool
2237 ArrayRef<TemplateArgument> TemplateArgs) override;
2238
2239 /// Finds all the visible declarations with a given name.
2240 /// The current implementation of this method just loads the entire
2241 /// lookup table as unmaterialized references.
2243 DeclarationName Name,
2244 const DeclContext *OriginalDC) override;
2245
2246 /// Read all of the declarations lexically stored in a
2247 /// declaration context.
2248 ///
2249 /// \param DC The declaration context whose declarations will be
2250 /// read.
2251 ///
2252 /// \param IsKindWeWant A predicate indicating which declaration kinds
2253 /// we are interested in.
2254 ///
2255 /// \param Decls Vector that will contain the declarations loaded
2256 /// from the external source. The caller is responsible for merging
2257 /// these declarations with any declarations already stored in the
2258 /// declaration context.
2259 void
2261 llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
2262 SmallVectorImpl<Decl *> &Decls) override;
2263
2264 /// Get the decls that are contained in a file in the Offset/Length
2265 /// range. \p Length can be 0 to indicate a point at \p Offset instead of
2266 /// a range.
2267 void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length,
2268 SmallVectorImpl<Decl *> &Decls) override;
2269
2270 /// Notify ASTReader that we started deserialization of
2271 /// a decl or type so until FinishedDeserializing is called there may be
2272 /// decls that are initializing. Must be paired with FinishedDeserializing.
2273 void StartedDeserializing() override;
2274
2275 /// Notify ASTReader that we finished the deserialization of
2276 /// a decl or type. Must be paired with StartedDeserializing.
2277 void FinishedDeserializing() override;
2278
2279 /// Function that will be invoked when we begin parsing a new
2280 /// translation unit involving this external AST source.
2281 ///
2282 /// This function will provide all of the external definitions to
2283 /// the ASTConsumer.
2284 void StartTranslationUnit(ASTConsumer *Consumer) override;
2285
2286 /// Print some statistics about AST usage.
2287 void PrintStats() override;
2288
2289 /// Dump information about the AST reader to standard error.
2290 void dump();
2291
2292 /// Return the amount of memory used by memory buffers, breaking down
2293 /// by heap-backed versus mmap'ed memory.
2294 void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override;
2295
2296 /// Initialize the semantic source with the Sema instance
2297 /// being used to perform semantic analysis on the abstract syntax
2298 /// tree.
2299 void InitializeSema(Sema &S) override;
2300
2301 /// Inform the semantic consumer that Sema is no longer available.
2302 void ForgetSema() override { SemaObj = nullptr; }
2303
2304 /// Retrieve the IdentifierInfo for the named identifier.
2305 ///
2306 /// This routine builds a new IdentifierInfo for the given identifier. If any
2307 /// declarations with this name are visible from translation unit scope, their
2308 /// declarations will be deserialized and introduced into the declaration
2309 /// chain of the identifier.
2310 IdentifierInfo *get(StringRef Name) override;
2311
2312 /// Retrieve an iterator into the set of all identifiers
2313 /// in all loaded AST files.
2315
2316 /// Load the contents of the global method pool for a given
2317 /// selector.
2318 void ReadMethodPool(Selector Sel) override;
2319
2320 /// Load the contents of the global method pool for a given
2321 /// selector if necessary.
2322 void updateOutOfDateSelector(Selector Sel) override;
2323
2324 /// Load the set of namespaces that are known to the external source,
2325 /// which will be used during typo correction.
2327 SmallVectorImpl<NamespaceDecl *> &Namespaces) override;
2328
2330 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) override;
2331
2332 void ReadMismatchingDeleteExpressions(llvm::MapVector<
2333 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
2334 Exprs) override;
2335
2337 SmallVectorImpl<VarDecl *> &TentativeDefs) override;
2338
2341
2344
2346
2349
2351 llvm::SmallSetVector<Decl *, 4> &Decls) override;
2352
2354 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) override;
2355
2357 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) override;
2358
2360
2362 SmallVectorImpl<std::pair<ValueDecl *,
2363 SourceLocation>> &Pending) override;
2364
2366 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
2367 &LPTMap) override;
2368
2369 void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override;
2370
2371 /// Load a selector from disk, registering its ID if it exists.
2372 void LoadSelector(Selector Sel);
2373
2376 const SmallVectorImpl<GlobalDeclID> &DeclIDs,
2377 SmallVectorImpl<Decl *> *Decls = nullptr);
2378
2379 /// Report a diagnostic.
2380 DiagnosticBuilder Diag(unsigned DiagID) const;
2381
2382 /// Report a diagnostic.
2383 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const;
2384
2386 llvm::function_ref<void()> Fn);
2387
2389
2391 unsigned &Idx) {
2393 }
2394
2396 // Note that we are loading an identifier.
2397 Deserializing AnIdentifier(this);
2398
2399 return DecodeIdentifierInfo(ID);
2400 }
2401
2402 IdentifierInfo *getLocalIdentifier(ModuleFile &M, uint64_t LocalID);
2403
2405 uint64_t LocalID);
2406
2407 void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo);
2408
2409 /// Retrieve the macro with the given ID.
2411
2412 /// Retrieve the global macro ID corresponding to the given local
2413 /// ID within the given module file.
2415 serialization::MacroID LocalID);
2416
2417 /// Read the source location entry with index ID.
2418 bool ReadSLocEntry(int ID) override;
2419 /// Get the index ID for the loaded SourceLocation offset.
2420 int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override;
2421 /// Try to read the offset of the SLocEntry at the given index in the given
2422 /// module file.
2424 unsigned Index);
2425
2426 /// Retrieve the module import location and module name for the
2427 /// given source manager entry ID.
2428 std::pair<SourceLocation, StringRef> getModuleImportLoc(int ID) override;
2429
2430 /// Retrieve the global submodule ID given a module and its local ID
2431 /// number.
2433 unsigned LocalID) const;
2434
2435 /// Retrieve the submodule that corresponds to a global submodule ID.
2436 ///
2438
2439 /// Retrieve the module that corresponds to the given module ID.
2440 ///
2441 /// Note: overrides method in ExternalASTSource
2442 Module *getModule(unsigned ID) override;
2443
2444 /// Retrieve the module file with a given local ID within the specified
2445 /// ModuleFile.
2446 ModuleFile *getLocalModuleFile(ModuleFile &M, unsigned ID) const;
2447
2448 /// Get an ID for the given module file.
2449 unsigned getModuleFileID(ModuleFile *M);
2450
2451 /// Return a descriptor for the corresponding module.
2452 std::optional<ASTSourceDescriptor> getSourceDescriptor(unsigned ID) override;
2453
2454 ExtKind hasExternalDefinitions(const Decl *D) override;
2455
2456 bool wasThisDeclarationADefinition(const FunctionDecl *FD) override;
2457
2458 /// Retrieve a selector from the given module with its local ID
2459 /// number.
2460 Selector getLocalSelector(ModuleFile &M, unsigned LocalID);
2461
2463
2465 uint32_t GetNumExternalSelectors() override;
2466
2467 Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx) {
2468 return getLocalSelector(M, Record[Idx++]);
2469 }
2470
2471 /// Retrieve the global selector ID that corresponds to this
2472 /// the local selector ID in a given module.
2474 unsigned LocalID) const;
2475
2476 /// Read the contents of a CXXCtorInitializer array.
2477 CXXCtorInitializer **GetExternalCXXCtorInitializers(uint64_t Offset) override;
2478
2479 /// Read a AlignPackInfo from raw form.
2483
2485
2486 /// Read a source location from raw form and return it in its
2487 /// originating module file's source location space.
2488 std::pair<SourceLocation, unsigned>
2492
2493 /// Read a source location from raw form.
2495 if (!MF.ModuleOffsetMap.empty())
2496 ReadModuleOffsetMap(MF);
2497
2498 auto [Loc, ModuleFileIndex] = ReadUntranslatedSourceLocation(Raw);
2499 ModuleFile *OwningModuleFile =
2500 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
2501
2502 assert(!SourceMgr.isLoadedSourceLocation(Loc) &&
2503 "Run out source location space");
2504
2505 return TranslateSourceLocation(*OwningModuleFile, Loc);
2506 }
2507
2508 /// Translate a source location from another module file's source
2509 /// location space into ours.
2511 SourceLocation Loc) const {
2512 if (Loc.isInvalid())
2513 return Loc;
2514
2515 // FIXME: TranslateSourceLocation is not re-enterable. It is problematic
2516 // to call TranslateSourceLocation on a translated source location.
2517 // We either need a method to know whether or not a source location is
2518 // translated or refactor the code to make it clear that
2519 // TranslateSourceLocation won't be called with translated source location.
2520
2521 return Loc.getLocWithOffset(ModuleFile.SLocEntryBaseOffset - 2);
2522 }
2523
2524 /// Read a source location.
2526 const RecordDataImpl &Record,
2527 unsigned &Idx) {
2528 return ReadSourceLocation(ModuleFile, Record[Idx++]);
2529 }
2530
2531 /// Read a FileID.
2533 unsigned &Idx) const {
2534 return TranslateFileID(F, FileID::get(Record[Idx++]));
2535 }
2536
2537 /// Translate a FileID from another module file's FileID space into ours.
2539 assert(FID.ID >= 0 && "Reading non-local FileID.");
2540 if (FID.isInvalid())
2541 return FID;
2542 return FileID::get(F.SLocEntryBaseID + FID.ID - 1);
2543 }
2544
2545 /// Read a source range.
2547 unsigned &Idx);
2548
2549 static llvm::BitVector ReadBitVector(const RecordData &Record,
2550 const StringRef Blob);
2551
2552 // Read a string
2553 static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx);
2554 static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
2555 StringRef &Blob);
2556
2557 // Read a path
2558 std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx);
2559
2560 // Read a path
2561 std::string ReadPath(StringRef BaseDirectory, const RecordData &Record,
2562 unsigned &Idx);
2563 std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record,
2564 unsigned &Idx, StringRef &Blob);
2565
2566 /// Read a version tuple.
2567 static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx);
2568
2570 unsigned &Idx);
2571
2572 /// Reads a statement.
2574
2575 /// Reads an expression.
2577
2578 /// Reads a sub-statement operand during statement reading.
2580 assert(ReadingKind == Read_Stmt &&
2581 "Should be called only during statement reading!");
2582 // Subexpressions are stored from last to first, so the next Stmt we need
2583 // is at the back of the stack.
2584 assert(!StmtStack.empty() && "Read too many sub-statements!");
2585 return StmtStack.pop_back_val();
2586 }
2587
2588 /// Reads a sub-expression operand during statement reading.
2589 Expr *ReadSubExpr();
2590
2591 /// Reads a token out of a record.
2592 Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx);
2593
2594 /// Reads the macro record located at the given offset.
2595 MacroInfo *ReadMacroRecord(ModuleFile &F, uint64_t Offset);
2596
2597 /// Determine the global preprocessed entity ID that corresponds to
2598 /// the given local ID within the given module.
2601
2602 /// Add a macro to deserialize its macro directive history.
2603 ///
2604 /// \param II The name of the macro.
2605 /// \param M The module file.
2606 /// \param MacroDirectivesOffset Offset of the serialized macro directive
2607 /// history.
2609 uint32_t MacroDirectivesOffset);
2610
2611 /// Read the set of macros defined by this external macro source.
2612 void ReadDefinedMacros() override;
2613
2614 /// Update an out-of-date identifier.
2615 void updateOutOfDateIdentifier(const IdentifierInfo &II) override;
2616
2617 /// Note that this identifier is up-to-date.
2618 void markIdentifierUpToDate(const IdentifierInfo *II);
2619
2620 /// Load all external visible decls in the given DeclContext.
2621 void completeVisibleDeclsMap(const DeclContext *DC) override;
2622
2623 /// Retrieve the AST context that this AST reader supplements.
2625 assert(ContextObj && "requested AST context when not loading AST");
2626 return *ContextObj;
2627 }
2628
2629 // Contains the IDs for declarations that were requested before we have
2630 // access to a Sema object.
2632
2633 /// Retrieve the semantic analysis object used to analyze the
2634 /// translation unit in which the precompiled header is being
2635 /// imported.
2636 Sema *getSema() { return SemaObj; }
2637
2638 /// Get the identifier resolver used for name lookup / updates
2639 /// in the translation unit scope. We have one of these even if we don't
2640 /// have a Sema object.
2642
2643 /// Retrieve the identifier table associated with the
2644 /// preprocessor.
2646
2647 /// Record that the given ID maps to the given switch-case
2648 /// statement.
2649 void RecordSwitchCaseID(SwitchCase *SC, unsigned ID);
2650
2651 /// Retrieve the switch-case statement with the given ID.
2652 SwitchCase *getSwitchCaseWithID(unsigned ID);
2653
2654 void ClearSwitchCaseIDs();
2655
2656 /// Cursors for comments blocks.
2657 SmallVector<std::pair<llvm::BitstreamCursor,
2659
2660 /// Loads comments ranges.
2661 void ReadComments() override;
2662
2663 /// Visit all the input file infos of the given module file.
2665 serialization::ModuleFile &MF, bool IncludeSystem,
2666 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
2667 bool IsSystem)>
2668 Visitor);
2669
2670 /// Visit all the input files of the given module file.
2672 bool IncludeSystem, bool Complain,
2673 llvm::function_ref<void(const serialization::InputFile &IF,
2674 bool isSystem)> Visitor);
2675
2676 /// Visit all the top-level module maps loaded when building the given module
2677 /// file.
2679 llvm::function_ref<void(FileEntryRef)> Visitor);
2680
2681 bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; }
2682};
2683
2684/// A simple helper class to unpack an integer to bits and consuming
2685/// the bits in order.
2687 constexpr static uint32_t BitsIndexUpbound = 32;
2688
2689public:
2690 BitsUnpacker(uint32_t V) { updateValue(V); }
2691 BitsUnpacker(const BitsUnpacker &) = delete;
2695 ~BitsUnpacker() = default;
2696
2697 void updateValue(uint32_t V) {
2698 Value = V;
2699 CurrentBitsIndex = 0;
2700 }
2701
2702 void advance(uint32_t BitsWidth) { CurrentBitsIndex += BitsWidth; }
2703
2704 bool getNextBit() {
2705 assert(isValid());
2706 return Value & (1 << CurrentBitsIndex++);
2707 }
2708
2709 uint32_t getNextBits(uint32_t Width) {
2710 assert(isValid());
2711 assert(Width < BitsIndexUpbound);
2712 uint32_t Ret = (Value >> CurrentBitsIndex) & ((1 << Width) - 1);
2713 CurrentBitsIndex += Width;
2714 return Ret;
2715 }
2716
2717 bool canGetNextNBits(uint32_t Width) const {
2718 return CurrentBitsIndex + Width < BitsIndexUpbound;
2719 }
2720
2721private:
2722 bool isValid() const { return CurrentBitsIndex < BitsIndexUpbound; }
2723
2724 uint32_t Value;
2725 uint32_t CurrentBitsIndex = ~0;
2726};
2727
2728inline bool shouldSkipCheckingODR(const Decl *D) {
2729 return D->getASTContext().getLangOpts().SkipODRCheckInGMF &&
2730 (D->isFromGlobalModule() || D->isFromHeaderUnit());
2731}
2732
2733/// Calculate a hash value for the primary module name of the given module.
2734/// \returns std::nullopt if M is not a C++ standard module.
2735UnsignedOrNone getPrimaryModuleHash(const Module *M);
2736
2737} // namespace clang
2738
2739#endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H
#define V(N, I)
Defines the Diagnostic-related interfaces.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
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::OpenCLOptions class.
Defines the clang::SourceLocation class and associated facilities.
Defines a utilitiy for warning once when close to out of stack space.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition ASTConsumer.h:35
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
const LangOptions & getLangOpts() const
Definition ASTContext.h:952
Abstract interface for callback invocations by the ASTReader.
Definition ASTReader.h:117
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
Definition ASTReader.h:226
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
Definition ASTReader.h:186
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
Definition ASTReader.h:130
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
Definition ASTReader.h:231
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:243
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
Definition ASTReader.h:201
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
Definition ASTReader.h:173
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
Definition ASTReader.h:214
virtual void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata)
Indicates that a particular module file extension has been read.
Definition ASTReader.h:270
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
Definition ASTReader.h:135
virtual bool visitInputFileAsRequested(StringRef FilenameAsRequested, StringRef Filename, bool isSystem, bool isOverridden, time_t StoredTime, bool isExplicitModule)
Similiar to member function of visitInputFile but should be defined when there is a distinction betwe...
Definition ASTReader.h:254
virtual void visitImport(StringRef ModuleName, StringRef Filename)
If needsImportVisitation returns true, this is called for each AST file imported by this AST file.
Definition ASTReader.h:267
virtual bool needsImportVisitation() const
Returns true if this ASTReaderListener wants to receive the imports of the AST file via visitImport,...
Definition ASTReader.h:263
virtual bool ReadFullVersionInformation(StringRef FullVersion)
Receives the full Clang version information.
Definition ASTReader.h:125
virtual void ReadModuleName(StringRef ModuleName)
Definition ASTReader.h:129
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
Definition ASTReader.h:222
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
Definition ASTReader.h:235
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Definition ASTReader.h:144
ListenerScope(ASTReader &Reader, std::unique_ptr< ASTReaderListener > L)
Definition ASTReader.h:1939
bool operator==(const ModuleDeclIterator &RHS) const
Definition ASTReader.h:1713
ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod, const serialization::unaligned_decl_id_t *Pos)
Definition ASTReader.h:1702
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:427
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
friend class ASTWriter
Definition ASTReader.h:435
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
Definition ASTReader.h:443
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
SourceLocationEncoding::RawLocEncoding RawLocEncoding
Definition ASTReader.h:2484
ModuleManager & getModuleManager()
Retrieve the module manager.
Definition ASTReader.h:2005
ASTReader & operator=(const ASTReader &)=delete
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
Definition ASTReader.h:432
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
unsigned getTotalNumPreprocessedEntities() const
Returns the number of preprocessed entities known to the AST reader.
Definition ASTReader.h:2110
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2624
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:2198
ModuleManager::ModuleIterator ModuleIterator
Definition ASTReader.h:476
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 ...
LoadFailureCapabilities
Flags that indicate what kind of AST loading failures the client of the AST reader can directly handl...
Definition ASTReader.h:1841
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1847
@ ARR_None
The client can't handle any AST loading failures.
Definition ASTReader.h:1843
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1860
@ 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:1851
@ ARR_TreatModuleWithErrorsAsOutOfDate
If a module file is marked with errors treat it as out-of-date so the caller can rebuild it.
Definition ASTReader.h:1864
@ 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:1855
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.
const std::string & getSuggestedPredefines()
Returns the suggested contents of the predefines buffer, which contains a (typically-empty) subset of...
Definition ASTReader.h:2047
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:2658
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:2208
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:440
Sema::AlignPackInfo ReadAlignPackInfo(uint32_t Raw) const
Read a AlignPackInfo from raw form.
Definition ASTReader.h:2480
QualType readType(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a type from the current position in the given record, which was read from the given AST file.
Definition ASTReader.h:2130
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
Definition ASTReader.h:474
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
Definition ASTReader.h:1831
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
const CodeGenOptions & getCodeGenOpts() const
Definition ASTReader.h:1834
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...
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
Definition ASTReader.h:2099
ASTReader(const ASTReader &)=delete
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
Definition ASTReader.h:2636
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
friend class ASTDeclMerger
Types of AST files.
Definition ASTReader.h:430
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
unsigned getTotalNumIdentifiers() const
Returns the number of identifiers found in the chain.
Definition ASTReader.h:2079
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.
const ModuleManager & getModuleManager() const
Definition ASTReader.h:2006
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
Definition ASTReader.h:2074
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
void forEachImportedKeyDecl(const Decl *D, Fn Visit)
Run a callback on each imported key declaration of D.
Definition ASTReader.h:1512
~ASTReader() override
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class TypeLocReader
Definition ASTReader.h:439
friend class PCHValidator
Definition ASTReader.h:436
Stmt * ReadSubStmt()
Reads a sub-statement operand during statement reading.
Definition ASTReader.h:2579
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
Expr * ReadSubExpr()
Reads a sub-expression operand during statement reading.
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
Definition ASTReader.h:2510
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
friend class ASTDeclReader
Definition ASTReader.h:431
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:2104
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.
unsigned getTotalNumTypes() const
Returns the number of types found in the chain.
Definition ASTReader.h:2089
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.
Expr * ReadExpr(ModuleFile &F)
Reads an expression.
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:2631
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
Definition ASTReader.h:2013
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
ASTDeserializationListener * getDeserializationListener()
Get the AST deserialization listener.
Definition ASTReader.h:1963
void addListener(std::unique_ptr< ASTReaderListener > L)
Add an AST callback listener.
Definition ASTReader.h:1926
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
Definition ASTReader.h:1496
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
void setListener(std::unique_ptr< ASTReaderListener > Listener)
Set the AST callbacks listener.
Definition ASTReader.h:1919
Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx)
Definition ASTReader.h:2467
ModuleManager::ModuleReverseIterator ModuleReverseIterator
Definition ASTReader.h:478
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
Definition ASTReader.h:447
@ Success
The control block was read successfully.
Definition ASTReader.h:450
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
Definition ASTReader.h:467
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
Definition ASTReader.h:460
@ Failure
The AST file itself appears corrupted.
Definition ASTReader.h:453
@ VersionMismatch
The AST file was written by a different version of Clang.
Definition ASTReader.h:463
@ HadErrors
The AST file has errors.
Definition ASTReader.h:470
@ Missing
The AST file was missing.
Definition ASTReader.h:456
void addInMemoryBuffer(StringRef &FileName, std::unique_ptr< llvm::MemoryBuffer > Buffer)
Add in-memory (virtual file) buffer.
Definition ASTReader.h:1992
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
SmallString< 0 > & getPathBuf()
Get the buffer for resolving paths.
Definition ASTReader.h:1473
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:2538
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.
serialization::ModuleManager ModuleManager
Definition ASTReader.h:475
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.
Stmt * ReadStmt(ModuleFile &F)
Reads a statement.
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.
SourceLocation ReadSourceLocation(ModuleFile &ModuleFile, const RecordDataImpl &Record, unsigned &Idx)
Read a source location.
Definition ASTReader.h:2525
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 ForgetSema() override
Inform the semantic consumer that Sema is no longer available.
Definition ASTReader.h:2302
DiagnosticsEngine & getDiags() const
Definition ASTReader.h:1833
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:2162
bool isProcessingUpdateRecords()
Definition ASTReader.h:2681
T * GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
Definition ASTReader.h:2169
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:2494
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:2009
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...
const Decl * getKeyDeclaration(const Decl *D)
Definition ASTReader.h:1506
ModuleManager::ModuleConstIterator ModuleConstIterator
Definition ASTReader.h:477
std::pair< SourceLocation, unsigned > ReadUntranslatedSourceLocation(RawLocEncoding Raw) const
Read a source location from raw form and return it in its originating module file's source location s...
Definition ASTReader.h:2489
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
Definition ASTReader.h:433
SmallVector< uint64_t, 64 > RecordData
Definition ASTReader.h:442
unsigned getTotalNumMacros() const
Returns the number of macros found in the chain.
Definition ASTReader.h:2084
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
Definition ASTReader.h:2532
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
std::unique_ptr< ASTReaderListener > takeListener()
Take the AST callbacks listener.
Definition ASTReader.h:1914
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
void resetForReload()
Reset reader for a reload try.
Definition ASTReader.h:1974
FileManager & getFileManager() const
Definition ASTReader.h:1832
unsigned getTotalNumDecls() const
Returns the number of declarations found in the chain.
Definition ASTReader.h:2094
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
friend class ASTUnit
Definition ASTReader.h:434
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
IdentifierInfo * readIdentifier(ModuleFile &M, const RecordData &Record, unsigned &Idx)
Definition ASTReader.h:2390
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
GlobalModuleIndex * getGlobalIndex()
Return global module index.
Definition ASTReader.h:1971
IdentifierInfo * GetIdentifier(serialization::IdentifierID ID) override
Return the identifier associated with the given ID number.
Definition ASTReader.h:2395
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
serialization::ModuleFile ModuleFile
Definition ASTReader.h:473
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
Definition ASTReader.h:1968
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
BitsUnpacker operator=(const BitsUnpacker &)=delete
uint32_t getNextBits(uint32_t Width)
Definition ASTReader.h:2709
void advance(uint32_t BitsWidth)
Definition ASTReader.h:2702
bool canGetNextNBits(uint32_t Width) const
Definition ASTReader.h:2717
BitsUnpacker(BitsUnpacker &&)=delete
BitsUnpacker(const BitsUnpacker &)=delete
void updateValue(uint32_t V)
Definition ASTReader.h:2697
BitsUnpacker operator=(BitsUnpacker &&)=delete
BitsUnpacker(uint32_t V)
Definition ASTReader.h:2690
~BitsUnpacker()=default
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ base or member initializer.
Definition DeclCXX.h:2376
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ temporary.
Definition ExprCXX.h:1460
Simple wrapper class for chaining listeners.
Definition ASTReader.h:275
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
std::unique_ptr< ASTReaderListener > takeSecond()
Definition ASTReader.h:286
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
std::unique_ptr< ASTReaderListener > takeFirst()
Definition ASTReader.h:285
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.
ChainedASTReaderListener(std::unique_ptr< ASTReaderListener > First, std::unique_ptr< ASTReaderListener > Second)
Takes ownership of First and Second.
Definition ASTReader.h:281
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A map from continuous integer ranges to some value, with a very specialized interface.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:793
bool isFromHeaderUnit() const
Whether this declaration comes from a header unit.
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
A little helper class used to produce diagnostics.
Options for controlling the compiler diagnostics engine.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
Represents an enum.
Definition Decl.h:4028
This represents one expression.
Definition Expr.h:112
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
An external source of header file information, which may supply information about header files alread...
An abstract class that should be subclassed by any external source of preprocessing record entries.
Abstract interface for external sources of preprocessor information.
External source of source location entries.
Represents a member of a struct/union/class.
Definition Decl.h:3175
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition FileEntry.h:57
Cached information about one file (either on disk or in the virtual file system).
Definition FileEntry.h:302
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
bool isInvalid() const
Implements support for file system lookup, file system caching, and directory search management.
Definition FileManager.h:53
Keeps track of options that affect how file operations are performed.
Represents a function declaration or definition.
Definition Decl.h:2015
A global index for a set of module files, providing information about the identifiers within those mo...
HeaderSearchOptions - Helper class for storing options related to the initialization of the HeaderSea...
Provides lookups to, and iteration over, IdentiferInfo objects.
One of these records is kept for each identifier that is lexed.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Encapsulates the data about a macro definition (e.g.
Definition MacroInfo.h:39
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:25
Identifies a module file to be loaded.
Definition Module.h:102
Describes a module or submodule.
Definition Module.h:246
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:546
This represents a decl that may have a name.
Definition Decl.h:274
Represent a C++ namespace.
Definition Decl.h:592
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2329
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
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.
PCHValidator(Preprocessor &PP, ASTReader &Reader)
Definition ASTReader.h:331
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
Definition TypeBase.h:937
Smart pointer class that efficiently represents Objective-C method names.
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1901
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:868
SimpleASTReaderListener(Preprocessor &PP)
Definition ASTReader.h:363
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
static std::pair< SourceLocation, unsigned > decode(RawLocEncoding)
Encodes a location in the source.
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.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
Definition Stmt.h:86
Options for controlling the target.
Token - This structure provides full information about a lexed token.
Definition Token.h:36
The base class of the type hierarchy.
Definition TypeBase.h:1866
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3577
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
The input file that has been loaded from this AST file, along with bools indicating whether this was ...
Definition ModuleFile.h:84
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:145
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:320
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:271
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Definition ModuleFile.h:531
Manages the set of modules loaded by an AST reader.
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::iterator > ModuleIterator
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::const_iterator > ModuleConstIterator
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::reverse_iterator > ModuleReverseIterator
Class that performs lookup for an identifier stored in an AST file.
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.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
uint64_t MacroID
An ID number that refers to a macro in an AST file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition ASTBitCodes.h:88
ModuleKind
Specifies the kind of module that has been loaded.
Definition ModuleFile.h:43
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
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
The JSON file list parser is used to communicate input to InstallAPI.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
PredefinedDeclIDs
Predefined declaration IDs.
Definition DeclID.h:31
@ Result
The result type of a method or function.
Definition TypeBase.h:905
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2728
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
Definition Version.cpp:68
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
unsigned long uint64_t
unsigned int uint32_t
The signature of a module, which is a hash of the AST content.
Definition Module.h:160
ImportedModule(ModuleFile *Mod, ModuleFile *ImportedBy, SourceLocation ImportLoc)
Definition ASTReader.h:1546
The preprocessor keeps track of this information for each file that is #included.
Metadata for a module file extension.
The input file info that has been loaded from an AST file.
Definition ModuleFile.h:64