clang 24.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.
223 }
224
225 /// This is called for each AST file loaded.
226 virtual void visitModuleFile(ModuleFileName Filename,
228 bool DirectlyImported) {}
229
230 /// Returns true if this \c ASTReaderListener wants to receive the
231 /// input files of the AST file via \c visitInputFile, false otherwise.
232 virtual bool needsInputFileVisitation() { return false; }
233
234 /// Returns true if this \c ASTReaderListener wants to receive the
235 /// system input files of the AST file via \c visitInputFile, false otherwise.
236 virtual bool needsSystemInputFileVisitation() { return false; }
237
238 /// if \c needsInputFileVisitation returns true, this is called for
239 /// each non-system input file of the AST File. If
240 /// \c needsSystemInputFileVisitation is true, then it is called for all
241 /// system input files as well.
242 ///
243 /// \returns true to continue receiving the next input file, false to stop.
244 virtual bool visitInputFile(StringRef Filename, bool isSystem,
245 bool isOverridden, bool isExplicitModule) {
246 return true;
247 }
248
249 /// Similar to member function of \c visitInputFile but should
250 /// be defined when there is a distinction between the file name
251 /// and the name-as-requested. For example, when deserializing input
252 /// files from precompiled AST files.
253 ///
254 /// \returns true to continue receiving the next input file, false to stop.
255 virtual bool visitInputFileAsRequested(StringRef FilenameAsRequested,
256 StringRef Filename, bool isSystem,
257 bool isOverridden, time_t StoredTime,
258 bool isExplicitModule) {
259 return true;
260 }
261
262 /// Returns true if this \c ASTReaderListener wants to receive the
263 /// imports of the AST file via \c visitImport, false otherwise.
264 virtual bool needsImportVisitation() const { return false; }
265
266 /// If needsImportVisitation returns \c true, this is called for each
267 /// AST file imported by this AST file.
268 virtual void visitImport(StringRef ModuleName, StringRef Filename) {}
269
270 /// Indicates that a particular module file extension has been read.
272 const ModuleFileExtensionMetadata &Metadata) {}
273};
274
275/// Simple wrapper class for chaining listeners.
277 std::unique_ptr<ASTReaderListener> First;
278 std::unique_ptr<ASTReaderListener> Second;
279
280public:
281 /// Takes ownership of \p First and \p Second.
282 ChainedASTReaderListener(std::unique_ptr<ASTReaderListener> First,
283 std::unique_ptr<ASTReaderListener> Second)
284 : First(std::move(First)), Second(std::move(Second)) {}
285
286 std::unique_ptr<ASTReaderListener> takeFirst() { return std::move(First); }
287 std::unique_ptr<ASTReaderListener> takeSecond() { return std::move(Second); }
288
289 bool ReadFullVersionInformation(StringRef FullVersion) override;
290 void ReadModuleName(StringRef ModuleName) override;
291 void ReadModuleMapFile(StringRef ModuleMapPath) override;
292 bool ReadLanguageOptions(const LangOptions &LangOpts,
293 StringRef ModuleFilename, bool Complain,
294 bool AllowCompatibleDifferences) override;
295 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
296 StringRef ModuleFilename, bool Complain,
297 bool AllowCompatibleDifferences) override;
298 bool ReadTargetOptions(const TargetOptions &TargetOpts,
299 StringRef ModuleFilename, bool Complain,
300 bool AllowCompatibleDifferences) override;
302 StringRef ModuleFilename, bool Complain) override;
303 bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
304 bool Complain) override;
305
307 StringRef ModuleFilename, StringRef ContextHash,
308 bool Complain) override;
310 StringRef ModuleFilename, bool ReadMacros,
311 bool Complain,
312 std::string &SuggestedPredefines) override;
313
314 void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
315 bool needsInputFileVisitation() override;
316 bool needsSystemInputFileVisitation() override;
318 bool DirectlyImported) override;
319 bool visitInputFile(StringRef Filename, bool isSystem,
320 bool isOverridden, bool isExplicitModule) override;
322 const ModuleFileExtensionMetadata &Metadata) override;
323};
324
325/// ASTReaderListener implementation to validate the information of
326/// the PCH file against an initialized Preprocessor.
328 Preprocessor &PP;
329 ASTReader &Reader;
330
331public:
333 : PP(PP), Reader(Reader) {}
334
335 bool ReadLanguageOptions(const LangOptions &LangOpts,
336 StringRef ModuleFilename, bool Complain,
337 bool AllowCompatibleDifferences) override;
338 bool ReadCodeGenOptions(const CodeGenOptions &CGOpts,
339 StringRef ModuleFilename, bool Complain,
340 bool AllowCompatibleDifferences) override;
341 bool ReadTargetOptions(const TargetOptions &TargetOpts,
342 StringRef ModuleFilename, bool Complain,
343 bool AllowCompatibleDifferences) override;
345 StringRef ModuleFilename, bool Complain) override;
347 StringRef ModuleFilename, bool ReadMacros,
348 bool Complain,
349 std::string &SuggestedPredefines) override;
351 StringRef ModuleFilename, StringRef ContextHash,
352 bool Complain) override;
353 void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
354};
355
356/// ASTReaderListenter implementation to set SuggestedPredefines of
357/// ASTReader which is required to use a pch file. This is the replacement
358/// of PCHValidator or SimplePCHValidator when using a pch file without
359/// validating it.
361 Preprocessor &PP;
362
363public:
365
367 StringRef ModuleFilename, bool ReadMacros,
368 bool Complain,
369 std::string &SuggestedPredefines) override;
370};
371
372namespace serialization {
373
374class ReadMethodPoolVisitor;
375
376namespace reader {
377
379
380/// The on-disk hash table(s) used for DeclContext name lookup.
383
384/// The on-disk hash table(s) used for specialization decls.
386
387} // namespace reader
388
389} // namespace serialization
390
392 uint64_t VisibleOffset = 0;
393 uint64_t ModuleLocalOffset = 0;
394 uint64_t TULocalOffset = 0;
395
396 operator bool() const {
398 }
399};
400
402 uint64_t LexicalOffset = 0;
403
404 operator bool() const {
405 return VisibleLookupBlockOffsets::operator bool() || LexicalOffset;
406 }
407};
408
409/// Reads an AST files chain containing the contents of a translation
410/// unit.
411///
412/// The ASTReader class reads bitstreams (produced by the ASTWriter
413/// class) containing the serialized representation of a given
414/// abstract syntax tree and its supporting data structures. An
415/// instance of the ASTReader can be attached to an ASTContext object,
416/// which will provide access to the contents of the AST files.
417///
418/// The AST reader provides lazy de-serialization of declarations, as
419/// required when traversing the AST. Only those AST nodes that are
420/// actually required will be de-serialized.
424 public ExternalSemaSource,
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 /// Key used to identify LifetimeExtendedTemporaryDecl for merging,
650 /// containing the lifetime-extending declaration and the mangling number.
651 using LETemporaryKey = std::pair<Decl *, unsigned>;
652
653 /// Map of already deserialiazed temporaries.
654 llvm::DenseMap<LETemporaryKey, LifetimeExtendedTemporaryDecl *>
655 LETemporaryForMerging;
656
657 struct FileDeclsInfo {
658 ModuleFile *Mod = nullptr;
660
661 FileDeclsInfo() = default;
662 FileDeclsInfo(ModuleFile *Mod,
664 : Mod(Mod), Decls(Decls) {}
665 };
666
667 /// Map from a FileID to the file-level declarations that it contains.
668 llvm::DenseMap<FileID, FileDeclsInfo> FileDeclIDs;
669
670 /// An array of lexical contents of a declaration context, as a sequence of
671 /// Decl::Kind, DeclID pairs.
672 using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>;
673
674 /// Map from a DeclContext to its lexical contents.
675 llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>>
676 LexicalDecls;
677
678 /// Map from the TU to its lexical contents from each module file.
679 std::vector<std::pair<ModuleFile*, LexicalContents>> TULexicalDecls;
680
681 /// Map from a DeclContext to its lookup tables.
682 llvm::DenseMap<const DeclContext *,
683 serialization::reader::DeclContextLookupTable> Lookups;
684 llvm::DenseMap<const DeclContext *,
685 serialization::reader::ModuleLocalLookupTable>
686 ModuleLocalLookups;
687 llvm::DenseMap<const DeclContext *,
688 serialization::reader::DeclContextLookupTable>
689 TULocalLookups;
690
691 using SpecLookupTableTy =
692 llvm::DenseMap<const Decl *,
693 serialization::reader::LazySpecializationInfoLookupTable>;
694 /// Map from decls to specialized decls.
695 SpecLookupTableTy SpecializationsLookups;
696 /// Split partial specialization from specialization to speed up lookups.
697 SpecLookupTableTy PartialSpecializationsLookups;
698
699 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
700 const Decl *D);
701 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
702 const Decl *D,
703 ArrayRef<TemplateArgument> TemplateArgs);
704
705 // Updates for visible decls can occur for other contexts than just the
706 // TU, and when we read those update records, the actual context may not
707 // be available yet, so have this pending map using the ID as a key. It
708 // will be realized when the data is actually loaded.
709 struct UpdateData {
710 ModuleFile *Mod;
711 const unsigned char *Data;
712 };
713 using DeclContextVisibleUpdates = SmallVector<UpdateData, 1>;
714
715 /// Updates to the visible declarations of declaration contexts that
716 /// haven't been loaded yet.
717 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> PendingVisibleUpdates;
718 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates>
719 PendingModuleLocalVisibleUpdates;
720 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> TULocalUpdates;
721
722 using SpecializationsUpdate = SmallVector<UpdateData, 1>;
723 using SpecializationsUpdateMap =
724 llvm::DenseMap<GlobalDeclID, SpecializationsUpdate>;
725 SpecializationsUpdateMap PendingSpecializationsUpdates;
726 SpecializationsUpdateMap PendingPartialSpecializationsUpdates;
727
728 /// The set of C++ or Objective-C classes that have forward
729 /// declarations that have not yet been linked to their definitions.
730 llvm::SmallPtrSet<Decl *, 4> PendingDefinitions;
731
732 using PendingBodiesMap =
733 llvm::MapVector<Decl *, uint64_t,
734 llvm::SmallDenseMap<Decl *, unsigned, 4>,
735 SmallVector<std::pair<Decl *, uint64_t>, 4>>;
736
737 /// Functions or methods that have bodies that will be attached.
738 PendingBodiesMap PendingBodies;
739
740 /// Definitions for which we have added merged definitions but not yet
741 /// performed deduplication.
742 llvm::SetVector<NamedDecl *> PendingMergedDefinitionsToDeduplicate;
743
744 /// The duplicated definitions in module units which are pending to be warned.
745 /// We need to delay it to wait for the loading of definitions since we don't
746 /// want to warn for forward declarations.
747 llvm::SmallVector<std::pair<Decl *, Decl *>>
748 PendingWarningForDuplicatedDefsInModuleUnits;
749
750 /// Read the record that describes the lexical contents of a DC.
751 bool ReadLexicalDeclContextStorage(ModuleFile &M,
752 llvm::BitstreamCursor &Cursor,
753 uint64_t Offset, DeclContext *DC);
754
755 enum class VisibleDeclContextStorageKind {
756 GenerallyVisible,
757 ModuleLocalVisible,
758 TULocalVisible,
759 };
760
761 /// Read the record that describes the visible contents of a DC.
762 bool ReadVisibleDeclContextStorage(ModuleFile &M,
763 llvm::BitstreamCursor &Cursor,
764 uint64_t Offset, GlobalDeclID ID,
765 VisibleDeclContextStorageKind VisibleKind);
766
767 bool ReadSpecializations(ModuleFile &M, llvm::BitstreamCursor &Cursor,
768 uint64_t Offset, Decl *D, bool IsPartial);
769 void AddSpecializations(const Decl *D, const unsigned char *Data,
770 ModuleFile &M, bool IsPartial);
771
772 /// A vector containing identifiers that have already been
773 /// loaded.
774 ///
775 /// If the pointer at index I is non-NULL, then it refers to the
776 /// IdentifierInfo for the identifier with ID=I+1 that has already
777 /// been loaded.
778 std::vector<IdentifierInfo *> IdentifiersLoaded;
779
780 /// A vector containing macros that have already been
781 /// loaded.
782 ///
783 /// If the pointer at index I is non-NULL, then it refers to the
784 /// MacroInfo for the identifier with ID=I+1 that has already
785 /// been loaded.
786 std::vector<MacroInfo *> MacrosLoaded;
787
788 using LoadedMacroInfo =
789 std::pair<IdentifierInfo *, serialization::SubmoduleID>;
790
791 /// A set of #undef directives that we have loaded; used to
792 /// deduplicate the same #undef information coming from multiple module
793 /// files.
794 llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
795
796 /// A vector containing submodules that have already been loaded.
797 ///
798 /// This vector is indexed by the Submodule ID (-1). NULL submodule entries
799 /// indicate that the particular submodule ID has not yet been loaded.
800 SmallVector<Module *, 2> SubmodulesLoaded;
801
802 using GlobalSubmoduleMapType =
803 ContinuousRangeMap<serialization::SubmoduleID, ModuleFile *, 4>;
804
805 /// Mapping from global submodule IDs to the module file in which the
806 /// submodule resides along with the offset that should be added to the
807 /// global submodule ID to produce a local ID.
808 GlobalSubmoduleMapType GlobalSubmoduleMap;
809
810 /// A set of hidden declarations.
811 using HiddenNames = SmallVector<Decl *, 2>;
812 using HiddenNamesMapType = llvm::DenseMap<Module *, HiddenNames>;
813
814 /// A mapping from each of the hidden submodules to the deserialized
815 /// declarations in that submodule that could be made visible.
816 HiddenNamesMapType HiddenNamesMap;
817
818 /// A vector containing selectors that have already been loaded.
819 ///
820 /// This vector is indexed by the Selector ID (-1). NULL selector
821 /// entries indicate that the particular selector ID has not yet
822 /// been loaded.
823 SmallVector<Selector, 16> SelectorsLoaded;
824
825 using GlobalSelectorMapType =
826 ContinuousRangeMap<serialization::SelectorID, ModuleFile *, 4>;
827
828 /// Mapping from global selector IDs to the module in which the
829 /// global selector ID to produce a local ID.
830 GlobalSelectorMapType GlobalSelectorMap;
831
832 /// The generation number of the last time we loaded data from the
833 /// global method pool for this selector.
834 llvm::DenseMap<Selector, unsigned> SelectorGeneration;
835
836 /// Whether a selector is out of date. We mark a selector as out of date
837 /// if we load another module after the method pool entry was pulled in.
838 llvm::DenseMap<Selector, bool> SelectorOutOfDate;
839
840 struct PendingMacroInfo {
841 ModuleFile *M;
842 /// Offset relative to ModuleFile::MacroOffsetsBase.
843 uint32_t MacroDirectivesOffset;
844
845 PendingMacroInfo(ModuleFile *M, uint32_t MacroDirectivesOffset)
846 : M(M), MacroDirectivesOffset(MacroDirectivesOffset) {}
847 };
848
849 using PendingMacroIDsMap =
850 llvm::MapVector<IdentifierInfo *, SmallVector<PendingMacroInfo, 2>>;
851
852 /// Mapping from identifiers that have a macro history to the global
853 /// IDs have not yet been deserialized to the global IDs of those macros.
854 PendingMacroIDsMap PendingMacroIDs;
855
856 using GlobalPreprocessedEntityMapType =
857 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
858
859 /// Mapping from global preprocessing entity IDs to the module in
860 /// which the preprocessed entity resides along with the offset that should be
861 /// added to the global preprocessing entity ID to produce a local ID.
862 GlobalPreprocessedEntityMapType GlobalPreprocessedEntityMap;
863
864 using GlobalSkippedRangeMapType =
865 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
866
867 /// Mapping from global skipped range base IDs to the module in which
868 /// the skipped ranges reside.
869 GlobalSkippedRangeMapType GlobalSkippedRangeMap;
870
871 /// \name CodeGen-relevant special data
872 /// Fields containing data that is relevant to CodeGen.
873 //@{
874
875 /// The IDs of all declarations that fulfill the criteria of
876 /// "interesting" decls.
877 ///
878 /// This contains the data loaded from all EAGERLY_DESERIALIZED_DECLS blocks
879 /// in the chain. The referenced declarations are deserialized and passed to
880 /// the consumer eagerly.
881 SmallVector<GlobalDeclID, 16> EagerlyDeserializedDecls;
882
883 /// The IDs of all vtables to emit. The referenced declarations are passed
884 /// to the consumers' HandleVTable eagerly after passing
885 /// EagerlyDeserializedDecls.
886 SmallVector<GlobalDeclID, 16> VTablesToEmit;
887
888 /// The IDs of all tentative definitions stored in the chain.
889 ///
890 /// Sema keeps track of all tentative definitions in a TU because it has to
891 /// complete them and pass them on to CodeGen. Thus, tentative definitions in
892 /// the PCH chain must be eagerly deserialized.
893 SmallVector<GlobalDeclID, 16> TentativeDefinitions;
894
895 /// The IDs of all CXXRecordDecls stored in the chain whose VTables are
896 /// used.
897 ///
898 /// CodeGen has to emit VTables for these records, so they have to be eagerly
899 /// deserialized.
900 struct VTableUse {
901 GlobalDeclID ID;
903 bool Used;
904 };
905 SmallVector<VTableUse> VTableUses;
906
907 /// A snapshot of the pending instantiations in the chain.
908 ///
909 /// This record tracks the instantiations that Sema has to perform at the
910 /// end of the TU. It consists of a pair of values for every pending
911 /// instantiation where the first value is the ID of the decl and the second
912 /// is the instantiation location.
913 struct PendingInstantiation {
914 GlobalDeclID ID;
916 };
917 SmallVector<PendingInstantiation, 64> PendingInstantiations;
918
919 //@}
920
921 /// \name DiagnosticsEngine-relevant special data
922 /// Fields containing data that is used for generating diagnostics
923 //@{
924
925 /// A snapshot of Sema's unused file-scoped variable tracking, for
926 /// generating warnings.
927 SmallVector<GlobalDeclID, 16> UnusedFileScopedDecls;
928
929 /// A list of all the delegating constructors we've seen, to diagnose
930 /// cycles.
931 SmallVector<GlobalDeclID, 4> DelegatingCtorDecls;
932
933 /// Method selectors used in a @selector expression. Used for
934 /// implementation of -Wselector.
935 SmallVector<serialization::SelectorID, 64> ReferencedSelectorsData;
936
937 /// A snapshot of Sema's weak undeclared identifier tracking, for
938 /// generating warnings. Note that this vector has 3n entries, being triplets
939 /// of the form C name, alias if any, and source location.
940 SmallVector<serialization::IdentifierID, 64> WeakUndeclaredIdentifiers;
941
942 /// A snapshot of Sema's #redefine_extname'd undeclared identifier tracking,
943 /// for generating warnings. Note that this vector has 3n entries, being
944 /// triplets in the order of C name, asm name, and source location.
945 SmallVector<serialization::IdentifierID, 64> ExtnameUndeclaredIdentifiers;
946
947 /// The IDs of type aliases for ext_vectors that exist in the chain.
948 ///
949 /// Used by Sema for finding sugared names for ext_vectors in diagnostics.
950 SmallVector<GlobalDeclID, 4> ExtVectorDecls;
951
952 //@}
953
954 /// \name Sema-relevant special data
955 /// Fields containing data that is used for semantic analysis
956 //@{
957
958 /// The IDs of all potentially unused typedef names in the chain.
959 ///
960 /// Sema tracks these to emit warnings.
961 SmallVector<GlobalDeclID, 16> UnusedLocalTypedefNameCandidates;
962
963 /// Our current depth in #pragma cuda force_host_device begin/end
964 /// macros.
965 unsigned ForceHostDeviceDepth = 0;
966
967 /// The IDs of the declarations Sema stores directly.
968 ///
969 /// Sema tracks a few important decls, such as namespace std, directly.
970 SmallVector<GlobalDeclID, 4> SemaDeclRefs;
971
972 /// The IDs of the types ASTContext stores directly.
973 ///
974 /// The AST context tracks a few important types, such as va_list, directly.
975 SmallVector<serialization::TypeID, 16> SpecialTypes;
976
977 /// The IDs of CUDA-specific declarations ASTContext stores directly.
978 ///
979 /// The AST context tracks a few important decls, currently cudaConfigureCall,
980 /// directly.
981 SmallVector<GlobalDeclID, 4> CUDASpecialDeclRefs;
982
983 /// The floating point pragma option settings.
984 SmallVector<uint64_t, 1> FPPragmaOptions;
985
986 /// The pragma clang optimize location (if the pragma state is "off").
987 SourceLocation OptimizeOffPragmaLocation;
988
989 /// The PragmaMSStructKind pragma ms_struct state if set, or -1.
990 int PragmaMSStructState = -1;
991
992 /// The PragmaMSPointersToMembersKind pragma pointers_to_members state.
993 int PragmaMSPointersToMembersState = -1;
994 SourceLocation PointersToMembersPragmaLocation;
995
996 /// The pragma float_control state.
997 std::optional<FPOptionsOverride> FpPragmaCurrentValue;
998 SourceLocation FpPragmaCurrentLocation;
999 struct FpPragmaStackEntry {
1000 FPOptionsOverride Value;
1001 SourceLocation Location;
1002 SourceLocation PushLocation;
1003 StringRef SlotLabel;
1004 };
1005 llvm::SmallVector<FpPragmaStackEntry, 2> FpPragmaStack;
1006 llvm::SmallVector<std::string, 2> FpPragmaStrings;
1007
1008 /// The pragma align/pack state.
1009 std::optional<Sema::AlignPackInfo> PragmaAlignPackCurrentValue;
1010 SourceLocation PragmaAlignPackCurrentLocation;
1011 struct PragmaAlignPackStackEntry {
1012 Sema::AlignPackInfo Value;
1013 SourceLocation Location;
1014 SourceLocation PushLocation;
1015 StringRef SlotLabel;
1016 };
1017 llvm::SmallVector<PragmaAlignPackStackEntry, 2> PragmaAlignPackStack;
1018 llvm::SmallVector<std::string, 2> PragmaAlignPackStrings;
1019
1020 /// The OpenCL extension settings.
1021 OpenCLOptions OpenCLExtensions;
1022
1023 /// Extensions required by an OpenCL type.
1024 llvm::DenseMap<const Type *, std::set<std::string>> OpenCLTypeExtMap;
1025
1026 /// Extensions required by an OpenCL declaration.
1027 llvm::DenseMap<const Decl *, std::set<std::string>> OpenCLDeclExtMap;
1028
1029 /// A list of the namespaces we've seen.
1030 SmallVector<GlobalDeclID, 4> KnownNamespaces;
1031
1032 /// A list of undefined decls with internal linkage followed by the
1033 /// SourceLocation of a matching ODR-use.
1034 struct UndefinedButUsedDecl {
1035 GlobalDeclID ID;
1037 };
1038 SmallVector<UndefinedButUsedDecl, 8> UndefinedButUsed;
1039
1040 /// Delete expressions to analyze at the end of translation unit.
1041 SmallVector<uint64_t, 8> DelayedDeleteExprs;
1042
1043 // A list of late parsed template function data with their module files.
1044 SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
1045 LateParsedTemplates;
1046
1047 /// The IDs of all decls to be checked for deferred diags.
1048 ///
1049 /// Sema tracks these to emit deferred diags.
1050 llvm::SmallSetVector<GlobalDeclID, 4> DeclsToCheckForDeferredDiags;
1051
1052 /// The IDs of all decls with function effects to be checked.
1053 SmallVector<GlobalDeclID> DeclsWithEffectsToVerify;
1054
1055 /// The RISC-V intrinsic pragma(including RVV, SiFive and Andes).
1056 SmallVector<bool, 3> RISCVVecIntrinsicPragma;
1057
1058private:
1059 struct ImportedSubmodule {
1061 SourceLocation ImportLoc;
1062
1063 ImportedSubmodule(serialization::SubmoduleID ID, SourceLocation ImportLoc)
1064 : ID(ID), ImportLoc(ImportLoc) {}
1065 };
1066
1067 /// A list of modules that were imported by precompiled headers or
1068 /// any other non-module AST file and have not yet been made visible. If a
1069 /// module is made visible in the ASTReader, it will be transfered to
1070 /// \c PendingImportedModulesSema.
1071 SmallVector<ImportedSubmodule, 2> PendingImportedModules;
1072
1073 /// A list of modules that were imported by precompiled headers or
1074 /// any other non-module AST file and have not yet been made visible for Sema.
1075 SmallVector<ImportedSubmodule, 2> PendingImportedModulesSema;
1076 //@}
1077
1078 /// The system include root to be used when loading the
1079 /// precompiled header.
1080 std::string isysroot;
1081
1082 /// Whether to disable the normal validation performed on precompiled
1083 /// headers and module files when they are loaded.
1084 DisableValidationForModuleKind DisableValidationKind;
1085
1086 /// Whether to accept an AST file with compiler errors.
1087 bool AllowASTWithCompilerErrors;
1088
1089 /// Whether to accept an AST file that has a different configuration
1090 /// from the current compiler instance.
1091 bool AllowConfigurationMismatch;
1092
1093 /// Whether to validate system input files.
1094 bool ValidateSystemInputs;
1095
1096 /// Whether to force the validation of user input files.
1097 bool ForceValidateUserInputs;
1098
1099 /// Whether validate headers and module maps using hash based on contents.
1100 bool ValidateASTInputFilesContent;
1101
1102 /// Whether we are allowed to use the global module index.
1103 bool UseGlobalIndex;
1104
1105 /// Whether we have tried loading the global module index yet.
1106 bool TriedLoadingGlobalIndex = false;
1107
1108 ///Whether we are currently processing update records.
1109 bool ProcessingUpdateRecords = false;
1110
1111 using SwitchCaseMapTy = llvm::DenseMap<unsigned, SwitchCase *>;
1112
1113 /// Mapping from switch-case IDs in the chain to switch-case statements
1114 ///
1115 /// Statements usually don't have IDs, but switch cases need them, so that the
1116 /// switch statement can refer to them.
1117 SwitchCaseMapTy SwitchCaseStmts;
1118
1119 SwitchCaseMapTy *CurrSwitchCaseStmts;
1120
1121 /// The number of source location entries de-serialized from
1122 /// the PCH file.
1123 unsigned NumSLocEntriesRead = 0;
1124
1125 /// The number of source location entries in the chain.
1126 unsigned TotalNumSLocEntries = 0;
1127
1128 /// The number of statements (and expressions) de-serialized
1129 /// from the chain.
1130 unsigned NumStatementsRead = 0;
1131
1132 /// The total number of statements (and expressions) stored
1133 /// in the chain.
1134 unsigned TotalNumStatements = 0;
1135
1136 /// The number of macros de-serialized from the chain.
1137 unsigned NumMacrosRead = 0;
1138
1139 /// The total number of macros stored in the chain.
1140 unsigned TotalNumMacros = 0;
1141
1142 /// The number of lookups into identifier tables.
1143 unsigned NumIdentifierLookups = 0;
1144
1145 /// The number of lookups into identifier tables that succeed.
1146 unsigned NumIdentifierLookupHits = 0;
1147
1148 /// The number of selectors that have been read.
1149 unsigned NumSelectorsRead = 0;
1150
1151 /// The number of method pool entries that have been read.
1152 unsigned NumMethodPoolEntriesRead = 0;
1153
1154 /// The number of times we have looked up a selector in the method
1155 /// pool.
1156 unsigned NumMethodPoolLookups = 0;
1157
1158 /// The number of times we have looked up a selector in the method
1159 /// pool and found something.
1160 unsigned NumMethodPoolHits = 0;
1161
1162 /// The number of times we have looked up a selector in the method
1163 /// pool within a specific module.
1164 unsigned NumMethodPoolTableLookups = 0;
1165
1166 /// The number of times we have looked up a selector in the method
1167 /// pool within a specific module and found something.
1168 unsigned NumMethodPoolTableHits = 0;
1169
1170 /// The total number of method pool entries in the selector table.
1171 unsigned TotalNumMethodPoolEntries = 0;
1172
1173 /// Number of lexical decl contexts read/total.
1174 unsigned NumLexicalDeclContextsRead = 0, TotalLexicalDeclContexts = 0;
1175
1176 /// Number of visible decl contexts read/total.
1177 unsigned NumVisibleDeclContextsRead = 0, TotalVisibleDeclContexts = 0;
1178
1179 /// Number of module local visible decl contexts read/total.
1180 unsigned NumModuleLocalVisibleDeclContexts = 0,
1181 TotalModuleLocalVisibleDeclContexts = 0;
1182
1183 /// Number of TU Local decl contexts read/total
1184 unsigned NumTULocalVisibleDeclContexts = 0,
1185 TotalTULocalVisibleDeclContexts = 0;
1186
1187 /// Total size of modules, in bits, currently loaded
1188 uint64_t TotalModulesSizeInBits = 0;
1189
1190 /// Number of Decl/types that are currently deserializing.
1191 unsigned NumCurrentElementsDeserializing = 0;
1192
1193 /// Set false while we are in a state where we cannot safely pass deserialized
1194 /// "interesting" decls to the consumer inside FinishedDeserializing().
1195 /// This is used as a guard to avoid recursively entering the process of
1196 /// passing decls to consumer.
1197 bool CanPassDeclsToConsumer = true;
1198
1199 /// The set of identifiers that were read while the AST reader was
1200 /// (recursively) loading declarations.
1201 ///
1202 /// The declarations on the identifier chain for these identifiers will be
1203 /// loaded once the recursive loading has completed.
1204 llvm::MapVector<IdentifierInfo *, SmallVector<GlobalDeclID, 4>>
1205 PendingIdentifierInfos;
1206
1207 /// The set of lookup results that we have faked in order to support
1208 /// merging of partially deserialized decls but that we have not yet removed.
1209 llvm::SmallMapVector<const IdentifierInfo *, SmallVector<NamedDecl *, 2>, 16>
1210 PendingFakeLookupResults;
1211
1212 /// The generation number of each identifier, which keeps track of
1213 /// the last time we loaded information about this identifier.
1214 llvm::DenseMap<const IdentifierInfo *, unsigned> IdentifierGeneration;
1215
1216 /// Contains declarations and definitions that could be
1217 /// "interesting" to the ASTConsumer, when we get that AST consumer.
1218 ///
1219 /// "Interesting" declarations are those that have data that may
1220 /// need to be emitted, such as inline function definitions or
1221 /// Objective-C protocols.
1222 std::deque<Decl *> PotentiallyInterestingDecls;
1223
1224 /// The list of deduced function types that we have not yet read, because
1225 /// they might contain a deduced return type that refers to a local type
1226 /// declared within the function.
1227 SmallVector<std::pair<FunctionDecl *, serialization::TypeID>, 16>
1228 PendingDeducedFunctionTypes;
1229
1230 /// The list of deduced variable types that we have not yet read, because
1231 /// they might contain a deduced type that refers to a local type declared
1232 /// within the variable.
1233 SmallVector<std::pair<VarDecl *, serialization::TypeID>, 16>
1234 PendingDeducedVarTypes;
1235
1236 /// The list of redeclaration chains that still need to be
1237 /// reconstructed, and the local offset to the corresponding list
1238 /// of redeclarations.
1239 SmallVector<std::pair<Decl *, uint64_t>, 16> PendingDeclChains;
1240
1241 /// The list of canonical declarations whose redeclaration chains
1242 /// need to be marked as incomplete once we're done deserializing things.
1243 SmallVector<Decl *, 16> PendingIncompleteDeclChains;
1244
1245 /// The Decl IDs for the Sema/Lexical DeclContext of a Decl that has
1246 /// been loaded but its DeclContext was not set yet.
1247 struct PendingDeclContextInfo {
1248 Decl *D;
1249 GlobalDeclID SemaDC;
1250 GlobalDeclID LexicalDC;
1251 };
1252
1253 /// The set of Decls that have been loaded but their DeclContexts are
1254 /// not set yet.
1255 ///
1256 /// The DeclContexts for these Decls will be set once recursive loading has
1257 /// been completed.
1258 std::deque<PendingDeclContextInfo> PendingDeclContextInfos;
1259
1260 template <typename DeclTy>
1261 using DuplicateObjCDecls = std::pair<DeclTy *, DeclTy *>;
1262
1263 /// When resolving duplicate ivars from Objective-C extensions we don't error
1264 /// out immediately but check if can merge identical extensions. Not checking
1265 /// extensions for equality immediately because ivar deserialization isn't
1266 /// over yet at that point.
1267 llvm::SmallMapVector<DuplicateObjCDecls<ObjCCategoryDecl>,
1268 llvm::SmallVector<DuplicateObjCDecls<ObjCIvarDecl>, 4>,
1269 2>
1270 PendingObjCExtensionIvarRedeclarations;
1271
1272 /// Members that have been added to classes, for which the class has not yet
1273 /// been notified. CXXRecordDecl::addedMember will be called for each of
1274 /// these once recursive deserialization is complete.
1275 SmallVector<std::pair<CXXRecordDecl*, Decl*>, 4> PendingAddedClassMembers;
1276
1277 /// The set of NamedDecls that have been loaded, but are members of a
1278 /// context that has been merged into another context where the corresponding
1279 /// declaration is either missing or has not yet been loaded.
1280 ///
1281 /// We will check whether the corresponding declaration is in fact missing
1282 /// once recursing loading has been completed.
1283 llvm::SmallVector<NamedDecl *, 16> PendingOdrMergeChecks;
1284
1285 using DataPointers =
1286 std::pair<CXXRecordDecl *, struct CXXRecordDecl::DefinitionData *>;
1287 using ObjCInterfaceDataPointers =
1288 std::pair<ObjCInterfaceDecl *,
1289 struct ObjCInterfaceDecl::DefinitionData *>;
1290 using ObjCProtocolDataPointers =
1291 std::pair<ObjCProtocolDecl *, struct ObjCProtocolDecl::DefinitionData *>;
1292
1293 /// Record definitions in which we found an ODR violation.
1294 llvm::SmallDenseMap<CXXRecordDecl *, llvm::SmallVector<DataPointers, 2>, 2>
1295 PendingOdrMergeFailures;
1296
1297 /// C/ObjC record definitions in which we found an ODR violation.
1298 llvm::SmallDenseMap<RecordDecl *, llvm::SmallVector<RecordDecl *, 2>, 2>
1299 PendingRecordOdrMergeFailures;
1300
1301 /// Function definitions in which we found an ODR violation.
1302 llvm::SmallDenseMap<FunctionDecl *, llvm::SmallVector<FunctionDecl *, 2>, 2>
1303 PendingFunctionOdrMergeFailures;
1304
1305 /// Enum definitions in which we found an ODR violation.
1306 llvm::SmallDenseMap<EnumDecl *, llvm::SmallVector<EnumDecl *, 2>, 2>
1307 PendingEnumOdrMergeFailures;
1308
1309 /// ObjCInterfaceDecl in which we found an ODR violation.
1310 llvm::SmallDenseMap<ObjCInterfaceDecl *,
1311 llvm::SmallVector<ObjCInterfaceDataPointers, 2>, 2>
1312 PendingObjCInterfaceOdrMergeFailures;
1313
1314 /// ObjCProtocolDecl in which we found an ODR violation.
1315 llvm::SmallDenseMap<ObjCProtocolDecl *,
1316 llvm::SmallVector<ObjCProtocolDataPointers, 2>, 2>
1317 PendingObjCProtocolOdrMergeFailures;
1318
1319 /// DeclContexts in which we have diagnosed an ODR violation.
1320 llvm::SmallPtrSet<DeclContext*, 2> DiagnosedOdrMergeFailures;
1321
1322 /// The set of Objective-C categories that have been deserialized
1323 /// since the last time the declaration chains were linked.
1324 llvm::SmallPtrSet<ObjCCategoryDecl *, 16> CategoriesDeserialized;
1325
1326 /// The set of Objective-C class definitions that have already been
1327 /// loaded, for which we will need to check for categories whenever a new
1328 /// module is loaded.
1329 SmallVector<ObjCInterfaceDecl *, 16> ObjCClassesLoaded;
1330
1331 using KeyDeclsMap = llvm::DenseMap<Decl *, SmallVector<GlobalDeclID, 2>>;
1332
1333 /// A mapping from canonical declarations to the set of global
1334 /// declaration IDs for key declaration that have been merged with that
1335 /// canonical declaration. A key declaration is a formerly-canonical
1336 /// declaration whose module did not import any other key declaration for that
1337 /// entity. These are the IDs that we use as keys when finding redecl chains.
1338 KeyDeclsMap KeyDecls;
1339
1340 /// A mapping from DeclContexts to the semantic DeclContext that we
1341 /// are treating as the definition of the entity. This is used, for instance,
1342 /// when merging implicit instantiations of class templates across modules.
1343 llvm::DenseMap<DeclContext *, DeclContext *> MergedDeclContexts;
1344
1345 /// A mapping from canonical declarations of enums to their canonical
1346 /// definitions. Only populated when using modules in C++.
1347 llvm::DenseMap<EnumDecl *, EnumDecl *> EnumDefinitions;
1348
1349 /// A mapping from canonical declarations of records to their canonical
1350 /// definitions. Doesn't cover CXXRecordDecl.
1351 llvm::DenseMap<RecordDecl *, RecordDecl *> RecordDefinitions;
1352
1353 /// When reading a Stmt tree, Stmt operands are placed in this stack.
1354 SmallVector<Stmt *, 16> StmtStack;
1355
1356 /// What kind of records we are reading.
1357 enum ReadingKind {
1358 Read_None, Read_Decl, Read_Type, Read_Stmt
1359 };
1360
1361 /// What kind of records we are reading.
1362 ReadingKind ReadingKind = Read_None;
1363
1364 /// RAII object to change the reading kind.
1365 class ReadingKindTracker {
1366 ASTReader &Reader;
1367 enum ReadingKind PrevKind;
1368
1369 public:
1370 ReadingKindTracker(enum ReadingKind newKind, ASTReader &reader)
1371 : Reader(reader), PrevKind(Reader.ReadingKind) {
1372 Reader.ReadingKind = newKind;
1373 }
1374
1375 ReadingKindTracker(const ReadingKindTracker &) = delete;
1376 ReadingKindTracker &operator=(const ReadingKindTracker &) = delete;
1377 ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; }
1378 };
1379
1380 /// RAII object to mark the start of processing updates.
1381 class ProcessingUpdatesRAIIObj {
1382 ASTReader &Reader;
1383 bool PrevState;
1384
1385 public:
1386 ProcessingUpdatesRAIIObj(ASTReader &reader)
1387 : Reader(reader), PrevState(Reader.ProcessingUpdateRecords) {
1388 Reader.ProcessingUpdateRecords = true;
1389 }
1390
1391 ProcessingUpdatesRAIIObj(const ProcessingUpdatesRAIIObj &) = delete;
1392 ProcessingUpdatesRAIIObj &
1393 operator=(const ProcessingUpdatesRAIIObj &) = delete;
1394 ~ProcessingUpdatesRAIIObj() { Reader.ProcessingUpdateRecords = PrevState; }
1395 };
1396
1397 /// Suggested contents of the predefines buffer, after this
1398 /// PCH file has been processed.
1399 ///
1400 /// In most cases, this string will be empty, because the predefines
1401 /// buffer computed to build the PCH file will be identical to the
1402 /// predefines buffer computed from the command line. However, when
1403 /// there are differences that the PCH reader can work around, this
1404 /// predefines buffer may contain additional definitions.
1405 std::string SuggestedPredefines;
1406
1407 llvm::DenseMap<const Decl *, bool> DefinitionSource;
1408
1409 /// Friend functions that were defined but might have had their bodies
1410 /// removed.
1411 llvm::DenseSet<const FunctionDecl *> ThisDeclarationWasADefinitionSet;
1412
1413 bool shouldDisableValidationForFile(const serialization::ModuleFile &M) const;
1414
1415 /// Reads a statement from the specified cursor.
1416 Stmt *ReadStmtFromStream(ModuleFile &F);
1417
1418 /// Retrieve the stored information about an input file.
1419 serialization::InputFileInfo getInputFileInfo(ModuleFile &F, unsigned ID);
1420
1421 /// Retrieve the file entry and 'overridden' bit for an input
1422 /// file in the given module file.
1423 serialization::InputFile getInputFile(ModuleFile &F, unsigned ID,
1424 bool Complain = true);
1425
1426 /// The buffer used as the temporary backing storage for resolved paths.
1427 SmallString<0> PathBuf;
1428
1429 /// A wrapper around StringRef that temporarily borrows the underlying buffer.
1430 class TemporarilyOwnedStringRef {
1431 StringRef String;
1432 llvm::SaveAndRestore<SmallString<0>> UnderlyingBuffer;
1433
1434 public:
1435 TemporarilyOwnedStringRef(StringRef S, SmallString<0> &UnderlyingBuffer)
1436 : String(S), UnderlyingBuffer(UnderlyingBuffer, {}) {}
1437
1438 /// Return the wrapped \c StringRef that must be outlived by \c this.
1439 const StringRef *operator->() const & { return &String; }
1440 const StringRef &operator*() const & { return String; }
1441
1442 /// Make it harder to get a \c StringRef that outlives \c this.
1443 const StringRef *operator->() && = delete;
1444 const StringRef &operator*() && = delete;
1445 };
1446
1447public:
1448 /// Get the buffer for resolving paths.
1449 SmallString<0> &getPathBuf() { return PathBuf; }
1450
1451 /// Resolve \c Path in the context of module file \c M. The return value
1452 /// must go out of scope before the next call to \c ResolveImportedPath.
1453 static TemporarilyOwnedStringRef
1454 ResolveImportedPath(SmallString<0> &Buf, StringRef Path, ModuleFile &ModF);
1455 /// Resolve \c Path in the context of the \c Prefix directory. The return
1456 /// value must go out of scope before the next call to \c ResolveImportedPath.
1457 static TemporarilyOwnedStringRef
1458 ResolveImportedPath(SmallString<0> &Buf, StringRef Path, StringRef Prefix);
1459
1460 /// Resolve \c Path in the context of module file \c M.
1461 static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1462 StringRef Path,
1463 ModuleFile &ModF);
1464 /// Resolve \c Path in the context of the \c Prefix directory.
1465 static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1466 StringRef Path,
1467 StringRef Prefix);
1468
1469 /// Returns the first key declaration for the given declaration. This
1470 /// is one that is formerly-canonical (or still canonical) and whose module
1471 /// did not import any other key declaration of the entity.
1473 D = D->getCanonicalDecl();
1474 if (D->isFromASTFile())
1475 return D;
1476
1477 auto I = KeyDecls.find(D);
1478 if (I == KeyDecls.end() || I->second.empty())
1479 return D;
1480 return GetExistingDecl(I->second[0]);
1481 }
1482 const Decl *getKeyDeclaration(const Decl *D) {
1483 return getKeyDeclaration(const_cast<Decl*>(D));
1484 }
1485
1486 /// Run a callback on each imported key declaration of \p D.
1487 template <typename Fn>
1488 void forEachImportedKeyDecl(const Decl *D, Fn Visit) {
1489 D = D->getCanonicalDecl();
1490 if (D->isFromASTFile())
1491 Visit(D);
1492
1493 auto It = KeyDecls.find(const_cast<Decl*>(D));
1494 if (It != KeyDecls.end())
1495 for (auto ID : It->second)
1496 Visit(GetExistingDecl(ID));
1497 }
1498
1499 /// Get the loaded lookup tables for \p Primary, if any.
1501 getLoadedLookupTables(DeclContext *Primary) const;
1502
1505
1507 getTULocalLookupTables(DeclContext *Primary) const;
1508
1509 /// Get the loaded specializations lookup tables for \p D,
1510 /// if any.
1512 getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial);
1513
1514 /// If we have any unloaded specialization for \p D
1515 bool haveUnloadedSpecializations(const Decl *D) const;
1516
1527
1529 SourceLocation ImportLoc, ModuleFile *ImportedBy,
1531 off_t ExpectedSize, time_t ExpectedModTime,
1532 ASTFileSignature ExpectedSignature,
1533 unsigned ClientLoadCapabilities);
1534
1535private:
1536 ASTReadResult ReadControlBlock(ModuleFile &F,
1538 const ModuleFile *ImportedBy,
1539 unsigned ClientLoadCapabilities);
1540 static ASTReadResult
1541 ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef Filename,
1542 unsigned ClientLoadCapabilities,
1543 bool AllowCompatibleConfigurationMismatch,
1544 ASTReaderListener &Listener,
1545 std::string &SuggestedPredefines);
1546
1547 /// Read the unhashed control block.
1548 ///
1549 /// This has no effect on \c F.Stream, instead creating a fresh cursor from
1550 /// \c F.Data and reading ahead.
1551 ASTReadResult readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
1552 unsigned ClientLoadCapabilities);
1553
1554 static ASTReadResult readUnhashedControlBlockImpl(
1555 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
1556 unsigned ClientLoadCapabilities,
1557 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
1558 bool ValidateDiagnosticOptions);
1559
1560 llvm::Error ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities);
1561 llvm::Error ReadExtensionBlock(ModuleFile &F);
1562 void ReadModuleOffsetMap(ModuleFile &F) const;
1563 void ParseLineTable(ModuleFile &F, const RecordData &Record);
1564 llvm::Error ReadSourceManagerBlock(ModuleFile &F);
1565 SourceLocation getImportLocation(ModuleFile *F);
1566
1567 /// The first element is `std::nullopt` if relocation check should be skipped.
1568 /// Otherwise, the optional holds a pointer to the discovered module.
1569 /// The pointer can be `nullptr` if the discovery was unsuccessful.
1570 /// The second element determines whether to emit related errors.
1571 using RelocationResult = std::pair<std::optional<Module *>, bool>;
1572
1573 /// Determine whether a relocation check for a module should be performed
1574 /// by attempting to resolve the same module via lookup.
1575 /// If so, also determine whether to emit errors for the relocation.
1576 /// A relocated module is defined as a module that is either no longer
1577 /// resolvable from the modulemap or search path it originally compiled it's
1578 /// definition from.
1579 RelocationResult getModuleForRelocationChecks(ModuleFile &F,
1580 bool DirectoryCheck = false);
1581 ASTReadResult ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
1582 const ModuleFile *ImportedBy,
1583 unsigned ClientLoadCapabilities);
1584 static bool ParseLanguageOptions(const RecordData &Record,
1585 StringRef ModuleFilename, bool Complain,
1586 ASTReaderListener &Listener,
1587 bool AllowCompatibleDifferences);
1588 static bool ParseCodeGenOptions(const RecordData &Record,
1589 StringRef ModuleFilename, bool Complain,
1590 ASTReaderListener &Listener,
1591 bool AllowCompatibleDifferences);
1592 static bool ParseTargetOptions(const RecordData &Record,
1593 StringRef ModuleFilename, bool Complain,
1594 ASTReaderListener &Listener,
1595 bool AllowCompatibleDifferences);
1596 static bool ParseDiagnosticOptions(const RecordData &Record,
1597 StringRef ModuleFilename, bool Complain,
1598 ASTReaderListener &Listener);
1599 static bool ParseFileSystemOptions(const RecordData &Record, bool Complain,
1600 ASTReaderListener &Listener);
1601 static bool ParseHeaderSearchOptions(const RecordData &Record,
1602 StringRef ModuleFilename, bool Complain,
1603 ASTReaderListener &Listener);
1604 static bool ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
1605 ASTReaderListener &Listener);
1606 static bool ParsePreprocessorOptions(const RecordData &Record,
1607 StringRef ModuleFilename, bool Complain,
1608 ASTReaderListener &Listener,
1609 std::string &SuggestedPredefines);
1610
1611 struct RecordLocation {
1612 ModuleFile *F;
1613 uint64_t Offset;
1614
1615 RecordLocation(ModuleFile *M, uint64_t O) : F(M), Offset(O) {}
1616 };
1617
1618 QualType readTypeRecord(serialization::TypeID ID);
1619 RecordLocation TypeCursorForIndex(serialization::TypeID ID);
1620 void LoadedDecl(unsigned Index, Decl *D);
1621 Decl *ReadDeclRecord(GlobalDeclID ID);
1622 void markIncompleteDeclChain(Decl *D);
1623
1624 /// Returns the most recent declaration of a declaration (which must be
1625 /// of a redeclarable kind) that is either local or has already been loaded
1626 /// merged into its redecl chain.
1627 Decl *getMostRecentExistingDecl(Decl *D);
1628
1629 RecordLocation DeclCursorForID(GlobalDeclID ID, SourceLocation &Location);
1630 void loadDeclUpdateRecords(PendingUpdateRecord &Record);
1631 void loadPendingDeclChain(Decl *D, uint64_t LocalOffset);
1632 void loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
1633 unsigned PreviousGeneration = 0);
1634
1635 RecordLocation getLocalBitOffset(uint64_t GlobalOffset);
1636 uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset);
1637
1638 /// Returns the first preprocessed entity ID that begins or ends after
1639 /// \arg Loc.
1640 unsigned findPreprocessedEntity(SourceLocation Loc, bool EndsAfter) const;
1641
1642 /// Find the next module that contains entities and return the ID
1643 /// of the first entry.
1644 ///
1645 /// \param SLocMapI points at a chunk of a module that contains no
1646 /// preprocessed entities or the entities it contains are not the
1647 /// ones we are looking for.
1648 unsigned findNextPreprocessedEntity(
1650
1651 /// Returns (ModuleFile, Local index) pair for \p GlobalIndex of a
1652 /// preprocessed entity.
1653 std::pair<ModuleFile *, unsigned>
1654 getModulePreprocessedEntity(unsigned GlobalIndex);
1655
1656 /// Returns (begin, end) pair for the preprocessed entities of a
1657 /// particular module.
1658 llvm::iterator_range<PreprocessingRecord::iterator>
1659 getModulePreprocessedEntities(ModuleFile &Mod) const;
1660
1661 bool canRecoverFromOutOfDate(StringRef ModuleFileName,
1662 unsigned ClientLoadCapabilities);
1663
1664public:
1666 : public llvm::iterator_adaptor_base<
1667 ModuleDeclIterator, const serialization::unaligned_decl_id_t *,
1668 std::random_access_iterator_tag, const Decl *, ptrdiff_t,
1669 const Decl *, const Decl *> {
1670 ASTReader *Reader = nullptr;
1671 ModuleFile *Mod = nullptr;
1672
1673 public:
1674 ModuleDeclIterator() : iterator_adaptor_base(nullptr) {}
1675
1678 : iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
1679
1680 value_type operator*() const {
1681 LocalDeclID ID = LocalDeclID::get(*Reader, *Mod, *I);
1682 return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, ID));
1683 }
1684
1685 value_type operator->() const { return **this; }
1686
1687 bool operator==(const ModuleDeclIterator &RHS) const {
1688 assert(Reader == RHS.Reader && Mod == RHS.Mod);
1689 return I == RHS.I;
1690 }
1691 };
1692
1693 llvm::iterator_range<ModuleDeclIterator>
1695
1696private:
1697 bool isConsumerInterestedIn(Decl *D);
1698 void PassInterestingDeclsToConsumer();
1699 void PassInterestingDeclToConsumer(Decl *D);
1700 void PassVTableToConsumer(CXXRecordDecl *RD);
1701
1702 void finishPendingActions();
1703 void diagnoseOdrViolations();
1704
1705 void pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name);
1706
1707 void addPendingDeclContextInfo(Decl *D, GlobalDeclID SemaDC,
1708 GlobalDeclID LexicalDC) {
1709 assert(D);
1710 PendingDeclContextInfo Info = { D, SemaDC, LexicalDC };
1711 PendingDeclContextInfos.push_back(Info);
1712 }
1713
1714 /// Produce an error diagnostic and return true.
1715 ///
1716 /// This routine should only be used for fatal errors that have to
1717 /// do with non-routine failures (e.g., corrupted AST file).
1718 void Error(StringRef Msg) const;
1719 void Error(unsigned DiagID, StringRef Arg1 = StringRef(),
1720 StringRef Arg2 = StringRef(), StringRef Arg3 = StringRef()) const;
1721 void Error(llvm::Error &&Err) const;
1722
1723 /// Translate a \param GlobalDeclID to the index of DeclsLoaded array.
1724 unsigned translateGlobalDeclIDToIndex(GlobalDeclID ID) const;
1725
1726 /// Translate an \param IdentifierID ID to the index of IdentifiersLoaded
1727 /// array and the corresponding module file.
1728 std::pair<ModuleFile *, unsigned>
1729 translateIdentifierIDToIndex(serialization::IdentifierID ID) const;
1730
1731 /// Translate an \param MacroID ID to the index of MacrosLoaded
1732 /// array and the corresponding module file.
1733 std::pair<ModuleFile *, unsigned>
1734 translateMacroIDToIndex(serialization::MacroID ID) const;
1735
1736 unsigned translatePreprocessedEntityIDToIndex(
1738
1739 /// Translate an \param TypeID ID to the index of TypesLoaded
1740 /// array and the corresponding module file.
1741 std::pair<ModuleFile *, unsigned>
1742 translateTypeIDToIndex(serialization::TypeID ID) const;
1743
1744 /// Get a predefined Decl from ASTContext.
1745 Decl *getPredefinedDecl(PredefinedDeclIDs ID);
1746
1747public:
1748 /// Load the AST file and validate its contents against the given
1749 /// Preprocessor.
1750 ///
1751 /// \param PP the preprocessor associated with the context in which this
1752 /// precompiled header will be loaded.
1753 ///
1754 /// \param Context the AST context that this precompiled header will be
1755 /// loaded into, if any.
1756 ///
1757 /// \param PCHContainerRdr the PCHContainerOperations to use for loading and
1758 /// creating modules.
1759 ///
1760 /// \param Extensions the list of module file extensions that can be loaded
1761 /// from the AST files.
1762 ///
1763 /// \param isysroot If non-NULL, the system include path specified by the
1764 /// user. This is only used with relocatable PCH files. If non-NULL,
1765 /// a relocatable PCH file will use the default path "/".
1766 ///
1767 /// \param DisableValidationKind If set, the AST reader will suppress most
1768 /// of its regular consistency checking, allowing the use of precompiled
1769 /// headers and module files that cannot be determined to be compatible.
1770 ///
1771 /// \param AllowASTWithCompilerErrors If true, the AST reader will accept an
1772 /// AST file the was created out of an AST with compiler errors,
1773 /// otherwise it will reject it.
1774 ///
1775 /// \param AllowConfigurationMismatch If true, the AST reader will not check
1776 /// for configuration differences between the AST file and the invocation.
1777 ///
1778 /// \param ValidateSystemInputs If true, the AST reader will validate
1779 /// system input files in addition to user input files. This is only
1780 /// meaningful if \p DisableValidation is false.
1781 ///
1782 /// \param UseGlobalIndex If true, the AST reader will try to load and use
1783 /// the global module index.
1784 ///
1785 /// \param ReadTimer If non-null, a timer used to track the time spent
1786 /// deserializing.
1787 ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context,
1788 const PCHContainerReader &PCHContainerRdr,
1789 const CodeGenOptions &CodeGenOpts,
1790 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
1791 StringRef isysroot = "",
1792 DisableValidationForModuleKind DisableValidationKind =
1794 bool AllowASTWithCompilerErrors = false,
1795 bool AllowConfigurationMismatch = false,
1796 bool ValidateSystemInputs = false,
1797 bool ForceValidateUserInputs = true,
1798 bool ValidateASTInputFilesContent = false,
1799 bool UseGlobalIndex = true,
1800 std::unique_ptr<llvm::Timer> ReadTimer = {});
1801 ASTReader(const ASTReader &) = delete;
1802 ASTReader &operator=(const ASTReader &) = delete;
1803 ~ASTReader() override;
1804
1805 SourceManager &getSourceManager() const { return SourceMgr; }
1806 FileManager &getFileManager() const { return FileMgr; }
1807 DiagnosticsEngine &getDiags() const { return Diags; }
1808 const CodeGenOptions &getCodeGenOpts() const { return CodeGenOpts; }
1809
1810 /// Flags that indicate what kind of AST loading failures the client
1811 /// of the AST reader can directly handle.
1812 ///
1813 /// When a client states that it can handle a particular kind of failure,
1814 /// the AST reader will not emit errors when producing that kind of failure.
1816 /// The client can't handle any AST loading failures.
1818
1819 /// The client can handle an AST file that cannot load because it
1820 /// is missing.
1822
1823 /// The client can handle an AST file that cannot load because it
1824 /// is out-of-date relative to its input files.
1826
1827 /// The client can handle an AST file that cannot load because it
1828 /// was built with a different version of Clang.
1830
1831 /// The client can handle an AST file that cannot load because it's
1832 /// compiled configuration doesn't match that of the context it was
1833 /// loaded into.
1835
1836 /// If a module file is marked with errors treat it as out-of-date so the
1837 /// caller can rebuild it.
1839 };
1840
1841 /// Load the AST file designated by the given file name.
1842 ///
1843 /// \param FileName The name of the AST file to load.
1844 ///
1845 /// \param Type The kind of AST being loaded, e.g., PCH, module, main file,
1846 /// or preamble.
1847 ///
1848 /// \param ImportLoc the location where the module file will be considered as
1849 /// imported from. For non-module AST types it should be invalid.
1850 ///
1851 /// \param ClientLoadCapabilities The set of client load-failure
1852 /// capabilities, represented as a bitset of the enumerators of
1853 /// LoadFailureCapabilities.
1854 ///
1855 /// \param LoadedModuleFile The optional out-parameter refers to the new
1856 /// loaded modules. In case the module specified by FileName is already
1857 /// loaded, the module file pointer referred by NewLoadedModuleFile wouldn't
1858 /// change. Otherwise if the AST file get loaded successfully,
1859 /// NewLoadedModuleFile would refer to the address of the new loaded top level
1860 /// module. The state of NewLoadedModuleFile is unspecified if the AST file
1861 /// isn't loaded successfully.
1863 SourceLocation ImportLoc,
1864 unsigned ClientLoadCapabilities,
1865 ModuleFile **NewLoadedModuleFile = nullptr);
1866
1867 /// Make the entities in the given module and any of its (non-explicit)
1868 /// submodules visible to name lookup.
1869 ///
1870 /// \param Mod The module whose names should be made visible.
1871 ///
1872 /// \param NameVisibility The level of visibility to give the names in the
1873 /// module. Visibility can only be increased over time.
1874 ///
1875 /// \param ImportLoc The location at which the import occurs.
1876 void makeModuleVisible(Module *Mod,
1877 Module::NameVisibilityKind NameVisibility,
1878 SourceLocation ImportLoc);
1879
1880 /// Make the names within this set of hidden names visible.
1881 void makeNamesVisible(const HiddenNames &Names, Module *Owner);
1882
1883 /// Note that MergedDef is a redefinition of the canonical definition
1884 /// Def, so Def should be visible whenever MergedDef is.
1885 void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef);
1886
1887 /// Take the AST callbacks listener.
1888 std::unique_ptr<ASTReaderListener> takeListener() {
1889 return std::move(Listener);
1890 }
1891
1892 /// Set the AST callbacks listener.
1893 void setListener(std::unique_ptr<ASTReaderListener> Listener) {
1894 this->Listener = std::move(Listener);
1895 }
1896
1897 /// Add an AST callback listener.
1898 ///
1899 /// Takes ownership of \p L.
1900 void addListener(std::unique_ptr<ASTReaderListener> L) {
1901 if (Listener)
1902 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1903 std::move(Listener));
1904 Listener = std::move(L);
1905 }
1906
1907 /// RAII object to temporarily add an AST callback listener.
1909 ASTReader &Reader;
1910 bool Chained = false;
1911
1912 public:
1913 ListenerScope(ASTReader &Reader, std::unique_ptr<ASTReaderListener> L)
1914 : Reader(Reader) {
1915 auto Old = Reader.takeListener();
1916 if (Old) {
1917 Chained = true;
1918 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1919 std::move(Old));
1920 }
1921 Reader.setListener(std::move(L));
1922 }
1923
1925 auto New = Reader.takeListener();
1926 if (Chained)
1927 Reader.setListener(static_cast<ChainedASTReaderListener *>(New.get())
1928 ->takeSecond());
1929 }
1930 };
1931
1932 /// Set the AST deserialization listener.
1934 bool TakeOwnership = false);
1935
1936 /// Get the AST deserialization listener.
1938 return DeserializationListener;
1939 }
1940
1941 /// Determine whether this AST reader has a global index.
1942 bool hasGlobalIndex() const { return (bool)GlobalIndex; }
1943
1944 /// Return global module index.
1945 GlobalModuleIndex *getGlobalIndex() { return GlobalIndex.get(); }
1946
1947 /// Reset reader for a reload try.
1948 void resetForReload() { TriedLoadingGlobalIndex = false; }
1949
1950 /// Attempts to load the global index.
1951 ///
1952 /// \returns true if loading the global index has failed for any reason.
1953 bool loadGlobalIndex();
1954
1955 /// Determine whether we tried to load the global index, but failed,
1956 /// e.g., because it is out-of-date or does not exist.
1957 bool isGlobalIndexUnavailable() const;
1958
1959 /// Initializes the ASTContext
1960 void InitializeContext();
1961
1962 /// Update the state of Sema after loading some additional modules.
1963 void UpdateSema();
1964
1965 /// Finalizes the AST reader's state before writing an AST file to
1966 /// disk.
1967 ///
1968 /// This operation may undo temporary state in the AST that should not be
1969 /// emitted.
1970 void finalizeForWriting();
1971
1972 /// Retrieve the module manager.
1973 ModuleManager &getModuleManager() { return ModuleMgr; }
1974 const ModuleManager &getModuleManager() const { return ModuleMgr; }
1975
1976 /// Retrieve the preprocessor.
1977 Preprocessor &getPreprocessor() const { return PP; }
1978
1979 /// Retrieve the name of the original source file name for the primary
1980 /// module file.
1982 return ModuleMgr.getPrimaryModule().OriginalSourceFileName;
1983 }
1984
1985 /// Retrieve the name of the original source file name directly from
1986 /// the AST file, without actually loading the AST file.
1987 static std::string
1988 getOriginalSourceFile(const std::string &ASTFileName, FileManager &FileMgr,
1989 const PCHContainerReader &PCHContainerRdr,
1990 DiagnosticsEngine &Diags);
1991
1992 /// Read the control block for the named AST file.
1993 ///
1994 /// \returns true if an error occurred, false otherwise.
1995 static bool readASTFileControlBlock(
1996 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
1997 const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
1998 ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
1999 unsigned ClientLoadCapabilities = ARR_ConfigurationMismatch |
2001
2002 /// Determine whether the given AST file is acceptable to load into a
2003 /// translation unit with the given language and target options.
2004 static bool isAcceptableASTFile(
2005 StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
2006 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
2007 const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts,
2008 const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts,
2009 StringRef SpecificModuleCachePath,
2010 bool RequireStrictOptionMatches = false);
2011
2012 /// Returns the suggested contents of the predefines buffer,
2013 /// which contains a (typically-empty) subset of the predefines
2014 /// build prior to including the precompiled header.
2015 const std::string &getSuggestedPredefines() { return SuggestedPredefines; }
2016
2017 /// Read a preallocated preprocessed entity from the external source.
2018 ///
2019 /// \returns null if an error occurred that prevented the preprocessed
2020 /// entity from being loaded.
2021 PreprocessedEntity *ReadPreprocessedEntity(unsigned Index) override;
2022
2023 /// Returns a pair of [Begin, End) indices of preallocated
2024 /// preprocessed entities that \p Range encompasses.
2025 std::pair<unsigned, unsigned>
2027
2028 /// Optionally returns true or false if the preallocated preprocessed
2029 /// entity with index \p Index came from file \p FID.
2030 std::optional<bool> isPreprocessedEntityInFileID(unsigned Index,
2031 FileID FID) override;
2032
2033 /// Read a preallocated skipped range from the external source.
2034 SourceRange ReadSkippedRange(unsigned Index) override;
2035
2036 /// Read the header file information for the given file entry.
2038
2040
2041 /// Returns the number of source locations found in the chain.
2042 unsigned getTotalNumSLocs() const {
2043 return TotalNumSLocEntries;
2044 }
2045
2046 /// Returns the number of identifiers found in the chain.
2047 unsigned getTotalNumIdentifiers() const {
2048 return static_cast<unsigned>(IdentifiersLoaded.size());
2049 }
2050
2051 /// Returns the number of macros found in the chain.
2052 unsigned getTotalNumMacros() const {
2053 return static_cast<unsigned>(MacrosLoaded.size());
2054 }
2055
2056 /// Returns the number of types found in the chain.
2057 unsigned getTotalNumTypes() const {
2058 return static_cast<unsigned>(TypesLoaded.size());
2059 }
2060
2061 /// Returns the number of declarations found in the chain.
2062 unsigned getTotalNumDecls() const {
2063 return static_cast<unsigned>(DeclsLoaded.size());
2064 }
2065
2066 /// Returns the number of submodules known.
2067 unsigned getTotalNumSubmodules() const {
2068 return static_cast<unsigned>(SubmodulesLoaded.size());
2069 }
2070
2071 /// Returns the number of selectors found in the chain.
2072 unsigned getTotalNumSelectors() const {
2073 return static_cast<unsigned>(SelectorsLoaded.size());
2074 }
2075
2076 /// Returns the number of preprocessed entities known to the AST
2077 /// reader.
2079 unsigned Result = 0;
2080 for (const auto &M : ModuleMgr)
2081 Result += M.NumPreprocessedEntities;
2082 return Result;
2083 }
2084
2085 /// Resolve a type ID into a type, potentially building a new
2086 /// type.
2088
2089 /// Resolve a local type ID within a given AST file into a type.
2091
2092 /// Map a local type ID within a given AST file into a global type ID.
2095
2096 /// Read a type from the current position in the given record, which
2097 /// was read from the given AST file.
2098 QualType readType(ModuleFile &F, const RecordData &Record, unsigned &Idx) {
2099 if (Idx >= Record.size())
2100 return {};
2101
2102 return getLocalType(F, Record[Idx++]);
2103 }
2104
2105 /// Map from a local declaration ID within a given module to a
2106 /// global declaration ID.
2108
2109 /// Returns true if global DeclID \p ID originated from module \p M.
2110 bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const;
2111
2112 /// Retrieve the module file that owns the given declaration, or NULL
2113 /// if the declaration is not from a module file.
2114 ModuleFile *getOwningModuleFile(const Decl *D) const;
2116
2117 /// Returns the source location for the decl \p ID.
2119
2120 /// Resolve a declaration ID into a declaration, potentially
2121 /// building a new declaration.
2123 Decl *GetExternalDecl(GlobalDeclID ID) override;
2124
2125 /// Resolve a declaration ID into a declaration. Return 0 if it's not
2126 /// been loaded yet.
2128
2129 /// Reads a declaration with the given local ID in the given module.
2131 return GetDecl(getGlobalDeclID(F, LocalID));
2132 }
2133
2134 /// Reads a declaration with the given local ID in the given module.
2135 ///
2136 /// \returns The requested declaration, casted to the given return type.
2137 template <typename T> T *GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID) {
2138 return cast_or_null<T>(GetLocalDecl(F, LocalID));
2139 }
2140
2141 /// Map a global declaration ID into the declaration ID used to
2142 /// refer to this declaration within the given module fule.
2143 ///
2144 /// \returns the global ID of the given declaration as known in the given
2145 /// module file.
2147 GlobalDeclID GlobalID);
2148
2149 /// Reads a macro ID from the given position in a record in the
2150 /// given module.
2151 ///
2152 /// \returns The declaration ID read from the record, adjusted to a global
2153 /// Macro ID.
2155 ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx);
2156
2157 /// Reads a declaration ID from the given position in a record in the
2158 /// given module.
2159 ///
2160 /// \returns The declaration ID read from the record, adjusted to a global ID.
2162 unsigned &Idx);
2163
2164 /// Reads a declaration from the given position in a record in the
2165 /// given module.
2166 Decl *ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2167 return GetDecl(ReadDeclID(F, R, I));
2168 }
2169
2170 /// Reads a declaration from the given position in a record in the
2171 /// given module.
2172 ///
2173 /// \returns The declaration read from this location, casted to the given
2174 /// result type.
2175 template <typename T>
2176 T *ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2177 return cast_or_null<T>(GetDecl(ReadDeclID(F, R, I)));
2178 }
2179
2180 /// If any redeclarations of \p D have been imported since it was
2181 /// last checked, this digs out those redeclarations and adds them to the
2182 /// redeclaration chain for \p D.
2183 void CompleteRedeclChain(const Decl *D) override;
2184
2185 CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override;
2186
2187 /// Resolve the offset of a statement into a statement.
2188 ///
2189 /// This operation will read a new statement from the external
2190 /// source each time it is called, and is meant to be used via a
2191 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
2192 Stmt *GetExternalDeclStmt(uint64_t Offset) override;
2193
2194 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
2195 /// specified cursor. Read the abbreviations that are at the top of the block
2196 /// and then leave the cursor pointing into the block.
2197 static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
2198 unsigned BlockID,
2199 uint64_t *StartOfBlockOffset = nullptr);
2200
2201 bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override;
2202
2203 bool
2205 ArrayRef<TemplateArgument> TemplateArgs) override;
2206
2207 /// Finds all the visible declarations with a given name.
2208 /// The current implementation of this method just loads the entire
2209 /// lookup table as unmaterialized references.
2211 DeclarationName Name,
2212 const DeclContext *OriginalDC) override;
2213
2214 /// Read all of the declarations lexically stored in a
2215 /// declaration context.
2216 ///
2217 /// \param DC The declaration context whose declarations will be
2218 /// read.
2219 ///
2220 /// \param IsKindWeWant A predicate indicating which declaration kinds
2221 /// we are interested in.
2222 ///
2223 /// \param Decls Vector that will contain the declarations loaded
2224 /// from the external source. The caller is responsible for merging
2225 /// these declarations with any declarations already stored in the
2226 /// declaration context.
2227 void
2229 llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
2230 SmallVectorImpl<Decl *> &Decls) override;
2231
2232 /// Get the decls that are contained in a file in the Offset/Length
2233 /// range. \p Length can be 0 to indicate a point at \p Offset instead of
2234 /// a range.
2235 void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length,
2236 SmallVectorImpl<Decl *> &Decls) override;
2237
2238 /// Notify ASTReader that we started deserialization of
2239 /// a decl or type so until FinishedDeserializing is called there may be
2240 /// decls that are initializing. Must be paired with FinishedDeserializing.
2241 void StartedDeserializing() override;
2242
2243 /// Notify ASTReader that we finished the deserialization of
2244 /// a decl or type. Must be paired with StartedDeserializing.
2245 void FinishedDeserializing() override;
2246
2247 /// Function that will be invoked when we begin parsing a new
2248 /// translation unit involving this external AST source.
2249 ///
2250 /// This function will provide all of the external definitions to
2251 /// the ASTConsumer.
2252 void StartTranslationUnit(ASTConsumer *Consumer) override;
2253
2254 /// Print some statistics about AST usage.
2255 void PrintStats() override;
2256
2257 /// Dump information about the AST reader to standard error.
2258 void dump();
2259
2260 /// Return the amount of memory used by memory buffers, breaking down
2261 /// by heap-backed versus mmap'ed memory.
2262 void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override;
2263
2264 /// Initialize the semantic source with the Sema instance
2265 /// being used to perform semantic analysis on the abstract syntax
2266 /// tree.
2267 void InitializeSema(Sema &S) override;
2268
2269 /// Inform the semantic consumer that Sema is no longer available.
2270 void ForgetSema() override { SemaObj = nullptr; }
2271
2272 /// Retrieve the IdentifierInfo for the named identifier.
2273 ///
2274 /// This routine builds a new IdentifierInfo for the given identifier. If any
2275 /// declarations with this name are visible from translation unit scope, their
2276 /// declarations will be deserialized and introduced into the declaration
2277 /// chain of the identifier.
2278 IdentifierInfo *get(StringRef Name) override;
2279
2280 /// Retrieve an iterator into the set of all identifiers
2281 /// in all loaded AST files.
2283
2284 /// Load the contents of the global method pool for a given
2285 /// selector.
2286 void ReadMethodPool(Selector Sel) override;
2287
2288 /// Load the contents of the global method pool for a given
2289 /// selector if necessary.
2290 void updateOutOfDateSelector(Selector Sel) override;
2291
2292 /// Load the set of namespaces that are known to the external source,
2293 /// which will be used during typo correction.
2295 SmallVectorImpl<NamespaceDecl *> &Namespaces) override;
2296
2298 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) override;
2299
2300 void ReadMismatchingDeleteExpressions(llvm::MapVector<
2301 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
2302 Exprs) override;
2303
2305 SmallVectorImpl<VarDecl *> &TentativeDefs) override;
2306
2309
2312
2314
2316 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) override;
2317
2319 llvm::SmallSetVector<Decl *, 4> &Decls) override;
2320
2322 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) override;
2323
2325 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) override;
2326
2328 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs)
2329 override;
2330
2332
2334 SmallVectorImpl<std::pair<ValueDecl *,
2335 SourceLocation>> &Pending) override;
2336
2338 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
2339 &LPTMap) override;
2340
2341 /// Load a selector from disk, registering its ID if it exists.
2342 void LoadSelector(Selector Sel);
2343
2346 const SmallVectorImpl<GlobalDeclID> &DeclIDs,
2347 SmallVectorImpl<Decl *> *Decls = nullptr);
2348
2349 /// Report a diagnostic.
2350 DiagnosticBuilder Diag(unsigned DiagID) const;
2351
2352 /// Report a diagnostic.
2353 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const;
2354
2356 llvm::function_ref<void()> Fn);
2357
2359
2361 unsigned &Idx) {
2363 }
2364
2366 // Note that we are loading an identifier.
2367 Deserializing AnIdentifier(this);
2368
2369 return DecodeIdentifierInfo(ID);
2370 }
2371
2372 IdentifierInfo *getLocalIdentifier(ModuleFile &M, uint64_t LocalID);
2373
2375 uint64_t LocalID);
2376
2377 void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo);
2378
2379 /// Retrieve the macro with the given ID.
2381
2382 /// Retrieve the global macro ID corresponding to the given local
2383 /// ID within the given module file.
2385 serialization::MacroID LocalID);
2386
2387 /// Read the source location entry with index ID.
2388 bool ReadSLocEntry(int ID) override;
2389 /// Get the index ID for the loaded SourceLocation offset.
2390 int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override;
2391 /// Try to read the offset of the SLocEntry at the given index in the given
2392 /// module file.
2394 unsigned Index);
2395
2396 /// Retrieve the module import location and module name for the
2397 /// given source manager entry ID.
2398 std::pair<SourceLocation, StringRef> getModuleImportLoc(int ID) override;
2399
2400 /// Retrieve the global submodule ID given a module and its local ID
2401 /// number.
2403 unsigned LocalID) const;
2404
2405 /// Retrieve the submodule that corresponds to a global submodule ID.
2406 Module *getSubmodule(uint32_t GlobalID) override;
2407
2408 /// Retrieve the module that corresponds to the given module ID.
2409 ///
2410 /// Note: overrides method in ExternalASTSource
2411 Module *getModule(unsigned ID) override;
2412
2413 /// Retrieve the module file with a given local ID within the specified
2414 /// ModuleFile.
2415 ModuleFile *getLocalModuleFile(ModuleFile &M, unsigned ID) const;
2416
2417 /// Get an ID for the given module file.
2418 unsigned getModuleFileID(ModuleFile *M);
2419
2420 /// Return a descriptor for the corresponding module.
2421 std::optional<ASTSourceDescriptor> getSourceDescriptor(unsigned ID) override;
2422
2423 ExtKind hasExternalDefinitions(const Decl *D) override;
2424
2425 bool wasThisDeclarationADefinition(const FunctionDecl *FD) override;
2426
2427 /// Retrieve a selector from the given module with its local ID
2428 /// number.
2429 Selector getLocalSelector(ModuleFile &M, unsigned LocalID);
2430
2432
2435
2436 Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx) {
2437 return getLocalSelector(M, Record[Idx++]);
2438 }
2439
2440 /// Retrieve the global selector ID that corresponds to this
2441 /// the local selector ID in a given module.
2443 unsigned LocalID) const;
2444
2445 /// Read the contents of a CXXCtorInitializer array.
2446 CXXCtorInitializer **GetExternalCXXCtorInitializers(uint64_t Offset) override;
2447
2448 /// Read a AlignPackInfo from raw form.
2452
2454
2455 /// Read a source location from raw form and return it in its
2456 /// originating module file's source location space.
2457 std::pair<SourceLocation, unsigned>
2461
2462 /// Read a source location from raw form.
2464 if (!MF.ModuleOffsetMap.empty())
2465 ReadModuleOffsetMap(MF);
2466
2467 auto [Loc, ModuleFileIndex] = ReadUntranslatedSourceLocation(Raw);
2468 ModuleFile *OwningModuleFile =
2469 ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
2470
2471 assert(!SourceMgr.isLoadedSourceLocation(Loc) &&
2472 "Run out source location space");
2473
2474 return TranslateSourceLocation(*OwningModuleFile, Loc);
2475 }
2476
2477 /// Translate a source location from another module file's source
2478 /// location space into ours.
2480 SourceLocation Loc) const {
2481 if (Loc.isInvalid())
2482 return Loc;
2483
2484 // FIXME: TranslateSourceLocation is not re-enterable. It is problematic
2485 // to call TranslateSourceLocation on a translated source location.
2486 // We either need a method to know whether or not a source location is
2487 // translated or refactor the code to make it clear that
2488 // TranslateSourceLocation won't be called with translated source location.
2489
2490 return Loc.getLocWithOffset(ModuleFile.SLocEntryBaseOffset - 2);
2491 }
2492
2493 /// Read a source location.
2495 const RecordDataImpl &Record,
2496 unsigned &Idx) {
2497 return ReadSourceLocation(ModuleFile, Record[Idx++]);
2498 }
2499
2500 /// Read a FileID.
2502 unsigned &Idx) const {
2503 return TranslateFileID(F, FileID::get(Record[Idx++]));
2504 }
2505
2506 /// Translate a FileID from another module file's FileID space into ours.
2508 assert(FID.ID >= 0 && "Reading non-local FileID.");
2509 if (FID.isInvalid())
2510 return FID;
2511 return FileID::get(F.SLocEntryBaseID + FID.ID - 1);
2512 }
2513
2514 /// Read a source range.
2516 unsigned &Idx);
2517
2518 static llvm::BitVector ReadBitVector(const RecordData &Record,
2519 const StringRef Blob);
2520
2521 // Read a string
2522 static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx);
2523 static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
2524 StringRef &Blob);
2525
2526 // Read a path
2527 std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx);
2528
2529 // Read a path
2530 std::string ReadPath(StringRef BaseDirectory, const RecordData &Record,
2531 unsigned &Idx);
2532 std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record,
2533 unsigned &Idx, StringRef &Blob);
2534
2535 /// Read a version tuple.
2536 static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx);
2537
2539 unsigned &Idx);
2540
2541 /// Reads a statement.
2543
2544 /// Reads an expression.
2546
2547 /// Reads a sub-statement operand during statement reading.
2549 assert(ReadingKind == Read_Stmt &&
2550 "Should be called only during statement reading!");
2551 // Subexpressions are stored from last to first, so the next Stmt we need
2552 // is at the back of the stack.
2553 assert(!StmtStack.empty() && "Read too many sub-statements!");
2554 return StmtStack.pop_back_val();
2555 }
2556
2557 /// Reads a sub-expression operand during statement reading.
2558 Expr *ReadSubExpr();
2559
2560 /// Reads a token out of a record.
2561 Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx);
2562
2563 /// Reads the macro record located at the given offset.
2564 MacroInfo *ReadMacroRecord(ModuleFile &F, uint64_t Offset);
2565
2566 /// Determine the global preprocessed entity ID that corresponds to
2567 /// the given local ID within the given module.
2570
2571 /// Add a macro to deserialize its macro directive history.
2572 ///
2573 /// \param II The name of the macro.
2574 /// \param M The module file.
2575 /// \param MacroDirectivesOffset Offset of the serialized macro directive
2576 /// history.
2578 uint32_t MacroDirectivesOffset);
2579
2580 /// Read the set of macros defined by this external macro source.
2581 void ReadDefinedMacros() override;
2582
2583 /// Update an out-of-date identifier.
2584 void updateOutOfDateIdentifier(const IdentifierInfo &II) override;
2585
2586 /// Note that this identifier is up-to-date.
2587 void markIdentifierUpToDate(const IdentifierInfo *II);
2588
2589 /// Load all external visible decls in the given DeclContext.
2590 void completeVisibleDeclsMap(const DeclContext *DC) override;
2591
2592 /// Retrieve the AST context that this AST reader supplements.
2594 assert(ContextObj && "requested AST context when not loading AST");
2595 return *ContextObj;
2596 }
2597
2598 // Contains the IDs for declarations that were requested before we have
2599 // access to a Sema object.
2601
2602 /// Retrieve the semantic analysis object used to analyze the
2603 /// translation unit in which the precompiled header is being
2604 /// imported.
2605 Sema *getSema() { return SemaObj; }
2606
2607 /// Get the identifier resolver used for name lookup / updates
2608 /// in the translation unit scope. We have one of these even if we don't
2609 /// have a Sema object.
2611
2612 /// Retrieve the identifier table associated with the
2613 /// preprocessor.
2615
2616 /// Record that the given ID maps to the given switch-case
2617 /// statement.
2618 void RecordSwitchCaseID(SwitchCase *SC, unsigned ID);
2619
2620 /// Retrieve the switch-case statement with the given ID.
2621 SwitchCase *getSwitchCaseWithID(unsigned ID);
2622
2623 void ClearSwitchCaseIDs();
2624
2625 /// Cursors for comments blocks.
2626 SmallVector<std::pair<llvm::BitstreamCursor,
2628
2629 /// Loads comments ranges.
2630 void ReadComments() override;
2631
2632 /// Visit all the input file infos of the given module file.
2634 serialization::ModuleFile &MF, bool IncludeSystem,
2635 llvm::function_ref<void(const serialization::InputFileInfo &IFI,
2636 bool IsSystem)>
2637 Visitor);
2638
2639 /// Visit all the input files of the given module file.
2641 bool IncludeSystem, bool Complain,
2642 llvm::function_ref<void(const serialization::InputFile &IF,
2643 bool isSystem)> Visitor);
2644
2645 /// Visit all the top-level module maps loaded when building the given module
2646 /// file.
2648 llvm::function_ref<void(FileEntryRef)> Visitor);
2649
2650 bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; }
2651};
2652
2653/// A simple helper class to unpack an integer to bits and consuming
2654/// the bits in order.
2656 constexpr static uint32_t BitsIndexUpbound = 32;
2657
2658public:
2660 BitsUnpacker(const BitsUnpacker &) = delete;
2664 ~BitsUnpacker() = default;
2665
2667 Value = V;
2668 CurrentBitsIndex = 0;
2669 }
2670
2671 void advance(uint32_t BitsWidth) { CurrentBitsIndex += BitsWidth; }
2672
2673 bool getNextBit() {
2674 assert(isValid());
2675 return Value & (1 << CurrentBitsIndex++);
2676 }
2677
2679 assert(isValid());
2680 assert(Width < BitsIndexUpbound);
2681 uint32_t Ret = (Value >> CurrentBitsIndex) & ((1 << Width) - 1);
2682 CurrentBitsIndex += Width;
2683 return Ret;
2684 }
2685
2686 bool canGetNextNBits(uint32_t Width) const {
2687 return CurrentBitsIndex + Width < BitsIndexUpbound;
2688 }
2689
2690private:
2691 bool isValid() const { return CurrentBitsIndex < BitsIndexUpbound; }
2692
2694 uint32_t CurrentBitsIndex = ~0;
2695};
2696
2697inline bool shouldSkipCheckingODR(const Decl *D) {
2698 return D->getASTContext().getLangOpts().SkipODRCheckInGMF &&
2699 (D->isFromGlobalModule() || D->isFromHeaderUnit());
2700}
2701
2702/// Calculate a hash value for the primary module name of the given module.
2703/// \returns std::nullopt if M is not a C++ standard module.
2704UnsignedOrNone getPrimaryModuleHash(const Module *M);
2705
2706} // namespace clang
2707
2708#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:223
const LangOptions & getLangOpts() const
Definition ASTContext.h:980
Abstract interface for callback invocations by the ASTReader.
Definition ASTReader.h:117
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
Definition ASTReader.h:186
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
Definition ASTReader.h:130
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
Definition ASTReader.h:232
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
Definition ASTReader.h:164
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
Definition ASTReader.h:154
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
Definition ASTReader.h:244
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
Definition ASTReader.h:201
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
Definition ASTReader.h:173
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
Definition ASTReader.h:226
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
Definition ASTReader.h:214
virtual void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata)
Indicates that a particular module file extension has been read.
Definition ASTReader.h:271
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)
Similar to member function of visitInputFile but should be defined when there is a distinction betwee...
Definition ASTReader.h:255
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:268
virtual bool needsImportVisitation() const
Returns true if this ASTReaderListener wants to receive the imports of the AST file via visitImport,...
Definition ASTReader.h:264
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:236
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:1913
bool operator==(const ModuleDeclIterator &RHS) const
Definition ASTReader.h:1687
ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod, const serialization::unaligned_decl_id_t *Pos)
Definition ASTReader.h:1676
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:2453
ModuleManager & getModuleManager()
Retrieve the module manager.
Definition ASTReader.h:1973
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
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const TypedefNameDecl * > &Decls) override
Read the set of potentially unused typedefs known to the source.
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
unsigned getTotalNumPreprocessedEntities() const
Returns the number of preprocessed entities known to the AST reader.
Definition ASTReader.h:2078
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2593
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:2166
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:1815
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
Definition ASTReader.h:1821
@ ARR_None
The client can't handle any AST loading failures.
Definition ASTReader.h:1817
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
Definition ASTReader.h:1834
@ 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:1825
@ 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:1838
@ 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:1829
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:2015
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:2627
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:2176
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
friend class LocalDeclID
Definition ASTReader.h:440
Sema::AlignPackInfo ReadAlignPackInfo(uint32_t Raw) const
Read a AlignPackInfo from raw form.
Definition ASTReader.h:2449
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:2098
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:1805
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:1808
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:2067
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:2605
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:2047
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:1974
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
Definition ASTReader.h:2042
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:1488
~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:2548
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:2479
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:2072
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:2057
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.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
Definition ASTReader.h:2600
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:1981
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
ASTDeserializationListener * getDeserializationListener()
Get the AST deserialization listener.
Definition ASTReader.h:1937
void addListener(std::unique_ptr< ASTReaderListener > L)
Add an AST callback listener.
Definition ASTReader.h:1900
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:1472
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:1893
Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx)
Definition ASTReader.h:2436
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
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
SmallString< 0 > & getPathBuf()
Get the buffer for resolving paths.
Definition ASTReader.h:1449
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:2507
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:2494
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:2270
DiagnosticsEngine & getDiags() const
Definition ASTReader.h:1807
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:2130
bool isProcessingUpdateRecords()
Definition ASTReader.h:2650
T * GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
Definition ASTReader.h:2137
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
Definition ASTReader.h:2463
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:1977
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:1482
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:2458
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:2052
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
Definition ASTReader.h:2501
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:1888
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
void resetForReload()
Reset reader for a reload try.
Definition ASTReader.h:1948
FileManager & getFileManager() const
Definition ASTReader.h:1806
unsigned getTotalNumDecls() const
Returns the number of declarations found in the chain.
Definition ASTReader.h:2062
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:2360
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:1945
IdentifierInfo * GetIdentifier(serialization::IdentifierID ID) override
Return the identifier associated with the given ID number.
Definition ASTReader.h:2365
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:1942
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:2678
void advance(uint32_t BitsWidth)
Definition ASTReader.h:2671
bool canGetNextNBits(uint32_t Width) const
Definition ASTReader.h:2686
BitsUnpacker(BitsUnpacker &&)=delete
BitsUnpacker(const BitsUnpacker &)=delete
void updateValue(uint32_t V)
Definition ASTReader.h:2666
BitsUnpacker operator=(BitsUnpacker &&)=delete
BitsUnpacker(uint32_t V)
Definition ASTReader.h:2659
~BitsUnpacker()=default
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents a C++ base or member initializer.
Definition DeclCXX.h:2402
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Represents a C++ temporary.
Definition ExprCXX.h:1462
Simple wrapper class for chaining listeners.
Definition ASTReader.h:276
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.
std::unique_ptr< ASTReaderListener > takeSecond()
Definition ASTReader.h:287
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:286
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
ChainedASTReaderListener(std::unique_ptr< ASTReaderListener > First, std::unique_ptr< ASTReaderListener > Second)
Takes ownership of First and Second.
Definition ASTReader.h:282
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:1466
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:550
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:805
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:995
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:234
Represents an enum.
Definition Decl.h:4145
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.
Interface for on-demand deserialization of submodules stored in a PCM file.
Definition Module.h:56
Represents a member of a struct/union/class.
Definition Decl.h:3294
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:273
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:52
Keeps track of options that affect how file operations are performed.
Represents a function declaration or definition.
Definition Decl.h:2058
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:40
The module cache used for compiling modules implicitly.
Definition ModuleCache.h:39
Identifies a module file to be loaded.
Definition Module.h:109
Describes a module or submodule.
Definition Module.h:340
NameVisibilityKind
Describes the visibility of the various names within a particular module.
Definition Module.h:643
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:2335
Represents an ObjC class declaration.
Definition DeclObjC.h:1160
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:332
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:938
Smart pointer class that efficiently represents Objective-C method names.
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Definition Sema.h:1908
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:864
SimpleASTReaderListener(Preprocessor &PP)
Definition ASTReader.h:364
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:85
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:1879
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3696
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:932
The input file that has been loaded from this AST file, along with bools indicating whether this was ...
Definition ModuleFile.h:85
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:158
int SLocEntryBaseID
The base ID in the source manager's view of this module.
Definition ModuleFile.h:336
StringRef ModuleOffsetMap
The module offset map data for this file.
Definition ModuleFile.h:288
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Definition ModuleFile.h:563
Manages the set of modules loaded by an AST reader.
llvm::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:44
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
Top level wrappers for InstallAPI frontend operations.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Undefined
Keep undefined.
PredefinedDeclIDs
Predefined declaration IDs.
Definition DeclID.h:31
@ Result
The result type of a method or function.
Definition TypeBase.h:906
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
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:2697
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
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
The signature of a module, which is a hash of the AST content.
Definition Module.h:198
ImportedModule(ModuleFile *Mod, ModuleFile *ImportedBy, SourceLocation ImportLoc)
Definition ASTReader.h:1522
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:65