82#include "llvm/ADT/APFloat.h"
83#include "llvm/ADT/APInt.h"
84#include "llvm/ADT/ArrayRef.h"
85#include "llvm/ADT/DenseMap.h"
86#include "llvm/ADT/DenseSet.h"
87#include "llvm/ADT/PointerIntPair.h"
88#include "llvm/ADT/STLExtras.h"
89#include "llvm/ADT/ScopeExit.h"
90#include "llvm/ADT/SmallPtrSet.h"
91#include "llvm/ADT/SmallString.h"
92#include "llvm/ADT/SmallVector.h"
93#include "llvm/ADT/StringRef.h"
94#include "llvm/Bitstream/BitCodes.h"
95#include "llvm/Bitstream/BitstreamWriter.h"
96#include "llvm/Support/Compression.h"
97#include "llvm/Support/DJB.h"
98#include "llvm/Support/EndianStream.h"
99#include "llvm/Support/ErrorHandling.h"
100#include "llvm/Support/LEB128.h"
101#include "llvm/Support/MemoryBuffer.h"
102#include "llvm/Support/OnDiskHashTable.h"
103#include "llvm/Support/Path.h"
104#include "llvm/Support/SHA1.h"
105#include "llvm/Support/TimeProfiler.h"
106#include "llvm/Support/VersionTuple.h"
107#include "llvm/Support/raw_ostream.h"
122using namespace clang;
125template <
typename T,
typename Allocator>
126static StringRef
bytes(
const std::vector<T, Allocator> &v) {
127 if (v.empty())
return StringRef();
128 return StringRef(
reinterpret_cast<const char*
>(&v[0]),
129 sizeof(
T) * v.size());
134 return StringRef(
reinterpret_cast<const char*
>(v.data()),
135 sizeof(
T) * v.size());
138static std::string
bytes(
const std::vector<bool> &
V) {
140 Str.reserve(
V.size() / 8);
141 for (
unsigned I = 0, E =
V.size(); I < E;) {
143 for (
unsigned Bit = 0; Bit < 8 && I < E; ++Bit, ++I)
156#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
157 case Type::CLASS_ID: return TYPE_##CODE_ID;
158#include "clang/Serialization/TypeBitCodes.def"
160 llvm_unreachable(
"shouldn't be serializing a builtin type this way");
162 llvm_unreachable(
"bad type kind");
167struct AffectingModuleMaps {
168 llvm::DenseSet<FileID> DefinitionFileIDs;
169 llvm::DenseSet<const FileEntry *> DefinitionFiles;
172std::optional<AffectingModuleMaps>
185 enum AffectedReason :
bool {
186 AR_TextualHeader = 0,
187 AR_ImportOrTextualHeader = 1,
189 auto AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {
190 LHS = std::max(LHS, RHS);
192 llvm::DenseMap<FileID, AffectedReason> ModuleMaps;
193 llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;
194 auto CollectModuleMapsForHierarchy = [&](
const Module *M,
195 AffectedReason Reason) {
201 if (
auto [It, Inserted] = ProcessedModules.insert({M, Reason});
202 !Inserted && Reason <= It->second) {
208 std::queue<const Module *> Q;
211 const Module *Mod = Q.front();
217 AssignMostImportant(ModuleMaps[F], Reason);
222 AssignMostImportant(ModuleMaps[UniqF], Reason);
231 CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);
233 std::queue<const Module *> Q;
236 const Module *CurrentModule = Q.front();
240 CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);
242 CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);
256 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
270 if (
const Module *M = KH.getModule())
271 CollectModuleMapsForHierarchy(M, AR_TextualHeader);
292 llvm::DenseSet<const FileEntry *> ModuleFileEntries;
293 llvm::DenseSet<FileID> ModuleFileIDs;
294 for (
auto [FID, Reason] : ModuleMaps) {
295 if (Reason == AR_ImportOrTextualHeader)
296 ModuleFileIDs.insert(FID);
297 if (
auto *FE =
SM.getFileEntryForID(FID))
298 ModuleFileEntries.insert(FE);
301 AffectingModuleMaps R;
302 R.DefinitionFileIDs = std::move(ModuleFileIDs);
303 R.DefinitionFiles = std::move(ModuleFileEntries);
310 ASTRecordWriter BasicWriter;
313 ASTTypeWriter(ASTContext &Context, ASTWriter &Writer)
314 : Writer(Writer), BasicWriter(Context, Writer, Record) {}
317 if (
T.hasLocalNonFastQualifiers()) {
318 Qualifiers Qs =
T.getLocalQualifiers();
319 BasicWriter.writeQualType(
T.getLocalUnqualifiedType());
320 BasicWriter.writeQualifiers(Qs);
321 return BasicWriter.Emit(
TYPE_EXT_QUAL, Writer.getTypeExtQualAbbrev());
324 const Type *typePtr =
T.getTypePtr();
325 serialization::AbstractTypeWriter<ASTRecordWriter> atw(BasicWriter);
333 ASTRecordWriter &Record;
335 void addSourceLocation(SourceLocation Loc) { Record.AddSourceLocation(Loc); }
336 void addSourceRange(SourceRange Range) { Record.AddSourceRange(Range); }
339 TypeLocWriter(ASTRecordWriter &Record) : Record(Record) {}
341#define ABSTRACT_TYPELOC(CLASS, PARENT)
342#define TYPELOC(CLASS, PARENT) \
343 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
344#include "clang/AST/TypeLocNodes.def"
357void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
367void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) {
371void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) {
375void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
379void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
383void TypeLocWriter::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
387void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
391void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
395void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
399void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
404void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) {
412void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
413 VisitArrayTypeLoc(TL);
416void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
417 VisitArrayTypeLoc(TL);
420void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
421 VisitArrayTypeLoc(TL);
424void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
425 DependentSizedArrayTypeLoc TL) {
426 VisitArrayTypeLoc(TL);
429void TypeLocWriter::VisitDependentAddressSpaceTypeLoc(
430 DependentAddressSpaceTypeLoc TL) {
433 addSourceLocation(
range.getBegin());
434 addSourceLocation(
range.getEnd());
438void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
439 DependentSizedExtVectorTypeLoc TL) {
443void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) {
447void TypeLocWriter::VisitDependentVectorTypeLoc(
448 DependentVectorTypeLoc TL) {
452void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
456void TypeLocWriter::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
459 addSourceLocation(
range.getBegin());
460 addSourceLocation(
range.getEnd());
465void TypeLocWriter::VisitDependentSizedMatrixTypeLoc(
466 DependentSizedMatrixTypeLoc TL) {
469 addSourceLocation(
range.getBegin());
470 addSourceLocation(
range.getEnd());
475void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
481 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i)
485void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
486 VisitFunctionTypeLoc(TL);
489void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
490 VisitFunctionTypeLoc(TL);
493void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
499void TypeLocWriter::VisitUsingTypeLoc(UsingTypeLoc TL) {
505void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
511void TypeLocWriter::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
520void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
526void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
533void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
538void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
561void TypeLocWriter::VisitAutoTypeLoc(
AutoTypeLoc TL) {
566 Record.AddConceptReference(CR);
572void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
573 DeducedTemplateSpecializationTypeLoc TL) {
579void TypeLocWriter::VisitTagTypeLoc(TagTypeLoc TL) {
585void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) {
589void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
593void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
595void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
599void TypeLocWriter::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
603void TypeLocWriter::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
607void TypeLocWriter::VisitHLSLAttributedResourceTypeLoc(
608 HLSLAttributedResourceTypeLoc TL) {
612void TypeLocWriter::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
616void TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
620void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(
621 SubstTemplateTypeParmTypeLoc TL) {
625void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(
626 SubstTemplateTypeParmPackTypeLoc TL) {
630void TypeLocWriter::VisitSubstBuiltinTemplatePackTypeLoc(
631 SubstBuiltinTemplatePackTypeLoc TL) {
635void TypeLocWriter::VisitTemplateSpecializationTypeLoc(
636 TemplateSpecializationTypeLoc TL) {
643 for (
unsigned i = 0, e = TL.
getNumArgs(); i != e; ++i)
647void TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) {
652void TypeLocWriter::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
656void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
662void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
666void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
671void TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
683void TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
687void TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
693void TypeLocWriter::VisitPipeTypeLoc(PipeTypeLoc TL) {
696void TypeLocWriter::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
699void TypeLocWriter::VisitDependentBitIntTypeLoc(
700 clang::DependentBitIntTypeLoc TL) {
704void TypeLocWriter::VisitPredefinedSugarTypeLoc(
705 clang::PredefinedSugarTypeLoc TL) {
709void ASTWriter::WriteTypeAbbrevs() {
710 using namespace llvm;
712 std::shared_ptr<BitCodeAbbrev> Abv;
715 Abv = std::make_shared<BitCodeAbbrev>();
717 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
718 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3));
719 TypeExtQualAbbrev = Stream.EmitAbbrev(std::move(Abv));
727 llvm::BitstreamWriter &Stream,
731 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID,
Record);
734 if (!Name || Name[0] == 0)
738 Record.push_back(*Name++);
739 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
Record);
743 llvm::BitstreamWriter &Stream,
748 Record.push_back(*Name++);
749 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME,
Record);
754#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
886void ASTWriter::WriteBlockInfoBlock() {
888 Stream.EnterBlockInfoBlock();
890#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
891#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
894 BLOCK(CONTROL_BLOCK);
904 BLOCK(OPTIONS_BLOCK);
912 BLOCK(INPUT_FILES_BLOCK);
977 BLOCK(SOURCE_MANAGER_BLOCK);
985 BLOCK(PREPROCESSOR_BLOCK);
993 BLOCK(SUBMODULE_BLOCK);
1015 BLOCK(COMMENTS_BLOCK);
1019 BLOCK(DECLTYPES_BLOCK);
1023 RECORD(TYPE_BLOCK_POINTER);
1024 RECORD(TYPE_LVALUE_REFERENCE);
1025 RECORD(TYPE_RVALUE_REFERENCE);
1026 RECORD(TYPE_MEMBER_POINTER);
1027 RECORD(TYPE_CONSTANT_ARRAY);
1028 RECORD(TYPE_INCOMPLETE_ARRAY);
1029 RECORD(TYPE_VARIABLE_ARRAY);
1032 RECORD(TYPE_FUNCTION_NO_PROTO);
1033 RECORD(TYPE_FUNCTION_PROTO);
1035 RECORD(TYPE_TYPEOF_EXPR);
1039 RECORD(TYPE_OBJC_INTERFACE);
1040 RECORD(TYPE_OBJC_OBJECT_POINTER);
1042 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1043 RECORD(TYPE_UNRESOLVED_USING);
1044 RECORD(TYPE_INJECTED_CLASS_NAME);
1045 RECORD(TYPE_OBJC_OBJECT);
1046 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1047 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1048 RECORD(TYPE_DEPENDENT_NAME);
1049 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1051 RECORD(TYPE_MACRO_QUALIFIED);
1052 RECORD(TYPE_PACK_EXPANSION);
1054 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1055 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1057 RECORD(TYPE_UNARY_TRANSFORM);
1061 RECORD(TYPE_OBJC_TYPE_PARAM);
1142 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1148 BLOCK(EXTENSION_BLOCK);
1151 BLOCK(UNHASHED_CONTROL_BLOCK);
1171 bool Changed =
FileMgr.makeAbsolutePath(Path);
1172 return Changed | llvm::sys::path::remove_dots(Path);
1187 assert(Filename &&
"No file name to adjust?");
1189 if (BaseDir.empty())
1194 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1195 if (Filename[Pos] != BaseDir[Pos])
1204 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1205 if (!llvm::sys::path::is_separator(BaseDir.back()))
1219 return Filename + Pos;
1222std::pair<ASTFileSignature, ASTFileSignature>
1223ASTWriter::createSignature()
const {
1224 StringRef AllBytes(Buffer.data(), Buffer.size());
1227 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1232 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1235 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1237 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1240 return std::make_pair(ASTBlockHash, Signature);
1243ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1245 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1247 assert(WritingModule);
1248 assert(WritingModule->isNamedModule());
1252 for (
auto [ExportImported, _] : WritingModule->Exports)
1253 Hasher.update(ExportImported->Signature);
1277 for (
Module *M : TouchedTopLevelModules)
1285 for (uint8_t Byte : S) {
1286 Stream.BackpatchByte(BitNo, Byte);
1291ASTFileSignature ASTWriter::backpatchSignature() {
1292 if (isWritingStdCXXNamedModules()) {
1293 ASTFileSignature Signature = createSignatureForNamedModule();
1298 if (!WritingModule ||
1303 ASTFileSignature ASTBlockHash;
1304 ASTFileSignature Signature;
1305 std::tie(ASTBlockHash, Signature) = createSignature();
1313void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1314 using namespace llvm;
1317 Stream.FlushToWord();
1318 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1326 if (isWritingStdCXXNamedModules() ||
1337 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1340 if (!isWritingStdCXXNamedModules()) {
1341 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1343 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1344 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1347 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1348 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1352 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1353 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1354 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1355 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1358 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1359 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1368 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1369#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1370#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1371 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1372#include "clang/Basic/DiagnosticOptions.def"
1374 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1377 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1386 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1388 Record.push_back(HSOpts.UserEntries.size());
1389 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1390 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1392 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1398 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1399 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1400 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1401 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1405 Record.push_back(HSOpts.VFSOverlayFiles.size());
1406 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1407 AddString(VFSOverlayFile,
Record);
1412 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1413 WritePragmaDiagnosticMappings(Diags, WritingModule);
1418 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1420 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1421 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1422 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1424 HSEntryUsage.size()};
1425 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1431 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1432 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1433 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1434 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1435 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1437 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1442 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1446void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1447 using namespace llvm;
1456 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1457 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
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, 1));
1464 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::Blob));
1468 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1469 assert((!WritingModule || isysroot.empty()) &&
1470 "writing module as a relocatable PCH?");
1475 CLANG_VERSION_MAJOR,
1476 CLANG_VERSION_MINOR,
1478 isWritingStdCXXNamedModules(),
1480 ASTHasCompilerErrors};
1481 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1485 if (WritingModule) {
1487 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1489 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1490 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1492 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1494 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1500 if (WritingModule->Directory) {
1501 return WritingModule->Directory->getName();
1503 return std::nullopt;
1515 WritingModule->Directory->getName() !=
".")) {
1517 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1519 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1520 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1523 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1527 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1528 }
else if (!isysroot.empty()) {
1530 BaseDirectory = std::string(isysroot);
1535 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1539 AddPath(WritingModule->PresumedModuleMapFile.empty()
1540 ? Map.getModuleMapFileForUniquing(WritingModule)
1541 ->getNameAsRequested()
1542 : StringRef(WritingModule->PresumedModuleMapFile),
1546 if (
auto *AdditionalModMaps =
1547 Map.getAdditionalModuleMapFiles(WritingModule)) {
1548 Record.push_back(AdditionalModMaps->size());
1549 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1550 AdditionalModMaps->end());
1551 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1554 for (FileEntryRef F : ModMaps)
1555 AddPath(F.getName(),
Record);
1565 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1566 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1567 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1573 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1574 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1575 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1577 SmallString<128> Blob;
1579 for (ModuleFile &M : Chain->getModuleManager()) {
1581 if (!M.isDirectlyImported())
1589 AddSourceLocation(M.ImportLoc,
Record);
1590 AddStringBlob(M.ModuleName,
Record, Blob);
1591 Record.push_back(M.StandardCXXModule);
1595 if (M.StandardCXXModule) {
1607 AddPathBlob(M.FileName,
Record, Blob);
1610 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1620#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
1621 Record.push_back(LangOpts.Name);
1622#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1623 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1624#include "clang/Basic/LangOptions.def"
1625#define SANITIZER(NAME, ID) \
1626 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1627#include "clang/Basic/Sanitizers.def"
1648 AddString(
T.getTriple(),
Record);
1656 using CK = CodeGenOptions::CompatibilityKind;
1658 const CodeGenOptions &CGOpts = getCodeGenOpts();
1659#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1660 if constexpr (CK::Compatibility != CK::Benign) \
1661 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1662#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1663 if constexpr (CK::Compatibility != CK::Benign) \
1664 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1665#define DEBUGOPT(Name, Bits, Default, Compatibility)
1666#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1667#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1668#include "clang/Basic/CodeGenOptions.def"
1684 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1697 const HeaderSearchOptions &HSOpts =
1700 SmallString<256> HSOpts_ModuleCachePath;
1702 HSOpts_ModuleCachePath);
1706 AddString(HSOpts_ModuleCachePath,
Record);
1728 bool WriteMacros = !SkipMacros;
1729 Record.push_back(WriteMacros);
1733 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1741 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1746 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1762 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1764 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1765 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1766 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1771 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1778 WriteInputFiles(SourceMgr);
1785struct InputFileEntry {
1789 bool BufferOverridden;
1796 void trySetContentHash(
1798 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1807 auto MemBuff = GetMemBuff();
1809 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1814 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1816 ContentHash[1] =
uint32_t(Hash >> 32);
1822SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1823 const SrcMgr::FileInfo &
File) {
1824 SourceLocation IncludeLoc =
File.getIncludeLoc();
1826 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1827 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1828 if (!IsSLocAffecting[IncludeFID.ID])
1829 IncludeLoc = SourceLocation();
1834void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1835 using namespace llvm;
1840 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1842 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1843 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1844 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1845 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1846 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1847 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1848 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1849 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1850 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1851 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1854 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1856 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1857 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1858 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1860 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1863 std::vector<InputFileEntry> UserFiles;
1864 std::vector<InputFileEntry> SystemFiles;
1868 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1875 if (!
Cache->OrigEntry)
1879 if (!IsSLocFileEntryAffecting[I])
1882 InputFileEntry Entry(*
Cache->OrigEntry);
1883 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1884 Entry.IsTransient =
Cache->IsTransient;
1885 Entry.BufferOverridden =
Cache->BufferOverridden;
1887 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1888 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1889 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1892 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1894 if (Entry.IsSystemFile)
1895 SystemFiles.push_back(Entry);
1897 UserFiles.push_back(Entry);
1904 if (!Sysroot.empty()) {
1905 SmallString<128> SDKSettingsJSON = Sysroot;
1906 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1909 InputFileEntry Entry(*FE);
1910 Entry.IsSystemFile =
true;
1911 Entry.IsTransient =
false;
1912 Entry.BufferOverridden =
false;
1913 Entry.IsTopLevel =
true;
1914 Entry.IsModuleMap =
false;
1915 std::unique_ptr<MemoryBuffer> MB;
1916 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1918 MB = std::move(*MBOrErr);
1919 return MB->getMemBufferRef();
1921 return std::nullopt;
1923 SystemFiles.push_back(Entry);
1928 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(UserFiles),
1929 std::move(SystemFiles));
1931 unsigned UserFilesNum = 0;
1933 std::vector<uint64_t> InputFileOffsets;
1934 for (
const auto &Entry : SortedFiles) {
1935 uint32_t &InputFileID = InputFileIDs[Entry.File];
1936 if (InputFileID != 0)
1940 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1942 InputFileID = InputFileOffsets.size();
1944 if (!Entry.IsSystemFile)
1950 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1951 SmallString<128> Name = Entry.File.getName();
1953 PreparePathForOutput(NameAsRequested);
1954 PreparePathForOutput(Name);
1956 if (Name == NameAsRequested)
1959 RecordData::value_type
Record[] = {
1961 InputFileOffsets.size(),
1963 (
uint64_t)getTimestampForOutput(Entry.File),
1964 Entry.BufferOverridden,
1968 NameAsRequested.size()};
1970 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1971 (NameAsRequested + Name).str());
1977 Entry.ContentHash[1]};
1978 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1985 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1987 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1988 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1990 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1991 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
1995 InputFileOffsets.size(), UserFilesNum};
1996 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2006 using namespace llvm;
2008 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2010 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2011 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2012 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2013 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2019 return Stream.EmitAbbrev(std::move(Abbrev));
2025 using namespace llvm;
2027 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2029 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2030 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2031 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2032 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2034 return Stream.EmitAbbrev(std::move(Abbrev));
2041 using namespace llvm;
2043 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2047 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2048 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2049 return Stream.EmitAbbrev(std::move(Abbrev));
2055 using namespace llvm;
2057 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2059 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2060 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2061 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2062 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2065 return Stream.EmitAbbrev(std::move(Abbrev));
2070static std::pair<unsigned, unsigned>
2072 llvm::encodeULEB128(KeyLen, Out);
2073 llvm::encodeULEB128(DataLen, Out);
2074 return std::make_pair(KeyLen, DataLen);
2080 class HeaderFileInfoTrait {
2084 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2091 using key_type_ref =
const key_type &;
2093 using UnresolvedModule =
2094 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2097 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2098 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2100 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2104 bool AlreadyIncluded;
2105 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2108 using data_type_ref =
const data_type &;
2110 using hash_value_type = unsigned;
2111 using offset_type = unsigned;
2117 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2118 memcpy(buf, &key.Size,
sizeof(key.Size));
2119 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2120 return llvm::xxh3_64bits(buf);
2123 std::pair<unsigned, unsigned>
2124 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2125 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2127 for (
auto ModInfo :
Data.KnownHeaders)
2130 if (
Data.Unresolved.getPointer())
2135 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2136 using namespace llvm::support;
2138 endian::Writer
LE(Out, llvm::endianness::little);
2143 Out.write(key.Filename.data(), KeyLen);
2146 void EmitData(raw_ostream &Out, key_type_ref key,
2147 data_type_ref
Data,
unsigned DataLen) {
2148 using namespace llvm::support;
2150 endian::Writer
LE(Out, llvm::endianness::little);
2153 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2154 | (
Data.HFI.isImport << 5)
2156 Data.HFI.isPragmaOnce << 4)
2157 | (
Data.HFI.DirInfo << 1);
2158 LE.write<uint8_t>(Flags);
2160 if (
Data.HFI.LazyControllingMacro.isID())
2169 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2174 for (
auto ModInfo :
Data.KnownHeaders)
2175 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2176 if (
Data.Unresolved.getPointer())
2177 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2179 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2188void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2189 HeaderFileInfoTrait GeneratorTrait(*
this);
2190 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2191 SmallVector<const char *, 4> SavedStrings;
2192 unsigned NumHeaderSearchEntries = 0;
2198 const HeaderFileInfo
Empty;
2199 if (WritingModule) {
2200 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2201 while (!Worklist.empty()) {
2202 Module *M = Worklist.pop_back_val();
2219 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2220 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2221 << WritingModule->getFullModuleName() << U.Size.has_value()
2228 llvm::sys::path::append(Filename, U.FileName);
2229 PreparePathForOutput(Filename);
2231 StringRef FilenameDup = strdup(Filename.c_str());
2232 SavedStrings.push_back(FilenameDup.data());
2234 HeaderFileInfoTrait::key_type Key = {
2235 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2236 HeaderFileInfoTrait::data_type
Data = {
2241 ++NumHeaderSearchEntries;
2244 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2248 SmallVector<OptionalFileEntryRef, 16> FilesByUID;
2254 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2268 StringRef Filename =
File->getName();
2269 SmallString<128> FilenameTmp(Filename);
2270 if (PreparePathForOutput(FilenameTmp)) {
2273 Filename = StringRef(strdup(FilenameTmp.c_str()));
2274 SavedStrings.push_back(Filename.data());
2279 HeaderFileInfoTrait::key_type Key = {
2280 Filename,
File->getSize(), getTimestampForOutput(*
File)
2282 HeaderFileInfoTrait::data_type
Data = {
2286 ++NumHeaderSearchEntries;
2290 SmallString<4096> TableData;
2293 using namespace llvm::support;
2295 llvm::raw_svector_ostream
Out(TableData);
2297 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2298 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2302 using namespace llvm;
2304 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2306 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2307 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2308 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2309 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2310 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2314 NumHeaderSearchEntries, TableData.size()};
2315 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2318 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2319 free(
const_cast<char *
>(SavedStrings[I]));
2322static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2323 unsigned SLocBufferBlobCompressedAbbrv,
2324 unsigned SLocBufferBlobAbbrv) {
2325 using RecordDataType = ASTWriter::RecordData::value_type;
2330 if (llvm::compression::zstd::isAvailable()) {
2331 llvm::compression::zstd::compress(
2332 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2334 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2335 llvm::toStringRef(CompressedBuffer));
2338 if (llvm::compression::zlib::isAvailable()) {
2339 llvm::compression::zlib::compress(
2340 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2342 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2343 llvm::toStringRef(CompressedBuffer));
2348 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2359void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2364 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2370 unsigned SLocBufferBlobCompressedAbbrv =
2376 std::vector<uint32_t> SLocEntryOffsets;
2377 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2383 FileID FID = FileID::get(I);
2387 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2388 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2394 if (
Cache->OrigEntry) {
2407 if (!IsSLocAffecting[I])
2409 SLocEntryOffsets.push_back(Offset);
2412 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2413 Record.push_back(
File.getFileCharacteristic());
2416 bool EmitBlob =
false;
2419 "Writing to AST an overridden file is not supported");
2422 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2425 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2427 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2428 if (FDI != FileDeclIDs.end()) {
2429 Record.push_back(FDI->second->FirstDeclIndex);
2430 Record.push_back(FDI->second->DeclIDs.size());
2436 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2447 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2449 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2450 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2451 StringRef(Name.data(), Name.size() + 1));
2458 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2461 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2462 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2463 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2464 SLocBufferBlobAbbrv);
2468 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2469 SLocEntryOffsets.push_back(Offset);
2484 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2485 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2491 if (SLocEntryOffsets.empty())
2496 using namespace llvm;
2498 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2500 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2501 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2502 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2503 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2504 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2506 RecordData::value_type
Record[] = {
2509 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2510 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2511 bytes(SLocEntryOffsets));
2522 llvm::DenseMap<int, int> FilenameMap;
2523 FilenameMap[-1] = -1;
2524 for (
const auto &L : LineTable) {
2527 for (
auto &LE : L.second) {
2528 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2529 FilenameMap.size() - 1)).second)
2530 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2536 for (
const auto &L : LineTable) {
2541 AddFileID(L.first,
Record);
2544 Record.push_back(L.second.size());
2545 for (
const auto &LE : L.second) {
2548 Record.push_back(FilenameMap[
LE.FilenameID]);
2549 Record.push_back((
unsigned)
LE.FileKind);
2550 Record.push_back(
LE.IncludeOffset);
2565 if (MI->isBuiltinMacro())
2581void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2582 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2586 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2589 RecordData ModuleMacroRecord;
2599 SourceLocation AssumeNonNullLoc =
2601 if (AssumeNonNullLoc.
isValid()) {
2603 AddSourceLocation(AssumeNonNullLoc,
Record);
2613 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2614 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2615 Record.push_back(SkipInfo->FoundNonSkipPortion);
2616 Record.push_back(SkipInfo->FoundElse);
2617 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2633 AddSourceLocation(S,
Record);
2643 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2650 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2653 if (!isWritingStdCXXNamedModules())
2655 if (Id.second->hadMacroDefinition() &&
2656 (!Id.second->isFromAST() ||
2657 Id.second->hasChangedSinceDeserialization()))
2658 MacroIdentifiers.push_back(Id.second);
2661 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2665 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2667 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2668 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2671 bool EmittedModuleMacros =
false;
2679 if (IsModule && WritingModule->isHeaderUnit()) {
2688 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2689 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2690 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2691 Record.push_back(VisMD->isPublic());
2693 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2694 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2696 ModuleMacroRecord.clear();
2697 EmittedModuleMacros =
true;
2707 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2708 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2709 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2710 Record.push_back(VisMD->isPublic());
2716 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2717 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2718 while (!Worklist.empty()) {
2719 auto *
Macro = Worklist.pop_back_val();
2722 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2723 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2724 for (
auto *M :
Macro->overrides())
2725 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2728 ModuleMacroRecord.clear();
2731 for (
auto *M :
Macro->overrides())
2732 if (++Visits[M] == M->getNumOverridingMacros())
2733 Worklist.push_back(M);
2735 EmittedModuleMacros =
true;
2738 if (
Record.empty() && !EmittedModuleMacros)
2741 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2752 std::vector<uint32_t> MacroOffsets;
2754 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2755 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2756 MacroInfo *MI = MacroInfosToEmit[I].MI;
2759 if (ID < FirstMacroID) {
2760 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2765 unsigned Index =
ID - FirstMacroID;
2766 if (Index >= MacroOffsets.size())
2767 MacroOffsets.resize(Index + 1);
2769 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2770 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2771 MacroOffsets[Index] = Offset;
2773 AddIdentifierRef(Name,
Record);
2789 for (
const IdentifierInfo *Param : MI->
params())
2790 AddIdentifierRef(Param,
Record);
2798 Stream.EmitRecord(Code,
Record);
2802 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2817 using namespace llvm;
2819 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2821 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2822 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2823 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2825 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2828 MacroOffsetsBase - ASTBlockStartOffset};
2829 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2833void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2834 uint64_t MacroOffsetsBase) {
2838 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2844 unsigned NumPreprocessingRecords = 0;
2845 using namespace llvm;
2848 unsigned InclusionAbbrev = 0;
2850 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2852 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2853 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2854 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2855 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2856 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2857 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2861 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2863 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2866 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2869 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2870 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2871 SourceRange R = getAdjustedRange((*E)->getSourceRange());
2872 PreprocessedEntityOffsets.emplace_back(
2873 getRawSourceLocationEncoding(R.
getBegin()),
2874 getRawSourceLocationEncoding(R.
getEnd()), Offset);
2876 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2878 MacroDefinitions[MD] = NextPreprocessorEntityID;
2880 AddIdentifierRef(MD->getName(),
Record);
2885 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2886 Record.push_back(ME->isBuiltinMacro());
2887 if (ME->isBuiltinMacro())
2888 AddIdentifierRef(ME->getName(),
Record);
2890 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2895 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2897 Record.push_back(
ID->getFileName().size());
2898 Record.push_back(
ID->wasInQuotes());
2899 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2900 Record.push_back(
ID->importedModule());
2901 SmallString<64> Buffer;
2902 Buffer +=
ID->getFileName();
2906 Buffer +=
ID->getFile()->getName();
2907 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2911 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2916 if (NumPreprocessingRecords > 0) {
2917 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2920 using namespace llvm;
2922 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2924 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2925 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2928 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2929 bytes(PreprocessedEntityOffsets));
2934 if (SkippedRanges.size() > 0) {
2935 std::vector<PPSkippedRange> SerializedSkippedRanges;
2936 SerializedSkippedRanges.reserve(SkippedRanges.size());
2937 for (
auto const& Range : SkippedRanges)
2938 SerializedSkippedRanges.emplace_back(
2939 getRawSourceLocationEncoding(
Range.getBegin()),
2940 getRawSourceLocationEncoding(
Range.getEnd()));
2942 using namespace llvm;
2943 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2945 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2946 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2950 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2951 bytes(SerializedSkippedRanges));
2959 auto Known = SubmoduleIDs.find(Mod);
2960 if (Known != SubmoduleIDs.end())
2961 return Known->second;
2964 if (Top != WritingModule &&
2966 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2969 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2972unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2973 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2985 unsigned ChildModules = 0;
2989 return ChildModules + 1;
2992void ASTWriter::WriteSubmodules(
Module *WritingModule, ASTContext *Context) {
2997 using namespace llvm;
2999 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3001 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3002 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3003 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3004 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3005 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
3006 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3007 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3008 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3009 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3010 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3011 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3012 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3013 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3017 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3019 Abbrev = std::make_shared<BitCodeAbbrev>();
3021 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3022 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3024 Abbrev = std::make_shared<BitCodeAbbrev>();
3026 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3027 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3029 Abbrev = std::make_shared<BitCodeAbbrev>();
3031 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3032 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3034 Abbrev = std::make_shared<BitCodeAbbrev>();
3036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3037 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3039 Abbrev = std::make_shared<BitCodeAbbrev>();
3041 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3042 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3043 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3045 Abbrev = std::make_shared<BitCodeAbbrev>();
3047 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3048 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3050 Abbrev = std::make_shared<BitCodeAbbrev>();
3052 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3053 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3055 Abbrev = std::make_shared<BitCodeAbbrev>();
3057 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3058 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3060 Abbrev = std::make_shared<BitCodeAbbrev>();
3062 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3063 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3065 Abbrev = std::make_shared<BitCodeAbbrev>();
3067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3069 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3071 Abbrev = std::make_shared<BitCodeAbbrev>();
3073 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3074 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3076 Abbrev = std::make_shared<BitCodeAbbrev>();
3078 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3079 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3080 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3082 Abbrev = std::make_shared<BitCodeAbbrev>();
3084 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3085 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3088 RecordData::value_type
Record[] = {
3094 std::queue<Module *> Q;
3095 Q.push(WritingModule);
3096 while (!Q.empty()) {
3099 unsigned ID = getSubmoduleID(Mod);
3103 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3104 ParentID = SubmoduleIDs[Mod->
Parent];
3108 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3111 FileID UnadjustedInferredFID;
3114 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3121 (RecordData::value_type)Mod->
Kind,
3123 (RecordData::value_type)InferredFID,
3134 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3140 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record, R.FeatureName);
3144 if (std::optional<Module::Header> UmbrellaHeader =
3147 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3148 UmbrellaHeader->NameAsWritten);
3149 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3152 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3153 UmbrellaDir->NameAsWritten);
3158 unsigned RecordKind;
3160 Module::HeaderKind HeaderKind;
3166 Module::HK_PrivateTextual},
3169 for (
const auto &HL : HeaderLists) {
3170 RecordData::value_type
Record[] = {HL.RecordKind};
3171 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3172 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3179 SmallString<128> HeaderName(H.getName());
3180 PreparePathForOutput(HeaderName);
3181 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3189 Record.push_back(getSubmoduleID(I));
3197 Record.push_back(getSubmoduleID(I));
3204 for (
const auto &E : Mod->
Exports) {
3207 Record.push_back(getSubmoduleID(E.getPointer()));
3208 Record.push_back(E.getInt());
3223 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3231 getSubmoduleID(
C.Other)};
3232 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3238 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3243 if (Context && !GeneratingReducedBMI) {
3246 if (wasDeclEmitted(D))
3247 AddDeclRef(D, Inits);
3265 assert((NextSubmoduleID - FirstSubmoduleID ==
3267 "Wrong # of submodules; found a reference to a non-local, "
3268 "non-imported submodule?");
3271void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3273 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3275 unsigned CurrID = 0;
3278 auto EncodeDiagStateFlags =
3279 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3280 unsigned Result = (unsigned)DS->ExtBehavior;
3282 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3283 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3284 (unsigned)DS->SuppressSystemWarnings})
3289 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3292 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3293 bool IncludeNonPragmaStates) {
3296 assert(Flags == EncodeDiagStateFlags(State) &&
3297 "diag state flags vary in single AST file");
3301 assert(!IncludeNonPragmaStates ||
3302 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3304 unsigned &DiagStateID = DiagStateIDMap[State];
3305 Record.push_back(DiagStateID);
3307 if (DiagStateID == 0) {
3308 DiagStateID = ++CurrID;
3309 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3312 auto SizeIdx =
Record.size();
3314 for (
const auto &I : *State) {
3316 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3320 if (!I.second.isPragma() &&
3321 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3323 Mappings.push_back(I);
3327 llvm::sort(Mappings, llvm::less_first());
3329 for (
const auto &I : Mappings) {
3330 Record.push_back(I.first);
3331 Record.push_back(I.second.serialize());
3338 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3341 auto NumLocationsIdx =
Record.size();
3345 unsigned NumLocations = 0;
3346 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3347 if (!FileIDAndFile.first.isValid() ||
3348 !FileIDAndFile.second.HasLocalTransitions)
3352 AddFileID(FileIDAndFile.first,
Record);
3354 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3355 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3356 Record.push_back(getAdjustedOffset(StatePoint.Offset));
3357 AddDiagState(StatePoint.State,
false);
3362 Record[NumLocationsIdx] = NumLocations;
3370 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3371 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3381void ASTWriter::WriteType(ASTContext &Context, QualType
T) {
3382 TypeIdx &IdxRef = TypeIdxs[
T];
3384 IdxRef = TypeIdx(0, NextTypeID++);
3385 TypeIdx Idx = IdxRef;
3388 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3392 ASTTypeWriter(Context, *
this).write(
T) - DeclTypesBlockStartOffset;
3396 if (TypeOffsets.size() == Index)
3397 TypeOffsets.emplace_back(Offset);
3398 else if (TypeOffsets.size() < Index) {
3399 TypeOffsets.resize(Index + 1);
3400 TypeOffsets[Index].set(Offset);
3402 llvm_unreachable(
"Types emitted in wrong order");
3411 auto *ND = dyn_cast<NamedDecl>(D);
3426uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3427 const DeclContext *DC) {
3435 uint64_t Offset = Stream.GetCurrentBitNo();
3436 SmallVector<DeclID, 128> KindDeclPairs;
3437 for (
const auto *D : DC->
decls()) {
3438 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3446 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3450 KindDeclPairs.push_back(D->getKind());
3451 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3454 ++NumLexicalDeclContexts;
3456 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3457 bytes(KindDeclPairs));
3461void ASTWriter::WriteTypeDeclOffsets() {
3462 using namespace llvm;
3465 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3467 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3468 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3469 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3472 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3476 Abbrev = std::make_shared<BitCodeAbbrev>();
3478 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3479 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3480 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3483 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3487void ASTWriter::WriteFileDeclIDsMap() {
3488 using namespace llvm;
3490 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3491 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3492 for (
const auto &P : FileDeclIDs)
3493 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3494 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3497 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3498 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3499 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3500 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3501 llvm::stable_sort(Info.DeclIDs);
3502 for (
auto &LocDeclEntry : Info.DeclIDs)
3503 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3506 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3508 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3509 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3510 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3512 FileGroupedDeclIDs.size()};
3513 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3516void ASTWriter::WriteComments(ASTContext &Context) {
3518 auto _ = llvm::make_scope_exit([
this] { Stream.ExitBlock(); });
3525 if (isWritingStdCXXNamedModules())
3529 for (
const auto &FO : Context.
Comments.OrderedComments) {
3530 for (
const auto &OC : FO.second) {
3531 const RawComment *I = OC.second;
3549class ASTMethodPoolTrait {
3553 using key_type = Selector;
3554 using key_type_ref = key_type;
3558 ObjCMethodList Instance, Factory;
3560 using data_type_ref =
const data_type &;
3562 using hash_value_type = unsigned;
3563 using offset_type = unsigned;
3565 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3567 static hash_value_type
ComputeHash(Selector Sel) {
3571 std::pair<unsigned, unsigned>
3572 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3573 data_type_ref Methods) {
3577 unsigned DataLen = 4 + 2 + 2;
3578 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3580 if (ShouldWriteMethodListNode(
Method))
3581 DataLen +=
sizeof(
DeclID);
3582 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3584 if (ShouldWriteMethodListNode(
Method))
3585 DataLen +=
sizeof(
DeclID);
3589 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3590 using namespace llvm::support;
3592 endian::Writer
LE(Out, llvm::endianness::little);
3594 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3597 LE.write<uint16_t>(N);
3600 for (
unsigned I = 0; I != N; ++I)
3605 void EmitData(raw_ostream& Out, key_type_ref,
3606 data_type_ref Methods,
unsigned DataLen) {
3607 using namespace llvm::support;
3609 endian::Writer
LE(Out, llvm::endianness::little);
3612 unsigned NumInstanceMethods = 0;
3613 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3615 if (ShouldWriteMethodListNode(
Method))
3616 ++NumInstanceMethods;
3618 unsigned NumFactoryMethods = 0;
3619 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3621 if (ShouldWriteMethodListNode(
Method))
3622 ++NumFactoryMethods;
3624 unsigned InstanceBits = Methods.Instance.getBits();
3625 assert(InstanceBits < 4);
3626 unsigned InstanceHasMoreThanOneDeclBit =
3627 Methods.Instance.hasMoreThanOneDecl();
3628 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3629 (InstanceHasMoreThanOneDeclBit << 2) |
3631 unsigned FactoryBits = Methods.Factory.getBits();
3632 assert(FactoryBits < 4);
3633 unsigned FactoryHasMoreThanOneDeclBit =
3634 Methods.Factory.hasMoreThanOneDecl();
3635 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3636 (FactoryHasMoreThanOneDeclBit << 2) |
3638 LE.write<uint16_t>(FullInstanceBits);
3639 LE.write<uint16_t>(FullFactoryBits);
3640 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3642 if (ShouldWriteMethodListNode(
Method))
3644 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3646 if (ShouldWriteMethodListNode(
Method))
3649 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3653 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3665void ASTWriter::WriteSelectors(Sema &SemaRef) {
3666 using namespace llvm;
3671 unsigned NumTableEntries = 0;
3674 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3675 ASTMethodPoolTrait Trait(*
this);
3679 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3680 for (
auto &SelectorAndID : SelectorIDs) {
3681 Selector S = SelectorAndID.first;
3683 SemaObjC::GlobalMethodPool::iterator F =
3685 ASTMethodPoolTrait::data_type
Data = {
3691 Data.Instance = F->second.first;
3692 Data.Factory = F->second.second;
3696 if (Chain && ID < FirstSelectorID) {
3698 bool changed =
false;
3699 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3701 if (!M->getMethod()->isFromASTFile()) {
3707 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3709 if (!M->getMethod()->isFromASTFile()) {
3717 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3725 SmallString<4096> MethodPool;
3728 using namespace llvm::support;
3730 ASTMethodPoolTrait Trait(*
this);
3731 llvm::raw_svector_ostream
Out(MethodPool);
3733 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3734 BucketOffset =
Generator.Emit(Out, Trait);
3738 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3740 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3741 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3742 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3743 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3749 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3753 Abbrev = std::make_shared<BitCodeAbbrev>();
3755 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3756 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3757 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3758 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3762 RecordData::value_type
Record[] = {
3765 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3766 bytes(SelectorOffsets));
3772void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3773 using namespace llvm;
3785 Selector Sel = SelectorAndLocation.first;
3786 SourceLocation Loc = SelectorAndLocation.second;
3787 Writer.AddSelectorRef(Sel);
3809 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3811 if (!Redecl->isFromASTFile()) {
3815 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3823 if (Redecl->getOwningModuleID() == 0)
3828 if (!
First->isFromASTFile())
3839bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3840 bool IsModule,
bool IsCPlusPlus) {
3841 bool NeedDecls = !IsModule || !IsCPlusPlus;
3843 bool IsInteresting =
3850 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3858bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3859 ASTWriter &Writer) {
3861 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3862 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3865class ASTIdentifierTableTrait {
3868 IdentifierResolver *IdResolver;
3878 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3883 using key_type =
const IdentifierInfo *;
3884 using key_type_ref = key_type;
3887 using data_type_ref = data_type;
3889 using hash_value_type = unsigned;
3890 using offset_type = unsigned;
3892 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3893 IdentifierResolver *IdResolver,
bool IsModule,
3895 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3896 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3897 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3899 bool needDecls()
const {
return NeedDecls; }
3901 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3902 return llvm::djbHash(II->
getName());
3910 std::pair<unsigned, unsigned>
3911 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3920 if (InterestingIdentifierOffsets &&
3922 InterestingIdentifierOffsets->push_back(
Out.tell());
3933 if (NeedDecls && IdResolver)
3934 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3940 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3944 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3946 using namespace llvm::support;
3948 endian::Writer
LE(Out, llvm::endianness::little);
3958 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
3959 LE.write<uint16_t>(Bits);
3961 bool HasMacroDefinition =
3964 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
3966 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
3969 LE.write<uint16_t>(Bits);
3971 if (HasMacroDefinition)
3974 if (NeedDecls && IdResolver) {
3981 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
3982 for (NamedDecl *D : llvm::reverse(Decls))
4000void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4001 IdentifierResolver *IdResolver,
4003 using namespace llvm;
4005 RecordData InterestingIdents;
4010 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4011 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4012 IsModule ? &InterestingIdents :
nullptr);
4016 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4017 for (
auto IdentIDPair : IdentifierIDs) {
4018 const IdentifierInfo *II = IdentIDPair.first;
4020 assert(II &&
"NULL identifier in identifier table");
4025 (Trait.needDecls() &&
4031 SmallString<4096> IdentifierTable;
4034 using namespace llvm::support;
4036 llvm::raw_svector_ostream
Out(IdentifierTable);
4038 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4039 BucketOffset =
Generator.Emit(Out, Trait);
4043 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4045 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4046 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4047 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4051 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4055 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4057 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4058 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4059 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4062 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4063 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4067 IdentifierOffsets.size()};
4068 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4069 bytes(IdentifierOffsets));
4073 if (!InterestingIdents.empty())
4081 PendingEmittingVTables.push_back(RD);
4085 TouchedModuleFiles.insert(MF);
4094class ASTDeclContextNameLookupTraitBase {
4102 using data_type = std::pair<unsigned, unsigned>;
4103 using data_type_ref =
const data_type &;
4108 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4111 data_type getData(
const DeclIDsTy &LocalIDs) {
4112 unsigned Start = DeclIDs.size();
4113 for (
auto ID : LocalIDs)
4114 DeclIDs.push_back(ID);
4115 return std::make_pair(Start, DeclIDs.size());
4118 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4119 unsigned Start = DeclIDs.size();
4122 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4123 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4124 return std::make_pair(Start, DeclIDs.size());
4127 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4129 "have reference to loaded module file but no chain?");
4131 using namespace llvm::support;
4134 llvm::endianness::little);
4137 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4138 DeclarationNameKey Name,
4139 data_type_ref Lookup) {
4140 unsigned KeyLen = 1;
4163 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4165 return {KeyLen, DataLen};
4168 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4169 using namespace llvm::support;
4171 endian::Writer
LE(Out, llvm::endianness::little);
4186 "Invalid operator?");
4196 llvm_unreachable(
"Invalid name kind?");
4199 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4200 using namespace llvm::support;
4202 endian::Writer
LE(Out, llvm::endianness::little);
4204 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4206 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4210class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4212 using primary_module_hash_type = unsigned;
4214 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4215 using key_type_ref = key_type;
4217 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4218 : ASTDeclContextNameLookupTraitBase(Writer) {}
4220 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4223 llvm::FoldingSetNodeID
ID;
4224 ID.AddInteger(Key.first.getHash());
4225 ID.AddInteger(Key.second);
4226 return ID.computeStableHash();
4229 std::pair<unsigned, unsigned>
4230 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4231 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4232 KeyLen +=
sizeof(Key.second);
4236 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4237 EmitKeyBase(Out, Key.first);
4238 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4239 LE.write<primary_module_hash_type>(Key.second);
4242 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4244 EmitDataBase(Out, Lookup, DataLen);
4248class ASTDeclContextNameTrivialLookupTrait
4249 :
public ASTDeclContextNameLookupTraitBase {
4251 using key_type = DeclarationNameKey;
4252 using key_type_ref = key_type;
4255 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4257 using ASTDeclContextNameLookupTraitBase::getData;
4259 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4261 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4263 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4264 DeclarationNameKey Name,
4265 data_type_ref Lookup) {
4266 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4270 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4271 return EmitKeyBase(Out, Name);
4274 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4276 EmitDataBase(Out, Lookup, DataLen);
4280static bool isModuleLocalDecl(NamedDecl *D) {
4285 return isModuleLocalDecl(Parent);
4289 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4290 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4291 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4307static bool isTULocalInNamedModules(NamedDecl *D) {
4330class ASTDeclContextNameLookupTrait
4331 :
public ASTDeclContextNameTrivialLookupTrait {
4333 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4335 using ModuleLevelDeclsMapTy =
4336 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4339 enum class LookupVisibility {
4349 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4352 return LookupVisibility::GenerallyVisibile;
4354 if (isModuleLocalDecl(D))
4355 return LookupVisibility::ModuleLocalVisible;
4356 if (isTULocalInNamedModules(D))
4357 return LookupVisibility::TULocal;
4369 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4370 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4375 return Found->isInvisibleOutsideTheOwningModule();
4377 return ECD->isFromExplicitGlobalModule() ||
4378 ECD->isInAnonymousNamespace()
4379 ? LookupVisibility::TULocal
4380 : LookupVisibility::ModuleLocalVisible;
4383 return LookupVisibility::GenerallyVisibile;
4387 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4388 TULocalDeclsMapTy TULocalDeclsMap;
4391 using ASTDeclContextNameTrivialLookupTrait::
4392 ASTDeclContextNameTrivialLookupTrait;
4394 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4395 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4397 template <
typename Coll> data_type getData(
const Coll &Decls) {
4398 unsigned Start = DeclIDs.size();
4399 for (NamedDecl *D : Decls) {
4400 NamedDecl *DeclForLocalLookup =
4416 switch (getLookupVisibility(DeclForLocalLookup)) {
4417 case LookupVisibility::ModuleLocalVisible:
4418 if (UnsignedOrNone PrimaryModuleHash =
4420 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4421 auto Iter = ModuleLocalDeclsMap.find(Key);
4422 if (Iter == ModuleLocalDeclsMap.end())
4423 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4425 Iter->second.push_back(ID);
4429 case LookupVisibility::TULocal: {
4430 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4431 if (Iter == TULocalDeclsMap.end())
4434 Iter->second.push_back(ID);
4437 case LookupVisibility::GenerallyVisibile:
4442 DeclIDs.push_back(ID);
4444 return std::make_pair(Start, DeclIDs.size());
4447 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4448 return ModuleLocalDeclsMap;
4451 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4457class LazySpecializationInfoLookupTrait {
4459 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4462 using key_type = unsigned;
4463 using key_type_ref = key_type;
4466 using data_type = std::pair<unsigned, unsigned>;
4467 using data_type_ref =
const data_type &;
4469 using hash_value_type = unsigned;
4470 using offset_type = unsigned;
4472 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4475 template <
typename Col,
typename Col2>
4476 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4477 unsigned Start = Specs.size();
4480 const_cast<NamedDecl *
>(D));
4485 Specs.push_back(Info);
4486 return std::make_pair(Start, Specs.size());
4489 data_type ImportData(
4491 unsigned Start = Specs.size();
4492 for (
auto ID : FromReader)
4493 Specs.push_back(ID);
4494 return std::make_pair(Start, Specs.size());
4497 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4499 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4501 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4503 "have reference to loaded module file but no chain?");
4505 using namespace llvm::support;
4508 llvm::endianness::little);
4511 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4513 data_type_ref Lookup) {
4515 unsigned KeyLen = 4;
4517 (Lookup.second - Lookup.first);
4522 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4523 using namespace llvm::support;
4525 endian::Writer
LE(Out, llvm::endianness::little);
4529 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4531 using namespace llvm::support;
4533 endian::Writer
LE(Out, llvm::endianness::little);
4536 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4537 LE.write<
DeclID>(Specs[I].getRawValue());
4539 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4543unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4544 ArrayRef<TemplateArgument> Args;
4545 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4546 Args = CTSD->getTemplateArgs().asArray();
4547 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4548 Args = VTSD->getTemplateArgs().asArray();
4549 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4550 Args = FD->getTemplateSpecializationArgs()->asArray();
4552 llvm_unreachable(
"New Specialization Kind?");
4558void ASTWriter::GenerateSpecializationInfoLookupTable(
4559 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4560 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4564 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4565 LazySpecializationInfoLookupTrait>
4567 LazySpecializationInfoLookupTrait Trait(*
this);
4569 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4575 auto Iter = SpecializationMaps.find(HashedValue);
4576 if (Iter == SpecializationMaps.end())
4577 Iter = SpecializationMaps
4578 .try_emplace(HashedValue,
4579 llvm::SmallVector<const NamedDecl *, 4>())
4586 Chain ? Chain->getLoadedSpecializationsLookupTables(D, IsPartial)
4589 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4590 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4600 ExisitingSpecs = Lookups->Table.find(HashValue);
4602 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4605 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4608uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4609 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4612 llvm::SmallString<4096> LookupTable;
4613 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4616 uint64_t Offset = Stream.GetCurrentBitNo();
4617 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4619 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4620 : DeclSpecializationsAbbrev,
4632 for (
auto *D : Result.getLookupResult()) {
4634 if (LocalD->isFromASTFile())
4652void ASTWriter::GenerateNameLookupTable(
4653 ASTContext &Context,
const DeclContext *ConstDC,
4654 llvm::SmallVectorImpl<char> &LookupTable,
4655 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4656 llvm::SmallVectorImpl<char> &TULookupTable) {
4657 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4658 !ConstDC->hasLazyExternalLexicalLookups() &&
4659 "must call buildLookups first");
4662 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4666 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4667 ASTDeclContextNameLookupTrait>
4669 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4674 SmallVector<DeclarationName, 16> Names;
4678 bool IncludeConstructorNames =
false;
4679 bool IncludeConversionNames =
false;
4706 if (
Result.getLookupResult().empty())
4709 switch (Name.getNameKind()) {
4711 Names.push_back(Name);
4715 IncludeConstructorNames =
true;
4719 IncludeConversionNames =
true;
4727 if (IncludeConstructorNames || IncludeConversionNames) {
4732 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4734 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4735 auto Name = ChildND->getDeclName();
4736 switch (Name.getNameKind()) {
4741 if (!IncludeConstructorNames)
4746 if (!IncludeConversionNames)
4750 if (AddedNames.insert(Name).second)
4751 Names.push_back(Name);
4759 for (
auto &Name : Names)
4766 SmallVector<NamedDecl *, 8> ConstructorDecls;
4767 SmallVector<NamedDecl *, 8> ConversionDecls;
4771 for (
auto &Name : Names) {
4774 switch (Name.getNameKind()) {
4792 if (!ConstructorDecls.empty())
4793 Generator.insert(ConstructorDecls.front()->getDeclName(),
4794 Trait.getData(ConstructorDecls), Trait);
4795 if (!ConversionDecls.empty())
4796 Generator.insert(ConversionDecls.front()->getDeclName(),
4797 Trait.getData(ConversionDecls), Trait);
4801 auto *Lookups = Chain ? Chain->getLoadedLookupTables(DC) :
nullptr;
4802 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4804 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4805 if (!ModuleLocalDecls.empty()) {
4806 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4807 ModuleLevelNameLookupTrait>
4808 ModuleLocalLookupGenerator;
4809 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4811 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4812 const auto &Key = ModuleLocalIter.first;
4813 const auto &IDs = ModuleLocalIter.second;
4814 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4818 auto *ModuleLocalLookups =
4819 Chain ? Chain->getModuleLocalLookupTables(DC) :
nullptr;
4820 ModuleLocalLookupGenerator.emit(
4821 ModuleLocalLookupTable, ModuleLocalTrait,
4822 ModuleLocalLookups ? &ModuleLocalLookups->Table :
nullptr);
4825 const auto &TULocalDecls = Trait.getTULocalDecls();
4826 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4827 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4828 ASTDeclContextNameTrivialLookupTrait>
4830 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4832 for (
const auto &TULocalIter : TULocalDecls) {
4833 const auto &Key = TULocalIter.first;
4834 const auto &IDs = TULocalIter.second;
4835 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4838 auto *TULocalLookups = Chain ? Chain->getTULocalLookupTables(DC) :
nullptr;
4839 TULookupGenerator.emit(TULookupTable, TULocalTrait,
4840 TULocalLookups ? &TULocalLookups->Table :
nullptr);
4849void ASTWriter::WriteDeclContextVisibleBlock(
4850 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4857 Chain->getKeyDeclaration(
cast<Decl>(DC))->isFromASTFile()) {
4860 Prev = Prev->getPreviousDecl())
4861 if (!Prev->isFromASTFile())
4871 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4874 LookupResults.reserve(Map->size());
4875 for (
auto &Entry : *Map)
4876 LookupResults.push_back(
4877 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4880 llvm::sort(LookupResults, llvm::less_first());
4881 for (
auto &NameAndResult : LookupResults) {
4882 DeclarationName Name = NameAndResult.first;
4889 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4890 "function name in a namespace!");
4894 for (NamedDecl *ND :
Result) {
4898 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
4932 if (!Map || Map->empty())
4937 SmallString<4096> LookupTable;
4938 SmallString<4096> ModuleLocalLookupTable;
4939 SmallString<4096> TULookupTable;
4940 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4945 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
4947 ++NumVisibleDeclContexts;
4949 if (!ModuleLocalLookupTable.empty()) {
4953 RecordData::value_type ModuleLocalRecord[] = {
4955 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
4956 ModuleLocalRecord, ModuleLocalLookupTable);
4957 ++NumModuleLocalDeclContexts;
4960 if (!TULookupTable.empty()) {
4963 RecordData::value_type TULocalDeclsRecord[] = {
4965 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
4967 ++NumTULocalDeclContexts;
4977void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
4978 const DeclContext *DC) {
4980 if (!Map || Map->empty())
4984 SmallString<4096> LookupTable;
4985 SmallString<4096> ModuleLocalLookupTable;
4986 SmallString<4096> TULookupTable;
4987 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4998 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5000 if (!ModuleLocalLookupTable.empty()) {
5002 RecordData::value_type ModuleLocalRecord[] = {
5004 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5005 ModuleLocalLookupTable);
5008 if (!TULookupTable.empty()) {
5009 RecordData::value_type GMFRecord[] = {
5011 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5017void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5023void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5029 for (
const auto &I:Opts.OptMap) {
5030 AddString(I.getKey(),
Record);
5031 auto V = I.getValue();
5032 Record.push_back(
V.Supported ? 1 : 0);
5033 Record.push_back(
V.Enabled ? 1 : 0);
5034 Record.push_back(
V.WithPragma ? 1 : 0);
5041void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5042 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5043 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5048void ASTWriter::WriteObjCCategories() {
5049 if (ObjCClassesWithCategories.empty())
5052 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5053 RecordData Categories;
5055 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5057 unsigned StartIndex = Categories.size();
5059 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5062 Categories.push_back(0);
5066 Cat =
Class->known_categories_begin(),
5067 CatEnd =
Class->known_categories_end();
5068 Cat != CatEnd; ++Cat, ++Size) {
5069 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5070 AddDeclRef(*Cat, Categories);
5074 Categories[StartIndex] =
Size;
5077 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5078 CategoriesMap.push_back(CatInfo);
5083 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5086 using namespace llvm;
5088 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5090 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5091 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5092 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5095 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5096 reinterpret_cast<char *
>(CategoriesMap.data()),
5097 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5103void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5110 for (
auto &LPTMapEntry : LPTMap) {
5111 const FunctionDecl *FD = LPTMapEntry.first;
5112 LateParsedTemplate &LPT = *LPTMapEntry.second;
5118 for (
const auto &
Tok : LPT.
Toks) {
5126void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5129 AddSourceLocation(PragmaLoc,
Record);
5134void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5142void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5150void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5161 AddAlignPackInfo(StackEntry.Value,
Record);
5162 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5163 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5164 AddString(StackEntry.StackSlotLabel,
Record);
5170void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5180 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5181 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5182 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5183 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5184 AddString(StackEntry.StackSlotLabel,
Record);
5190void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5200void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5201 ModuleFileExtensionWriter &Writer) {
5206 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5208 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5209 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5210 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5211 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5212 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5213 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5219 Record.push_back(Metadata.MajorVersion);
5220 Record.push_back(Metadata.MinorVersion);
5221 Record.push_back(Metadata.BlockName.size());
5222 Record.push_back(Metadata.UserInfo.size());
5223 SmallString<64> Buffer;
5224 Buffer += Metadata.BlockName;
5225 Buffer += Metadata.UserInfo;
5226 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5240 auto &Record = *
this;
5246 Writer->isWritingStdCXXHeaderUnit())))
5247 return Record.push_back(0);
5249 Record.push_back(A->
getKind() + 1);
5253 Record.AddSourceRange(A->
getRange());
5257 Record.push_back(A->getAttributeSpellingListIndexRaw());
5260#include "clang/Serialization/AttrPCHWrite.inc"
5266 for (
const auto *A : Attrs)
5277 if (
Tok.isAnnotation()) {
5279 switch (
Tok.getKind()) {
5280 case tok::annot_pragma_loop_hint: {
5284 Record.push_back(Info->Toks.size());
5285 for (
const auto &
T : Info->Toks)
5289 case tok::annot_pragma_pack: {
5292 Record.push_back(
static_cast<unsigned>(Info->Action));
5298 case tok::annot_pragma_openmp:
5299 case tok::annot_pragma_openmp_end:
5300 case tok::annot_pragma_unused:
5301 case tok::annot_pragma_openacc:
5302 case tok::annot_pragma_openacc_end:
5303 case tok::annot_repl_input_end:
5306 llvm_unreachable(
"missing serialization code for annotation token");
5317 Record.push_back(Str.size());
5318 llvm::append_range(
Record, Str);
5323 Record.push_back(Str.size());
5324 llvm::append_range(Blob, Str);
5328 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5331 StringRef PathStr(Path.data(), Path.size());
5332 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5338 const char *PathBegin = Path.data();
5339 const char *PathPtr =
5341 if (PathPtr != PathBegin) {
5342 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5366 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5371 Record.push_back(Version.getMajor());
5372 if (std::optional<unsigned> Minor = Version.getMinor())
5373 Record.push_back(*Minor + 1);
5376 if (std::optional<unsigned> Subminor = Version.getSubminor())
5377 Record.push_back(*Subminor + 1);
5395 assert(ID < IdentifierOffsets.size());
5396 IdentifierOffsets[ID] = Offset;
5402 unsigned ID = SelectorIDs[Sel];
5403 assert(ID &&
"Unknown selector");
5406 if (ID < FirstSelectorID)
5408 SelectorOffsets[ID - FirstSelectorID] = Offset;
5414 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5415 bool IncludeTimestamps,
bool BuildingImplicitModule,
5416 bool GeneratingReducedBMI)
5417 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5418 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5419 BuildingImplicitModule(BuildingImplicitModule),
5420 GeneratingReducedBMI(GeneratingReducedBMI) {
5421 for (
const auto &Ext : Extensions) {
5422 if (
auto Writer = Ext->createExtensionWriter(*
this))
5423 ModuleFileExtensionWriters.push_back(std::move(Writer));
5430 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5431 return PP->getLangOpts();
5440 StringRef OutputFile,
Module *WritingModule,
5441 StringRef isysroot,
bool ShouldCacheASTInMemory) {
5442 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5445 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5452 Stream.Emit((
unsigned)
'C', 8);
5453 Stream.Emit((
unsigned)
'P', 8);
5454 Stream.Emit((
unsigned)
'C', 8);
5455 Stream.Emit((
unsigned)
'H', 8);
5457 WriteBlockInfoBlock();
5460 this->WritingModule = WritingModule;
5461 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5463 this->WritingModule =
nullptr;
5464 this->BaseDirectory.clear();
5468 if (ShouldCacheASTInMemory) {
5470 ModCache.getInMemoryModuleCache().addBuiltPCM(
5471 OutputFile, llvm::MemoryBuffer::getMemBufferCopy(
5472 StringRef(Buffer.begin(), Buffer.size())));
5477template<
typename Vector>
5479 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5485template <
typename Vector>
5488 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5494void ASTWriter::computeNonAffectingInputFiles() {
5495 SourceManager &SrcMgr = PP->getSourceManager();
5498 IsSLocAffecting.resize(N,
true);
5499 IsSLocFileEntryAffecting.resize(N,
true);
5504 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5506 unsigned FileIDAdjustment = 0;
5507 unsigned OffsetAdjustment = 0;
5509 NonAffectingFileIDAdjustments.reserve(N);
5510 NonAffectingOffsetAdjustments.reserve(N);
5512 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5513 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5515 for (
unsigned I = 1; I != N; ++I) {
5517 FileID FID = FileID::get(I);
5524 if (!
Cache->OrigEntry)
5532 if (!AffectingModuleMaps)
5536 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5539 IsSLocAffecting[I] =
false;
5540 IsSLocFileEntryAffecting[I] =
5541 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5543 FileIDAdjustment += 1;
5549 if (!NonAffectingFileIDs.empty() &&
5550 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5551 NonAffectingFileIDs.back() = FID;
5553 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5554 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5558 NonAffectingFileIDs.push_back(FID);
5561 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5562 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5565 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5568 FileManager &FileMgr = PP->getFileManager();
5571 for (StringRef Path :
5572 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5574 for (
unsigned I = 1; I != N; ++I) {
5575 if (IsSLocAffecting[I]) {
5581 if (!
Cache->OrigEntry)
5584 Cache->OrigEntry->getNameAsRequested());
5590void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5591 ASTContext &Context = SemaRef.
Context;
5593 bool isModule = WritingModule !=
nullptr;
5600 PredefinedDecls.insert(D);
5608 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5612 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5616 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5623 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5625 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5627#define BuiltinTemplate(BTName) \
5628 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5629#include "clang/Basic/BuiltinTemplates.inc"
5641 if (GeneratingReducedBMI) {
5667 if (GeneratingReducedBMI)
5689 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5700 "There are local ones at end of translation unit!");
5713 for (
const auto &I : SemaRef.KnownNamespaces)
5718 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5726 for (
const auto &DeleteExprsInfo :
5733 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5735 DeclsToEmitEvenIfUnreferenced.clear();
5740 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5742 const IdentifierInfo *II =
ID.second;
5748 llvm::sort(IIs, llvm::deref<std::less<>>());
5750 for (
const IdentifierInfo *II : IIs)
5761 for (CXXRecordDecl *RD : PendingEmittingVTables)
5764 PendingEmittingVTables.clear();
5767void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5768 ASTContext &Context = SemaRef.
Context;
5770 bool isModule = WritingModule !=
nullptr;
5773 if (!EagerlyDeserializedDecls.empty())
5776 if (!ModularCodegenDecls.empty())
5782 TentativeDefinitions);
5783 if (!TentativeDefinitions.empty())
5790 UnusedFileScopedDecls);
5791 if (!UnusedFileScopedDecls.empty())
5797 if (!ExtVectorDecls.empty())
5803 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5804 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5819 if (!UnusedLocalTypedefNameCandidates.empty())
5821 UnusedLocalTypedefNameCandidates);
5823 if (!GeneratingReducedBMI) {
5833 if (!PendingInstantiations.empty())
5840 auto AddEmittedDeclRefOrZero = [
this, &SemaDeclRefs](
Decl *D) {
5842 SemaDeclRefs.push_back(0);
5851 if (!SemaDeclRefs.empty())
5859 if (!DeclsToCheckForDeferredDiags.empty())
5861 DeclsToCheckForDeferredDiags);
5867 AddDeclRef(CudaCallDecl, CUDASpecialDeclRefs);
5875 DelegatingCtorDecls);
5876 if (!DelegatingCtorDecls.empty())
5881 for (
const auto &I : SemaRef.KnownNamespaces) {
5885 if (!KnownNamespaces.empty())
5890 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5899 if (!UndefinedButUsed.empty())
5906 for (
const auto &DeleteExprsInfo :
5911 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
5912 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
5913 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
5915 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
5919 if (!DeleteExprsToAnalyze.empty())
5923 for (CXXRecordDecl *RD : PendingEmittingVTables) {
5930 if (!VTablesToEmit.empty())
5936 using namespace llvm;
5938 bool isModule = WritingModule !=
nullptr;
5942 Chain->finalizeForWriting();
5946 computeNonAffectingInputFiles();
5948 writeUnhashedControlBlock(*PP);
5961 IdentifierIDs.clear();
5972 SmallVector<const IdentifierInfo *, 128> IIs;
5973 for (
const auto &ID : PP->getIdentifierTable())
5974 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
5975 IIs.push_back(
ID.second);
5978 llvm::sort(IIs, llvm::deref<std::less<>>());
5979 for (
const IdentifierInfo *II : IIs)
5987 for (
const auto &WeakUndeclaredIdentifierList :
5989 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
5990 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6001 ASTContext &Context = SemaPtr->
Context;
6006 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6007 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6008 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6013 PrepareWritingSpecialDecls(*SemaPtr);
6016 WriteControlBlock(*PP, isysroot);
6019 Stream.FlushToWord();
6020 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6022 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6039 llvm::SmallVector<Selector, 256> AllSelectors;
6040 for (
auto &SelectorAndID : SelectorIDs)
6041 AllSelectors.push_back(SelectorAndID.first);
6042 for (
auto &Selector : AllSelectors)
6066 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6069 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6070 SmallString<2048> Buffer;
6072 llvm::raw_svector_ostream
Out(Buffer);
6073 for (ModuleFile &M : Chain->ModuleMgr) {
6074 using namespace llvm::support;
6076 endian::Writer
LE(Out, llvm::endianness::little);
6077 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6079 LE.write<uint16_t>(Name.size());
6080 Out.write(Name.data(), Name.size());
6086 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6087 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6101 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6102 Buffer.data(), Buffer.size());
6106 WriteDeclAndTypes(SemaPtr->
Context);
6108 WriteFileDeclIDsMap();
6109 WriteSourceManagerBlock(PP->getSourceManager());
6111 WriteComments(SemaPtr->
Context);
6112 WritePreprocessor(*PP, isModule);
6113 WriteHeaderSearch(PP->getHeaderSearchInfo());
6115 WriteSelectors(*SemaPtr);
6116 WriteReferencedSelectorsPool(*SemaPtr);
6117 WriteLateParsedTemplates(*SemaPtr);
6119 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6122 WriteOpenCLExtensions(*SemaPtr);
6123 WriteCUDAPragmas(*SemaPtr);
6128 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6133 WriteSpecialDeclRecords(*SemaPtr);
6136 if (!WeakUndeclaredIdentifiers.empty())
6138 WeakUndeclaredIdentifiers);
6140 if (!WritingModule) {
6145 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6147 llvm::SmallVector<ModuleInfo, 64> Imports;
6150 assert(SubmoduleIDs.contains(I->getImportedModule()));
6151 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6152 I->getImportedModule()));
6156 if (!Imports.empty()) {
6157 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6160 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6161 return A.ID == B.ID;
6165 llvm::sort(Imports, Cmp);
6166 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6169 for (
const auto &Import : Imports) {
6170 ImportedModules.push_back(
Import.ID);
6181 WriteObjCCategories();
6183 if (!WritingModule) {
6184 WriteOptimizePragmaOptions(*SemaPtr);
6185 WriteMSStructPragmaOptions(*SemaPtr);
6186 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6188 WritePackPragmaOptions(*SemaPtr);
6189 WriteFloatControlPragmaOptions(*SemaPtr);
6190 WriteDeclsWithEffectsToVerify(*SemaPtr);
6194 RecordData::value_type
Record[] = {NumStatements,
6196 NumLexicalDeclContexts,
6197 NumVisibleDeclContexts,
6198 NumModuleLocalDeclContexts,
6199 NumTULocalDeclContexts};
6202 Stream.FlushToWord();
6203 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6207 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6208 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6210 return backpatchSignature();
6216 if (GeneratingReducedBMI)
6217 DeclUpdatesFromGMF.swap(DeclUpdates);
6223void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6227 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6229void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6233 DeclUpdates[D].push_back(
6234 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6243 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6246 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6250void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6255 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6259 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6260 while (!DeclTypesToEmit.empty()) {
6261 DeclOrType DOT = DeclTypesToEmit.front();
6262 DeclTypesToEmit.pop();
6264 WriteType(Context, DOT.getType());
6266 WriteDecl(Context, DOT.getDecl());
6268 }
while (!DeclUpdates.empty());
6270 DoneWritingDeclsAndTypes =
true;
6274 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6276 for (NamespaceDecl *NS : DelayedNamespace) {
6277 LookupBlockOffsets Offsets;
6279 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6280 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6301 assert(DeclTypesToEmit.empty());
6302 assert(DeclUpdates.empty());
6307 WriteTypeDeclOffsets();
6308 if (!DeclUpdatesOffsetsRecord.empty())
6311 if (!DelayedNamespaceRecord.empty())
6313 DelayedNamespaceRecord);
6315 if (!RelatedDeclsMap.empty()) {
6319 for (
const auto &Pair : RelatedDeclsMap) {
6320 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6321 RelatedDeclsMapRecord.push_back(Pair.second.size());
6322 for (
const auto &Lambda : Pair.second)
6323 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6326 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6328 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6329 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6330 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6332 FunctionToLambdaMapAbbrev);
6335 if (!SpecializationsUpdates.empty()) {
6336 WriteSpecializationsUpdates(
false);
6337 SpecializationsUpdates.clear();
6340 if (!PartialSpecializationsUpdates.empty()) {
6341 WriteSpecializationsUpdates(
true);
6342 PartialSpecializationsUpdates.clear();
6348 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6357 NewGlobalKindDeclPairs.push_back(D->
getKind());
6358 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6361 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6363 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6364 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6367 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6368 bytes(NewGlobalKindDeclPairs));
6370 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6372 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6373 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6374 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6376 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6378 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6379 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6380 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6382 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6384 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6385 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6386 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6389 WriteDeclContextVisibleUpdate(Context, TU);
6392 if (Context.ExternCContext)
6393 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6396 for (
auto *DC : UpdatedDeclContexts)
6397 WriteDeclContextVisibleUpdate(Context, DC);
6400void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6404 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6405 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6406 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6407 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6408 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6411 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6412 for (
auto &SpecializationUpdate : SpecUpdates) {
6413 const NamedDecl *D = SpecializationUpdate.first;
6415 llvm::SmallString<4096> LookupTable;
6416 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6417 LookupTable, IsPartial);
6420 RecordData::value_type
Record[] = {
6421 static_cast<RecordData::value_type
>(RecordType),
6423 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6427void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6428 RecordDataImpl &OffsetsRecord) {
6429 if (DeclUpdates.empty())
6432 DeclUpdateMap LocalUpdates;
6433 LocalUpdates.swap(DeclUpdates);
6435 for (
auto &DeclUpdate : LocalUpdates) {
6436 const Decl *D = DeclUpdate.first;
6438 bool HasUpdatedBody =
false;
6439 bool HasAddedVarDefinition =
false;
6442 for (
auto &
Update : DeclUpdate.second) {
6447 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6448 HasUpdatedBody =
true;
6449 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6450 HasAddedVarDefinition =
true;
6452 Record.push_back(llvm::to_underlying(Kind));
6455 case DeclUpdateKind::CXXAddedImplicitMember:
6456 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6457 assert(
Update.getDecl() &&
"no decl to add?");
6460 case DeclUpdateKind::CXXAddedFunctionDefinition:
6461 case DeclUpdateKind::CXXAddedVarDefinition:
6464 case DeclUpdateKind::CXXPointOfInstantiation:
6469 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6474 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6479 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6481 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6482 Record.push_back(RD->isParamDestroyedInCallee());
6483 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6484 Record.AddCXXDefinitionData(RD);
6485 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6490 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6491 Record.push_back(MSInfo->getTemplateSpecializationKind());
6492 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6495 Record.push_back(Spec->getTemplateSpecializationKind());
6496 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6500 auto From = Spec->getInstantiatedFrom();
6501 if (
auto PartialSpec =
6502 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6504 Record.AddDeclRef(PartialSpec);
6505 Record.AddTemplateArgumentList(
6506 &Spec->getTemplateInstantiationArgs());
6511 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6512 Record.AddSourceLocation(RD->getLocation());
6513 Record.AddSourceLocation(RD->getBeginLoc());
6514 Record.AddSourceRange(RD->getBraceRange());
6525 case DeclUpdateKind::CXXResolvedDtorDelete:
6530 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6534 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6538 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6542 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6545 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6549 case DeclUpdateKind::CXXDeducedReturnType:
6553 case DeclUpdateKind::DeclMarkedUsed:
6556 case DeclUpdateKind::ManglingNumber:
6557 case DeclUpdateKind::StaticLocalNumber:
6561 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6563 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6566 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6567 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6568 Record.push_back(A->getAllocatorType());
6569 Record.AddStmt(A->getAllocator());
6570 Record.AddStmt(A->getAlignment());
6571 Record.AddSourceRange(A->getRange());
6575 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6576 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6578 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6581 case DeclUpdateKind::DeclExported:
6585 case DeclUpdateKind::AddedAttrToRecord:
6586 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6594 if (HasUpdatedBody) {
6597 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6598 Record.push_back(Def->isInlined());
6599 Record.AddSourceLocation(Def->getInnerLocStart());
6600 Record.AddFunctionDefinition(Def);
6601 }
else if (HasAddedVarDefinition) {
6604 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6605 Record.push_back(VD->isInline());
6606 Record.push_back(VD->isInlineSpecified());
6607 Record.AddVarDeclInit(VD);
6624 NonAffectingFileIDs.empty())
6626 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6627 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6628 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6629 return FileID::get(FID.getOpaqueValue() - Offset);
6632unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6638 unsigned AdjustedNumCreatedFIDs = 0;
6639 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6640 if (IsSLocAffecting[I])
6641 ++AdjustedNumCreatedFIDs;
6642 return AdjustedNumCreatedFIDs;
6652 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6653 getAdjustedLocation(
Range.getEnd()));
6658 return Offset - getAdjustment(Offset);
6663 if (NonAffectingRanges.empty())
6666 if (PP->getSourceManager().isLoadedOffset(Offset))
6669 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6670 return NonAffectingOffsetAdjustments.back();
6672 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6676 return Range.getEnd().getOffset() < Offset;
6679 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6680 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6681 return NonAffectingOffsetAdjustments[Idx];
6685 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6691 unsigned ModuleFileIndex = 0;
6694 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6697 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6698 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6699 "Corrupted global sloc offset map");
6704 ModuleFileIndex = F->
Index + 1;
6712 Loc = getAdjustedLocation(Loc);
6749 MacroInfoToEmitData Info = { Name, MI, ID };
6750 MacroInfosToEmit.push_back(Info);
6756 return IdentMacroDirectivesOffsetMap.lookup(Name);
6760 Record->push_back(Writer->getSelectorRef(SelRef));
6769 if (SID == 0 && Chain) {
6772 Chain->LoadSelector(Sel);
6773 SID = SelectorIDs[Sel];
6776 SID = NextSelectorID++;
6777 SelectorIDs[Sel] = SID;
6819 bool InfoHasSameExpr
6821 Record->push_back(InfoHasSameExpr);
6822 if (InfoHasSameExpr)
6839 TypeLocWriter TLW(*
this);
6849template <
typename IdxForTypeTy>
6851 IdxForTypeTy IdxForType) {
6855 unsigned FastQuals =
T.getLocalFastQualifiers();
6856 T.removeLocalFastQualifiers();
6858 if (
T.hasLocalNonFastQualifiers())
6859 return IdxForType(
T).asTypeID(FastQuals);
6861 assert(!
T.hasLocalQualifiers());
6863 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr()))
6866 if (
T == Context.AutoDeductTy)
6868 if (
T == Context.AutoRRefDeductTy)
6871 return IdxForType(
T).asTypeID(FastQuals);
6878 assert(!
T.getLocalFastQualifiers());
6882 if (DoneWritingDeclsAndTypes) {
6883 assert(0 &&
"New type seen after serializing all the types to emit!");
6889 Idx =
TypeIdx(0, NextTypeID++);
6890 DeclTypesToEmit.push(
T);
6907 Record.push_back(MacroRef >> 32);
6908 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
6923 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
6930 if (
auto *Iter = DeclUpdatesFromGMF.find(D);
6931 Iter != DeclUpdatesFromGMF.end()) {
6932 for (DeclUpdate &
Update : Iter->second)
6933 DeclUpdates[D].push_back(
Update);
6934 DeclUpdatesFromGMF.erase(Iter);
6946 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
6948 if (ID.isInvalid()) {
6949 if (DoneWritingDeclsAndTypes) {
6950 assert(0 &&
"New decl seen after serializing all the decls to emit!");
6957 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
6972 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
6979 assert(DoneWritingDeclsAndTypes &&
6980 "wasDeclEmitted should only be called after writing declarations");
6985 bool Emitted = DeclIDs.contains(D);
6987 GeneratingReducedBMI) &&
6988 "The declaration within modules can only be omitted in reduced BMI.");
6993 assert(ID.isValid());
7012 assert(
SM.isLocalSourceLocation(FileLoc));
7013 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7016 assert(
SM.getSLocEntry(FID).isFile());
7017 assert(IsSLocAffecting[FID.ID]);
7019 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7021 Info = std::make_unique<DeclIDInFileInfo>();
7023 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7024 LocDeclIDsTy &Decls = Info->DeclIDs;
7025 Decls.push_back(LocDecl);
7030 "expected an anonymous declaration");
7034 auto It = AnonymousDeclarationNumbers.find(D);
7035 if (It == AnonymousDeclarationNumbers.end()) {
7038 AnonymousDeclarationNumbers[ND] = Number;
7041 It = AnonymousDeclarationNumbers.find(D);
7042 assert(It != AnonymousDeclarationNumbers.end() &&
7043 "declaration not found within its lexical context");
7098 while (QualifierLoc) {
7099 NestedNames.push_back(QualifierLoc);
7103 Record->push_back(NestedNames.size());
7104 while(!NestedNames.empty()) {
7105 QualifierLoc = NestedNames.pop_back_val();
7108 Record->push_back(llvm::to_underlying(Kind));
7111 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7133 llvm_unreachable(
"unexpected null nested name specifier");
7140 assert(TemplateParams &&
"No TemplateParams!");
7145 Record->push_back(TemplateParams->
size());
7146 for (
const auto &P : *TemplateParams)
7149 Record->push_back(
true);
7152 Record->push_back(
false);
7159 assert(TemplateArgs &&
"No TemplateArgs!");
7160 Record->push_back(TemplateArgs->
size());
7161 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7167 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7177 Record->push_back(
Set.size());
7179 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7181 Record->push_back(I.getAccess());
7187 Record->push_back(
Base.isVirtual());
7188 Record->push_back(
Base.isBaseOfClass());
7189 Record->push_back(
Base.getAccessSpecifierAsWritten());
7190 Record->push_back(
Base.getInheritConstructors());
7203 for (
auto &
Base : Bases)
7221 for (
auto *
Init : CtorInits) {
7222 if (
Init->isBaseInitializer()) {
7226 }
else if (
Init->isDelegatingInitializer()) {
7229 }
else if (
Init->isMemberInitializer()){
7242 if (
Init->isWritten())
7256 auto &
Data = D->data();
7258 Record->push_back(
Data.IsLambda);
7262#define FIELD(Name, Width, Merge) \
7263 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7264 Record->push_back(DefinitionBits); \
7265 DefinitionBits.reset(0); \
7267 DefinitionBits.addBits(Data.Name, Width);
7269#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7272 Record->push_back(DefinitionBits);
7278 bool ModulesCodegen =
7283 Record->push_back(ModulesCodegen);
7285 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7290 Record->push_back(
Data.ComputedVisibleConversions);
7291 if (
Data.ComputedVisibleConversions)
7295 if (!
Data.IsLambda) {
7296 Record->push_back(
Data.NumBases);
7297 if (
Data.NumBases > 0)
7301 Record->push_back(
Data.NumVBases);
7302 if (
Data.NumVBases > 0)
7307 auto &Lambda = D->getLambdaData();
7310 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7311 LambdaBits.
addBit(Lambda.IsGenericLambda);
7312 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7313 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7314 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7315 Record->push_back(LambdaBits);
7317 Record->push_back(Lambda.NumExplicitCaptures);
7318 Record->push_back(Lambda.ManglingNumber);
7323 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7330 Record->push_back(CaptureBits);
7332 switch (
Capture.getCaptureKind()) {
7362 assert(ES->CheckedForSideEffects);
7363 Val |= (ES->HasConstantInitialization ? 2 : 0);
7364 Val |= (ES->HasConstantDestruction ? 4 : 0);
7378void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7379 assert(Reader &&
"Cannot remove chain");
7380 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7381 assert(FirstDeclID == NextDeclID &&
7382 FirstTypeID == NextTypeID &&
7383 FirstIdentID == NextIdentID &&
7384 FirstMacroID == NextMacroID &&
7385 FirstSubmoduleID == NextSubmoduleID &&
7386 FirstSelectorID == NextSelectorID &&
7387 "Setting chain after writing has started.");
7393 NextSelectorID = FirstSelectorID;
7394 NextSubmoduleID = FirstSubmoduleID;
7404 unsigned OriginalModuleFileIndex = StoredID >> 32;
7408 if (OriginalModuleFileIndex == 0 && StoredID)
7419 MacroID &StoredID = MacroIDs[MI];
7420 unsigned OriginalModuleFileIndex = StoredID >> 32;
7423 if (OriginalModuleFileIndex == 0 && StoredID)
7432void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7444 TypeIdx &StoredIdx = TypeIdxs[
T];
7450 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7461 DeclIDs[D] = LocalDeclID(ID);
7462 PredefinedDecls.insert(D);
7474 assert(!MacroDefinitions.contains(MD));
7475 MacroDefinitions[MD] =
ID;
7479 assert(!SubmoduleIDs.contains(Mod));
7480 SubmoduleIDs[Mod] =
ID;
7483void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7484 if (Chain && Chain->isProcessingUpdateRecords())
return;
7486 assert(!WritingAST &&
"Already writing the AST!");
7487 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7489 if (RD->isFromASTFile()) {
7494 "completed a tag from another module but not by instantiation?");
7495 DeclUpdates[RD].push_back(
7496 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7510void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7511 if (Chain && Chain->isProcessingUpdateRecords())
return;
7513 "Should not add lookup results to non-lookup contexts!");
7534 assert(!WritingAST &&
"Already writing the AST!");
7535 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7539 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7541 DeclsToEmitEvenIfUnreferenced.push_back(D);
7545 if (Chain && Chain->isProcessingUpdateRecords())
return;
7558 assert(!WritingAST &&
"Already writing the AST!");
7559 DeclUpdates[RD].push_back(
7560 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7563void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7564 if (Chain && Chain->isProcessingUpdateRecords())
return;
7565 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7567 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7572 ->castAs<FunctionProtoType>()
7573 ->getExceptionSpecType()))
7574 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7579 if (Chain && Chain->isProcessingUpdateRecords())
return;
7580 assert(!WritingAST &&
"Already writing the AST!");
7582 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7583 DeclUpdates[D].push_back(
7584 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7591 if (Chain && Chain->isProcessingUpdateRecords())
return;
7592 assert(!WritingAST &&
"Already writing the AST!");
7593 assert(
Delete &&
"Not given an operator delete");
7595 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7596 DeclUpdates[D].push_back(
7597 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7603 if (Chain && Chain->isProcessingUpdateRecords())
7605 assert(!WritingAST &&
"Already writing the AST!");
7606 assert(GlobDelete &&
"Not given an operator delete");
7609 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7610 DeclUpdates[D].push_back(
7611 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7617 if (Chain && Chain->isProcessingUpdateRecords())
7619 assert(!WritingAST &&
"Already writing the AST!");
7620 assert(ArrayDelete &&
"Not given an operator delete");
7623 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7624 DeclUpdates[D].push_back(
7625 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7629void ASTWriter::ResolvedOperatorGlobArrayDelete(
7631 if (Chain && Chain->isProcessingUpdateRecords())
7633 assert(!WritingAST &&
"Already writing the AST!");
7634 assert(GlobArrayDelete &&
"Not given an operator delete");
7637 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7638 DeclUpdates[D].push_back(DeclUpdate(
7639 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7643void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7644 if (Chain && Chain->isProcessingUpdateRecords())
return;
7645 assert(!WritingAST &&
"Already writing the AST!");
7654 DeclUpdates[D].push_back(
7655 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7658void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7659 if (Chain && Chain->isProcessingUpdateRecords())
return;
7660 assert(!WritingAST &&
"Already writing the AST!");
7664 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7667void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7668 if (Chain && Chain->isProcessingUpdateRecords())
return;
7669 assert(!WritingAST &&
"Already writing the AST!");
7677 DeclUpdates[D].push_back(
7678 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7681void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7682 if (Chain && Chain->isProcessingUpdateRecords())
return;
7683 assert(!WritingAST &&
"Already writing the AST!");
7690 if (
auto *VD = dyn_cast<VarDecl>(D))
7691 POI = VD->getPointOfInstantiation();
7694 DeclUpdates[D].push_back(
7695 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7698void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7699 if (Chain && Chain->isProcessingUpdateRecords())
return;
7700 assert(!WritingAST &&
"Already writing the AST!");
7704 DeclUpdates[D].push_back(
7705 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7708void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7709 assert(!WritingAST &&
"Already writing the AST!");
7713 DeclUpdates[D].push_back(
7714 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7719 if (Chain && Chain->isProcessingUpdateRecords())
return;
7720 assert(!WritingAST &&
"Already writing the AST!");
7724 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7725 ObjCClassesWithCategories.insert(
7729void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7730 if (Chain && Chain->isProcessingUpdateRecords())
return;
7731 assert(!WritingAST &&
"Already writing the AST!");
7740 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7743void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7744 if (Chain && Chain->isProcessingUpdateRecords())
return;
7745 assert(!WritingAST &&
"Already writing the AST!");
7749 DeclUpdates[D].push_back(
7750 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7753void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7754 if (Chain && Chain->isProcessingUpdateRecords())
return;
7755 assert(!WritingAST &&
"Already writing the AST!");
7759 DeclUpdates[D].push_back(
7760 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7763void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7765 if (Chain && Chain->isProcessingUpdateRecords())
return;
7766 assert(!WritingAST &&
"Already writing the AST!");
7770 DeclUpdates[D].push_back(
7771 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7774void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7775 if (Chain && Chain->isProcessingUpdateRecords())
return;
7776 assert(!WritingAST &&
"Already writing the AST!");
7778 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7781void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7783 if (Chain && Chain->isProcessingUpdateRecords())
return;
7784 assert(!WritingAST &&
"Already writing the AST!");
7785 if (!
Record->isFromASTFile())
7787 DeclUpdates[
Record].push_back(
7788 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7791void ASTWriter::AddedCXXTemplateSpecialization(
7793 assert(!WritingAST &&
"Already writing the AST!");
7797 if (Chain && Chain->isProcessingUpdateRecords())
7800 DeclsToEmitEvenIfUnreferenced.push_back(D);
7803void ASTWriter::AddedCXXTemplateSpecialization(
7805 assert(!WritingAST &&
"Already writing the AST!");
7809 if (Chain && Chain->isProcessingUpdateRecords())
7812 DeclsToEmitEvenIfUnreferenced.push_back(D);
7817 assert(!WritingAST &&
"Already writing the AST!");
7821 if (Chain && Chain->isProcessingUpdateRecords())
7824 DeclsToEmitEvenIfUnreferenced.push_back(D);
7838#define GEN_CLANG_CLAUSE_CLASS
7839#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
7840#include "llvm/Frontend/OpenMP/OMP.inc"
7849 OMPClauseWriter(*this).writeClause(
C);
7852void OMPClauseWriter::writeClause(
OMPClause *
C) {
7853 Record.push_back(
unsigned(
C->getClauseKind()));
7855 Record.AddSourceLocation(
C->getBeginLoc());
7856 Record.AddSourceLocation(
C->getEndLoc());
7860 Record.push_back(uint64_t(
C->getCaptureRegion()));
7861 Record.AddStmt(
C->getPreInitStmt());
7865 VisitOMPClauseWithPreInit(
C);
7866 Record.AddStmt(
C->getPostUpdateExpr());
7869void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
7870 VisitOMPClauseWithPreInit(
C);
7872 Record.AddSourceLocation(
C->getNameModifierLoc());
7873 Record.AddSourceLocation(
C->getColonLoc());
7874 Record.AddStmt(
C->getCondition());
7875 Record.AddSourceLocation(
C->getLParenLoc());
7879 VisitOMPClauseWithPreInit(
C);
7880 Record.AddStmt(
C->getCondition());
7881 Record.AddSourceLocation(
C->getLParenLoc());
7885 VisitOMPClauseWithPreInit(
C);
7886 Record.writeEnum(
C->getModifier());
7887 Record.AddStmt(
C->getNumThreads());
7888 Record.AddSourceLocation(
C->getModifierLoc());
7889 Record.AddSourceLocation(
C->getLParenLoc());
7893 Record.AddStmt(
C->getSafelen());
7894 Record.AddSourceLocation(
C->getLParenLoc());
7898 Record.AddStmt(
C->getSimdlen());
7899 Record.AddSourceLocation(
C->getLParenLoc());
7903 Record.push_back(
C->getNumSizes());
7904 for (
Expr *Size :
C->getSizesRefs())
7906 Record.AddSourceLocation(
C->getLParenLoc());
7910 Record.push_back(
C->getNumLoops());
7911 for (
Expr *Size :
C->getArgsRefs())
7913 Record.AddSourceLocation(
C->getLParenLoc());
7919 Record.AddStmt(
C->getFactor());
7920 Record.AddSourceLocation(
C->getLParenLoc());
7924 Record.AddStmt(
C->getFirst());
7925 Record.AddStmt(
C->getCount());
7926 Record.AddSourceLocation(
C->getLParenLoc());
7927 Record.AddSourceLocation(
C->getFirstLoc());
7928 Record.AddSourceLocation(
C->getCountLoc());
7932 Record.AddStmt(
C->getAllocator());
7933 Record.AddSourceLocation(
C->getLParenLoc());
7937 Record.AddStmt(
C->getNumForLoops());
7938 Record.AddSourceLocation(
C->getLParenLoc());
7942 Record.AddStmt(
C->getEventHandler());
7943 Record.AddSourceLocation(
C->getLParenLoc());
7947 Record.push_back(
unsigned(
C->getDefaultKind()));
7948 Record.AddSourceLocation(
C->getLParenLoc());
7949 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
7950 Record.push_back(
unsigned(
C->getDefaultVC()));
7951 Record.AddSourceLocation(
C->getDefaultVCLoc());
7955 Record.AddSourceLocation(
C->getLParenLoc());
7956 Record.AddSourceLocation(
C->getThreadsetKindLoc());
7957 Record.writeEnum(
C->getThreadsetKind());
7961 Record.push_back(
unsigned(
C->getProcBindKind()));
7962 Record.AddSourceLocation(
C->getLParenLoc());
7963 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
7967 VisitOMPClauseWithPreInit(
C);
7968 Record.push_back(
C->getScheduleKind());
7969 Record.push_back(
C->getFirstScheduleModifier());
7970 Record.push_back(
C->getSecondScheduleModifier());
7971 Record.AddStmt(
C->getChunkSize());
7972 Record.AddSourceLocation(
C->getLParenLoc());
7973 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
7974 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
7975 Record.AddSourceLocation(
C->getScheduleKindLoc());
7976 Record.AddSourceLocation(
C->getCommaLoc());
7980 Record.push_back(
C->getLoopNumIterations().size());
7981 Record.AddStmt(
C->getNumForLoops());
7982 for (
Expr *NumIter :
C->getLoopNumIterations())
7984 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
7985 Record.AddStmt(
C->getLoopCounter(I));
7986 Record.AddSourceLocation(
C->getLParenLoc());
7990 Record.AddStmt(
C->getCondition());
7991 Record.AddSourceLocation(
C->getLParenLoc());
8003 Record.push_back(
C->isExtended() ? 1 : 0);
8004 if (
C->isExtended()) {
8005 Record.AddSourceLocation(
C->getLParenLoc());
8006 Record.AddSourceLocation(
C->getArgumentLoc());
8007 Record.writeEnum(
C->getDependencyKind());
8017 Record.AddSourceLocation(
C->getLParenLoc());
8018 Record.AddSourceLocation(
C->getFailParameterLoc());
8019 Record.writeEnum(
C->getFailParameter());
8027 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8028 Record.AddSourceLocation(
C->getLParenLoc());
8029 for (
auto K :
C->getDirectiveKinds()) {
8036 Record.AddSourceLocation(
C->getLParenLoc());
8040 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8041 Record.AddSourceLocation(
C->getLParenLoc());
8042 for (
auto K :
C->getDirectiveKinds()) {
8049void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8052void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8072 Record.push_back(
C->varlist_size());
8075 Record.writeBool(
C->getIsTarget());
8076 Record.writeBool(
C->getIsTargetSync());
8077 Record.AddSourceLocation(
C->getLParenLoc());
8078 Record.AddSourceLocation(
C->getVarLoc());
8082 Record.AddStmt(
C->getInteropVar());
8083 Record.AddSourceLocation(
C->getLParenLoc());
8084 Record.AddSourceLocation(
C->getVarLoc());
8088 Record.AddStmt(
C->getInteropVar());
8089 Record.AddSourceLocation(
C->getLParenLoc());
8090 Record.AddSourceLocation(
C->getVarLoc());
8094 VisitOMPClauseWithPreInit(
C);
8095 Record.AddStmt(
C->getCondition());
8096 Record.AddSourceLocation(
C->getLParenLoc());
8100 VisitOMPClauseWithPreInit(
C);
8101 Record.AddStmt(
C->getCondition());
8102 Record.AddSourceLocation(
C->getLParenLoc());
8106 VisitOMPClauseWithPreInit(
C);
8107 Record.AddStmt(
C->getThreadID());
8108 Record.AddSourceLocation(
C->getLParenLoc());
8112 Record.AddStmt(
C->getAlignment());
8113 Record.AddSourceLocation(
C->getLParenLoc());
8117 Record.push_back(
C->varlist_size());
8118 Record.AddSourceLocation(
C->getLParenLoc());
8119 for (
auto *
VE :
C->varlist()) {
8122 for (
auto *
VE :
C->private_copies()) {
8128 Record.push_back(
C->varlist_size());
8129 VisitOMPClauseWithPreInit(
C);
8130 Record.AddSourceLocation(
C->getLParenLoc());
8131 for (
auto *
VE :
C->varlist()) {
8134 for (
auto *
VE :
C->private_copies()) {
8137 for (
auto *
VE :
C->inits()) {
8143 Record.push_back(
C->varlist_size());
8144 VisitOMPClauseWithPostUpdate(
C);
8145 Record.AddSourceLocation(
C->getLParenLoc());
8146 Record.writeEnum(
C->getKind());
8147 Record.AddSourceLocation(
C->getKindLoc());
8148 Record.AddSourceLocation(
C->getColonLoc());
8149 for (
auto *
VE :
C->varlist())
8151 for (
auto *E :
C->private_copies())
8153 for (
auto *E :
C->source_exprs())
8155 for (
auto *E :
C->destination_exprs())
8157 for (
auto *E :
C->assignment_ops())
8162 Record.push_back(
C->varlist_size());
8163 Record.AddSourceLocation(
C->getLParenLoc());
8164 for (
auto *
VE :
C->varlist())
8169 Record.push_back(
C->varlist_size());
8170 Record.writeEnum(
C->getModifier());
8171 VisitOMPClauseWithPostUpdate(
C);
8172 Record.AddSourceLocation(
C->getLParenLoc());
8173 Record.AddSourceLocation(
C->getModifierLoc());
8174 Record.AddSourceLocation(
C->getColonLoc());
8175 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8176 Record.AddDeclarationNameInfo(
C->getNameInfo());
8177 for (
auto *
VE :
C->varlist())
8179 for (
auto *
VE :
C->privates())
8181 for (
auto *E :
C->lhs_exprs())
8183 for (
auto *E :
C->rhs_exprs())
8185 for (
auto *E :
C->reduction_ops())
8187 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8188 for (
auto *E :
C->copy_ops())
8190 for (
auto *E :
C->copy_array_temps())
8192 for (
auto *E :
C->copy_array_elems())
8195 auto PrivateFlags =
C->private_var_reduction_flags();
8196 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8197 for (
bool Flag : PrivateFlags)
8202 Record.push_back(
C->varlist_size());
8203 VisitOMPClauseWithPostUpdate(
C);
8204 Record.AddSourceLocation(
C->getLParenLoc());
8205 Record.AddSourceLocation(
C->getColonLoc());
8206 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8207 Record.AddDeclarationNameInfo(
C->getNameInfo());
8208 for (
auto *
VE :
C->varlist())
8210 for (
auto *
VE :
C->privates())
8212 for (
auto *E :
C->lhs_exprs())
8214 for (
auto *E :
C->rhs_exprs())
8216 for (
auto *E :
C->reduction_ops())
8221 Record.push_back(
C->varlist_size());
8222 VisitOMPClauseWithPostUpdate(
C);
8223 Record.AddSourceLocation(
C->getLParenLoc());
8224 Record.AddSourceLocation(
C->getColonLoc());
8225 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8226 Record.AddDeclarationNameInfo(
C->getNameInfo());
8227 for (
auto *
VE :
C->varlist())
8229 for (
auto *
VE :
C->privates())
8231 for (
auto *E :
C->lhs_exprs())
8233 for (
auto *E :
C->rhs_exprs())
8235 for (
auto *E :
C->reduction_ops())
8237 for (
auto *E :
C->taskgroup_descriptors())
8242 Record.push_back(
C->varlist_size());
8243 VisitOMPClauseWithPostUpdate(
C);
8244 Record.AddSourceLocation(
C->getLParenLoc());
8245 Record.AddSourceLocation(
C->getColonLoc());
8246 Record.push_back(
C->getModifier());
8247 Record.AddSourceLocation(
C->getModifierLoc());
8248 for (
auto *
VE :
C->varlist()) {
8251 for (
auto *
VE :
C->privates()) {
8254 for (
auto *
VE :
C->inits()) {
8257 for (
auto *
VE :
C->updates()) {
8260 for (
auto *
VE :
C->finals()) {
8264 Record.AddStmt(
C->getCalcStep());
8265 for (
auto *
VE :
C->used_expressions())
8270 Record.push_back(
C->varlist_size());
8271 Record.AddSourceLocation(
C->getLParenLoc());
8272 Record.AddSourceLocation(
C->getColonLoc());
8273 for (
auto *
VE :
C->varlist())
8275 Record.AddStmt(
C->getAlignment());
8279 Record.push_back(
C->varlist_size());
8280 Record.AddSourceLocation(
C->getLParenLoc());
8281 for (
auto *
VE :
C->varlist())
8283 for (
auto *E :
C->source_exprs())
8285 for (
auto *E :
C->destination_exprs())
8287 for (
auto *E :
C->assignment_ops())
8292 Record.push_back(
C->varlist_size());
8293 Record.AddSourceLocation(
C->getLParenLoc());
8294 for (
auto *
VE :
C->varlist())
8296 for (
auto *E :
C->source_exprs())
8298 for (
auto *E :
C->destination_exprs())
8300 for (
auto *E :
C->assignment_ops())
8305 Record.push_back(
C->varlist_size());
8306 Record.AddSourceLocation(
C->getLParenLoc());
8307 for (
auto *
VE :
C->varlist())
8312 Record.AddStmt(
C->getDepobj());
8313 Record.AddSourceLocation(
C->getLParenLoc());
8317 Record.push_back(
C->varlist_size());
8318 Record.push_back(
C->getNumLoops());
8319 Record.AddSourceLocation(
C->getLParenLoc());
8320 Record.AddStmt(
C->getModifier());
8321 Record.push_back(
C->getDependencyKind());
8322 Record.AddSourceLocation(
C->getDependencyLoc());
8323 Record.AddSourceLocation(
C->getColonLoc());
8324 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8325 for (
auto *
VE :
C->varlist())
8327 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8328 Record.AddStmt(
C->getLoopData(I));
8332 VisitOMPClauseWithPreInit(
C);
8333 Record.writeEnum(
C->getModifier());
8334 Record.AddStmt(
C->getDevice());
8335 Record.AddSourceLocation(
C->getModifierLoc());
8336 Record.AddSourceLocation(
C->getLParenLoc());
8340 Record.push_back(
C->varlist_size());
8341 Record.push_back(
C->getUniqueDeclarationsNum());
8342 Record.push_back(
C->getTotalComponentListNum());
8343 Record.push_back(
C->getTotalComponentsNum());
8344 Record.AddSourceLocation(
C->getLParenLoc());
8345 bool HasIteratorModifier =
false;
8347 Record.push_back(
C->getMapTypeModifier(I));
8348 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8349 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8350 HasIteratorModifier =
true;
8352 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8353 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8354 Record.push_back(
C->getMapType());
8355 Record.AddSourceLocation(
C->getMapLoc());
8356 Record.AddSourceLocation(
C->getColonLoc());
8357 for (
auto *E :
C->varlist())
8359 for (
auto *E :
C->mapperlists())
8361 if (HasIteratorModifier)
8362 Record.AddStmt(
C->getIteratorModifier());
8363 for (
auto *D :
C->all_decls())
8365 for (
auto N :
C->all_num_lists())
8367 for (
auto N :
C->all_lists_sizes())
8369 for (
auto &M :
C->all_components()) {
8370 Record.AddStmt(M.getAssociatedExpression());
8371 Record.AddDeclRef(M.getAssociatedDeclaration());
8376 Record.push_back(
C->varlist_size());
8377 Record.writeEnum(
C->getFirstAllocateModifier());
8378 Record.writeEnum(
C->getSecondAllocateModifier());
8379 Record.AddSourceLocation(
C->getLParenLoc());
8380 Record.AddSourceLocation(
C->getColonLoc());
8381 Record.AddStmt(
C->getAllocator());
8382 Record.AddStmt(
C->getAlignment());
8383 for (
auto *
VE :
C->varlist())
8388 Record.push_back(
C->varlist_size());
8389 VisitOMPClauseWithPreInit(
C);
8390 Record.AddSourceLocation(
C->getLParenLoc());
8391 for (
auto *
VE :
C->varlist())
8396 Record.push_back(
C->varlist_size());
8397 VisitOMPClauseWithPreInit(
C);
8398 Record.AddSourceLocation(
C->getLParenLoc());
8399 for (
auto *
VE :
C->varlist())
8404 VisitOMPClauseWithPreInit(
C);
8405 Record.AddStmt(
C->getPriority());
8406 Record.AddSourceLocation(
C->getLParenLoc());
8410 VisitOMPClauseWithPreInit(
C);
8411 Record.writeEnum(
C->getModifier());
8412 Record.AddStmt(
C->getGrainsize());
8413 Record.AddSourceLocation(
C->getModifierLoc());
8414 Record.AddSourceLocation(
C->getLParenLoc());
8418 VisitOMPClauseWithPreInit(
C);
8419 Record.writeEnum(
C->getModifier());
8420 Record.AddStmt(
C->getNumTasks());
8421 Record.AddSourceLocation(
C->getModifierLoc());
8422 Record.AddSourceLocation(
C->getLParenLoc());
8427 Record.AddSourceLocation(
C->getLParenLoc());
8431 VisitOMPClauseWithPreInit(
C);
8432 Record.push_back(
C->getDistScheduleKind());
8433 Record.AddStmt(
C->getChunkSize());
8434 Record.AddSourceLocation(
C->getLParenLoc());
8435 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8436 Record.AddSourceLocation(
C->getCommaLoc());
8440 Record.push_back(
C->getDefaultmapKind());
8441 Record.push_back(
C->getDefaultmapModifier());
8442 Record.AddSourceLocation(
C->getLParenLoc());
8443 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8444 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8447void OMPClauseWriter::VisitOMPToClause(
OMPToClause *
C) {
8448 Record.push_back(
C->varlist_size());
8449 Record.push_back(
C->getUniqueDeclarationsNum());
8450 Record.push_back(
C->getTotalComponentListNum());
8451 Record.push_back(
C->getTotalComponentsNum());
8452 Record.AddSourceLocation(
C->getLParenLoc());
8454 Record.push_back(
C->getMotionModifier(I));
8455 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8457 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8458 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8459 Record.AddSourceLocation(
C->getColonLoc());
8460 for (
auto *E :
C->varlist())
8462 for (
auto *E :
C->mapperlists())
8464 for (
auto *D :
C->all_decls())
8466 for (
auto N :
C->all_num_lists())
8468 for (
auto N :
C->all_lists_sizes())
8470 for (
auto &M :
C->all_components()) {
8471 Record.AddStmt(M.getAssociatedExpression());
8472 Record.writeBool(M.isNonContiguous());
8473 Record.AddDeclRef(M.getAssociatedDeclaration());
8478 Record.push_back(
C->varlist_size());
8479 Record.push_back(
C->getUniqueDeclarationsNum());
8480 Record.push_back(
C->getTotalComponentListNum());
8481 Record.push_back(
C->getTotalComponentsNum());
8482 Record.AddSourceLocation(
C->getLParenLoc());
8484 Record.push_back(
C->getMotionModifier(I));
8485 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8487 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8488 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8489 Record.AddSourceLocation(
C->getColonLoc());
8490 for (
auto *E :
C->varlist())
8492 for (
auto *E :
C->mapperlists())
8494 for (
auto *D :
C->all_decls())
8496 for (
auto N :
C->all_num_lists())
8498 for (
auto N :
C->all_lists_sizes())
8500 for (
auto &M :
C->all_components()) {
8501 Record.AddStmt(M.getAssociatedExpression());
8502 Record.writeBool(M.isNonContiguous());
8503 Record.AddDeclRef(M.getAssociatedDeclaration());
8508 Record.push_back(
C->varlist_size());
8509 Record.push_back(
C->getUniqueDeclarationsNum());
8510 Record.push_back(
C->getTotalComponentListNum());
8511 Record.push_back(
C->getTotalComponentsNum());
8512 Record.AddSourceLocation(
C->getLParenLoc());
8513 for (
auto *E :
C->varlist())
8515 for (
auto *
VE :
C->private_copies())
8517 for (
auto *
VE :
C->inits())
8519 for (
auto *D :
C->all_decls())
8521 for (
auto N :
C->all_num_lists())
8523 for (
auto N :
C->all_lists_sizes())
8525 for (
auto &M :
C->all_components()) {
8526 Record.AddStmt(M.getAssociatedExpression());
8527 Record.AddDeclRef(M.getAssociatedDeclaration());
8532 Record.push_back(
C->varlist_size());
8533 Record.push_back(
C->getUniqueDeclarationsNum());
8534 Record.push_back(
C->getTotalComponentListNum());
8535 Record.push_back(
C->getTotalComponentsNum());
8536 Record.AddSourceLocation(
C->getLParenLoc());
8537 for (
auto *E :
C->varlist())
8539 for (
auto *D :
C->all_decls())
8541 for (
auto N :
C->all_num_lists())
8543 for (
auto N :
C->all_lists_sizes())
8545 for (
auto &M :
C->all_components()) {
8546 Record.AddStmt(M.getAssociatedExpression());
8547 Record.AddDeclRef(M.getAssociatedDeclaration());
8552 Record.push_back(
C->varlist_size());
8553 Record.push_back(
C->getUniqueDeclarationsNum());
8554 Record.push_back(
C->getTotalComponentListNum());
8555 Record.push_back(
C->getTotalComponentsNum());
8556 Record.AddSourceLocation(
C->getLParenLoc());
8557 for (
auto *E :
C->varlist())
8559 for (
auto *D :
C->all_decls())
8561 for (
auto N :
C->all_num_lists())
8563 for (
auto N :
C->all_lists_sizes())
8565 for (
auto &M :
C->all_components()) {
8566 Record.AddStmt(M.getAssociatedExpression());
8567 Record.AddDeclRef(M.getAssociatedDeclaration());
8572 Record.push_back(
C->varlist_size());
8573 Record.push_back(
C->getUniqueDeclarationsNum());
8574 Record.push_back(
C->getTotalComponentListNum());
8575 Record.push_back(
C->getTotalComponentsNum());
8576 Record.AddSourceLocation(
C->getLParenLoc());
8577 for (
auto *E :
C->varlist())
8579 for (
auto *D :
C->all_decls())
8581 for (
auto N :
C->all_num_lists())
8583 for (
auto N :
C->all_lists_sizes())
8585 for (
auto &M :
C->all_components()) {
8586 Record.AddStmt(M.getAssociatedExpression());
8587 Record.AddDeclRef(M.getAssociatedDeclaration());
8593void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8602void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8604 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8605 Record.AddSourceLocation(
C->getLParenLoc());
8606 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8611void OMPClauseWriter::VisitOMPAtClause(
OMPAtClause *
C) {
8612 Record.push_back(
C->getAtKind());
8613 Record.AddSourceLocation(
C->getLParenLoc());
8614 Record.AddSourceLocation(
C->getAtKindKwLoc());
8618 Record.push_back(
C->getSeverityKind());
8619 Record.AddSourceLocation(
C->getLParenLoc());
8620 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8624 VisitOMPClauseWithPreInit(
C);
8625 Record.AddStmt(
C->getMessageString());
8626 Record.AddSourceLocation(
C->getLParenLoc());
8630 Record.push_back(
C->varlist_size());
8631 Record.AddSourceLocation(
C->getLParenLoc());
8632 for (
auto *
VE :
C->varlist())
8634 for (
auto *E :
C->private_refs())
8639 Record.push_back(
C->varlist_size());
8640 Record.AddSourceLocation(
C->getLParenLoc());
8641 for (
auto *
VE :
C->varlist())
8646 Record.push_back(
C->varlist_size());
8647 Record.AddSourceLocation(
C->getLParenLoc());
8648 for (
auto *
VE :
C->varlist())
8653 Record.writeEnum(
C->getKind());
8654 Record.writeEnum(
C->getModifier());
8655 Record.AddSourceLocation(
C->getLParenLoc());
8656 Record.AddSourceLocation(
C->getKindKwLoc());
8657 Record.AddSourceLocation(
C->getModifierKwLoc());
8661 Record.push_back(
C->getNumberOfAllocators());
8662 Record.AddSourceLocation(
C->getLParenLoc());
8663 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8673 Record.push_back(
C->varlist_size());
8674 Record.AddSourceLocation(
C->getLParenLoc());
8675 Record.AddStmt(
C->getModifier());
8676 Record.AddSourceLocation(
C->getColonLoc());
8677 for (
Expr *E :
C->varlist())
8682 Record.writeEnum(
C->getBindKind());
8683 Record.AddSourceLocation(
C->getLParenLoc());
8684 Record.AddSourceLocation(
C->getBindKindLoc());
8688 VisitOMPClauseWithPreInit(
C);
8690 Record.AddSourceLocation(
C->getLParenLoc());
8693void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8695 VisitOMPClauseWithPreInit(
C);
8696 Record.push_back(
C->getDynGroupprivateModifier());
8697 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8699 Record.AddSourceLocation(
C->getLParenLoc());
8700 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8701 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8705 Record.push_back(
C->varlist_size());
8706 Record.push_back(
C->getNumLoops());
8707 Record.AddSourceLocation(
C->getLParenLoc());
8708 Record.push_back(
C->getDependenceType());
8709 Record.AddSourceLocation(
C->getDependenceLoc());
8710 Record.AddSourceLocation(
C->getColonLoc());
8711 for (
auto *
VE :
C->varlist())
8713 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8714 Record.AddStmt(
C->getLoopData(I));
8718 Record.AddAttributes(
C->getAttrs());
8719 Record.AddSourceLocation(
C->getBeginLoc());
8720 Record.AddSourceLocation(
C->getLParenLoc());
8721 Record.AddSourceLocation(
C->getEndLoc());
8728 for (
const auto &
Set : TI->
Sets) {
8735 writeExprRef(
Selector.ScoreOrCondition);
8749 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8751 if (
Data->hasAssociatedStmt())
8753 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8759 for (
Expr *E :
C->getVarList())
8765 for (
Expr *E : Exprs)
8774 switch (
C->getClauseKind()) {
8784 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
8791 if (SC->isConditionExprClause()) {
8793 if (SC->hasConditionExpr())
8794 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
8797 for (
Expr *E : SC->getVarList())
8806 for (
Expr *E : NGC->getIntExprs())
8840 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
8863 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
8951 if (AC->hasIntExpr())
8959 if (
Expr *DNE = WC->getDevNumExpr())
8973 if (Arg.getIdentifierInfo())
8992 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9020 for (
Expr *E : TC->getSizeExprs())
9028 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9030 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9038 if (WC->hasIntExpr())
9046 if (VC->hasIntExpr())
9067 if (BC->isStringArgument())
9076 llvm_unreachable(
"Clause serialization not yet implemented");
9078 llvm_unreachable(
"Invalid Clause Kind");
9087 const OpenACCRoutineDeclAttr *A) {
#define RECORD(CLASS, BASE)
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 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.
TypePropertyCache< Private > Cache
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
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 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.
TagDecl * MSTypeInfoTagDecl
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
QualType getsigjmp_bufType() const
Retrieve the C sigjmp_buf type.
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
virtual void EnteringModulePurview()
The parser find the named module declaration.
Reads an AST files chain containing the contents of a translation unit.
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
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 AddTemplateArgumentLocInfo(const TemplateArgumentLoc &Arg)
Emits a template argument location info.
void AddTypeLoc(TypeLoc TL)
Emits source location information for a type. Does not emit the type.
void AddSelectorRef(Selector S)
Emit a Selector (which is a smart pointer reference).
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 writeOpenACCClauseList(ArrayRef< const OpenACCClause * > Clauses)
Writes out a list of OpenACC clauses.
void push_back(uint64_t N)
Minimal vector-like interface.
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 AddSourceRange(SourceRange Range)
Emit a source range.
void AddAPInt(const llvm::APInt &Value)
Emit an integral value.
void AddSourceLocation(SourceLocation Loc)
Emit a source location.
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 AddOpenACCRoutineDeclAttr(const OpenACCRoutineDeclAttr *A)
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.
UnresolvedSetIterator const_iterator
Writes an AST file containing the contents of a translation unit.
void AddEmittedDeclRef(const Decl *D, RecordDataImpl &Record)
friend class ASTRecordWriter
bool isWritingStdCXXNamedModules() const
ArrayRef< uint64_t > RecordDataRef
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.
SmallVectorImpl< uint64_t > RecordDataImpl
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)?
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.
void AddSourceRange(SourceRange Range, RecordDataImpl &Record)
Emit a source range.
LocalDeclID getDeclID(const Decl *D)
Determine the local declaration ID of an already-emitted declaration.
void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record)
Emit a source location.
void addTouchedModuleFile(serialization::ModuleFile *)
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.
SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc)
Return the raw encodings for source locations.
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.
ASTWriter(llvm::BitstreamWriter &Stream, SmallVectorImpl< char > &Buffer, ModuleCache &ModCache, const CodeGenOptions &CodeGenOpts, 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.
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.
void AddLookupOffsets(const LookupBlockOffsets &Offsets, RecordDataImpl &Record)
serialization::SelectorID getSelectorRef(Selector Sel)
Get the unique number used to refer to the given selector.
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)
void AddMacroRef(MacroInfo *MI, const IdentifierInfo *Name, RecordDataImpl &Record)
Emit a reference to a macro.
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 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
SourceLocation getScopeLoc() const
SourceRange getRange() const
const IdentifierInfo * getScopeName() const
bool isRegularKeywordAttribute() const
const IdentifierInfo * getAttrName() const
Kind getParsedKind() const
const Attr * getAttr() const
The type attribute.
SourceLocation getRParenLoc() const
bool isDecltypeAuto() const
bool isConstrained() const
ConceptReference * getConceptReference() const
A simple helper class to pack several bits in order into (a) 32 bit integer(s).
void addBits(uint32_t Value, uint32_t BitsWidth)
SourceLocation getCaretLoc() const
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.
unsigned getDeviceLambdaManglingNumber() const
Retrieve the device side mangling number.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
unsigned getODRHash() const
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...
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
TemplateDecl * getNamedConcept() const
SourceLocation getTemplateKWLoc() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
DeclContextLookupResult lookup_result
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
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
NameKind getNameKind() const
Determine what kind of name this is.
SourceLocation getDecltypeLoc() const
SourceLocation getRParenLoc() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getTemplateNameLoc() const
NestedNameSpecifierLoc getQualifierLoc() 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
SourceLocation getNameLoc() const
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.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool hasUncompilableErrorOccurred() const
Errors that actually prevent compilation, not those that are upgraded from a warning by -Werror.
StringRef getName() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getNameLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
This represents one expression.
storage_type getAsOpaqueInt() const
storage_type getAsOpaqueInt() const
Represents a member of a struct/union/class.
StringRef getName() const
The name of this FileEntry.
Cached information about one file (either on disk or in the virtual file system).
time_t getModificationTime() const
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
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
void GetUniqueIDMapping(SmallVectorImpl< OptionalFileEntryRef > &UIDToFiles) const
Produce an array mapping from the unique IDs assigned to each file to the corresponding FileEntryRef.
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.
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.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
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
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 hasMacroDefinition() const
Return true if this identifier is #defined to some other value.
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.
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'.
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 ...
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.
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getStarLoc() const
The module cache used for compiling modules implicitly.
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.
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.
unsigned IsFramework
Whether this is a framework module.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
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.
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
SourceRange getLocalSourceRange() const
Retrieve the source range covering just the last part of this nested-name-specifier,...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
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' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
This represents the 'doacross' clause for the 'pragma omp ordered' directive.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
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 class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents clause 'map' in the 'pragma omp ...' directives.
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
This represents the 'no_openmp_routines' clause in the 'pragma omp assume' directive.
This represents the 'no_parallelism' clause in the 'pragma omp assume' directive.
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
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 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
This represents clause 'shared' in the 'pragma omp ...' directives.
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 'threadset' clause in the 'pragma omp task ...' 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.
Represents an ObjC class declaration.
filtered_category_iterator< isKnownCategory > known_categories_iterator
Iterator that walks over all of the known categories and extensions, including those that are hidden.
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
SourceLocation getNameEndLoc() const
SourceLocation getNameLoc() const
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
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.
SourceLocation getEllipsisLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
Represents a parameter to a function.
SourceLocation getKWLoc() const
SourceLocation getStarLoc() const
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.
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
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.
SourceManager & getSourceManager() const
std::optional< PreambleSkipInfo > getPreambleSkipInfo() const
bool hasRecordedPreamble() const
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
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 PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
const LangOptions & getLangOpts() const
PreprocessingRecord * getPreprocessingRecord() const
Retrieve the preprocessing record, or NULL if there is no preprocessing record.
DiagnosticsEngine & getDiagnostics() const
uint32_t getCounterValue() 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.
SourceLocation getAmpAmpLoc() const
Represents a struct/union/class.
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 optimizeoff". 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
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
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)
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 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
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.
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
const ContentCache & getContentCache() const
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.
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
SourceLocation getNameLoc() const
SourceLocation getElaboratedKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
TargetOptions & getTargetOpts() const
Retrieve the target options.
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.
SourceLocation getTemplateEllipsisLoc() const
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKWLoc() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
@ 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
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getElaboratedKeywordLoc() const
Token - This structure provides full information about a lexed token.
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
TypeClass getTypeClass() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getTypeofLoc() const
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.
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
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...
OverloadedOperatorKind getOperatorKind() const
IdentifierInfo * getIdentifier() const
Selector getSelector() const
Information about a module that has been loaded by the ASTReader.
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 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 LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
A type index; the type ID with the qualifier bits removed.
uint32_t getModuleFileIndex() const
TypeID asTypeID(unsigned FastQuals) const
uint64_t getValue() const
SmallVector< LazySpecializationInfo, 4 > data_type
The lookup result is a list of global declaration IDs.
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)
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
GlobalDeclID LazySpecializationInfo
@ 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)
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
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.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
@ 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.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
@ 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...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ 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.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
@ 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.
unsigned ComputeHash(Selector Sel)
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
The JSON file list parser is used to communicate input to InstallAPI.
@ NUM_OVERLOADED_OPERATORS
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
@ 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'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
IdentifierLoc DeviceTypeArgument
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_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' 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.
@ Property
The type of a property.
@ Result
The result type of a method or function.
const FunctionProtoType * T
void normalizeModuleCachePath(FileManager &FileMgr, StringRef Path, SmallVectorImpl< char > &NormalizedPath)
@ Type
The name was classified as a type.
bool CanElideDeclDef(const Decl *D)
If we can elide the definition of.
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
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),...
FPOptions FPO
Floating-point options in the point of definition.
Decl * D
The template function declaration to be late parsed.
NestedNameSpecifierLoc Prefix
Data for list of allocators.
ObjCMethodDecl * getMethod() 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.
TypeSourceInfo * getAsTypeSourceInfo() const
uint64_t ModuleLocalOffset