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);
978 BLOCK(SOURCE_MANAGER_BLOCK);
986 BLOCK(PREPROCESSOR_BLOCK);
994 BLOCK(SUBMODULE_BLOCK);
1016 BLOCK(COMMENTS_BLOCK);
1020 BLOCK(DECLTYPES_BLOCK);
1024 RECORD(TYPE_BLOCK_POINTER);
1025 RECORD(TYPE_LVALUE_REFERENCE);
1026 RECORD(TYPE_RVALUE_REFERENCE);
1027 RECORD(TYPE_MEMBER_POINTER);
1028 RECORD(TYPE_CONSTANT_ARRAY);
1029 RECORD(TYPE_INCOMPLETE_ARRAY);
1030 RECORD(TYPE_VARIABLE_ARRAY);
1033 RECORD(TYPE_FUNCTION_NO_PROTO);
1034 RECORD(TYPE_FUNCTION_PROTO);
1036 RECORD(TYPE_TYPEOF_EXPR);
1040 RECORD(TYPE_OBJC_INTERFACE);
1041 RECORD(TYPE_OBJC_OBJECT_POINTER);
1043 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1044 RECORD(TYPE_UNRESOLVED_USING);
1045 RECORD(TYPE_INJECTED_CLASS_NAME);
1046 RECORD(TYPE_OBJC_OBJECT);
1047 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1048 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1049 RECORD(TYPE_DEPENDENT_NAME);
1050 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1052 RECORD(TYPE_MACRO_QUALIFIED);
1053 RECORD(TYPE_PACK_EXPANSION);
1055 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1056 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1058 RECORD(TYPE_UNARY_TRANSFORM);
1062 RECORD(TYPE_OBJC_TYPE_PARAM);
1143 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1149 BLOCK(EXTENSION_BLOCK);
1152 BLOCK(UNHASHED_CONTROL_BLOCK);
1172 bool Changed =
FileMgr.makeAbsolutePath(Path);
1173 return Changed | llvm::sys::path::remove_dots(Path);
1188 assert(Filename &&
"No file name to adjust?");
1190 if (BaseDir.empty())
1195 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1196 if (Filename[Pos] != BaseDir[Pos])
1205 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1206 if (!llvm::sys::path::is_separator(BaseDir.back()))
1220 return Filename + Pos;
1223std::pair<ASTFileSignature, ASTFileSignature>
1224ASTWriter::createSignature()
const {
1225 StringRef AllBytes(Buffer.data(), Buffer.size());
1228 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1233 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1236 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1238 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1241 return std::make_pair(ASTBlockHash, Signature);
1244ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1246 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1248 assert(WritingModule);
1249 assert(WritingModule->isNamedModule());
1253 for (
auto [ExportImported, _] : WritingModule->Exports)
1254 Hasher.update(ExportImported->Signature);
1278 for (
Module *M : TouchedTopLevelModules)
1286 for (uint8_t Byte : S) {
1287 Stream.BackpatchByte(BitNo, Byte);
1292ASTFileSignature ASTWriter::backpatchSignature() {
1293 if (isWritingStdCXXNamedModules()) {
1294 ASTFileSignature Signature = createSignatureForNamedModule();
1299 if (!WritingModule ||
1304 ASTFileSignature ASTBlockHash;
1305 ASTFileSignature Signature;
1306 std::tie(ASTBlockHash, Signature) = createSignature();
1314void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1315 using namespace llvm;
1318 Stream.FlushToWord();
1319 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1327 if (isWritingStdCXXNamedModules() ||
1338 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1341 if (!isWritingStdCXXNamedModules()) {
1342 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1344 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1345 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1348 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1349 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1353 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1354 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1355 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1356 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1359 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1360 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1369 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1370#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1371#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1372 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1373#include "clang/Basic/DiagnosticOptions.def"
1375 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1378 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1387 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1389 Record.push_back(HSOpts.UserEntries.size());
1390 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1391 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1393 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1399 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1400 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1401 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1402 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1406 Record.push_back(HSOpts.VFSOverlayFiles.size());
1407 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1408 AddString(VFSOverlayFile,
Record);
1413 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1414 WritePragmaDiagnosticMappings(Diags, WritingModule);
1419 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1421 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1422 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1423 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1425 HSEntryUsage.size()};
1426 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1432 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1433 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1434 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1435 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1436 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1438 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1443 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1447void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1448 using namespace llvm;
1457 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1459 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1461 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1462 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1463 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1465 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1466 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1467 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1468 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1469 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1470 assert((!WritingModule || isysroot.empty()) &&
1471 "writing module as a relocatable PCH?");
1476 CLANG_VERSION_MAJOR,
1477 CLANG_VERSION_MINOR,
1479 isWritingStdCXXNamedModules(),
1481 ASTHasCompilerErrors};
1482 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1486 if (WritingModule) {
1488 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1490 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1491 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1493 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1495 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1501 if (WritingModule->Directory) {
1502 return WritingModule->Directory->getName();
1504 return std::nullopt;
1516 WritingModule->Directory->getName() !=
".")) {
1518 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1520 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1521 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1524 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1528 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1529 }
else if (!isysroot.empty()) {
1531 BaseDirectory = std::string(isysroot);
1536 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1540 AddPath(WritingModule->PresumedModuleMapFile.empty()
1541 ? Map.getModuleMapFileForUniquing(WritingModule)
1542 ->getNameAsRequested()
1543 : StringRef(WritingModule->PresumedModuleMapFile),
1547 if (
auto *AdditionalModMaps =
1548 Map.getAdditionalModuleMapFiles(WritingModule)) {
1549 Record.push_back(AdditionalModMaps->size());
1550 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1551 AdditionalModMaps->end());
1552 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1555 for (FileEntryRef F : ModMaps)
1556 AddPath(F.getName(),
Record);
1566 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1567 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1573 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1574 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1575 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1576 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1578 SmallString<128> Blob;
1580 for (ModuleFile &M : Chain->getModuleManager()) {
1582 if (!M.isDirectlyImported())
1590 AddSourceLocation(M.ImportLoc,
Record);
1591 AddStringBlob(M.ModuleName,
Record, Blob);
1592 Record.push_back(M.StandardCXXModule);
1596 if (M.StandardCXXModule) {
1608 AddPathBlob(M.FileName,
Record, Blob);
1611 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1621#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
1622 Record.push_back(LangOpts.Name);
1623#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1624 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1625#include "clang/Basic/LangOptions.def"
1626#define SANITIZER(NAME, ID) \
1627 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1628#include "clang/Basic/Sanitizers.def"
1649 AddString(
T.getTriple(),
Record);
1657 using CK = CodeGenOptions::CompatibilityKind;
1659 const CodeGenOptions &CGOpts = getCodeGenOpts();
1660#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1661 if constexpr (CK::Compatibility != CK::Benign) \
1662 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1663#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1664 if constexpr (CK::Compatibility != CK::Benign) \
1665 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1666#define DEBUGOPT(Name, Bits, Default, Compatibility)
1667#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1668#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1669#include "clang/Basic/CodeGenOptions.def"
1685 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1698 const HeaderSearchOptions &HSOpts =
1701 SmallString<256> HSOpts_ModuleCachePath;
1703 HSOpts_ModuleCachePath);
1707 AddString(HSOpts_ModuleCachePath,
Record);
1731 bool WriteMacros = !SkipMacros;
1732 Record.push_back(WriteMacros);
1736 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1744 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1749 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1765 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1767 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1768 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1769 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1774 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1781 WriteInputFiles(SourceMgr);
1788struct InputFileEntry {
1792 bool BufferOverridden;
1799 void trySetContentHash(
1801 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1810 auto MemBuff = GetMemBuff();
1812 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1817 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1819 ContentHash[1] =
uint32_t(Hash >> 32);
1825SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1826 const SrcMgr::FileInfo &
File) {
1827 SourceLocation IncludeLoc =
File.getIncludeLoc();
1829 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1830 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1831 if (!IsSLocAffecting[IncludeFID.ID])
1832 IncludeLoc = SourceLocation();
1837void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1838 using namespace llvm;
1843 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1845 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1846 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1847 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1848 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1849 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1850 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1851 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1852 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1853 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1854 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1857 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1859 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1860 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1861 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1863 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1866 std::vector<InputFileEntry> UserFiles;
1867 std::vector<InputFileEntry> SystemFiles;
1871 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1878 if (!
Cache->OrigEntry)
1882 if (!IsSLocFileEntryAffecting[I])
1885 InputFileEntry Entry(*
Cache->OrigEntry);
1886 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1887 Entry.IsTransient =
Cache->IsTransient;
1888 Entry.BufferOverridden =
Cache->BufferOverridden;
1890 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1891 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1892 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1895 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1897 if (Entry.IsSystemFile)
1898 SystemFiles.push_back(Entry);
1900 UserFiles.push_back(Entry);
1907 if (!Sysroot.empty()) {
1908 SmallString<128> SDKSettingsJSON = Sysroot;
1909 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1912 InputFileEntry Entry(*FE);
1913 Entry.IsSystemFile =
true;
1914 Entry.IsTransient =
false;
1915 Entry.BufferOverridden =
false;
1916 Entry.IsTopLevel =
true;
1917 Entry.IsModuleMap =
false;
1918 std::unique_ptr<MemoryBuffer> MB;
1919 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1921 MB = std::move(*MBOrErr);
1922 return MB->getMemBufferRef();
1924 return std::nullopt;
1926 SystemFiles.push_back(Entry);
1931 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(UserFiles),
1932 std::move(SystemFiles));
1934 unsigned UserFilesNum = 0;
1936 std::vector<uint64_t> InputFileOffsets;
1937 for (
const auto &Entry : SortedFiles) {
1938 uint32_t &InputFileID = InputFileIDs[Entry.File];
1939 if (InputFileID != 0)
1943 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1945 InputFileID = InputFileOffsets.size();
1947 if (!Entry.IsSystemFile)
1953 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1954 SmallString<128> Name = Entry.File.getName();
1956 PreparePathForOutput(NameAsRequested);
1957 PreparePathForOutput(Name);
1959 if (Name == NameAsRequested)
1962 RecordData::value_type
Record[] = {
1964 InputFileOffsets.size(),
1966 (
uint64_t)getTimestampForOutput(Entry.File),
1967 Entry.BufferOverridden,
1971 NameAsRequested.size()};
1973 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1974 (NameAsRequested + Name).str());
1980 Entry.ContentHash[1]};
1981 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1988 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1990 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1991 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1993 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1994 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
1998 InputFileOffsets.size(), UserFilesNum};
1999 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2009 using namespace llvm;
2011 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2013 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2021 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2022 return Stream.EmitAbbrev(std::move(Abbrev));
2028 using namespace llvm;
2030 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2032 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2034 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2037 return Stream.EmitAbbrev(std::move(Abbrev));
2044 using namespace llvm;
2046 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2050 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2052 return Stream.EmitAbbrev(std::move(Abbrev));
2058 using namespace llvm;
2060 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2062 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2068 return Stream.EmitAbbrev(std::move(Abbrev));
2073static std::pair<unsigned, unsigned>
2075 llvm::encodeULEB128(KeyLen, Out);
2076 llvm::encodeULEB128(DataLen, Out);
2077 return std::make_pair(KeyLen, DataLen);
2083 class HeaderFileInfoTrait {
2087 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2094 using key_type_ref =
const key_type &;
2096 using UnresolvedModule =
2097 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2100 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2101 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2103 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2107 bool AlreadyIncluded;
2108 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2111 using data_type_ref =
const data_type &;
2113 using hash_value_type = unsigned;
2114 using offset_type = unsigned;
2120 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2121 memcpy(buf, &key.Size,
sizeof(key.Size));
2122 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2123 return llvm::xxh3_64bits(buf);
2126 std::pair<unsigned, unsigned>
2127 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2128 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2130 for (
auto ModInfo :
Data.KnownHeaders)
2133 if (
Data.Unresolved.getPointer())
2138 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2139 using namespace llvm::support;
2141 endian::Writer
LE(Out, llvm::endianness::little);
2146 Out.write(key.Filename.data(), KeyLen);
2149 void EmitData(raw_ostream &Out, key_type_ref key,
2150 data_type_ref
Data,
unsigned DataLen) {
2151 using namespace llvm::support;
2153 endian::Writer
LE(Out, llvm::endianness::little);
2156 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2157 | (
Data.HFI.isImport << 5)
2159 Data.HFI.isPragmaOnce << 4)
2160 | (
Data.HFI.DirInfo << 1);
2161 LE.write<uint8_t>(Flags);
2163 if (
Data.HFI.LazyControllingMacro.isID())
2172 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2177 for (
auto ModInfo :
Data.KnownHeaders)
2178 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2179 if (
Data.Unresolved.getPointer())
2180 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2182 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2191void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2192 HeaderFileInfoTrait GeneratorTrait(*
this);
2193 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2194 SmallVector<const char *, 4> SavedStrings;
2195 unsigned NumHeaderSearchEntries = 0;
2201 const HeaderFileInfo
Empty;
2202 if (WritingModule) {
2203 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2204 while (!Worklist.empty()) {
2205 Module *M = Worklist.pop_back_val();
2222 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2223 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2224 << WritingModule->getFullModuleName() << U.Size.has_value()
2231 llvm::sys::path::append(Filename, U.FileName);
2232 PreparePathForOutput(Filename);
2234 StringRef FilenameDup = strdup(Filename.c_str());
2235 SavedStrings.push_back(FilenameDup.data());
2237 HeaderFileInfoTrait::key_type Key = {
2238 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2239 HeaderFileInfoTrait::data_type
Data = {
2244 ++NumHeaderSearchEntries;
2247 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2251 SmallVector<OptionalFileEntryRef, 16> FilesByUID;
2257 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2271 StringRef Filename =
File->getName();
2272 SmallString<128> FilenameTmp(Filename);
2273 if (PreparePathForOutput(FilenameTmp)) {
2276 Filename = StringRef(strdup(FilenameTmp.c_str()));
2277 SavedStrings.push_back(Filename.data());
2282 HeaderFileInfoTrait::key_type Key = {
2283 Filename,
File->getSize(), getTimestampForOutput(*
File)
2285 HeaderFileInfoTrait::data_type
Data = {
2289 ++NumHeaderSearchEntries;
2293 SmallString<4096> TableData;
2296 using namespace llvm::support;
2298 llvm::raw_svector_ostream
Out(TableData);
2300 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2301 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2305 using namespace llvm;
2307 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2309 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2310 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2311 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2312 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2313 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2317 NumHeaderSearchEntries, TableData.size()};
2318 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2321 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2322 free(
const_cast<char *
>(SavedStrings[I]));
2325static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2326 unsigned SLocBufferBlobCompressedAbbrv,
2327 unsigned SLocBufferBlobAbbrv) {
2328 using RecordDataType = ASTWriter::RecordData::value_type;
2333 if (llvm::compression::zstd::isAvailable()) {
2334 llvm::compression::zstd::compress(
2335 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2337 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2338 llvm::toStringRef(CompressedBuffer));
2341 if (llvm::compression::zlib::isAvailable()) {
2342 llvm::compression::zlib::compress(
2343 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2345 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2346 llvm::toStringRef(CompressedBuffer));
2351 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2362void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2367 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2373 unsigned SLocBufferBlobCompressedAbbrv =
2379 std::vector<uint32_t> SLocEntryOffsets;
2380 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2386 FileID FID = FileID::get(I);
2390 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2391 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2397 if (
Cache->OrigEntry) {
2410 if (!IsSLocAffecting[I])
2412 SLocEntryOffsets.push_back(Offset);
2415 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2416 Record.push_back(
File.getFileCharacteristic());
2419 bool EmitBlob =
false;
2422 "Writing to AST an overridden file is not supported");
2425 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2428 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2430 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2431 if (FDI != FileDeclIDs.end()) {
2432 Record.push_back(FDI->second->FirstDeclIndex);
2433 Record.push_back(FDI->second->DeclIDs.size());
2439 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2450 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2452 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2453 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2454 StringRef(Name.data(), Name.size() + 1));
2461 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2464 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2465 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2466 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2467 SLocBufferBlobAbbrv);
2471 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2472 SLocEntryOffsets.push_back(Offset);
2487 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2488 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2494 if (SLocEntryOffsets.empty())
2499 using namespace llvm;
2501 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2503 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2504 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2505 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2506 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2507 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2509 RecordData::value_type
Record[] = {
2512 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2513 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2514 bytes(SLocEntryOffsets));
2525 llvm::DenseMap<int, int> FilenameMap;
2526 FilenameMap[-1] = -1;
2527 for (
const auto &L : LineTable) {
2530 for (
auto &LE : L.second) {
2531 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2532 FilenameMap.size() - 1)).second)
2533 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2539 for (
const auto &L : LineTable) {
2544 AddFileID(L.first,
Record);
2547 Record.push_back(L.second.size());
2548 for (
const auto &LE : L.second) {
2551 Record.push_back(FilenameMap[
LE.FilenameID]);
2552 Record.push_back((
unsigned)
LE.FileKind);
2553 Record.push_back(
LE.IncludeOffset);
2568 if (MI->isBuiltinMacro())
2584void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2585 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2589 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2592 RecordData ModuleMacroRecord;
2602 SourceLocation AssumeNonNullLoc =
2604 if (AssumeNonNullLoc.
isValid()) {
2606 AddSourceLocation(AssumeNonNullLoc,
Record);
2616 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2617 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2618 Record.push_back(SkipInfo->FoundNonSkipPortion);
2619 Record.push_back(SkipInfo->FoundElse);
2620 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2636 AddSourceLocation(S,
Record);
2646 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2653 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2656 if (!isWritingStdCXXNamedModules())
2658 if (Id.second->hadMacroDefinition() &&
2659 (!Id.second->isFromAST() ||
2660 Id.second->hasChangedSinceDeserialization()))
2661 MacroIdentifiers.push_back(Id.second);
2664 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2668 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2670 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2671 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2674 bool EmittedModuleMacros =
false;
2682 if (IsModule && WritingModule->isHeaderUnit()) {
2691 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2692 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2693 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2694 Record.push_back(VisMD->isPublic());
2696 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2697 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2699 ModuleMacroRecord.clear();
2700 EmittedModuleMacros =
true;
2710 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2711 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2712 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2713 Record.push_back(VisMD->isPublic());
2719 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2720 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2721 while (!Worklist.empty()) {
2722 auto *
Macro = Worklist.pop_back_val();
2725 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2726 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2727 for (
auto *M :
Macro->overrides())
2728 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2731 ModuleMacroRecord.clear();
2734 for (
auto *M :
Macro->overrides())
2735 if (++Visits[M] == M->getNumOverridingMacros())
2736 Worklist.push_back(M);
2738 EmittedModuleMacros =
true;
2741 if (
Record.empty() && !EmittedModuleMacros)
2744 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2755 std::vector<uint32_t> MacroOffsets;
2757 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2758 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2759 MacroInfo *MI = MacroInfosToEmit[I].MI;
2762 if (ID < FirstMacroID) {
2763 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2768 unsigned Index =
ID - FirstMacroID;
2769 if (Index >= MacroOffsets.size())
2770 MacroOffsets.resize(Index + 1);
2772 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2773 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2774 MacroOffsets[Index] = Offset;
2776 AddIdentifierRef(Name,
Record);
2792 for (
const IdentifierInfo *Param : MI->
params())
2793 AddIdentifierRef(Param,
Record);
2801 Stream.EmitRecord(Code,
Record);
2805 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2820 using namespace llvm;
2822 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2824 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2825 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2826 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2828 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2831 MacroOffsetsBase - ASTBlockStartOffset};
2832 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2836void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2837 uint64_t MacroOffsetsBase) {
2841 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2847 unsigned NumPreprocessingRecords = 0;
2848 using namespace llvm;
2851 unsigned InclusionAbbrev = 0;
2853 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2855 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2856 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2857 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2858 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2860 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2864 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2866 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2869 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2872 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2873 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2874 SourceRange R = getAdjustedRange((*E)->getSourceRange());
2875 PreprocessedEntityOffsets.emplace_back(
2876 getRawSourceLocationEncoding(R.
getBegin()),
2877 getRawSourceLocationEncoding(R.
getEnd()), Offset);
2879 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2881 MacroDefinitions[MD] = NextPreprocessorEntityID;
2883 AddIdentifierRef(MD->getName(),
Record);
2888 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2889 Record.push_back(ME->isBuiltinMacro());
2890 if (ME->isBuiltinMacro())
2891 AddIdentifierRef(ME->getName(),
Record);
2893 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2898 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2900 Record.push_back(
ID->getFileName().size());
2901 Record.push_back(
ID->wasInQuotes());
2902 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2903 Record.push_back(
ID->importedModule());
2904 SmallString<64> Buffer;
2905 Buffer +=
ID->getFileName();
2909 Buffer +=
ID->getFile()->getName();
2910 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2914 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2919 if (NumPreprocessingRecords > 0) {
2920 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2923 using namespace llvm;
2925 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2927 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2928 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2931 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2932 bytes(PreprocessedEntityOffsets));
2937 if (SkippedRanges.size() > 0) {
2938 std::vector<PPSkippedRange> SerializedSkippedRanges;
2939 SerializedSkippedRanges.reserve(SkippedRanges.size());
2940 for (
auto const& Range : SkippedRanges)
2941 SerializedSkippedRanges.emplace_back(
2942 getRawSourceLocationEncoding(
Range.getBegin()),
2943 getRawSourceLocationEncoding(
Range.getEnd()));
2945 using namespace llvm;
2946 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2948 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2949 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2953 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2954 bytes(SerializedSkippedRanges));
2962 auto Known = SubmoduleIDs.find(Mod);
2963 if (Known != SubmoduleIDs.end())
2964 return Known->second;
2967 if (Top != WritingModule &&
2969 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2972 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2975unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2976 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2988 unsigned ChildModules = 0;
2992 return ChildModules + 1;
2995void ASTWriter::WriteSubmodules(
Module *WritingModule, ASTContext *Context) {
3000 using namespace llvm;
3002 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3004 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3005 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3006 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3007 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3008 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
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::Fixed, 1));
3017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3020 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3022 Abbrev = std::make_shared<BitCodeAbbrev>();
3024 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3025 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3027 Abbrev = std::make_shared<BitCodeAbbrev>();
3029 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3030 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3032 Abbrev = std::make_shared<BitCodeAbbrev>();
3034 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3035 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3037 Abbrev = std::make_shared<BitCodeAbbrev>();
3039 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3040 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3042 Abbrev = std::make_shared<BitCodeAbbrev>();
3044 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3045 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3046 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3048 Abbrev = std::make_shared<BitCodeAbbrev>();
3050 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3051 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3053 Abbrev = std::make_shared<BitCodeAbbrev>();
3055 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3056 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3058 Abbrev = std::make_shared<BitCodeAbbrev>();
3060 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3061 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3063 Abbrev = std::make_shared<BitCodeAbbrev>();
3065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3066 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3068 Abbrev = std::make_shared<BitCodeAbbrev>();
3070 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3071 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3072 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3074 Abbrev = std::make_shared<BitCodeAbbrev>();
3076 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3077 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3079 Abbrev = std::make_shared<BitCodeAbbrev>();
3081 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3082 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3083 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3085 Abbrev = std::make_shared<BitCodeAbbrev>();
3087 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3088 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3091 RecordData::value_type
Record[] = {
3097 std::queue<Module *> Q;
3098 Q.push(WritingModule);
3099 while (!Q.empty()) {
3102 unsigned ID = getSubmoduleID(Mod);
3106 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3107 ParentID = SubmoduleIDs[Mod->
Parent];
3111 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3114 FileID UnadjustedInferredFID;
3117 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3124 (RecordData::value_type)Mod->
Kind,
3126 (RecordData::value_type)InferredFID,
3137 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3143 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record, R.FeatureName);
3147 if (std::optional<Module::Header> UmbrellaHeader =
3150 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3151 UmbrellaHeader->NameAsWritten);
3152 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3155 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3156 UmbrellaDir->NameAsWritten);
3161 unsigned RecordKind;
3163 Module::HeaderKind HeaderKind;
3169 Module::HK_PrivateTextual},
3172 for (
const auto &HL : HeaderLists) {
3173 RecordData::value_type
Record[] = {HL.RecordKind};
3174 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3175 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3182 SmallString<128> HeaderName(H.getName());
3183 PreparePathForOutput(HeaderName);
3184 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3192 Record.push_back(getSubmoduleID(I));
3200 Record.push_back(getSubmoduleID(I));
3207 for (
const auto &E : Mod->
Exports) {
3210 Record.push_back(getSubmoduleID(E.getPointer()));
3211 Record.push_back(E.getInt());
3226 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3234 getSubmoduleID(
C.Other)};
3235 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3241 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3246 if (Context && !GeneratingReducedBMI) {
3249 if (wasDeclEmitted(D))
3250 AddDeclRef(D,
Inits);
3268 assert((NextSubmoduleID - FirstSubmoduleID ==
3270 "Wrong # of submodules; found a reference to a non-local, "
3271 "non-imported submodule?");
3274void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3276 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3278 unsigned CurrID = 0;
3281 auto EncodeDiagStateFlags =
3282 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3283 unsigned Result = (unsigned)DS->ExtBehavior;
3285 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3286 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3287 (unsigned)DS->SuppressSystemWarnings})
3292 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3295 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3296 bool IncludeNonPragmaStates) {
3299 assert(Flags == EncodeDiagStateFlags(State) &&
3300 "diag state flags vary in single AST file");
3304 assert(!IncludeNonPragmaStates ||
3305 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3307 unsigned &DiagStateID = DiagStateIDMap[State];
3308 Record.push_back(DiagStateID);
3310 if (DiagStateID == 0) {
3311 DiagStateID = ++CurrID;
3312 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3315 auto SizeIdx =
Record.size();
3317 for (
const auto &I : *State) {
3319 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3323 if (!I.second.isPragma() &&
3324 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3326 Mappings.push_back(I);
3330 llvm::sort(Mappings, llvm::less_first());
3332 for (
const auto &I : Mappings) {
3333 Record.push_back(I.first);
3334 Record.push_back(I.second.serialize());
3341 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3344 auto NumLocationsIdx =
Record.size();
3348 unsigned NumLocations = 0;
3349 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3350 if (!FileIDAndFile.first.isValid() ||
3351 !FileIDAndFile.second.HasLocalTransitions)
3355 AddFileID(FileIDAndFile.first,
Record);
3357 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3358 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3359 Record.push_back(getAdjustedOffset(StatePoint.Offset));
3360 AddDiagState(StatePoint.State,
false);
3365 Record[NumLocationsIdx] = NumLocations;
3373 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3374 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3384void ASTWriter::WriteType(ASTContext &Context, QualType
T) {
3385 TypeIdx &IdxRef = TypeIdxs[
T];
3387 IdxRef = TypeIdx(0, NextTypeID++);
3388 TypeIdx Idx = IdxRef;
3391 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3395 ASTTypeWriter(Context, *
this).write(
T) - DeclTypesBlockStartOffset;
3399 if (TypeOffsets.size() == Index)
3400 TypeOffsets.emplace_back(Offset);
3401 else if (TypeOffsets.size() < Index) {
3402 TypeOffsets.resize(Index + 1);
3403 TypeOffsets[Index].set(Offset);
3405 llvm_unreachable(
"Types emitted in wrong order");
3414 auto *ND = dyn_cast<NamedDecl>(D);
3429uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3430 const DeclContext *DC) {
3438 uint64_t Offset = Stream.GetCurrentBitNo();
3439 SmallVector<DeclID, 128> KindDeclPairs;
3440 for (
const auto *D : DC->
decls()) {
3441 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3449 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3453 KindDeclPairs.push_back(D->getKind());
3454 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3457 ++NumLexicalDeclContexts;
3459 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3460 bytes(KindDeclPairs));
3464void ASTWriter::WriteTypeDeclOffsets() {
3465 using namespace llvm;
3468 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3470 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3471 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3472 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3475 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3479 Abbrev = std::make_shared<BitCodeAbbrev>();
3481 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3482 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3483 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3486 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3490void ASTWriter::WriteFileDeclIDsMap() {
3491 using namespace llvm;
3493 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3494 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3495 for (
const auto &P : FileDeclIDs)
3496 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3497 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3500 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3501 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3502 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3503 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3504 llvm::stable_sort(Info.DeclIDs);
3505 for (
auto &LocDeclEntry : Info.DeclIDs)
3506 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3509 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3511 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3512 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3513 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3515 FileGroupedDeclIDs.size()};
3516 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3519void ASTWriter::WriteComments(ASTContext &Context) {
3521 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3528 if (isWritingStdCXXNamedModules())
3532 for (
const auto &FO : Context.
Comments.OrderedComments) {
3533 for (
const auto &OC : FO.second) {
3534 const RawComment *I = OC.second;
3552class ASTMethodPoolTrait {
3556 using key_type = Selector;
3557 using key_type_ref = key_type;
3561 ObjCMethodList Instance, Factory;
3563 using data_type_ref =
const data_type &;
3565 using hash_value_type = unsigned;
3566 using offset_type = unsigned;
3568 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3570 static hash_value_type
ComputeHash(Selector Sel) {
3574 std::pair<unsigned, unsigned>
3575 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3576 data_type_ref Methods) {
3580 unsigned DataLen = 4 + 2 + 2;
3581 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3583 if (ShouldWriteMethodListNode(
Method))
3584 DataLen +=
sizeof(
DeclID);
3585 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3587 if (ShouldWriteMethodListNode(
Method))
3588 DataLen +=
sizeof(
DeclID);
3592 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3593 using namespace llvm::support;
3595 endian::Writer
LE(Out, llvm::endianness::little);
3597 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3600 LE.write<uint16_t>(N);
3603 for (
unsigned I = 0; I != N; ++I)
3608 void EmitData(raw_ostream& Out, key_type_ref,
3609 data_type_ref Methods,
unsigned DataLen) {
3610 using namespace llvm::support;
3612 endian::Writer
LE(Out, llvm::endianness::little);
3615 unsigned NumInstanceMethods = 0;
3616 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3618 if (ShouldWriteMethodListNode(
Method))
3619 ++NumInstanceMethods;
3621 unsigned NumFactoryMethods = 0;
3622 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3624 if (ShouldWriteMethodListNode(
Method))
3625 ++NumFactoryMethods;
3627 unsigned InstanceBits = Methods.Instance.getBits();
3628 assert(InstanceBits < 4);
3629 unsigned InstanceHasMoreThanOneDeclBit =
3630 Methods.Instance.hasMoreThanOneDecl();
3631 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3632 (InstanceHasMoreThanOneDeclBit << 2) |
3634 unsigned FactoryBits = Methods.Factory.getBits();
3635 assert(FactoryBits < 4);
3636 unsigned FactoryHasMoreThanOneDeclBit =
3637 Methods.Factory.hasMoreThanOneDecl();
3638 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3639 (FactoryHasMoreThanOneDeclBit << 2) |
3641 LE.write<uint16_t>(FullInstanceBits);
3642 LE.write<uint16_t>(FullFactoryBits);
3643 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3645 if (ShouldWriteMethodListNode(
Method))
3647 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3649 if (ShouldWriteMethodListNode(
Method))
3652 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3656 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3668void ASTWriter::WriteSelectors(Sema &SemaRef) {
3669 using namespace llvm;
3674 unsigned NumTableEntries = 0;
3677 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3678 ASTMethodPoolTrait Trait(*
this);
3682 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3683 for (
auto &SelectorAndID : SelectorIDs) {
3684 Selector S = SelectorAndID.first;
3686 SemaObjC::GlobalMethodPool::iterator F =
3688 ASTMethodPoolTrait::data_type
Data = {
3694 Data.Instance = F->second.first;
3695 Data.Factory = F->second.second;
3699 if (Chain && ID < FirstSelectorID) {
3701 bool changed =
false;
3702 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3704 if (!M->getMethod()->isFromASTFile()) {
3710 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3712 if (!M->getMethod()->isFromASTFile()) {
3720 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3728 SmallString<4096> MethodPool;
3731 using namespace llvm::support;
3733 ASTMethodPoolTrait Trait(*
this);
3734 llvm::raw_svector_ostream
Out(MethodPool);
3736 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3737 BucketOffset =
Generator.Emit(Out, Trait);
3741 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3743 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3744 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3745 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3746 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3752 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3756 Abbrev = std::make_shared<BitCodeAbbrev>();
3758 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3759 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3760 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3761 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3765 RecordData::value_type
Record[] = {
3768 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3769 bytes(SelectorOffsets));
3775void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3776 using namespace llvm;
3788 Selector Sel = SelectorAndLocation.first;
3789 SourceLocation Loc = SelectorAndLocation.second;
3790 Writer.AddSelectorRef(Sel);
3812 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3814 if (!Redecl->isFromASTFile()) {
3818 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3826 if (Redecl->getOwningModuleID() == 0)
3831 if (!
First->isFromASTFile())
3842bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3843 bool IsModule,
bool IsCPlusPlus) {
3844 bool NeedDecls = !IsModule || !IsCPlusPlus;
3846 bool IsInteresting =
3853 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3861bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3862 ASTWriter &Writer) {
3864 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3865 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3868class ASTIdentifierTableTrait {
3871 IdentifierResolver *IdResolver;
3881 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3886 using key_type =
const IdentifierInfo *;
3887 using key_type_ref = key_type;
3890 using data_type_ref = data_type;
3892 using hash_value_type = unsigned;
3893 using offset_type = unsigned;
3895 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3896 IdentifierResolver *IdResolver,
bool IsModule,
3898 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3899 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3900 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3902 bool needDecls()
const {
return NeedDecls; }
3904 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3905 return llvm::djbHash(II->
getName());
3913 std::pair<unsigned, unsigned>
3914 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3923 if (InterestingIdentifierOffsets &&
3925 InterestingIdentifierOffsets->push_back(
Out.tell());
3936 if (NeedDecls && IdResolver)
3937 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3943 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3947 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3949 using namespace llvm::support;
3951 endian::Writer
LE(Out, llvm::endianness::little);
3961 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
3962 LE.write<uint16_t>(Bits);
3964 bool HasMacroDefinition =
3967 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
3969 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
3972 LE.write<uint16_t>(Bits);
3974 if (HasMacroDefinition)
3977 if (NeedDecls && IdResolver) {
3984 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
3985 for (NamedDecl *D : llvm::reverse(Decls))
4003void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4004 IdentifierResolver *IdResolver,
4006 using namespace llvm;
4008 RecordData InterestingIdents;
4013 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4014 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4015 IsModule ? &InterestingIdents :
nullptr);
4019 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4020 for (
auto IdentIDPair : IdentifierIDs) {
4021 const IdentifierInfo *II = IdentIDPair.first;
4023 assert(II &&
"NULL identifier in identifier table");
4028 (Trait.needDecls() &&
4034 SmallString<4096> IdentifierTable;
4037 using namespace llvm::support;
4039 llvm::raw_svector_ostream
Out(IdentifierTable);
4041 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4042 BucketOffset =
Generator.Emit(Out, Trait);
4046 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4048 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4049 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4050 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4054 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4058 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4060 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4061 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4062 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4065 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4066 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4070 IdentifierOffsets.size()};
4071 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4072 bytes(IdentifierOffsets));
4076 if (!InterestingIdents.empty())
4084 PendingEmittingVTables.push_back(RD);
4088 TouchedModuleFiles.insert(MF);
4097class ASTDeclContextNameLookupTraitBase {
4105 using data_type = std::pair<unsigned, unsigned>;
4106 using data_type_ref =
const data_type &;
4111 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4114 data_type getData(
const DeclIDsTy &LocalIDs) {
4115 unsigned Start = DeclIDs.size();
4116 for (
auto ID : LocalIDs)
4117 DeclIDs.push_back(ID);
4118 return std::make_pair(Start, DeclIDs.size());
4121 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4122 unsigned Start = DeclIDs.size();
4125 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4126 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4127 return std::make_pair(Start, DeclIDs.size());
4130 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4132 "have reference to loaded module file but no chain?");
4134 using namespace llvm::support;
4137 llvm::endianness::little);
4140 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4141 DeclarationNameKey Name,
4142 data_type_ref Lookup) {
4143 unsigned KeyLen = 1;
4166 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4168 return {KeyLen, DataLen};
4171 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4172 using namespace llvm::support;
4174 endian::Writer
LE(Out, llvm::endianness::little);
4189 "Invalid operator?");
4199 llvm_unreachable(
"Invalid name kind?");
4202 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4203 using namespace llvm::support;
4205 endian::Writer
LE(Out, llvm::endianness::little);
4207 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4209 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4213class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4215 using primary_module_hash_type = unsigned;
4217 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4218 using key_type_ref = key_type;
4220 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4221 : ASTDeclContextNameLookupTraitBase(Writer) {}
4223 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4226 llvm::FoldingSetNodeID
ID;
4227 ID.AddInteger(Key.first.getHash());
4228 ID.AddInteger(Key.second);
4229 return ID.computeStableHash();
4232 std::pair<unsigned, unsigned>
4233 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4234 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4235 KeyLen +=
sizeof(Key.second);
4239 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4240 EmitKeyBase(Out, Key.first);
4241 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4242 LE.write<primary_module_hash_type>(Key.second);
4245 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4247 EmitDataBase(Out, Lookup, DataLen);
4251class ASTDeclContextNameTrivialLookupTrait
4252 :
public ASTDeclContextNameLookupTraitBase {
4254 using key_type = DeclarationNameKey;
4255 using key_type_ref = key_type;
4258 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4260 using ASTDeclContextNameLookupTraitBase::getData;
4262 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4264 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4266 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4267 DeclarationNameKey Name,
4268 data_type_ref Lookup) {
4269 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4273 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4274 return EmitKeyBase(Out, Name);
4277 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4279 EmitDataBase(Out, Lookup, DataLen);
4283static bool isModuleLocalDecl(NamedDecl *D) {
4288 return isModuleLocalDecl(Parent);
4292 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4293 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4294 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4310static bool isTULocalInNamedModules(NamedDecl *D) {
4333class ASTDeclContextNameLookupTrait
4334 :
public ASTDeclContextNameTrivialLookupTrait {
4336 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4338 using ModuleLevelDeclsMapTy =
4339 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4342 enum class LookupVisibility {
4352 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4355 return LookupVisibility::GenerallyVisibile;
4357 if (isModuleLocalDecl(D))
4358 return LookupVisibility::ModuleLocalVisible;
4359 if (isTULocalInNamedModules(D))
4360 return LookupVisibility::TULocal;
4372 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4373 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4378 return Found->isInvisibleOutsideTheOwningModule();
4380 return ECD->isFromExplicitGlobalModule() ||
4381 ECD->isInAnonymousNamespace()
4382 ? LookupVisibility::TULocal
4383 : LookupVisibility::ModuleLocalVisible;
4386 return LookupVisibility::GenerallyVisibile;
4390 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4391 TULocalDeclsMapTy TULocalDeclsMap;
4394 using ASTDeclContextNameTrivialLookupTrait::
4395 ASTDeclContextNameTrivialLookupTrait;
4397 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4398 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4400 template <
typename Coll> data_type getData(
const Coll &Decls) {
4401 unsigned Start = DeclIDs.size();
4402 auto AddDecl = [
this](NamedDecl *D) {
4403 NamedDecl *DeclForLocalLookup =
4419 switch (getLookupVisibility(DeclForLocalLookup)) {
4420 case LookupVisibility::ModuleLocalVisible:
4421 if (UnsignedOrNone PrimaryModuleHash =
4423 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4424 auto Iter = ModuleLocalDeclsMap.find(Key);
4425 if (Iter == ModuleLocalDeclsMap.end())
4426 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4428 Iter->second.push_back(ID);
4432 case LookupVisibility::TULocal: {
4433 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4434 if (Iter == TULocalDeclsMap.end())
4437 Iter->second.push_back(ID);
4440 case LookupVisibility::GenerallyVisibile:
4445 DeclIDs.push_back(ID);
4447 ASTReader *Chain = Writer.
getChain();
4448 for (NamedDecl *D : Decls) {
4459 for (
const auto &[_,
First] : Firsts)
4465 return std::make_pair(Start, DeclIDs.size());
4468 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4469 return ModuleLocalDeclsMap;
4472 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4478class LazySpecializationInfoLookupTrait {
4480 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4483 using key_type = unsigned;
4484 using key_type_ref = key_type;
4487 using data_type = std::pair<unsigned, unsigned>;
4488 using data_type_ref =
const data_type &;
4490 using hash_value_type = unsigned;
4491 using offset_type = unsigned;
4493 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4496 template <
typename Col,
typename Col2>
4497 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4498 unsigned Start = Specs.size();
4501 const_cast<NamedDecl *
>(D));
4506 Specs.push_back(Info);
4507 return std::make_pair(Start, Specs.size());
4510 data_type ImportData(
4512 unsigned Start = Specs.size();
4513 for (
auto ID : FromReader)
4514 Specs.push_back(ID);
4515 return std::make_pair(Start, Specs.size());
4518 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4520 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4522 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4524 "have reference to loaded module file but no chain?");
4526 using namespace llvm::support;
4529 llvm::endianness::little);
4532 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4534 data_type_ref Lookup) {
4536 unsigned KeyLen = 4;
4538 (Lookup.second - Lookup.first);
4543 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4544 using namespace llvm::support;
4546 endian::Writer
LE(Out, llvm::endianness::little);
4550 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4552 using namespace llvm::support;
4554 endian::Writer
LE(Out, llvm::endianness::little);
4557 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4558 LE.write<
DeclID>(Specs[I].getRawValue());
4560 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4564unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4565 ArrayRef<TemplateArgument> Args;
4566 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4567 Args = CTSD->getTemplateArgs().asArray();
4568 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4569 Args = VTSD->getTemplateArgs().asArray();
4570 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4571 Args = FD->getTemplateSpecializationArgs()->asArray();
4573 llvm_unreachable(
"New Specialization Kind?");
4579void ASTWriter::GenerateSpecializationInfoLookupTable(
4580 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4581 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4585 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4586 LazySpecializationInfoLookupTrait>
4588 LazySpecializationInfoLookupTrait Trait(*
this);
4590 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4596 auto Iter = SpecializationMaps.find(HashedValue);
4597 if (Iter == SpecializationMaps.end())
4598 Iter = SpecializationMaps
4599 .try_emplace(HashedValue,
4600 llvm::SmallVector<const NamedDecl *, 4>())
4610 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4611 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4621 ExisitingSpecs = Lookups->Table.find(HashValue);
4623 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4626 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4629uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4630 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4633 llvm::SmallString<4096> LookupTable;
4634 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4637 uint64_t Offset = Stream.GetCurrentBitNo();
4638 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4640 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4641 : DeclSpecializationsAbbrev,
4653 for (
auto *D : Result.getLookupResult()) {
4655 if (LocalD->isFromASTFile())
4673void ASTWriter::GenerateNameLookupTable(
4674 ASTContext &Context,
const DeclContext *ConstDC,
4675 llvm::SmallVectorImpl<char> &LookupTable,
4676 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4677 llvm::SmallVectorImpl<char> &TULookupTable) {
4678 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4679 !ConstDC->hasLazyExternalLexicalLookups() &&
4680 "must call buildLookups first");
4683 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4687 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4688 ASTDeclContextNameLookupTrait>
4690 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4695 SmallVector<DeclarationName, 16> Names;
4699 bool IncludeConstructorNames =
false;
4700 bool IncludeConversionNames =
false;
4727 if (
Result.getLookupResult().empty())
4730 switch (Name.getNameKind()) {
4732 Names.push_back(Name);
4736 IncludeConstructorNames =
true;
4740 IncludeConversionNames =
true;
4748 if (IncludeConstructorNames || IncludeConversionNames) {
4753 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4755 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4756 auto Name = ChildND->getDeclName();
4757 switch (Name.getNameKind()) {
4762 if (!IncludeConstructorNames)
4767 if (!IncludeConversionNames)
4771 if (AddedNames.insert(Name).second)
4772 Names.push_back(Name);
4780 for (
auto &Name : Names)
4787 SmallVector<NamedDecl *, 8> ConstructorDecls;
4788 SmallVector<NamedDecl *, 8> ConversionDecls;
4792 for (
auto &Name : Names) {
4795 switch (Name.getNameKind()) {
4813 if (!ConstructorDecls.empty())
4814 Generator.insert(ConstructorDecls.front()->getDeclName(),
4815 Trait.getData(ConstructorDecls), Trait);
4816 if (!ConversionDecls.empty())
4817 Generator.insert(ConversionDecls.front()->getDeclName(),
4818 Trait.getData(ConversionDecls), Trait);
4823 Generator.emit(LookupTable, Trait, Lookups ? &Lookups->Table :
nullptr);
4825 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4826 if (!ModuleLocalDecls.empty()) {
4827 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4828 ModuleLevelNameLookupTrait>
4829 ModuleLocalLookupGenerator;
4830 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4832 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4833 const auto &Key = ModuleLocalIter.first;
4834 const auto &IDs = ModuleLocalIter.second;
4835 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4839 auto *ModuleLocalLookups =
4841 ModuleLocalLookupGenerator.emit(
4842 ModuleLocalLookupTable, ModuleLocalTrait,
4843 ModuleLocalLookups ? &ModuleLocalLookups->Table :
nullptr);
4846 const auto &TULocalDecls = Trait.getTULocalDecls();
4847 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4848 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4849 ASTDeclContextNameTrivialLookupTrait>
4851 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4853 for (
const auto &TULocalIter : TULocalDecls) {
4854 const auto &Key = TULocalIter.first;
4855 const auto &IDs = TULocalIter.second;
4856 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4860 TULookupGenerator.emit(TULookupTable, TULocalTrait,
4861 TULocalLookups ? &TULocalLookups->Table :
nullptr);
4870void ASTWriter::WriteDeclContextVisibleBlock(
4871 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4881 Prev = Prev->getPreviousDecl())
4882 if (!Prev->isFromASTFile())
4892 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4895 LookupResults.reserve(Map->size());
4896 for (
auto &Entry : *Map)
4897 LookupResults.push_back(
4898 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4901 llvm::sort(LookupResults, llvm::less_first());
4902 for (
auto &NameAndResult : LookupResults) {
4903 DeclarationName Name = NameAndResult.first;
4910 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4911 "function name in a namespace!");
4915 for (NamedDecl *ND :
Result) {
4919 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
4953 if (!Map || Map->empty())
4958 SmallString<4096> LookupTable;
4959 SmallString<4096> ModuleLocalLookupTable;
4960 SmallString<4096> TULookupTable;
4961 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4966 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
4968 ++NumVisibleDeclContexts;
4970 if (!ModuleLocalLookupTable.empty()) {
4974 RecordData::value_type ModuleLocalRecord[] = {
4976 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
4977 ModuleLocalRecord, ModuleLocalLookupTable);
4978 ++NumModuleLocalDeclContexts;
4981 if (!TULookupTable.empty()) {
4984 RecordData::value_type TULocalDeclsRecord[] = {
4986 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
4988 ++NumTULocalDeclContexts;
4998void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
4999 const DeclContext *DC) {
5001 if (!Map || Map->empty())
5005 SmallString<4096> LookupTable;
5006 SmallString<4096> ModuleLocalLookupTable;
5007 SmallString<4096> TULookupTable;
5008 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5019 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5021 if (!ModuleLocalLookupTable.empty()) {
5023 RecordData::value_type ModuleLocalRecord[] = {
5025 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5026 ModuleLocalLookupTable);
5029 if (!TULookupTable.empty()) {
5030 RecordData::value_type GMFRecord[] = {
5032 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5038void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5044void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5050 for (
const auto &I:Opts.OptMap) {
5051 AddString(I.getKey(),
Record);
5052 auto V = I.getValue();
5053 Record.push_back(
V.Supported ? 1 : 0);
5054 Record.push_back(
V.Enabled ? 1 : 0);
5055 Record.push_back(
V.WithPragma ? 1 : 0);
5062void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5063 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5064 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5069void ASTWriter::WriteObjCCategories() {
5070 if (ObjCClassesWithCategories.empty())
5073 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5074 RecordData Categories;
5076 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5078 unsigned StartIndex = Categories.size();
5080 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5083 Categories.push_back(0);
5087 Cat =
Class->known_categories_begin(),
5088 CatEnd =
Class->known_categories_end();
5089 Cat != CatEnd; ++Cat, ++Size) {
5090 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5091 AddDeclRef(*Cat, Categories);
5095 Categories[StartIndex] =
Size;
5098 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5099 CategoriesMap.push_back(CatInfo);
5104 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5107 using namespace llvm;
5109 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5111 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5112 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5113 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5116 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5117 reinterpret_cast<char *
>(CategoriesMap.data()),
5118 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5124void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5131 for (
auto &LPTMapEntry : LPTMap) {
5132 const FunctionDecl *FD = LPTMapEntry.first;
5133 LateParsedTemplate &LPT = *LPTMapEntry.second;
5139 for (
const auto &
Tok : LPT.
Toks) {
5147void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5150 AddSourceLocation(PragmaLoc,
Record);
5155void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5163void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5171void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5182 AddAlignPackInfo(StackEntry.Value,
Record);
5183 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5184 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5185 AddString(StackEntry.StackSlotLabel,
Record);
5191void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5201 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5202 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5203 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5204 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5205 AddString(StackEntry.StackSlotLabel,
Record);
5211void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5221void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5222 ModuleFileExtensionWriter &Writer) {
5227 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5229 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5230 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5231 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5232 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5233 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5234 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5240 Record.push_back(Metadata.MajorVersion);
5241 Record.push_back(Metadata.MinorVersion);
5242 Record.push_back(Metadata.BlockName.size());
5243 Record.push_back(Metadata.UserInfo.size());
5244 SmallString<64> Buffer;
5245 Buffer += Metadata.BlockName;
5246 Buffer += Metadata.UserInfo;
5247 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5256void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5271 auto &Record = *
this;
5277 Writer->isWritingStdCXXHeaderUnit())))
5278 return Record.push_back(0);
5280 Record.push_back(A->
getKind() + 1);
5284 Record.AddSourceRange(A->
getRange());
5288 Record.push_back(A->getAttributeSpellingListIndexRaw());
5291#include "clang/Serialization/AttrPCHWrite.inc"
5297 for (
const auto *A : Attrs)
5308 if (
Tok.isAnnotation()) {
5310 switch (
Tok.getKind()) {
5311 case tok::annot_pragma_loop_hint: {
5315 Record.push_back(Info->Toks.size());
5316 for (
const auto &
T : Info->Toks)
5320 case tok::annot_pragma_pack: {
5323 Record.push_back(
static_cast<unsigned>(Info->Action));
5329 case tok::annot_pragma_openmp:
5330 case tok::annot_pragma_openmp_end:
5331 case tok::annot_pragma_unused:
5332 case tok::annot_pragma_openacc:
5333 case tok::annot_pragma_openacc_end:
5334 case tok::annot_repl_input_end:
5337 llvm_unreachable(
"missing serialization code for annotation token");
5348 Record.push_back(Str.size());
5349 llvm::append_range(
Record, Str);
5354 Record.push_back(Str.size());
5355 llvm::append_range(Blob, Str);
5359 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5362 StringRef PathStr(Path.data(), Path.size());
5363 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5369 const char *PathBegin = Path.data();
5370 const char *PathPtr =
5372 if (PathPtr != PathBegin) {
5373 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5397 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5402 Record.push_back(Version.getMajor());
5403 if (std::optional<unsigned> Minor = Version.getMinor())
5404 Record.push_back(*Minor + 1);
5407 if (std::optional<unsigned> Subminor = Version.getSubminor())
5408 Record.push_back(*Subminor + 1);
5426 assert(ID < IdentifierOffsets.size());
5427 IdentifierOffsets[ID] = Offset;
5433 unsigned ID = SelectorIDs[Sel];
5434 assert(ID &&
"Unknown selector");
5437 if (ID < FirstSelectorID)
5439 SelectorOffsets[ID - FirstSelectorID] = Offset;
5445 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5446 bool IncludeTimestamps,
bool BuildingImplicitModule,
5447 bool GeneratingReducedBMI)
5448 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5449 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5450 BuildingImplicitModule(BuildingImplicitModule),
5451 GeneratingReducedBMI(GeneratingReducedBMI) {
5452 for (
const auto &Ext : Extensions) {
5453 if (
auto Writer = Ext->createExtensionWriter(*
this))
5454 ModuleFileExtensionWriters.push_back(std::move(Writer));
5461 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5462 return PP->getLangOpts();
5471 StringRef OutputFile,
Module *WritingModule,
5472 StringRef isysroot,
bool ShouldCacheASTInMemory) {
5473 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5476 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5483 Stream.Emit((
unsigned)
'C', 8);
5484 Stream.Emit((
unsigned)
'P', 8);
5485 Stream.Emit((
unsigned)
'C', 8);
5486 Stream.Emit((
unsigned)
'H', 8);
5488 WriteBlockInfoBlock();
5491 this->WritingModule = WritingModule;
5492 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5494 this->WritingModule =
nullptr;
5495 this->BaseDirectory.clear();
5499 if (ShouldCacheASTInMemory) {
5501 ModCache.getInMemoryModuleCache().addBuiltPCM(
5502 OutputFile, llvm::MemoryBuffer::getMemBufferCopy(
5503 StringRef(Buffer.begin(), Buffer.size())));
5508template<
typename Vector>
5510 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5516template <
typename Vector>
5519 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5525void ASTWriter::computeNonAffectingInputFiles() {
5526 SourceManager &SrcMgr = PP->getSourceManager();
5529 IsSLocAffecting.resize(N,
true);
5530 IsSLocFileEntryAffecting.resize(N,
true);
5535 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5537 unsigned FileIDAdjustment = 0;
5538 unsigned OffsetAdjustment = 0;
5540 NonAffectingFileIDAdjustments.reserve(N);
5541 NonAffectingOffsetAdjustments.reserve(N);
5543 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5544 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5546 for (
unsigned I = 1; I != N; ++I) {
5548 FileID FID = FileID::get(I);
5555 if (!
Cache->OrigEntry)
5563 if (!AffectingModuleMaps)
5567 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5570 IsSLocAffecting[I] =
false;
5571 IsSLocFileEntryAffecting[I] =
5572 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5574 FileIDAdjustment += 1;
5580 if (!NonAffectingFileIDs.empty() &&
5581 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5582 NonAffectingFileIDs.back() = FID;
5584 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5585 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5589 NonAffectingFileIDs.push_back(FID);
5592 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5593 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5596 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5599 FileManager &FileMgr = PP->getFileManager();
5602 for (StringRef Path :
5603 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5605 for (
unsigned I = 1; I != N; ++I) {
5606 if (IsSLocAffecting[I]) {
5612 if (!
Cache->OrigEntry)
5615 Cache->OrigEntry->getNameAsRequested());
5621void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5622 ASTContext &Context = SemaRef.
Context;
5624 bool isModule = WritingModule !=
nullptr;
5631 PredefinedDecls.insert(D);
5639 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5643 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5647 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5654 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5656 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5658#define BuiltinTemplate(BTName) \
5659 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5660#include "clang/Basic/BuiltinTemplates.inc"
5672 if (GeneratingReducedBMI) {
5698 if (GeneratingReducedBMI)
5720 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5731 "There are local ones at end of translation unit!");
5749 for (
const auto &I : SemaRef.KnownNamespaces)
5754 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5762 for (
const auto &DeleteExprsInfo :
5769 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5771 DeclsToEmitEvenIfUnreferenced.clear();
5776 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5778 const IdentifierInfo *II =
ID.second;
5784 llvm::sort(IIs, llvm::deref<std::less<>>());
5786 for (
const IdentifierInfo *II : IIs)
5797 for (CXXRecordDecl *RD : PendingEmittingVTables)
5800 PendingEmittingVTables.clear();
5803void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5804 ASTContext &Context = SemaRef.
Context;
5806 bool isModule = WritingModule !=
nullptr;
5809 if (!EagerlyDeserializedDecls.empty())
5812 if (!ModularCodegenDecls.empty())
5818 TentativeDefinitions);
5819 if (!TentativeDefinitions.empty())
5826 UnusedFileScopedDecls);
5827 if (!UnusedFileScopedDecls.empty())
5833 if (!ExtVectorDecls.empty())
5839 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5840 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5855 if (!UnusedLocalTypedefNameCandidates.empty())
5857 UnusedLocalTypedefNameCandidates);
5859 if (!GeneratingReducedBMI) {
5869 if (!PendingInstantiations.empty())
5873 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
5887 if (!SemaDeclRefs.empty())
5895 if (!DeclsToCheckForDeferredDiags.empty())
5897 DeclsToCheckForDeferredDiags);
5904 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
5905 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
5906 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
5907 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
5915 DelegatingCtorDecls);
5916 if (!DelegatingCtorDecls.empty())
5921 for (
const auto &I : SemaRef.KnownNamespaces) {
5925 if (!KnownNamespaces.empty())
5930 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5939 if (!UndefinedButUsed.empty())
5946 for (
const auto &DeleteExprsInfo :
5951 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
5952 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
5953 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
5955 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
5959 if (!DeleteExprsToAnalyze.empty())
5963 for (CXXRecordDecl *RD : PendingEmittingVTables) {
5970 if (!VTablesToEmit.empty())
5976 using namespace llvm;
5978 bool isModule = WritingModule !=
nullptr;
5982 Chain->finalizeForWriting();
5986 computeNonAffectingInputFiles();
5988 writeUnhashedControlBlock(*PP);
6001 IdentifierIDs.clear();
6012 SmallVector<const IdentifierInfo *, 128> IIs;
6013 for (
const auto &ID : PP->getIdentifierTable())
6014 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6015 IIs.push_back(
ID.second);
6018 llvm::sort(IIs, llvm::deref<std::less<>>());
6019 for (
const IdentifierInfo *II : IIs)
6027 for (
const auto &WeakUndeclaredIdentifierList :
6029 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6030 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6041 ASTContext &Context = SemaPtr->
Context;
6046 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6047 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6048 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6053 PrepareWritingSpecialDecls(*SemaPtr);
6056 WriteControlBlock(*PP, isysroot);
6059 Stream.FlushToWord();
6060 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6062 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6079 llvm::SmallVector<Selector, 256> AllSelectors;
6080 for (
auto &SelectorAndID : SelectorIDs)
6081 AllSelectors.push_back(SelectorAndID.first);
6082 for (
auto &Selector : AllSelectors)
6106 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6108 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6109 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6110 SmallString<2048> Buffer;
6112 llvm::raw_svector_ostream
Out(Buffer);
6113 for (ModuleFile &M : Chain->ModuleMgr) {
6114 using namespace llvm::support;
6116 endian::Writer
LE(Out, llvm::endianness::little);
6117 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6119 LE.write<uint16_t>(Name.size());
6120 Out.write(Name.data(), Name.size());
6126 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6127 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6141 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6142 Buffer.data(), Buffer.size());
6146 WriteDeclAndTypes(SemaPtr->
Context);
6148 WriteFileDeclIDsMap();
6149 WriteSourceManagerBlock(PP->getSourceManager());
6151 WriteComments(SemaPtr->
Context);
6152 WritePreprocessor(*PP, isModule);
6153 WriteHeaderSearch(PP->getHeaderSearchInfo());
6155 WriteSelectors(*SemaPtr);
6156 WriteReferencedSelectorsPool(*SemaPtr);
6157 WriteLateParsedTemplates(*SemaPtr);
6159 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6162 WriteOpenCLExtensions(*SemaPtr);
6163 WriteCUDAPragmas(*SemaPtr);
6164 WriteRISCVIntrinsicPragmas(*SemaPtr);
6169 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6174 WriteSpecialDeclRecords(*SemaPtr);
6177 if (!WeakUndeclaredIdentifiers.empty())
6179 WeakUndeclaredIdentifiers);
6181 if (!WritingModule) {
6186 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6188 llvm::SmallVector<ModuleInfo, 64> Imports;
6191 assert(SubmoduleIDs.contains(I->getImportedModule()));
6192 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6193 I->getImportedModule()));
6197 if (!Imports.empty()) {
6198 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6201 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6202 return A.ID == B.ID;
6206 llvm::sort(Imports, Cmp);
6207 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6210 for (
const auto &Import : Imports) {
6211 ImportedModules.push_back(
Import.ID);
6222 WriteObjCCategories();
6224 if (!WritingModule) {
6225 WriteOptimizePragmaOptions(*SemaPtr);
6226 WriteMSStructPragmaOptions(*SemaPtr);
6227 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6229 WritePackPragmaOptions(*SemaPtr);
6230 WriteFloatControlPragmaOptions(*SemaPtr);
6231 WriteDeclsWithEffectsToVerify(*SemaPtr);
6235 RecordData::value_type
Record[] = {NumStatements,
6237 NumLexicalDeclContexts,
6238 NumVisibleDeclContexts,
6239 NumModuleLocalDeclContexts,
6240 NumTULocalDeclContexts};
6243 Stream.FlushToWord();
6244 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6248 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6249 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6251 return backpatchSignature();
6257 if (GeneratingReducedBMI)
6258 DeclUpdatesFromGMF.swap(DeclUpdates);
6264void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6268 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6270void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6274 DeclUpdates[D].push_back(
6275 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6284 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6287 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6291void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6296 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6300 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6301 while (!DeclTypesToEmit.empty()) {
6302 DeclOrType DOT = DeclTypesToEmit.front();
6303 DeclTypesToEmit.pop();
6305 WriteType(Context, DOT.getType());
6307 WriteDecl(Context, DOT.getDecl());
6309 }
while (!DeclUpdates.empty());
6311 DoneWritingDeclsAndTypes =
true;
6315 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6317 for (NamespaceDecl *NS : DelayedNamespace) {
6318 LookupBlockOffsets Offsets;
6320 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6321 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6342 assert(DeclTypesToEmit.empty());
6343 assert(DeclUpdates.empty());
6348 WriteTypeDeclOffsets();
6349 if (!DeclUpdatesOffsetsRecord.empty())
6352 if (!DelayedNamespaceRecord.empty())
6354 DelayedNamespaceRecord);
6356 if (!RelatedDeclsMap.empty()) {
6360 for (
const auto &Pair : RelatedDeclsMap) {
6361 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6362 RelatedDeclsMapRecord.push_back(Pair.second.size());
6363 for (
const auto &Lambda : Pair.second)
6364 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6367 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6369 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6370 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6371 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6373 FunctionToLambdaMapAbbrev);
6376 if (!SpecializationsUpdates.empty()) {
6377 WriteSpecializationsUpdates(
false);
6378 SpecializationsUpdates.clear();
6381 if (!PartialSpecializationsUpdates.empty()) {
6382 WriteSpecializationsUpdates(
true);
6383 PartialSpecializationsUpdates.clear();
6389 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6398 NewGlobalKindDeclPairs.push_back(D->
getKind());
6399 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6402 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6404 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6405 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6408 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6409 bytes(NewGlobalKindDeclPairs));
6411 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6413 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6414 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6415 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6417 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6419 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6420 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6421 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6423 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6425 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6426 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6427 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6430 WriteDeclContextVisibleUpdate(Context, TU);
6433 if (Context.ExternCContext)
6434 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6437 for (
auto *DC : UpdatedDeclContexts)
6438 WriteDeclContextVisibleUpdate(Context, DC);
6441void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6445 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6446 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6447 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6448 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6449 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6452 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6453 for (
auto &SpecializationUpdate : SpecUpdates) {
6454 const NamedDecl *D = SpecializationUpdate.first;
6456 llvm::SmallString<4096> LookupTable;
6457 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6458 LookupTable, IsPartial);
6461 RecordData::value_type
Record[] = {
6462 static_cast<RecordData::value_type
>(RecordType),
6464 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6468void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6469 RecordDataImpl &OffsetsRecord) {
6470 if (DeclUpdates.empty())
6473 DeclUpdateMap LocalUpdates;
6474 LocalUpdates.swap(DeclUpdates);
6476 for (
auto &DeclUpdate : LocalUpdates) {
6477 const Decl *D = DeclUpdate.first;
6479 bool HasUpdatedBody =
false;
6480 bool HasAddedVarDefinition =
false;
6483 for (
auto &
Update : DeclUpdate.second) {
6488 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6489 HasUpdatedBody =
true;
6490 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6491 HasAddedVarDefinition =
true;
6493 Record.push_back(llvm::to_underlying(Kind));
6496 case DeclUpdateKind::CXXAddedImplicitMember:
6497 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6498 assert(
Update.getDecl() &&
"no decl to add?");
6501 case DeclUpdateKind::CXXAddedFunctionDefinition:
6502 case DeclUpdateKind::CXXAddedVarDefinition:
6505 case DeclUpdateKind::CXXPointOfInstantiation:
6510 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6515 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6520 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6522 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6523 Record.push_back(RD->isParamDestroyedInCallee());
6524 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6525 Record.AddCXXDefinitionData(RD);
6526 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6531 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6532 Record.push_back(MSInfo->getTemplateSpecializationKind());
6533 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6536 Record.push_back(Spec->getTemplateSpecializationKind());
6537 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6541 auto From = Spec->getInstantiatedFrom();
6542 if (
auto PartialSpec =
6543 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6545 Record.AddDeclRef(PartialSpec);
6546 Record.AddTemplateArgumentList(
6547 &Spec->getTemplateInstantiationArgs());
6552 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6553 Record.AddSourceLocation(RD->getLocation());
6554 Record.AddSourceLocation(RD->getBeginLoc());
6555 Record.AddSourceRange(RD->getBraceRange());
6566 case DeclUpdateKind::CXXResolvedDtorDelete:
6571 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6575 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6579 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6583 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6586 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6590 case DeclUpdateKind::CXXDeducedReturnType:
6594 case DeclUpdateKind::DeclMarkedUsed:
6597 case DeclUpdateKind::ManglingNumber:
6598 case DeclUpdateKind::StaticLocalNumber:
6602 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6604 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6607 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6608 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6609 Record.push_back(A->getAllocatorType());
6610 Record.AddStmt(A->getAllocator());
6611 Record.AddStmt(A->getAlignment());
6612 Record.AddSourceRange(A->getRange());
6616 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6617 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6619 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6622 case DeclUpdateKind::DeclExported:
6626 case DeclUpdateKind::AddedAttrToRecord:
6627 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6635 if (HasUpdatedBody) {
6638 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6639 Record.push_back(Def->isInlined());
6640 Record.AddSourceLocation(Def->getInnerLocStart());
6641 Record.AddFunctionDefinition(Def);
6642 }
else if (HasAddedVarDefinition) {
6645 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6646 Record.push_back(VD->isInline());
6647 Record.push_back(VD->isInlineSpecified());
6648 Record.AddVarDeclInit(VD);
6665 NonAffectingFileIDs.empty())
6667 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6668 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6669 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6670 return FileID::get(FID.getOpaqueValue() - Offset);
6673unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6679 unsigned AdjustedNumCreatedFIDs = 0;
6680 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6681 if (IsSLocAffecting[I])
6682 ++AdjustedNumCreatedFIDs;
6683 return AdjustedNumCreatedFIDs;
6693 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6694 getAdjustedLocation(
Range.getEnd()));
6699 return Offset - getAdjustment(Offset);
6704 if (NonAffectingRanges.empty())
6707 if (PP->getSourceManager().isLoadedOffset(Offset))
6710 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6711 return NonAffectingOffsetAdjustments.back();
6713 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6717 return Range.getEnd().getOffset() < Offset;
6720 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6721 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6722 return NonAffectingOffsetAdjustments[Idx];
6726 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6732 unsigned ModuleFileIndex = 0;
6735 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6738 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6739 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6740 "Corrupted global sloc offset map");
6745 ModuleFileIndex = F->
Index + 1;
6753 Loc = getAdjustedLocation(Loc);
6790 MacroInfoToEmitData Info = { Name, MI, ID };
6791 MacroInfosToEmit.push_back(Info);
6797 return IdentMacroDirectivesOffsetMap.lookup(Name);
6801 Record->push_back(Writer->getSelectorRef(SelRef));
6810 if (SID == 0 && Chain) {
6813 Chain->LoadSelector(Sel);
6814 SID = SelectorIDs[Sel];
6817 SID = NextSelectorID++;
6818 SelectorIDs[Sel] = SID;
6860 bool InfoHasSameExpr
6862 Record->push_back(InfoHasSameExpr);
6863 if (InfoHasSameExpr)
6880 TypeLocWriter TLW(*
this);
6890template <
typename IdxForTypeTy>
6892 IdxForTypeTy IdxForType) {
6896 unsigned FastQuals =
T.getLocalFastQualifiers();
6897 T.removeLocalFastQualifiers();
6899 if (
T.hasLocalNonFastQualifiers())
6900 return IdxForType(
T).asTypeID(FastQuals);
6902 assert(!
T.hasLocalQualifiers());
6904 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr()))
6907 if (
T == Context.AutoDeductTy)
6909 if (
T == Context.AutoRRefDeductTy)
6912 return IdxForType(
T).asTypeID(FastQuals);
6919 assert(!
T.getLocalFastQualifiers());
6923 if (DoneWritingDeclsAndTypes) {
6924 assert(0 &&
"New type seen after serializing all the types to emit!");
6930 Idx =
TypeIdx(0, NextTypeID++);
6931 DeclTypesToEmit.push(
T);
6937llvm::MapVector<ModuleFile *, const Decl *>
6939 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
6942 if (R->isFromASTFile())
6943 Firsts[Chain->getOwningModuleFile(R)] = R;
6944 else if (IncludeLocal)
6945 Firsts[
nullptr] = R;
6961 Record.push_back(MacroRef >> 32);
6962 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
6977 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
6984 if (
auto *Iter = DeclUpdatesFromGMF.find(D);
6985 Iter != DeclUpdatesFromGMF.end()) {
6986 for (DeclUpdate &
Update : Iter->second)
6987 DeclUpdates[D].push_back(
Update);
6988 DeclUpdatesFromGMF.erase(Iter);
7000 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7002 if (ID.isInvalid()) {
7003 if (DoneWritingDeclsAndTypes) {
7004 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7011 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7026 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7033 assert(DoneWritingDeclsAndTypes &&
7034 "wasDeclEmitted should only be called after writing declarations");
7039 bool Emitted = DeclIDs.contains(D);
7041 GeneratingReducedBMI) &&
7042 "The declaration within modules can only be omitted in reduced BMI.");
7047 assert(ID.isValid());
7066 assert(
SM.isLocalSourceLocation(FileLoc));
7067 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7070 assert(
SM.getSLocEntry(FID).isFile());
7071 assert(IsSLocAffecting[FID.ID]);
7073 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7075 Info = std::make_unique<DeclIDInFileInfo>();
7077 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7078 LocDeclIDsTy &Decls = Info->DeclIDs;
7079 Decls.push_back(LocDecl);
7084 "expected an anonymous declaration");
7088 auto It = AnonymousDeclarationNumbers.find(D);
7089 if (It == AnonymousDeclarationNumbers.end()) {
7092 AnonymousDeclarationNumbers[ND] = Number;
7095 It = AnonymousDeclarationNumbers.find(D);
7096 assert(It != AnonymousDeclarationNumbers.end() &&
7097 "declaration not found within its lexical context");
7152 while (QualifierLoc) {
7153 NestedNames.push_back(QualifierLoc);
7157 Record->push_back(NestedNames.size());
7158 while(!NestedNames.empty()) {
7159 QualifierLoc = NestedNames.pop_back_val();
7162 Record->push_back(llvm::to_underlying(Kind));
7165 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7187 llvm_unreachable(
"unexpected null nested name specifier");
7194 assert(TemplateParams &&
"No TemplateParams!");
7199 Record->push_back(TemplateParams->
size());
7200 for (
const auto &P : *TemplateParams)
7203 Record->push_back(
true);
7206 Record->push_back(
false);
7213 assert(TemplateArgs &&
"No TemplateArgs!");
7214 Record->push_back(TemplateArgs->
size());
7215 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7221 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7231 Record->push_back(
Set.size());
7233 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7235 Record->push_back(I.getAccess());
7241 Record->push_back(
Base.isVirtual());
7242 Record->push_back(
Base.isBaseOfClass());
7243 Record->push_back(
Base.getAccessSpecifierAsWritten());
7244 Record->push_back(
Base.getInheritConstructors());
7257 for (
auto &
Base : Bases)
7275 for (
auto *
Init : CtorInits) {
7276 if (
Init->isBaseInitializer()) {
7280 }
else if (
Init->isDelegatingInitializer()) {
7283 }
else if (
Init->isMemberInitializer()){
7296 if (
Init->isWritten())
7310 auto &
Data = D->data();
7312 Record->push_back(
Data.IsLambda);
7316#define FIELD(Name, Width, Merge) \
7317 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7318 Record->push_back(DefinitionBits); \
7319 DefinitionBits.reset(0); \
7321 DefinitionBits.addBits(Data.Name, Width);
7323#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7326 Record->push_back(DefinitionBits);
7332 bool ModulesCodegen =
7337 Record->push_back(ModulesCodegen);
7339 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7344 Record->push_back(
Data.ComputedVisibleConversions);
7345 if (
Data.ComputedVisibleConversions)
7349 if (!
Data.IsLambda) {
7350 Record->push_back(
Data.NumBases);
7351 if (
Data.NumBases > 0)
7355 Record->push_back(
Data.NumVBases);
7356 if (
Data.NumVBases > 0)
7361 auto &Lambda = D->getLambdaData();
7364 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7365 LambdaBits.
addBit(Lambda.IsGenericLambda);
7366 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7367 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7368 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7369 Record->push_back(LambdaBits);
7371 Record->push_back(Lambda.NumExplicitCaptures);
7372 Record->push_back(Lambda.ManglingNumber);
7377 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7384 Record->push_back(CaptureBits);
7386 switch (
Capture.getCaptureKind()) {
7416 assert(ES->CheckedForSideEffects);
7417 Val |= (ES->HasConstantInitialization ? 2 : 0);
7418 Val |= (ES->HasConstantDestruction ? 4 : 0);
7432void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7433 assert(Reader &&
"Cannot remove chain");
7434 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7435 assert(FirstDeclID == NextDeclID &&
7436 FirstTypeID == NextTypeID &&
7437 FirstIdentID == NextIdentID &&
7438 FirstMacroID == NextMacroID &&
7439 FirstSubmoduleID == NextSubmoduleID &&
7440 FirstSelectorID == NextSelectorID &&
7441 "Setting chain after writing has started.");
7447 NextSelectorID = FirstSelectorID;
7448 NextSubmoduleID = FirstSubmoduleID;
7458 unsigned OriginalModuleFileIndex = StoredID >> 32;
7462 if (OriginalModuleFileIndex == 0 && StoredID)
7473 MacroID &StoredID = MacroIDs[MI];
7474 unsigned OriginalModuleFileIndex = StoredID >> 32;
7477 if (OriginalModuleFileIndex == 0 && StoredID)
7486void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7498 TypeIdx &StoredIdx = TypeIdxs[
T];
7504 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7515 DeclIDs[D] = LocalDeclID(ID);
7516 PredefinedDecls.insert(D);
7528 assert(!MacroDefinitions.contains(MD));
7529 MacroDefinitions[MD] =
ID;
7533 assert(!SubmoduleIDs.contains(Mod));
7534 SubmoduleIDs[Mod] =
ID;
7537void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7538 if (Chain && Chain->isProcessingUpdateRecords())
return;
7540 assert(!WritingAST &&
"Already writing the AST!");
7541 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7543 if (RD->isFromASTFile()) {
7548 "completed a tag from another module but not by instantiation?");
7549 DeclUpdates[RD].push_back(
7550 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7564void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7565 if (Chain && Chain->isProcessingUpdateRecords())
return;
7567 "Should not add lookup results to non-lookup contexts!");
7588 assert(!WritingAST &&
"Already writing the AST!");
7589 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7593 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7595 DeclsToEmitEvenIfUnreferenced.push_back(D);
7599 if (Chain && Chain->isProcessingUpdateRecords())
return;
7612 assert(!WritingAST &&
"Already writing the AST!");
7613 DeclUpdates[RD].push_back(
7614 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7617void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7618 if (Chain && Chain->isProcessingUpdateRecords())
return;
7619 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7621 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7626 ->castAs<FunctionProtoType>()
7627 ->getExceptionSpecType()))
7628 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7633 if (Chain && Chain->isProcessingUpdateRecords())
return;
7634 assert(!WritingAST &&
"Already writing the AST!");
7636 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7637 DeclUpdates[D].push_back(
7638 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7645 if (Chain && Chain->isProcessingUpdateRecords())
return;
7646 assert(!WritingAST &&
"Already writing the AST!");
7647 assert(
Delete &&
"Not given an operator delete");
7649 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7650 DeclUpdates[D].push_back(
7651 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7657 if (Chain && Chain->isProcessingUpdateRecords())
7659 assert(!WritingAST &&
"Already writing the AST!");
7660 assert(GlobDelete &&
"Not given an operator delete");
7663 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7664 DeclUpdates[D].push_back(
7665 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7671 if (Chain && Chain->isProcessingUpdateRecords())
7673 assert(!WritingAST &&
"Already writing the AST!");
7674 assert(ArrayDelete &&
"Not given an operator delete");
7677 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7678 DeclUpdates[D].push_back(
7679 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7683void ASTWriter::ResolvedOperatorGlobArrayDelete(
7685 if (Chain && Chain->isProcessingUpdateRecords())
7687 assert(!WritingAST &&
"Already writing the AST!");
7688 assert(GlobArrayDelete &&
"Not given an operator delete");
7691 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7692 DeclUpdates[D].push_back(DeclUpdate(
7693 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7697void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7698 if (Chain && Chain->isProcessingUpdateRecords())
return;
7699 assert(!WritingAST &&
"Already writing the AST!");
7708 DeclUpdates[D].push_back(
7709 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7712void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7713 if (Chain && Chain->isProcessingUpdateRecords())
return;
7714 assert(!WritingAST &&
"Already writing the AST!");
7718 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7721void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7722 if (Chain && Chain->isProcessingUpdateRecords())
return;
7723 assert(!WritingAST &&
"Already writing the AST!");
7731 DeclUpdates[D].push_back(
7732 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7735void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7736 if (Chain && Chain->isProcessingUpdateRecords())
return;
7737 assert(!WritingAST &&
"Already writing the AST!");
7744 if (
auto *VD = dyn_cast<VarDecl>(D))
7745 POI = VD->getPointOfInstantiation();
7748 DeclUpdates[D].push_back(
7749 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7752void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7753 if (Chain && Chain->isProcessingUpdateRecords())
return;
7754 assert(!WritingAST &&
"Already writing the AST!");
7758 DeclUpdates[D].push_back(
7759 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7762void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7763 assert(!WritingAST &&
"Already writing the AST!");
7767 DeclUpdates[D].push_back(
7768 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7773 if (Chain && Chain->isProcessingUpdateRecords())
return;
7774 assert(!WritingAST &&
"Already writing the AST!");
7778 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7779 ObjCClassesWithCategories.insert(
7783void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7784 if (Chain && Chain->isProcessingUpdateRecords())
return;
7785 assert(!WritingAST &&
"Already writing the AST!");
7794 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7797void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7798 if (Chain && Chain->isProcessingUpdateRecords())
return;
7799 assert(!WritingAST &&
"Already writing the AST!");
7803 DeclUpdates[D].push_back(
7804 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7807void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7808 if (Chain && Chain->isProcessingUpdateRecords())
return;
7809 assert(!WritingAST &&
"Already writing the AST!");
7813 DeclUpdates[D].push_back(
7814 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7817void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7819 if (Chain && Chain->isProcessingUpdateRecords())
return;
7820 assert(!WritingAST &&
"Already writing the AST!");
7824 DeclUpdates[D].push_back(
7825 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7828void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7829 if (Chain && Chain->isProcessingUpdateRecords())
return;
7830 assert(!WritingAST &&
"Already writing the AST!");
7832 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7835void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7837 if (Chain && Chain->isProcessingUpdateRecords())
return;
7838 assert(!WritingAST &&
"Already writing the AST!");
7839 if (!
Record->isFromASTFile())
7841 DeclUpdates[
Record].push_back(
7842 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7845void ASTWriter::AddedCXXTemplateSpecialization(
7847 assert(!WritingAST &&
"Already writing the AST!");
7851 if (Chain && Chain->isProcessingUpdateRecords())
7854 DeclsToEmitEvenIfUnreferenced.push_back(D);
7857void ASTWriter::AddedCXXTemplateSpecialization(
7859 assert(!WritingAST &&
"Already writing the AST!");
7863 if (Chain && Chain->isProcessingUpdateRecords())
7866 DeclsToEmitEvenIfUnreferenced.push_back(D);
7871 assert(!WritingAST &&
"Already writing the AST!");
7875 if (Chain && Chain->isProcessingUpdateRecords())
7878 DeclsToEmitEvenIfUnreferenced.push_back(D);
7887class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
7892#define GEN_CLANG_CLAUSE_CLASS
7893#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
7894#include "llvm/Frontend/OpenMP/OMP.inc"
7903 OMPClauseWriter(*this).writeClause(
C);
7906void OMPClauseWriter::writeClause(
OMPClause *
C) {
7907 Record.push_back(
unsigned(
C->getClauseKind()));
7909 Record.AddSourceLocation(
C->getBeginLoc());
7910 Record.AddSourceLocation(
C->getEndLoc());
7914 Record.push_back(uint64_t(
C->getCaptureRegion()));
7915 Record.AddStmt(
C->getPreInitStmt());
7919 VisitOMPClauseWithPreInit(
C);
7920 Record.AddStmt(
C->getPostUpdateExpr());
7923void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
7924 VisitOMPClauseWithPreInit(
C);
7926 Record.AddSourceLocation(
C->getNameModifierLoc());
7927 Record.AddSourceLocation(
C->getColonLoc());
7928 Record.AddStmt(
C->getCondition());
7929 Record.AddSourceLocation(
C->getLParenLoc());
7933 VisitOMPClauseWithPreInit(
C);
7934 Record.AddStmt(
C->getCondition());
7935 Record.AddSourceLocation(
C->getLParenLoc());
7939 VisitOMPClauseWithPreInit(
C);
7940 Record.writeEnum(
C->getModifier());
7941 Record.AddStmt(
C->getNumThreads());
7942 Record.AddSourceLocation(
C->getModifierLoc());
7943 Record.AddSourceLocation(
C->getLParenLoc());
7947 Record.AddStmt(
C->getSafelen());
7948 Record.AddSourceLocation(
C->getLParenLoc());
7952 Record.AddStmt(
C->getSimdlen());
7953 Record.AddSourceLocation(
C->getLParenLoc());
7957 Record.push_back(
C->getNumSizes());
7958 for (
Expr *Size :
C->getSizesRefs())
7960 Record.AddSourceLocation(
C->getLParenLoc());
7964 Record.push_back(
C->getNumLoops());
7965 for (
Expr *Size :
C->getArgsRefs())
7967 Record.AddSourceLocation(
C->getLParenLoc());
7973 Record.AddStmt(
C->getFactor());
7974 Record.AddSourceLocation(
C->getLParenLoc());
7978 Record.AddStmt(
C->getFirst());
7979 Record.AddStmt(
C->getCount());
7980 Record.AddSourceLocation(
C->getLParenLoc());
7981 Record.AddSourceLocation(
C->getFirstLoc());
7982 Record.AddSourceLocation(
C->getCountLoc());
7986 Record.AddStmt(
C->getAllocator());
7987 Record.AddSourceLocation(
C->getLParenLoc());
7991 Record.AddStmt(
C->getNumForLoops());
7992 Record.AddSourceLocation(
C->getLParenLoc());
7995void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
7996 Record.AddStmt(
C->getEventHandler());
7997 Record.AddSourceLocation(
C->getLParenLoc());
8001 Record.push_back(
unsigned(
C->getDefaultKind()));
8002 Record.AddSourceLocation(
C->getLParenLoc());
8003 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8004 Record.push_back(
unsigned(
C->getDefaultVC()));
8005 Record.AddSourceLocation(
C->getDefaultVCLoc());
8009 Record.AddSourceLocation(
C->getLParenLoc());
8010 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8011 Record.writeEnum(
C->getThreadsetKind());
8014void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8015 Record.AddSourceLocation(
C->getLParenLoc());
8016 Record.AddStmt(
C->getImpexType());
8019void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8020 Record.push_back(
unsigned(
C->getProcBindKind()));
8021 Record.AddSourceLocation(
C->getLParenLoc());
8022 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8025void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8026 VisitOMPClauseWithPreInit(
C);
8027 Record.push_back(
C->getScheduleKind());
8028 Record.push_back(
C->getFirstScheduleModifier());
8029 Record.push_back(
C->getSecondScheduleModifier());
8030 Record.AddStmt(
C->getChunkSize());
8031 Record.AddSourceLocation(
C->getLParenLoc());
8032 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8033 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8034 Record.AddSourceLocation(
C->getScheduleKindLoc());
8035 Record.AddSourceLocation(
C->getCommaLoc());
8038void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8039 Record.push_back(
C->getLoopNumIterations().size());
8040 Record.AddStmt(
C->getNumForLoops());
8041 for (
Expr *NumIter :
C->getLoopNumIterations())
8043 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8044 Record.AddStmt(
C->getLoopCounter(I));
8045 Record.AddSourceLocation(
C->getLParenLoc());
8048void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8049 Record.AddStmt(
C->getCondition());
8050 Record.AddSourceLocation(
C->getLParenLoc());
8053void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8055void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8057void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8059void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8061void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *
C) {
8062 Record.push_back(
C->isExtended() ? 1 : 0);
8063 if (
C->isExtended()) {
8064 Record.AddSourceLocation(
C->getLParenLoc());
8065 Record.AddSourceLocation(
C->getArgumentLoc());
8066 Record.writeEnum(
C->getDependencyKind());
8070void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8072void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8075void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8076 Record.AddSourceLocation(
C->getLParenLoc());
8077 Record.AddSourceLocation(
C->getFailParameterLoc());
8078 Record.writeEnum(
C->getFailParameter());
8081void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8083void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8085void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8086 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8087 Record.AddSourceLocation(
C->getLParenLoc());
8088 for (
auto K :
C->getDirectiveKinds()) {
8093void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8095 Record.AddSourceLocation(
C->getLParenLoc());
8098void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8099 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8100 Record.AddSourceLocation(
C->getLParenLoc());
8101 for (
auto K :
C->getDirectiveKinds()) {
8106void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8108void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8109 OMPNoOpenMPRoutinesClause *) {}
8111void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8112 OMPNoOpenMPConstructsClause *) {}
8114void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8116void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8118void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8120void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8122void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8124void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8126void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8128void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8130void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8131 Record.push_back(
C->varlist_size());
8134 Record.writeBool(
C->getIsTarget());
8135 Record.writeBool(
C->getIsTargetSync());
8136 Record.AddSourceLocation(
C->getLParenLoc());
8137 Record.AddSourceLocation(
C->getVarLoc());
8140void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8141 Record.AddStmt(
C->getInteropVar());
8142 Record.AddSourceLocation(
C->getLParenLoc());
8143 Record.AddSourceLocation(
C->getVarLoc());
8146void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8147 Record.AddStmt(
C->getInteropVar());
8148 Record.AddSourceLocation(
C->getLParenLoc());
8149 Record.AddSourceLocation(
C->getVarLoc());
8152void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8153 VisitOMPClauseWithPreInit(
C);
8154 Record.AddStmt(
C->getCondition());
8155 Record.AddSourceLocation(
C->getLParenLoc());
8158void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8159 VisitOMPClauseWithPreInit(
C);
8160 Record.AddStmt(
C->getCondition());
8161 Record.AddSourceLocation(
C->getLParenLoc());
8164void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8165 VisitOMPClauseWithPreInit(
C);
8166 Record.AddStmt(
C->getThreadID());
8167 Record.AddSourceLocation(
C->getLParenLoc());
8171 Record.AddStmt(
C->getAlignment());
8172 Record.AddSourceLocation(
C->getLParenLoc());
8175void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8176 Record.push_back(
C->varlist_size());
8177 Record.AddSourceLocation(
C->getLParenLoc());
8178 for (
auto *
VE :
C->varlist()) {
8181 for (
auto *
VE :
C->private_copies()) {
8186void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8187 Record.push_back(
C->varlist_size());
8188 VisitOMPClauseWithPreInit(
C);
8189 Record.AddSourceLocation(
C->getLParenLoc());
8190 for (
auto *
VE :
C->varlist()) {
8193 for (
auto *
VE :
C->private_copies()) {
8196 for (
auto *
VE :
C->inits()) {
8201void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8202 Record.push_back(
C->varlist_size());
8203 VisitOMPClauseWithPostUpdate(
C);
8204 Record.AddSourceLocation(
C->getLParenLoc());
8205 Record.writeEnum(
C->getKind());
8206 Record.AddSourceLocation(
C->getKindLoc());
8207 Record.AddSourceLocation(
C->getColonLoc());
8208 for (
auto *
VE :
C->varlist())
8210 for (
auto *E :
C->private_copies())
8212 for (
auto *E :
C->source_exprs())
8214 for (
auto *E :
C->destination_exprs())
8216 for (
auto *E :
C->assignment_ops())
8220void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8221 Record.push_back(
C->varlist_size());
8222 Record.AddSourceLocation(
C->getLParenLoc());
8223 for (
auto *
VE :
C->varlist())
8227void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8228 Record.push_back(
C->varlist_size());
8229 Record.writeEnum(
C->getModifier());
8230 VisitOMPClauseWithPostUpdate(
C);
8231 Record.AddSourceLocation(
C->getLParenLoc());
8232 Record.AddSourceLocation(
C->getModifierLoc());
8233 Record.AddSourceLocation(
C->getColonLoc());
8234 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8235 Record.AddDeclarationNameInfo(
C->getNameInfo());
8236 for (
auto *
VE :
C->varlist())
8238 for (
auto *
VE :
C->privates())
8240 for (
auto *E :
C->lhs_exprs())
8242 for (
auto *E :
C->rhs_exprs())
8244 for (
auto *E :
C->reduction_ops())
8246 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8247 for (
auto *E :
C->copy_ops())
8249 for (
auto *E :
C->copy_array_temps())
8251 for (
auto *E :
C->copy_array_elems())
8254 auto PrivateFlags =
C->private_var_reduction_flags();
8255 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8256 for (
bool Flag : PrivateFlags)
8260void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8261 Record.push_back(
C->varlist_size());
8262 VisitOMPClauseWithPostUpdate(
C);
8263 Record.AddSourceLocation(
C->getLParenLoc());
8264 Record.AddSourceLocation(
C->getColonLoc());
8265 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8266 Record.AddDeclarationNameInfo(
C->getNameInfo());
8267 for (
auto *
VE :
C->varlist())
8269 for (
auto *
VE :
C->privates())
8271 for (
auto *E :
C->lhs_exprs())
8273 for (
auto *E :
C->rhs_exprs())
8275 for (
auto *E :
C->reduction_ops())
8279void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8280 Record.push_back(
C->varlist_size());
8281 VisitOMPClauseWithPostUpdate(
C);
8282 Record.AddSourceLocation(
C->getLParenLoc());
8283 Record.AddSourceLocation(
C->getColonLoc());
8284 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8285 Record.AddDeclarationNameInfo(
C->getNameInfo());
8286 for (
auto *
VE :
C->varlist())
8288 for (
auto *
VE :
C->privates())
8290 for (
auto *E :
C->lhs_exprs())
8292 for (
auto *E :
C->rhs_exprs())
8294 for (
auto *E :
C->reduction_ops())
8296 for (
auto *E :
C->taskgroup_descriptors())
8300void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8301 Record.push_back(
C->varlist_size());
8302 VisitOMPClauseWithPostUpdate(
C);
8303 Record.AddSourceLocation(
C->getLParenLoc());
8304 Record.AddSourceLocation(
C->getColonLoc());
8305 Record.push_back(
C->getModifier());
8306 Record.AddSourceLocation(
C->getModifierLoc());
8307 for (
auto *
VE :
C->varlist()) {
8310 for (
auto *
VE :
C->privates()) {
8313 for (
auto *
VE :
C->inits()) {
8316 for (
auto *
VE :
C->updates()) {
8319 for (
auto *
VE :
C->finals()) {
8323 Record.AddStmt(
C->getCalcStep());
8324 for (
auto *
VE :
C->used_expressions())
8328void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8329 Record.push_back(
C->varlist_size());
8330 Record.AddSourceLocation(
C->getLParenLoc());
8331 Record.AddSourceLocation(
C->getColonLoc());
8332 for (
auto *
VE :
C->varlist())
8334 Record.AddStmt(
C->getAlignment());
8337void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8338 Record.push_back(
C->varlist_size());
8339 Record.AddSourceLocation(
C->getLParenLoc());
8340 for (
auto *
VE :
C->varlist())
8342 for (
auto *E :
C->source_exprs())
8344 for (
auto *E :
C->destination_exprs())
8346 for (
auto *E :
C->assignment_ops())
8350void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8351 Record.push_back(
C->varlist_size());
8352 Record.AddSourceLocation(
C->getLParenLoc());
8353 for (
auto *
VE :
C->varlist())
8355 for (
auto *E :
C->source_exprs())
8357 for (
auto *E :
C->destination_exprs())
8359 for (
auto *E :
C->assignment_ops())
8363void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8364 Record.push_back(
C->varlist_size());
8365 Record.AddSourceLocation(
C->getLParenLoc());
8366 for (
auto *
VE :
C->varlist())
8370void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8371 Record.AddStmt(
C->getDepobj());
8372 Record.AddSourceLocation(
C->getLParenLoc());
8375void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8376 Record.push_back(
C->varlist_size());
8377 Record.push_back(
C->getNumLoops());
8378 Record.AddSourceLocation(
C->getLParenLoc());
8379 Record.AddStmt(
C->getModifier());
8380 Record.push_back(
C->getDependencyKind());
8381 Record.AddSourceLocation(
C->getDependencyLoc());
8382 Record.AddSourceLocation(
C->getColonLoc());
8383 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8384 for (
auto *
VE :
C->varlist())
8386 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8387 Record.AddStmt(
C->getLoopData(I));
8390void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8391 VisitOMPClauseWithPreInit(
C);
8392 Record.writeEnum(
C->getModifier());
8393 Record.AddStmt(
C->getDevice());
8394 Record.AddSourceLocation(
C->getModifierLoc());
8395 Record.AddSourceLocation(
C->getLParenLoc());
8398void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8399 Record.push_back(
C->varlist_size());
8400 Record.push_back(
C->getUniqueDeclarationsNum());
8401 Record.push_back(
C->getTotalComponentListNum());
8402 Record.push_back(
C->getTotalComponentsNum());
8403 Record.AddSourceLocation(
C->getLParenLoc());
8404 bool HasIteratorModifier =
false;
8406 Record.push_back(
C->getMapTypeModifier(I));
8407 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8408 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8409 HasIteratorModifier =
true;
8411 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8412 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8413 Record.push_back(
C->getMapType());
8414 Record.AddSourceLocation(
C->getMapLoc());
8415 Record.AddSourceLocation(
C->getColonLoc());
8416 for (
auto *E :
C->varlist())
8418 for (
auto *E :
C->mapperlists())
8420 if (HasIteratorModifier)
8421 Record.AddStmt(
C->getIteratorModifier());
8422 for (
auto *D :
C->all_decls())
8424 for (
auto N :
C->all_num_lists())
8426 for (
auto N :
C->all_lists_sizes())
8428 for (
auto &M :
C->all_components()) {
8429 Record.AddStmt(M.getAssociatedExpression());
8430 Record.AddDeclRef(M.getAssociatedDeclaration());
8435 Record.push_back(
C->varlist_size());
8436 Record.writeEnum(
C->getFirstAllocateModifier());
8437 Record.writeEnum(
C->getSecondAllocateModifier());
8438 Record.AddSourceLocation(
C->getLParenLoc());
8439 Record.AddSourceLocation(
C->getColonLoc());
8440 Record.AddStmt(
C->getAllocator());
8441 Record.AddStmt(
C->getAlignment());
8442 for (
auto *
VE :
C->varlist())
8446void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8447 Record.push_back(
C->varlist_size());
8448 VisitOMPClauseWithPreInit(
C);
8449 Record.AddSourceLocation(
C->getLParenLoc());
8450 for (
auto *
VE :
C->varlist())
8454void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8455 Record.push_back(
C->varlist_size());
8456 VisitOMPClauseWithPreInit(
C);
8457 Record.AddSourceLocation(
C->getLParenLoc());
8458 for (
auto *
VE :
C->varlist())
8462void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8463 VisitOMPClauseWithPreInit(
C);
8464 Record.AddStmt(
C->getPriority());
8465 Record.AddSourceLocation(
C->getLParenLoc());
8468void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8469 VisitOMPClauseWithPreInit(
C);
8470 Record.writeEnum(
C->getModifier());
8471 Record.AddStmt(
C->getGrainsize());
8472 Record.AddSourceLocation(
C->getModifierLoc());
8473 Record.AddSourceLocation(
C->getLParenLoc());
8476void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8477 VisitOMPClauseWithPreInit(
C);
8478 Record.writeEnum(
C->getModifier());
8479 Record.AddStmt(
C->getNumTasks());
8480 Record.AddSourceLocation(
C->getModifierLoc());
8481 Record.AddSourceLocation(
C->getLParenLoc());
8484void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8486 Record.AddSourceLocation(
C->getLParenLoc());
8489void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8490 VisitOMPClauseWithPreInit(
C);
8491 Record.push_back(
C->getDistScheduleKind());
8492 Record.AddStmt(
C->getChunkSize());
8493 Record.AddSourceLocation(
C->getLParenLoc());
8494 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8495 Record.AddSourceLocation(
C->getCommaLoc());
8498void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8499 Record.push_back(
C->getDefaultmapKind());
8500 Record.push_back(
C->getDefaultmapModifier());
8501 Record.AddSourceLocation(
C->getLParenLoc());
8502 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8503 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8506void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8507 Record.push_back(
C->varlist_size());
8508 Record.push_back(
C->getUniqueDeclarationsNum());
8509 Record.push_back(
C->getTotalComponentListNum());
8510 Record.push_back(
C->getTotalComponentsNum());
8511 Record.AddSourceLocation(
C->getLParenLoc());
8513 Record.push_back(
C->getMotionModifier(I));
8514 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8515 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8516 Record.AddStmt(
C->getIteratorModifier());
8518 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8519 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8520 Record.AddSourceLocation(
C->getColonLoc());
8521 for (
auto *E :
C->varlist())
8523 for (
auto *E :
C->mapperlists())
8525 for (
auto *D :
C->all_decls())
8527 for (
auto N :
C->all_num_lists())
8529 for (
auto N :
C->all_lists_sizes())
8531 for (
auto &M :
C->all_components()) {
8532 Record.AddStmt(M.getAssociatedExpression());
8533 Record.writeBool(M.isNonContiguous());
8534 Record.AddDeclRef(M.getAssociatedDeclaration());
8538void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8539 Record.push_back(
C->varlist_size());
8540 Record.push_back(
C->getUniqueDeclarationsNum());
8541 Record.push_back(
C->getTotalComponentListNum());
8542 Record.push_back(
C->getTotalComponentsNum());
8543 Record.AddSourceLocation(
C->getLParenLoc());
8545 Record.push_back(
C->getMotionModifier(I));
8546 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8547 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8548 Record.AddStmt(
C->getIteratorModifier());
8550 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8551 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8552 Record.AddSourceLocation(
C->getColonLoc());
8553 for (
auto *E :
C->varlist())
8555 for (
auto *E :
C->mapperlists())
8557 for (
auto *D :
C->all_decls())
8559 for (
auto N :
C->all_num_lists())
8561 for (
auto N :
C->all_lists_sizes())
8563 for (
auto &M :
C->all_components()) {
8564 Record.AddStmt(M.getAssociatedExpression());
8565 Record.writeBool(M.isNonContiguous());
8566 Record.AddDeclRef(M.getAssociatedDeclaration());
8570void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8571 Record.push_back(
C->varlist_size());
8572 Record.push_back(
C->getUniqueDeclarationsNum());
8573 Record.push_back(
C->getTotalComponentListNum());
8574 Record.push_back(
C->getTotalComponentsNum());
8575 Record.AddSourceLocation(
C->getLParenLoc());
8576 Record.writeEnum(
C->getFallbackModifier());
8577 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8578 for (
auto *E :
C->varlist())
8580 for (
auto *
VE :
C->private_copies())
8582 for (
auto *
VE :
C->inits())
8584 for (
auto *D :
C->all_decls())
8586 for (
auto N :
C->all_num_lists())
8588 for (
auto N :
C->all_lists_sizes())
8590 for (
auto &M :
C->all_components()) {
8591 Record.AddStmt(M.getAssociatedExpression());
8592 Record.AddDeclRef(M.getAssociatedDeclaration());
8596void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8597 Record.push_back(
C->varlist_size());
8598 Record.push_back(
C->getUniqueDeclarationsNum());
8599 Record.push_back(
C->getTotalComponentListNum());
8600 Record.push_back(
C->getTotalComponentsNum());
8601 Record.AddSourceLocation(
C->getLParenLoc());
8602 for (
auto *E :
C->varlist())
8604 for (
auto *D :
C->all_decls())
8606 for (
auto N :
C->all_num_lists())
8608 for (
auto N :
C->all_lists_sizes())
8610 for (
auto &M :
C->all_components()) {
8611 Record.AddStmt(M.getAssociatedExpression());
8612 Record.AddDeclRef(M.getAssociatedDeclaration());
8616void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8617 Record.push_back(
C->varlist_size());
8618 Record.push_back(
C->getUniqueDeclarationsNum());
8619 Record.push_back(
C->getTotalComponentListNum());
8620 Record.push_back(
C->getTotalComponentsNum());
8621 Record.AddSourceLocation(
C->getLParenLoc());
8622 for (
auto *E :
C->varlist())
8624 for (
auto *D :
C->all_decls())
8626 for (
auto N :
C->all_num_lists())
8628 for (
auto N :
C->all_lists_sizes())
8630 for (
auto &M :
C->all_components()) {
8631 Record.AddStmt(M.getAssociatedExpression());
8632 Record.AddDeclRef(M.getAssociatedDeclaration());
8636void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8637 Record.push_back(
C->varlist_size());
8638 Record.push_back(
C->getUniqueDeclarationsNum());
8639 Record.push_back(
C->getTotalComponentListNum());
8640 Record.push_back(
C->getTotalComponentsNum());
8641 Record.AddSourceLocation(
C->getLParenLoc());
8642 for (
auto *E :
C->varlist())
8644 for (
auto *D :
C->all_decls())
8646 for (
auto N :
C->all_num_lists())
8648 for (
auto N :
C->all_lists_sizes())
8650 for (
auto &M :
C->all_components()) {
8651 Record.AddStmt(M.getAssociatedExpression());
8652 Record.AddDeclRef(M.getAssociatedDeclaration());
8656void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8658void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8659 OMPUnifiedSharedMemoryClause *) {}
8661void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8664OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8667void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8668 OMPAtomicDefaultMemOrderClause *
C) {
8669 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8670 Record.AddSourceLocation(
C->getLParenLoc());
8671 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8674void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8676void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8677 Record.push_back(
C->getAtKind());
8678 Record.AddSourceLocation(
C->getLParenLoc());
8679 Record.AddSourceLocation(
C->getAtKindKwLoc());
8682void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8683 Record.push_back(
C->getSeverityKind());
8684 Record.AddSourceLocation(
C->getLParenLoc());
8685 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8688void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8689 VisitOMPClauseWithPreInit(
C);
8690 Record.AddStmt(
C->getMessageString());
8691 Record.AddSourceLocation(
C->getLParenLoc());
8694void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8695 Record.push_back(
C->varlist_size());
8696 Record.AddSourceLocation(
C->getLParenLoc());
8697 for (
auto *
VE :
C->varlist())
8699 for (
auto *E :
C->private_refs())
8703void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8704 Record.push_back(
C->varlist_size());
8705 Record.AddSourceLocation(
C->getLParenLoc());
8706 for (
auto *
VE :
C->varlist())
8710void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8711 Record.push_back(
C->varlist_size());
8712 Record.AddSourceLocation(
C->getLParenLoc());
8713 for (
auto *
VE :
C->varlist())
8717void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8718 Record.writeEnum(
C->getKind());
8719 Record.writeEnum(
C->getModifier());
8720 Record.AddSourceLocation(
C->getLParenLoc());
8721 Record.AddSourceLocation(
C->getKindKwLoc());
8722 Record.AddSourceLocation(
C->getModifierKwLoc());
8725void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8726 Record.push_back(
C->getNumberOfAllocators());
8727 Record.AddSourceLocation(
C->getLParenLoc());
8728 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8729 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
8737void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
8738 Record.push_back(
C->varlist_size());
8739 Record.AddSourceLocation(
C->getLParenLoc());
8740 Record.AddStmt(
C->getModifier());
8741 Record.AddSourceLocation(
C->getColonLoc());
8742 for (
Expr *E :
C->varlist())
8746void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
8747 Record.writeEnum(
C->getBindKind());
8748 Record.AddSourceLocation(
C->getLParenLoc());
8749 Record.AddSourceLocation(
C->getBindKindLoc());
8752void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
8753 VisitOMPClauseWithPreInit(
C);
8755 Record.AddSourceLocation(
C->getLParenLoc());
8758void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8759 OMPDynGroupprivateClause *
C) {
8760 VisitOMPClauseWithPreInit(
C);
8761 Record.push_back(
C->getDynGroupprivateModifier());
8762 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8764 Record.AddSourceLocation(
C->getLParenLoc());
8765 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8766 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8769void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
8770 Record.push_back(
C->varlist_size());
8771 Record.push_back(
C->getNumLoops());
8772 Record.AddSourceLocation(
C->getLParenLoc());
8773 Record.push_back(
C->getDependenceType());
8774 Record.AddSourceLocation(
C->getDependenceLoc());
8775 Record.AddSourceLocation(
C->getColonLoc());
8776 for (
auto *
VE :
C->varlist())
8778 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8779 Record.AddStmt(
C->getLoopData(I));
8782void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
8783 Record.AddAttributes(
C->getAttrs());
8784 Record.AddSourceLocation(
C->getBeginLoc());
8785 Record.AddSourceLocation(
C->getLParenLoc());
8786 Record.AddSourceLocation(
C->getEndLoc());
8789void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
8793 for (
const auto &
Set : TI->
Sets) {
8800 writeExprRef(
Selector.ScoreOrCondition);
8814 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8816 if (
Data->hasAssociatedStmt())
8818 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8824 for (
Expr *E :
C->getVarList())
8830 for (
Expr *E : Exprs)
8839 switch (
C->getClauseKind()) {
8849 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
8856 if (SC->isConditionExprClause()) {
8858 if (SC->hasConditionExpr())
8859 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
8862 for (
Expr *E : SC->getVarList())
8871 for (
Expr *E : NGC->getIntExprs())
8905 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
8928 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9016 if (AC->hasIntExpr())
9024 if (
Expr *DNE = WC->getDevNumExpr())
9038 if (Arg.getIdentifierInfo())
9057 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9085 for (
Expr *E : TC->getSizeExprs())
9093 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9095 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9103 if (WC->hasIntExpr())
9111 if (VC->hasIntExpr())
9132 if (BC->isStringArgument())
9141 llvm_unreachable(
"Clause serialization not yet implemented");
9143 llvm_unreachable(
"Invalid Clause Kind");
9152 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 true 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)
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
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.
FunctionDecl * getcudaGetParameterBufferDecl()
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
FunctionDecl * getcudaLaunchDeviceDecl()
virtual void EnteringModulePurview()
The parser find the named module declaration.
Reads an AST files chain containing the contents of a translation unit.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
An object for streaming information to a record.
void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo)
void AddCXXBaseSpecifiers(ArrayRef< CXXBaseSpecifier > Bases)
Emit a set of C++ base specifiers.
void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs)
Emit a template argument list.
uint64_t Emit(unsigned Code, unsigned Abbrev=0)
Emit the record to the stream, followed by its substatements, and return its offset.
void AddCXXTemporary(const CXXTemporary *Temp)
Emit a CXXTemporary.
void writeOMPTraitInfo(const OMPTraitInfo *TI)
Write an OMPTraitInfo object.
void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base)
Emit a C++ base specifier.
void writeOMPClause(OMPClause *C)
void writeBool(bool Value)
void AddAPValue(const APValue &Value)
Emit an APvalue.
void AddUnresolvedSet(const ASTUnresolvedSet &Set)
Emit a UnresolvedSet structure.
void AddIdentifierRef(const IdentifierInfo *II)
Emit a reference to an identifier.
void AddStmt(Stmt *S)
Add the given statement or expression to the queue of statements to emit.
void AddDeclarationName(DeclarationName Name)
Emit a declaration name.
void 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
bool IsLocalDecl(const Decl *D) const
Is this a local declaration (that is, one that will be written to our AST file)?
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)
llvm::MapVector< serialization::ModuleFile *, const Decl * > CollectFirstDeclFromEachModule(const Decl *D, bool IncludeLocal)
Collect the first declaration from each module file that provides a declaration of D.
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 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
This represents 'allocator' clause in the 'pragma omp ...' directive.
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 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents 'num_threads' 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 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
This represents 'threadset' clause in the 'pragma omp task ...' 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".
bool DeclareAndesVectorBuiltins
Indicate RISC-V Andes vector builtin functions enabled or not.
bool DeclareSiFiveVectorBuiltins
Indicate RISC-V SiFive vector builtin functions enabled or not.
bool DeclareRVVBuiltins
Indicate RISC-V vector builtin functions enabled or not.
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.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ 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
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