82#include "llvm/ADT/APFloat.h"
83#include "llvm/ADT/APInt.h"
84#include "llvm/ADT/APSInt.h"
85#include "llvm/ADT/ArrayRef.h"
86#include "llvm/ADT/DenseMap.h"
87#include "llvm/ADT/DenseSet.h"
88#include "llvm/ADT/Hashing.h"
89#include "llvm/ADT/PointerIntPair.h"
90#include "llvm/ADT/STLExtras.h"
91#include "llvm/ADT/ScopeExit.h"
92#include "llvm/ADT/SmallPtrSet.h"
93#include "llvm/ADT/SmallString.h"
94#include "llvm/ADT/SmallVector.h"
95#include "llvm/ADT/StringMap.h"
96#include "llvm/ADT/StringRef.h"
97#include "llvm/Bitstream/BitCodes.h"
98#include "llvm/Bitstream/BitstreamWriter.h"
99#include "llvm/Support/Casting.h"
100#include "llvm/Support/Compression.h"
101#include "llvm/Support/DJB.h"
102#include "llvm/Support/Endian.h"
103#include "llvm/Support/EndianStream.h"
104#include "llvm/Support/Error.h"
105#include "llvm/Support/ErrorHandling.h"
106#include "llvm/Support/LEB128.h"
107#include "llvm/Support/MemoryBuffer.h"
108#include "llvm/Support/OnDiskHashTable.h"
109#include "llvm/Support/Path.h"
110#include "llvm/Support/SHA1.h"
111#include "llvm/Support/TimeProfiler.h"
112#include "llvm/Support/VersionTuple.h"
113#include "llvm/Support/raw_ostream.h"
128using namespace clang;
131template <
typename T,
typename Allocator>
132static StringRef
bytes(
const std::vector<T, Allocator> &
v) {
133 if (
v.empty())
return StringRef();
134 return StringRef(
reinterpret_cast<const char*
>(&
v[0]),
135 sizeof(
T) *
v.size());
140 return StringRef(
reinterpret_cast<const char*
>(
v.data()),
141 sizeof(
T) *
v.size());
144static std::string
bytes(
const std::vector<bool> &
V) {
146 Str.reserve(
V.size() / 8);
147 for (
unsigned I = 0,
E =
V.size(); I <
E;) {
149 for (
unsigned Bit = 0; Bit < 8 && I <
E; ++Bit, ++I)
162#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
163 case Type::CLASS_ID: return TYPE_##CODE_ID;
164#include "clang/Serialization/TypeBitCodes.def"
166 llvm_unreachable(
"shouldn't be serializing a builtin type this way");
168 llvm_unreachable(
"bad type kind");
173struct AffectingModuleMaps {
174 llvm::DenseSet<FileID> DefinitionFileIDs;
175 llvm::DenseSet<const FileEntry *> DefinitionFiles;
178std::optional<AffectingModuleMaps>
191 enum AffectedReason :
bool {
192 AR_TextualHeader = 0,
193 AR_ImportOrTextualHeader = 1,
195 auto AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {
196 LHS = std::max(LHS, RHS);
198 llvm::DenseMap<FileID, AffectedReason> ModuleMaps;
199 llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;
200 auto CollectModuleMapsForHierarchy = [&](
const Module *M,
201 AffectedReason Reason) {
207 if (
auto [It, Inserted] = ProcessedModules.insert({M, Reason});
208 !Inserted && Reason <= It->second) {
214 std::queue<const Module *> Q;
217 const Module *Mod = Q.front();
223 AssignMostImportant(ModuleMaps[F], Reason);
228 AssignMostImportant(ModuleMaps[UniqF], Reason);
237 CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);
239 std::queue<const Module *> Q;
242 const Module *CurrentModule = Q.front();
246 CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);
248 CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);
262 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
276 if (
const Module *M = KH.getModule())
277 CollectModuleMapsForHierarchy(M, AR_TextualHeader);
298 llvm::DenseSet<const FileEntry *> ModuleFileEntries;
299 llvm::DenseSet<FileID> ModuleFileIDs;
300 for (
auto [FID, Reason] : ModuleMaps) {
301 if (Reason == AR_ImportOrTextualHeader)
302 ModuleFileIDs.insert(FID);
303 if (
auto *FE =
SM.getFileEntryForID(FID))
304 ModuleFileEntries.insert(FE);
307 AffectingModuleMaps R;
308 R.DefinitionFileIDs = std::move(ModuleFileIDs);
309 R.DefinitionFiles = std::move(ModuleFileEntries);
320 : Writer(Writer), BasicWriter(Context, Writer,
Record) {}
323 if (
T.hasLocalNonFastQualifiers()) {
330 const Type *typePtr =
T.getTypePtr();
353#define ABSTRACT_TYPELOC(CLASS, PARENT)
354#define TYPELOC(CLASS, PARENT) \
355 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
356#include "clang/AST/TypeLocNodes.def"
424 VisitArrayTypeLoc(TL);
428 VisitArrayTypeLoc(TL);
432 VisitArrayTypeLoc(TL);
435void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
437 VisitArrayTypeLoc(TL);
440void TypeLocWriter::VisitDependentAddressSpaceTypeLoc(
444 addSourceLocation(
range.getBegin());
445 addSourceLocation(
range.getEnd());
449void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
458void TypeLocWriter::VisitDependentVectorTypeLoc(
470 addSourceLocation(
range.getBegin());
471 addSourceLocation(
range.getEnd());
476void TypeLocWriter::VisitDependentSizedMatrixTypeLoc(
480 addSourceLocation(
range.getBegin());
481 addSourceLocation(
range.getEnd());
492 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i)
497 VisitFunctionTypeLoc(TL);
501 VisitFunctionTypeLoc(TL);
566void TypeLocWriter::VisitAutoTypeLoc(
AutoTypeLoc TL) {
571 Record.AddConceptReference(CR);
577void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
586void TypeLocWriter::VisitEnumTypeLoc(
EnumTypeLoc TL) {
602void TypeLocWriter::VisitHLSLAttributedResourceTypeLoc(
611void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(
616void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(
621void TypeLocWriter::VisitTemplateSpecializationTypeLoc(
627 for (
unsigned i = 0, e = TL.
getNumArgs(); i != e; ++i)
656void TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc(
700void TypeLocWriter::VisitPipeTypeLoc(
PipeTypeLoc TL) {
707void TypeLocWriter::VisitDependentBitIntTypeLoc(
712void ASTWriter::WriteTypeAbbrevs() {
713 using namespace llvm;
715 std::shared_ptr<BitCodeAbbrev> Abv;
718 Abv = std::make_shared<BitCodeAbbrev>();
720 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
721 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3));
722 TypeExtQualAbbrev = Stream.EmitAbbrev(std::move(Abv));
730 llvm::BitstreamWriter &Stream,
734 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID,
Record);
737 if (!Name || Name[0] == 0)
741 Record.push_back(*Name++);
742 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
Record);
746 llvm::BitstreamWriter &Stream,
751 Record.push_back(*Name++);
752 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME,
Record);
757#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
889void ASTWriter::WriteBlockInfoBlock() {
891 Stream.EnterBlockInfoBlock();
893#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
894#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
897 BLOCK(CONTROL_BLOCK);
907 BLOCK(OPTIONS_BLOCK);
914 BLOCK(INPUT_FILES_BLOCK);
979 BLOCK(SOURCE_MANAGER_BLOCK);
987 BLOCK(PREPROCESSOR_BLOCK);
995 BLOCK(SUBMODULE_BLOCK);
1017 BLOCK(COMMENTS_BLOCK);
1021 BLOCK(DECLTYPES_BLOCK);
1025 RECORD(TYPE_BLOCK_POINTER);
1026 RECORD(TYPE_LVALUE_REFERENCE);
1027 RECORD(TYPE_RVALUE_REFERENCE);
1028 RECORD(TYPE_MEMBER_POINTER);
1029 RECORD(TYPE_CONSTANT_ARRAY);
1030 RECORD(TYPE_INCOMPLETE_ARRAY);
1031 RECORD(TYPE_VARIABLE_ARRAY);
1034 RECORD(TYPE_FUNCTION_NO_PROTO);
1035 RECORD(TYPE_FUNCTION_PROTO);
1037 RECORD(TYPE_TYPEOF_EXPR);
1041 RECORD(TYPE_OBJC_INTERFACE);
1042 RECORD(TYPE_OBJC_OBJECT_POINTER);
1045 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1046 RECORD(TYPE_UNRESOLVED_USING);
1047 RECORD(TYPE_INJECTED_CLASS_NAME);
1048 RECORD(TYPE_OBJC_OBJECT);
1049 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1050 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1051 RECORD(TYPE_DEPENDENT_NAME);
1052 RECORD(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION);
1053 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1055 RECORD(TYPE_MACRO_QUALIFIED);
1056 RECORD(TYPE_PACK_EXPANSION);
1058 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1060 RECORD(TYPE_UNARY_TRANSFORM);
1064 RECORD(TYPE_OBJC_TYPE_PARAM);
1143 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1149 BLOCK(EXTENSION_BLOCK);
1152 BLOCK(UNHASHED_CONTROL_BLOCK);
1173 return Changed | llvm::sys::path::remove_dots(
Path);
1188 assert(
Filename &&
"No file name to adjust?");
1190 if (BaseDir.empty())
1195 for (;
Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1205 if (!llvm::sys::path::is_separator(
Filename[Pos])) {
1206 if (!llvm::sys::path::is_separator(BaseDir.back()))
1223std::pair<ASTFileSignature, ASTFileSignature>
1224ASTWriter::createSignature()
const {
1225 StringRef AllBytes(Buffer.data(), Buffer.size());
1228 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1233 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1236 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1238 Hasher.update(AllBytes.slice(ASTBlockRange.second, StringRef::npos));
1241 return std::make_pair(ASTBlockHash, Signature);
1246 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1248 assert(WritingModule);
1253 for (
auto [ExportImported, _] : WritingModule->
Exports)
1254 Hasher.update(ExportImported->Signature);
1278 for (
Module *M : TouchedTopLevelModules)
1286 for (uint8_t Byte : S) {
1287 Stream.BackpatchByte(BitNo, Byte);
1299 if (!WritingModule ||
1306 std::tie(ASTBlockHash, Signature) = createSignature();
1314void ASTWriter::writeUnhashedControlBlock(
Preprocessor &PP) {
1315 using namespace llvm;
1318 Stream.FlushToWord();
1319 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1342 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1344 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1345 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1348 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1349 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1353 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1354 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1355 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1356 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1359 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1360 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1369 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1370#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1371#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1372 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1373#include "clang/Basic/DiagnosticOptions.def"
1375 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1378 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1387 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1389 Record.push_back(HSOpts.UserEntries.size());
1390 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1393 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1399 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1400 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1402 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1406 Record.push_back(HSOpts.VFSOverlayFiles.size());
1407 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1413 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1414 WritePragmaDiagnosticMappings(Diags, WritingModule);
1419 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1421 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1422 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1423 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1425 HSEntryUsage.size()};
1426 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1432 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1433 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1434 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1435 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1436 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1438 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1443 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1447void ASTWriter::WriteControlBlock(
Preprocessor &PP, StringRef isysroot) {
1448 using namespace llvm;
1457 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1459 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1461 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1462 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1463 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1465 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1466 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1467 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1468 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1469 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1470 assert((!WritingModule || isysroot.empty()) &&
1471 "writing module as a relocatable PCH?");
1476 CLANG_VERSION_MAJOR,
1477 CLANG_VERSION_MINOR,
1481 ASTHasCompilerErrors};
1482 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1486 if (WritingModule) {
1488 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1490 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1491 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1493 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->
Name);
1496 if (WritingModule && WritingModule->
Directory) {
1501 BaseDir.assign(CWD->getName());
1516 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1518 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1519 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1522 Stream.EmitRecordWithBlob(AbbrevCode,
Record, BaseDir);
1526 BaseDirectory.assign(BaseDir.begin(), BaseDir.end());
1527 }
else if (!isysroot.empty()) {
1529 BaseDirectory = std::string(isysroot);
1538 ? Map.getModuleMapFileForUniquing(WritingModule)
1539 ->getNameAsRequested()
1544 if (
auto *AdditionalModMaps =
1545 Map.getAdditionalModuleMapFiles(WritingModule)) {
1546 Record.push_back(AdditionalModMaps->size());
1548 AdditionalModMaps->end());
1563 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1564 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1565 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1566 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1567 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1573 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1579 if (!M.isDirectlyImported())
1589 Record.push_back(M.StandardCXXModule);
1593 if (M.StandardCXXModule) {
1608 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1618#define LANGOPT(Name, Bits, Default, Description) \
1619 Record.push_back(LangOpts.Name);
1620#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
1621 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1622#include "clang/Basic/LangOptions.def"
1623#define SANITIZER(NAME, ID) \
1624 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1625#include "clang/Basic/Sanitizers.def"
1665 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1705 bool WriteMacros = !SkipMacros;
1706 Record.push_back(WriteMacros);
1710 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1718 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1723 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1739 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1741 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1742 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1743 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1762struct InputFileEntry {
1766 bool BufferOverridden;
1781 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1782 if (!IsSLocAffecting[IncludeFID.ID])
1790 using namespace llvm;
1795 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1797 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1798 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1799 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1800 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1801 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1802 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1803 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1804 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1805 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1806 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1809 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1811 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1812 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1813 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1815 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1818 std::vector<InputFileEntry> UserFiles;
1819 std::vector<InputFileEntry> SystemFiles;
1823 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1830 if (!
Cache->OrigEntry)
1834 if (!IsSLocFileEntryAffecting[I])
1837 InputFileEntry Entry(*
Cache->OrigEntry);
1838 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1839 Entry.IsTransient =
Cache->IsTransient;
1840 Entry.BufferOverridden =
Cache->BufferOverridden;
1843 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1844 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1851 auto MemBuff =
Cache->getBufferIfLoaded();
1853 ContentHash = xxh3_64bits(MemBuff->getBuffer());
1856 << Entry.File.getName();
1858 Entry.ContentHash[0] =
uint32_t(ContentHash);
1859 Entry.ContentHash[1] =
uint32_t(ContentHash >> 32);
1860 if (Entry.IsSystemFile)
1861 SystemFiles.push_back(Entry);
1863 UserFiles.push_back(Entry);
1867 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(UserFiles),
1868 std::move(SystemFiles));
1870 unsigned UserFilesNum = 0;
1872 std::vector<uint64_t> InputFileOffsets;
1873 for (
const auto &Entry : SortedFiles) {
1874 uint32_t &InputFileID = InputFileIDs[Entry.File];
1875 if (InputFileID != 0)
1879 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1881 InputFileID = InputFileOffsets.size();
1883 if (!Entry.IsSystemFile)
1895 if (Name == NameAsRequested)
1898 RecordData::value_type
Record[] = {
1900 InputFileOffsets.size(),
1903 Entry.BufferOverridden,
1907 NameAsRequested.size()};
1909 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1910 (NameAsRequested + Name).str());
1916 Entry.ContentHash[1]};
1917 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1924 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1926 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1927 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1929 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1930 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
1934 InputFileOffsets.size(), UserFilesNum};
1935 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
1945 using namespace llvm;
1947 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1949 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1950 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1951 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1952 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1954 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1955 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1956 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
1957 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1958 return Stream.EmitAbbrev(std::move(Abbrev));
1964 using namespace llvm;
1966 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1968 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1969 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1970 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1971 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1972 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1973 return Stream.EmitAbbrev(std::move(Abbrev));
1980 using namespace llvm;
1982 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1986 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1987 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1988 return Stream.EmitAbbrev(std::move(Abbrev));
1994 using namespace llvm;
1996 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1998 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2000 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2001 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2002 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2003 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2004 return Stream.EmitAbbrev(std::move(Abbrev));
2009static std::pair<unsigned, unsigned>
2011 llvm::encodeULEB128(KeyLen, Out);
2012 llvm::encodeULEB128(DataLen, Out);
2013 return std::make_pair(KeyLen, DataLen);
2019 class HeaderFileInfoTrait {
2023 HeaderFileInfoTrait(
ASTWriter &Writer) : Writer(Writer) {}
2030 using key_type_ref =
const key_type &;
2032 using UnresolvedModule =
2033 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2039 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2043 bool AlreadyIncluded;
2047 using data_type_ref =
const data_type &;
2056 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2057 memcpy(buf, &key.Size,
sizeof(key.Size));
2058 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2059 return llvm::xxh3_64bits(buf);
2062 std::pair<unsigned, unsigned>
2063 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2064 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2066 for (
auto ModInfo :
Data.KnownHeaders)
2069 if (
Data.Unresolved.getPointer())
2074 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2075 using namespace llvm::support;
2077 endian::Writer
LE(Out, llvm::endianness::little);
2082 Out.write(key.Filename.data(), KeyLen);
2085 void EmitData(raw_ostream &Out, key_type_ref key,
2086 data_type_ref
Data,
unsigned DataLen) {
2087 using namespace llvm::support;
2089 endian::Writer
LE(Out, llvm::endianness::little);
2090 uint64_t Start = Out.tell(); (void)Start;
2092 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2093 | (
Data.HFI.isImport << 5)
2095 Data.HFI.isPragmaOnce << 4)
2096 | (
Data.HFI.DirInfo << 1);
2097 LE.write<uint8_t>(Flags);
2099 if (
Data.HFI.LazyControllingMacro.isID())
2108 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2113 for (
auto ModInfo :
Data.KnownHeaders)
2114 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2115 if (
Data.Unresolved.getPointer())
2116 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2118 assert(Out.tell() - Start == DataLen &&
"Wrong data length");
2127void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2128 HeaderFileInfoTrait GeneratorTrait(*
this);
2129 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2131 unsigned NumHeaderSearchEntries = 0;
2138 if (WritingModule) {
2140 while (!Worklist.empty()) {
2141 Module *M = Worklist.pop_back_val();
2158 if (!
U.Size || (!
U.ModTime && IncludeTimestamps)) {
2159 PP->
Diag(
U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2167 llvm::sys::path::append(
Filename,
U.FileName);
2170 StringRef FilenameDup = strdup(
Filename.c_str());
2171 SavedStrings.push_back(FilenameDup.data());
2173 HeaderFileInfoTrait::key_type Key = {
2174 FilenameDup, *
U.Size, IncludeTimestamps ? *
U.ModTime : 0};
2175 HeaderFileInfoTrait::data_type
Data = {
2180 ++NumHeaderSearchEntries;
2183 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2193 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2212 Filename = StringRef(strdup(FilenameTmp.c_str()));
2213 SavedStrings.push_back(
Filename.data());
2218 HeaderFileInfoTrait::key_type Key = {
2221 HeaderFileInfoTrait::data_type
Data = {
2225 ++NumHeaderSearchEntries;
2232 using namespace llvm::support;
2234 llvm::raw_svector_ostream Out(TableData);
2236 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2237 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2241 using namespace llvm;
2243 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2245 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2246 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2247 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2248 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2249 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2253 NumHeaderSearchEntries, TableData.size()};
2254 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2257 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2258 free(
const_cast<char *
>(SavedStrings[I]));
2261static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2262 unsigned SLocBufferBlobCompressedAbbrv,
2263 unsigned SLocBufferBlobAbbrv) {
2264 using RecordDataType = ASTWriter::RecordData::value_type;
2269 if (llvm::compression::zstd::isAvailable()) {
2270 llvm::compression::zstd::compress(
2271 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2273 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2274 llvm::toStringRef(CompressedBuffer));
2277 if (llvm::compression::zlib::isAvailable()) {
2278 llvm::compression::zlib::compress(
2279 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2281 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2282 llvm::toStringRef(CompressedBuffer));
2287 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2298void ASTWriter::WriteSourceManagerBlock(
SourceManager &SourceMgr) {
2303 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2309 unsigned SLocBufferBlobCompressedAbbrv =
2315 std::vector<uint32_t> SLocEntryOffsets;
2316 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2322 FileID FID = FileID::get(I);
2326 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2327 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2333 if (
Cache->OrigEntry) {
2346 if (!IsSLocAffecting[I])
2348 SLocEntryOffsets.push_back(Offset);
2352 Record.push_back(
File.getFileCharacteristic());
2355 bool EmitBlob =
false;
2358 "Writing to AST an overridden file is not supported");
2361 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2364 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2366 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2367 if (FDI != FileDeclIDs.end()) {
2368 Record.push_back(FDI->second->FirstDeclIndex);
2369 Record.push_back(FDI->second->DeclIDs.size());
2375 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2386 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2388 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2389 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2390 StringRef(Name.data(), Name.size() + 1));
2397 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2400 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2401 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2402 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2403 SLocBufferBlobAbbrv);
2408 SLocEntryOffsets.push_back(Offset);
2424 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2425 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2431 if (SLocEntryOffsets.empty())
2436 using namespace llvm;
2438 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2440 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2441 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2442 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2443 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2444 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2446 RecordData::value_type
Record[] = {
2449 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2450 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2451 bytes(SLocEntryOffsets));
2462 llvm::DenseMap<int, int> FilenameMap;
2463 FilenameMap[-1] = -1;
2464 for (
const auto &L : LineTable) {
2467 for (
auto &LE : L.second) {
2468 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2469 FilenameMap.size() - 1)).second)
2476 for (
const auto &L : LineTable) {
2484 Record.push_back(L.second.size());
2485 for (
const auto &LE : L.second) {
2488 Record.push_back(FilenameMap[
LE.FilenameID]);
2489 Record.push_back((
unsigned)
LE.FileKind);
2490 Record.push_back(
LE.IncludeOffset);
2505 if (MI->isBuiltinMacro())
2521void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2522 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2526 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2541 if (AssumeNonNullLoc.
isValid()) {
2555 Record.push_back(SkipInfo->FoundNonSkipPortion);
2556 Record.push_back(SkipInfo->FoundElse);
2563 Record.push_back(Cond.WasSkipping);
2564 Record.push_back(Cond.FoundNonSkip);
2565 Record.push_back(Cond.FoundElse);
2595 if (
Id.second->hadMacroDefinition() &&
2596 (!
Id.second->isFromAST() ||
2597 Id.second->hasChangedSinceDeserialization()))
2598 MacroIdentifiers.push_back(
Id.second);
2601 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2607 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2608 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2611 bool EmittedModuleMacros =
false;
2628 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2630 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2631 Record.push_back(VisMD->isPublic());
2633 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2636 ModuleMacroRecord.clear();
2637 EmittedModuleMacros =
true;
2647 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2649 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2650 Record.push_back(VisMD->isPublic());
2657 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2658 while (!Worklist.empty()) {
2659 auto *
Macro = Worklist.pop_back_val();
2662 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2664 for (
auto *M :
Macro->overrides())
2665 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2668 ModuleMacroRecord.clear();
2671 for (
auto *M :
Macro->overrides())
2672 if (++Visits[M] == M->getNumOverridingMacros())
2673 Worklist.push_back(M);
2675 EmittedModuleMacros =
true;
2678 if (
Record.empty() && !EmittedModuleMacros)
2681 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2692 std::vector<uint32_t> MacroOffsets;
2694 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2699 if (ID < FirstMacroID) {
2700 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2705 unsigned Index =
ID - FirstMacroID;
2706 if (Index >= MacroOffsets.size())
2707 MacroOffsets.resize(Index + 1);
2709 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2710 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2711 MacroOffsets[Index] = Offset;
2738 Stream.EmitRecord(Code,
Record);
2742 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2757 using namespace llvm;
2759 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2761 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2762 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2763 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2764 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2766 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2770 MacroOffsetsBase - ASTBlockStartOffset};
2771 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2776 uint64_t MacroOffsetsBase) {
2786 unsigned NumPreprocessingRecords = 0;
2787 using namespace llvm;
2790 unsigned InclusionAbbrev = 0;
2792 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2794 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2795 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2796 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2797 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2798 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2799 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2802 unsigned FirstPreprocessorEntityID
2803 = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0)
2805 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2810 (void)++
E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2813 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2814 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2815 SourceRange R = getAdjustedRange((*E)->getSourceRange());
2816 PreprocessedEntityOffsets.emplace_back(
2820 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*
E)) {
2822 MacroDefinitions[MD] = NextPreprocessorEntityID;
2829 if (
auto *ME = dyn_cast<MacroExpansion>(*
E)) {
2830 Record.push_back(ME->isBuiltinMacro());
2831 if (ME->isBuiltinMacro())
2834 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2839 if (
auto *ID = dyn_cast<InclusionDirective>(*
E)) {
2841 Record.push_back(
ID->getFileName().size());
2842 Record.push_back(
ID->wasInQuotes());
2843 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2844 Record.push_back(
ID->importedModule());
2846 Buffer +=
ID->getFileName();
2850 Buffer +=
ID->getFile()->getName();
2851 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2855 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2860 if (NumPreprocessingRecords > 0) {
2861 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2864 using namespace llvm;
2866 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2868 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2869 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2870 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2873 FirstPreprocessorEntityID -
2875 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2876 bytes(PreprocessedEntityOffsets));
2881 if (SkippedRanges.size() > 0) {
2882 std::vector<PPSkippedRange> SerializedSkippedRanges;
2883 SerializedSkippedRanges.reserve(SkippedRanges.size());
2884 for (
auto const&
Range : SkippedRanges)
2885 SerializedSkippedRanges.emplace_back(
2889 using namespace llvm;
2890 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2892 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2893 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2897 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2898 bytes(SerializedSkippedRanges));
2906 auto Known = SubmoduleIDs.find(Mod);
2907 if (Known != SubmoduleIDs.end())
2908 return Known->second;
2911 if (Top != WritingModule &&
2913 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2916 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2919unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2932 unsigned ChildModules = 0;
2936 return ChildModules + 1;
2939void ASTWriter::WriteSubmodules(
Module *WritingModule,
ASTContext *Context) {
2944 using namespace llvm;
2946 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2948 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2949 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2950 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
2951 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2952 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
2953 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2954 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2955 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2956 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2957 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2958 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2959 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2960 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2961 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2962 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2963 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2964 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2966 Abbrev = std::make_shared<BitCodeAbbrev>();
2968 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2969 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2971 Abbrev = std::make_shared<BitCodeAbbrev>();
2973 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2974 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2976 Abbrev = std::make_shared<BitCodeAbbrev>();
2978 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2979 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2981 Abbrev = std::make_shared<BitCodeAbbrev>();
2983 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2984 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2986 Abbrev = std::make_shared<BitCodeAbbrev>();
2988 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2989 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2990 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2992 Abbrev = std::make_shared<BitCodeAbbrev>();
2994 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2995 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2997 Abbrev = std::make_shared<BitCodeAbbrev>();
2999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3000 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3002 Abbrev = std::make_shared<BitCodeAbbrev>();
3004 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3005 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3007 Abbrev = std::make_shared<BitCodeAbbrev>();
3009 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3010 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3012 Abbrev = std::make_shared<BitCodeAbbrev>();
3014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3016 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3018 Abbrev = std::make_shared<BitCodeAbbrev>();
3020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3021 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3023 Abbrev = std::make_shared<BitCodeAbbrev>();
3025 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3026 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3027 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3029 Abbrev = std::make_shared<BitCodeAbbrev>();
3031 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3032 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3035 RecordData::value_type
Record[] = {
3041 std::queue<Module *> Q;
3042 Q.push(WritingModule);
3043 while (!Q.empty()) {
3046 unsigned ID = getSubmoduleID(Mod);
3050 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3051 ParentID = SubmoduleIDs[Mod->
Parent];
3058 FileID UnadjustedInferredFID;
3061 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3068 (RecordData::value_type)Mod->
Kind,
3070 (RecordData::value_type)InferredFID,
3081 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3087 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record, R.FeatureName);
3091 if (std::optional<Module::Header> UmbrellaHeader =
3094 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3095 UmbrellaHeader->NameAsWritten);
3096 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3099 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3100 UmbrellaDir->NameAsWritten);
3105 unsigned RecordKind;
3116 for (
const auto &HL : HeaderLists) {
3117 RecordData::value_type
Record[] = {HL.RecordKind};
3118 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3119 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3128 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3136 Record.push_back(getSubmoduleID(I));
3144 Record.push_back(getSubmoduleID(I));
3151 for (
const auto &
E : Mod->
Exports) {
3154 Record.push_back(getSubmoduleID(
E.getPointer()));
3170 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3178 getSubmoduleID(
C.Other)};
3179 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3185 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3212 assert((NextSubmoduleID - FirstSubmoduleID ==
3214 "Wrong # of submodules; found a reference to a non-local, "
3215 "non-imported submodule?");
3220 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3222 unsigned CurrID = 0;
3225 auto EncodeDiagStateFlags =
3226 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3229 {(
unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3230 (
unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3231 (
unsigned)DS->SuppressSystemWarnings})
3236 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3239 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3240 bool IncludeNonPragmaStates) {
3243 assert(Flags == EncodeDiagStateFlags(State) &&
3244 "diag state flags vary in single AST file");
3248 assert(!IncludeNonPragmaStates ||
3249 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3251 unsigned &DiagStateID = DiagStateIDMap[State];
3252 Record.push_back(DiagStateID);
3254 if (DiagStateID == 0) {
3255 DiagStateID = ++CurrID;
3259 auto SizeIdx =
Record.size();
3261 for (
const auto &I : *State) {
3263 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3267 if (!I.second.isPragma() &&
3270 Mappings.push_back(I);
3274 llvm::sort(Mappings, llvm::less_first());
3276 for (
const auto &I : Mappings) {
3277 Record.push_back(I.first);
3278 Record.push_back(I.second.serialize());
3285 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3288 auto NumLocationsIdx =
Record.size();
3292 unsigned NumLocations = 0;
3293 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3294 if (!FileIDAndFile.first.isValid() ||
3295 !FileIDAndFile.second.HasLocalTransitions)
3301 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3302 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3303 Record.push_back(getAdjustedOffset(StatePoint.Offset));
3304 AddDiagState(StatePoint.State,
false);
3309 Record[NumLocationsIdx] = NumLocations;
3318 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3331 IdxRef =
TypeIdx(0, NextTypeID++);
3335 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3339 ASTTypeWriter(Context, *
this).write(
T) - DeclTypesBlockStartOffset;
3343 if (TypeOffsets.size() == Index)
3344 TypeOffsets.emplace_back(Offset);
3345 else if (TypeOffsets.size() < Index) {
3346 TypeOffsets.resize(Index + 1);
3347 TypeOffsets[Index].set(Offset);
3349 llvm_unreachable(
"Types emitted in wrong order");
3358 auto *ND = dyn_cast<NamedDecl>(
D);
3382 uint64_t Offset = Stream.GetCurrentBitNo();
3384 for (
const auto *
D : DC->
decls()) {
3397 KindDeclPairs.push_back(
D->
getKind());
3398 KindDeclPairs.push_back(
GetDeclRef(
D).getRawValue());
3401 ++NumLexicalDeclContexts;
3403 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3404 bytes(KindDeclPairs));
3408void ASTWriter::WriteTypeDeclOffsets() {
3409 using namespace llvm;
3412 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3414 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3415 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3416 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3419 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3423 Abbrev = std::make_shared<BitCodeAbbrev>();
3425 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3426 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3427 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3430 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3434void ASTWriter::WriteFileDeclIDsMap() {
3435 using namespace llvm;
3438 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3439 for (
const auto &
P : FileDeclIDs)
3440 SortedFileDeclIDs.push_back(std::make_pair(
P.first,
P.second.get()));
3441 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3445 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3446 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3447 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3448 llvm::stable_sort(Info.DeclIDs);
3449 for (
auto &LocDeclEntry : Info.DeclIDs)
3450 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3453 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3455 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3456 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3457 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3459 FileGroupedDeclIDs.size()};
3460 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3463void ASTWriter::WriteComments(
ASTContext &Context) {
3465 auto _ = llvm::make_scope_exit([
this] { Stream.ExitBlock(); });
3476 for (
const auto &FO : Context.
Comments.OrderedComments) {
3477 for (
const auto &OC : FO.second) {
3496class ASTMethodPoolTrait {
3501 using key_type_ref = key_type;
3507 using data_type_ref =
const data_type &;
3512 explicit ASTMethodPoolTrait(
ASTWriter &Writer) : Writer(Writer) {}
3518 std::pair<unsigned, unsigned>
3519 EmitKeyDataLength(raw_ostream& Out,
Selector Sel,
3520 data_type_ref Methods) {
3524 unsigned DataLen = 4 + 2 + 2;
3527 if (ShouldWriteMethodListNode(Method))
3528 DataLen +=
sizeof(
DeclID);
3531 if (ShouldWriteMethodListNode(Method))
3532 DataLen +=
sizeof(
DeclID);
3536 void EmitKey(raw_ostream& Out,
Selector Sel,
unsigned) {
3537 using namespace llvm::support;
3539 endian::Writer
LE(Out, llvm::endianness::little);
3541 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3544 LE.write<uint16_t>(N);
3547 for (
unsigned I = 0; I != N; ++I)
3552 void EmitData(raw_ostream& Out, key_type_ref,
3553 data_type_ref Methods,
unsigned DataLen) {
3554 using namespace llvm::support;
3556 endian::Writer
LE(Out, llvm::endianness::little);
3557 uint64_t Start = Out.tell(); (void)Start;
3559 unsigned NumInstanceMethods = 0;
3562 if (ShouldWriteMethodListNode(Method))
3563 ++NumInstanceMethods;
3565 unsigned NumFactoryMethods = 0;
3568 if (ShouldWriteMethodListNode(Method))
3569 ++NumFactoryMethods;
3571 unsigned InstanceBits = Methods.Instance.getBits();
3572 assert(InstanceBits < 4);
3573 unsigned InstanceHasMoreThanOneDeclBit =
3574 Methods.Instance.hasMoreThanOneDecl();
3575 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3576 (InstanceHasMoreThanOneDeclBit << 2) |
3578 unsigned FactoryBits = Methods.Factory.getBits();
3579 assert(FactoryBits < 4);
3580 unsigned FactoryHasMoreThanOneDeclBit =
3581 Methods.Factory.hasMoreThanOneDecl();
3582 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3583 (FactoryHasMoreThanOneDeclBit << 2) |
3585 LE.write<uint16_t>(FullInstanceBits);
3586 LE.write<uint16_t>(FullFactoryBits);
3589 if (ShouldWriteMethodListNode(Method))
3593 if (ShouldWriteMethodListNode(Method))
3596 assert(Out.tell() - Start == DataLen &&
"Data length is wrong");
3601 return (
Node->getMethod() && !
Node->getMethod()->isFromASTFile());
3612void ASTWriter::WriteSelectors(
Sema &SemaRef) {
3613 using namespace llvm;
3618 unsigned NumTableEntries = 0;
3621 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3622 ASTMethodPoolTrait Trait(*
this);
3626 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3627 for (
auto &SelectorAndID : SelectorIDs) {
3630 SemaObjC::GlobalMethodPool::iterator F =
3632 ASTMethodPoolTrait::data_type
Data = {
3638 Data.Instance = F->second.first;
3639 Data.Factory = F->second.second;
3643 if (Chain && ID < FirstSelectorID) {
3645 bool changed =
false;
3648 if (!M->getMethod()->isFromASTFile()) {
3656 if (!M->getMethod()->isFromASTFile()) {
3664 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3675 using namespace llvm::support;
3677 ASTMethodPoolTrait Trait(*
this);
3678 llvm::raw_svector_ostream Out(MethodPool);
3680 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3681 BucketOffset =
Generator.Emit(Out, Trait);
3685 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3687 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3688 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3689 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3690 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3696 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3700 Abbrev = std::make_shared<BitCodeAbbrev>();
3702 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3703 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3704 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3705 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3709 RecordData::value_type
Record[] = {
3712 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3713 bytes(SelectorOffsets));
3719void ASTWriter::WriteReferencedSelectorsPool(
Sema &SemaRef) {
3720 using namespace llvm;
3732 Selector Sel = SelectorAndLocation.first;
3734 Writer.AddSelectorRef(Sel);
3756 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3758 if (!Redecl->isFromASTFile()) {
3762 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3765 return cast<NamedDecl>(Redecl);
3770 if (Redecl->getOwningModuleID() == 0)
3775 if (!
First->isFromASTFile())
3776 return cast<NamedDecl>(
First);
3786bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3787 bool IsModule,
bool IsCPlusPlus) {
3788 bool NeedDecls = !IsModule || !IsCPlusPlus;
3790 bool IsInteresting =
3794 if (MacroOffset || II->
isPoisoned() || (!IsModule && IsInteresting) ||
3805 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3806 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3809class ASTIdentifierTableTrait {
3822 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3828 using key_type_ref = key_type;
3831 using data_type_ref = data_type;
3839 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3840 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3841 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3843 bool needDecls()
const {
return NeedDecls; }
3846 return llvm::djbHash(II->
getName());
3854 std::pair<unsigned, unsigned>
3864 if (InterestingIdentifierOffsets &&
3866 InterestingIdentifierOffsets->push_back(Out.tell());
3876 if (NeedDecls && IdResolver)
3877 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3883 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3889 using namespace llvm::support;
3891 endian::Writer
LE(Out, llvm::endianness::little);
3901 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
3902 LE.write<uint16_t>(Bits);
3904 bool HadMacroDefinition = MacroOffset != 0;
3905 Bits = (Bits << 1) |
unsigned(HadMacroDefinition);
3907 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
3910 LE.write<uint16_t>(Bits);
3912 if (HadMacroDefinition)
3915 if (NeedDecls && IdResolver) {
3944 using namespace llvm;
3951 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
3952 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
3953 IsModule ? &InterestingIdents :
nullptr);
3957 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
3958 for (
auto IdentIDPair : IdentifierIDs) {
3961 assert(II &&
"NULL identifier in identifier table");
3966 (Trait.needDecls() &&
3975 using namespace llvm::support;
3979 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3980 BucketOffset =
Generator.Emit(Out, Trait);
3984 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3986 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3987 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3988 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3996 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3998 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4000 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4003 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4004 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4008 IdentifierOffsets.size()};
4009 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4010 bytes(IdentifierOffsets));
4014 if (!InterestingIdents.empty())
4022 PendingEmittingVTables.push_back(RD);
4031class ASTDeclContextNameLookupTraitBase {
4039 using data_type = std::pair<unsigned, unsigned>;
4040 using data_type_ref =
const data_type &;
4046 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4050 data_type getData(
const DeclIDsTy &LocalIDs) {
4051 unsigned Start = DeclIDs.size();
4052 for (
auto ID : LocalIDs)
4053 DeclIDs.push_back(
ID);
4054 return std::make_pair(Start, DeclIDs.size());
4058 unsigned Start = DeclIDs.size();
4063 return std::make_pair(Start, DeclIDs.size());
4066 void EmitFileRef(raw_ostream &Out,
ModuleFile *F)
const {
4068 "have reference to loaded module file but no chain?");
4070 using namespace llvm::support;
4073 llvm::endianness::little);
4076 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4078 data_type_ref Lookup) {
4079 unsigned KeyLen = 1;
4080 switch (Name.getKind()) {
4102 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4104 return {KeyLen, DataLen};
4108 using namespace llvm::support;
4110 endian::Writer
LE(Out, llvm::endianness::little);
4111 LE.write<uint8_t>(Name.getKind());
4112 switch (Name.getKind()) {
4125 "Invalid operator?");
4126 LE.write<uint8_t>(Name.getOperatorKind());
4135 llvm_unreachable(
"Invalid name kind?");
4138 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4139 using namespace llvm::support;
4141 endian::Writer
LE(Out, llvm::endianness::little);
4142 uint64_t Start = Out.tell(); (void)Start;
4143 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4145 assert(Out.tell() - Start == DataLen &&
"Data length is wrong");
4149class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4151 using primary_module_hash_type =
unsigned;
4153 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4154 using key_type_ref = key_type;
4156 explicit ModuleLevelNameLookupTrait(
ASTWriter &Writer)
4157 : ASTDeclContextNameLookupTraitBase(Writer) {}
4159 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4162 llvm::FoldingSetNodeID
ID;
4163 ID.AddInteger(Key.first.getHash());
4164 ID.AddInteger(Key.second);
4165 return ID.computeStableHash();
4168 std::pair<unsigned, unsigned>
4169 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4170 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4171 KeyLen +=
sizeof(Key.second);
4175 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4176 EmitKeyBase(Out, Key.first);
4177 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4178 LE.write<primary_module_hash_type>(Key.second);
4181 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4183 EmitDataBase(Out, Lookup, DataLen);
4192 return isModuleLocalDecl(
Parent);
4196 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
D))
4197 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4198 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4206static bool isTULocalInNamedModules(
NamedDecl *
D) {
4230template <
bool CollectingTULocalDecls>
4231class ASTDeclContextNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4233 using ModuleLevelDeclsMapTy =
4234 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4237 using key_type_ref = key_type;
4239 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4242 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4243 TULocalDeclsMapTy TULocalDeclsMap;
4246 explicit ASTDeclContextNameLookupTrait(
ASTWriter &Writer)
4247 : ASTDeclContextNameLookupTraitBase(Writer) {}
4249 template <
typename Coll> data_type getData(
const Coll &Decls) {
4250 unsigned Start = DeclIDs.size();
4268 if (isModuleLocalDecl(
D)) {
4269 if (std::optional<unsigned> PrimaryModuleHash =
4271 auto Key = std::make_pair(
D->getDeclName(), *PrimaryModuleHash);
4272 auto Iter = ModuleLocalDeclsMap.find(Key);
4273 if (
Iter == ModuleLocalDeclsMap.end())
4274 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4276 Iter->second.push_back(
ID);
4281 if constexpr (CollectingTULocalDecls) {
4282 if (isTULocalInNamedModules(
D)) {
4283 auto Iter = TULocalDeclsMap.find(
D->getDeclName());
4284 if (
Iter == TULocalDeclsMap.end())
4285 TULocalDeclsMap.insert({
D->getDeclName(), DeclIDsTy{
ID}});
4287 Iter->second.push_back(
ID);
4292 DeclIDs.push_back(
ID);
4294 return std::make_pair(Start, DeclIDs.size());
4297 using ASTDeclContextNameLookupTraitBase::getData;
4299 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4300 return ModuleLocalDeclsMap;
4303 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4305 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4307 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4309 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4311 data_type_ref Lookup) {
4312 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4317 return EmitKeyBase(Out, Name);
4320 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4322 EmitDataBase(Out, Lookup, DataLen);
4329class LazySpecializationInfoLookupTrait {
4335 using key_type_ref = key_type;
4338 using data_type = std::pair<unsigned, unsigned>;
4339 using data_type_ref =
const data_type &;
4344 explicit LazySpecializationInfoLookupTrait(
ASTWriter &Writer)
4347 template <
typename Col,
typename Col2>
4348 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4349 unsigned Start = Specs.size();
4357 Specs.push_back(Info);
4358 return std::make_pair(Start, Specs.size());
4361 data_type ImportData(
4363 unsigned Start = Specs.size();
4364 for (
auto ID : FromReader)
4365 Specs.push_back(
ID);
4366 return std::make_pair(Start, Specs.size());
4369 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4371 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4373 void EmitFileRef(raw_ostream &Out,
ModuleFile *F)
const {
4375 "have reference to loaded module file but no chain?");
4377 using namespace llvm::support;
4379 llvm::endianness::little);
4382 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4384 data_type_ref Lookup) {
4386 unsigned KeyLen = 4;
4388 (Lookup.second - Lookup.first);
4393 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4394 using namespace llvm::support;
4396 endian::Writer
LE(Out, llvm::endianness::little);
4400 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4402 using namespace llvm::support;
4404 endian::Writer
LE(Out, llvm::endianness::little);
4407 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4408 LE.write<
DeclID>(Specs[I].getRawValue());
4410 assert(Out.tell() - Start == DataLen &&
"Data length is wrong");
4414unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4416 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4417 Args = CTSD->getTemplateArgs().asArray();
4418 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4419 Args = VTSD->getTemplateArgs().asArray();
4420 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4421 Args = FD->getTemplateSpecializationArgs()->asArray();
4423 llvm_unreachable(
"New Specialization Kind?");
4429void ASTWriter::GenerateSpecializationInfoLookupTable(
4436 LazySpecializationInfoLookupTrait>
4438 LazySpecializationInfoLookupTrait Trait(*
this);
4440 llvm::DenseMap<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4446 auto Iter = SpecializationMaps.find(HashedValue);
4447 if (
Iter == SpecializationMaps.end())
4448 Iter = SpecializationMaps
4449 .try_emplace(HashedValue,
4460 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4471 ExisitingSpecs = Lookups->Table.find(HashValue);
4473 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4476 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4479uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4484 GenerateSpecializationInfoLookupTable(
D, Specializations, LookupTable,
4487 uint64_t Offset = Stream.GetCurrentBitNo();
4488 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4490 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4491 : DeclSpecializationsAbbrev,
4499 return Result.hasExternalDecls() &&
4500 DC->hasNeedToReconcileExternalVisibleStorage();
4509 for (
auto *
D :
Result.getLookupResult()) {
4511 if (LocalD->isFromASTFile())
4529void ASTWriter::GenerateNameLookupTable(
4534 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4535 !ConstDC->hasLazyExternalLexicalLookups() &&
4536 "must call buildLookups first");
4545 ASTDeclContextNameLookupTrait<
true>>
4547 ASTDeclContextNameLookupTrait<
true> Trait(*
this);
4559 auto &Name = Lookup.first;
4560 auto &
Result = Lookup.second;
4575 if ((GeneratingReducedBMI || isLookupResultExternal(
Result, DC)) &&
4593 if (Lookup.second.getLookupResult().empty())
4596 switch (Lookup.first.getNameKind()) {
4598 Names.push_back(Lookup.first);
4602 assert(isa<CXXRecordDecl>(DC) &&
4603 "Cannot have a constructor name outside of a class!");
4604 ConstructorNameSet.insert(Name);
4608 assert(isa<CXXRecordDecl>(DC) &&
4609 "Cannot have a conversion function name outside of a class!");
4610 ConversionNameSet.insert(Name);
4618 if (
auto *
D = dyn_cast<CXXRecordDecl>(DC)) {
4632 if (ConstructorNameSet.erase(ImplicitCtorName))
4633 Names.push_back(ImplicitCtorName);
4638 if (!ConstructorNameSet.empty() || !ConversionNameSet.empty())
4639 for (
Decl *ChildD : cast<CXXRecordDecl>(DC)->decls())
4640 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4641 auto Name = ChildND->getDeclName();
4642 switch (Name.getNameKind()) {
4647 if (ConstructorNameSet.erase(Name))
4648 Names.push_back(Name);
4652 if (ConversionNameSet.erase(Name))
4653 Names.push_back(Name);
4657 if (ConstructorNameSet.empty() && ConversionNameSet.empty())
4661 assert(ConstructorNameSet.empty() &&
"Failed to find all of the visible "
4662 "constructors by walking all the "
4663 "lexical members of the context.");
4664 assert(ConversionNameSet.empty() &&
"Failed to find all of the visible "
4665 "conversion functions by walking all "
4666 "the lexical members of the context.");
4673 for (
auto &Name : Names)
4685 for (
auto &Name : Names) {
4688 switch (Name.getNameKind()) {
4706 if (!ConstructorDecls.empty())
4707 Generator.insert(ConstructorDecls.front()->getDeclName(),
4708 Trait.getData(ConstructorDecls), Trait);
4709 if (!ConversionDecls.empty())
4710 Generator.insert(ConversionDecls.front()->getDeclName(),
4711 Trait.getData(ConversionDecls), Trait);
4716 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4718 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4719 if (!ModuleLocalDecls.empty()) {
4721 ModuleLevelNameLookupTrait>
4722 ModuleLocalLookupGenerator;
4723 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4725 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4726 const auto &Key = ModuleLocalIter.first;
4727 const auto &IDs = ModuleLocalIter.second;
4728 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4732 auto *ModuleLocalLookups =
4734 ModuleLocalLookupGenerator.emit(
4735 ModuleLocalLookupTable, ModuleLocalTrait,
4736 ModuleLocalLookups ? &ModuleLocalLookups->Table :
nullptr);
4739 const auto &TULocalDecls = Trait.getTULocalDecls();
4743 ASTDeclContextNameLookupTrait<
false>>
4745 ASTDeclContextNameLookupTrait<
false> TULocalTrait(
4748 for (
const auto &TULocalIter : TULocalDecls) {
4749 const auto &Key = TULocalIter.first;
4750 const auto &IDs = TULocalIter.second;
4751 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4755 TULookupGenerator.emit(TULookupTable, TULocalTrait,
4756 TULocalLookups ? &TULocalLookups->Table :
nullptr);
4765void ASTWriter::WriteDeclContextVisibleBlock(
ASTContext &Context,
4767 uint64_t &VisibleBlockOffset,
4768 uint64_t &ModuleLocalBlockOffset,
4769 uint64_t &TULocalBlockOffset) {
4770 assert(VisibleBlockOffset == 0);
4771 assert(ModuleLocalBlockOffset == 0);
4772 assert(TULocalBlockOffset == 0);
4777 if (isa<NamespaceDecl>(DC) && Chain &&
4780 for (
auto *Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev;
4781 Prev = Prev->getPreviousDecl())
4782 if (!Prev->isFromASTFile())
4795 LookupResults.reserve(Map->size());
4796 for (
auto &Entry : *Map)
4797 LookupResults.push_back(
4798 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4801 llvm::sort(LookupResults, llvm::less_first());
4802 for (
auto &NameAndResult : LookupResults) {
4810 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4811 "function name in a namespace!");
4853 if (!Map || Map->empty())
4856 VisibleBlockOffset = Stream.GetCurrentBitNo();
4861 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4866 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
4868 ++NumVisibleDeclContexts;
4870 if (!ModuleLocalLookupTable.empty()) {
4871 ModuleLocalBlockOffset = Stream.GetCurrentBitNo();
4872 assert(ModuleLocalBlockOffset > VisibleBlockOffset);
4874 RecordData::value_type ModuleLocalRecord[] = {
4876 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
4877 ModuleLocalRecord, ModuleLocalLookupTable);
4878 ++NumModuleLocalDeclContexts;
4881 if (!TULookupTable.empty()) {
4882 TULocalBlockOffset = Stream.GetCurrentBitNo();
4884 RecordData::value_type TULocalDeclsRecord[] = {
4886 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
4888 ++NumTULocalDeclContexts;
4898void ASTWriter::WriteDeclContextVisibleUpdate(
ASTContext &Context,
4901 if (!Map || Map->empty())
4908 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4913 if (isa<NamespaceDecl>(DC))
4919 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
4921 if (!ModuleLocalLookupTable.empty()) {
4923 RecordData::value_type ModuleLocalRecord[] = {
4925 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
4926 ModuleLocalLookupTable);
4929 if (!TULookupTable.empty()) {
4930 RecordData::value_type GMFRecord[] = {
4932 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
4944void ASTWriter::WriteOpenCLExtensions(
Sema &SemaRef) {
4950 for (
const auto &I:Opts.OptMap) {
4952 auto V = I.getValue();
4953 Record.push_back(
V.Supported ? 1 : 0);
4954 Record.push_back(
V.Enabled ? 1 : 0);
4955 Record.push_back(
V.WithPragma ? 1 : 0);
4962void ASTWriter::WriteCUDAPragmas(
Sema &SemaRef) {
4963 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
4964 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
4969void ASTWriter::WriteObjCCategories() {
4973 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
4975 unsigned StartIndex = Categories.size();
4980 Categories.push_back(0);
4984 Cat =
Class->known_categories_begin(),
4985 CatEnd =
Class->known_categories_end();
4986 Cat != CatEnd; ++Cat, ++Size) {
4992 Categories[StartIndex] =
Size;
4996 CategoriesMap.push_back(CatInfo);
5001 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5004 using namespace llvm;
5006 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5008 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5009 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5010 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5013 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5014 reinterpret_cast<char *
>(CategoriesMap.data()),
5021void ASTWriter::WriteLateParsedTemplates(
Sema &SemaRef) {
5028 for (
auto &LPTMapEntry : LPTMap) {
5036 for (
const auto &Tok : LPT.
Toks) {
5044void ASTWriter::WriteOptimizePragmaOptions(
Sema &SemaRef) {
5052void ASTWriter::WriteMSStructPragmaOptions(
Sema &SemaRef) {
5060void ASTWriter::WriteMSPointersToMembersPragmaOptions(
Sema &SemaRef) {
5068void ASTWriter::WritePackPragmaOptions(
Sema &SemaRef) {
5088void ASTWriter::WriteFloatControlPragmaOptions(
Sema &SemaRef) {
5098 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5099 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5108void ASTWriter::WriteDeclsWithEffectsToVerify(
Sema &SemaRef) {
5118void ASTWriter::WriteModuleFileExtension(
Sema &SemaRef,
5124 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5126 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5127 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5128 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5129 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5130 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5131 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5137 Record.push_back(Metadata.MajorVersion);
5138 Record.push_back(Metadata.MinorVersion);
5139 Record.push_back(Metadata.BlockName.size());
5140 Record.push_back(Metadata.UserInfo.size());
5142 Buffer += Metadata.BlockName;
5143 Buffer += Metadata.UserInfo;
5144 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5160 return Record.push_back(0);
5164 auto SkipIdx =
Record.size();
5173 Record.push_back(A->getAttributeSpellingListIndexRaw());
5176#include "clang/Serialization/AttrPCHWrite.inc"
5188 for (
const auto *A : Attrs)
5202 case tok::annot_pragma_loop_hint: {
5206 Record.push_back(Info->Toks.size());
5207 for (
const auto &
T : Info->Toks)
5211 case tok::annot_pragma_pack: {
5214 Record.push_back(
static_cast<unsigned>(Info->Action));
5220 case tok::annot_pragma_openmp:
5221 case tok::annot_pragma_openmp_end:
5222 case tok::annot_pragma_unused:
5223 case tok::annot_pragma_openacc:
5224 case tok::annot_pragma_openacc_end:
5225 case tok::annot_repl_input_end:
5228 llvm_unreachable(
"missing serialization code for annotation token");
5239 Record.push_back(Str.size());
5245 Record.push_back(Str.size());
5246 Blob.insert(Blob.end(), Str.begin(), Str.end());
5250 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5253 StringRef PathStr(
Path.data(),
Path.size());
5254 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5260 const char *PathBegin =
Path.data();
5261 const char *PathPtr =
5263 if (PathPtr != PathBegin) {
5264 Path.erase(
Path.begin(),
Path.begin() + (PathPtr - PathBegin));
5288 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5293 Record.push_back(Version.getMajor());
5294 if (std::optional<unsigned> Minor = Version.getMinor())
5295 Record.push_back(*Minor + 1);
5298 if (std::optional<unsigned> Subminor = Version.getSubminor())
5299 Record.push_back(*Subminor + 1);
5317 assert(ID < IdentifierOffsets.size());
5318 IdentifierOffsets[ID] = Offset;
5324 unsigned ID = SelectorIDs[Sel];
5325 assert(ID &&
"Unknown selector");
5328 if (ID < FirstSelectorID)
5330 SelectorOffsets[ID - FirstSelectorID] = Offset;
5336 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5337 bool IncludeTimestamps,
bool BuildingImplicitModule,
5338 bool GeneratingReducedBMI)
5339 : Stream(Stream), Buffer(Buffer), ModuleCache(ModuleCache),
5340 IncludeTimestamps(IncludeTimestamps),
5341 BuildingImplicitModule(BuildingImplicitModule),
5342 GeneratingReducedBMI(GeneratingReducedBMI) {
5343 for (
const auto &Ext : Extensions) {
5344 if (
auto Writer = Ext->createExtensionWriter(*
this))
5345 ModuleFileExtensionWriters.push_back(std::move(Writer));
5352 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5357 return IncludeTimestamps ?
E->getModificationTime() : 0;
5362 StringRef OutputFile,
Module *WritingModule,
5363 StringRef isysroot,
bool ShouldCacheASTInMemory) {
5364 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5367 Sema *SemaPtr = Subject.dyn_cast<
Sema *>();
5369 SemaPtr ? SemaPtr->
getPreprocessor() : *cast<Preprocessor *>(Subject);
5371 ASTHasCompilerErrors = PPRef.getDiagnostics().hasUncompilableErrorOccurred();
5374 Stream.Emit((
unsigned)
'C', 8);
5375 Stream.Emit((
unsigned)
'P', 8);
5376 Stream.Emit((
unsigned)
'C', 8);
5377 Stream.Emit((
unsigned)
'H', 8);
5379 WriteBlockInfoBlock();
5382 this->WritingModule = WritingModule;
5383 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5385 this->WritingModule =
nullptr;
5386 this->BaseDirectory.clear();
5390 if (WritingModule && PPRef.getHeaderSearchInfo()
5391 .getHeaderSearchOpts()
5392 .ModulesValidateOncePerBuildSession)
5395 if (ShouldCacheASTInMemory) {
5398 llvm::MemoryBuffer::getMemBufferCopy(
5399 StringRef(Buffer.begin(), Buffer.size())));
5404template<
typename Vector>
5406 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true),
E = Vec.end();
5412template <
typename Vector>
5415 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true),
E = Vec.end();
5421void ASTWriter::computeNonAffectingInputFiles() {
5425 IsSLocAffecting.resize(N,
true);
5426 IsSLocFileEntryAffecting.resize(N,
true);
5431 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5433 unsigned FileIDAdjustment = 0;
5434 unsigned OffsetAdjustment = 0;
5436 NonAffectingFileIDAdjustments.reserve(N);
5437 NonAffectingOffsetAdjustments.reserve(N);
5439 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5440 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5442 for (
unsigned I = 1; I != N; ++I) {
5444 FileID FID = FileID::get(I);
5451 if (!
Cache->OrigEntry)
5459 if (!AffectingModuleMaps)
5463 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5466 IsSLocAffecting[I] =
false;
5467 IsSLocFileEntryAffecting[I] =
5468 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5470 FileIDAdjustment += 1;
5476 if (!NonAffectingFileIDs.empty() &&
5477 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5478 NonAffectingFileIDs.back() = FID;
5480 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5481 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5485 NonAffectingFileIDs.push_back(FID);
5488 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5489 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5498 for (StringRef
Path :
5501 for (
unsigned I = 1; I != N; ++I) {
5502 if (IsSLocAffecting[I]) {
5508 if (!
Cache->OrigEntry)
5511 Cache->OrigEntry->getNameAsRequested());
5517void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5520 bool isModule = WritingModule !=
nullptr;
5527 PredefinedDecls.insert(
D);
5535 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5539 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5543 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5548 RegisterPredefDecl(Context.MakeIntegerSeqDecl,
5550 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5552 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5554 RegisterPredefDecl(Context.TypePackElementDecl,
5568 if (GeneratingReducedBMI) {
5594 if (GeneratingReducedBMI)
5617 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5628 "There are local ones at end of translation unit!");
5641 for (
const auto &I : SemaRef.KnownNamespaces)
5648 for (
const auto &I : Undefined)
5654 for (
const auto &DeleteExprsInfo :
5661 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5663 DeclsToEmitEvenIfUnreferenced.clear();
5675 llvm::sort(IIs, llvm::deref<std::less<>>());
5682 for (
auto *
D : SemaRef.DeclsToCheckForDeferredDiags)
5690 PendingEmittingVTables.clear();
5693void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5696 bool isModule = WritingModule !=
nullptr;
5699 if (!EagerlyDeserializedDecls.empty())
5702 if (!ModularCodegenDecls.empty())
5708 TentativeDefinitions);
5709 if (!TentativeDefinitions.empty())
5716 UnusedFileScopedDecls);
5717 if (!UnusedFileScopedDecls.empty())
5723 if (!ExtVectorDecls.empty())
5729 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5745 if (!UnusedLocalTypedefNameCandidates.empty())
5747 UnusedLocalTypedefNameCandidates);
5758 if (!PendingInstantiations.empty())
5764 auto AddEmittedDeclRefOrZero = [
this, &SemaDeclRefs](
Decl *
D) {
5766 SemaDeclRefs.push_back(0);
5775 if (!SemaDeclRefs.empty())
5780 for (
auto *
D : SemaRef.DeclsToCheckForDeferredDiags)
5783 if (!DeclsToCheckForDeferredDiags.empty())
5785 DeclsToCheckForDeferredDiags);
5791 AddDeclRef(CudaCallDecl, CUDASpecialDeclRefs);
5799 DelegatingCtorDecls);
5800 if (!DelegatingCtorDecls.empty())
5805 for (
const auto &I : SemaRef.KnownNamespaces) {
5809 if (!KnownNamespaces.empty())
5816 for (
const auto &I : Undefined) {
5823 if (!UndefinedButUsed.empty())
5830 for (
const auto &DeleteExprsInfo :
5835 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
5836 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
5837 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
5839 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
5843 if (!DeleteExprsToAnalyze.empty())
5854 if (!VTablesToEmit.empty())
5860 using namespace llvm;
5862 bool isModule = WritingModule !=
nullptr;
5870 computeNonAffectingInputFiles();
5872 writeUnhashedControlBlock(*PP);
5885 IdentifierIDs.clear();
5898 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
5899 IIs.push_back(
ID.second);
5902 llvm::sort(IIs, llvm::deref<std::less<>>());
5911 for (
const auto &WeakUndeclaredIdentifierList :
5913 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
5914 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
5930 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
5931 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
5932 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
5937 PrepareWritingSpecialDecls(*SemaPtr);
5940 WriteControlBlock(*PP, isysroot);
5943 Stream.FlushToWord();
5944 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
5946 ASTBlockStartOffset = Stream.GetCurrentBitNo();
5964 for (
auto &SelectorAndID : SelectorIDs)
5965 AllSelectors.push_back(SelectorAndID.first);
5966 for (
auto &
Selector : AllSelectors)
5990 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5992 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5993 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
5996 llvm::raw_svector_ostream Out(Buffer);
5998 using namespace llvm::support;
6000 endian::Writer
LE(Out, llvm::endianness::little);
6001 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6003 LE.write<uint16_t>(Name.size());
6004 Out.write(Name.data(), Name.size());
6010 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6011 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6028 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6029 Buffer.data(), Buffer.size());
6033 WriteDeclAndTypes(SemaPtr->
Context);
6035 WriteFileDeclIDsMap();
6038 WriteComments(SemaPtr->
Context);
6039 WritePreprocessor(*PP, isModule);
6042 WriteSelectors(*SemaPtr);
6043 WriteReferencedSelectorsPool(*SemaPtr);
6044 WriteLateParsedTemplates(*SemaPtr);
6046 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6049 WriteOpenCLExtensions(*SemaPtr);
6050 WriteCUDAPragmas(*SemaPtr);
6055 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6060 WriteSpecialDeclRecords(*SemaPtr);
6063 if (!WeakUndeclaredIdentifiers.empty())
6065 WeakUndeclaredIdentifiers);
6067 if (!WritingModule) {
6077 assert(SubmoduleIDs.contains(I->getImportedModule()));
6078 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6079 I->getImportedModule()));
6083 if (!Imports.empty()) {
6084 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6087 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6088 return A.ID == B.ID;
6092 llvm::sort(Imports, Cmp);
6093 Imports.erase(std::unique(Imports.begin(), Imports.end(),
Eq),
6097 for (
const auto &Import : Imports) {
6098 ImportedModules.push_back(
Import.ID);
6109 WriteObjCCategories();
6111 if (!WritingModule) {
6112 WriteOptimizePragmaOptions(*SemaPtr);
6113 WriteMSStructPragmaOptions(*SemaPtr);
6114 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6116 WritePackPragmaOptions(*SemaPtr);
6117 WriteFloatControlPragmaOptions(*SemaPtr);
6118 WriteDeclsWithEffectsToVerify(*SemaPtr);
6122 RecordData::value_type
Record[] = {NumStatements,
6124 NumLexicalDeclContexts,
6125 NumVisibleDeclContexts,
6126 NumModuleLocalDeclContexts,
6127 NumTULocalDeclContexts};
6130 Stream.FlushToWord();
6131 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6135 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6136 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6138 return backpatchSignature();
6141void ASTWriter::EnteringModulePurview() {
6144 if (GeneratingReducedBMI)
6145 DeclUpdatesFromGMF.swap(DeclUpdates);
6151void ASTWriter::AddedManglingNumber(
const Decl *
D,
unsigned Number) {
6157void ASTWriter::AddedStaticLocalNumbers(
const Decl *
D,
unsigned Number) {
6176void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6181 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6185 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6186 while (!DeclTypesToEmit.empty()) {
6187 DeclOrType DOT = DeclTypesToEmit.front();
6188 DeclTypesToEmit.pop();
6190 WriteType(Context, DOT.getType());
6192 WriteDecl(Context, DOT.getDecl());
6194 }
while (!DeclUpdates.empty());
6196 DoneWritingDeclsAndTypes =
true;
6200 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6203 uint64_t LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6207 WriteDeclContextVisibleBlock(Context, NS, VisibleOffset, ModuleLocalOffset,
6212 LexicalOffset -= DeclTypesBlockStartOffset;
6215 VisibleOffset -= DeclTypesBlockStartOffset;
6217 if (ModuleLocalOffset)
6218 ModuleLocalOffset -= DeclTypesBlockStartOffset;
6221 TULocalOffset -= DeclTypesBlockStartOffset;
6224 DelayedNamespaceRecord.push_back(LexicalOffset);
6225 DelayedNamespaceRecord.push_back(VisibleOffset);
6226 DelayedNamespaceRecord.push_back(ModuleLocalOffset);
6227 DelayedNamespaceRecord.push_back(TULocalOffset);
6232 assert(DeclTypesToEmit.empty());
6233 assert(DeclUpdates.empty());
6238 WriteTypeDeclOffsets();
6239 if (!DeclUpdatesOffsetsRecord.empty())
6242 if (!DelayedNamespaceRecord.empty())
6244 DelayedNamespaceRecord);
6246 if (!RelatedDeclsMap.empty()) {
6250 for (
const auto &Pair : RelatedDeclsMap) {
6251 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6252 RelatedDeclsMapRecord.push_back(Pair.second.size());
6253 for (
const auto &Lambda : Pair.second)
6254 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6257 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6259 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6260 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6261 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6263 FunctionToLambdaMapAbbrev);
6266 if (!SpecializationsUpdates.empty()) {
6267 WriteSpecializationsUpdates(
false);
6268 SpecializationsUpdates.clear();
6271 if (!PartialSpecializationsUpdates.empty()) {
6272 WriteSpecializationsUpdates(
true);
6273 PartialSpecializationsUpdates.clear();
6288 NewGlobalKindDeclPairs.push_back(
D->
getKind());
6289 NewGlobalKindDeclPairs.push_back(
GetDeclRef(
D).getRawValue());
6292 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6294 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6295 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6298 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6299 bytes(NewGlobalKindDeclPairs));
6301 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6303 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6304 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6305 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6307 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6309 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6310 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6311 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6313 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6315 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6316 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6317 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6320 WriteDeclContextVisibleUpdate(Context, TU);
6323 if (Context.ExternCContext)
6324 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6327 for (
auto *DC : UpdatedDeclContexts)
6328 WriteDeclContextVisibleUpdate(Context, DC);
6331void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6335 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6337 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6338 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6339 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6342 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6343 for (
auto &SpecializationUpdate : SpecUpdates) {
6344 const NamedDecl *
D = SpecializationUpdate.first;
6347 GenerateSpecializationInfoLookupTable(
D, SpecializationUpdate.second,
6348 LookupTable, IsPartial);
6351 RecordData::value_type
Record[] = {
6352 static_cast<RecordData::value_type
>(
RecordType),
6354 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6358void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6359 RecordDataImpl &OffsetsRecord) {
6360 if (DeclUpdates.empty())
6363 DeclUpdateMap LocalUpdates;
6364 LocalUpdates.swap(DeclUpdates);
6366 for (
auto &DeclUpdate : LocalUpdates) {
6367 const Decl *
D = DeclUpdate.first;
6369 bool HasUpdatedBody =
false;
6370 bool HasAddedVarDefinition =
false;
6373 for (
auto &
Update : DeclUpdate.second) {
6379 HasUpdatedBody =
true;
6381 HasAddedVarDefinition =
true;
6388 assert(
Update.getDecl() &&
"no decl to add?");
6402 cast<ParmVarDecl>(
Update.getDecl())->getDefaultArg());
6407 cast<FieldDecl>(
Update.getDecl())->getInClassInitializer());
6411 auto *RD = cast<CXXRecordDecl>(
D);
6412 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6413 Record.push_back(RD->isParamDestroyedInCallee());
6414 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6415 Record.AddCXXDefinitionData(RD);
6416 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6421 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6422 Record.push_back(MSInfo->getTemplateSpecializationKind());
6423 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6425 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
6426 Record.push_back(Spec->getTemplateSpecializationKind());
6427 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6431 auto From = Spec->getInstantiatedFrom();
6432 if (
auto PartialSpec =
6435 Record.AddDeclRef(PartialSpec);
6436 Record.AddTemplateArgumentList(
6437 &Spec->getTemplateInstantiationArgs());
6442 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6443 Record.AddSourceLocation(RD->getLocation());
6444 Record.AddSourceLocation(RD->getBeginLoc());
6445 Record.AddSourceRange(RD->getBraceRange());
6458 Record.AddStmt(cast<CXXDestructorDecl>(
D)->getOperatorDeleteThisArg());
6464 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6482 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6486 auto *A =
D->
getAttr<OMPAllocateDeclAttr>();
6487 Record.push_back(A->getAllocatorType());
6488 Record.AddStmt(A->getAllocator());
6489 Record.AddStmt(A->getAlignment());
6490 Record.AddSourceRange(A->getRange());
6495 Record.push_back(
D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6497 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6513 if (HasUpdatedBody) {
6514 const auto *Def = cast<FunctionDecl>(
D);
6516 Record.push_back(Def->isInlined());
6517 Record.AddSourceLocation(Def->getInnerLocStart());
6518 Record.AddFunctionDefinition(Def);
6519 }
else if (HasAddedVarDefinition) {
6520 const auto *VD = cast<VarDecl>(
D);
6522 Record.push_back(VD->isInline());
6523 Record.push_back(VD->isInlineSpecified());
6524 Record.AddVarDeclInit(VD);
6541 NonAffectingFileIDs.empty())
6543 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6544 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6545 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6546 return FileID::get(FID.getOpaqueValue() - Offset);
6549unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6555 unsigned AdjustedNumCreatedFIDs = 0;
6556 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6557 if (IsSLocAffecting[I])
6558 ++AdjustedNumCreatedFIDs;
6559 return AdjustedNumCreatedFIDs;
6575 return Offset - getAdjustment(Offset);
6580 if (NonAffectingRanges.empty())
6586 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6587 return NonAffectingOffsetAdjustments.back();
6589 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6596 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6597 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6598 return NonAffectingOffsetAdjustments[Idx];
6602 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6607 unsigned BaseOffset = 0;
6608 unsigned ModuleFileIndex = 0;
6614 SourceManager::MaxLoadedOffset -
Loc.getOffset() - 1);
6615 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6616 "Corrupted global sloc offset map");
6621 ModuleFileIndex = F->
Index + 1;
6630 Loc = getAdjustedLocation(
Loc);
6668 MacroInfoToEmitData Info = { Name, MI, ID };
6669 MacroInfosToEmit.push_back(Info);
6678 assert(MacroIDs.contains(MI) &&
"Macro not emitted!");
6679 return MacroIDs[MI];
6683 return IdentMacroDirectivesOffsetMap.lookup(Name);
6687 Record->push_back(Writer->getSelectorRef(SelRef));
6696 if (SID == 0 && Chain) {
6700 SID = SelectorIDs[Sel];
6703 SID = NextSelectorID++;
6704 SelectorIDs[Sel] = SID;
6746 bool InfoHasSameExpr
6748 Record->push_back(InfoHasSameExpr);
6749 if (InfoHasSameExpr)
6767 TypeLocWriter TLW(*
this,
Seq);
6777template <
typename IdxForTypeTy>
6779 IdxForTypeTy IdxForType) {
6783 unsigned FastQuals =
T.getLocalFastQualifiers();
6784 T.removeLocalFastQualifiers();
6786 if (
T.hasLocalNonFastQualifiers())
6787 return IdxForType(
T).asTypeID(FastQuals);
6789 assert(!
T.hasLocalQualifiers());
6791 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr()))
6799 return IdxForType(
T).asTypeID(FastQuals);
6806 assert(!
T.getLocalFastQualifiers());
6810 if (DoneWritingDeclsAndTypes) {
6811 assert(0 &&
"New type seen after serializing all the types to emit!");
6817 Idx =
TypeIdx(0, NextTypeID++);
6818 DeclTypesToEmit.push(
T);
6836 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
6843 if (
auto *
Iter = DeclUpdatesFromGMF.find(
D);
6844 Iter != DeclUpdatesFromGMF.end()) {
6846 DeclUpdates[
D].push_back(
Update);
6847 DeclUpdatesFromGMF.erase(
Iter);
6859 assert(!(
reinterpret_cast<uintptr_t>(
D) & 0x01) &&
"Invalid decl pointer");
6861 if (ID.isInvalid()) {
6862 if (DoneWritingDeclsAndTypes) {
6863 assert(0 &&
"New decl seen after serializing all the decls to emit!");
6870 DeclTypesToEmit.push(
const_cast<Decl *
>(
D));
6885 assert(DeclIDs.contains(
D) &&
"Declaration not emitted!");
6892 assert(DoneWritingDeclsAndTypes &&
6893 "wasDeclEmitted should only be called after writing declarations");
6898 bool Emitted = DeclIDs.contains(
D);
6900 GeneratingReducedBMI) &&
6901 "The declaration within modules can only be omitted in reduced BMI.");
6906 assert(ID.isValid());
6920 if (isa<ParmVarDecl, TemplateTemplateParmDecl>(
D))
6925 assert(
SM.isLocalSourceLocation(FileLoc));
6928 std::tie(FID, Offset) =
SM.getDecomposedLoc(FileLoc);
6931 assert(
SM.getSLocEntry(FID).isFile());
6932 assert(IsSLocAffecting[FID.ID]);
6934 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
6936 Info = std::make_unique<DeclIDInFileInfo>();
6938 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
6939 LocDeclIDsTy &Decls = Info->DeclIDs;
6940 Decls.push_back(LocDecl);
6945 "expected an anonymous declaration");
6949 auto It = AnonymousDeclarationNumbers.find(
D);
6950 if (It == AnonymousDeclarationNumbers.end()) {
6953 AnonymousDeclarationNumbers[ND] = Number;
6956 It = AnonymousDeclarationNumbers.find(
D);
6957 assert(It != AnonymousDeclarationNumbers.end() &&
6958 "declaration not found within its lexical context");
6966 switch (Name.getNameKind()) {
7013 NestedNames.push_back(NNS);
7017 Record->push_back(NestedNames.size());
7018 while(!NestedNames.empty()) {
7019 NNS = NestedNames.pop_back_val();
7061 assert(TemplateParams &&
"No TemplateParams!");
7067 for (
const auto &
P : *TemplateParams)
7073 Record->push_back(
false);
7080 assert(TemplateArgs &&
"No TemplateArgs!");
7082 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7088 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7100 I =
Set.begin(),
E =
Set.end(); I !=
E; ++I) {
7102 Record->push_back(I.getAccess());
7110 Record->push_back(
Base.getAccessSpecifierAsWritten());
7111 Record->push_back(
Base.getInheritConstructors());
7124 for (
auto &
Base : Bases)
7142 for (
auto *
Init : CtorInits) {
7143 if (
Init->isBaseInitializer()) {
7147 }
else if (
Init->isDelegatingInitializer()) {
7150 }
else if (
Init->isMemberInitializer()){
7163 if (
Init->isWritten())
7177 auto &
Data =
D->data();
7183#define FIELD(Name, Width, Merge) \
7184 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7185 Record->push_back(DefinitionBits); \
7186 DefinitionBits.reset(0); \
7188 DefinitionBits.addBits(Data.Name, Width);
7190#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7193 Record->push_back(DefinitionBits);
7197 Record->push_back(
D->getODRHash());
7199 bool ModulesCodegen =
7200 !
D->isDependentType() &&
7202 Record->push_back(ModulesCodegen);
7204 Writer->AddDeclRef(
D, Writer->ModularCodegenDecls);
7209 Record->push_back(
Data.ComputedVisibleConversions);
7210 if (
Data.ComputedVisibleConversions)
7214 if (!
Data.IsLambda) {
7216 if (
Data.NumBases > 0)
7221 if (
Data.NumVBases > 0)
7226 auto &Lambda =
D->getLambdaData();
7229 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7230 LambdaBits.
addBit(Lambda.IsGenericLambda);
7231 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7232 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7233 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7234 Record->push_back(LambdaBits);
7236 Record->push_back(Lambda.NumExplicitCaptures);
7237 Record->push_back(Lambda.ManglingNumber);
7238 Record->push_back(
D->getDeviceLambdaManglingNumber());
7242 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7249 Record->push_back(CaptureBits);
7251 switch (
Capture.getCaptureKind()) {
7278 Val |= (ES->HasConstantInitialization ? 2 : 0);
7279 Val |= (ES->HasConstantDestruction ? 4 : 0);
7293void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7294 assert(Reader &&
"Cannot remove chain");
7295 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7296 assert(FirstDeclID == NextDeclID &&
7297 FirstTypeID == NextTypeID &&
7298 FirstIdentID == NextIdentID &&
7299 FirstMacroID == NextMacroID &&
7300 FirstSubmoduleID == NextSubmoduleID &&
7301 FirstSelectorID == NextSelectorID &&
7302 "Setting chain after writing has started.");
7311 NextMacroID = FirstMacroID;
7312 NextSelectorID = FirstSelectorID;
7313 NextSubmoduleID = FirstSubmoduleID;
7323 unsigned OriginalModuleFileIndex = StoredID >> 32;
7327 if (OriginalModuleFileIndex == 0 && StoredID)
7338 MacroID &StoredID = MacroIDs[MI];
7361 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7373 PredefinedDecls.insert(
D);
7385 assert(!MacroDefinitions.contains(MD));
7386 MacroDefinitions[MD] =
ID;
7390 assert(!SubmoduleIDs.contains(Mod));
7391 SubmoduleIDs[Mod] =
ID;
7394void ASTWriter::CompletedTagDefinition(
const TagDecl *
D) {
7396 assert(
D->isCompleteDefinition());
7397 assert(!WritingAST &&
"Already writing the AST!");
7398 if (
auto *RD = dyn_cast<CXXRecordDecl>(
D)) {
7400 if (RD->isFromASTFile()) {
7405 "completed a tag from another module but not by instantiation?");
7406 DeclUpdates[RD].push_back(
7424 "Should not add lookup results to non-lookup contexts!");
7427 if (isa<TranslationUnitDecl>(DC))
7435 !isa<FunctionTemplateDecl>(
D))
7445 assert(!WritingAST &&
"Already writing the AST!");
7446 if (UpdatedDeclContexts.insert(DC) && !cast<Decl>(DC)->isFromASTFile()) {
7450 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7452 DeclsToEmitEvenIfUnreferenced.push_back(
D);
7464 if (!isa<CXXMethodDecl>(
D))
7469 assert(!WritingAST &&
"Already writing the AST!");
7473void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7475 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7482 ->castAs<FunctionProtoType>()
7483 ->getExceptionSpecType()))
7490 assert(!WritingAST &&
"Already writing the AST!");
7493 DeclUpdates[
D].push_back(
7502 assert(!WritingAST &&
"Already writing the AST!");
7503 assert(
Delete &&
"Not given an operator delete");
7510void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *
D) {
7512 assert(!WritingAST &&
"Already writing the AST!");
7517 if (!
D->doesThisDeclarationHaveABody())
7524void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *
D) {
7526 assert(!WritingAST &&
"Already writing the AST!");
7533void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *
D) {
7535 assert(!WritingAST &&
"Already writing the AST!");
7540 if (!
D->doesThisDeclarationHaveABody())
7546void ASTWriter::InstantiationRequested(
const ValueDecl *
D) {
7548 assert(!WritingAST &&
"Already writing the AST!");
7555 if (
auto *VD = dyn_cast<VarDecl>(
D))
7556 POI = VD->getPointOfInstantiation();
7558 POI = cast<FunctionDecl>(
D)->getPointOfInstantiation();
7562void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *
D) {
7564 assert(!WritingAST &&
"Already writing the AST!");
7568 DeclUpdates[
D].push_back(
7572void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *
D) {
7573 assert(!WritingAST &&
"Already writing the AST!");
7577 DeclUpdates[
D].push_back(
7584 assert(!WritingAST &&
"Already writing the AST!");
7588 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7589 ObjCClassesWithCategories.insert(
7593void ASTWriter::DeclarationMarkedUsed(
const Decl *
D) {
7595 assert(!WritingAST &&
"Already writing the AST!");
7607void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *
D) {
7609 assert(!WritingAST &&
"Already writing the AST!");
7616void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *
D,
const Attr *A) {
7618 assert(!WritingAST &&
"Already writing the AST!");
7625void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *
D,
7628 assert(!WritingAST &&
"Already writing the AST!");
7632 DeclUpdates[
D].push_back(
7638 assert(!WritingAST &&
"Already writing the AST!");
7643void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7646 assert(!WritingAST &&
"Already writing the AST!");
7647 if (!
Record->isFromASTFile())
7652void ASTWriter::AddedCXXTemplateSpecialization(
7654 assert(!WritingAST &&
"Already writing the AST!");
7661 DeclsToEmitEvenIfUnreferenced.push_back(
D);
7664void ASTWriter::AddedCXXTemplateSpecialization(
7666 assert(!WritingAST &&
"Already writing the AST!");
7673 DeclsToEmitEvenIfUnreferenced.push_back(
D);
7678 assert(!WritingAST &&
"Already writing the AST!");
7685 DeclsToEmitEvenIfUnreferenced.push_back(
D);
7699#define GEN_CLANG_CLAUSE_CLASS
7700#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
7701#include "llvm/Frontend/OpenMP/OMP.inc"
7710 OMPClauseWriter(*this).writeClause(
C);
7713void OMPClauseWriter::writeClause(
OMPClause *
C) {
7714 Record.push_back(
unsigned(
C->getClauseKind()));
7716 Record.AddSourceLocation(
C->getBeginLoc());
7717 Record.AddSourceLocation(
C->getEndLoc());
7721 Record.push_back(uint64_t(
C->getCaptureRegion()));
7722 Record.AddStmt(
C->getPreInitStmt());
7726 VisitOMPClauseWithPreInit(
C);
7727 Record.AddStmt(
C->getPostUpdateExpr());
7730void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
7731 VisitOMPClauseWithPreInit(
C);
7733 Record.AddSourceLocation(
C->getNameModifierLoc());
7734 Record.AddSourceLocation(
C->getColonLoc());
7735 Record.AddStmt(
C->getCondition());
7736 Record.AddSourceLocation(
C->getLParenLoc());
7740 VisitOMPClauseWithPreInit(
C);
7741 Record.AddStmt(
C->getCondition());
7742 Record.AddSourceLocation(
C->getLParenLoc());
7746 VisitOMPClauseWithPreInit(
C);
7747 Record.AddStmt(
C->getNumThreads());
7748 Record.AddSourceLocation(
C->getLParenLoc());
7752 Record.AddStmt(
C->getSafelen());
7753 Record.AddSourceLocation(
C->getLParenLoc());
7757 Record.AddStmt(
C->getSimdlen());
7758 Record.AddSourceLocation(
C->getLParenLoc());
7762 Record.push_back(
C->getNumSizes());
7763 for (
Expr *Size :
C->getSizesRefs())
7765 Record.AddSourceLocation(
C->getLParenLoc());
7769 Record.push_back(
C->getNumLoops());
7770 for (
Expr *Size :
C->getArgsRefs())
7772 Record.AddSourceLocation(
C->getLParenLoc());
7778 Record.AddStmt(
C->getFactor());
7779 Record.AddSourceLocation(
C->getLParenLoc());
7783 Record.AddStmt(
C->getAllocator());
7784 Record.AddSourceLocation(
C->getLParenLoc());
7788 Record.AddStmt(
C->getNumForLoops());
7789 Record.AddSourceLocation(
C->getLParenLoc());
7793 Record.AddStmt(
C->getEventHandler());
7794 Record.AddSourceLocation(
C->getLParenLoc());
7798 Record.push_back(
unsigned(
C->getDefaultKind()));
7799 Record.AddSourceLocation(
C->getLParenLoc());
7800 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
7804 Record.push_back(
unsigned(
C->getProcBindKind()));
7805 Record.AddSourceLocation(
C->getLParenLoc());
7806 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
7810 VisitOMPClauseWithPreInit(
C);
7811 Record.push_back(
C->getScheduleKind());
7812 Record.push_back(
C->getFirstScheduleModifier());
7813 Record.push_back(
C->getSecondScheduleModifier());
7814 Record.AddStmt(
C->getChunkSize());
7815 Record.AddSourceLocation(
C->getLParenLoc());
7816 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
7817 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
7818 Record.AddSourceLocation(
C->getScheduleKindLoc());
7819 Record.AddSourceLocation(
C->getCommaLoc());
7823 Record.push_back(
C->getLoopNumIterations().size());
7824 Record.AddStmt(
C->getNumForLoops());
7825 for (
Expr *NumIter :
C->getLoopNumIterations())
7827 for (
unsigned I = 0,
E =
C->getLoopNumIterations().size(); I <
E; ++I)
7828 Record.AddStmt(
C->getLoopCounter(I));
7829 Record.AddSourceLocation(
C->getLParenLoc());
7843 Record.push_back(
C->isExtended() ? 1 : 0);
7844 if (
C->isExtended()) {
7845 Record.AddSourceLocation(
C->getLParenLoc());
7846 Record.AddSourceLocation(
C->getArgumentLoc());
7847 Record.writeEnum(
C->getDependencyKind());
7857 Record.AddSourceLocation(
C->getLParenLoc());
7858 Record.AddSourceLocation(
C->getFailParameterLoc());
7859 Record.writeEnum(
C->getFailParameter());
7867 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
7868 Record.AddSourceLocation(
C->getLParenLoc());
7869 for (
auto K :
C->getDirectiveKinds()) {
7876 Record.AddSourceLocation(
C->getLParenLoc());
7880 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
7881 Record.AddSourceLocation(
C->getLParenLoc());
7882 for (
auto K :
C->getDirectiveKinds()) {
7889void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
7909 Record.push_back(
C->varlist_size());
7910 for (
Expr *VE :
C->varlist())
7912 Record.writeBool(
C->getIsTarget());
7913 Record.writeBool(
C->getIsTargetSync());
7914 Record.AddSourceLocation(
C->getLParenLoc());
7915 Record.AddSourceLocation(
C->getVarLoc());
7919 Record.AddStmt(
C->getInteropVar());
7920 Record.AddSourceLocation(
C->getLParenLoc());
7921 Record.AddSourceLocation(
C->getVarLoc());
7925 Record.AddStmt(
C->getInteropVar());
7926 Record.AddSourceLocation(
C->getLParenLoc());
7927 Record.AddSourceLocation(
C->getVarLoc());
7931 VisitOMPClauseWithPreInit(
C);
7932 Record.AddStmt(
C->getCondition());
7933 Record.AddSourceLocation(
C->getLParenLoc());
7937 VisitOMPClauseWithPreInit(
C);
7938 Record.AddStmt(
C->getCondition());
7939 Record.AddSourceLocation(
C->getLParenLoc());
7943 VisitOMPClauseWithPreInit(
C);
7944 Record.AddStmt(
C->getThreadID());
7945 Record.AddSourceLocation(
C->getLParenLoc());
7949 Record.AddStmt(
C->getAlignment());
7950 Record.AddSourceLocation(
C->getLParenLoc());
7954 Record.push_back(
C->varlist_size());
7955 Record.AddSourceLocation(
C->getLParenLoc());
7956 for (
auto *VE :
C->varlist()) {
7959 for (
auto *VE :
C->private_copies()) {
7965 Record.push_back(
C->varlist_size());
7966 VisitOMPClauseWithPreInit(
C);
7967 Record.AddSourceLocation(
C->getLParenLoc());
7968 for (
auto *VE :
C->varlist()) {
7971 for (
auto *VE :
C->private_copies()) {
7974 for (
auto *VE :
C->inits()) {
7980 Record.push_back(
C->varlist_size());
7981 VisitOMPClauseWithPostUpdate(
C);
7982 Record.AddSourceLocation(
C->getLParenLoc());
7983 Record.writeEnum(
C->getKind());
7984 Record.AddSourceLocation(
C->getKindLoc());
7985 Record.AddSourceLocation(
C->getColonLoc());
7986 for (
auto *VE :
C->varlist())
7988 for (
auto *
E :
C->private_copies())
7990 for (
auto *
E :
C->source_exprs())
7992 for (
auto *
E :
C->destination_exprs())
7994 for (
auto *
E :
C->assignment_ops())
7999 Record.push_back(
C->varlist_size());
8000 Record.AddSourceLocation(
C->getLParenLoc());
8001 for (
auto *VE :
C->varlist())
8006 Record.push_back(
C->varlist_size());
8007 Record.writeEnum(
C->getModifier());
8008 VisitOMPClauseWithPostUpdate(
C);
8009 Record.AddSourceLocation(
C->getLParenLoc());
8010 Record.AddSourceLocation(
C->getModifierLoc());
8011 Record.AddSourceLocation(
C->getColonLoc());
8012 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8013 Record.AddDeclarationNameInfo(
C->getNameInfo());
8014 for (
auto *VE :
C->varlist())
8016 for (
auto *VE :
C->privates())
8018 for (
auto *
E :
C->lhs_exprs())
8020 for (
auto *
E :
C->rhs_exprs())
8022 for (
auto *
E :
C->reduction_ops())
8024 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8025 for (
auto *
E :
C->copy_ops())
8027 for (
auto *
E :
C->copy_array_temps())
8029 for (
auto *
E :
C->copy_array_elems())
8035 Record.push_back(
C->varlist_size());
8036 VisitOMPClauseWithPostUpdate(
C);
8037 Record.AddSourceLocation(
C->getLParenLoc());
8038 Record.AddSourceLocation(
C->getColonLoc());
8039 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8040 Record.AddDeclarationNameInfo(
C->getNameInfo());
8041 for (
auto *VE :
C->varlist())
8043 for (
auto *VE :
C->privates())
8045 for (
auto *
E :
C->lhs_exprs())
8047 for (
auto *
E :
C->rhs_exprs())
8049 for (
auto *
E :
C->reduction_ops())
8054 Record.push_back(
C->varlist_size());
8055 VisitOMPClauseWithPostUpdate(
C);
8056 Record.AddSourceLocation(
C->getLParenLoc());
8057 Record.AddSourceLocation(
C->getColonLoc());
8058 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8059 Record.AddDeclarationNameInfo(
C->getNameInfo());
8060 for (
auto *VE :
C->varlist())
8062 for (
auto *VE :
C->privates())
8064 for (
auto *
E :
C->lhs_exprs())
8066 for (
auto *
E :
C->rhs_exprs())
8068 for (
auto *
E :
C->reduction_ops())
8070 for (
auto *
E :
C->taskgroup_descriptors())
8075 Record.push_back(
C->varlist_size());
8076 VisitOMPClauseWithPostUpdate(
C);
8077 Record.AddSourceLocation(
C->getLParenLoc());
8078 Record.AddSourceLocation(
C->getColonLoc());
8079 Record.push_back(
C->getModifier());
8080 Record.AddSourceLocation(
C->getModifierLoc());
8081 for (
auto *VE :
C->varlist()) {
8084 for (
auto *VE :
C->privates()) {
8087 for (
auto *VE :
C->inits()) {
8090 for (
auto *VE :
C->updates()) {
8093 for (
auto *VE :
C->finals()) {
8097 Record.AddStmt(
C->getCalcStep());
8098 for (
auto *VE :
C->used_expressions())
8103 Record.push_back(
C->varlist_size());
8104 Record.AddSourceLocation(
C->getLParenLoc());
8105 Record.AddSourceLocation(
C->getColonLoc());
8106 for (
auto *VE :
C->varlist())
8108 Record.AddStmt(
C->getAlignment());
8112 Record.push_back(
C->varlist_size());
8113 Record.AddSourceLocation(
C->getLParenLoc());
8114 for (
auto *VE :
C->varlist())
8116 for (
auto *
E :
C->source_exprs())
8118 for (
auto *
E :
C->destination_exprs())
8120 for (
auto *
E :
C->assignment_ops())
8125 Record.push_back(
C->varlist_size());
8126 Record.AddSourceLocation(
C->getLParenLoc());
8127 for (
auto *VE :
C->varlist())
8129 for (
auto *
E :
C->source_exprs())
8131 for (
auto *
E :
C->destination_exprs())
8133 for (
auto *
E :
C->assignment_ops())
8138 Record.push_back(
C->varlist_size());
8139 Record.AddSourceLocation(
C->getLParenLoc());
8140 for (
auto *VE :
C->varlist())
8145 Record.AddStmt(
C->getDepobj());
8146 Record.AddSourceLocation(
C->getLParenLoc());
8150 Record.push_back(
C->varlist_size());
8151 Record.push_back(
C->getNumLoops());
8152 Record.AddSourceLocation(
C->getLParenLoc());
8153 Record.AddStmt(
C->getModifier());
8154 Record.push_back(
C->getDependencyKind());
8155 Record.AddSourceLocation(
C->getDependencyLoc());
8156 Record.AddSourceLocation(
C->getColonLoc());
8157 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8158 for (
auto *VE :
C->varlist())
8160 for (
unsigned I = 0,
E =
C->getNumLoops(); I <
E; ++I)
8161 Record.AddStmt(
C->getLoopData(I));
8165 VisitOMPClauseWithPreInit(
C);
8166 Record.writeEnum(
C->getModifier());
8167 Record.AddStmt(
C->getDevice());
8168 Record.AddSourceLocation(
C->getModifierLoc());
8169 Record.AddSourceLocation(
C->getLParenLoc());
8173 Record.push_back(
C->varlist_size());
8174 Record.push_back(
C->getUniqueDeclarationsNum());
8175 Record.push_back(
C->getTotalComponentListNum());
8176 Record.push_back(
C->getTotalComponentsNum());
8177 Record.AddSourceLocation(
C->getLParenLoc());
8178 bool HasIteratorModifier =
false;
8180 Record.push_back(
C->getMapTypeModifier(I));
8181 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8182 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8183 HasIteratorModifier =
true;
8185 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8186 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8187 Record.push_back(
C->getMapType());
8188 Record.AddSourceLocation(
C->getMapLoc());
8189 Record.AddSourceLocation(
C->getColonLoc());
8190 for (
auto *
E :
C->varlist())
8192 for (
auto *
E :
C->mapperlists())
8194 if (HasIteratorModifier)
8195 Record.AddStmt(
C->getIteratorModifier());
8196 for (
auto *
D :
C->all_decls())
8198 for (
auto N :
C->all_num_lists())
8200 for (
auto N :
C->all_lists_sizes())
8202 for (
auto &M :
C->all_components()) {
8203 Record.AddStmt(M.getAssociatedExpression());
8204 Record.AddDeclRef(M.getAssociatedDeclaration());
8209 Record.push_back(
C->varlist_size());
8210 Record.writeEnum(
C->getFirstAllocateModifier());
8211 Record.writeEnum(
C->getSecondAllocateModifier());
8212 Record.AddSourceLocation(
C->getLParenLoc());
8213 Record.AddSourceLocation(
C->getColonLoc());
8214 Record.AddStmt(
C->getAllocator());
8215 Record.AddStmt(
C->getAlignment());
8216 for (
auto *VE :
C->varlist())
8221 Record.push_back(
C->varlist_size());
8222 VisitOMPClauseWithPreInit(
C);
8223 Record.AddSourceLocation(
C->getLParenLoc());
8224 for (
auto *VE :
C->varlist())
8229 Record.push_back(
C->varlist_size());
8230 VisitOMPClauseWithPreInit(
C);
8231 Record.AddSourceLocation(
C->getLParenLoc());
8232 for (
auto *VE :
C->varlist())
8237 VisitOMPClauseWithPreInit(
C);
8238 Record.AddStmt(
C->getPriority());
8239 Record.AddSourceLocation(
C->getLParenLoc());
8243 VisitOMPClauseWithPreInit(
C);
8244 Record.writeEnum(
C->getModifier());
8245 Record.AddStmt(
C->getGrainsize());
8246 Record.AddSourceLocation(
C->getModifierLoc());
8247 Record.AddSourceLocation(
C->getLParenLoc());
8251 VisitOMPClauseWithPreInit(
C);
8252 Record.writeEnum(
C->getModifier());
8253 Record.AddStmt(
C->getNumTasks());
8254 Record.AddSourceLocation(
C->getModifierLoc());
8255 Record.AddSourceLocation(
C->getLParenLoc());
8260 Record.AddSourceLocation(
C->getLParenLoc());
8264 VisitOMPClauseWithPreInit(
C);
8265 Record.push_back(
C->getDistScheduleKind());
8266 Record.AddStmt(
C->getChunkSize());
8267 Record.AddSourceLocation(
C->getLParenLoc());
8268 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8269 Record.AddSourceLocation(
C->getCommaLoc());
8273 Record.push_back(
C->getDefaultmapKind());
8274 Record.push_back(
C->getDefaultmapModifier());
8275 Record.AddSourceLocation(
C->getLParenLoc());
8276 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8277 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8280void OMPClauseWriter::VisitOMPToClause(
OMPToClause *
C) {
8281 Record.push_back(
C->varlist_size());
8282 Record.push_back(
C->getUniqueDeclarationsNum());
8283 Record.push_back(
C->getTotalComponentListNum());
8284 Record.push_back(
C->getTotalComponentsNum());
8285 Record.AddSourceLocation(
C->getLParenLoc());
8287 Record.push_back(
C->getMotionModifier(I));
8288 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8290 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8291 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8292 Record.AddSourceLocation(
C->getColonLoc());
8293 for (
auto *
E :
C->varlist())
8295 for (
auto *
E :
C->mapperlists())
8297 for (
auto *
D :
C->all_decls())
8299 for (
auto N :
C->all_num_lists())
8301 for (
auto N :
C->all_lists_sizes())
8303 for (
auto &M :
C->all_components()) {
8304 Record.AddStmt(M.getAssociatedExpression());
8305 Record.writeBool(M.isNonContiguous());
8306 Record.AddDeclRef(M.getAssociatedDeclaration());
8311 Record.push_back(
C->varlist_size());
8312 Record.push_back(
C->getUniqueDeclarationsNum());
8313 Record.push_back(
C->getTotalComponentListNum());
8314 Record.push_back(
C->getTotalComponentsNum());
8315 Record.AddSourceLocation(
C->getLParenLoc());
8317 Record.push_back(
C->getMotionModifier(I));
8318 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8320 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8321 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8322 Record.AddSourceLocation(
C->getColonLoc());
8323 for (
auto *
E :
C->varlist())
8325 for (
auto *
E :
C->mapperlists())
8327 for (
auto *
D :
C->all_decls())
8329 for (
auto N :
C->all_num_lists())
8331 for (
auto N :
C->all_lists_sizes())
8333 for (
auto &M :
C->all_components()) {
8334 Record.AddStmt(M.getAssociatedExpression());
8335 Record.writeBool(M.isNonContiguous());
8336 Record.AddDeclRef(M.getAssociatedDeclaration());
8341 Record.push_back(
C->varlist_size());
8342 Record.push_back(
C->getUniqueDeclarationsNum());
8343 Record.push_back(
C->getTotalComponentListNum());
8344 Record.push_back(
C->getTotalComponentsNum());
8345 Record.AddSourceLocation(
C->getLParenLoc());
8346 for (
auto *
E :
C->varlist())
8348 for (
auto *VE :
C->private_copies())
8350 for (
auto *VE :
C->inits())
8352 for (
auto *
D :
C->all_decls())
8354 for (
auto N :
C->all_num_lists())
8356 for (
auto N :
C->all_lists_sizes())
8358 for (
auto &M :
C->all_components()) {
8359 Record.AddStmt(M.getAssociatedExpression());
8360 Record.AddDeclRef(M.getAssociatedDeclaration());
8365 Record.push_back(
C->varlist_size());
8366 Record.push_back(
C->getUniqueDeclarationsNum());
8367 Record.push_back(
C->getTotalComponentListNum());
8368 Record.push_back(
C->getTotalComponentsNum());
8369 Record.AddSourceLocation(
C->getLParenLoc());
8370 for (
auto *
E :
C->varlist())
8372 for (
auto *
D :
C->all_decls())
8374 for (
auto N :
C->all_num_lists())
8376 for (
auto N :
C->all_lists_sizes())
8378 for (
auto &M :
C->all_components()) {
8379 Record.AddStmt(M.getAssociatedExpression());
8380 Record.AddDeclRef(M.getAssociatedDeclaration());
8385 Record.push_back(
C->varlist_size());
8386 Record.push_back(
C->getUniqueDeclarationsNum());
8387 Record.push_back(
C->getTotalComponentListNum());
8388 Record.push_back(
C->getTotalComponentsNum());
8389 Record.AddSourceLocation(
C->getLParenLoc());
8390 for (
auto *
E :
C->varlist())
8392 for (
auto *
D :
C->all_decls())
8394 for (
auto N :
C->all_num_lists())
8396 for (
auto N :
C->all_lists_sizes())
8398 for (
auto &M :
C->all_components()) {
8399 Record.AddStmt(M.getAssociatedExpression());
8400 Record.AddDeclRef(M.getAssociatedDeclaration());
8405 Record.push_back(
C->varlist_size());
8406 Record.push_back(
C->getUniqueDeclarationsNum());
8407 Record.push_back(
C->getTotalComponentListNum());
8408 Record.push_back(
C->getTotalComponentsNum());
8409 Record.AddSourceLocation(
C->getLParenLoc());
8410 for (
auto *
E :
C->varlist())
8412 for (
auto *
D :
C->all_decls())
8414 for (
auto N :
C->all_num_lists())
8416 for (
auto N :
C->all_lists_sizes())
8418 for (
auto &M :
C->all_components()) {
8419 Record.AddStmt(M.getAssociatedExpression());
8420 Record.AddDeclRef(M.getAssociatedDeclaration());
8426void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8435void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8437 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8438 Record.AddSourceLocation(
C->getLParenLoc());
8439 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8442void OMPClauseWriter::VisitOMPAtClause(
OMPAtClause *
C) {
8443 Record.push_back(
C->getAtKind());
8444 Record.AddSourceLocation(
C->getLParenLoc());
8445 Record.AddSourceLocation(
C->getAtKindKwLoc());
8449 Record.push_back(
C->getSeverityKind());
8450 Record.AddSourceLocation(
C->getLParenLoc());
8451 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8455 Record.AddStmt(
C->getMessageString());
8456 Record.AddSourceLocation(
C->getLParenLoc());
8460 Record.push_back(
C->varlist_size());
8461 Record.AddSourceLocation(
C->getLParenLoc());
8462 for (
auto *VE :
C->varlist())
8464 for (
auto *
E :
C->private_refs())
8469 Record.push_back(
C->varlist_size());
8470 Record.AddSourceLocation(
C->getLParenLoc());
8471 for (
auto *VE :
C->varlist())
8476 Record.push_back(
C->varlist_size());
8477 Record.AddSourceLocation(
C->getLParenLoc());
8478 for (
auto *VE :
C->varlist())
8483 Record.writeEnum(
C->getKind());
8484 Record.writeEnum(
C->getModifier());
8485 Record.AddSourceLocation(
C->getLParenLoc());
8486 Record.AddSourceLocation(
C->getKindKwLoc());
8487 Record.AddSourceLocation(
C->getModifierKwLoc());
8491 Record.push_back(
C->getNumberOfAllocators());
8492 Record.AddSourceLocation(
C->getLParenLoc());
8493 for (
unsigned I = 0,
E =
C->getNumberOfAllocators(); I <
E; ++I) {
8503 Record.push_back(
C->varlist_size());
8504 Record.AddSourceLocation(
C->getLParenLoc());
8505 Record.AddStmt(
C->getModifier());
8506 Record.AddSourceLocation(
C->getColonLoc());
8507 for (
Expr *
E :
C->varlist())
8512 Record.writeEnum(
C->getBindKind());
8513 Record.AddSourceLocation(
C->getLParenLoc());
8514 Record.AddSourceLocation(
C->getBindKindLoc());
8518 VisitOMPClauseWithPreInit(
C);
8520 Record.AddSourceLocation(
C->getLParenLoc());
8524 Record.push_back(
C->varlist_size());
8525 Record.push_back(
C->getNumLoops());
8526 Record.AddSourceLocation(
C->getLParenLoc());
8527 Record.push_back(
C->getDependenceType());
8528 Record.AddSourceLocation(
C->getDependenceLoc());
8529 Record.AddSourceLocation(
C->getColonLoc());
8530 for (
auto *VE :
C->varlist())
8532 for (
unsigned I = 0,
E =
C->getNumLoops(); I <
E; ++I)
8533 Record.AddStmt(
C->getLoopData(I));
8537 Record.AddAttributes(
C->getAttrs());
8538 Record.AddSourceLocation(
C->getBeginLoc());
8539 Record.AddSourceLocation(
C->getLParenLoc());
8540 Record.AddSourceLocation(
C->getEndLoc());
8547 for (
const auto &
Set : TI->
Sets) {
8554 writeExprRef(
Selector.ScoreOrCondition);
8568 for (
unsigned I = 0,
E =
Data->getNumClauses(); I <
E; ++I)
8570 if (
Data->hasAssociatedStmt())
8572 for (
unsigned I = 0,
E =
Data->getNumChildren(); I <
E; ++I)
8578 for (
Expr *
E :
C->getVarList())
8584 for (
Expr *
E : Exprs)
8593 switch (
C->getClauseKind()) {
8595 const auto *DC = cast<OpenACCDefaultClause>(
C);
8601 const auto *IC = cast<OpenACCIfClause>(
C);
8603 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
8607 const auto *SC = cast<OpenACCSelfClause>(
C);
8610 if (SC->isConditionExprClause()) {
8612 if (SC->hasConditionExpr())
8613 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
8616 for (
Expr *
E : SC->getVarList())
8622 const auto *NGC = cast<OpenACCNumGangsClause>(
C);
8625 for (
Expr *
E : NGC->getIntExprs())
8630 const auto *DNC = cast<OpenACCDeviceNumClause>(
C);
8636 const auto *DAC = cast<OpenACCDefaultAsyncClause>(
C);
8642 const auto *NWC = cast<OpenACCNumWorkersClause>(
C);
8648 const auto *NWC = cast<OpenACCVectorLengthClause>(
C);
8654 const auto *PC = cast<OpenACCPrivateClause>(
C);
8660 const auto *HC = cast<OpenACCHostClause>(
C);
8666 const auto *DC = cast<OpenACCDeviceClause>(
C);
8672 const auto *FPC = cast<OpenACCFirstPrivateClause>(
C);
8678 const auto *AC = cast<OpenACCAttachClause>(
C);
8684 const auto *DC = cast<OpenACCDetachClause>(
C);
8690 const auto *DC = cast<OpenACCDeleteClause>(
C);
8696 const auto *UDC = cast<OpenACCUseDeviceClause>(
C);
8702 const auto *DPC = cast<OpenACCDevicePtrClause>(
C);
8708 const auto *NCC = cast<OpenACCNoCreateClause>(
C);
8714 const auto *PC = cast<OpenACCPresentClause>(
C);
8722 const auto *CC = cast<OpenACCCopyClause>(
C);
8730 const auto *CIC = cast<OpenACCCopyInClause>(
C);
8739 const auto *COC = cast<OpenACCCopyOutClause>(
C);
8748 const auto *CC = cast<OpenACCCreateClause>(
C);
8755 const auto *AC = cast<OpenACCAsyncClause>(
C);
8758 if (AC->hasIntExpr())
8763 const auto *WC = cast<OpenACCWaitClause>(
C);
8766 if (
Expr *DNE = WC->getDevNumExpr())
8775 const auto *DTC = cast<OpenACCDeviceTypeClause>(
C);
8787 const auto *RC = cast<OpenACCReductionClause>(
C);
8802 const auto *CC = cast<OpenACCCollapseClause>(
C);
8809 const auto *TC = cast<OpenACCTileClause>(
C);
8812 for (
Expr *
E : TC->getSizeExprs())
8817 const auto *GC = cast<OpenACCGangClause>(
C);
8820 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
8822 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
8827 const auto *WC = cast<OpenACCWorkerClause>(
C);
8830 if (WC->hasIntExpr())
8835 const auto *VC = cast<OpenACCVectorClause>(
C);
8838 if (VC->hasIntExpr())
8848 llvm_unreachable(
"Clause serialization not yet implemented");
8850 llvm_unreachable(
"Invalid Clause Kind");
Defines the clang::ASTContext interface.
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static NamedDecl * getDeclForLocalLookup(const LangOptions &LangOpts, NamedDecl *D)
Determine the declaration that should be put into the name lookup table to represent the given declar...
static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a buffer.
static bool isLookupResultNotInteresting(ASTWriter &Writer, StoredDeclsList &Result)
Returns ture if all of the lookup result are either external, not emitted or predefined.
static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec)
static bool IsInternalDeclFromFileContext(const Decl *D)
static TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType)
static void AddLazyVectorEmiitedDecls(ASTWriter &Writer, Vector &Vec, ASTWriter::RecordData &Record)
static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a macro expansion.
static StringRef bytes(const std::vector< T, Allocator > &v)
static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream, bool Compressed)
Create an abbreviation for the SLocEntry that refers to a buffer's blob.
static void BackpatchSignatureAt(llvm::BitstreamWriter &Stream, const ASTFileSignature &S, uint64_t BitNo)
static const char * adjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir)
Adjusts the given filename to only write out the portion of the filename that is not part of the syst...
static bool isLocalIdentifierID(IdentifierID ID)
If the.
static unsigned getNumberOfModules(Module *Mod)
Compute the number of modules within the given tree (including the given module).
static bool isImportedDeclContext(ASTReader *Chain, const Decl *D)
static TypeCode getTypeCodeForTypeClass(Type::TypeClass id)
static void AddStmtsExprs(llvm::BitstreamWriter &Stream, ASTWriter::RecordDataImpl &Record)
static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob, unsigned SLocBufferBlobCompressedAbbrv, unsigned SLocBufferBlobAbbrv)
static uint64_t EmitCXXBaseSpecifiers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXBaseSpecifier > Bases)
static std::pair< unsigned, unsigned > emitULEBKeyDataLength(unsigned KeyLen, unsigned DataLen, raw_ostream &Out)
Emit key length and data length as ULEB-encoded data, and return them as a pair.
static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule, const Preprocessor &PP)
static bool cleanPathForOutput(FileManager &FileMgr, SmallVectorImpl< char > &Path)
Prepares a path for being written to an AST file by converting it to an absolute path and removing ne...
static uint64_t EmitCXXCtorInitializers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXCtorInitializer * > CtorInits)
static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a file.
Defines the clang::attr::Kind enum.
Defines the Diagnostic-related interfaces.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines interfaces for clang::FileEntry and clang::FileEntryRef.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
Defines the clang::OpenCLOptions class.
This file defines OpenMP AST classes for clauses.
Defines the clang::Preprocessor interface.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
static void EmitBlockID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)
Emits a block ID in the BLOCKINFO block.
static void EmitRecordID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)
Emits a record ID in the BLOCKINFO block.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
#define BLOCK(DERIVED, BASE)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
DeclarationNameTable DeclarationNames
QualType getRawCFConstantStringType() const
Get the structure type used to representation CFStrings, or NULL if it hasn't yet been built.
QualType getucontext_tType() const
Retrieve the C ucontext_t type.
QualType getRecordType(const RecordDecl *Decl) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getFILEType() const
Retrieve the C FILE type.
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
const LangOptions & getLangOpts() const
RawCommentList Comments
All comments in this translation unit.
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
QualType getsigjmp_bufType() const
Retrieve the C sigjmp_buf type.
QualType AutoRRefDeductTy
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
FunctionDecl * getcudaConfigureCallDecl()
import_range local_imports() const
Reads an AST files chain containing the contents of a translation unit.
ModuleManager & getModuleManager()
Retrieve the module manager.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
void forEachImportedKeyDecl(const Decl *D, Fn Visit)
Run a callback on each imported key declaration of D.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
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.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
bool isProcessingUpdateRecords()
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
unsigned getTotalNumMacros() const
Returns the number of macros found in the chain.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
An object for streaming information to a record.
void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo)
void AddCXXBaseSpecifiers(ArrayRef< CXXBaseSpecifier > Bases)
Emit a set of C++ base specifiers.
void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs)
Emit a template argument list.
uint64_t Emit(unsigned Code, unsigned Abbrev=0)
Emit the record to the stream, followed by its substatements, and return its offset.
void AddCXXTemporary(const CXXTemporary *Temp)
Emit a CXXTemporary.
void writeOMPTraitInfo(const OMPTraitInfo *TI)
Write an OMPTraitInfo object.
void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base)
Emit a C++ base specifier.
void writeOMPClause(OMPClause *C)
void writeBool(bool Value)
void AddAPValue(const APValue &Value)
Emit an APvalue.
void AddUnresolvedSet(const ASTUnresolvedSet &Set)
Emit a UnresolvedSet structure.
void AddIdentifierRef(const IdentifierInfo *II)
Emit a reference to an identifier.
void AddStmt(Stmt *S)
Add the given statement or expression to the queue of statements to emit.
void AddDeclarationName(DeclarationName Name)
Emit a declaration name.
void AddSelectorRef(Selector S)
Emit a Selector (which is a smart pointer reference).
void AddSourceRange(SourceRange Range, LocSeq *Seq=nullptr)
Emit a source range.
void writeSourceLocation(SourceLocation Loc)
void AddOffset(uint64_t BitOffset)
Add a bit offset into the record.
void AddTypeRef(QualType T)
Emit a reference to a type.
void writeQualType(QualType T)
void writeOpenACCClauseList(ArrayRef< const OpenACCClause * > Clauses)
Writes out a list of OpenACC clauses.
void AddSourceLocation(SourceLocation Loc, LocSeq *Seq=nullptr)
Emit a source location.
void push_back(uint64_t N)
Minimal vector-like interface.
void AddTypeLoc(TypeLoc TL, LocSeq *Seq=nullptr)
Emits source location information for a type. Does not emit the type.
void AddCXXCtorInitializers(ArrayRef< CXXCtorInitializer * > CtorInits)
Emit a CXXCtorInitializer array.
void AddTemplateParameterList(const TemplateParameterList *TemplateParams)
Emit a template parameter list.
void AddTemplateArgument(const TemplateArgument &Arg)
Emit a template argument.
void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, DeclarationName Name)
void writeOpenACCIntExprList(ArrayRef< Expr * > Exprs)
void AddAPFloat(const llvm::APFloat &Value)
Emit a floating-point value.
void AddTypeSourceInfo(TypeSourceInfo *TInfo)
Emits a reference to a declarator info.
void AddQualifierInfo(const QualifierInfo &Info)
void writeUInt32(uint32_t Value)
void AddDeclRef(const Decl *D)
Emit a reference to a declaration.
void writeOMPChildren(OMPChildren *Data)
Writes data related to the OpenMP directives.
void AddConceptReference(const ConceptReference *CR)
void AddAPInt(const llvm::APInt &Value)
Emit an integral value.
void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, const TemplateArgumentLocInfo &Arg)
Emits a template argument location info.
void writeOpenACCVarList(const OpenACCClauseWithVarList *C)
void AddAttributes(ArrayRef< const Attr * > Attrs)
Emit a list of attributes.
void AddASTTemplateArgumentListInfo(const ASTTemplateArgumentListInfo *ASTTemplArgList)
Emits an AST template argument list info.
void AddCXXDefinitionData(const CXXRecordDecl *D)
void AddVarDeclInit(const VarDecl *VD)
Emit information about the initializer of a VarDecl.
void writeStmtRef(const Stmt *S)
void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg)
Emits a template argument location.
void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Emit a nested name specifier with source-location information.
void writeOpenACCClause(const OpenACCClause *C)
Writes out a single OpenACC Clause.
void AddAttr(const Attr *A)
An UnresolvedSet-like class which uses the ASTContext's allocator.
Writes an AST file containing the contents of a translation unit.
serialization::MacroID getMacroID(MacroInfo *MI)
Determine the ID of an already-emitted macro.
void AddEmittedDeclRef(const Decl *D, RecordDataImpl &Record)
void AddSourceRange(SourceRange Range, RecordDataImpl &Record, LocSeq *Seq=nullptr)
Emit a source range.
bool isWritingStdCXXNamedModules() const
void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, StringRef Path)
Emit the current record with the given path as a blob.
void AddFileID(FileID FID, RecordDataImpl &Record)
Emit a FileID.
bool isDeclPredefined(const Decl *D) const
void AddPath(StringRef Path, RecordDataImpl &Record)
Add a path to the given record.
unsigned getTypeExtQualAbbrev() const
void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record)
Add a version tuple to the given record.
bool isGeneratingReducedBMI() const
uint32_t getMacroDirectivesOffset(const IdentifierInfo *Name)
void AddAlignPackInfo(const Sema::AlignPackInfo &Info, RecordDataImpl &Record)
Emit a AlignPackInfo.
void AddPathBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)
bool IsLocalDecl(const Decl *D)
Is this a local declaration (that is, one that will be written to our AST file)? This is the case for...
void AddTypeRef(ASTContext &Context, QualType T, RecordDataImpl &Record)
Emit a reference to a type.
bool wasDeclEmitted(const Decl *D) const
Whether or not the declaration got emitted.
void AddString(StringRef Str, RecordDataImpl &Record)
Add a string to the given record.
time_t getTimestampForOutput(const FileEntry *E) const
Get a timestamp for output into the AST file.
bool isWritingModule() const
LocalDeclID GetDeclRef(const Decl *D)
Force a declaration to be emitted and get its local ID to the module file been writing.
LocalDeclID getDeclID(const Decl *D)
Determine the local declaration ID of an already-emitted declaration.
void AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record)
Emit a reference to an identifier.
serialization::MacroID getMacroRef(MacroInfo *MI, const IdentifierInfo *Name)
Get the unique number used to refer to the given macro.
void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record, LocSeq *Seq=nullptr)
Emit a source location.
ASTFileSignature WriteAST(llvm::PointerUnion< Sema *, Preprocessor * > Subject, StringRef OutputFile, Module *WritingModule, StringRef isysroot, bool ShouldCacheASTInMemory=false)
Write a precompiled header or a module with the AST produced by the Sema object, or a dependency scan...
ASTReader * getChain() const
bool getDoneWritingDeclsAndTypes() const
serialization::IdentifierID getIdentifierRef(const IdentifierInfo *II)
Get the unique number used to refer to the given identifier.
void handleVTable(CXXRecordDecl *RD)
unsigned getLocalOrImportedSubmoduleID(const Module *Mod)
Retrieve or create a submodule ID for this module, or return 0 if the submodule is neither local (a s...
void AddToken(const Token &Tok, RecordDataImpl &Record)
Emit a token.
serialization::SelectorID getSelectorRef(Selector Sel)
Get the unique number used to refer to the given selector.
SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc, LocSeq *Seq=nullptr)
Return the raw encodings for source locations.
ASTWriter(llvm::BitstreamWriter &Stream, SmallVectorImpl< char > &Buffer, InMemoryModuleCache &ModuleCache, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, bool IncludeTimestamps=true, bool BuildingImplicitModule=false, bool GeneratingReducedBMI=false)
Create a new precompiled header writer that outputs to the given bitstream.
SmallVector< uint64_t, 64 > RecordData
serialization::TypeID GetOrCreateTypeID(ASTContext &Context, QualType T)
Force a type to be emitted and get its ID.
unsigned getAnonymousDeclarationNumber(const NamedDecl *D)
const LangOptions & getLangOpts() const
void SetSelectorOffset(Selector Sel, uint32_t Offset)
Note that the selector Sel occurs at the given offset within the method pool/selector table.
bool PreparePathForOutput(SmallVectorImpl< char > &Path)
Convert a path from this build process into one that is appropriate for emission in the module file.
void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset)
Note that the identifier II occurs at the given offset within the identifier table.
void AddDeclRef(const Decl *D, RecordDataImpl &Record)
Emit a reference to a declaration.
void AddStringBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)
Wrapper for source info for array parameter types.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
SourceLocation getRBracketLoc() const
SourceLocation getRParenLoc() const
SourceLocation getKWLoc() const
SourceLocation getLParenLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
bool shouldDeferDeserialization() const
SourceLocation getScopeLoc() const
SourceRange getRange() const
const IdentifierInfo * getScopeName() const
bool isRegularKeywordAttribute() const
const IdentifierInfo * getAttrName() const
Kind getParsedKind() const
Type source information for an attributed type.
const Attr * getAttr() const
The type attribute.
SourceLocation getRParenLoc() const
bool isDecltypeAuto() const
bool isConstrained() const
ConceptReference * getConceptReference() const
Type source information for an btf_tag attributed type.
A simple helper class to pack several bits in order into (a) 32 bit integer(s).
void addBits(uint32_t Value, uint32_t BitsWidth)
Wrapper for source info for block pointers.
SourceLocation getCaretLoc() const
Wrapper for source info for builtin types.
SourceLocation getBuiltinLoc() const
TypeSpecifierType getWrittenTypeSpec() const
TypeSpecifierWidth getWrittenWidthSpec() const
bool needsExtraLocalData() const
TypeSpecifierSign getWrittenSignSpec() const
This class is used for builtin types like 'int'.
Represents a base class of a C++ class.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Represents a C++ temporary.
const CXXDestructorDecl * getDestructor() const
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
ConceptDecl * getNamedConcept() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
SourceLocation getTemplateKWLoc() const
Wrapper for source info for pointers decayed from arrays and functions.
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isLookupContext() const
Test whether the context supports looking up names.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
StoredDeclsMap * buildLookup()
Ensure the lookup structure is fully-built and return it.
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
StoredDeclsMap * getLookupPtr() const
Retrieve the internal representation of the lookup structure.
DeclID getRawValue() const
A helper iterator adaptor to convert the iterators to SmallVector<SomeDeclID> to the iterators to Sma...
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Module * getTopLevelOwningNamedModule() const
Get the top level owning named module that owns this declaration if any.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isInNamedModule() const
Whether this declaration comes from a named module.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
@ FOK_None
Not a friend object.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
SourceLocation getLocation() const
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
DeclarationNameLoc - Additional source/type location info for a declaration name.
SourceLocation getCXXLiteralOperatorNameLoc() const
Return the location of the literal operator name (without the operator keyword).
TypeSourceInfo * getNamedTypeInfo() const
Returns the source type info.
SourceRange getCXXOperatorNameRange() const
Return the range of the operator name (without the operator keyword).
The name of a declaration.
@ CXXConversionFunctionName
SourceLocation getDecltypeLoc() const
SourceLocation getRParenLoc() const
SourceLocation getTemplateNameLoc() const
Expr * getAttrExprOperand() const
The attribute's expression operand, if it has one.
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getNameLoc() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getNameLoc() const
unsigned getNumArgs() const
SourceLocation getTemplateNameLoc() const
SourceLocation getLAngleLoc() const
SourceLocation getTemplateKeywordLoc() const
TemplateArgumentLoc getArgLoc(unsigned i) const
SourceLocation getRAngleLoc() const
SourceLocation getElaboratedKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getNameLoc() const
static DiagnosticMapping getDefaultMapping(unsigned DiagID)
Get the default mapping for this diagnostic.
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
Concrete class used by the front-end to report problems and issues.
StringRef getName() const
SourceLocation getElaboratedKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
Wrapper for source info for enum types.
This represents one expression.
Represents difference between two FPOptions values.
storage_type getAsOpaqueInt() const
storage_type getAsOpaqueInt() const
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...
StringRef getName() const
The name of this FileEntry.
Cached information about one file (either on disk or in the virtual file system).
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.
void trackVFSUsage(bool Active)
Enable or disable tracking of VFS usage.
llvm::vfs::FileSystem & getVirtualFileSystem() const
void GetUniqueIDMapping(SmallVectorImpl< OptionalFileEntryRef > &UIDToFiles) const
Produce an array mapping from the unique IDs assigned to each file to the corresponding FileEntryRef.
bool makeAbsolutePath(SmallVectorImpl< char > &Path) const
Makes Path absolute taking into account FileSystemOptions and the working directory option.
FileSystemOptions & getFileSystemOpts()
Returns the current file system options.
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
SourceLocation getLocalRangeEnd() const
SourceRange getExceptionSpecRange() const
SourceLocation getLocalRangeBegin() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Type source information for HLSL attributed resource type.
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool hasChangedSinceDeserialization() const
Determine whether this identifier has changed since it was loaded from an AST file.
bool isCPlusPlusOperatorKeyword() const
bool hasFETokenInfoChangedSinceDeserialization() const
Determine whether the frontend token information for this identifier has changed since it was loaded ...
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
const char * getNameStart() const
Return the beginning of the actual null-terminated string for this identifier.
tok::NotableIdentifierKind getNotableIdentifierID() const
unsigned getObjCOrBuiltinID() const
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
llvm::iterator_range< iterator > decls(DeclarationName Name)
Returns a range of decls with the name 'Name'.
Implements an efficient mapping from strings to IdentifierInfo nodes.
In-memory cache for modules.
llvm::MemoryBuffer & addBuiltPCM(llvm::StringRef Filename, std::unique_ptr< llvm::MemoryBuffer > Buffer)
Store a just-built PCM under the Filename.
Wrapper for source info for injected class names of class templates.
SourceLocation getAmpLoc() const
Describes the capture of a variable or of this, or of a C++1y init-capture.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
Used to hold and unique data used to represent #line information.
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
const MacroDirective * getPrevious() const
Get previous definition of the macro with the same name.
const MacroInfo * getMacroInfo() const
SourceLocation getLocation() const
Encapsulates the data about a macro definition (e.g.
bool isUsed() const
Return false if this macro is defined in the main file and has not yet been used.
bool isC99Varargs() const
SourceLocation getDefinitionEndLoc() const
Return the location of the last token in the macro.
ArrayRef< const IdentifierInfo * > params() const
unsigned getNumTokens() const
Return the number of tokens that this macro expands to.
unsigned getNumParams() const
const Token & getReplacementToken(unsigned Tok) const
bool isBuiltinMacro() const
Return true if this macro requires processing before expansion.
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
bool hasCommaPasting() const
bool isObjectLike() const
bool isUsedForHeaderGuard() const
Determine whether this macro was used for a header guard.
bool isGNUVarargs() const
SourceLocation getExpansionLoc() const
Expr * getAttrColumnOperand() const
The attribute's column operand, if it has one.
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
Expr * getAttrRowOperand() const
The attribute's row operand, if it has one.
Wrapper for source info for member pointers.
TypeSourceInfo * getClassTInfo() const
SourceLocation getStarLoc() const
Abstract base class that writes a module file extension block into a module file.
virtual void writeExtensionContents(Sema &SemaRef, llvm::BitstreamWriter &Stream)=0
Write the contents of the extension block into the given bitstream.
ModuleFileExtension * getExtension() const
Retrieve the module file extension with which this writer is associated.
virtual ModuleFileExtensionMetadata getExtensionMetadata() const =0
Retrieves the metadata for this module file extension.
void resolveHeaderDirectives(const FileEntry *File) const
Resolve all lazy header directives for the specified file.
ArrayRef< KnownHeader > findResolvedModulesForHeader(FileEntryRef File) const
Like findAllModulesForHeader, but do not attempt to infer module ownership from umbrella headers if w...
FileID getModuleMapFileIDForUniquing(const Module *M) const
Get the module map file that (along with the module name) uniquely identifies this module.
FileID getContainingModuleMapFileID(const Module *Module) const
Retrieve the module map file containing the definition of the given module.
ModuleHeaderRole
Flags describing the role of a module header.
static ModuleHeaderRole headerKindToRole(Module::HeaderKind Kind)
Convert a header kind to a role. Requires Kind to not be HK_Excluded.
Describes a module or submodule.
unsigned IsExplicit
Whether this is an explicit submodule.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
Module * Parent
The parent of this module.
ModuleKind Kind
The kind of this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
unsigned IsInferred
Whether this is an inferred submodule (module * { ... }).
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
llvm::iterator_range< submodule_iterator > submodules()
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
llvm::SmallSetVector< const Module *, 2 > UndeclaredUses
When NoUndeclaredIncludes is true, the set of modules this module tried to import but didn't because ...
OptionalDirectoryEntryRef Directory
The build directory of this module.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
llvm::SmallSetVector< Module *, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
ArrayRef< Header > getHeaders(HeaderKind HK) const
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
ArrayRef< FileEntryRef > getTopHeaders(FileManager &FileMgr)
The top-level headers associated with this module.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
bool isHeaderUnit() const
Is this module a header unit.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
unsigned IsFramework
Whether this is a framework module.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
TypeLoc getTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
NestedNameSpecifierLoc getPrefix() const
Return the prefix of this nested-name-specifier.
SourceRange getLocalSourceRange() const
Retrieve the source range covering just the last part of this nested-name-specifier,...
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
SpecifierKind
The kind of specifier that completes this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
This represents the 'absent' clause in the '#pragma omp assume' directive.
This represents 'acq_rel' clause in the '#pragma omp atomic|flush' directives.
This represents 'acquire' clause in the '#pragma omp atomic|flush' directives.
This represents clause 'affinity' in the '#pragma omp task'-based directives.
This represents the 'align' clause in the '#pragma omp allocate' directive.
This represents clause 'aligned' in the '#pragma omp ...' directives.
This represents clause 'allocate' in the '#pragma omp ...' directives.
This represents 'allocator' clause in the '#pragma omp ...' directive.
This represents 'at' clause in the '#pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.
This represents 'bind' clause in the '#pragma omp ...' directives.
This represents 'capture' clause in the '#pragma omp atomic' directive.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the '#pragma omp ...' directive.
This represents 'compare' clause in the '#pragma omp atomic' directive.
This represents the 'contains' clause in the '#pragma omp assume' directive.
This represents clause 'copyin' in the '#pragma omp ...' directives.
This represents clause 'copyprivate' in the '#pragma omp ...' directives.
This represents 'default' clause in the '#pragma omp ...' directive.
This represents 'defaultmap' clause in the '#pragma omp ...' directive.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
This represents implicit clause 'depobj' for the '#pragma omp depobj' directive.
This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...
This represents 'detach' clause in the '#pragma omp task' directive.
This represents 'device' clause in the '#pragma omp ...' directive.
This represents 'dist_schedule' clause in the '#pragma omp ...' directive.
This represents the 'doacross' clause for the '#pragma omp ordered' directive.
This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.
This represents clause 'exclusive' in the '#pragma omp scan' directive.
This represents 'fail' clause in the '#pragma omp atomic' directive.
This represents 'filter' clause in the '#pragma omp ...' directive.
This represents 'final' clause in the '#pragma omp ...' directive.
This represents clause 'firstprivate' in the '#pragma omp ...' directives.
This represents implicit clause 'flush' for the '#pragma omp flush' directive.
This represents clause 'from' in the '#pragma omp ...' directives.
Representation of the 'full' clause of the '#pragma omp unroll' directive.
This represents 'grainsize' clause in the '#pragma omp ...' directive.
This represents clause 'has_device_ptr' in the '#pragma omp ...' directives.
This represents 'hint' clause in the '#pragma omp ...' directive.
This represents the 'holds' clause in the '#pragma omp assume' directive.
This represents 'if' clause in the '#pragma omp ...' directive.
This represents clause 'in_reduction' in the '#pragma omp task' directives.
This represents clause 'inclusive' in the '#pragma omp scan' directive.
This represents the 'init' clause in '#pragma omp ...' directives.
This represents clause 'is_device_ptr' in the '#pragma omp ...' directives.
This represents clause 'lastprivate' in the '#pragma omp ...' directives.
This represents clause 'linear' in the '#pragma omp ...' directives.
This represents clause 'map' in the '#pragma omp ...' directives.
This represents 'mergeable' clause in the '#pragma omp ...' directive.
This represents 'message' clause in the '#pragma omp error' directive.
This represents the 'no_openmp' clause in the '#pragma omp assume' directive.
This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.
This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.
This represents 'nocontext' clause in the '#pragma omp ...' directive.
This represents 'nogroup' clause in the '#pragma omp ...' directive.
This represents clause 'nontemporal' in the '#pragma omp ...' directives.
This represents 'novariants' clause in the '#pragma omp ...' directive.
This represents 'nowait' clause in the '#pragma omp ...' directive.
This represents 'num_tasks' clause in the '#pragma omp ...' directive.
This represents 'num_teams' clause in the '#pragma omp ...' directive.
This represents 'num_threads' clause in the '#pragma omp ...' directive.
This represents 'order' clause in the '#pragma omp ...' directive.
This represents 'ordered' clause in the '#pragma omp ...' directive.
Representation of the 'partial' clause of the '#pragma omp unroll' directive.
This class represents the 'permutation' clause in the '#pragma omp interchange' directive.
This represents 'priority' clause in the '#pragma omp ...' directive.
This represents clause 'private' in the '#pragma omp ...' directives.
This represents 'proc_bind' clause in the '#pragma omp ...' directive.
This represents 'read' clause in the '#pragma omp atomic' directive.
This represents clause 'reduction' in the '#pragma omp ...' directives.
This represents 'relaxed' clause in the '#pragma omp atomic' directives.
This represents 'release' clause in the '#pragma omp atomic|flush' directives.
This represents 'reverse_offload' clause in the '#pragma omp requires' directive.
This represents 'simd' clause in the '#pragma omp ...' directive.
This represents 'safelen' clause in the '#pragma omp ...' directive.
This represents 'schedule' clause in the '#pragma omp ...' directive.
This represents 'seq_cst' clause in the '#pragma omp atomic|flush' directives.
This represents 'severity' clause in the '#pragma omp error' directive.
This represents clause 'shared' in the '#pragma omp ...' directives.
This represents 'simdlen' clause in the '#pragma omp ...' directive.
This represents the 'sizes' clause in the '#pragma omp tile' directive.
This represents clause 'task_reduction' in the '#pragma omp taskgroup' directives.
This represents 'thread_limit' clause in the '#pragma omp ...' directive.
This represents 'threads' clause in the '#pragma omp ...' directive.
This represents clause 'to' in the '#pragma omp ...' directives.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents 'unified_address' clause in the '#pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the '#pragma omp requires' directive.
This represents 'untied' clause in the '#pragma omp ...' directive.
This represents 'update' clause in the '#pragma omp atomic' directive.
This represents the 'use' clause in '#pragma omp ...' directives.
This represents clause 'use_device_addr' in the '#pragma omp ...' directives.
This represents clause 'use_device_ptr' in the '#pragma omp ...' directives.
This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.
This represents 'weak' clause in the '#pragma omp atomic' directives.
This represents 'write' clause in the '#pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.
ObjCCategoryDecl - Represents a category declaration.
Iterator that walks over the list of categories, filtering out those that do not meet specific criter...
Represents an ObjC class declaration.
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
Wrapper for source info for ObjC interfaces.
SourceLocation getNameEndLoc() const
SourceLocation getNameLoc() const
Wraps an ObjCPointerType with source location information.
SourceLocation getStarLoc() const
bool hasBaseTypeAsWritten() const
SourceLocation getTypeArgsLAngleLoc() const
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
TypeSourceInfo * getTypeArgTInfo(unsigned i) const
SourceLocation getProtocolRAngleLoc() const
SourceLocation getProtocolLoc(unsigned i) const
SourceLocation getProtocolLAngleLoc() const
SourceLocation getTypeArgsRAngleLoc() const
const VersionTuple & getVersion() const
ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...
unsigned getNumProtocols() const
SourceLocation getProtocolLoc(unsigned i) const
SourceLocation getProtocolLAngleLoc() const
SourceLocation getProtocolRAngleLoc() const
Represents a clause with one or more 'var' objects, represented as an expr, as its arguments.
This is the base type for all OpenACC Clauses.
OpenCL supported extensions and optional core features.
SourceLocation getEllipsisLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
Represents a parameter to a function.
SourceLocation getKWLoc() const
Wrapper for source info for pointers.
SourceLocation getStarLoc() const
Iteration over the preprocessed entities.
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)
Retrieve the macro definition that corresponds to the given MacroInfo.
const std::vector< SourceRange > & getSkippedRanges()
Retrieve all ranges that got skipped while preprocessing.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.
iterator local_end()
End iterator for local, non-loaded, preprocessed entities.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
bool WriteCommentListToPCH
Whether to write comment locations into the PCH when building it.
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
ArrayRef< ModuleMacro * > getLeafModuleMacros(const IdentifierInfo *II) const
Get the list of leaf (non-overridden) module macros for a name.
ArrayRef< PPConditionalInfo > getPreambleConditionalStack() const
SourceLocation getModuleImportLoc(Module *M) const
bool isRecordingPreamble() const
MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const
Given an identifier, return the latest non-imported macro directive for that identifier.
bool SawDateOrTime() const
Returns true if the preprocessor has seen a use of DATE or TIME in the file so far.
unsigned getCounterValue() const
SourceManager & getSourceManager() const
std::optional< PreambleSkipInfo > getPreambleSkipInfo() const
bool hasRecordedPreamble() const
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
bool alreadyIncluded(FileEntryRef File) const
Return true if this header has already been included.
FileID getPredefinesFileID() const
Returns the FileID for the preprocessor predefines.
HeaderSearch & getHeaderSearchInfo() const
SmallVector< SourceLocation, 64 > serializeSafeBufferOptOutMap() const
IdentifierTable & getIdentifierTable()
const LangOptions & getLangOpts() const
PreprocessingRecord * getPreprocessingRecord() const
Retrieve the preprocessing record, or NULL if there is no preprocessing record.
DiagnosticsEngine & getDiagnostics() const
SourceLocation getPreambleRecordedPragmaAssumeNonNullLoc() const
Get the location of the recorded unterminated #pragma clang assume_nonnull begin in the preamble,...
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
A (possibly-)qualified type.
Wrapper of type source information for a type with non-trivial direct qualifiers.
The collection of all-type qualifiers we support.
SourceLocation getAmpAmpLoc() const
Represents a struct/union/class.
Wrapper for source info for record types.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
void * getAsOpaquePtr() const
unsigned getNumArgs() const
void updateOutOfDateSelector(Selector Sel)
llvm::MapVector< Selector, SourceLocation > ReferencedSelectors
Method selectors used in a @selector expression.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Sema - This implements semantic analysis and AST building for C.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
Preprocessor & getPreprocessor() const
PragmaStack< FPOptionsOverride > FpPragmaStack
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimize off". If this location is invalid,...
FPOptionsOverride CurFPFeatureOverrides()
LateParsedTemplateMapT LateParsedTemplateMap
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
SmallVector< const Decl * > DeclsWithEffectsToVerify
All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > LateParsedTemplateMapT
CXXRecordDecl * getStdBadAlloc() const
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
PragmaStack< AlignPackInfo > AlignPackStack
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
IdentifierResolver IdResolver
static RawLocEncoding encode(SourceLocation Loc, UIntTy BaseOffset, unsigned BaseModuleFileIndex, SourceLocationSequence *=nullptr)
This object establishes a SourceLocationSequence.
Serialized encoding of a sequence of SourceLocations.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
DiagnosticsEngine & getDiagnostics() const
SourceLocation::UIntTy getNextLocalOffset() const
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
const SrcMgr::SLocEntry & getLocalSLocEntry(unsigned Index) const
Get a local SLocEntry. This is exposed for indexing.
FileManager & getFileManager() const
unsigned local_sloc_entry_size() const
Get the number of local SLocEntries we have.
SourceLocation getLocForEndOfFile(FileID FID) const
Return the source location corresponding to the last byte of the specified file.
FileID getMainFileID() const
Returns the FileID of the main source file.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
bool hasLineTable() const
Determine if the source manager has a line table.
bool isLoadedSourceLocation(SourceLocation Loc) const
Returns true if Loc came from a PCH/Module.
bool isLoadedFileID(FileID FID) const
Returns true if FID came from a PCH/Module.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
LineTableInfo & getLineTable()
Retrieve the stored line table.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
unsigned IsTransient
True if this file may be transient, that is, if it might not exist at some later point in time when t...
std::optional< llvm::MemoryBufferRef > getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc=SourceLocation()) const
Returns the memory buffer for the associated content.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
Information about a FileID, basically just the logical file that it represents and include stack info...
const ContentCache & getContentCache() const
This is a discriminated union of FileInfo and ExpansionInfo.
SourceLocation::UIntTy getOffset() const
const FileInfo & getFile() const
const ExpansionInfo & getExpansion() const
An array of decls optimized for the common case of only containing one entry.
Wrapper for substituted template type parameters.
Wrapper for substituted template type parameters.
Represents the declaration of a struct/union/class/enum.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Exposes information about the current target.
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Location wrapper for a TemplateArgument.
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
SourceLocation getTemplateLoc() const
unsigned getNumArgs() const
SourceLocation getLAngleLoc() const
TemplateArgumentLoc getArgLoc(unsigned i) const
SourceLocation getRAngleLoc() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKeywordLoc() const
Wrapper for template type parameters.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
unsigned getFlags() const
Return the internal represtation of the flags.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
unsigned getLength() const
SourceLocation getAnnotationEndLoc() const
void * getAnnotationValue() const
tok::TokenKind getKind() const
bool isAnnotation() const
Return true if this is any of tok::annot_* kind tokens.
The top declaration context.
NamespaceDecl * getAnonymousNamespace() const
Base wrapper for a particular "section" of type source info.
QualType getType() const
Get the type for which this source info wrapper provides information.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
TypeSourceInfo * getUnmodifiedTInfo() const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
SourceLocation getNameLoc() const
The base class of the type hierarchy.
TypeClass getTypeClass() const
Base class for declarations which introduce a typedef-name.
Wrapper for source info for typedefs.
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getTypeofLoc() const
The iterator over UnresolvedSets.
Wrapper for source info for unresolved typename using decls.
Wrapper for source info for types used via transparent aliases.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
EvaluatedStmt * getEvaluatedStmt() const
const Expr * getInit() const
APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getNameLoc() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
SourceLocation getEllipsisLoc() const
Retrieve the source location of the ellipsis, whose presence indicates that the capture is a pack exp...
void writeQualifiers(Qualifiers value)
A key used when looking up entities by DeclarationName.
Information about a module that has been loaded by the ASTReader.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
unsigned LocalNumSubmodules
The number of submodules in this module.
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
unsigned NumPreprocessedEntities
unsigned Index
The index of this module in the list of modules.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
std::string FileName
The file name of the module file.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
Writer for the on-disk hash table.
A type index; the type ID with the qualifier bits removed.
uint32_t getModuleFileIndex() const
TypeID asTypeID(unsigned FastQuals) const
uint64_t getValue() const
Class that performs name lookup into a DeclContext stored in an AST file.
Class that performs lookup to specialized decls.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
TypeCode
Record codes for each kind of type.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ EXPR_DESIGNATED_INIT
A DesignatedInitExpr record.
@ EXPR_COMPOUND_LITERAL
A CompoundLiteralExpr record.
@ EXPR_OBJC_IVAR_REF_EXPR
An ObjCIvarRefExpr record.
@ EXPR_MEMBER
A MemberExpr record.
@ EXPR_CXX_TEMPORARY_OBJECT
A CXXTemporaryObjectExpr record.
@ EXPR_CXX_UNRESOLVED_LOOKUP
@ EXPR_COMPOUND_ASSIGN_OPERATOR
A CompoundAssignOperator record.
@ EXPR_EXPR_WITH_CLEANUPS
@ EXPR_CXX_STATIC_CAST
A CXXStaticCastExpr record.
@ EXPR_OBJC_STRING_LITERAL
An ObjCStringLiteral record.
@ EXPR_VA_ARG
A VAArgExpr record.
@ EXPR_CXX_OPERATOR_CALL
A CXXOperatorCallExpr record.
@ STMT_OBJC_AT_TRY
An ObjCAtTryStmt record.
@ EXPR_CXX_UNRESOLVED_CONSTRUCT
@ EXPR_FIXEDPOINT_LITERAL
@ STMT_DO
A DoStmt record.
@ STMT_OBJC_CATCH
An ObjCAtCatchStmt record.
@ STMT_IF
An IfStmt record.
@ EXPR_CXX_EXPRESSION_TRAIT
@ EXPR_STRING_LITERAL
A StringLiteral record.
@ EXPR_IMPLICIT_CAST
An ImplicitCastExpr record.
@ STMT_GCCASM
A GCC-style AsmStmt record.
@ EXPR_IMAGINARY_LITERAL
An ImaginaryLiteral record.
@ STMT_WHILE
A WhileStmt record.
@ EXPR_STMT
A StmtExpr record.
@ EXPR_CXX_REINTERPRET_CAST
A CXXReinterpretCastExpr record.
@ EXPR_DESIGNATED_INIT_UPDATE
A DesignatedInitUpdateExpr record.
@ STMT_OBJC_AT_SYNCHRONIZED
An ObjCAtSynchronizedStmt record.
@ EXPR_CXX_PSEUDO_DESTRUCTOR
@ EXPR_CHARACTER_LITERAL
A CharacterLiteral record.
@ EXPR_OBJC_ENCODE
An ObjCEncodeExpr record.
@ EXPR_CSTYLE_CAST
A CStyleCastExpr record.
@ EXPR_OBJC_BOXED_EXPRESSION
@ EXPR_OBJC_BOOL_LITERAL
An ObjCBoolLiteralExpr record.
@ EXPR_CXX_BIND_TEMPORARY
@ EXPR_EXT_VECTOR_ELEMENT
An ExtVectorElementExpr record.
@ STMT_RETURN
A ReturnStmt record.
@ STMT_OBJC_FOR_COLLECTION
An ObjCForCollectionStmt record.
@ STMT_CONTINUE
A ContinueStmt record.
@ EXPR_PREDEFINED
A PredefinedExpr record.
@ EXPR_CXX_BOOL_LITERAL
A CXXBoolLiteralExpr record.
@ EXPR_PAREN_LIST
A ParenListExpr record.
@ EXPR_CXX_PAREN_LIST_INIT
A CXXParenListInitExpr record.
@ STMT_COMPOUND
A CompoundStmt record.
@ STMT_FOR
A ForStmt record.
@ STMT_ATTRIBUTED
An AttributedStmt record.
@ EXPR_CXX_REWRITTEN_BINARY_OPERATOR
A CXXRewrittenBinaryOperator record.
@ STMT_GOTO
A GotoStmt record.
@ EXPR_NO_INIT
An NoInitExpr record.
@ EXPR_OBJC_ARRAY_LITERAL
@ EXPR_OBJC_PROTOCOL_EXPR
An ObjCProtocolExpr record.
@ EXPR_CXX_CONSTRUCT
A CXXConstructExpr record.
@ EXPR_OBJC_DICTIONARY_LITERAL
@ EXPR_CXX_DYNAMIC_CAST
A CXXDynamicCastExpr record.
@ STMT_CXX_TRY
A CXXTryStmt record.
@ EXPR_GENERIC_SELECTION
A GenericSelectionExpr record.
@ EXPR_CALL
A CallExpr record.
@ EXPR_GNU_NULL
A GNUNullExpr record.
@ EXPR_BINARY_CONDITIONAL_OPERATOR
@ EXPR_OBJC_PROPERTY_REF_EXPR
An ObjCPropertyRefExpr record.
@ EXPR_CXX_CONST_CAST
A CXXConstCastExpr record.
@ STMT_REF_PTR
A reference to a previously [de]serialized Stmt record.
@ EXPR_OBJC_MESSAGE_EXPR
An ObjCMessageExpr record.
@ EXPR_CXX_DEPENDENT_SCOPE_DECL_REF
@ STMT_CASE
A CaseStmt record.
@ EXPR_FUNCTION_PARM_PACK
@ STMT_STOP
A marker record that indicates that we are at the end of an expression.
@ EXPR_CXX_NULL_PTR_LITERAL
@ STMT_MSASM
A MS-style AsmStmt record.
@ EXPR_CONDITIONAL_OPERATOR
A ConditionOperator record.
@ EXPR_BINARY_OPERATOR
A BinaryOperator record.
@ EXPR_CXX_STD_INITIALIZER_LIST
A CXXStdInitializerListExpr record.
@ EXPR_SHUFFLE_VECTOR
A ShuffleVectorExpr record.
@ STMT_OBJC_FINALLY
An ObjCAtFinallyStmt record.
@ EXPR_OBJC_SELECTOR_EXPR
An ObjCSelectorExpr record.
@ EXPR_FLOATING_LITERAL
A FloatingLiteral record.
@ EXPR_CXX_DEPENDENT_SCOPE_MEMBER
@ STMT_NULL_PTR
A NULL expression.
@ STMT_DEFAULT
A DefaultStmt record.
@ EXPR_CHOOSE
A ChooseExpr record.
@ STMT_NULL
A NullStmt record.
@ EXPR_DECL_REF
A DeclRefExpr record.
@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM
@ EXPR_INIT_LIST
An InitListExpr record.
@ EXPR_IMPLICIT_VALUE_INIT
An ImplicitValueInitExpr record.
@ EXPR_PAREN
A ParenExpr record.
@ STMT_LABEL
A LabelStmt record.
@ EXPR_CXX_FUNCTIONAL_CAST
A CXXFunctionalCastExpr record.
@ EXPR_USER_DEFINED_LITERAL
A UserDefinedLiteral record.
@ EXPR_INTEGER_LITERAL
An IntegerLiteral record.
@ EXPR_MATERIALIZE_TEMPORARY
@ EXPR_CXX_MEMBER_CALL
A CXXMemberCallExpr record.
@ STMT_SWITCH
A SwitchStmt record.
@ STMT_DECL
A DeclStmt record.
@ EXPR_CXX_UNRESOLVED_MEMBER
@ EXPR_OBJC_KVC_REF_EXPR
UNUSED.
@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK
@ EXPR_CXX_SCALAR_VALUE_INIT
@ EXPR_SIZEOF_ALIGN_OF
A SizefAlignOfExpr record.
@ STMT_BREAK
A BreakStmt record.
@ STMT_OBJC_AT_THROW
An ObjCAtThrowStmt record.
@ EXPR_ADDR_LABEL
An AddrLabelExpr record.
@ STMT_CXX_FOR_RANGE
A CXXForRangeStmt record.
@ EXPR_CXX_ADDRSPACE_CAST
A CXXAddrspaceCastExpr record.
@ EXPR_ARRAY_SUBSCRIPT
An ArraySubscriptExpr record.
@ EXPR_UNARY_OPERATOR
A UnaryOperator record.
@ STMT_CXX_CATCH
A CXXCatchStmt record.
@ STMT_INDIRECT_GOTO
An IndirectGotoStmt record.
Defines the clang::TargetInfo interface.
bool isSystem(CharacteristicKind CK)
Determine whether a file / directory characteristic is for system code.
bool isModuleMap(CharacteristicKind CK)
Determine whether a file characteristic is for a module map.
bool LE(InterpState &S, CodePtr OpPC)
GlobalDeclID LazySpecializationInfo
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ EXTENSION_METADATA
Metadata describing this particular extension.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_METADATA
Metadata for submodules as a whole.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT)
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
uint32_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
const DeclContext * getDefinitiveDeclContext(const DeclContext *DC)
Retrieve the "definitive" declaration that provides all of the visible entries for the given declarat...
void updateModuleTimestamp(StringRef ModuleFilename)
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched #pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ OPENCL_EXTENSION_DECLS
Record code for declarations associated with OpenCL extensions.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open #ifs/#ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ OPENCL_EXTENSION_TYPES
Record code for types associated with OpenCL extensions.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ METADATA_OLD_FORMAT
This is so that older clang versions, before the introduction of the control block,...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
uint32_t MacroID
An ID number that refers to a macro in an AST file.
unsigned ComputeHash(Selector Sel)
@ UPD_CXX_RESOLVED_DTOR_DELETE
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
@ UPD_CXX_DEDUCED_RETURN_TYPE
@ UPD_CXX_ADDED_IMPLICIT_MEMBER
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
@ UPD_CXX_POINT_OF_INSTANTIATION
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
@ UPD_STATIC_LOCAL_NUMBER
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
@ UPD_ADDED_ATTR_TO_RECORD
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
@ UPD_CXX_ADDED_VAR_DEFINITION
The JSON file list parser is used to communicate input to InstallAPI.
@ NUM_OVERLOADED_OPERATORS
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_COMMON_TYPE_ID
The internal '__builtin_common_type' template.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_TYPE_PACK_ELEMENT_ID
The internal '__type_pack_element' template.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ PREDEF_DECL_MAKE_INTEGER_SEQ_ID
The internal '__make_integer_seq' template.
@ Property
The type of a property.
@ Result
The result type of a method or function.
bool CanElideDeclDef(const Decl *D)
If we can elide the definition of.
std::pair< IdentifierInfo *, SourceLocation > DeviceTypeArgument
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
std::optional< unsigned > getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
for(const auto &A :T->param_types())
const FunctionProtoType * T
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
@ None
The alignment was not explicit in code.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
The signature of a module, which is a hash of the AST content.
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments.
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
const DeclarationNameLoc & getInfo() const
Structure used to store a statement, the constant value to which it was evaluated (if any),...
Contains a late templated function.
FPOptions FPO
Floating-point options in the point of definition.
Decl * D
The template function declaration to be late parsed.
Data for list of allocators.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Location information for a TemplateArgument.
SourceLocation getTemplateEllipsisLoc() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
TypeSourceInfo * getAsTypeSourceInfo() const
SourceLocation getTemplateNameLoc() const
Describes the categories of an Objective-C class.