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"
159 case Type::LateParsedAttr:
161 "should be replaced with a concrete type before serialization");
163 llvm_unreachable(
"shouldn't be serializing a builtin type this way");
165 llvm_unreachable(
"bad type kind");
170struct AffectingModuleMaps {
171 llvm::DenseSet<FileID> DefinitionFileIDs;
172 llvm::DenseSet<const FileEntry *> DefinitionFiles;
175std::optional<AffectingModuleMaps>
188 enum AffectedReason :
bool {
189 AR_TextualHeader = 0,
190 AR_ImportOrTextualHeader = 1,
192 auto AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {
193 LHS = std::max(LHS, RHS);
195 llvm::DenseMap<FileID, AffectedReason> ModuleMaps;
196 llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;
197 auto CollectModuleMapsForHierarchy = [&](
const Module *M,
198 AffectedReason Reason) {
204 if (
auto [It, Inserted] = ProcessedModules.insert({M, Reason});
205 !Inserted && Reason <= It->second) {
211 std::queue<const Module *> Q;
214 const Module *Mod = Q.front();
220 AssignMostImportant(ModuleMaps[F], Reason);
225 AssignMostImportant(ModuleMaps[UniqF], Reason);
234 CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);
236 std::queue<const Module *> Q;
239 const Module *CurrentModule = Q.front();
243 CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);
245 CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);
260 if (
const Module *M = KH.getModule())
261 CollectModuleMapsForHierarchy(M, AR_TextualHeader);
282 llvm::DenseSet<const FileEntry *> ModuleFileEntries;
283 llvm::DenseSet<FileID> ModuleFileIDs;
284 for (
auto [FID, Reason] : ModuleMaps) {
285 if (Reason == AR_ImportOrTextualHeader)
286 ModuleFileIDs.insert(FID);
287 if (
auto *FE =
SM.getFileEntryForID(FID))
288 ModuleFileEntries.insert(FE);
291 AffectingModuleMaps
R;
292 R.DefinitionFileIDs = std::move(ModuleFileIDs);
293 R.DefinitionFiles = std::move(ModuleFileEntries);
300 ASTRecordWriter BasicWriter;
303 ASTTypeWriter(ASTContext &Context, ASTWriter &Writer)
304 : Writer(Writer), BasicWriter(Context, Writer, Record) {}
307 if (
T.hasLocalNonFastQualifiers()) {
308 Qualifiers Qs =
T.getLocalQualifiers();
309 BasicWriter.writeQualType(
T.getLocalUnqualifiedType());
310 BasicWriter.writeQualifiers(Qs);
311 return BasicWriter.Emit(
TYPE_EXT_QUAL, Writer.getTypeExtQualAbbrev());
314 const Type *typePtr =
T.getTypePtr();
315 serialization::AbstractTypeWriter<ASTRecordWriter> atw(BasicWriter);
323 ASTRecordWriter &Record;
325 void addSourceLocation(SourceLocation Loc) { Record.AddSourceLocation(Loc); }
326 void addSourceRange(SourceRange Range) { Record.AddSourceRange(Range); }
329 TypeLocWriter(ASTRecordWriter &Record) : Record(Record) {}
331#define ABSTRACT_TYPELOC(CLASS, PARENT)
332#define TYPELOC(CLASS, PARENT) \
333 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
334#include "clang/AST/TypeLocNodes.def"
347void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
357void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) {
361void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) {
365void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
369void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
373void TypeLocWriter::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
377void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
381void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
385void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
389void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
394void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) {
402void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
403 VisitArrayTypeLoc(TL);
406void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
407 VisitArrayTypeLoc(TL);
410void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
411 VisitArrayTypeLoc(TL);
414void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
415 DependentSizedArrayTypeLoc TL) {
416 VisitArrayTypeLoc(TL);
419void TypeLocWriter::VisitDependentAddressSpaceTypeLoc(
420 DependentAddressSpaceTypeLoc TL) {
423 addSourceLocation(
range.getBegin());
424 addSourceLocation(
range.getEnd());
428void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
429 DependentSizedExtVectorTypeLoc TL) {
433void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) {
437void TypeLocWriter::VisitDependentVectorTypeLoc(
438 DependentVectorTypeLoc TL) {
442void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
446void TypeLocWriter::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
449 addSourceLocation(
range.getBegin());
450 addSourceLocation(
range.getEnd());
455void TypeLocWriter::VisitDependentSizedMatrixTypeLoc(
456 DependentSizedMatrixTypeLoc TL) {
459 addSourceLocation(
range.getBegin());
460 addSourceLocation(
range.getEnd());
465void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
471 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i)
475void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
476 VisitFunctionTypeLoc(TL);
479void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
480 VisitFunctionTypeLoc(TL);
483void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
489void TypeLocWriter::VisitUsingTypeLoc(UsingTypeLoc TL) {
495void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
501void TypeLocWriter::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
510void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
516void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
523void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
528void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
551void TypeLocWriter::VisitAutoTypeLoc(
AutoTypeLoc TL) {
556 Record.AddConceptReference(CR);
562void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
563 DeducedTemplateSpecializationTypeLoc TL) {
569void TypeLocWriter::VisitTagTypeLoc(TagTypeLoc TL) {
575void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) {
579void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
583void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
585void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
589void TypeLocWriter::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
593void TypeLocWriter::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
595 "should be replaced with a concrete type before serialization");
598void TypeLocWriter::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
602void TypeLocWriter::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
606void TypeLocWriter::VisitHLSLAttributedResourceTypeLoc(
607 HLSLAttributedResourceTypeLoc TL) {
611void TypeLocWriter::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
615void TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
619void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(
620 SubstTemplateTypeParmTypeLoc TL) {
624void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(
625 SubstTemplateTypeParmPackTypeLoc TL) {
629void TypeLocWriter::VisitSubstBuiltinTemplatePackTypeLoc(
630 SubstBuiltinTemplatePackTypeLoc TL) {
634void TypeLocWriter::VisitTemplateSpecializationTypeLoc(
635 TemplateSpecializationTypeLoc TL) {
642 for (
unsigned i = 0, e = TL.
getNumArgs(); i != e; ++i)
646void TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) {
651void TypeLocWriter::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
655void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
661void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
665void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
670void TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
682void TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
686void TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
692void TypeLocWriter::VisitPipeTypeLoc(PipeTypeLoc TL) {
695void TypeLocWriter::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
698void TypeLocWriter::VisitDependentBitIntTypeLoc(
699 clang::DependentBitIntTypeLoc TL) {
703void TypeLocWriter::VisitPredefinedSugarTypeLoc(
704 clang::PredefinedSugarTypeLoc TL) {
708void ASTWriter::WriteTypeAbbrevs() {
709 using namespace llvm;
711 std::shared_ptr<BitCodeAbbrev> Abv;
714 Abv = std::make_shared<BitCodeAbbrev>();
716 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
717 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3));
718 TypeExtQualAbbrev = Stream.EmitAbbrev(std::move(Abv));
726 llvm::BitstreamWriter &Stream,
730 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID,
Record);
733 if (!Name || Name[0] == 0)
737 Record.push_back(*Name++);
738 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
Record);
742 llvm::BitstreamWriter &Stream,
747 Record.push_back(*Name++);
748 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME,
Record);
753#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
885void ASTWriter::WriteBlockInfoBlock() {
887 Stream.EnterBlockInfoBlock();
889#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
890#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
893 BLOCK(CONTROL_BLOCK);
903 BLOCK(OPTIONS_BLOCK);
911 BLOCK(INPUT_FILES_BLOCK);
979 BLOCK(SOURCE_MANAGER_BLOCK);
987 BLOCK(PREPROCESSOR_BLOCK);
995 BLOCK(SUBMODULE_BLOCK);
1018 BLOCK(COMMENTS_BLOCK);
1022 BLOCK(DECLTYPES_BLOCK);
1026 RECORD(TYPE_BLOCK_POINTER);
1027 RECORD(TYPE_LVALUE_REFERENCE);
1028 RECORD(TYPE_RVALUE_REFERENCE);
1029 RECORD(TYPE_MEMBER_POINTER);
1030 RECORD(TYPE_CONSTANT_ARRAY);
1031 RECORD(TYPE_INCOMPLETE_ARRAY);
1032 RECORD(TYPE_VARIABLE_ARRAY);
1035 RECORD(TYPE_FUNCTION_NO_PROTO);
1036 RECORD(TYPE_FUNCTION_PROTO);
1038 RECORD(TYPE_TYPEOF_EXPR);
1042 RECORD(TYPE_OBJC_INTERFACE);
1043 RECORD(TYPE_OBJC_OBJECT_POINTER);
1045 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1046 RECORD(TYPE_UNRESOLVED_USING);
1047 RECORD(TYPE_INJECTED_CLASS_NAME);
1048 RECORD(TYPE_OBJC_OBJECT);
1049 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1050 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1051 RECORD(TYPE_DEPENDENT_NAME);
1052 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1054 RECORD(TYPE_MACRO_QUALIFIED);
1055 RECORD(TYPE_PACK_EXPANSION);
1057 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1058 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1060 RECORD(TYPE_UNARY_TRANSFORM);
1064 RECORD(TYPE_OBJC_TYPE_PARAM);
1145 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1151 BLOCK(EXTENSION_BLOCK);
1154 BLOCK(UNHASHED_CONTROL_BLOCK);
1180 assert(Filename &&
"No file name to adjust?");
1182 if (BaseDir.empty())
1187 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1188 if (Filename[Pos] != BaseDir[Pos])
1197 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1198 if (!llvm::sys::path::is_separator(BaseDir.back()))
1212 return Filename + Pos;
1215std::pair<ASTFileSignature, ASTFileSignature>
1216ASTWriter::createSignature()
const {
1217 StringRef AllBytes(Buffer.data(), Buffer.size());
1220 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1225 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1228 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1230 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1233 return std::make_pair(ASTBlockHash, Signature);
1236ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1238 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1240 assert(WritingModule);
1241 assert(WritingModule->isNamedModule());
1245 for (
auto [ExportImported, _] : WritingModule->Exports)
1246 Hasher.update(ExportImported->Signature);
1270 for (
Module *M : TouchedTopLevelModules)
1279 Stream.BackpatchByte(BitNo, Byte);
1284ASTFileSignature ASTWriter::backpatchSignature() {
1285 if (isWritingStdCXXNamedModules()) {
1286 ASTFileSignature Signature = createSignatureForNamedModule();
1291 if (!WritingModule ||
1296 ASTFileSignature ASTBlockHash;
1297 ASTFileSignature Signature;
1298 std::tie(ASTBlockHash, Signature) = createSignature();
1306void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1307 using namespace llvm;
1310 Stream.FlushToWord();
1311 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1319 if (isWritingStdCXXNamedModules() ||
1330 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1333 if (!isWritingStdCXXNamedModules()) {
1334 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1336 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1337 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1340 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1341 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1345 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1346 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1347 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1348 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1351 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1352 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1361 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1362#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1363#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1364 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1365#include "clang/Basic/DiagnosticOptions.def"
1367 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1370 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1379 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1381 Record.push_back(HSOpts.UserEntries.size());
1382 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1383 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1385 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1391 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1392 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1393 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1394 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1398 Record.push_back(HSOpts.VFSOverlayFiles.size());
1399 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1400 AddString(VFSOverlayFile,
Record);
1405 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1406 WritePragmaDiagnosticMappings(Diags, WritingModule);
1411 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1413 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1414 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1415 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1417 HSEntryUsage.size()};
1418 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1424 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1425 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1426 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1427 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1428 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1430 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1435 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1439void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1440 using namespace llvm;
1449 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1450 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1451 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1452 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1453 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1454 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1455 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1457 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1459 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1461 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1462 assert((!WritingModule || isysroot.empty()) &&
1463 "writing module as a relocatable PCH?");
1468 CLANG_VERSION_MAJOR,
1469 CLANG_VERSION_MINOR,
1471 isWritingStdCXXNamedModules(),
1473 ASTHasCompilerErrors};
1474 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1478 if (WritingModule) {
1480 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1482 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1483 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1485 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1487 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1493 if (WritingModule->Directory) {
1494 return WritingModule->Directory->getName();
1496 return std::nullopt;
1508 WritingModule->Directory->getName() !=
".")) {
1510 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1512 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1513 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1516 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1520 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1522 }
else if (!isysroot.empty()) {
1524 SmallString<128> CleanedSysroot(isysroot);
1526 BaseDirectory.assign(CleanedSysroot.begin(), CleanedSysroot.end());
1530 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1534 AddPath(WritingModule->PresumedModuleMapFile.empty()
1535 ? Map.getModuleMapFileForUniquing(WritingModule)
1536 ->getNameAsRequested()
1537 : StringRef(WritingModule->PresumedModuleMapFile),
1541 if (
auto *AdditionalModMaps =
1542 Map.getAdditionalModuleMapFiles(WritingModule)) {
1543 Record.push_back(AdditionalModMaps->size());
1544 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1545 AdditionalModMaps->end());
1546 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1549 for (FileEntryRef F : ModMaps)
1550 AddPath(F.getName(),
Record);
1560 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1561 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1562 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1563 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1564 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1565 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1566 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1567 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1571 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1573 SmallString<128> Blob;
1575 for (ModuleFile &M : Chain->getModuleManager()) {
1577 if (!M.isDirectlyImported())
1585 AddSourceLocation(M.ImportLoc,
Record);
1586 AddStringBlob(M.ModuleName,
Record, Blob);
1587 Record.push_back(M.StandardCXXModule);
1591 if (M.StandardCXXModule) {
1602 Record.push_back(M.FileName.getRawKind());
1606 AddPathBlob(M.FileName,
Record, Blob);
1609 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1620 const uint64_t LanguageOptionValues[] = {
1621#define LANGOPT(Name, Bits, Default, Compatibility, Description) LangOpts.Name,
1622#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1623 static_cast<unsigned>(LangOpts.get##Name()),
1624#include "clang/Basic/LangOptions.def"
1625#define SANITIZER(NAME, ID) LangOpts.Sanitize.has(SanitizerKind::ID),
1626#include "clang/Basic/Sanitizers.def"
1628 llvm::append_range(
Record, LanguageOptionValues);
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 StringRef HSOpts_ModuleCachePath =
1706 AddString(HSOpts_ModuleCachePath,
Record);
1727 bool WriteMacros = !SkipMacros;
1728 Record.push_back(WriteMacros);
1732 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1740 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1745 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1766 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1768 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1769 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1770 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1775 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1782 WriteInputFiles(SourceMgr);
1789struct InputFileEntry {
1793 bool BufferOverridden;
1800 void trySetContentHash(
1802 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1811 auto MemBuff = GetMemBuff();
1813 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1818 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1820 ContentHash[1] =
uint32_t(Hash >> 32);
1826SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1827 const SrcMgr::FileInfo &
File) {
1828 SourceLocation IncludeLoc =
File.getIncludeLoc();
1830 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1831 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1832 if (!IsSLocAffecting[IncludeFID.ID])
1833 IncludeLoc = SourceLocation();
1838void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1839 using namespace llvm;
1844 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1846 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1847 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1848 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
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::Fixed, 1));
1853 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1854 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1855 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1858 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1860 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1861 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1862 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1864 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1868 std::vector<InputFileEntry> SystemFiles;
1872 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1879 if (!
Cache->OrigEntry)
1883 if (!IsSLocFileEntryAffecting[I])
1886 InputFileEntry Entry(*
Cache->OrigEntry);
1887 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1888 Entry.IsTransient =
Cache->IsTransient;
1889 Entry.BufferOverridden =
Cache->BufferOverridden;
1891 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1892 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1893 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1896 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1898 if (Entry.IsSystemFile)
1899 SystemFiles.push_back(Entry);
1908 if (!Sysroot.empty()) {
1909 SmallString<128> SDKSettingsJSON = Sysroot;
1910 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1913 InputFileEntry Entry(*FE);
1914 Entry.IsSystemFile =
true;
1915 Entry.IsTransient =
false;
1916 Entry.BufferOverridden =
false;
1917 Entry.IsTopLevel =
true;
1918 Entry.IsModuleMap =
false;
1919 std::unique_ptr<MemoryBuffer> MB;
1920 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1922 MB = std::move(*MBOrErr);
1923 return MB->getMemBufferRef();
1925 return std::nullopt;
1927 SystemFiles.push_back(Entry);
1932 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(
UserFiles),
1933 std::move(SystemFiles));
1935 unsigned UserFilesNum = 0;
1937 std::vector<uint64_t> InputFileOffsets;
1938 for (
const auto &Entry : SortedFiles) {
1939 uint32_t &InputFileID = InputFileIDs[Entry.File];
1940 if (InputFileID != 0)
1944 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1946 InputFileID = InputFileOffsets.size();
1948 if (!Entry.IsSystemFile)
1954 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1955 SmallString<128> Name = Entry.File.getName();
1957 PreparePathForOutput(NameAsRequested);
1958 PreparePathForOutput(Name);
1960 if (Name == NameAsRequested)
1963 RecordData::value_type
Record[] = {
1965 InputFileOffsets.size(),
1967 (
uint64_t)getTimestampForOutput(Entry.File.getModificationTime()),
1968 Entry.BufferOverridden,
1972 NameAsRequested.size()};
1974 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1975 (NameAsRequested + Name).str());
1981 Entry.ContentHash[1]};
1982 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1989 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1991 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1992 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1994 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1995 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
1999 InputFileOffsets.size(), UserFilesNum};
2000 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2010 using namespace llvm;
2012 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2021 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2022 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2023 return Stream.EmitAbbrev(std::move(Abbrev));
2029 using namespace llvm;
2031 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2034 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2038 return Stream.EmitAbbrev(std::move(Abbrev));
2045 using namespace llvm;
2047 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2052 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2053 return Stream.EmitAbbrev(std::move(Abbrev));
2059 using namespace llvm;
2061 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2069 return Stream.EmitAbbrev(std::move(Abbrev));
2074static std::pair<unsigned, unsigned>
2076 llvm::encodeULEB128(KeyLen, Out);
2077 llvm::encodeULEB128(DataLen, Out);
2078 return std::make_pair(KeyLen, DataLen);
2084 class HeaderFileInfoTrait {
2088 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2095 using key_type_ref =
const key_type &;
2097 using UnresolvedModule =
2098 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2101 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2102 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2104 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2108 bool AlreadyIncluded;
2109 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2112 using data_type_ref =
const data_type &;
2114 using hash_value_type = unsigned;
2115 using offset_type = unsigned;
2121 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2122 memcpy(buf, &key.Size,
sizeof(key.Size));
2123 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2124 return llvm::xxh3_64bits(buf);
2127 std::pair<unsigned, unsigned>
2128 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2129 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2131 for (
auto ModInfo :
Data.KnownHeaders)
2134 if (
Data.Unresolved.getPointer())
2139 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2140 using namespace llvm::support;
2142 endian::Writer
LE(Out, llvm::endianness::little);
2147 Out.write(key.Filename.data(), KeyLen);
2150 void EmitData(raw_ostream &Out, key_type_ref key,
2151 data_type_ref
Data,
unsigned DataLen) {
2152 using namespace llvm::support;
2154 endian::Writer
LE(Out, llvm::endianness::little);
2157 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2158 | (
Data.HFI.isImport << 5)
2160 Data.HFI.isPragmaOnce << 4)
2161 | (
Data.HFI.DirInfo << 1);
2164 if (
Data.HFI.LazyControllingMacro.isID())
2173 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2178 for (
auto ModInfo :
Data.KnownHeaders)
2179 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2180 if (
Data.Unresolved.getPointer())
2181 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2183 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2192void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2193 HeaderFileInfoTrait GeneratorTrait(*
this);
2194 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2195 SmallVector<const char *, 4> SavedStrings;
2196 unsigned NumHeaderSearchEntries = 0;
2202 const HeaderFileInfo
Empty;
2203 if (WritingModule) {
2204 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2205 while (!Worklist.empty()) {
2206 Module *M = Worklist.pop_back_val();
2223 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2224 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2225 << WritingModule->getFullModuleName() << U.Size.has_value()
2232 llvm::sys::path::append(Filename, U.FileName);
2233 PreparePathForOutput(Filename);
2235 StringRef FilenameDup = strdup(Filename.c_str());
2236 SavedStrings.push_back(FilenameDup.data());
2238 HeaderFileInfoTrait::key_type Key = {
2239 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2240 HeaderFileInfoTrait::data_type
Data = {
2245 ++NumHeaderSearchEntries;
2248 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2253 [&](FileEntryRef
File,
const HeaderFileInfo &HFI) {
2260 StringRef Filename =
File.getName();
2261 SmallString<128> FilenameTmp(Filename);
2262 if (PreparePathForOutput(FilenameTmp)) {
2265 Filename = StringRef(strdup(FilenameTmp.c_str()));
2266 SavedStrings.push_back(Filename.data());
2271 HeaderFileInfoTrait::key_type Key = {
2272 Filename,
File.getSize(),
2273 getTimestampForOutput(
File.getModificationTime())};
2274 HeaderFileInfoTrait::data_type
Data = {
2280 ++NumHeaderSearchEntries;
2284 SmallString<4096> TableData;
2287 using namespace llvm::support;
2289 llvm::raw_svector_ostream
Out(TableData);
2291 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2292 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2296 using namespace llvm;
2298 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2300 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2301 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2302 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2303 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2304 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2308 NumHeaderSearchEntries, TableData.size()};
2309 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2312 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2313 free(
const_cast<char *
>(SavedStrings[I]));
2316static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2317 unsigned SLocBufferBlobCompressedAbbrv,
2318 unsigned SLocBufferBlobAbbrv) {
2319 using RecordDataType = ASTWriter::RecordData::value_type;
2324 if (llvm::compression::zstd::isAvailable()) {
2325 llvm::compression::zstd::compress(
2326 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2328 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2329 llvm::toStringRef(CompressedBuffer));
2332 if (llvm::compression::zlib::isAvailable()) {
2333 llvm::compression::zlib::compress(
2334 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2336 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2337 llvm::toStringRef(CompressedBuffer));
2342 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2353void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2358 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2364 unsigned SLocBufferBlobCompressedAbbrv =
2370 std::vector<uint32_t> SLocEntryOffsets;
2371 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2377 FileID FID = FileID::get(I);
2381 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2382 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2388 if (
Cache->OrigEntry) {
2401 if (!IsSLocAffecting[I])
2403 SLocEntryOffsets.push_back(Offset);
2406 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2407 Record.push_back(
File.getFileCharacteristic());
2410 bool EmitBlob =
false;
2413 "Writing to AST an overridden file is not supported");
2416 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2419 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2421 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2422 if (FDI != FileDeclIDs.end()) {
2423 Record.push_back(FDI->second->FirstDeclIndex);
2424 Record.push_back(FDI->second->DeclIDs.size());
2430 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2441 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2443 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2444 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2445 StringRef(Name.data(), Name.size() + 1));
2452 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2455 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2456 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2457 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2458 SLocBufferBlobAbbrv);
2462 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2463 SLocEntryOffsets.push_back(Offset);
2478 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2479 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2485 if (SLocEntryOffsets.empty())
2490 using namespace llvm;
2492 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2494 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2495 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2496 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2497 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2498 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2500 RecordData::value_type
Record[] = {
2503 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2504 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2505 bytes(SLocEntryOffsets));
2516 llvm::DenseMap<int, int> FilenameMap;
2517 FilenameMap[-1] = -1;
2518 for (
const auto &L : LineTable) {
2521 for (
auto &LE : L.second) {
2522 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2523 FilenameMap.size() - 1)).second)
2524 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2530 for (
const auto &L : LineTable) {
2535 AddFileID(L.first,
Record);
2538 Record.push_back(L.second.size());
2539 for (
const auto &LE : L.second) {
2542 Record.push_back(FilenameMap[
LE.FilenameID]);
2543 Record.push_back((
unsigned)
LE.FileKind);
2544 Record.push_back(
LE.IncludeOffset);
2559 if (MI->isBuiltinMacro())
2575void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2576 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2580 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2583 RecordData ModuleMacroRecord;
2593 SourceLocation AssumeNonNullLoc =
2595 if (AssumeNonNullLoc.
isValid()) {
2597 AddSourceLocation(AssumeNonNullLoc,
Record);
2607 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2608 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2609 Record.push_back(SkipInfo->FoundNonSkipPortion);
2610 Record.push_back(SkipInfo->FoundElse);
2611 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2627 AddSourceLocation(S,
Record);
2637 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2644 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2647 if (!isWritingStdCXXNamedModules())
2649 if (Id.second->hadMacroDefinition() &&
2650 (!Id.second->isFromAST() ||
2651 Id.second->hasChangedSinceDeserialization()))
2652 MacroIdentifiers.push_back(Id.second);
2655 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2659 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2661 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2662 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2665 bool EmittedModuleMacros =
false;
2673 if (IsModule && WritingModule->isHeaderUnit()) {
2682 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2683 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2684 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2685 Record.push_back(VisMD->isPublic());
2687 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2688 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2690 ModuleMacroRecord.clear();
2691 EmittedModuleMacros =
true;
2701 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2702 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2703 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2704 Record.push_back(VisMD->isPublic());
2710 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2711 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2712 while (!Worklist.empty()) {
2713 auto *
Macro = Worklist.pop_back_val();
2716 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2717 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2718 for (
auto *M :
Macro->overrides())
2719 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2722 ModuleMacroRecord.clear();
2725 for (
auto *M :
Macro->overrides())
2726 if (++Visits[M] == M->getNumOverridingMacros())
2727 Worklist.push_back(M);
2729 EmittedModuleMacros =
true;
2732 if (
Record.empty() && !EmittedModuleMacros)
2735 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2746 std::vector<uint32_t> MacroOffsets;
2748 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2749 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2750 MacroInfo *MI = MacroInfosToEmit[I].MI;
2753 if (ID < FirstMacroID) {
2754 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2759 unsigned Index =
ID - FirstMacroID;
2760 if (Index >= MacroOffsets.size())
2761 MacroOffsets.resize(Index + 1);
2763 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2764 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2765 MacroOffsets[Index] = Offset;
2767 AddIdentifierRef(Name,
Record);
2783 for (
const IdentifierInfo *Param : MI->
params())
2784 AddIdentifierRef(Param,
Record);
2792 Stream.EmitRecord(Code,
Record);
2796 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2811 using namespace llvm;
2813 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2815 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2816 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2817 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2819 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2822 MacroOffsetsBase - ASTBlockStartOffset};
2823 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2827void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2828 uint64_t MacroOffsetsBase) {
2832 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2838 unsigned NumPreprocessingRecords = 0;
2839 using namespace llvm;
2842 unsigned InclusionAbbrev = 0;
2844 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2846 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2847 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2848 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2849 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2850 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2851 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2855 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2857 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2860 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2863 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2864 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2865 SourceRange
R = getAdjustedRange((*E)->getSourceRange());
2866 PreprocessedEntityOffsets.emplace_back(
2867 getRawSourceLocationEncoding(
R.getBegin()),
2868 getRawSourceLocationEncoding(
R.getEnd()), Offset);
2870 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2872 MacroDefinitions[MD] = NextPreprocessorEntityID;
2874 AddIdentifierRef(MD->getName(),
Record);
2879 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2880 Record.push_back(ME->isBuiltinMacro());
2881 if (ME->isBuiltinMacro())
2882 AddIdentifierRef(ME->getName(),
Record);
2884 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2889 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2891 Record.push_back(
ID->getFileName().size());
2892 Record.push_back(
ID->wasInQuotes());
2893 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2894 Record.push_back(
ID->importedModule());
2895 SmallString<64> Buffer;
2896 Buffer +=
ID->getFileName();
2900 Buffer +=
ID->getFile()->getName();
2901 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2905 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2910 if (NumPreprocessingRecords > 0) {
2911 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2914 using namespace llvm;
2916 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2918 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2919 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2922 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2923 bytes(PreprocessedEntityOffsets));
2928 if (SkippedRanges.size() > 0) {
2929 std::vector<PPSkippedRange> SerializedSkippedRanges;
2930 SerializedSkippedRanges.reserve(SkippedRanges.size());
2931 for (
auto const& Range : SkippedRanges)
2932 SerializedSkippedRanges.emplace_back(
2933 getRawSourceLocationEncoding(
Range.getBegin()),
2934 getRawSourceLocationEncoding(
Range.getEnd()));
2936 using namespace llvm;
2937 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2939 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2940 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2944 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2945 bytes(SerializedSkippedRanges));
2953 auto Known = SubmoduleIDs.find(Mod);
2954 if (Known != SubmoduleIDs.end())
2955 return Known->second;
2958 if (Top != WritingModule &&
2960 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2963 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2966unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2967 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2976void ASTWriter::WriteSubmodules(
Module *WritingModule,
ASTContext *Context) {
2981 using namespace llvm;
2983 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2985 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2986 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2987 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
2988 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2989 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
2990 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2991 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2992 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2993 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2994 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2995 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2996 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2997 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2998 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3000 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3001 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3003 Abbrev = std::make_shared<BitCodeAbbrev>();
3005 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3006 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3008 Abbrev = std::make_shared<BitCodeAbbrev>();
3010 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3011 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3013 Abbrev = std::make_shared<BitCodeAbbrev>();
3015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3016 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3018 Abbrev = std::make_shared<BitCodeAbbrev>();
3020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3021 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3023 Abbrev = std::make_shared<BitCodeAbbrev>();
3025 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3026 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3027 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3029 Abbrev = std::make_shared<BitCodeAbbrev>();
3031 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3032 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3034 Abbrev = std::make_shared<BitCodeAbbrev>();
3036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3037 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3039 Abbrev = std::make_shared<BitCodeAbbrev>();
3041 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3042 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3044 Abbrev = std::make_shared<BitCodeAbbrev>();
3046 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3047 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3049 Abbrev = std::make_shared<BitCodeAbbrev>();
3051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3052 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3053 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3055 Abbrev = std::make_shared<BitCodeAbbrev>();
3057 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3058 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3060 Abbrev = std::make_shared<BitCodeAbbrev>();
3062 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3064 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3066 Abbrev = std::make_shared<BitCodeAbbrev>();
3068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3069 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3071 Abbrev = std::make_shared<BitCodeAbbrev>();
3073 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3074 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3075 unsigned ChildAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3078 uint64_t SubmoduleOffsetBase = Stream.GetCurrentBitNo();
3080 unsigned TopLevelID = getSubmoduleID(WritingModule);
3083 std::queue<Module *> Q;
3084 Q.push(WritingModule);
3085 while (!Q.empty()) {
3088 unsigned ID = getSubmoduleID(Mod);
3089 if (ID < FirstSubmoduleID) {
3090 assert(0 &&
"Loaded submodule entered WritingModule ?");
3095 unsigned Index =
ID - FirstSubmoduleID;
3096 if (Index >= SubmoduleOffsets.size())
3097 SubmoduleOffsets.resize(Index + 1);
3099 uint64_t Offset = Stream.GetCurrentBitNo() - SubmoduleOffsetBase;
3100 assert((Offset >> 32) == 0 &&
"Submodule offset too large");
3101 SubmoduleOffsets[Index] = Offset;
3105 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3106 ParentID = SubmoduleIDs[Mod->
Parent];
3110 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3113 FileID UnadjustedInferredFID;
3116 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3123 (RecordData::value_type)Mod->
Kind,
3125 (RecordData::value_type)InferredFID,
3136 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3142 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record,
R.FeatureName);
3146 if (std::optional<Module::Header> UmbrellaHeader =
3149 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3150 UmbrellaHeader->NameAsWritten);
3151 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3154 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3155 UmbrellaDir->NameAsWritten);
3160 unsigned RecordKind;
3162 Module::HeaderKind HeaderKind;
3168 Module::HK_PrivateTextual},
3171 for (
const auto &HL : HeaderLists) {
3172 RecordData::value_type
Record[] = {HL.RecordKind};
3173 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3174 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3181 SmallString<128> HeaderName(H.getName());
3182 PreparePathForOutput(HeaderName);
3183 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3191 Record.push_back(getSubmoduleID(I));
3199 Record.push_back(getSubmoduleID(I));
3206 for (
const auto &E : Mod->
Exports) {
3209 Record.push_back(getSubmoduleID(E.first));
3210 Record.push_back(E.second);
3225 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3233 getSubmoduleID(
C.Other)};
3234 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3240 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3245 if (Context && !GeneratingReducedBMI) {
3248 if (wasDeclEmitted(D))
3249 AddDeclRef(D,
Inits);
3264 getSubmoduleID(Child)};
3265 Stream.EmitRecordWithBlob(ChildAbbrev,
Record, Child->Name);
3281 assert((NextSubmoduleID - FirstSubmoduleID == SubmoduleOffsets.size()) &&
3282 "Wrong # of submodules; found a reference to a non-local, "
3283 "non-imported submodule?");
3285 Abbrev = std::make_shared<BitCodeAbbrev>();
3287 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3288 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3289 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3290 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3291 unsigned SubmoduleMetadataAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3293 RecordData::value_type
Record[] = {
3296 Stream.EmitRecordWithBlob(SubmoduleMetadataAbbrev,
Record,
3297 bytes(SubmoduleOffsets));
3300void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3302 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3304 unsigned CurrID = 0;
3307 auto EncodeDiagStateFlags =
3308 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3309 unsigned Result = (unsigned)DS->ExtBehavior;
3311 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3312 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3313 (unsigned)DS->SuppressSystemWarnings})
3318 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3321 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3322 bool IncludeNonPragmaStates) {
3325 assert(Flags == EncodeDiagStateFlags(State) &&
3326 "diag state flags vary in single AST file");
3330 assert(!IncludeNonPragmaStates ||
3331 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3333 unsigned &DiagStateID = DiagStateIDMap[State];
3334 Record.push_back(DiagStateID);
3336 if (DiagStateID == 0) {
3337 DiagStateID = ++CurrID;
3338 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3341 auto SizeIdx =
Record.size();
3343 for (
const auto &I : *State) {
3345 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3349 if (!I.second.isPragma() &&
3350 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3352 Mappings.push_back(I);
3356 llvm::sort(Mappings, llvm::less_first());
3358 for (
const auto &I : Mappings) {
3359 Record.push_back(I.first);
3360 Record.push_back(I.second.serialize());
3367 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3370 auto NumLocationsIdx =
Record.size();
3374 unsigned NumLocations = 0;
3375 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3376 if (!FileIDAndFile.first.isValid() ||
3377 !FileIDAndFile.second.HasLocalTransitions)
3381 AddFileID(FileIDAndFile.first,
Record);
3383 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3384 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3385 Record.push_back(StatePoint.Offset);
3386 AddDiagState(StatePoint.State,
false);
3391 Record[NumLocationsIdx] = NumLocations;
3399 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3400 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3405 Record.push_back(
Diag.DiagStateOnPushStack.size());
3406 for (
const auto *State :
Diag.DiagStateOnPushStack)
3407 AddDiagState(State,
false);
3417void ASTWriter::WriteType(ASTContext &Context, QualType
T) {
3418 TypeIdx &IdxRef = TypeIdxs[
T];
3420 IdxRef = TypeIdx(0, NextTypeID++);
3421 TypeIdx Idx = IdxRef;
3424 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3428 ASTTypeWriter(Context, *
this).write(
T) - DeclTypesBlockStartOffset;
3432 if (TypeOffsets.size() == Index)
3433 TypeOffsets.emplace_back(Offset);
3434 else if (TypeOffsets.size() < Index) {
3435 TypeOffsets.resize(Index + 1);
3436 TypeOffsets[Index].set(Offset);
3438 llvm_unreachable(
"Types emitted in wrong order");
3447 auto *ND = dyn_cast<NamedDecl>(D);
3462uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3463 const DeclContext *DC) {
3471 uint64_t Offset = Stream.GetCurrentBitNo();
3472 SmallVector<DeclID, 128> KindDeclPairs;
3473 for (
const auto *D : DC->
decls()) {
3474 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3482 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3486 KindDeclPairs.push_back(D->getKind());
3487 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3490 ++NumLexicalDeclContexts;
3492 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3493 bytes(KindDeclPairs));
3497void ASTWriter::WriteTypeDeclOffsets() {
3498 using namespace llvm;
3501 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3503 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3504 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3505 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3508 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3512 Abbrev = std::make_shared<BitCodeAbbrev>();
3514 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3515 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3516 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3519 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3523void ASTWriter::WriteFileDeclIDsMap() {
3524 using namespace llvm;
3526 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3527 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3528 for (
const auto &P : FileDeclIDs)
3529 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3530 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3533 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3534 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3535 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3536 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3537 llvm::stable_sort(Info.DeclIDs);
3538 for (
auto &LocDeclEntry : Info.DeclIDs)
3539 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3542 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3544 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3545 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3546 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3548 FileGroupedDeclIDs.size()};
3549 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3552void ASTWriter::WriteComments(ASTContext &Context) {
3554 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3559 for (
const auto &FO : Context.
Comments.OrderedComments) {
3560 for (
const auto &OC : FO.second) {
3561 const RawComment *I = OC.second;
3579class ASTMethodPoolTrait {
3583 using key_type = Selector;
3584 using key_type_ref = key_type;
3588 ObjCMethodList Instance, Factory;
3590 using data_type_ref =
const data_type &;
3592 using hash_value_type = unsigned;
3593 using offset_type = unsigned;
3595 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3597 static hash_value_type
ComputeHash(Selector Sel) {
3601 std::pair<unsigned, unsigned>
3602 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3603 data_type_ref Methods) {
3607 unsigned DataLen = 4 + 2 + 2;
3608 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3610 if (ShouldWriteMethodListNode(
Method))
3611 DataLen +=
sizeof(
DeclID);
3612 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3614 if (ShouldWriteMethodListNode(
Method))
3615 DataLen +=
sizeof(
DeclID);
3619 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3620 using namespace llvm::support;
3622 endian::Writer
LE(Out, llvm::endianness::little);
3624 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3630 for (
unsigned I = 0; I != N; ++I)
3635 void EmitData(raw_ostream& Out, key_type_ref,
3636 data_type_ref Methods,
unsigned DataLen) {
3637 using namespace llvm::support;
3639 endian::Writer
LE(Out, llvm::endianness::little);
3642 unsigned NumInstanceMethods = 0;
3643 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3645 if (ShouldWriteMethodListNode(
Method))
3646 ++NumInstanceMethods;
3648 unsigned NumFactoryMethods = 0;
3649 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3651 if (ShouldWriteMethodListNode(
Method))
3652 ++NumFactoryMethods;
3654 unsigned InstanceBits = Methods.Instance.getBits();
3655 assert(InstanceBits < 4);
3656 unsigned InstanceHasMoreThanOneDeclBit =
3657 Methods.Instance.hasMoreThanOneDecl();
3658 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3659 (InstanceHasMoreThanOneDeclBit << 2) |
3661 unsigned FactoryBits = Methods.Factory.getBits();
3662 assert(FactoryBits < 4);
3663 unsigned FactoryHasMoreThanOneDeclBit =
3664 Methods.Factory.hasMoreThanOneDecl();
3665 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3666 (FactoryHasMoreThanOneDeclBit << 2) |
3670 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3672 if (ShouldWriteMethodListNode(
Method))
3674 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3676 if (ShouldWriteMethodListNode(
Method))
3679 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3683 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3695void ASTWriter::WriteSelectors(Sema &SemaRef) {
3696 using namespace llvm;
3701 unsigned NumTableEntries = 0;
3704 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3705 ASTMethodPoolTrait Trait(*
this);
3709 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3710 for (
auto &SelectorAndID : SelectorIDs) {
3711 Selector S = SelectorAndID.first;
3713 SemaObjC::GlobalMethodPool::iterator F =
3715 ASTMethodPoolTrait::data_type
Data = {
3721 Data.Instance = F->second.first;
3722 Data.Factory = F->second.second;
3726 if (Chain && ID < FirstSelectorID) {
3728 bool changed =
false;
3729 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3731 if (!M->getMethod()->isFromASTFile()) {
3737 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3739 if (!M->getMethod()->isFromASTFile()) {
3747 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3755 SmallString<4096> MethodPool;
3758 using namespace llvm::support;
3760 ASTMethodPoolTrait Trait(*
this);
3761 llvm::raw_svector_ostream
Out(MethodPool);
3763 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3764 BucketOffset =
Generator.Emit(Out, Trait);
3768 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3770 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3771 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3772 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3773 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3779 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3783 Abbrev = std::make_shared<BitCodeAbbrev>();
3785 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3786 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3787 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3788 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3792 RecordData::value_type
Record[] = {
3795 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3796 bytes(SelectorOffsets));
3802void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3803 using namespace llvm;
3815 Selector Sel = SelectorAndLocation.first;
3816 SourceLocation Loc = SelectorAndLocation.second;
3817 Writer.AddSelectorRef(Sel);
3839 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3841 if (!Redecl->isFromASTFile()) {
3845 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3853 if (Redecl->getOwningModuleID() == 0)
3858 if (!
First->isFromASTFile())
3869bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3870 bool IsModule,
bool IsCPlusPlus) {
3871 bool NeedDecls = !IsModule || !IsCPlusPlus;
3873 bool IsInteresting =
3880 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3888bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3889 ASTWriter &Writer) {
3891 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3892 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3895class ASTIdentifierTableTrait {
3898 IdentifierResolver *IdResolver;
3908 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3913 using key_type =
const IdentifierInfo *;
3914 using key_type_ref = key_type;
3917 using data_type_ref = data_type;
3919 using hash_value_type = unsigned;
3920 using offset_type = unsigned;
3922 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3923 IdentifierResolver *IdResolver,
bool IsModule,
3925 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3926 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3927 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3929 bool needDecls()
const {
return NeedDecls; }
3931 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3932 return llvm::djbHash(II->
getName());
3940 std::pair<unsigned, unsigned>
3941 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3950 if (InterestingIdentifierOffsets &&
3952 InterestingIdentifierOffsets->push_back(
Out.tell());
3963 if (NeedDecls && IdResolver)
3964 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3970 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3974 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3976 using namespace llvm::support;
3978 endian::Writer
LE(Out, llvm::endianness::little);
3988 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
3991 bool HasMacroDefinition =
3994 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
3996 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
4001 if (HasMacroDefinition)
4004 if (NeedDecls && IdResolver) {
4011 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
4012 for (NamedDecl *D : llvm::reverse(Decls))
4030void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4031 IdentifierResolver *IdResolver,
4033 using namespace llvm;
4035 RecordData InterestingIdents;
4040 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4041 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4042 IsModule ? &InterestingIdents :
nullptr);
4046 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4047 for (
auto IdentIDPair : IdentifierIDs) {
4048 const IdentifierInfo *II = IdentIDPair.first;
4050 assert(II &&
"NULL identifier in identifier table");
4055 (Trait.needDecls() &&
4061 SmallString<4096> IdentifierTable;
4064 using namespace llvm::support;
4066 llvm::raw_svector_ostream
Out(IdentifierTable);
4068 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4069 BucketOffset =
Generator.Emit(Out, Trait);
4073 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4075 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4076 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4077 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4081 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4085 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4087 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4088 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4089 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4092 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4093 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4097 IdentifierOffsets.size()};
4098 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4099 bytes(IdentifierOffsets));
4103 if (!InterestingIdents.empty())
4111 PendingEmittingVTables.push_back(RD);
4115 TouchedModuleFiles.insert(MF);
4124class ASTDeclContextNameLookupTraitBase {
4132 using data_type = std::pair<unsigned, unsigned>;
4133 using data_type_ref =
const data_type &;
4138 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4141 data_type getData(
const DeclIDsTy &LocalIDs) {
4142 unsigned Start = DeclIDs.size();
4143 for (
auto ID : LocalIDs)
4144 DeclIDs.push_back(ID);
4145 return std::make_pair(Start, DeclIDs.size());
4148 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4149 unsigned Start = DeclIDs.size();
4152 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4153 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4154 return std::make_pair(Start, DeclIDs.size());
4157 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4159 "have reference to loaded module file but no chain?");
4161 using namespace llvm::support;
4164 llvm::endianness::little);
4167 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4168 DeclarationNameKey Name,
4169 data_type_ref Lookup) {
4170 unsigned KeyLen = 1;
4193 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4195 return {KeyLen, DataLen};
4198 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4199 using namespace llvm::support;
4201 endian::Writer
LE(Out, llvm::endianness::little);
4216 "Invalid operator?");
4226 llvm_unreachable(
"Invalid name kind?");
4229 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4230 using namespace llvm::support;
4232 endian::Writer
LE(Out, llvm::endianness::little);
4234 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4236 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4240class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4242 using primary_module_hash_type = unsigned;
4244 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4245 using key_type_ref = key_type;
4247 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4248 : ASTDeclContextNameLookupTraitBase(Writer) {}
4250 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4253 llvm::FoldingSetNodeID
ID;
4254 ID.AddInteger(Key.first.getHash());
4255 ID.AddInteger(Key.second);
4256 return ID.computeStableHash();
4259 std::pair<unsigned, unsigned>
4260 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4261 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4262 KeyLen +=
sizeof(Key.second);
4266 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4267 EmitKeyBase(Out, Key.first);
4268 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4269 LE.write<primary_module_hash_type>(Key.second);
4272 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4274 EmitDataBase(Out, Lookup, DataLen);
4278class ASTDeclContextNameTrivialLookupTrait
4279 :
public ASTDeclContextNameLookupTraitBase {
4281 using key_type = DeclarationNameKey;
4282 using key_type_ref = key_type;
4285 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4287 using ASTDeclContextNameLookupTraitBase::getData;
4289 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4291 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4293 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4294 DeclarationNameKey Name,
4295 data_type_ref Lookup) {
4296 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4300 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4301 return EmitKeyBase(Out, Name);
4304 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4306 EmitDataBase(Out, Lookup, DataLen);
4310static bool isModuleLocalDecl(NamedDecl *D) {
4315 return isModuleLocalDecl(Parent);
4319 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4320 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4321 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4337static bool isTULocalInNamedModules(NamedDecl *D) {
4360class ASTDeclContextNameLookupTrait
4361 :
public ASTDeclContextNameTrivialLookupTrait {
4363 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4365 using ModuleLevelDeclsMapTy =
4366 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4369 enum class LookupVisibility {
4379 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4382 return LookupVisibility::GenerallyVisibile;
4384 if (isModuleLocalDecl(D))
4385 return LookupVisibility::ModuleLocalVisible;
4386 if (isTULocalInNamedModules(D))
4387 return LookupVisibility::TULocal;
4399 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4400 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4405 return Found->isInvisibleOutsideTheOwningModule();
4407 return ECD->isFromExplicitGlobalModule() ||
4408 ECD->isInAnonymousNamespace()
4409 ? LookupVisibility::TULocal
4410 : LookupVisibility::ModuleLocalVisible;
4413 return LookupVisibility::GenerallyVisibile;
4417 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4418 TULocalDeclsMapTy TULocalDeclsMap;
4421 using ASTDeclContextNameTrivialLookupTrait::
4422 ASTDeclContextNameTrivialLookupTrait;
4424 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4425 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4427 template <
typename Coll> data_type getData(
const Coll &Decls) {
4428 unsigned Start = DeclIDs.size();
4429 auto AddDecl = [
this](NamedDecl *D) {
4430 NamedDecl *DeclForLocalLookup =
4446 switch (getLookupVisibility(DeclForLocalLookup)) {
4447 case LookupVisibility::ModuleLocalVisible:
4450 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4451 auto Iter = ModuleLocalDeclsMap.find(Key);
4452 if (Iter == ModuleLocalDeclsMap.end())
4453 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4455 Iter->second.push_back(ID);
4459 case LookupVisibility::TULocal: {
4460 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4461 if (Iter == TULocalDeclsMap.end())
4464 Iter->second.push_back(ID);
4467 case LookupVisibility::GenerallyVisibile:
4472 DeclIDs.push_back(ID);
4474 ASTReader *Chain = Writer.
getChain();
4475 for (NamedDecl *D : Decls) {
4486 for (
const auto &[_,
First] : Firsts)
4492 return std::make_pair(Start, DeclIDs.size());
4495 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4496 return ModuleLocalDeclsMap;
4499 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4505class LazySpecializationInfoLookupTrait {
4507 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4510 using key_type = unsigned;
4511 using key_type_ref = key_type;
4514 using data_type = std::pair<unsigned, unsigned>;
4515 using data_type_ref =
const data_type &;
4517 using hash_value_type = unsigned;
4518 using offset_type = unsigned;
4520 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4523 template <
typename Col,
typename Col2>
4524 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4525 unsigned Start = Specs.size();
4528 const_cast<NamedDecl *
>(D));
4533 Specs.push_back(Info);
4534 return std::make_pair(Start, Specs.size());
4537 data_type ImportData(
4539 unsigned Start = Specs.size();
4540 for (
auto ID : FromReader)
4541 Specs.push_back(ID);
4542 return std::make_pair(Start, Specs.size());
4545 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4547 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4549 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4551 "have reference to loaded module file but no chain?");
4553 using namespace llvm::support;
4556 llvm::endianness::little);
4559 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4561 data_type_ref Lookup) {
4563 unsigned KeyLen = 4;
4565 (Lookup.second - Lookup.first);
4570 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4571 using namespace llvm::support;
4573 endian::Writer
LE(Out, llvm::endianness::little);
4577 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4579 using namespace llvm::support;
4581 endian::Writer
LE(Out, llvm::endianness::little);
4584 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4585 LE.write<
DeclID>(Specs[I].getRawValue());
4587 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4591unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4592 ArrayRef<TemplateArgument> Args;
4593 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4594 Args = CTSD->getTemplateArgs().asArray();
4595 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4596 Args = VTSD->getTemplateArgs().asArray();
4597 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4598 Args = FD->getTemplateSpecializationArgs()->asArray();
4600 llvm_unreachable(
"New Specialization Kind?");
4606void ASTWriter::GenerateSpecializationInfoLookupTable(
4607 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4608 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4612 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4613 LazySpecializationInfoLookupTrait>
4615 LazySpecializationInfoLookupTrait Trait(*
this);
4617 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4623 auto Iter = SpecializationMaps.find(HashedValue);
4624 if (Iter == SpecializationMaps.end())
4625 Iter = SpecializationMaps
4626 .try_emplace(HashedValue,
4627 llvm::SmallVector<const NamedDecl *, 4>())
4637 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4638 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4648 ExisitingSpecs = Lookups->Table.find(HashValue);
4650 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4660 auto *ToEmitMaybeMergedLookupTable =
4661 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4662 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4665uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4666 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4669 llvm::SmallString<4096> LookupTable;
4670 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4673 uint64_t Offset = Stream.GetCurrentBitNo();
4674 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4676 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4677 : DeclSpecializationsAbbrev,
4689 for (
auto *D :
Result.getLookupResult()) {
4691 if (LocalD->isFromASTFile())
4709void ASTWriter::GenerateNameLookupTable(
4710 ASTContext &Context,
const DeclContext *ConstDC,
4711 llvm::SmallVectorImpl<char> &LookupTable,
4712 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4713 llvm::SmallVectorImpl<char> &TULookupTable) {
4714 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4715 !ConstDC->hasLazyExternalLexicalLookups() &&
4716 "must call buildLookups first");
4719 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4723 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4724 ASTDeclContextNameLookupTrait>
4726 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4731 SmallVector<DeclarationName, 16> Names;
4735 bool IncludeConstructorNames =
false;
4736 bool IncludeConversionNames =
false;
4763 if (
Result.getLookupResult().empty())
4766 switch (Name.getNameKind()) {
4768 Names.push_back(Name);
4772 IncludeConstructorNames =
true;
4776 IncludeConversionNames =
true;
4784 if (IncludeConstructorNames || IncludeConversionNames) {
4789 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4791 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4792 auto Name = ChildND->getDeclName();
4793 switch (Name.getNameKind()) {
4798 if (!IncludeConstructorNames)
4803 if (!IncludeConversionNames)
4807 if (AddedNames.insert(Name).second)
4808 Names.push_back(Name);
4816 for (
auto &Name : Names)
4823 SmallVector<NamedDecl *, 8> ConstructorDecls;
4824 SmallVector<NamedDecl *, 8> ConversionDecls;
4828 for (
auto &Name : Names) {
4831 switch (Name.getNameKind()) {
4849 if (!ConstructorDecls.empty())
4850 Generator.insert(ConstructorDecls.front()->getDeclName(),
4851 Trait.getData(ConstructorDecls), Trait);
4852 if (!ConversionDecls.empty())
4853 Generator.insert(ConversionDecls.front()->getDeclName(),
4854 Trait.getData(ConversionDecls), Trait);
4866 auto *ToEmitMaybeMergedLookupTable =
4867 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4868 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4870 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4871 if (!ModuleLocalDecls.empty()) {
4872 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4873 ModuleLevelNameLookupTrait>
4874 ModuleLocalLookupGenerator;
4875 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4877 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4878 const auto &Key = ModuleLocalIter.first;
4879 const auto &IDs = ModuleLocalIter.second;
4880 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4886 auto *ModuleLocalLookups =
4887 (isGeneratingReducedBMI() && Chain &&
4891 ModuleLocalLookupGenerator.emit(ModuleLocalLookupTable, ModuleLocalTrait,
4892 ModuleLocalLookups);
4895 const auto &TULocalDecls = Trait.getTULocalDecls();
4896 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4897 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4898 ASTDeclContextNameTrivialLookupTrait>
4900 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4902 for (
const auto &TULocalIter : TULocalDecls) {
4903 const auto &Key = TULocalIter.first;
4904 const auto &IDs = TULocalIter.second;
4905 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4910 auto *TULocalLookups =
4914 TULookupGenerator.emit(TULookupTable, TULocalTrait, TULocalLookups);
4923void ASTWriter::WriteDeclContextVisibleBlock(
4924 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4934 Prev = Prev->getPreviousDecl())
4935 if (!Prev->isFromASTFile())
4945 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4948 LookupResults.reserve(Map->size());
4949 for (
auto &Entry : *Map)
4950 LookupResults.push_back(
4951 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4954 llvm::sort(LookupResults, llvm::less_first());
4955 for (
auto &NameAndResult : LookupResults) {
4956 DeclarationName Name = NameAndResult.first;
4963 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4964 "function name in a namespace!");
4968 for (NamedDecl *ND :
Result) {
4972 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
5006 if (!Map || Map->empty())
5011 SmallString<4096> LookupTable;
5012 SmallString<4096> ModuleLocalLookupTable;
5013 SmallString<4096> TULookupTable;
5014 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5019 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
5021 ++NumVisibleDeclContexts;
5023 if (!ModuleLocalLookupTable.empty()) {
5027 RecordData::value_type ModuleLocalRecord[] = {
5029 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
5030 ModuleLocalRecord, ModuleLocalLookupTable);
5031 ++NumModuleLocalDeclContexts;
5034 if (!TULookupTable.empty()) {
5037 RecordData::value_type TULocalDeclsRecord[] = {
5039 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
5041 ++NumTULocalDeclContexts;
5051void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
5052 const DeclContext *DC) {
5054 if (!Map || Map->empty())
5058 SmallString<4096> LookupTable;
5059 SmallString<4096> ModuleLocalLookupTable;
5060 SmallString<4096> TULookupTable;
5061 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5072 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5074 if (!ModuleLocalLookupTable.empty()) {
5076 RecordData::value_type ModuleLocalRecord[] = {
5078 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5079 ModuleLocalLookupTable);
5082 if (!TULookupTable.empty()) {
5083 RecordData::value_type GMFRecord[] = {
5085 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5091void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5097void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5103 for (
const auto &I:Opts.OptMap) {
5104 AddString(I.getKey(),
Record);
5105 auto V = I.getValue();
5106 Record.push_back(
V.Supported ? 1 : 0);
5107 Record.push_back(
V.Enabled ? 1 : 0);
5108 Record.push_back(
V.WithPragma ? 1 : 0);
5115void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5116 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5117 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5122void ASTWriter::WriteObjCCategories() {
5123 if (ObjCClassesWithCategories.empty())
5126 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5127 RecordData Categories;
5129 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5131 unsigned StartIndex = Categories.size();
5133 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5136 Categories.push_back(0);
5140 Cat =
Class->known_categories_begin(),
5141 CatEnd =
Class->known_categories_end();
5142 Cat != CatEnd; ++Cat, ++Size) {
5143 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5144 AddDeclRef(*Cat, Categories);
5148 Categories[StartIndex] =
Size;
5151 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5152 CategoriesMap.push_back(CatInfo);
5157 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5160 using namespace llvm;
5162 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5164 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5165 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5166 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5169 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5170 reinterpret_cast<char *
>(CategoriesMap.data()),
5171 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5177void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5184 for (
auto &LPTMapEntry : LPTMap) {
5185 const FunctionDecl *FD = LPTMapEntry.first;
5186 LateParsedTemplate &LPT = *LPTMapEntry.second;
5192 for (
const auto &
Tok : LPT.
Toks) {
5200void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5203 AddSourceLocation(PragmaLoc,
Record);
5208void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5216void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5224void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5235 AddAlignPackInfo(StackEntry.Value,
Record);
5236 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5237 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5238 AddString(StackEntry.StackSlotLabel,
Record);
5244void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5254 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5255 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5256 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5257 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5258 AddString(StackEntry.StackSlotLabel,
Record);
5264void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5274void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5275 ModuleFileExtensionWriter &Writer) {
5280 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5282 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5283 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5284 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5285 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5286 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5287 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5293 Record.push_back(Metadata.MajorVersion);
5294 Record.push_back(Metadata.MinorVersion);
5295 Record.push_back(Metadata.BlockName.size());
5296 Record.push_back(Metadata.UserInfo.size());
5297 SmallString<64> Buffer;
5298 Buffer += Metadata.BlockName;
5299 Buffer += Metadata.UserInfo;
5300 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5309void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5324 auto &Record = *
this;
5330 Writer->isWritingStdCXXHeaderUnit())))
5331 return Record.push_back(0);
5333 Record.push_back(A->
getKind() + 1);
5337 Record.AddSourceRange(A->
getRange());
5341 Record.push_back(A->getAttributeSpellingListIndexRaw());
5344#include "clang/Serialization/AttrPCHWrite.inc"
5350 for (
const auto *A : Attrs)
5361 if (
Tok.isAnnotation()) {
5363 switch (
Tok.getKind()) {
5364 case tok::annot_pragma_loop_hint: {
5368 Record.push_back(Info->Toks.size());
5369 for (
const auto &
T : Info->Toks)
5373 case tok::annot_pragma_pack: {
5376 Record.push_back(
static_cast<unsigned>(Info->Action));
5382 case tok::annot_pragma_openmp:
5383 case tok::annot_pragma_openmp_end:
5384 case tok::annot_pragma_unused:
5385 case tok::annot_pragma_openacc:
5386 case tok::annot_pragma_openacc_end:
5387 case tok::annot_repl_input_end:
5390 llvm_unreachable(
"missing serialization code for annotation token");
5401 Record.push_back(Str.size());
5402 llvm::append_range(
Record, Str);
5407 Record.push_back(Str.size());
5408 llvm::append_range(Blob, Str);
5412 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5415 StringRef PathStr(Path.data(), Path.size());
5416 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5420 PP->getFileManager().makeAbsolutePath(Path,
true);
5422 const char *PathBegin = Path.data();
5423 const char *PathPtr =
5425 if (PathPtr != PathBegin) {
5426 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5450 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5455 Record.push_back(Version.getMajor());
5456 if (std::optional<unsigned> Minor = Version.getMinor())
5457 Record.push_back(*Minor + 1);
5460 if (std::optional<unsigned> Subminor = Version.getSubminor())
5461 Record.push_back(*Subminor + 1);
5479 assert(ID < IdentifierOffsets.size());
5480 IdentifierOffsets[ID] = Offset;
5486 unsigned ID = SelectorIDs[Sel];
5487 assert(ID &&
"Unknown selector");
5490 if (ID < FirstSelectorID)
5492 SelectorOffsets[ID - FirstSelectorID] = Offset;
5498 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5499 bool IncludeTimestamps,
bool BuildingImplicitModule,
5500 bool GeneratingReducedBMI)
5501 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5502 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5503 BuildingImplicitModule(BuildingImplicitModule),
5504 GeneratingReducedBMI(GeneratingReducedBMI) {
5505 for (
const auto &Ext : Extensions) {
5506 if (
auto Writer = Ext->createExtensionWriter(*
this))
5507 ModuleFileExtensionWriters.push_back(std::move(Writer));
5514 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5515 return PP->getLangOpts();
5519 return IncludeTimestamps ? ModTime : 0;
5524 StringRef OutputFile,
Module *WritingModule,
5525 StringRef isysroot) {
5526 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5529 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5536 Stream.Emit((
unsigned)
'C', 8);
5537 Stream.Emit((
unsigned)
'P', 8);
5538 Stream.Emit((
unsigned)
'C', 8);
5539 Stream.Emit((
unsigned)
'H', 8);
5541 WriteBlockInfoBlock();
5544 this->WritingModule = WritingModule;
5545 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5547 this->WritingModule =
nullptr;
5548 this->BaseDirectory.clear();
5555template<
typename Vector>
5557 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5563template <
typename Vector>
5566 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5572void ASTWriter::computeNonAffectingInputFiles() {
5573 SourceManager &SrcMgr = PP->getSourceManager();
5576 IsSLocAffecting.resize(N,
true);
5577 IsSLocFileEntryAffecting.resize(N,
true);
5582 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5584 unsigned FileIDAdjustment = 0;
5585 unsigned OffsetAdjustment = 0;
5587 NonAffectingFileIDAdjustments.reserve(N);
5588 NonAffectingOffsetAdjustments.reserve(N);
5590 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5591 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5593 for (
unsigned I = 1; I != N; ++I) {
5595 FileID FID = FileID::get(I);
5602 if (!
Cache->OrigEntry)
5610 if (!AffectingModuleMaps)
5614 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5617 IsSLocAffecting[I] =
false;
5618 IsSLocFileEntryAffecting[I] =
5619 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5621 FileIDAdjustment += 1;
5627 if (!NonAffectingFileIDs.empty() &&
5628 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5629 NonAffectingFileIDs.back() = FID;
5631 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5632 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5636 NonAffectingFileIDs.push_back(FID);
5639 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5640 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5643 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5646 FileManager &FileMgr = PP->getFileManager();
5649 for (StringRef Path :
5650 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5652 for (
unsigned I = 1; I != N; ++I) {
5653 if (IsSLocAffecting[I]) {
5659 if (!
Cache->OrigEntry)
5662 Cache->OrigEntry->getNameAsRequested());
5668void ASTWriter::prepareLazyUpdates() {
5671 if (!GeneratingReducedBMI)
5674 DeclUpdateMap DeclUpdatesTmp;
5682 for (
auto &DeclUpdate : DeclUpdates) {
5683 const Decl *D = DeclUpdate.first;
5685 for (
auto &
Update : DeclUpdate.second) {
5688 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
5689 DeclUpdatesTmp[D].push_back(
5690 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
5692 DeclUpdatesLazy[D].push_back(
Update);
5695 DeclUpdates.swap(DeclUpdatesTmp);
5697 UpdatedDeclContextsLazy.swap(UpdatedDeclContexts);
5699 DeclsToEmitEvenIfUnreferenced.clear();
5702void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5703 ASTContext &Context = SemaRef.
Context;
5705 bool isModule = WritingModule !=
nullptr;
5707 prepareLazyUpdates();
5714 PredefinedDecls.insert(D);
5722 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5726 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5730 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5732 RegisterPredefDecl(Context.BuiltinZOSVaListDecl,
5739 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5741 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5743#define BuiltinTemplate(BTName) \
5744 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5745#include "clang/Basic/BuiltinTemplates.inc"
5757 if (GeneratingReducedBMI) {
5783 if (GeneratingReducedBMI)
5805 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5810 SmallVector<const TypedefNameDecl *, 4> UnusedLocalTypedefs;
5812 for (
const TypedefNameDecl *TD : UnusedLocalTypedefs)
5819 "There are local ones at end of translation unit!");
5837 for (
const auto &I : SemaRef.KnownNamespaces)
5842 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5850 for (
const auto &DeleteExprsInfo :
5857 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5859 DeclsToEmitEvenIfUnreferenced.clear();
5864 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5866 const IdentifierInfo *II =
ID.second;
5872 llvm::sort(IIs, llvm::deref<std::less<>>());
5874 for (
const IdentifierInfo *II : IIs)
5885 for (CXXRecordDecl *RD : PendingEmittingVTables)
5888 PendingEmittingVTables.clear();
5891void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5892 ASTContext &Context = SemaRef.
Context;
5894 bool isModule = WritingModule !=
nullptr;
5897 if (!EagerlyDeserializedDecls.empty())
5900 if (!ModularCodegenDecls.empty())
5906 TentativeDefinitions);
5907 if (!TentativeDefinitions.empty())
5914 UnusedFileScopedDecls);
5915 if (!UnusedFileScopedDecls.empty())
5921 if (!ExtVectorDecls.empty())
5927 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5928 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5942 SmallVector<const TypedefNameDecl *, 4> SortedCandidates;
5944 for (
const TypedefNameDecl *TD : SortedCandidates)
5946 if (!UnusedLocalTypedefNameCandidates.empty())
5948 UnusedLocalTypedefNameCandidates);
5950 if (!GeneratingReducedBMI) {
5960 if (!PendingInstantiations.empty())
5964 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
5978 if (!SemaDeclRefs.empty())
5986 if (!DeclsToCheckForDeferredDiags.empty())
5988 DeclsToCheckForDeferredDiags);
5995 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
5996 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
5997 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
5998 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
6006 DelegatingCtorDecls);
6007 if (!DelegatingCtorDecls.empty())
6012 for (
const auto &I : SemaRef.KnownNamespaces) {
6016 if (!KnownNamespaces.empty())
6021 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
6030 if (!UndefinedButUsed.empty())
6037 for (
const auto &DeleteExprsInfo :
6042 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
6043 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
6044 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
6046 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
6050 if (!DeleteExprsToAnalyze.empty())
6054 for (CXXRecordDecl *RD : PendingEmittingVTables) {
6061 if (!VTablesToEmit.empty())
6067 using namespace llvm;
6069 bool isModule = WritingModule !=
nullptr;
6073 Chain->finalizeForWriting();
6077 computeNonAffectingInputFiles();
6079 writeUnhashedControlBlock(*PP);
6092 IdentifierIDs.clear();
6103 SmallVector<const IdentifierInfo *, 128> IIs;
6104 for (
const auto &ID : PP->getIdentifierTable())
6105 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6106 IIs.push_back(
ID.second);
6109 llvm::sort(IIs, llvm::deref<std::less<>>());
6110 for (
const IdentifierInfo *II : IIs)
6118 for (
const auto &WeakUndeclaredIdentifierList :
6120 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6121 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6134 ASTContext &Context = SemaPtr->
Context;
6136 Context, *
this, ExtnameUndeclaredIdentifiers);
6138 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(II);
6139 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(
6141 ExtnameUndeclaredIdentifiersWriter.AddSourceLocation(AL->getLocation());
6148 ASTContext &Context = SemaPtr->
Context;
6153 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6154 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6155 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6160 PrepareWritingSpecialDecls(*SemaPtr);
6163 WriteControlBlock(*PP, isysroot);
6166 Stream.FlushToWord();
6167 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6169 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6186 llvm::SmallVector<Selector, 256> AllSelectors;
6187 for (
auto &SelectorAndID : SelectorIDs)
6188 AllSelectors.push_back(SelectorAndID.first);
6189 for (
auto &Selector : AllSelectors)
6213 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6215 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6216 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6217 SmallString<2048> Buffer;
6219 llvm::raw_svector_ostream
Out(Buffer);
6220 for (ModuleFile &M : Chain->ModuleMgr) {
6221 using namespace llvm::support;
6223 endian::Writer
LE(Out, llvm::endianness::little);
6231 Out.write(Name.data(), Name.size());
6237 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6238 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6252 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6253 Buffer.data(), Buffer.size());
6257 WriteDeclAndTypes(SemaPtr->
Context);
6259 WriteFileDeclIDsMap();
6260 WriteSourceManagerBlock(PP->getSourceManager());
6262 WriteComments(SemaPtr->
Context);
6263 WritePreprocessor(*PP, isModule);
6264 WriteHeaderSearch(PP->getHeaderSearchInfo());
6266 WriteSelectors(*SemaPtr);
6267 WriteReferencedSelectorsPool(*SemaPtr);
6268 WriteLateParsedTemplates(*SemaPtr);
6270 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6273 WriteOpenCLExtensions(*SemaPtr);
6274 WriteCUDAPragmas(*SemaPtr);
6275 WriteRISCVIntrinsicPragmas(*SemaPtr);
6280 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6285 WriteSpecialDeclRecords(*SemaPtr);
6288 if (!WeakUndeclaredIdentifiers.empty())
6290 WeakUndeclaredIdentifiers);
6294 if (!ExtnameUndeclaredIdentifiers.empty())
6296 ExtnameUndeclaredIdentifiers);
6298 if (!WritingModule) {
6303 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6305 llvm::SmallVector<ModuleInfo, 64> Imports;
6308 assert(SubmoduleIDs.contains(I->getImportedModule()));
6309 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6310 I->getImportedModule()));
6314 if (!Imports.empty()) {
6315 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6318 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6319 return A.ID == B.ID;
6323 llvm::sort(Imports,
Cmp);
6324 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6327 for (
const auto &Import : Imports) {
6328 ImportedModules.push_back(
Import.ID);
6339 WriteObjCCategories();
6341 if (!WritingModule) {
6342 WriteOptimizePragmaOptions(*SemaPtr);
6343 WriteMSStructPragmaOptions(*SemaPtr);
6344 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6346 WritePackPragmaOptions(*SemaPtr);
6347 WriteFloatControlPragmaOptions(*SemaPtr);
6348 WriteDeclsWithEffectsToVerify(*SemaPtr);
6352 RecordData::value_type
Record[] = {NumStatements,
6354 NumLexicalDeclContexts,
6355 NumVisibleDeclContexts,
6356 NumModuleLocalDeclContexts,
6357 NumTULocalDeclContexts};
6360 Stream.FlushToWord();
6361 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6365 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6366 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6368 return backpatchSignature();
6374void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6378 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6380void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6384 DeclUpdates[D].push_back(
6385 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6394 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6397 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6401void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6406 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6410 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6411 while (!DeclTypesToEmit.empty()) {
6412 DeclOrType DOT = DeclTypesToEmit.front();
6413 DeclTypesToEmit.pop();
6415 WriteType(Context, DOT.getType());
6417 WriteDecl(Context, DOT.getDecl());
6419 }
while (!DeclUpdates.empty());
6421 DoneWritingDeclsAndTypes =
true;
6425 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6427 for (NamespaceDecl *NS : DelayedNamespace) {
6428 LookupBlockOffsets Offsets;
6430 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6431 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6452 assert(DeclTypesToEmit.empty());
6453 assert(DeclUpdates.empty());
6458 WriteTypeDeclOffsets();
6459 if (!DeclUpdatesOffsetsRecord.empty())
6462 if (!DelayedNamespaceRecord.empty())
6464 DelayedNamespaceRecord);
6466 if (!RelatedDeclsMap.empty()) {
6470 for (
const auto &Pair : RelatedDeclsMap) {
6471 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6472 RelatedDeclsMapRecord.push_back(Pair.second.size());
6473 for (
const auto &Lambda : Pair.second)
6474 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6477 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6479 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6480 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6481 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6483 FunctionToLambdaMapAbbrev);
6486 if (!SpecializationsUpdates.empty()) {
6487 WriteSpecializationsUpdates(
false);
6488 SpecializationsUpdates.clear();
6491 if (!PartialSpecializationsUpdates.empty()) {
6492 WriteSpecializationsUpdates(
true);
6493 PartialSpecializationsUpdates.clear();
6499 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6508 NewGlobalKindDeclPairs.push_back(D->
getKind());
6509 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6512 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6514 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6515 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6518 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6519 bytes(NewGlobalKindDeclPairs));
6521 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6523 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6524 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6525 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6527 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6529 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6530 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6531 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6533 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6535 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6536 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6537 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6540 WriteDeclContextVisibleUpdate(Context, TU);
6543 if (Context.ExternCContext)
6544 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6547 for (
auto *DC : UpdatedDeclContexts)
6548 WriteDeclContextVisibleUpdate(Context, DC);
6551void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6555 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6556 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6557 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6558 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6559 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6562 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6563 for (
auto &SpecializationUpdate : SpecUpdates) {
6564 const NamedDecl *D = SpecializationUpdate.first;
6566 llvm::SmallString<4096> LookupTable;
6567 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6568 LookupTable, IsPartial);
6571 RecordData::value_type
Record[] = {
6572 static_cast<RecordData::value_type
>(RecordType),
6574 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6578void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6579 RecordDataImpl &OffsetsRecord) {
6580 if (DeclUpdates.empty())
6583 DeclUpdateMap LocalUpdates;
6584 LocalUpdates.swap(DeclUpdates);
6586 for (
auto &DeclUpdate : LocalUpdates) {
6587 const Decl *D = DeclUpdate.first;
6589 bool HasUpdatedBody =
false;
6590 bool HasAddedVarDefinition =
false;
6593 for (
auto &
Update : DeclUpdate.second) {
6598 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6599 HasUpdatedBody =
true;
6600 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6601 HasAddedVarDefinition =
true;
6603 Record.push_back(llvm::to_underlying(Kind));
6606 case DeclUpdateKind::CXXAddedImplicitMember:
6607 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6608 assert(
Update.getDecl() &&
"no decl to add?");
6611 case DeclUpdateKind::CXXAddedFunctionDefinition:
6612 case DeclUpdateKind::CXXAddedVarDefinition:
6615 case DeclUpdateKind::CXXPointOfInstantiation:
6620 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6625 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6630 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6632 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6633 Record.push_back(RD->isParamDestroyedInCallee());
6634 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6635 Record.AddCXXDefinitionData(RD);
6636 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6641 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6642 Record.push_back(MSInfo->getTemplateSpecializationKind());
6643 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6646 Record.push_back(Spec->getTemplateSpecializationKind());
6647 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6651 auto From = Spec->getInstantiatedFrom();
6652 if (
auto PartialSpec =
6653 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6655 Record.AddDeclRef(PartialSpec);
6656 Record.AddTemplateArgumentList(
6657 &Spec->getTemplateInstantiationArgs());
6662 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6663 Record.AddSourceLocation(RD->getLocation());
6664 Record.AddSourceLocation(RD->getBeginLoc());
6665 Record.AddSourceRange(RD->getBraceRange());
6676 case DeclUpdateKind::CXXResolvedDtorDelete:
6681 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6685 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6689 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6693 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6696 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6700 case DeclUpdateKind::CXXDeducedReturnType:
6704 case DeclUpdateKind::DeclMarkedUsed:
6707 case DeclUpdateKind::ManglingNumber:
6708 case DeclUpdateKind::StaticLocalNumber:
6712 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6714 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6717 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6718 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6719 Record.push_back(A->getAllocatorType());
6720 Record.AddStmt(A->getAllocator());
6721 Record.AddStmt(A->getAlignment());
6722 Record.AddSourceRange(A->getRange());
6726 case DeclUpdateKind::DeclMarkedOpenMPIndirectCall:
6728 D->
getAttr<OMPTargetIndirectCallAttr>()->getRange());
6731 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6732 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6734 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6737 case DeclUpdateKind::DeclExported:
6741 case DeclUpdateKind::AddedAttrToRecord:
6742 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6750 if (HasUpdatedBody) {
6753 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6754 Record.push_back(Def->isInlined());
6755 Record.AddSourceLocation(Def->getInnerLocStart());
6756 Record.AddFunctionDefinition(Def);
6757 }
else if (HasAddedVarDefinition) {
6760 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6761 Record.push_back(VD->isInline());
6762 Record.push_back(VD->isInlineSpecified());
6763 Record.AddVarDeclInit(VD);
6780 NonAffectingFileIDs.empty())
6782 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6783 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6784 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6785 return FileID::get(FID.getOpaqueValue() - Offset);
6788unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6794 unsigned AdjustedNumCreatedFIDs = 0;
6795 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6796 if (IsSLocAffecting[I])
6797 ++AdjustedNumCreatedFIDs;
6798 return AdjustedNumCreatedFIDs;
6808 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6809 getAdjustedLocation(
Range.getEnd()));
6814 return Offset - getAdjustment(Offset);
6819 if (NonAffectingRanges.empty())
6822 if (PP->getSourceManager().isLoadedOffset(Offset))
6825 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6826 return NonAffectingOffsetAdjustments.back();
6828 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6832 return Range.getEnd().getOffset() < Offset;
6835 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6836 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6837 return NonAffectingOffsetAdjustments[Idx];
6841 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6847 unsigned ModuleFileIndex = 0;
6850 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6853 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6854 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6855 "Corrupted global sloc offset map");
6860 ModuleFileIndex = F->
Index + 1;
6868 Loc = getAdjustedLocation(Loc);
6905 MacroInfoToEmitData Info = { Name, MI, ID };
6906 MacroInfosToEmit.push_back(Info);
6912 return IdentMacroDirectivesOffsetMap.lookup(Name);
6916 Record->push_back(Writer->getSelectorRef(SelRef));
6925 if (SID == 0 && Chain) {
6928 Chain->LoadSelector(Sel);
6929 SID = SelectorIDs[Sel];
6932 SID = NextSelectorID++;
6933 SelectorIDs[Sel] = SID;
6975 bool InfoHasSameExpr
6977 Record->push_back(InfoHasSameExpr);
6978 if (InfoHasSameExpr)
6995 TypeLocWriter TLW(*
this);
7005template <
typename IdxForTypeTy>
7007 IdxForTypeTy IdxForType) {
7011 unsigned FastQuals =
T.getLocalFastQualifiers();
7012 T.removeLocalFastQualifiers();
7014 if (
T.hasLocalNonFastQualifiers())
7015 return IdxForType(
T).asTypeID(FastQuals);
7017 assert(!
T.hasLocalQualifiers());
7019 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr()))
7022 if (
T == Context.AutoDeductTy)
7024 if (
T == Context.AutoRRefDeductTy)
7027 return IdxForType(
T).asTypeID(FastQuals);
7034 assert(!
T.getLocalFastQualifiers());
7038 if (DoneWritingDeclsAndTypes) {
7039 assert(0 &&
"New type seen after serializing all the types to emit!");
7045 Idx =
TypeIdx(0, NextTypeID++);
7046 DeclTypesToEmit.push(
T);
7052llvm::MapVector<ModuleFile *, const Decl *>
7054 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
7057 if (R->isFromASTFile())
7058 Firsts[Chain->getOwningModuleFile(R)] = R;
7059 else if (IncludeLocal)
7060 Firsts[
nullptr] = R;
7076 Record.push_back(MacroRef >> 32);
7077 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
7092 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
7109 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7111 if (ID.isInvalid()) {
7112 if (DoneWritingDeclsAndTypes) {
7113 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7120 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7135 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7142 assert(DoneWritingDeclsAndTypes &&
7143 "wasDeclEmitted should only be called after writing declarations");
7148 bool Emitted = DeclIDs.contains(D);
7150 GeneratingReducedBMI) &&
7151 "The declaration within modules can only be omitted in reduced BMI.");
7155void ASTWriter::getLazyUpdates(
const Decl *D) {
7156 if (!GeneratingReducedBMI)
7159 if (
auto *Iter = DeclUpdatesLazy.find(D); Iter != DeclUpdatesLazy.end()) {
7160 for (DeclUpdate &
Update : Iter->second)
7161 DeclUpdates[D].push_back(
Update);
7162 DeclUpdatesLazy.erase(Iter);
7166 if (
auto *DC = dyn_cast<DeclContext>(D);
7167 DC && UpdatedDeclContextsLazy.count(DC)) {
7168 UpdatedDeclContexts.insert(DC);
7169 UpdatedDeclContextsLazy.remove(DC);
7174 assert(
ID.isValid());
7191 SourceManager &
SM = PP->getSourceManager();
7192 SourceLocation FileLoc =
SM.getFileLoc(Loc);
7193 assert(
SM.isLocalSourceLocation(FileLoc));
7194 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7197 assert(
SM.getSLocEntry(FID).isFile());
7198 assert(IsSLocAffecting[FID.ID]);
7200 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7202 Info = std::make_unique<DeclIDInFileInfo>();
7204 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7205 LocDeclIDsTy &Decls = Info->DeclIDs;
7206 Decls.push_back(LocDecl);
7211 "expected an anonymous declaration");
7215 auto It = AnonymousDeclarationNumbers.find(D);
7216 if (It == AnonymousDeclarationNumbers.end()) {
7219 AnonymousDeclarationNumbers[ND] = Number;
7222 It = AnonymousDeclarationNumbers.find(D);
7223 assert(It != AnonymousDeclarationNumbers.end() &&
7224 "declaration not found within its lexical context");
7279 while (QualifierLoc) {
7280 NestedNames.push_back(QualifierLoc);
7284 Record->push_back(NestedNames.size());
7285 while(!NestedNames.empty()) {
7286 QualifierLoc = NestedNames.pop_back_val();
7289 Record->push_back(llvm::to_underlying(Kind));
7292 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7314 llvm_unreachable(
"unexpected null nested name specifier");
7321 assert(TemplateParams &&
"No TemplateParams!");
7326 Record->push_back(TemplateParams->
size());
7327 for (
const auto &P : *TemplateParams)
7330 Record->push_back(
true);
7333 Record->push_back(
false);
7340 assert(TemplateArgs &&
"No TemplateArgs!");
7341 Record->push_back(TemplateArgs->
size());
7342 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7348 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7358 Record->push_back(
Set.size());
7360 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7362 Record->push_back(I.getAccess());
7368 Record->push_back(
Base.isVirtual());
7369 Record->push_back(
Base.isBaseOfClass());
7370 Record->push_back(
Base.getAccessSpecifierAsWritten());
7371 Record->push_back(
Base.getInheritConstructors());
7384 for (
auto &
Base : Bases)
7402 for (
auto *
Init : CtorInits) {
7403 if (
Init->isBaseInitializer()) {
7407 }
else if (
Init->isDelegatingInitializer()) {
7410 }
else if (
Init->isMemberInitializer()){
7423 if (
Init->isWritten())
7437 auto &
Data = D->data();
7439 Record->push_back(
Data.IsLambda);
7443#define FIELD(Name, Width, Merge) \
7444 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7445 Record->push_back(DefinitionBits); \
7446 DefinitionBits.reset(0); \
7448 DefinitionBits.addBits(Data.Name, Width);
7450#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7453 Record->push_back(DefinitionBits);
7459 bool ModulesCodegen =
7464 Record->push_back(ModulesCodegen);
7466 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7471 Record->push_back(
Data.ComputedVisibleConversions);
7472 if (
Data.ComputedVisibleConversions)
7476 if (!
Data.IsLambda) {
7477 Record->push_back(
Data.NumBases);
7478 if (
Data.NumBases > 0)
7482 Record->push_back(
Data.NumVBases);
7483 if (
Data.NumVBases > 0)
7488 auto &Lambda = D->getLambdaData();
7491 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7492 LambdaBits.
addBit(Lambda.IsGenericLambda);
7493 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7494 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7495 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7496 Record->push_back(LambdaBits);
7498 Record->push_back(Lambda.NumExplicitCaptures);
7499 Record->push_back(Lambda.ManglingNumber);
7504 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7511 Record->push_back(CaptureBits);
7513 switch (
Capture.getCaptureKind()) {
7543 assert(ES->CheckedForSideEffects);
7544 Val |= (ES->HasConstantInitialization ? 2 : 0);
7545 Val |= (ES->HasConstantDestruction ? 4 : 0);
7559void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7560 assert(Reader &&
"Cannot remove chain");
7561 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7562 assert(FirstDeclID == NextDeclID &&
7563 FirstTypeID == NextTypeID &&
7564 FirstIdentID == NextIdentID &&
7565 FirstMacroID == NextMacroID &&
7566 FirstSubmoduleID == NextSubmoduleID &&
7567 FirstSelectorID == NextSelectorID &&
7568 "Setting chain after writing has started.");
7574 NextSelectorID = FirstSelectorID;
7575 NextSubmoduleID = FirstSubmoduleID;
7585 unsigned OriginalModuleFileIndex = StoredID >> 32;
7589 if (OriginalModuleFileIndex == 0 && StoredID)
7600 MacroID &StoredID = MacroIDs[MI];
7601 unsigned OriginalModuleFileIndex = StoredID >> 32;
7604 if (OriginalModuleFileIndex == 0 && StoredID)
7613void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7625 TypeIdx &StoredIdx = TypeIdxs[
T];
7631 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7642 DeclIDs[D] = LocalDeclID(ID);
7643 PredefinedDecls.insert(D);
7655 assert(!MacroDefinitions.contains(MD));
7656 MacroDefinitions[MD] =
ID;
7660 assert(!SubmoduleIDs.contains(Mod));
7661 SubmoduleIDs[Mod] =
ID;
7664void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7665 if (Chain && Chain->isProcessingUpdateRecords())
return;
7667 assert(!WritingAST &&
"Already writing the AST!");
7668 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7670 if (RD->isFromASTFile()) {
7675 "completed a tag from another module but not by instantiation?");
7676 DeclUpdates[RD].push_back(
7677 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7691void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7692 if (Chain && Chain->isProcessingUpdateRecords())
return;
7694 "Should not add lookup results to non-lookup contexts!");
7715 assert(!WritingAST &&
"Already writing the AST!");
7716 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7720 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7722 DeclsToEmitEvenIfUnreferenced.push_back(D);
7726 if (Chain && Chain->isProcessingUpdateRecords())
return;
7739 assert(!WritingAST &&
"Already writing the AST!");
7740 DeclUpdates[RD].push_back(
7741 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7744void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7745 if (Chain && Chain->isProcessingUpdateRecords())
return;
7746 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7748 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7753 ->castAs<FunctionProtoType>()
7754 ->getExceptionSpecType()))
7755 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7760 if (Chain && Chain->isProcessingUpdateRecords())
return;
7761 assert(!WritingAST &&
"Already writing the AST!");
7763 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7764 DeclUpdates[D].push_back(
7765 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7772 if (Chain && Chain->isProcessingUpdateRecords())
return;
7773 assert(!WritingAST &&
"Already writing the AST!");
7774 assert(
Delete &&
"Not given an operator delete");
7776 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7777 DeclUpdates[D].push_back(
7778 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7784 if (Chain && Chain->isProcessingUpdateRecords())
7786 assert(!WritingAST &&
"Already writing the AST!");
7787 assert(GlobDelete &&
"Not given an operator delete");
7790 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7791 DeclUpdates[D].push_back(
7792 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7798 if (Chain && Chain->isProcessingUpdateRecords())
7800 assert(!WritingAST &&
"Already writing the AST!");
7801 assert(ArrayDelete &&
"Not given an operator delete");
7804 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7805 DeclUpdates[D].push_back(
7806 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7810void ASTWriter::ResolvedOperatorGlobArrayDelete(
7812 if (Chain && Chain->isProcessingUpdateRecords())
7814 assert(!WritingAST &&
"Already writing the AST!");
7815 assert(GlobArrayDelete &&
"Not given an operator delete");
7818 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7819 DeclUpdates[D].push_back(DeclUpdate(
7820 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7824void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7825 if (Chain && Chain->isProcessingUpdateRecords())
return;
7826 assert(!WritingAST &&
"Already writing the AST!");
7835 DeclUpdates[D].push_back(
7836 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7839void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7840 if (Chain && Chain->isProcessingUpdateRecords())
return;
7841 assert(!WritingAST &&
"Already writing the AST!");
7845 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7848void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7849 if (Chain && Chain->isProcessingUpdateRecords())
return;
7850 assert(!WritingAST &&
"Already writing the AST!");
7858 DeclUpdates[D].push_back(
7859 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7862void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7863 if (Chain && Chain->isProcessingUpdateRecords())
return;
7864 assert(!WritingAST &&
"Already writing the AST!");
7871 if (
auto *VD = dyn_cast<VarDecl>(D))
7872 POI = VD->getPointOfInstantiation();
7875 DeclUpdates[D].push_back(
7876 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7879void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7880 if (Chain && Chain->isProcessingUpdateRecords())
return;
7881 assert(!WritingAST &&
"Already writing the AST!");
7885 DeclUpdates[D].push_back(
7886 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7889void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7890 assert(!WritingAST &&
"Already writing the AST!");
7894 DeclUpdates[D].push_back(
7895 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7900 if (Chain && Chain->isProcessingUpdateRecords())
return;
7901 assert(!WritingAST &&
"Already writing the AST!");
7905 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7906 ObjCClassesWithCategories.insert(
7910void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7911 if (Chain && Chain->isProcessingUpdateRecords())
return;
7912 assert(!WritingAST &&
"Already writing the AST!");
7921 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7924void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7925 if (Chain && Chain->isProcessingUpdateRecords())
return;
7926 assert(!WritingAST &&
"Already writing the AST!");
7930 DeclUpdates[D].push_back(
7931 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7934void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7935 if (Chain && Chain->isProcessingUpdateRecords())
return;
7936 assert(!WritingAST &&
"Already writing the AST!");
7940 DeclUpdates[D].push_back(
7941 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7944void ASTWriter::DeclarationMarkedOpenMPIndirectCall(
const Decl *D) {
7945 if (Chain && Chain->isProcessingUpdateRecords())
7947 assert(!WritingAST &&
"Already writing the AST!");
7951 DeclUpdates[D].push_back(
7952 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPIndirectCall));
7955void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7957 if (Chain && Chain->isProcessingUpdateRecords())
return;
7958 assert(!WritingAST &&
"Already writing the AST!");
7962 DeclUpdates[D].push_back(
7963 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7966void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7967 if (Chain && Chain->isProcessingUpdateRecords())
return;
7968 assert(!WritingAST &&
"Already writing the AST!");
7970 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7973void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7975 if (Chain && Chain->isProcessingUpdateRecords())
return;
7976 assert(!WritingAST &&
"Already writing the AST!");
7977 if (!
Record->isFromASTFile())
7979 DeclUpdates[
Record].push_back(
7980 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7983void ASTWriter::AddedCXXTemplateSpecialization(
7985 assert(!WritingAST &&
"Already writing the AST!");
7989 if (Chain && Chain->isProcessingUpdateRecords())
7992 DeclsToEmitEvenIfUnreferenced.push_back(D);
7995void ASTWriter::AddedCXXTemplateSpecialization(
7997 assert(!WritingAST &&
"Already writing the AST!");
8001 if (Chain && Chain->isProcessingUpdateRecords())
8004 DeclsToEmitEvenIfUnreferenced.push_back(D);
8009 assert(!WritingAST &&
"Already writing the AST!");
8013 if (Chain && Chain->isProcessingUpdateRecords())
8016 DeclsToEmitEvenIfUnreferenced.push_back(D);
8025class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
8030#define GEN_CLANG_CLAUSE_CLASS
8031#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
8032#include "llvm/Frontend/OpenMP/OMP.inc"
8041 OMPClauseWriter(*this).writeClause(
C);
8044void OMPClauseWriter::writeClause(
OMPClause *
C) {
8045 Record.push_back(
unsigned(
C->getClauseKind()));
8047 Record.AddSourceLocation(
C->getBeginLoc());
8048 Record.AddSourceLocation(
C->getEndLoc());
8052 Record.push_back(uint64_t(
C->getCaptureRegion()));
8053 Record.AddStmt(
C->getPreInitStmt());
8057 VisitOMPClauseWithPreInit(
C);
8058 Record.AddStmt(
C->getPostUpdateExpr());
8061void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
8062 VisitOMPClauseWithPreInit(
C);
8064 Record.AddSourceLocation(
C->getNameModifierLoc());
8065 Record.AddSourceLocation(
C->getColonLoc());
8066 Record.AddStmt(
C->getCondition());
8067 Record.AddSourceLocation(
C->getLParenLoc());
8071 VisitOMPClauseWithPreInit(
C);
8072 Record.AddStmt(
C->getCondition());
8073 Record.AddSourceLocation(
C->getLParenLoc());
8077 VisitOMPClauseWithPreInit(
C);
8078 Record.writeEnum(
C->getModifier());
8079 Record.AddStmt(
C->getNumThreads());
8080 Record.AddSourceLocation(
C->getModifierLoc());
8081 Record.AddSourceLocation(
C->getLParenLoc());
8085 Record.AddStmt(
C->getSafelen());
8086 Record.AddSourceLocation(
C->getLParenLoc());
8090 Record.AddStmt(
C->getSimdlen());
8091 Record.AddSourceLocation(
C->getLParenLoc());
8095 Record.push_back(
C->getNumSizes());
8096 for (
Expr *Size :
C->getSizesRefs())
8098 Record.AddSourceLocation(
C->getLParenLoc());
8102 Record.push_back(
C->getNumCounts());
8103 Record.push_back(
C->hasOmpFill());
8104 if (
C->hasOmpFill())
8105 Record.push_back(*
C->getOmpFillIndex());
8106 Record.AddSourceLocation(
C->getOmpFillLoc());
8107 for (
Expr *Count :
C->getCountsRefs())
8109 Record.AddSourceLocation(
C->getLParenLoc());
8113 Record.push_back(
C->getNumLoops());
8114 for (
Expr *Size :
C->getArgsRefs())
8116 Record.AddSourceLocation(
C->getLParenLoc());
8122 Record.AddStmt(
C->getFactor());
8123 Record.AddSourceLocation(
C->getLParenLoc());
8127 Record.AddStmt(
C->getFirst());
8128 Record.AddStmt(
C->getCount());
8129 Record.AddSourceLocation(
C->getLParenLoc());
8130 Record.AddSourceLocation(
C->getFirstLoc());
8131 Record.AddSourceLocation(
C->getCountLoc());
8135 Record.AddStmt(
C->getAllocator());
8136 Record.AddSourceLocation(
C->getLParenLoc());
8140 Record.AddStmt(
C->getNumForLoops());
8141 Record.AddSourceLocation(
C->getLParenLoc());
8144void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
8145 Record.AddStmt(
C->getEventHandler());
8146 Record.AddSourceLocation(
C->getLParenLoc());
8150 Record.push_back(
unsigned(
C->getDefaultKind()));
8151 Record.AddSourceLocation(
C->getLParenLoc());
8152 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8153 Record.push_back(
unsigned(
C->getDefaultVC()));
8154 Record.AddSourceLocation(
C->getDefaultVCLoc());
8158 Record.AddSourceLocation(
C->getLParenLoc());
8159 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8160 Record.writeEnum(
C->getThreadsetKind());
8163void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8164 Record.AddSourceLocation(
C->getLParenLoc());
8165 Record.AddStmt(
C->getImpexType());
8168void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8169 Record.push_back(
unsigned(
C->getProcBindKind()));
8170 Record.AddSourceLocation(
C->getLParenLoc());
8171 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8174void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8175 VisitOMPClauseWithPreInit(
C);
8176 Record.push_back(
C->getScheduleKind());
8177 Record.push_back(
C->getFirstScheduleModifier());
8178 Record.push_back(
C->getSecondScheduleModifier());
8179 Record.AddStmt(
C->getChunkSize());
8180 Record.AddSourceLocation(
C->getLParenLoc());
8181 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8182 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8183 Record.AddSourceLocation(
C->getScheduleKindLoc());
8184 Record.AddSourceLocation(
C->getCommaLoc());
8187void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8188 Record.push_back(
C->getLoopNumIterations().size());
8189 Record.AddStmt(
C->getNumForLoops());
8190 for (
Expr *NumIter :
C->getLoopNumIterations())
8192 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8193 Record.AddStmt(
C->getLoopCounter(I));
8194 Record.AddSourceLocation(
C->getLParenLoc());
8197void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8198 Record.AddStmt(
C->getCondition());
8199 Record.AddSourceLocation(
C->getLParenLoc());
8202void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8204void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8206void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8208void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8210void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *
C) {
8211 Record.push_back(
C->isExtended() ? 1 : 0);
8212 if (
C->isExtended()) {
8213 Record.AddSourceLocation(
C->getLParenLoc());
8214 Record.AddSourceLocation(
C->getArgumentLoc());
8215 Record.writeEnum(
C->getDependencyKind());
8219void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8221void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8224void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8225 Record.AddSourceLocation(
C->getLParenLoc());
8226 Record.AddSourceLocation(
C->getFailParameterLoc());
8227 Record.writeEnum(
C->getFailParameter());
8230void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8232void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8234void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8235 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8236 Record.AddSourceLocation(
C->getLParenLoc());
8237 for (
auto K :
C->getDirectiveKinds()) {
8242void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8244 Record.AddSourceLocation(
C->getLParenLoc());
8247void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8248 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8249 Record.AddSourceLocation(
C->getLParenLoc());
8250 for (
auto K :
C->getDirectiveKinds()) {
8255void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8257void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8258 OMPNoOpenMPRoutinesClause *) {}
8260void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8261 OMPNoOpenMPConstructsClause *) {}
8263void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8265void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8267void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8269void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8271void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8273void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8275void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8277void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8279void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8282 Record.push_back(
C->varlist_size());
8283 Record.push_back(
C->attrs().size());
8287 Record.writeBool(
C->getIsTarget());
8288 Record.writeBool(
C->getIsTargetSync());
8289 Record.writeBool(
C->hasPreferAttrs());
8291 for (OMPInitClause::PrefView P :
C->prefs()) {
8292 Record.push_back(P.Attrs.size());
8293 for (
Expr *A : P.Attrs)
8296 Record.AddSourceLocation(
C->getLParenLoc());
8297 Record.AddSourceLocation(
C->getVarLoc());
8300void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8301 Record.AddStmt(
C->getInteropVar());
8302 Record.AddSourceLocation(
C->getLParenLoc());
8303 Record.AddSourceLocation(
C->getVarLoc());
8306void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8307 Record.AddStmt(
C->getInteropVar());
8308 Record.AddSourceLocation(
C->getLParenLoc());
8309 Record.AddSourceLocation(
C->getVarLoc());
8312void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8313 VisitOMPClauseWithPreInit(
C);
8314 Record.AddStmt(
C->getCondition());
8315 Record.AddSourceLocation(
C->getLParenLoc());
8318void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8319 VisitOMPClauseWithPreInit(
C);
8320 Record.AddStmt(
C->getCondition());
8321 Record.AddSourceLocation(
C->getLParenLoc());
8324void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8325 VisitOMPClauseWithPreInit(
C);
8326 Record.AddStmt(
C->getThreadID());
8327 Record.AddSourceLocation(
C->getLParenLoc());
8331 Record.AddStmt(
C->getAlignment());
8332 Record.AddSourceLocation(
C->getLParenLoc());
8335void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8336 Record.push_back(
C->varlist_size());
8337 Record.AddSourceLocation(
C->getLParenLoc());
8338 for (
auto *
VE :
C->varlist()) {
8341 for (
auto *
VE :
C->private_copies()) {
8346void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8347 Record.push_back(
C->varlist_size());
8348 VisitOMPClauseWithPreInit(
C);
8349 Record.AddSourceLocation(
C->getLParenLoc());
8350 for (
auto *
VE :
C->varlist()) {
8353 for (
auto *
VE :
C->private_copies()) {
8356 for (
auto *
VE :
C->inits()) {
8361void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8362 Record.push_back(
C->varlist_size());
8363 VisitOMPClauseWithPostUpdate(
C);
8364 Record.AddSourceLocation(
C->getLParenLoc());
8365 Record.writeEnum(
C->getKind());
8366 Record.AddSourceLocation(
C->getKindLoc());
8367 Record.AddSourceLocation(
C->getColonLoc());
8368 for (
auto *
VE :
C->varlist())
8370 for (
auto *E :
C->private_copies())
8372 for (
auto *E :
C->source_exprs())
8374 for (
auto *E :
C->destination_exprs())
8376 for (
auto *E :
C->assignment_ops())
8380void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8381 Record.push_back(
C->varlist_size());
8382 Record.AddSourceLocation(
C->getLParenLoc());
8383 for (
auto *
VE :
C->varlist())
8387void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8388 Record.push_back(
C->varlist_size());
8389 Record.writeEnum(
C->getModifier());
8390 VisitOMPClauseWithPostUpdate(
C);
8391 Record.AddSourceLocation(
C->getLParenLoc());
8392 Record.AddSourceLocation(
C->getModifierLoc());
8393 Record.AddSourceLocation(
C->getColonLoc());
8394 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8395 Record.AddDeclarationNameInfo(
C->getNameInfo());
8396 for (
auto *
VE :
C->varlist())
8398 for (
auto *
VE :
C->privates())
8400 for (
auto *E :
C->lhs_exprs())
8402 for (
auto *E :
C->rhs_exprs())
8404 for (
auto *E :
C->reduction_ops())
8406 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8407 for (
auto *E :
C->copy_ops())
8409 for (
auto *E :
C->copy_array_temps())
8411 for (
auto *E :
C->copy_array_elems())
8414 auto PrivateFlags =
C->private_var_reduction_flags();
8415 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8416 for (
bool Flag : PrivateFlags)
8420void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8421 Record.push_back(
C->varlist_size());
8422 VisitOMPClauseWithPostUpdate(
C);
8423 Record.AddSourceLocation(
C->getLParenLoc());
8424 Record.AddSourceLocation(
C->getColonLoc());
8425 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8426 Record.AddDeclarationNameInfo(
C->getNameInfo());
8427 for (
auto *
VE :
C->varlist())
8429 for (
auto *
VE :
C->privates())
8431 for (
auto *E :
C->lhs_exprs())
8433 for (
auto *E :
C->rhs_exprs())
8435 for (
auto *E :
C->reduction_ops())
8439void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8440 Record.push_back(
C->varlist_size());
8441 VisitOMPClauseWithPostUpdate(
C);
8442 Record.AddSourceLocation(
C->getLParenLoc());
8443 Record.AddSourceLocation(
C->getColonLoc());
8444 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8445 Record.AddDeclarationNameInfo(
C->getNameInfo());
8446 for (
auto *
VE :
C->varlist())
8448 for (
auto *
VE :
C->privates())
8450 for (
auto *E :
C->lhs_exprs())
8452 for (
auto *E :
C->rhs_exprs())
8454 for (
auto *E :
C->reduction_ops())
8456 for (
auto *E :
C->taskgroup_descriptors())
8460void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8461 Record.push_back(
C->varlist_size());
8462 VisitOMPClauseWithPostUpdate(
C);
8463 Record.AddSourceLocation(
C->getLParenLoc());
8464 Record.AddSourceLocation(
C->getColonLoc());
8465 Record.push_back(
C->getModifier());
8466 Record.AddSourceLocation(
C->getModifierLoc());
8467 for (
auto *
VE :
C->varlist()) {
8470 for (
auto *
VE :
C->privates()) {
8473 for (
auto *
VE :
C->inits()) {
8476 for (
auto *
VE :
C->updates()) {
8479 for (
auto *
VE :
C->finals()) {
8483 Record.AddStmt(
C->getCalcStep());
8484 for (
auto *
VE :
C->used_expressions())
8488void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8489 Record.push_back(
C->varlist_size());
8490 Record.AddSourceLocation(
C->getLParenLoc());
8491 Record.AddSourceLocation(
C->getColonLoc());
8492 for (
auto *
VE :
C->varlist())
8494 Record.AddStmt(
C->getAlignment());
8497void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8498 Record.push_back(
C->varlist_size());
8499 Record.AddSourceLocation(
C->getLParenLoc());
8500 for (
auto *
VE :
C->varlist())
8502 for (
auto *E :
C->source_exprs())
8504 for (
auto *E :
C->destination_exprs())
8506 for (
auto *E :
C->assignment_ops())
8510void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8511 Record.push_back(
C->varlist_size());
8512 Record.AddSourceLocation(
C->getLParenLoc());
8513 for (
auto *
VE :
C->varlist())
8515 for (
auto *E :
C->source_exprs())
8517 for (
auto *E :
C->destination_exprs())
8519 for (
auto *E :
C->assignment_ops())
8523void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8524 Record.push_back(
C->varlist_size());
8525 Record.AddSourceLocation(
C->getLParenLoc());
8526 for (
auto *
VE :
C->varlist())
8530void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8531 Record.AddStmt(
C->getDepobj());
8532 Record.AddSourceLocation(
C->getLParenLoc());
8535void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8536 Record.push_back(
C->varlist_size());
8537 Record.push_back(
C->getNumLoops());
8538 Record.AddSourceLocation(
C->getLParenLoc());
8539 Record.AddStmt(
C->getModifier());
8540 Record.push_back(
C->getDependencyKind());
8541 Record.AddSourceLocation(
C->getDependencyLoc());
8542 Record.AddSourceLocation(
C->getColonLoc());
8543 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8544 for (
auto *
VE :
C->varlist())
8546 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8547 Record.AddStmt(
C->getLoopData(I));
8550void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8551 VisitOMPClauseWithPreInit(
C);
8552 Record.writeEnum(
C->getModifier());
8553 Record.AddStmt(
C->getDevice());
8554 Record.AddSourceLocation(
C->getModifierLoc());
8555 Record.AddSourceLocation(
C->getLParenLoc());
8558void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8559 Record.push_back(
C->varlist_size());
8560 Record.push_back(
C->getUniqueDeclarationsNum());
8561 Record.push_back(
C->getTotalComponentListNum());
8562 Record.push_back(
C->getTotalComponentsNum());
8563 Record.AddSourceLocation(
C->getLParenLoc());
8564 bool HasIteratorModifier =
false;
8566 Record.push_back(
C->getMapTypeModifier(I));
8567 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8568 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8569 HasIteratorModifier =
true;
8571 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8572 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8573 Record.push_back(
C->getMapType());
8574 Record.AddSourceLocation(
C->getMapLoc());
8575 Record.AddSourceLocation(
C->getColonLoc());
8576 for (
auto *E :
C->varlist())
8578 for (
auto *E :
C->mapperlists())
8580 if (HasIteratorModifier)
8581 Record.AddStmt(
C->getIteratorModifier());
8582 for (
auto *D :
C->all_decls())
8584 for (
auto N :
C->all_num_lists())
8586 for (
auto N :
C->all_lists_sizes())
8588 for (
auto &M :
C->all_components()) {
8589 Record.AddStmt(M.getAssociatedExpression());
8590 Record.AddDeclRef(M.getAssociatedDeclaration());
8595 Record.push_back(
C->varlist_size());
8596 Record.writeEnum(
C->getFirstAllocateModifier());
8597 Record.writeEnum(
C->getSecondAllocateModifier());
8598 Record.AddSourceLocation(
C->getLParenLoc());
8599 Record.AddSourceLocation(
C->getColonLoc());
8600 Record.AddStmt(
C->getAllocator());
8601 Record.AddStmt(
C->getAlignment());
8602 for (
auto *
VE :
C->varlist())
8606void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8607 Record.push_back(
C->varlist_size());
8608 Record.writeEnum(
C->getModifier());
8609 Record.AddSourceLocation(
C->getModifierLoc());
8610 Record.AddStmt(
C->getModifierExpr());
8611 VisitOMPClauseWithPreInit(
C);
8612 Record.AddSourceLocation(
C->getLParenLoc());
8613 for (
auto *
VE :
C->varlist())
8617void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8618 Record.push_back(
C->varlist_size());
8619 Record.writeEnum(
C->getModifier());
8620 Record.AddSourceLocation(
C->getModifierLoc());
8621 Record.AddStmt(
C->getModifierExpr());
8622 VisitOMPClauseWithPreInit(
C);
8623 Record.AddSourceLocation(
C->getLParenLoc());
8624 for (
auto *
VE :
C->varlist())
8628void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8629 VisitOMPClauseWithPreInit(
C);
8630 Record.AddStmt(
C->getPriority());
8631 Record.AddSourceLocation(
C->getLParenLoc());
8634void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8635 VisitOMPClauseWithPreInit(
C);
8636 Record.writeEnum(
C->getModifier());
8637 Record.AddStmt(
C->getGrainsize());
8638 Record.AddSourceLocation(
C->getModifierLoc());
8639 Record.AddSourceLocation(
C->getLParenLoc());
8642void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8643 VisitOMPClauseWithPreInit(
C);
8644 Record.writeEnum(
C->getModifier());
8645 Record.AddStmt(
C->getNumTasks());
8646 Record.AddSourceLocation(
C->getModifierLoc());
8647 Record.AddSourceLocation(
C->getLParenLoc());
8650void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8652 Record.AddSourceLocation(
C->getLParenLoc());
8655void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8656 VisitOMPClauseWithPreInit(
C);
8657 Record.push_back(
C->getDistScheduleKind());
8658 Record.AddStmt(
C->getChunkSize());
8659 Record.AddSourceLocation(
C->getLParenLoc());
8660 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8661 Record.AddSourceLocation(
C->getCommaLoc());
8664void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8665 Record.push_back(
C->getDefaultmapKind());
8666 Record.push_back(
C->getDefaultmapModifier());
8667 Record.AddSourceLocation(
C->getLParenLoc());
8668 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8669 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8672void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8673 Record.push_back(
C->varlist_size());
8674 Record.push_back(
C->getUniqueDeclarationsNum());
8675 Record.push_back(
C->getTotalComponentListNum());
8676 Record.push_back(
C->getTotalComponentsNum());
8677 Record.AddSourceLocation(
C->getLParenLoc());
8679 Record.push_back(
C->getMotionModifier(I));
8680 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8681 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8682 Record.AddStmt(
C->getIteratorModifier());
8684 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8685 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8686 Record.AddSourceLocation(
C->getColonLoc());
8687 for (
auto *E :
C->varlist())
8689 for (
auto *E :
C->mapperlists())
8691 for (
auto *D :
C->all_decls())
8693 for (
auto N :
C->all_num_lists())
8695 for (
auto N :
C->all_lists_sizes())
8697 for (
auto &M :
C->all_components()) {
8698 Record.AddStmt(M.getAssociatedExpression());
8699 Record.writeBool(M.isNonContiguous());
8700 Record.AddDeclRef(M.getAssociatedDeclaration());
8704void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8705 Record.push_back(
C->varlist_size());
8706 Record.push_back(
C->getUniqueDeclarationsNum());
8707 Record.push_back(
C->getTotalComponentListNum());
8708 Record.push_back(
C->getTotalComponentsNum());
8709 Record.AddSourceLocation(
C->getLParenLoc());
8711 Record.push_back(
C->getMotionModifier(I));
8712 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8713 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8714 Record.AddStmt(
C->getIteratorModifier());
8716 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8717 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8718 Record.AddSourceLocation(
C->getColonLoc());
8719 for (
auto *E :
C->varlist())
8721 for (
auto *E :
C->mapperlists())
8723 for (
auto *D :
C->all_decls())
8725 for (
auto N :
C->all_num_lists())
8727 for (
auto N :
C->all_lists_sizes())
8729 for (
auto &M :
C->all_components()) {
8730 Record.AddStmt(M.getAssociatedExpression());
8731 Record.writeBool(M.isNonContiguous());
8732 Record.AddDeclRef(M.getAssociatedDeclaration());
8736void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8737 Record.push_back(
C->varlist_size());
8738 Record.push_back(
C->getUniqueDeclarationsNum());
8739 Record.push_back(
C->getTotalComponentListNum());
8740 Record.push_back(
C->getTotalComponentsNum());
8741 Record.AddSourceLocation(
C->getLParenLoc());
8742 Record.writeEnum(
C->getFallbackModifier());
8743 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8744 for (
auto *E :
C->varlist())
8746 for (
auto *
VE :
C->private_copies())
8748 for (
auto *
VE :
C->inits())
8750 for (
auto *D :
C->all_decls())
8752 for (
auto N :
C->all_num_lists())
8754 for (
auto N :
C->all_lists_sizes())
8756 for (
auto &M :
C->all_components()) {
8757 Record.AddStmt(M.getAssociatedExpression());
8758 Record.AddDeclRef(M.getAssociatedDeclaration());
8762void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8763 Record.push_back(
C->varlist_size());
8764 Record.push_back(
C->getUniqueDeclarationsNum());
8765 Record.push_back(
C->getTotalComponentListNum());
8766 Record.push_back(
C->getTotalComponentsNum());
8767 Record.AddSourceLocation(
C->getLParenLoc());
8768 for (
auto *E :
C->varlist())
8770 for (
auto *D :
C->all_decls())
8772 for (
auto N :
C->all_num_lists())
8774 for (
auto N :
C->all_lists_sizes())
8776 for (
auto &M :
C->all_components()) {
8777 Record.AddStmt(M.getAssociatedExpression());
8778 Record.AddDeclRef(M.getAssociatedDeclaration());
8782void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8783 Record.push_back(
C->varlist_size());
8784 Record.push_back(
C->getUniqueDeclarationsNum());
8785 Record.push_back(
C->getTotalComponentListNum());
8786 Record.push_back(
C->getTotalComponentsNum());
8787 Record.AddSourceLocation(
C->getLParenLoc());
8788 for (
auto *E :
C->varlist())
8790 for (
auto *D :
C->all_decls())
8792 for (
auto N :
C->all_num_lists())
8794 for (
auto N :
C->all_lists_sizes())
8796 for (
auto &M :
C->all_components()) {
8797 Record.AddStmt(M.getAssociatedExpression());
8798 Record.AddDeclRef(M.getAssociatedDeclaration());
8802void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8803 Record.push_back(
C->varlist_size());
8804 Record.push_back(
C->getUniqueDeclarationsNum());
8805 Record.push_back(
C->getTotalComponentListNum());
8806 Record.push_back(
C->getTotalComponentsNum());
8807 Record.AddSourceLocation(
C->getLParenLoc());
8808 for (
auto *E :
C->varlist())
8810 for (
auto *D :
C->all_decls())
8812 for (
auto N :
C->all_num_lists())
8814 for (
auto N :
C->all_lists_sizes())
8816 for (
auto &M :
C->all_components()) {
8817 Record.AddStmt(M.getAssociatedExpression());
8818 Record.AddDeclRef(M.getAssociatedDeclaration());
8822void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8824void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8825 OMPUnifiedSharedMemoryClause *) {}
8827void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8830OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8833void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8834 OMPAtomicDefaultMemOrderClause *
C) {
8835 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8836 Record.AddSourceLocation(
C->getLParenLoc());
8837 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8840void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8842void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8843 Record.push_back(
C->getAtKind());
8844 Record.AddSourceLocation(
C->getLParenLoc());
8845 Record.AddSourceLocation(
C->getAtKindKwLoc());
8848void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8849 Record.push_back(
C->getSeverityKind());
8850 Record.AddSourceLocation(
C->getLParenLoc());
8851 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8854void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8855 VisitOMPClauseWithPreInit(
C);
8856 Record.AddStmt(
C->getMessageString());
8857 Record.AddSourceLocation(
C->getLParenLoc());
8860void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8861 Record.push_back(
C->varlist_size());
8862 Record.AddSourceLocation(
C->getLParenLoc());
8863 for (
auto *
VE :
C->varlist())
8865 for (
auto *E :
C->private_refs())
8869void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8870 Record.push_back(
C->varlist_size());
8871 Record.AddSourceLocation(
C->getLParenLoc());
8872 for (
auto *
VE :
C->varlist())
8876void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8877 Record.push_back(
C->varlist_size());
8878 Record.AddSourceLocation(
C->getLParenLoc());
8879 for (
auto *
VE :
C->varlist())
8883void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8884 Record.writeEnum(
C->getKind());
8885 Record.writeEnum(
C->getModifier());
8886 Record.AddSourceLocation(
C->getLParenLoc());
8887 Record.AddSourceLocation(
C->getKindKwLoc());
8888 Record.AddSourceLocation(
C->getModifierKwLoc());
8891void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8892 Record.push_back(
C->getNumberOfAllocators());
8893 Record.AddSourceLocation(
C->getLParenLoc());
8894 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8895 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
8903void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
8904 Record.push_back(
C->varlist_size());
8905 Record.AddSourceLocation(
C->getLParenLoc());
8906 Record.AddStmt(
C->getModifier());
8907 Record.AddSourceLocation(
C->getColonLoc());
8908 for (
Expr *E :
C->varlist())
8912void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
8913 Record.writeEnum(
C->getBindKind());
8914 Record.AddSourceLocation(
C->getLParenLoc());
8915 Record.AddSourceLocation(
C->getBindKindLoc());
8918void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
8919 VisitOMPClauseWithPreInit(
C);
8921 Record.AddSourceLocation(
C->getLParenLoc());
8924void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8925 OMPDynGroupprivateClause *
C) {
8926 VisitOMPClauseWithPreInit(
C);
8927 Record.push_back(
C->getDynGroupprivateModifier());
8928 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8930 Record.AddSourceLocation(
C->getLParenLoc());
8931 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8932 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8935void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
8936 Record.push_back(
C->varlist_size());
8937 Record.push_back(
C->getNumLoops());
8938 Record.AddSourceLocation(
C->getLParenLoc());
8939 Record.push_back(
C->getDependenceType());
8940 Record.AddSourceLocation(
C->getDependenceLoc());
8941 Record.AddSourceLocation(
C->getColonLoc());
8942 for (
auto *
VE :
C->varlist())
8944 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8945 Record.AddStmt(
C->getLoopData(I));
8948void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
8949 Record.AddAttributes(
C->getAttrs());
8950 Record.AddSourceLocation(
C->getBeginLoc());
8951 Record.AddSourceLocation(
C->getLParenLoc());
8952 Record.AddSourceLocation(
C->getEndLoc());
8955void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
8959 for (
const auto &
Set : TI->
Sets) {
8966 writeExprRef(
Selector.ScoreOrCondition);
8980 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8982 if (
Data->hasAssociatedStmt())
8984 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8990 for (
Expr *E :
C->getVarList())
8996 for (
Expr *E : Exprs)
9005 switch (
C->getClauseKind()) {
9015 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
9022 if (SC->isConditionExprClause()) {
9024 if (SC->hasConditionExpr())
9025 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
9028 for (
Expr *E : SC->getVarList())
9037 for (
Expr *E : NGC->getIntExprs())
9071 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
9094 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9182 if (AC->hasIntExpr())
9190 if (
Expr *DNE = WC->getDevNumExpr())
9204 if (Arg.getIdentifierInfo())
9223 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9251 for (
Expr *E : TC->getSizeExprs())
9259 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9261 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9269 if (WC->hasIntExpr())
9277 if (VC->hasIntExpr())
9298 if (BC->isStringArgument())
9307 llvm_unreachable(
"Clause serialization not yet implemented");
9309 llvm_unreachable(
"Invalid Clause Kind");
9318 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 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 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.
Result
Implement __builtin_bit_cast and related operations.
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()
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.
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.
ASTFileSignature WriteAST(llvm::PointerUnion< Sema *, Preprocessor * > Subject, StringRef OutputFile, Module *WritingModule, StringRef isysroot)
Write a precompiled header or a module with the AST produced by the Sema object, or a dependency scan...
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.
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.
time_t getTimestampForOutput(time_t ModTime) const
Get a timestamp for output into the AST file.
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.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
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,...
FileSystemOptions & getFileSystemOpts()
Returns the current file system options.
bool makeAbsolutePath(SmallVectorImpl< char > &Path, bool Canonicalize=false) const
Makes Path absolute taking into account FileSystemOptions and the working directory option,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
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'.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
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.
LangStandard::Kind LangStd
The used language standard.
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.
StringRef str() const
Returns the plain module file name.
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 * { ... }).
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.
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
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.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
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 the 'counts' clause in the 'pragma omp split' 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 getAttrLoc() const
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.
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...
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
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.
void getSortedUnusedLocalTypedefNameCandidates(SmallVectorImpl< const TypedefNameDecl * > &Sorted) const
Store UnusedLocalTypedefNameCandidates in Sorted in a deterministic order.
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
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.
const APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or nullptr if the value is not yet...
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
EvaluatedStmt * getEvaluatedStmt() const
const Expr * getInit() const
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.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
ModuleFileName FileName
The file name of the module file.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
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_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_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ 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.
@ UserFiles
When the validation is done only for user files as an optimization.
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.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ 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.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ 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...
@ 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.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
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...
@ Undefined
Keep undefined.
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.
@ PREDEF_DECL_BUILTIN_ZOS_VA_LIST_ID
The internal '__builtin_zos_va_list' typedef.
@ Property
The type of a property.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ 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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
The signature of a module, which is a hash of the AST content.
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
MultiOnDiskHashTable< ASTDeclContextNameLookupTrait > Table
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
MultiOnDiskHashTable< ModuleLocalNameLookupTrait > Table