13#ifndef LLVM_CLANG_SERIALIZATION_ASTREADER_H
14#define LLVM_CLANG_SERIALIZATION_ASTREADER_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"
72class ASTDeserializationListener;
85class FileSystemOptions;
87class GlobalModuleIndex;
89class HeaderSearchOptions;
92class InMemoryModuleCache;
95class ObjCCategoryDecl;
96class ObjCInterfaceDecl;
97class PCHContainerReader;
99class PreprocessorOptions;
106class TypedefNameDecl;
135 StringRef ModuleFilename,
bool Complain,
136 bool AllowCompatibleDifferences) {
145 StringRef ModuleFilename,
bool Complain,
146 bool AllowCompatibleDifferences) {
156 StringRef ModuleFilename,
bool Complain) {
178 StringRef ModuleFilename,
179 StringRef SpecificModuleCachePath,
207 StringRef ModuleFilename,
208 bool ReadMacros,
bool Complain,
209 std::string &SuggestedPredefines) {
236 bool isOverridden,
bool isExplicitModule) {
255 std::unique_ptr<ASTReaderListener> First;
256 std::unique_ptr<ASTReaderListener> Second;
261 std::unique_ptr<ASTReaderListener> Second)
265 std::unique_ptr<ASTReaderListener>
takeSecond() {
return std::move(Second); }
271 StringRef ModuleFilename,
bool Complain,
272 bool AllowCompatibleDifferences)
override;
274 StringRef ModuleFilename,
bool Complain,
275 bool AllowCompatibleDifferences)
override;
277 StringRef ModuleFilename,
bool Complain)
override;
279 bool Complain)
override;
282 StringRef ModuleFilename,
283 StringRef SpecificModuleCachePath,
284 bool Complain)
override;
286 StringRef ModuleFilename,
bool ReadMacros,
288 std::string &SuggestedPredefines)
override;
296 bool isOverridden,
bool isExplicitModule)
override;
309 : PP(PP), Reader(Reader) {}
312 StringRef ModuleFilename,
bool Complain,
313 bool AllowCompatibleDifferences)
override;
315 StringRef ModuleFilename,
bool Complain,
316 bool AllowCompatibleDifferences)
override;
318 StringRef ModuleFilename,
bool Complain)
override;
320 StringRef ModuleFilename,
bool ReadMacros,
322 std::string &SuggestedPredefines)
override;
324 StringRef ModuleFilename,
325 StringRef SpecificModuleCachePath,
326 bool Complain)
override;
341 StringRef ModuleFilename,
bool ReadMacros,
343 std::string &SuggestedPredefines)
override;
346namespace serialization {
348class ReadMethodPoolVisitor;
441 std::unique_ptr<ASTReaderListener> Listener;
446 bool OwnsDeserializationListener =
false;
458 Sema *SemaObj =
nullptr;
478 llvm::StringMap<std::shared_ptr<ModuleFileExtension>> ModuleFileExtensions;
481 std::unique_ptr<llvm::Timer> ReadTimer;
488 std::optional<ModuleKind> CurrentDeserializingModuleKind;
491 std::unique_ptr<GlobalModuleIndex> GlobalIndex;
511 llvm::PagedVector<QualType> TypesLoaded;
517 llvm::PagedVector<Decl *> DeclsLoaded;
519 using FileOffset = std::pair<ModuleFile *, uint64_t>;
521 using DeclUpdateOffsetsMap = llvm::DenseMap<GlobalDeclID, FileOffsetsTy>;
525 DeclUpdateOffsetsMap DeclUpdateOffsets;
527 struct LookupBlockOffsets {
528 uint64_t LexicalOffset;
529 uint64_t VisibleOffset;
530 uint64_t ModuleLocalOffset;
531 uint64_t TULocalOffset;
534 using DelayedNamespaceOffsetMapTy =
535 llvm::DenseMap<GlobalDeclID, LookupBlockOffsets>;
545 DelayedNamespaceOffsetMapTy DelayedNamespaceOffsetMap;
561 llvm::DenseMap<GlobalDeclID, SmallVector<GlobalDeclID, 4>> RelatedDeclsMap;
563 struct PendingUpdateRecord {
571 :
D(
D), ID(ID), JustLoaded(JustLoaded) {}
578 enum class PendingFakeDefinitionKind { NotFake, Fake, FakeLoaded };
582 llvm::DenseMap<void *, PendingFakeDefinitionKind> PendingFakeDefinitionData;
588 llvm::SmallMapVector<Decl *, FunctionDecl *, 4> PendingExceptionSpecUpdates;
593 llvm::SmallMapVector<FunctionDecl *, QualType, 4> PendingDeducedTypeUpdates;
601 llvm::DenseMap<std::pair<DeclContext *, IdentifierInfo *>, NamedDecl *>
602 ImportedTypedefNamesForLinkage;
606 llvm::DenseMap<Decl*, llvm::SmallVector<NamedDecl*, 2>>
607 AnonymousDeclarationsForMerging;
610 llvm::DenseMap<std::pair<const Decl *, unsigned>, NamedDecl *>
611 LambdaDeclarationsForMerging;
615 using LETemporaryKey = std::pair<Decl *, unsigned>;
618 llvm::DenseMap<LETemporaryKey, LifetimeExtendedTemporaryDecl *>
619 LETemporaryForMerging;
621 struct FileDeclsInfo {
623 ArrayRef<serialization::unaligned_decl_id_t> Decls;
625 FileDeclsInfo() =
default;
627 ArrayRef<serialization::unaligned_decl_id_t> Decls)
628 : Mod(Mod), Decls(Decls) {}
632 llvm::DenseMap<FileID, FileDeclsInfo> FileDeclIDs;
636 using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>;
639 llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>>
643 std::vector<std::pair<ModuleFile*, LexicalContents>> TULexicalDecls;
646 llvm::DenseMap<
const DeclContext *,
647 serialization::reader::DeclContextLookupTable> Lookups;
648 llvm::DenseMap<
const DeclContext *,
649 serialization::reader::ModuleLocalLookupTable>
651 llvm::DenseMap<
const DeclContext *,
652 serialization::reader::DeclContextLookupTable>
655 using SpecLookupTableTy =
656 llvm::DenseMap<
const Decl *,
657 serialization::reader::LazySpecializationInfoLookupTable>;
659 SpecLookupTableTy SpecializationsLookups;
661 SpecLookupTableTy PartialSpecializationsLookups;
663 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
665 bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
667 ArrayRef<TemplateArgument> TemplateArgs);
675 const unsigned char *
Data;
677 using DeclContextVisibleUpdates = SmallVector<UpdateData, 1>;
681 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> PendingVisibleUpdates;
682 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates>
683 PendingModuleLocalVisibleUpdates;
684 llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> TULocalUpdates;
686 using SpecializationsUpdate = SmallVector<UpdateData, 1>;
687 using SpecializationsUpdateMap =
688 llvm::DenseMap<GlobalDeclID, SpecializationsUpdate>;
689 SpecializationsUpdateMap PendingSpecializationsUpdates;
690 SpecializationsUpdateMap PendingPartialSpecializationsUpdates;
696 using PendingBodiesMap =
698 llvm::SmallDenseMap<Decl *, unsigned, 4>,
699 SmallVector<std::pair<Decl *, uint64_t>, 4>>;
702 PendingBodiesMap PendingBodies;
706 llvm::SetVector<NamedDecl *> PendingMergedDefinitionsToDeduplicate;
712 PendingWarningForDuplicatedDefsInModuleUnits;
715 bool ReadLexicalDeclContextStorage(
ModuleFile &M,
716 llvm::BitstreamCursor &Cursor,
717 uint64_t Offset, DeclContext *DC);
719 enum class VisibleDeclContextStorageKind {
726 bool ReadVisibleDeclContextStorage(
ModuleFile &M,
727 llvm::BitstreamCursor &Cursor,
728 uint64_t Offset, GlobalDeclID ID,
729 VisibleDeclContextStorageKind VisibleKind);
731 bool ReadSpecializations(
ModuleFile &M, llvm::BitstreamCursor &Cursor,
732 uint64_t Offset, Decl *
D,
bool IsPartial);
733 void AddSpecializations(
const Decl *
D,
const unsigned char *
Data,
742 std::vector<IdentifierInfo *> IdentifiersLoaded;
750 std::vector<MacroInfo *> MacrosLoaded;
752 using LoadedMacroInfo =
753 std::pair<IdentifierInfo *, serialization::SubmoduleID>;
758 llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
760 using GlobalMacroMapType =
761 ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>;
766 GlobalMacroMapType GlobalMacroMap;
772 SmallVector<Module *, 2> SubmodulesLoaded;
774 using GlobalSubmoduleMapType =
775 ContinuousRangeMap<serialization::SubmoduleID, ModuleFile *, 4>;
780 GlobalSubmoduleMapType GlobalSubmoduleMap;
783 using HiddenNames = SmallVector<Decl *, 2>;
784 using HiddenNamesMapType = llvm::DenseMap<Module *, HiddenNames>;
788 HiddenNamesMapType HiddenNamesMap;
791 struct UnresolvedModuleRef {
799 enum {
Import, Export, Conflict, Affecting }
Kind;
805 LLVM_PREFERRED_TYPE(
bool)
806 unsigned IsWildcard : 1;
814 SmallVector<UnresolvedModuleRef, 2> UnresolvedModuleRefs;
821 SmallVector<Selector, 16> SelectorsLoaded;
823 using GlobalSelectorMapType =
824 ContinuousRangeMap<serialization::SelectorID, ModuleFile *, 4>;
828 GlobalSelectorMapType GlobalSelectorMap;
832 llvm::DenseMap<Selector, unsigned> SelectorGeneration;
836 llvm::DenseMap<Selector, bool> SelectorOutOfDate;
838 struct PendingMacroInfo {
843 PendingMacroInfo(
ModuleFile *M, uint32_t MacroDirectivesOffset)
844 : M(M), MacroDirectivesOffset(MacroDirectivesOffset) {}
847 using PendingMacroIDsMap =
848 llvm::MapVector<IdentifierInfo *, SmallVector<PendingMacroInfo, 2>>;
852 PendingMacroIDsMap PendingMacroIDs;
854 using GlobalPreprocessedEntityMapType =
855 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
860 GlobalPreprocessedEntityMapType GlobalPreprocessedEntityMap;
862 using GlobalSkippedRangeMapType =
863 ContinuousRangeMap<unsigned, ModuleFile *, 4>;
867 GlobalSkippedRangeMapType GlobalSkippedRangeMap;
879 SmallVector<GlobalDeclID, 16> EagerlyDeserializedDecls;
884 SmallVector<GlobalDeclID, 16> VTablesToEmit;
891 SmallVector<GlobalDeclID, 16> TentativeDefinitions;
903 SmallVector<VTableUse> VTableUses;
911 struct PendingInstantiation {
915 SmallVector<PendingInstantiation, 64> PendingInstantiations;
925 SmallVector<GlobalDeclID, 16> UnusedFileScopedDecls;
929 SmallVector<GlobalDeclID, 4> DelegatingCtorDecls;
933 SmallVector<serialization::SelectorID, 64> ReferencedSelectorsData;
937 SmallVector<serialization::IdentifierID, 64> WeakUndeclaredIdentifiers;
942 SmallVector<GlobalDeclID, 4> ExtVectorDecls;
953 SmallVector<GlobalDeclID, 16> UnusedLocalTypedefNameCandidates;
957 unsigned ForceHostDeviceDepth = 0;
962 SmallVector<GlobalDeclID, 4> SemaDeclRefs;
967 SmallVector<serialization::TypeID, 16> SpecialTypes;
973 SmallVector<GlobalDeclID, 2> CUDASpecialDeclRefs;
976 SmallVector<uint64_t, 1> FPPragmaOptions;
979 SourceLocation OptimizeOffPragmaLocation;
982 int PragmaMSStructState = -1;
985 int PragmaMSPointersToMembersState = -1;
986 SourceLocation PointersToMembersPragmaLocation;
989 std::optional<FPOptionsOverride> FpPragmaCurrentValue;
990 SourceLocation FpPragmaCurrentLocation;
991 struct FpPragmaStackEntry {
992 FPOptionsOverride
Value;
993 SourceLocation Location;
994 SourceLocation PushLocation;
1001 std::optional<Sema::AlignPackInfo> PragmaAlignPackCurrentValue;
1002 SourceLocation PragmaAlignPackCurrentLocation;
1003 struct PragmaAlignPackStackEntry {
1004 Sema::AlignPackInfo
Value;
1005 SourceLocation Location;
1006 SourceLocation PushLocation;
1007 StringRef SlotLabel;
1013 OpenCLOptions OpenCLExtensions;
1016 llvm::DenseMap<const Type *, std::set<std::string>> OpenCLTypeExtMap;
1019 llvm::DenseMap<const Decl *, std::set<std::string>> OpenCLDeclExtMap;
1022 SmallVector<GlobalDeclID, 4> KnownNamespaces;
1026 struct UndefinedButUsedDecl {
1030 SmallVector<UndefinedButUsedDecl, 8> UndefinedButUsed;
1033 SmallVector<uint64_t, 8> DelayedDeleteExprs;
1036 SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
1037 LateParsedTemplates;
1045 SmallVector<GlobalDeclID> DeclsWithEffectsToVerify;
1048 struct ImportedSubmodule {
1050 SourceLocation ImportLoc;
1053 :
ID(
ID), ImportLoc(ImportLoc) {}
1060 SmallVector<ImportedSubmodule, 2> PendingImportedModules;
1064 SmallVector<ImportedSubmodule, 2> PendingImportedModulesSema;
1069 std::string isysroot;
1076 bool AllowASTWithCompilerErrors;
1080 bool AllowConfigurationMismatch;
1083 bool ValidateSystemInputs;
1086 bool ValidateASTInputFilesContent;
1089 bool UseGlobalIndex;
1092 bool TriedLoadingGlobalIndex =
false;
1095 bool ProcessingUpdateRecords =
false;
1097 using SwitchCaseMapTy = llvm::DenseMap<unsigned, SwitchCase *>;
1103 SwitchCaseMapTy SwitchCaseStmts;
1105 SwitchCaseMapTy *CurrSwitchCaseStmts;
1109 unsigned NumSLocEntriesRead = 0;
1112 unsigned TotalNumSLocEntries = 0;
1116 unsigned NumStatementsRead = 0;
1120 unsigned TotalNumStatements = 0;
1123 unsigned NumMacrosRead = 0;
1126 unsigned TotalNumMacros = 0;
1129 unsigned NumIdentifierLookups = 0;
1132 unsigned NumIdentifierLookupHits = 0;
1135 unsigned NumSelectorsRead = 0;
1138 unsigned NumMethodPoolEntriesRead = 0;
1142 unsigned NumMethodPoolLookups = 0;
1146 unsigned NumMethodPoolHits = 0;
1150 unsigned NumMethodPoolTableLookups = 0;
1154 unsigned NumMethodPoolTableHits = 0;
1157 unsigned TotalNumMethodPoolEntries = 0;
1160 unsigned NumLexicalDeclContextsRead = 0, TotalLexicalDeclContexts = 0;
1163 unsigned NumVisibleDeclContextsRead = 0, TotalVisibleDeclContexts = 0;
1166 unsigned NumModuleLocalVisibleDeclContexts = 0,
1167 TotalModuleLocalVisibleDeclContexts = 0;
1170 unsigned NumTULocalVisibleDeclContexts = 0,
1171 TotalTULocalVisibleDeclContexts = 0;
1174 uint64_t TotalModulesSizeInBits = 0;
1177 unsigned NumCurrentElementsDeserializing = 0;
1183 bool PassingDeclsToConsumer =
false;
1190 llvm::MapVector<IdentifierInfo *, SmallVector<GlobalDeclID, 4>>
1191 PendingIdentifierInfos;
1195 llvm::SmallMapVector<const IdentifierInfo *, SmallVector<NamedDecl *, 2>, 16>
1196 PendingFakeLookupResults;
1200 llvm::DenseMap<const IdentifierInfo *, unsigned> IdentifierGeneration;
1208 std::deque<Decl *> PotentiallyInterestingDecls;
1213 SmallVector<std::pair<FunctionDecl *, serialization::TypeID>, 16>
1214 PendingDeducedFunctionTypes;
1219 SmallVector<std::pair<VarDecl *, serialization::TypeID>, 16>
1220 PendingDeducedVarTypes;
1225 SmallVector<std::pair<Decl *, uint64_t>, 16> PendingDeclChains;
1229 SmallVector<Decl *, 16> PendingIncompleteDeclChains;
1233 struct PendingDeclContextInfo {
1235 GlobalDeclID SemaDC;
1236 GlobalDeclID LexicalDC;
1244 std::deque<PendingDeclContextInfo> PendingDeclContextInfos;
1246 template <
typename DeclTy>
1247 using DuplicateObjCDecls = std::pair<DeclTy *, DeclTy *>;
1253 llvm::SmallMapVector<DuplicateObjCDecls<ObjCCategoryDecl>,
1256 PendingObjCExtensionIvarRedeclarations;
1261 SmallVector<std::pair<CXXRecordDecl*, Decl*>, 4> PendingAddedClassMembers;
1271 using DataPointers =
1272 std::pair<CXXRecordDecl *, struct CXXRecordDecl::DefinitionData *>;
1273 using ObjCInterfaceDataPointers =
1274 std::pair<ObjCInterfaceDecl *,
1275 struct ObjCInterfaceDecl::DefinitionData *>;
1276 using ObjCProtocolDataPointers =
1277 std::pair<ObjCProtocolDecl *, struct ObjCProtocolDecl::DefinitionData *>;
1280 llvm::SmallDenseMap<CXXRecordDecl *, llvm::SmallVector<DataPointers, 2>, 2>
1281 PendingOdrMergeFailures;
1284 llvm::SmallDenseMap<RecordDecl *, llvm::SmallVector<RecordDecl *, 2>, 2>
1285 PendingRecordOdrMergeFailures;
1288 llvm::SmallDenseMap<FunctionDecl *, llvm::SmallVector<FunctionDecl *, 2>, 2>
1289 PendingFunctionOdrMergeFailures;
1292 llvm::SmallDenseMap<EnumDecl *, llvm::SmallVector<EnumDecl *, 2>, 2>
1293 PendingEnumOdrMergeFailures;
1296 llvm::SmallDenseMap<ObjCInterfaceDecl *,
1298 PendingObjCInterfaceOdrMergeFailures;
1301 llvm::SmallDenseMap<ObjCProtocolDecl *,
1303 PendingObjCProtocolOdrMergeFailures;
1315 SmallVector<ObjCInterfaceDecl *, 16> ObjCClassesLoaded;
1317 using KeyDeclsMap = llvm::DenseMap<Decl *, SmallVector<GlobalDeclID, 2>>;
1324 KeyDeclsMap KeyDecls;
1329 llvm::DenseMap<DeclContext *, DeclContext *> MergedDeclContexts;
1333 llvm::DenseMap<EnumDecl *, EnumDecl *> EnumDefinitions;
1337 llvm::DenseMap<RecordDecl *, RecordDecl *> RecordDefinitions;
1340 SmallVector<Stmt *, 16> StmtStack;
1344 Read_None, Read_Decl, Read_Type, Read_Stmt
1348 ReadingKind ReadingKind = Read_None;
1351 class ReadingKindTracker {
1353 enum ReadingKind PrevKind;
1356 ReadingKindTracker(
enum ReadingKind newKind, ASTReader &reader)
1357 : Reader(reader), PrevKind(Reader.ReadingKind) {
1358 Reader.ReadingKind = newKind;
1361 ReadingKindTracker(
const ReadingKindTracker &) =
delete;
1362 ReadingKindTracker &operator=(
const ReadingKindTracker &) =
delete;
1363 ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; }
1367 class ProcessingUpdatesRAIIObj {
1372 ProcessingUpdatesRAIIObj(ASTReader &reader)
1373 : Reader(reader), PrevState(Reader.ProcessingUpdateRecords) {
1374 Reader.ProcessingUpdateRecords =
true;
1377 ProcessingUpdatesRAIIObj(
const ProcessingUpdatesRAIIObj &) =
delete;
1378 ProcessingUpdatesRAIIObj &
1379 operator=(
const ProcessingUpdatesRAIIObj &) =
delete;
1380 ~ProcessingUpdatesRAIIObj() { Reader.ProcessingUpdateRecords = PrevState; }
1391 std::string SuggestedPredefines;
1393 llvm::DenseMap<const Decl *, bool> DefinitionSource;
1395 bool shouldDisableValidationForFile(
const serialization::ModuleFile &M)
const;
1401 serialization::InputFileInfo getInputFileInfo(
ModuleFile &F,
unsigned ID);
1405 serialization::InputFile getInputFile(
ModuleFile &F,
unsigned ID,
1406 bool Complain =
true);
1409 SmallString<0> PathBuf;
1412 class TemporarilyOwnedStringRef {
1417 TemporarilyOwnedStringRef(StringRef S, SmallString<0> &UnderlyingBuffer)
1418 : String(S), UnderlyingBuffer(UnderlyingBuffer, {}) {}
1421 const StringRef *operator->() const & {
return &String; }
1422 const StringRef &
operator*() const & {
return String; }
1425 const StringRef *operator->() && =
delete;
1426 const StringRef &
operator*() && =
delete;
1435 static TemporarilyOwnedStringRef
1439 static TemporarilyOwnedStringRef
1455 D =
D->getCanonicalDecl();
1456 if (
D->isFromASTFile())
1459 auto I = KeyDecls.find(
D);
1460 if (I == KeyDecls.end() || I->second.empty())
1469 template <
typename Fn>
1471 D =
D->getCanonicalDecl();
1472 if (
D->isFromASTFile())
1475 auto It = KeyDecls.find(
const_cast<Decl*
>(
D));
1476 if (It != KeyDecls.end())
1477 for (
auto ID : It->second)
1500 struct ImportedModule {
1508 : Mod(Mod), ImportedBy(ImportedBy), ImportLoc(ImportLoc) {}
1512 SourceLocation ImportLoc,
ModuleFile *ImportedBy,
1513 SmallVectorImpl<ImportedModule> &Loaded,
1514 off_t ExpectedSize, time_t ExpectedModTime,
1515 ASTFileSignature ExpectedSignature,
1516 unsigned ClientLoadCapabilities);
1518 SmallVectorImpl<ImportedModule> &Loaded,
1520 unsigned ClientLoadCapabilities);
1522 ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef
Filename,
1523 unsigned ClientLoadCapabilities,
1524 bool AllowCompatibleConfigurationMismatch,
1525 ASTReaderListener &Listener,
1526 std::string &SuggestedPredefines);
1533 unsigned ClientLoadCapabilities);
1537 unsigned ClientLoadCapabilities,
1538 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
1539 bool ValidateDiagnosticOptions);
1541 llvm::Error ReadASTBlock(
ModuleFile &F,
unsigned ClientLoadCapabilities);
1542 llvm::Error ReadExtensionBlock(
ModuleFile &F);
1543 void ReadModuleOffsetMap(
ModuleFile &F)
const;
1545 llvm::Error ReadSourceManagerBlock(
ModuleFile &F);
1546 SourceLocation getImportLocation(
ModuleFile *F);
1549 unsigned ClientLoadCapabilities);
1550 llvm::Error ReadSubmoduleBlock(
ModuleFile &F,
1551 unsigned ClientLoadCapabilities);
1553 StringRef ModuleFilename,
bool Complain,
1554 ASTReaderListener &Listener,
1555 bool AllowCompatibleDifferences);
1557 StringRef ModuleFilename,
bool Complain,
1558 ASTReaderListener &Listener,
1559 bool AllowCompatibleDifferences);
1561 StringRef ModuleFilename,
bool Complain,
1562 ASTReaderListener &Listener);
1563 static bool ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
1564 ASTReaderListener &Listener);
1566 StringRef ModuleFilename,
bool Complain,
1567 ASTReaderListener &Listener);
1568 static bool ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
1569 ASTReaderListener &Listener);
1571 StringRef ModuleFilename,
bool Complain,
1572 ASTReaderListener &Listener,
1573 std::string &SuggestedPredefines);
1575 struct RecordLocation {
1579 RecordLocation(
ModuleFile *M, uint64_t O) : F(M), Offset(O) {}
1584 void LoadedDecl(
unsigned Index, Decl *
D);
1585 Decl *ReadDeclRecord(GlobalDeclID ID);
1586 void markIncompleteDeclChain(Decl *
D);
1591 Decl *getMostRecentExistingDecl(Decl *
D);
1593 RecordLocation DeclCursorForID(GlobalDeclID ID, SourceLocation &Location);
1594 void loadDeclUpdateRecords(PendingUpdateRecord &
Record);
1595 void loadPendingDeclChain(Decl *
D, uint64_t LocalOffset);
1596 void loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *
D,
1597 unsigned PreviousGeneration = 0);
1599 RecordLocation getLocalBitOffset(uint64_t GlobalOffset);
1605 findPreprocessedEntity(SourceLocation
Loc,
bool EndsAfter)
const;
1614 findNextPreprocessedEntity(
1619 std::pair<ModuleFile *, unsigned>
1620 getModulePreprocessedEntity(
unsigned GlobalIndex);
1624 llvm::iterator_range<PreprocessingRecord::iterator>
1625 getModulePreprocessedEntities(
ModuleFile &Mod)
const;
1627 bool canRecoverFromOutOfDate(StringRef ModuleFileName,
1628 unsigned ClientLoadCapabilities);
1632 :
public llvm::iterator_adaptor_base<
1633 ModuleDeclIterator, const serialization::unaligned_decl_id_t *,
1634 std::random_access_iterator_tag, const Decl *, ptrdiff_t,
1635 const Decl *, const Decl *> {
1644 : iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
1654 assert(Reader == RHS.Reader && Mod == RHS.Mod);
1659 llvm::iterator_range<ModuleDeclIterator>
1663 bool isConsumerInterestedIn(
Decl *
D);
1664 void PassInterestingDeclsToConsumer();
1665 void PassInterestingDeclToConsumer(
Decl *
D);
1668 void finishPendingActions();
1669 void diagnoseOdrViolations();
1676 PendingDeclContextInfo Info = {
D, SemaDC, LexicalDC };
1677 PendingDeclContextInfos.push_back(Info);
1684 void Error(StringRef Msg)
const;
1685 void Error(
unsigned DiagID, StringRef Arg1 = StringRef(),
1686 StringRef Arg2 = StringRef(), StringRef Arg3 = StringRef())
const;
1687 void Error(llvm::Error &&Err)
const;
1690 unsigned translateGlobalDeclIDToIndex(GlobalDeclID ID)
const;
1694 std::pair<ModuleFile *, unsigned>
1699 std::pair<ModuleFile *, unsigned>
1745 ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
1746 ASTContext *Context,
const PCHContainerReader &PCHContainerRdr,
1747 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
1748 StringRef isysroot =
"",
1751 bool AllowASTWithCompilerErrors =
false,
1752 bool AllowConfigurationMismatch =
false,
1753 bool ValidateSystemInputs =
false,
1754 bool ValidateASTInputFilesContent =
false,
1755 bool UseGlobalIndex =
true,
1756 std::unique_ptr<llvm::Timer> ReadTimer = {});
1819 unsigned ClientLoadCapabilities,
1844 return std::move(Listener);
1849 this->Listener = std::move(Listener);
1857 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1858 std::move(Listener));
1859 Listener = std::move(L);
1865 bool Chained =
false;
1873 L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1889 bool TakeOwnership =
false);
1893 return DeserializationListener;
1922 std::unique_ptr<llvm::MemoryBuffer> Buffer) {
1972 StringRef ExistingModuleCachePath,
1973 bool RequireStrictOptionMatches =
false);
1988 std::pair<unsigned, unsigned>
2006 return TotalNumSLocEntries;
2011 return static_cast<unsigned>(IdentifiersLoaded.size());
2016 return static_cast<unsigned>(MacrosLoaded.size());
2021 return static_cast<unsigned>(TypesLoaded.size());
2026 return static_cast<unsigned>(DeclsLoaded.size());
2031 return static_cast<unsigned>(SubmodulesLoaded.size());
2036 return static_cast<unsigned>(SelectorsLoaded.size());
2043 for (
const auto &M : ModuleMgr)
2044 Result += M.NumPreprocessedEntities;
2062 if (Idx >=
Record.size())
2130 template <
typename T>
2154 uint64_t *StartOfBlockOffset =
nullptr);
2184 llvm::function_ref<
bool(
Decl::Kind)> IsKindWeWant,
2253 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined)
override;
2280 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs)
override;
2289 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
2309 llvm::function_ref<
void()> Fn);
2355 unsigned LocalID)
const;
2394 unsigned LocalID)
const;
2408 std::pair<SourceLocation, unsigned>
2418 ReadModuleOffsetMap(MF);
2425 "Run out source location space");
2434 if (
Loc.isInvalid())
2455 unsigned &Idx)
const {
2461 assert(FID.ID >= 0 &&
"Reading non-local FileID.");
2469 unsigned &Idx, LocSeq *
Seq =
nullptr);
2472 const StringRef Blob);
2486 unsigned &Idx, StringRef &Blob);
2502 assert(ReadingKind == Read_Stmt &&
2503 "Should be called only during statement reading!");
2506 assert(!StmtStack.empty() &&
"Read too many sub-statements!");
2507 return StmtStack.pop_back_val();
2531 uint32_t MacroDirectivesOffset);
2547 assert(ContextObj &&
"requested AST context when not loading AST");
2594 bool IncludeSystem,
bool Complain,
2596 bool isSystem)> Visitor);
2609 constexpr static uint32_t BitsIndexUpbound = 32;
2621 CurrentBitsIndex = 0;
2624 void advance(uint32_t BitsWidth) { CurrentBitsIndex += BitsWidth; }
2628 return Value & (1 << CurrentBitsIndex++);
2633 assert(Width < BitsIndexUpbound);
2634 uint32_t Ret = (
Value >> CurrentBitsIndex) & ((1 << Width) - 1);
2635 CurrentBitsIndex += Width;
2640 return CurrentBitsIndex + Width < BitsIndexUpbound;
2644 bool isValid()
const {
return CurrentBitsIndex < BitsIndexUpbound; }
2647 uint32_t CurrentBitsIndex = ~0;
Defines the Diagnostic-related interfaces.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
enum clang::sema::@1727::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
llvm::MachO::Record Record
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.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
An identifier-lookup iterator that enumerates all of the identifiers stored within a set of AST files...
Abstract interface for callback invocations by the ASTReader.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
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...
virtual bool ReadDiagnosticOptions(IntrusiveRefCntPtr< DiagnosticOptions > DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
virtual void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata)
Indicates that a particular module file extension has been read.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void visitImport(StringRef ModuleName, StringRef Filename)
If needsImportVisitation returns true, this is called for each AST file imported by this AST file.
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
virtual bool needsImportVisitation() const
Returns true if this ASTReaderListener wants to receive the imports of the AST file via visitImport,...
virtual bool ReadFullVersionInformation(StringRef FullVersion)
Receives the full Clang version information.
virtual void ReadCounter(const serialization::ModuleFile &M, unsigned Value)
Receives COUNTER value.
virtual void ReadModuleName(StringRef ModuleName)
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
RAII object to temporarily add an AST callback listener.
ListenerScope(ASTReader &Reader, std::unique_ptr< ASTReaderListener > L)
value_type operator*() const
value_type operator->() const
bool operator==(const ModuleDeclIterator &RHS) const
ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod, const serialization::unaligned_decl_id_t *Pos)
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
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
ModuleManager & getModuleManager()
Retrieve the module manager.
ASTReader & operator=(const ASTReader &)=delete
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
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.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleManager::ModuleIterator ModuleIterator
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...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_None
The client can't handle any AST loading failures.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_TreatModuleWithErrorsAsOutOfDate
If a module file is marked with errors treat it as out-of-date so the caller can rebuild it.
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
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...
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.
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.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ClearSwitchCaseIDs()
Sema::AlignPackInfo ReadAlignPackInfo(uint32_t Raw) const
Read a AlignPackInfo from raw form.
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.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form.
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
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
ASTReader(const ASTReader &)=delete
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
unsigned getTotalNumIdentifiers() const
Returns the number of identifiers found in the chain.
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
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
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.
std::pair< SourceLocation, unsigned > ReadUntranslatedSourceLocation(RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form and return it in its originating module file's source location s...
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.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
Stmt * ReadSubStmt()
Reads a sub-statement operand during statement reading.
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.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
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.
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.
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.
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx, LocSeq *Seq=nullptr)
Read a source range.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
Expr * ReadExpr(ModuleFile &F)
Reads an expression.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const InMemoryModuleCache &ModuleCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
ASTReadResult ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
ASTDeserializationListener * getDeserializationListener()
Get the AST deserialization listener.
void addListener(std::unique_ptr< ASTReaderListener > L)
Add an AST callback listener.
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.
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.
Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx)
ModuleManager::ModuleReverseIterator ModuleReverseIterator
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
void addInMemoryBuffer(StringRef &FileName, std::unique_ptr< llvm::MemoryBuffer > Buffer)
Add in-memory (virtual file) buffer.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
SmallString< 0 > & getPathBuf()
Get the buffer for resolving paths.
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.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
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.
void ForgetSema() override
Inform the semantic consumer that Sema is no longer available.
DiagnosticsEngine & getDiags() const
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.
bool isProcessingUpdateRecords()
T * GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
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.
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)
ModuleManager::ModuleConstIterator ModuleConstIterator
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
SmallVector< uint64_t, 64 > RecordData
unsigned getTotalNumMacros() const
Returns the number of macros found in the chain.
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
std::unique_ptr< ASTReaderListener > takeListener()
Take the AST callbacks listener.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
void resetForReload()
Reset reader for a reload try.
FileManager & getFileManager() const
unsigned getTotalNumDecls() const
Returns the number of declarations found in the chain.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const InMemoryModuleCache &ModuleCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, StringRef ExistingModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
IdentifierInfo * readIdentifier(ModuleFile &M, const RecordData &Record, unsigned &Idx)
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
GlobalModuleIndex * getGlobalIndex()
Return global module index.
IdentifierInfo * GetIdentifier(serialization::IdentifierID ID) override
Return the identifier associated with the given ID number.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
SourceLocation ReadSourceLocation(ModuleFile &ModuleFile, const RecordDataImpl &Record, unsigned &Idx, LocSeq *Seq=nullptr)
Read a source location.
serialization::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
An object for streaming information from a record.
Utility class for loading a ASTContext from an AST file.
Writes an AST file containing the contents of a translation unit.
A simple helper class to unpack an integer to bits and consuming the bits in order.
BitsUnpacker operator=(const BitsUnpacker &)=delete
uint32_t getNextBits(uint32_t Width)
void advance(uint32_t BitsWidth)
bool canGetNextNBits(uint32_t Width) const
BitsUnpacker(BitsUnpacker &&)=delete
BitsUnpacker(const BitsUnpacker &)=delete
void updateValue(uint32_t V)
BitsUnpacker operator=(BitsUnpacker &&)=delete
Represents a base class of a C++ class.
Represents a C++ base or member initializer.
Represents a C++ struct/union/class.
Represents a C++ temporary.
Simple wrapper class for chaining listeners.
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...
std::unique_ptr< ASTReaderListener > takeSecond()
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
std::unique_ptr< ASTReaderListener > takeFirst()
void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override
Receives COUNTER value.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
ChainedASTReaderListener(std::unique_ptr< ASTReaderListener > First, std::unique_ptr< ASTReaderListener > Second)
Takes ownership of First and Second.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
bool ReadDiagnosticOptions(IntrusiveRefCntPtr< DiagnosticOptions > DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
A map from continuous integer ranges to some value, with a very specialized interface.
typename Representation::const_iterator const_iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
Kind
Lists the kind of concrete classes of Decl.
bool isFromHeaderUnit() const
Whether this declaration comes from a header unit.
The name of a declaration.
A little helper class used to produce diagnostics.
Concrete class used by the front-end to report problems and issues.
This represents one expression.
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 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.
An abstract interface that should be implemented by external AST sources that also provide informatio...
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
Keeps track of options that affect how file operations are performed.
Represents a function declaration or definition.
A global index for a set of module files, providing information about the identifiers within those mo...
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.
In-memory cache for modules.
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.
Describes a module or submodule.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
This represents a decl that may have a name.
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
ASTReaderListener implementation to validate the information of the PCH file against an initialized P...
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadDiagnosticOptions(IntrusiveRefCntPtr< DiagnosticOptions > DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
PCHValidator(Preprocessor &PP, ASTReader &Reader)
void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool 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.
Smart pointer class that efficiently represents Objective-C method names.
static AlignPackInfo getFromRawEncoding(unsigned Encoding)
Sema - This implements semantic analysis and AST building for C.
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
SimpleASTReaderListener(Preprocessor &PP)
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, SourceLocationSequence *=nullptr)
Serialized encoding of a sequence of SourceLocations.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
bool isLoadedSourceLocation(SourceLocation Loc) const
Returns true if Loc came from a PCH/Module.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
Options for controlling the target.
Token - This structure provides full information about a lexed token.
The base class of the type hierarchy.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Information about a module that has been loaded by the ASTReader.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
StringRef ModuleOffsetMap
The module offset map data for this file.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
ModuleFile & getPrimaryModule()
Returns the primary module associated with the manager, that is, the first module loaded.
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::const_iterator > ModuleConstIterator
void addInMemoryBuffer(StringRef FileName, std::unique_ptr< llvm::MemoryBuffer > Buffer)
Add an in-memory buffer the list of known buffers.
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::reverse_iterator > ModuleReverseIterator
llvm::pointee_iterator< SmallVectorImpl< std::unique_ptr< ModuleFile > >::iterator > ModuleIterator
Class that performs lookup for an identifier stored in an AST file.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
uint64_t TypeID
An ID number that refers to a type in an AST file.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
uint32_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
uint32_t MacroID
An ID number that refers to a macro in an AST file.
The JSON file list parser is used to communicate input to InstallAPI.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
PredefinedDeclIDs
Predefined declaration IDs.
@ Result
The result type of a method or function.
std::optional< unsigned > getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
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)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...