A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/ASTWriter_8cpp_source.html below:

clang: lib/Serialization/ASTWriter.cpp Source File

81#include "llvm/ADT/APFloat.h" 82#include "llvm/ADT/APInt.h" 83#include "llvm/ADT/APSInt.h" 84#include "llvm/ADT/ArrayRef.h" 85#include "llvm/ADT/DenseMap.h" 86#include "llvm/ADT/DenseSet.h" 87#include "llvm/ADT/Hashing.h" 88#include "llvm/ADT/PointerIntPair.h" 89#include "llvm/ADT/STLExtras.h" 90#include "llvm/ADT/ScopeExit.h" 91#include "llvm/ADT/SmallPtrSet.h" 92#include "llvm/ADT/SmallString.h" 93#include "llvm/ADT/SmallVector.h" 94#include "llvm/ADT/StringMap.h" 95#include "llvm/ADT/StringRef.h" 96#include "llvm/Bitstream/BitCodes.h" 97#include "llvm/Bitstream/BitstreamWriter.h" 98#include "llvm/Support/Casting.h" 99#include "llvm/Support/Compression.h" 100#include "llvm/Support/DJB.h" 101#include "llvm/Support/Endian.h" 102#include "llvm/Support/EndianStream.h" 103#include "llvm/Support/Error.h" 104#include "llvm/Support/ErrorHandling.h" 105#include "llvm/Support/LEB128.h" 106#include "llvm/Support/MemoryBuffer.h" 107#include "llvm/Support/OnDiskHashTable.h" 108#include "llvm/Support/Path.h" 109#include "llvm/Support/SHA1.h" 110#include "llvm/Support/TimeProfiler.h" 111#include "llvm/Support/VersionTuple.h" 112#include "llvm/Support/raw_ostream.h" 127using namespace clang

;

130template

<

typename

T,

typename

Allocator>

131static

StringRef

bytes

(

const

std::vector<T, Allocator> &

v

) {

132 if

(

v

.empty())

return

StringRef();

133 return

StringRef(

reinterpret_cast<const char

*

>

(&

v

[0]),

134 sizeof

(

T

) *

v

.size());

137template

<

typename

T>

139 return

StringRef(

reinterpret_cast<const char

*

>

(

v

.data()),

140 sizeof

(

T

) *

v

.size());

143static

std::string

bytes

(

const

std::vector<bool> &

V

) {

145

Str.reserve(

V

.size() / 8);

146 for

(

unsigned

I = 0,

E

=

V

.size(); I <

E

;) {

148 for

(

unsigned

Bit = 0; Bit < 8 && I <

E

; ++Bit, ++I)

149

Byte |=

V

[I] << Bit;

161#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 162 case Type::CLASS_ID: return TYPE_##CODE_ID; 163#include "clang/Serialization/TypeBitCodes.def" 165

llvm_unreachable(

"shouldn't be serializing a builtin type this way"

);

167

llvm_unreachable(

"bad type kind"

);

172struct

AffectingModuleMaps {

173

llvm::DenseSet<FileID> DefinitionFileIDs;

174

llvm::DenseSet<const FileEntry *> DefinitionFiles;

177

std::optional<AffectingModuleMaps>

190 enum

AffectedReason :

bool

{

191

AR_TextualHeader = 0,

192

AR_ImportOrTextualHeader = 1,

194 auto

AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {

195

LHS = std::max(LHS, RHS);

197

llvm::DenseMap<FileID, AffectedReason> ModuleMaps;

198

llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;

199 auto

CollectModuleMapsForHierarchy = [&](

const Module

*M,

200

AffectedReason Reason) {

206 if

(

auto

[It, Inserted] = ProcessedModules.insert({M, Reason});

207

!Inserted && Reason <= It->second) {

213

std::queue<const Module *> Q;

216 const Module

*Mod = Q.front();

222

AssignMostImportant(ModuleMaps[F], Reason);

227

AssignMostImportant(ModuleMaps[UniqF], Reason);

236

CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);

238

std::queue<const Module *> Q;

241 const Module

*CurrentModule = Q.front();

244 for

(

const Module

*ImportedModule : CurrentModule->

Imports

)

245

CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);

247

CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);

249 for

(

auto

*M : CurrentModule->

submodules

())

261 for

(

unsigned

UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {

275 if

(

const Module

*M = KH.getModule())

276

CollectModuleMapsForHierarchy(M, AR_TextualHeader);

297

llvm::DenseSet<const FileEntry *> ModuleFileEntries;

298

llvm::DenseSet<FileID> ModuleFileIDs;

299 for

(

auto

[FID, Reason] : ModuleMaps) {

300 if

(Reason == AR_ImportOrTextualHeader)

301

ModuleFileIDs.insert(FID);

302 if

(

auto

*FE =

SM

.getFileEntryForID(FID))

303

ModuleFileEntries.insert(FE);

306

AffectingModuleMaps R;

307

R.DefinitionFileIDs = std::move(ModuleFileIDs);

308

R.DefinitionFiles = std::move(ModuleFileEntries);

319

: Writer(Writer), BasicWriter(Context, Writer,

Record

) {}

322 if

(

T

.hasLocalNonFastQualifiers()) {

329 const Type

*typePtr =

T

.getTypePtr();

352#define ABSTRACT_TYPELOC(CLASS, PARENT) 353#define TYPELOC(CLASS, PARENT) \ 354 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 355#include "clang/AST/TypeLocNodes.def" 414void

TypeLocWriter::VisitArrayTypeLoc(

ArrayTypeLoc

TL) {

423

VisitArrayTypeLoc(TL);

427

VisitArrayTypeLoc(TL);

431

VisitArrayTypeLoc(TL);

434void

TypeLocWriter::VisitDependentSizedArrayTypeLoc(

436

VisitArrayTypeLoc(TL);

439void

TypeLocWriter::VisitDependentAddressSpaceTypeLoc(

443

addSourceLocation(

range

.getBegin());

444

addSourceLocation(

range

.getEnd());

448void

TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(

457void

TypeLocWriter::VisitDependentVectorTypeLoc(

469

addSourceLocation(

range

.getBegin());

470

addSourceLocation(

range

.getEnd());

475void

TypeLocWriter::VisitDependentSizedMatrixTypeLoc(

479

addSourceLocation(

range

.getBegin());

480

addSourceLocation(

range

.getEnd());

491 for

(

unsigned

i = 0, e = TL.

getNumParams

(); i != e; ++i)

496

VisitFunctionTypeLoc(TL);

500

VisitFunctionTypeLoc(TL);

507void

TypeLocWriter::VisitUsingTypeLoc(

UsingTypeLoc

TL) {

565void

TypeLocWriter::VisitAutoTypeLoc(

AutoTypeLoc

TL) {

570 Record

.AddConceptReference(CR);

576void

TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(

585void

TypeLocWriter::VisitEnumTypeLoc(

EnumTypeLoc

TL) {

601void

TypeLocWriter::VisitHLSLAttributedResourceTypeLoc(

610void

TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(

615void

TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(

620void

TypeLocWriter::VisitTemplateSpecializationTypeLoc(

626 for

(

unsigned

i = 0, e = TL.

getNumArgs

(); i != e; ++i)

631void

TypeLocWriter::VisitParenTypeLoc(

ParenTypeLoc

TL) {

655void

TypeLocWriter::VisitDependentTemplateSpecializationTypeLoc(

663 for

(

unsigned

I = 0,

E

= TL.

getNumArgs

(); I !=

E

; ++I)

699void

TypeLocWriter::VisitPipeTypeLoc(

PipeTypeLoc

TL) {

706void

TypeLocWriter::VisitDependentBitIntTypeLoc(

711void

ASTWriter::WriteTypeAbbrevs() {

712 using namespace llvm

;

714

std::shared_ptr<BitCodeAbbrev> Abv;

717

Abv = std::make_shared<BitCodeAbbrev>();

719

Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

720

Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3));

721

TypeExtQualAbbrev = Stream.EmitAbbrev(std::move(Abv));

729

llvm::BitstreamWriter &Stream,

733

Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID,

Record

);

736 if

(!Name || Name[0] == 0)

740 Record

.push_back(*Name++);

741

Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,

Record

);

745

llvm::BitstreamWriter &Stream,

750 Record

.push_back(*Name++);

751

Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME,

Record

);

756#define RECORD(X) EmitRecordID(X, #X, Stream, Record) 889void

ASTWriter::WriteBlockInfoBlock() {

891

Stream.EnterBlockInfoBlock();

893#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record) 894#define RECORD(X) EmitRecordID(X, #X, Stream, Record) 897 BLOCK

(CONTROL_BLOCK);

907 BLOCK

(OPTIONS_BLOCK);

914 BLOCK

(INPUT_FILES_BLOCK);

979 BLOCK

(SOURCE_MANAGER_BLOCK);

987 BLOCK

(PREPROCESSOR_BLOCK);

995 BLOCK

(SUBMODULE_BLOCK);

1017 BLOCK

(COMMENTS_BLOCK);

1021 BLOCK

(DECLTYPES_BLOCK);

1025 RECORD

(TYPE_BLOCK_POINTER);

1026 RECORD

(TYPE_LVALUE_REFERENCE);

1027 RECORD

(TYPE_RVALUE_REFERENCE);

1028 RECORD

(TYPE_MEMBER_POINTER);

1029 RECORD

(TYPE_CONSTANT_ARRAY);

1030 RECORD

(TYPE_INCOMPLETE_ARRAY);

1031 RECORD

(TYPE_VARIABLE_ARRAY);

1033 RECORD

(TYPE_EXT_VECTOR);

1034 RECORD

(TYPE_FUNCTION_NO_PROTO);

1035 RECORD

(TYPE_FUNCTION_PROTO);

1037 RECORD

(TYPE_TYPEOF_EXPR);

1041 RECORD

(TYPE_OBJC_INTERFACE);

1042 RECORD

(TYPE_OBJC_OBJECT_POINTER);

1044 RECORD

(TYPE_ELABORATED);

1045 RECORD

(TYPE_SUBST_TEMPLATE_TYPE_PARM);

1046 RECORD

(TYPE_UNRESOLVED_USING);

1047 RECORD

(TYPE_INJECTED_CLASS_NAME);

1048 RECORD

(TYPE_OBJC_OBJECT);

1049 RECORD

(TYPE_TEMPLATE_TYPE_PARM);

1050 RECORD

(TYPE_TEMPLATE_SPECIALIZATION);

1051 RECORD

(TYPE_DEPENDENT_NAME);

1052 RECORD

(TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION);

1053 RECORD

(TYPE_DEPENDENT_SIZED_ARRAY);

1055 RECORD

(TYPE_MACRO_QUALIFIED);

1056 RECORD

(TYPE_PACK_EXPANSION);

1057 RECORD

(TYPE_ATTRIBUTED);

1058 RECORD

(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);

1060 RECORD

(TYPE_UNARY_TRANSFORM);

1064 RECORD

(TYPE_OBJC_TYPE_PARAM);

1143 BLOCK

(PREPROCESSOR_DETAIL_BLOCK);

1149 BLOCK

(EXTENSION_BLOCK);

1152 BLOCK

(UNHASHED_CONTROL_BLOCK);

1173 return

Changed | llvm::sys::path::remove_dots(

Path

);

1188

assert(

Filename

&&

"No file name to adjust?"

);

1190 if

(BaseDir.empty())

1195 for

(;

Filename

[Pos] && Pos < BaseDir.size(); ++Pos)

1196 if

(

Filename

[Pos] != BaseDir[Pos])

1205 if

(!llvm::sys::path::is_separator(

Filename

[Pos])) {

1206 if

(!llvm::sys::path::is_separator(BaseDir.back()))

1223

std::pair<ASTFileSignature, ASTFileSignature>

1224

ASTWriter::createSignature()

const

{

1225

StringRef AllBytes(Buffer.data(), Buffer.size());

1228

Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));

1233

Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));

1236

AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));

1238

Hasher.update(AllBytes.slice(ASTBlockRange.second, StringRef::npos));

1241 return

std::make_pair(ASTBlockHash, Signature);

1246

Hasher.update(StringRef(Buffer.data(), Buffer.size()));

1248

assert(WritingModule);

1253 for

(

auto

[ExportImported, _] : WritingModule->

Exports

)

1254

Hasher.update(ExportImported->Signature);

1278 for

(

Module

*M : TouchedTopLevelModules)

1286 for

(uint8_t Byte : S) {

1287

Stream.BackpatchByte(BitNo, Byte);

1299 if

(!WritingModule ||

1306

std::tie(ASTBlockHash, Signature) = createSignature();

1314void

ASTWriter::writeUnhashedControlBlock(

Preprocessor

&PP) {

1315 using namespace llvm

;

1318

Stream.FlushToWord();

1319

UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;

1342 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1344

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1345 unsigned

ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

1348

Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,

Record

, Blob);

1349

ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;

1353 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1354

Abbrev->Add(BitCodeAbbrevOp(

SIGNATURE

));

1355

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1356 unsigned

SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

1359

Stream.EmitRecordWithBlob(SignatureAbbrev,

Record

, Blob);

1360

SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;

1369 if

(!HSOpts.ModulesSkipDiagnosticOptions) {

1370#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name); 1371#define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 1372 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name())); 1373#include "clang/Basic/DiagnosticOptions.def" 1375 for

(

unsigned

I = 0, N = DiagOpts.

Warnings

.size(); I != N; ++I)

1378 for

(

unsigned

I = 0, N = DiagOpts.

Remarks

.size(); I != N; ++I)

1387 if

(!HSOpts.ModulesSkipHeaderSearchPaths) {

1389 Record

.push_back(HSOpts.UserEntries.size());

1390 for

(

unsigned

I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {

1393 Record

.push_back(

static_cast<unsigned>

(Entry.

Group

));

1399 Record

.push_back(HSOpts.SystemHeaderPrefixes.size());

1400 for

(

unsigned

I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {

1402 Record

.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);

1406 Record

.push_back(HSOpts.VFSOverlayFiles.size());

1407 for

(StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)

1413 if

(!HSOpts.ModulesSkipPragmaDiagnosticMappings)

1414

WritePragmaDiagnosticMappings(Diags,

WritingModule);

1419 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1421

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

1422

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1423 unsigned

HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

1425

HSEntryUsage.size()};

1426

Stream.EmitRecordWithBlob(HSUsageAbbrevCode,

Record

,

bytes

(HSEntryUsage));

1432 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1433

Abbrev->Add(BitCodeAbbrevOp(

VFS_USAGE

));

1434

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

1435

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1436 unsigned

VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

1438

Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,

Record

,

bytes

(VFSUsage));

1443

UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;

1447void

ASTWriter::WriteControlBlock(

Preprocessor

&PP, StringRef isysroot) {

1448 using namespace llvm

;

1457 auto

MetadataAbbrev = std::make_shared<BitCodeAbbrev>();

1458

MetadataAbbrev->Add(BitCodeAbbrevOp(

METADATA

));

1459

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));

1460

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));

1461

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));

1462

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));

1463

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1465

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1466

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1467

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1468

MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1469 unsigned

MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));

1470

assert((!WritingModule || isysroot.empty()) &&

1471 "writing module as a relocatable PCH?"

);

1476

CLANG_VERSION_MAJOR,

1477

CLANG_VERSION_MINOR,

1481

ASTHasCompilerErrors};

1482

Stream.EmitRecordWithBlob(MetadataAbbrevCode,

Record

,

1486 if

(WritingModule) {

1488 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1490

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1491 unsigned

AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

1493

Stream.EmitRecordWithBlob(AbbrevCode,

Record

, WritingModule->

Name

);

1496 if

(WritingModule && WritingModule->

Directory

) {

1501

BaseDir.assign(CWD->getName());

1516 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1518

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1519 unsigned

AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

1522

Stream.EmitRecordWithBlob(AbbrevCode,

Record

, BaseDir);

1526

BaseDirectory.assign(BaseDir.begin(), BaseDir.end());

1527

}

else if

(!isysroot.empty()) {

1529

BaseDirectory = std::string(isysroot);

1538

? Map.getModuleMapFileForUniquing(WritingModule)

1539

->getNameAsRequested()

1544 if

(

auto

*AdditionalModMaps =

1545

Map.getAdditionalModuleMapFiles(WritingModule)) {

1546 Record

.push_back(AdditionalModMaps->size());

1548

AdditionalModMaps->end());

1563 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1564

Abbrev->Add(BitCodeAbbrevOp(

IMPORT

));

1565

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));

1566

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1567

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1568

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1569

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1570

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1571

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1572

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1573 unsigned

AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

1579 if

(!M.isDirectlyImported())

1589 Record

.push_back(M.StandardCXXModule);

1593 if

(M.StandardCXXModule) {

1603

llvm::append_range(Blob, M.

Signature

);

1608

Stream.EmitRecordWithBlob(AbbrevCode,

Record

, Blob);

1618#define LANGOPT(Name, Bits, Default, Description) \ 1619 Record.push_back(LangOpts.Name); 1620#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 1621 Record.push_back(static_cast<unsigned>(LangOpts.get##Name())); 1622#include "clang/Basic/LangOptions.def" 1623#define SANITIZER(NAME, ID) \ 1624 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID)); 1625#include "clang/Basic/Sanitizers.def" 1665 for

(

unsigned

I = 0, N = TargetOpts.

Features

.size(); I != N; ++I) {

1705 bool

WriteMacros = !SkipMacros;

1706 Record

.push_back(WriteMacros);

1710 for

(

unsigned

I = 0, N = PPOpts.

Macros

.size(); I != N; ++I) {

1718 for

(

unsigned

I = 0, N = PPOpts.

Includes

.size(); I != N; ++I)

1723 for

(

unsigned

I = 0, N = PPOpts.

MacroIncludes

.size(); I != N; ++I)

1737 if

(

auto

MainFile =

1739 auto

FileAbbrev = std::make_shared<BitCodeAbbrev>();

1741

FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1742

FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1743 unsigned

FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));

1762struct

InputFileEntry {

1766 bool

BufferOverridden;

1781

assert(IncludeFID.

isValid

() &&

"IncludeLoc in invalid file"

);

1782 if

(!IsSLocAffecting[IncludeFID.ID])

1790 using namespace llvm

;

1795 auto

IFAbbrev = std::make_shared<BitCodeAbbrev>();

1796

IFAbbrev->Add(BitCodeAbbrevOp(

INPUT_FILE

));

1797

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1798

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));

1799

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));

1800

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1801

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1802

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1803

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1804

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));

1805

IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1806 unsigned

IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));

1809 auto

IFHAbbrev = std::make_shared<BitCodeAbbrev>();

1811

IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

1812

IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

1813 unsigned

IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));

1815 uint64_t

InputFilesOffsetBase = Stream.GetCurrentBitNo();

1818

std::vector<InputFileEntry> UserFiles;

1819

std::vector<InputFileEntry> SystemFiles;

1823

assert(&SourceMgr.

getSLocEntry

(FileID::get(I)) == SLoc);

1830 if

(!

Cache

->OrigEntry)

1834 if

(!IsSLocFileEntryAffecting[I])

1837

InputFileEntry Entry(*

Cache

->OrigEntry);

1838

Entry.IsSystemFile =

isSystem

(

File

.getFileCharacteristic());

1839

Entry.IsTransient =

Cache

->IsTransient;

1840

Entry.BufferOverridden =

Cache

->BufferOverridden;

1843

Entry.IsTopLevel = IncludeFileID.

isInvalid

() || IncludeFileID.ID < 0 ||

1844

!IsSLocFileEntryAffecting[IncludeFileID.ID];

1851 auto

MemBuff =

Cache

->getBufferIfLoaded();

1853

ContentHash = xxh3_64bits(MemBuff->getBuffer());

1856

<< Entry.File.getName();

1858

Entry.ContentHash[0] =

uint32_t

(ContentHash);

1859

Entry.ContentHash[1] =

uint32_t

(ContentHash >> 32);

1860 if

(Entry.IsSystemFile)

1861

SystemFiles.push_back(Entry);

1863

UserFiles.push_back(Entry);

1867 auto

SortedFiles = llvm::concat<InputFileEntry>(std::move(UserFiles),

1868

std::move(SystemFiles));

1870 unsigned

UserFilesNum = 0;

1872

std::vector<uint64_t> InputFileOffsets;

1873 for

(

const auto

&Entry : SortedFiles) {

1874 uint32_t

&InputFileID = InputFileIDs[Entry.File];

1875 if

(InputFileID != 0)

1879

InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);

1881

InputFileID = InputFileOffsets.size();

1883 if

(!Entry.IsSystemFile)

1895 if

(Name == NameAsRequested)

1898

RecordData::value_type

Record

[] = {

1900

InputFileOffsets.size(),

1903

Entry.BufferOverridden,

1907

NameAsRequested.size()};

1909

Stream.EmitRecordWithBlob(IFAbbrevCode,

Record

,

1910

(NameAsRequested + Name).str());

1916

Entry.ContentHash[1]};

1917

Stream.EmitRecordWithAbbrev(IFHAbbrevCode,

Record

);

1924 auto

OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();

1926

OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1927

OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1929

OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1930 unsigned

OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));

1934

InputFileOffsets.size(), UserFilesNum};

1935

Stream.EmitRecordWithBlob(OffsetsAbbrevCode,

Record

,

bytes

(InputFileOffsets));

1945 using namespace llvm

;

1947 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1949

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1950

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1951

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));

1952

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1954

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

1955

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1956

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));

1957

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1958 return

Stream.EmitAbbrev(std::move(Abbrev));

1964 using namespace llvm

;

1966 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1968

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1969

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1970

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));

1971

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

1972

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1973 return

Stream.EmitAbbrev(std::move(Abbrev));

1980 using namespace llvm

;

1982 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1986

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1987

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

1988 return

Stream.EmitAbbrev(std::move(Abbrev));

1994 using namespace llvm

;

1996 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

1998

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

1999

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

2000

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

2001

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

2002

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2003

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

2004 return

Stream.EmitAbbrev(std::move(Abbrev));

2009static

std::pair<unsigned, unsigned>

2011

llvm::encodeULEB128(KeyLen, Out);

2012

llvm::encodeULEB128(DataLen, Out);

2013 return

std::make_pair(KeyLen, DataLen);

2019 class

HeaderFileInfoTrait {

2023

HeaderFileInfoTrait(

ASTWriter

&Writer) : Writer(Writer) {}

2030 using

key_type_ref =

const

key_type &;

2032 using

UnresolvedModule =

2033

llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;

2039

: HFI(HFI), AlreadyIncluded(AlreadyIncluded),

2043 bool

AlreadyIncluded;

2047 using

data_type_ref =

const

data_type &;

2056

uint8_t buf[

sizeof

(key.Size) +

sizeof

(key.ModTime)];

2057 memcpy

(buf, &key.Size,

sizeof

(key.Size));

2058 memcpy

(buf +

sizeof

(key.Size), &key.ModTime,

sizeof

(key.ModTime));

2059 return

llvm::xxh3_64bits(buf);

2062

std::pair<unsigned, unsigned>

2063

EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref

Data

) {

2064 unsigned

KeyLen = key.Filename.size() + 1 + 8 + 8;

2066 for

(

auto

ModInfo :

Data

.KnownHeaders)

2069 if

(

Data

.Unresolved.getPointer())

2074 void

EmitKey(raw_ostream& Out, key_type_ref key,

unsigned

KeyLen) {

2075 using namespace

llvm::support;

2077

endian::Writer

LE

(Out, llvm::endianness::little);

2082

Out.write(key.Filename.data(), KeyLen);

2085 void

EmitData(raw_ostream &Out, key_type_ref key,

2086

data_type_ref

Data

,

unsigned

DataLen) {

2087 using namespace

llvm::support;

2089

endian::Writer

LE

(Out, llvm::endianness::little);

2090 uint64_t

Start = Out.tell(); (void)Start;

2092 unsigned char

Flags = (

Data

.AlreadyIncluded << 6)

2093

| (

Data

.HFI.isImport << 5)

2095 Data

.HFI.isPragmaOnce << 4)

2096

| (

Data

.HFI.DirInfo << 1);

2097 LE

.write<uint8_t>(Flags);

2099 if

(

Data

.HFI.LazyControllingMacro.isID())

2108

assert((

Value

>> 3) == ModID &&

"overflow in header module info"

);

2113 for

(

auto

ModInfo :

Data

.KnownHeaders)

2114

EmitModule(ModInfo.getModule(), ModInfo.getRole());

2115 if

(

Data

.Unresolved.getPointer())

2116

EmitModule(

Data

.Unresolved.getPointer(),

Data

.Unresolved.getInt());

2118

assert(Out.tell() - Start == DataLen &&

"Wrong data length"

);

2127void

ASTWriter::WriteHeaderSearch(

const HeaderSearch

&HS) {

2128

HeaderFileInfoTrait GeneratorTrait(*

this

);

2129

llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>

Generator

;

2131 unsigned

NumHeaderSearchEntries = 0;

2138 if

(WritingModule) {

2140 while

(!Worklist.empty()) {

2141 Module

*M = Worklist.pop_back_val();

2158 if

(!

U

.Size || (!

U

.ModTime && IncludeTimestamps)) {

2159

PP->

Diag

(

U

.FileNameLoc, diag::err_module_no_size_mtime_for_header)

2167

llvm::sys::path::append(

Filename

,

U

.FileName);

2170

StringRef FilenameDup = strdup(

Filename

.c_str());

2171

SavedStrings.push_back(FilenameDup.data());

2173

HeaderFileInfoTrait::key_type Key = {

2174

FilenameDup, *

U

.Size, IncludeTimestamps ? *

U

.ModTime : 0};

2175

HeaderFileInfoTrait::data_type

Data

= {

2180

++NumHeaderSearchEntries;

2183

Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());

2193 for

(

unsigned

UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {

2212 Filename

= StringRef(strdup(FilenameTmp.c_str()));

2213

SavedStrings.push_back(

Filename

.data());

2218

HeaderFileInfoTrait::key_type Key = {

2221

HeaderFileInfoTrait::data_type

Data

= {

2225

++NumHeaderSearchEntries;

2232 using namespace

llvm::support;

2234

llvm::raw_svector_ostream Out(TableData);

2236

endian::write<uint32_t>(Out, 0, llvm::endianness::little);

2237

BucketOffset =

Generator

.Emit(Out, GeneratorTrait);

2241 using namespace llvm

;

2243 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2245

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2246

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2247

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2248

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2249 unsigned

TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2253

NumHeaderSearchEntries, TableData.size()};

2254

Stream.EmitRecordWithBlob(TableAbbrev,

Record

, TableData);

2257 for

(

unsigned

I = 0, N = SavedStrings.size(); I != N; ++I)

2258

free(

const_cast<char

*

>

(SavedStrings[I]));

2261static void emitBlob

(llvm::BitstreamWriter &Stream, StringRef Blob,

2262 unsigned

SLocBufferBlobCompressedAbbrv,

2263 unsigned

SLocBufferBlobAbbrv) {

2264 using

RecordDataType = ASTWriter::RecordData::value_type;

2269 if

(llvm::compression::zstd::isAvailable()) {

2270

llvm::compression::zstd::compress(

2271

llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);

2273

Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,

Record

,

2274

llvm::toStringRef(CompressedBuffer));

2277 if

(llvm::compression::zlib::isAvailable()) {

2278

llvm::compression::zlib::compress(

2279

llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);

2281

Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,

Record

,

2282

llvm::toStringRef(CompressedBuffer));

2287

Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,

Record

, Blob);

2298void

ASTWriter::WriteSourceManagerBlock(

SourceManager

&SourceMgr) {

2303 const uint64_t

SourceManagerBlockOffset = Stream.GetCurrentBitNo();

2309 unsigned

SLocBufferBlobCompressedAbbrv =

2315

std::vector<uint32_t> SLocEntryOffsets;

2316 uint64_t

SLocEntryOffsetsBase = Stream.GetCurrentBitNo();

2322 FileID

FID = FileID::get(I);

2326 uint64_t

Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;

2327

assert((Offset >> 32) == 0 &&

"SLocEntry offset too large"

);

2333 if

(

Cache

->OrigEntry) {

2346 if

(!IsSLocAffecting[I])

2348

SLocEntryOffsets.push_back(Offset);

2352 Record

.push_back(

File

.getFileCharacteristic());

2353 Record

.push_back(

File

.hasLineDirectives());

2355 bool

EmitBlob =

false

;

2358 "Writing to AST an overridden file is not supported"

);

2361

assert(InputFileIDs[*Content->

OrigEntry

] != 0 &&

"Missed file entry"

);

2364 Record

.push_back(getAdjustedNumCreatedFIDs(FID));

2366

FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);

2367 if

(FDI != FileDeclIDs.end()) {

2368 Record

.push_back(FDI->second->FirstDeclIndex);

2369 Record

.push_back(FDI->second->DeclIDs.size());

2375

Stream.EmitRecordWithAbbrev(SLocFileAbbrv,

Record

);

2386

std::optional<llvm::MemoryBufferRef> Buffer = Content->

getBufferOrNone

(

2388

StringRef Name = Buffer ? Buffer->getBufferIdentifier() :

""

;

2389

Stream.EmitRecordWithBlob(SLocBufferAbbrv,

Record

,

2390

StringRef(Name.data(), Name.size() + 1));

2397

std::optional<llvm::MemoryBufferRef> Buffer = Content->

getBufferOrNone

(

2400

Buffer = llvm::MemoryBufferRef(

"<<<INVALID BUFFER>>>"

,

""

);

2401

StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);

2402 emitBlob

(Stream, Blob, SLocBufferBlobCompressedAbbrv,

2403

SLocBufferBlobAbbrv);

2408

SLocEntryOffsets.push_back(Offset);

2424 Record

.push_back(getAdjustedOffset(NextOffset - SLoc->

getOffset

()) - 1);

2425

Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,

Record

);

2431 if

(SLocEntryOffsets.empty())

2436 using namespace llvm

;

2438 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2440

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));

2441

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));

2442

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));

2443

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2444 unsigned

SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2446

RecordData::value_type

Record

[] = {

2449

SLocEntryOffsetsBase - SourceManagerBlockOffset};

2450

Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,

Record

,

2451 bytes

(SLocEntryOffsets));

2462

llvm::DenseMap<int, int> FilenameMap;

2463

FilenameMap[-1] = -1;

2464 for

(

const auto

&L : LineTable) {

2467 for

(

auto

&LE : L.second) {

2468 if

(FilenameMap.insert(std::make_pair(

LE

.FilenameID,

2469

FilenameMap.size() - 1)).second)

2476 for

(

const auto

&L : LineTable) {

2484 Record

.push_back(L.second.size());

2485 for

(

const auto

&LE : L.second) {

2486 Record

.push_back(

LE

.FileOffset);

2488 Record

.push_back(FilenameMap[

LE

.FilenameID]);

2489 Record

.push_back((

unsigned

)

LE

.FileKind);

2490 Record

.push_back(

LE

.IncludeOffset);

2505 if

(MI->isBuiltinMacro())

2521void

ASTWriter::WritePreprocessor(

const Preprocessor

&PP,

bool

IsModule) {

2522 uint64_t

MacroOffsetsBase = Stream.GetCurrentBitNo();

2526

WritePreprocessorDetail(*PPRec, MacroOffsetsBase);

2541 if

(AssumeNonNullLoc.

isValid

()) {

2552 Record

.push_back(

true

);

2555 Record

.push_back(SkipInfo->FoundNonSkipPortion);

2556 Record

.push_back(SkipInfo->FoundElse);

2559 Record

.push_back(

false

);

2563 Record

.push_back(Cond.WasSkipping);

2564 Record

.push_back(Cond.FoundNonSkip);

2565 Record

.push_back(Cond.FoundElse);

2595 if

(

Id

.second->hadMacroDefinition() &&

2596

(!

Id

.second->isFromAST() ||

2597 Id

.second->hasChangedSinceDeserialization()))

2598

MacroIdentifiers.push_back(

Id

.second);

2601

llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());

2607 uint64_t

StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;

2608

assert((StartOffset >> 32) == 0 &&

"Macro identifiers offset too large"

);

2611 bool

EmittedModuleMacros =

false

;

2628 if

(

auto

*DefMD = dyn_cast<DefMacroDirective>(MD)) {

2630

}

else if

(

auto

*VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {

2631 Record

.push_back(VisMD->isPublic());

2633

ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));

2636

ModuleMacroRecord.clear();

2637

EmittedModuleMacros =

true

;

2647 if

(

auto

*DefMD = dyn_cast<DefMacroDirective>(MD)) {

2649

}

else if

(

auto

*VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {

2650 Record

.push_back(VisMD->isPublic());

2657

llvm::DenseMap<ModuleMacro *, unsigned> Visits;

2658 while

(!Worklist.empty()) {

2659 auto

*

Macro

= Worklist.pop_back_val();

2662

ModuleMacroRecord.push_back(getSubmoduleID(

Macro

->getOwningModule()));

2664 for

(

auto

*M :

Macro

->overrides())

2665

ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));

2668

ModuleMacroRecord.clear();

2671 for

(

auto

*M :

Macro

->overrides())

2672 if

(++Visits[M] == M->getNumOverridingMacros())

2673

Worklist.push_back(M);

2675

EmittedModuleMacros =

true

;

2678 if

(

Record

.empty() && !EmittedModuleMacros)

2681

IdentMacroDirectivesOffsetMap[Name] = StartOffset;

2692

std::vector<uint32_t> MacroOffsets;

2694 for

(

unsigned

I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {

2699 if

(ID < FirstMacroID) {

2700

assert(0 &&

"Loaded MacroInfo entered MacroInfosToEmit ?"

);

2705 unsigned

Index =

ID

- FirstMacroID;

2706 if

(Index >= MacroOffsets.size())

2707

MacroOffsets.resize(Index + 1);

2709 uint64_t

Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;

2710

assert((Offset >> 32) == 0 &&

"Macro offset too large"

);

2711

MacroOffsets[Index] = Offset;

2738

Stream.EmitRecord(Code,

Record

);

2742 for

(

unsigned

TokNo = 0, e = MI->

getNumTokens

(); TokNo != e; ++TokNo) {

2757 using namespace llvm

;

2759 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2761

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2762

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2763

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));

2764

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2766 unsigned

MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2770

MacroOffsetsBase - ASTBlockStartOffset};

2771

Stream.EmitRecordWithBlob(MacroOffsetAbbrev,

Record

,

bytes

(MacroOffsets));

2776

uint64_t MacroOffsetsBase) {

2786 unsigned

NumPreprocessingRecords = 0;

2787 using namespace llvm

;

2790 unsigned

InclusionAbbrev = 0;

2792 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2794

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2795

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2796

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));

2797

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2798

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2799

InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2802 unsigned

FirstPreprocessorEntityID

2803

= (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0)

2805 unsigned

NextPreprocessorEntityID = FirstPreprocessorEntityID;

2810

(void)++

E

, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {

2813 uint64_t

Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;

2814

assert((Offset >> 32) == 0 &&

"Preprocessed entity offset too large"

);

2815 SourceRange

R = getAdjustedRange((*E)->getSourceRange());

2816

PreprocessedEntityOffsets.emplace_back(

2820 if

(

auto

*MD = dyn_cast<MacroDefinitionRecord>(*

E

)) {

2822

MacroDefinitions[MD] = NextPreprocessorEntityID;

2829 if

(

auto

*ME = dyn_cast<MacroExpansion>(*

E

)) {

2830 Record

.push_back(ME->isBuiltinMacro());

2831 if

(ME->isBuiltinMacro())

2834 Record

.push_back(MacroDefinitions[ME->getDefinition()]);

2839 if

(

auto

*ID = dyn_cast<InclusionDirective>(*

E

)) {

2841 Record

.push_back(

ID

->getFileName().size());

2842 Record

.push_back(

ID

->wasInQuotes());

2843 Record

.push_back(

static_cast<unsigned>

(

ID

->getKind()));

2844 Record

.push_back(

ID

->importedModule());

2846

Buffer +=

ID

->getFileName();

2849 if

(

ID

->getFile())

2850

Buffer +=

ID

->getFile()->getName();

2851

Stream.EmitRecordWithBlob(InclusionAbbrev,

Record

, Buffer);

2855

llvm_unreachable(

"Unhandled PreprocessedEntity in ASTWriter"

);

2860 if

(NumPreprocessingRecords > 0) {

2861

assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);

2864 using namespace llvm

;

2866 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2868

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

2869

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2870 unsigned

PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2873

FirstPreprocessorEntityID -

2875

Stream.EmitRecordWithBlob(PPEOffsetAbbrev,

Record

,

2876 bytes

(PreprocessedEntityOffsets));

2881 if

(SkippedRanges.size() > 0) {

2882

std::vector<PPSkippedRange> SerializedSkippedRanges;

2883

SerializedSkippedRanges.reserve(SkippedRanges.size());

2884 for

(

auto const

&

Range

: SkippedRanges)

2885

SerializedSkippedRanges.emplace_back(

2889 using namespace llvm

;

2890 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2892

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2893 unsigned

PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2897

Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,

Record

,

2898 bytes

(SerializedSkippedRanges));

2906 auto

Known = SubmoduleIDs.find(Mod);

2907 if

(Known != SubmoduleIDs.end())

2908 return

Known->second;

2911 if

(Top != WritingModule &&

2913

!Top->fullModuleNameIs(StringRef(

getLangOpts

().CurrentModule))))

2916 return

SubmoduleIDs[Mod] = NextSubmoduleID++;

2919unsigned

ASTWriter::getSubmoduleID(

Module

*Mod) {

2932 unsigned

ChildModules = 0;

2936 return

ChildModules + 1;

2939void

ASTWriter::WriteSubmodules(

Module

*WritingModule,

ASTContext

*Context) {

2944 using namespace llvm

;

2946 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

2948

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

2949

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

2950

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));

2951

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));

2952

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));

2953

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2954

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2955

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2956

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2957

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2958

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2959

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2960

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2961

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2962

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2963

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2964 unsigned

DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2966

Abbrev = std::make_shared<BitCodeAbbrev>();

2968

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2969 unsigned

UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2971

Abbrev = std::make_shared<BitCodeAbbrev>();

2973

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2974 unsigned

HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2976

Abbrev = std::make_shared<BitCodeAbbrev>();

2978

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2979 unsigned

TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2981

Abbrev = std::make_shared<BitCodeAbbrev>();

2983

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2984 unsigned

UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2986

Abbrev = std::make_shared<BitCodeAbbrev>();

2988

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

2989

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2990 unsigned

RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2992

Abbrev = std::make_shared<BitCodeAbbrev>();

2994

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

2995 unsigned

ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

2997

Abbrev = std::make_shared<BitCodeAbbrev>();

2999

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3000 unsigned

TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3002

Abbrev = std::make_shared<BitCodeAbbrev>();

3004

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3005 unsigned

PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3007

Abbrev = std::make_shared<BitCodeAbbrev>();

3009

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3010 unsigned

PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3012

Abbrev = std::make_shared<BitCodeAbbrev>();

3014

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));

3015

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3016 unsigned

LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3018

Abbrev = std::make_shared<BitCodeAbbrev>();

3020

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3021 unsigned

ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3023

Abbrev = std::make_shared<BitCodeAbbrev>();

3025

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

3026

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3027 unsigned

ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3029

Abbrev = std::make_shared<BitCodeAbbrev>();

3031

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3032 unsigned

ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3035

RecordData::value_type

Record

[] = {

3041

std::queue<Module *> Q;

3042

Q.push(WritingModule);

3043 while

(!Q.empty()) {

3046 unsigned ID

= getSubmoduleID(Mod);

3050

assert(SubmoduleIDs[Mod->

Parent

] &&

"Submodule parent not written?"

);

3051

ParentID = SubmoduleIDs[Mod->

Parent

];

3058 FileID

UnadjustedInferredFID;

3061 int

InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();

3068

(RecordData::value_type)Mod->

Kind

,

3070

(RecordData::value_type)InferredFID,

3081

Stream.EmitRecordWithBlob(DefinitionAbbrev,

Record

, Mod->

Name

);

3087

Stream.EmitRecordWithBlob(RequiresAbbrev,

Record

, R.FeatureName);

3091 if

(std::optional<Module::Header> UmbrellaHeader =

3094

Stream.EmitRecordWithBlob(UmbrellaAbbrev,

Record

,

3095

UmbrellaHeader->NameAsWritten);

3096

}

else if

(std::optional<Module::DirectoryName> UmbrellaDir =

3099

Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,

Record

,

3100

UmbrellaDir->NameAsWritten);

3105 unsigned

RecordKind;

3116 for

(

const auto

&HL : HeaderLists) {

3117

RecordData::value_type

Record

[] = {HL.RecordKind};

3118 for

(

const auto

&H : Mod->

getHeaders

(HL.HeaderKind))

3119

Stream.EmitRecordWithBlob(HL.Abbrev,

Record

, H.NameAsWritten);

3128

Stream.EmitRecordWithBlob(TopHeaderAbbrev,

Record

, HeaderName);

3133 if

(!Mod->

Imports

.empty()) {

3135 for

(

auto

*I : Mod->

Imports

)

3136 Record

.push_back(getSubmoduleID(I));

3144 Record

.push_back(getSubmoduleID(I));

3149 if

(!Mod->

Exports

.empty()) {

3151 for

(

const auto

&

E

: Mod->

Exports

) {

3154 Record

.push_back(getSubmoduleID(

E

.getPointer()));

3155 Record

.push_back(

E

.getInt());

3170

Stream.EmitRecordWithBlob(LinkLibraryAbbrev,

Record

, LL.Library);

3178

getSubmoduleID(

C

.Other)};

3179

Stream.EmitRecordWithBlob(ConflictAbbrev,

Record

,

C

.Message);

3185

Stream.EmitRecordWithBlob(ConfigMacroAbbrev,

Record

, CM);

3212

assert((NextSubmoduleID - FirstSubmoduleID ==

3214 "Wrong # of submodules; found a reference to a non-local, " 3215 "non-imported submodule?"

);

3220

llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>

3222 unsigned

CurrID = 0;

3225 auto

EncodeDiagStateFlags =

3226

[](

const

DiagnosticsEngine::DiagState *DS) ->

unsigned

{

3228 for

(

unsigned

Val :

3229

{(

unsigned

)DS->IgnoreAllWarnings, (

unsigned

)DS->EnableAllWarnings,

3230

(

unsigned

)DS->WarningsAsErrors, (

unsigned

)DS->ErrorsAsFatal,

3231

(

unsigned

)DS->SuppressSystemWarnings})

3236 unsigned

Flags = EncodeDiagStateFlags(

Diag

.DiagStatesByLoc.FirstDiagState);

3237 Record

.push_back(Flags);

3239 auto

AddDiagState = [&](

const

DiagnosticsEngine::DiagState *State,

3240 bool

IncludeNonPragmaStates) {

3243

assert(Flags == EncodeDiagStateFlags(State) &&

3244 "diag state flags vary in single AST file"

);

3248

assert(!IncludeNonPragmaStates ||

3249

State ==

Diag

.DiagStatesByLoc.FirstDiagState);

3251 unsigned

&DiagStateID = DiagStateIDMap[State];

3252 Record

.push_back(DiagStateID);

3254 if

(DiagStateID == 0) {

3255

DiagStateID = ++CurrID;

3259 auto

SizeIdx =

Record

.size();

3261 for

(

const auto

&I : *State) {

3263 if

(!I.second.isPragma() && !IncludeNonPragmaStates)

3267 if

(!I.second.isPragma() &&

3268

I.second ==

Diag

.getDiagnosticIDs()->getDefaultMapping(I.first))

3270

Mappings.push_back(I);

3274

llvm::sort(Mappings, llvm::less_first());

3276 for

(

const auto

&I : Mappings) {

3277 Record

.push_back(I.first);

3278 Record

.push_back(I.second.serialize());

3285

AddDiagState(

Diag

.DiagStatesByLoc.FirstDiagState, isModule);

3288 auto

NumLocationsIdx =

Record

.size();

3292 unsigned

NumLocations = 0;

3293 for

(

auto

&FileIDAndFile :

Diag

.DiagStatesByLoc.Files) {

3294 if

(!FileIDAndFile.first.isValid() ||

3295

!FileIDAndFile.second.HasLocalTransitions)

3301 Record

.push_back(FileIDAndFile.second.StateTransitions.size());

3302 for

(

auto

&StatePoint : FileIDAndFile.second.StateTransitions) {

3303 Record

.push_back(getAdjustedOffset(StatePoint.Offset));

3304

AddDiagState(StatePoint.State,

false

);

3309 Record

[NumLocationsIdx] = NumLocations;

3318

AddDiagState(

Diag

.DiagStatesByLoc.CurDiagState,

false

);

3331

IdxRef =

TypeIdx

(0, NextTypeID++);

3335

assert(Idx.

getValue

() >= FirstTypeID &&

"Writing predefined type"

);

3339

ASTTypeWriter(Context, *

this

).write(

T

) - DeclTypesBlockStartOffset;

3343 if

(TypeOffsets.size() == Index)

3344

TypeOffsets.emplace_back(Offset);

3345 else if

(TypeOffsets.size() < Index) {

3346

TypeOffsets.resize(Index + 1);

3347

TypeOffsets[Index].set(Offset);

3349

llvm_unreachable(

"Types emitted in wrong order"

);

3358 auto

*ND = dyn_cast<NamedDecl>(

D

);

3382 uint64_t

Offset = Stream.GetCurrentBitNo();

3384 for

(

const auto

*

D

: DC->

decls

()) {

3397

KindDeclPairs.push_back(

D

->

getKind

());

3398

KindDeclPairs.push_back(

GetDeclRef

(

D

).getRawValue());

3401

++NumLexicalDeclContexts;

3403

Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,

Record

,

3404 bytes

(KindDeclPairs));

3408void

ASTWriter::WriteTypeDeclOffsets() {

3409 using namespace llvm

;

3412 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

3414

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3415

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3416 unsigned

TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3419

Stream.EmitRecordWithBlob(TypeOffsetAbbrev,

Record

,

bytes

(TypeOffsets));

3423

Abbrev = std::make_shared<BitCodeAbbrev>();

3425

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3426

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3427 unsigned

DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3430

Stream.EmitRecordWithBlob(DeclOffsetAbbrev,

Record

,

bytes

(DeclOffsets));

3434void

ASTWriter::WriteFileDeclIDsMap() {

3435 using namespace llvm

;

3438

SortedFileDeclIDs.reserve(FileDeclIDs.size());

3439 for

(

const auto

&

P

: FileDeclIDs)

3440

SortedFileDeclIDs.push_back(std::make_pair(

P

.first,

P

.second.get()));

3441

llvm::sort(SortedFileDeclIDs, llvm::less_first());

3445 for

(

auto

&FileDeclEntry : SortedFileDeclIDs) {

3446

DeclIDInFileInfo &Info = *FileDeclEntry.second;

3447

Info.FirstDeclIndex = FileGroupedDeclIDs.size();

3448

llvm::stable_sort(Info.DeclIDs);

3449 for

(

auto

&LocDeclEntry : Info.DeclIDs)

3450

FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());

3453 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

3455

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3456

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3457 unsigned

AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));

3459

FileGroupedDeclIDs.size()};

3460

Stream.EmitRecordWithBlob(AbbrevCode,

Record

,

bytes

(FileGroupedDeclIDs));

3463void

ASTWriter::WriteComments(

ASTContext

&Context) {

3465 auto

_ = llvm::make_scope_exit([

this

] { Stream.ExitBlock(); });

3476 for

(

const auto

&FO : Context.

Comments

.OrderedComments) {

3477 for

(

const auto

&OC : FO.second) {

3496class

ASTMethodPoolTrait {

3501 using

key_type_ref = key_type;

3507 using

data_type_ref =

const

data_type &;

3512 explicit

ASTMethodPoolTrait(

ASTWriter

&Writer) : Writer(Writer) {}

3518

std::pair<unsigned, unsigned>

3519

EmitKeyDataLength(raw_ostream& Out,

Selector

Sel,

3520

data_type_ref Methods) {

3524 unsigned

DataLen = 4 + 2 + 2;

3527 if

(ShouldWriteMethodListNode(Method))

3528

DataLen +=

sizeof

(

DeclID

);

3531 if

(ShouldWriteMethodListNode(Method))

3532

DataLen +=

sizeof

(

DeclID

);

3536 void

EmitKey(raw_ostream& Out,

Selector

Sel,

unsigned

) {

3537 using namespace

llvm::support;

3539

endian::Writer

LE

(Out, llvm::endianness::little);

3541

assert((Start >> 32) == 0 &&

"Selector key offset too large"

);

3544 LE

.write<uint16_t>(N);

3547 for

(

unsigned

I = 0; I != N; ++I)

3552 void

EmitData(raw_ostream& Out, key_type_ref,

3553

data_type_ref Methods,

unsigned

DataLen) {

3554 using namespace

llvm::support;

3556

endian::Writer

LE

(Out, llvm::endianness::little);

3557 uint64_t

Start = Out.tell(); (void)Start;

3559 unsigned

NumInstanceMethods = 0;

3562 if

(ShouldWriteMethodListNode(Method))

3563

++NumInstanceMethods;

3565 unsigned

NumFactoryMethods = 0;

3568 if

(ShouldWriteMethodListNode(Method))

3569

++NumFactoryMethods;

3571 unsigned

InstanceBits = Methods.Instance.getBits();

3572

assert(InstanceBits < 4);

3573 unsigned

InstanceHasMoreThanOneDeclBit =

3574

Methods.Instance.hasMoreThanOneDecl();

3575 unsigned

FullInstanceBits = (NumInstanceMethods << 3) |

3576

(InstanceHasMoreThanOneDeclBit << 2) |

3578 unsigned

FactoryBits = Methods.Factory.getBits();

3579

assert(FactoryBits < 4);

3580 unsigned

FactoryHasMoreThanOneDeclBit =

3581

Methods.Factory.hasMoreThanOneDecl();

3582 unsigned

FullFactoryBits = (NumFactoryMethods << 3) |

3583

(FactoryHasMoreThanOneDeclBit << 2) |

3585 LE

.write<uint16_t>(FullInstanceBits);

3586 LE

.write<uint16_t>(FullFactoryBits);

3589 if

(ShouldWriteMethodListNode(Method))

3593 if

(ShouldWriteMethodListNode(Method))

3596

assert(Out.tell() - Start == DataLen &&

"Data length is wrong"

);

3601 return

(

Node

->getMethod() && !

Node

->getMethod()->isFromASTFile());

3612void

ASTWriter::WriteSelectors(

Sema

&SemaRef) {

3613 using namespace llvm

;

3616 if

(SemaRef.

ObjC

().

MethodPool

.empty() && SelectorIDs.empty())

3618 unsigned

NumTableEntries = 0;

3621

llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>

Generator

;

3622

ASTMethodPoolTrait Trait(*

this

);

3626

SelectorOffsets.resize(NextSelectorID - FirstSelectorID);

3627 for

(

auto

&SelectorAndID : SelectorIDs) {

3630

SemaObjC::GlobalMethodPool::iterator F =

3632

ASTMethodPoolTrait::data_type

Data

= {

3638 Data

.Instance = F->second.first;

3639 Data

.Factory = F->second.second;

3643 if

(Chain && ID < FirstSelectorID) {

3645 bool

changed =

false

;

3648 if

(!M->getMethod()->isFromASTFile()) {

3650 Data

.Instance = *M;

3656 if

(!M->getMethod()->isFromASTFile()) {

3664

}

else if

(

Data

.Instance.getMethod() ||

Data

.Factory.getMethod()) {

3675 using namespace

llvm::support;

3677

ASTMethodPoolTrait Trait(*

this

);

3678

llvm::raw_svector_ostream Out(MethodPool);

3680

endian::write<uint32_t>(Out, 0, llvm::endianness::little);

3681

BucketOffset =

Generator

.Emit(Out, Trait);

3685 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

3687

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3688

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3689

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3690 unsigned

MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3696

Stream.EmitRecordWithBlob(MethodPoolAbbrev,

Record

, MethodPool);

3700

Abbrev = std::make_shared<BitCodeAbbrev>();

3702

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3703

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3704

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3705 unsigned

SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3709

RecordData::value_type

Record

[] = {

3712

Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,

Record

,

3713 bytes

(SelectorOffsets));

3719void

ASTWriter::WriteReferencedSelectorsPool(

Sema

&SemaRef) {

3720 using namespace llvm

;

3732 Selector

Sel = SelectorAndLocation.first;

3734

Writer.AddSelectorRef(Sel);

3756 for

(; Redecl; Redecl = Redecl->getPreviousDecl()) {

3758 if

(!Redecl->isFromASTFile()) {

3762 if

(!Redecl->getDeclContext()->getRedeclContext()->Equals(

3765 return

cast<NamedDecl>(Redecl);

3770 if

(Redecl->getOwningModuleID() == 0)

3775 if

(!

First

->isFromASTFile())

3776 return

cast<NamedDecl>(

First

);

3786bool

IsInterestingIdentifier(

const IdentifierInfo

*II, uint64_t MacroOffset,

3787 bool

IsModule,

bool

IsCPlusPlus) {

3788 bool

NeedDecls = !IsModule || !IsCPlusPlus;

3790 bool

IsInteresting =

3794 if

(MacroOffset || II->

isPoisoned

() || (!IsModule && IsInteresting) ||

3805 bool

IsCPlusPlus = Writer.

getLangOpts

().CPlusPlus;

3806 return

IsInterestingIdentifier(II,

0, IsModule, IsCPlusPlus);

3809class

ASTIdentifierTableTrait {

3822 return

IsInterestingIdentifier(II, MacroOffset, IsModule,

3828 using

key_type_ref = key_type;

3831 using

data_type_ref = data_type;

3839

: Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),

3840

NeedDecls(!IsModule || !Writer.getLangOpts().

CPlusPlus

),

3841

InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}

3843 bool

needDecls()

const

{

return

NeedDecls; }

3846 return

llvm::djbHash(II->

getName

());

3854

std::pair<unsigned, unsigned>

3864 if

(InterestingIdentifierOffsets &&

3866

InterestingIdentifierOffsets->push_back(Out.tell());

3868 unsigned

KeyLen = II->

getLength

() + 1;

3876 if

(NeedDecls && IdResolver)

3877

DataLen += std::distance(IdResolver->

begin

(II), IdResolver->

end

()) *

3883 void

EmitKey(raw_ostream &Out,

const IdentifierInfo

*II,

unsigned

KeyLen) {

3889 using namespace

llvm::support;

3891

endian::Writer

LE

(Out, llvm::endianness::little);

3901

assert((Bits & 0xffff) == Bits &&

"ObjCOrBuiltinID too big for ASTReader."

);

3902 LE

.write<uint16_t>(Bits);

3904 bool

HadMacroDefinition = MacroOffset != 0;

3905

Bits = (Bits << 1) |

unsigned

(HadMacroDefinition);

3907

Bits = (Bits << 1) |

unsigned

(II->

isPoisoned

());

3910 LE

.write<uint16_t>(Bits);

3912 if

(HadMacroDefinition)

3915 if

(NeedDecls && IdResolver) {

3944 using namespace llvm

;

3951

llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>

Generator

;

3952

ASTIdentifierTableTrait Trait(*

this

, PP, IdResolver, IsModule,

3953

IsModule ? &InterestingIdents :

nullptr

);

3957

IdentifierOffsets.resize(NextIdentID - FirstIdentID);

3958 for

(

auto

IdentIDPair : IdentifierIDs) {

3961

assert(II &&

"NULL identifier in identifier table"

);

3966

(Trait.needDecls() &&

3975 using namespace

llvm::support;

3979

endian::write<uint32_t>(Out, 0, llvm::endianness::little);

3980

BucketOffset =

Generator

.Emit(Out, Trait);

3984 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

3986

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3987

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

3988 unsigned

IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

3996 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

3998

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));

3999

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

4000 unsigned

IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

4003 for

(

unsigned

I = 0, N = IdentifierOffsets.size(); I != N; ++I)

4004

assert(IdentifierOffsets[I] &&

"Missing identifier offset?"

);

4008

IdentifierOffsets.size()};

4009

Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,

Record

,

4010 bytes

(IdentifierOffsets));

4014 if

(!InterestingIdents.empty())

4022

PendingEmittingVTables.push_back(RD);

4031class

ASTDeclContextNameLookupTraitBase {

4039 using

data_type = std::pair<unsigned, unsigned>;

4040 using

data_type_ref =

const

data_type &;

4046 explicit

ASTDeclContextNameLookupTraitBase(

ASTWriter

&Writer)

4050

data_type getData(

const

DeclIDsTy &LocalIDs) {

4051 unsigned

Start = DeclIDs.size();

4052 for

(

auto ID

: LocalIDs)

4053

DeclIDs.push_back(

ID

);

4054 return

std::make_pair(Start, DeclIDs.size());

4058 unsigned

Start = DeclIDs.size();

4063 return

std::make_pair(Start, DeclIDs.size());

4066 void

EmitFileRef(raw_ostream &Out,

ModuleFile

*F)

const

{

4068 "have reference to loaded module file but no chain?"

);

4070 using namespace

llvm::support;

4073

llvm::endianness::little);

4076

std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,

4078

data_type_ref Lookup) {

4079 unsigned

KeyLen = 1;

4080 switch

(Name.getKind()) {

4102 unsigned

DataLen =

sizeof

(

DeclID

) * (Lookup.second - Lookup.first);

4104 return

{KeyLen, DataLen};

4108 using namespace

llvm::support;

4110

endian::Writer

LE

(Out, llvm::endianness::little);

4111 LE

.write<uint8_t>(Name.getKind());

4112 switch

(Name.getKind()) {

4125 "Invalid operator?"

);

4126 LE

.write<uint8_t>(Name.getOperatorKind());

4135

llvm_unreachable(

"Invalid name kind?"

);

4138 void

EmitDataBase(raw_ostream &Out, data_type Lookup,

unsigned

DataLen) {

4139 using namespace

llvm::support;

4141

endian::Writer

LE

(Out, llvm::endianness::little);

4142 uint64_t

Start = Out.tell(); (void)Start;

4143 for

(

unsigned

I = Lookup.first, N = Lookup.second; I != N; ++I)

4145

assert(Out.tell() - Start == DataLen &&

"Data length is wrong"

);

4149class

ModuleLevelNameLookupTrait :

public

ASTDeclContextNameLookupTraitBase {

4151 using

primary_module_hash_type =

unsigned

;

4153 using

key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;

4154 using

key_type_ref = key_type;

4156 explicit

ModuleLevelNameLookupTrait(

ASTWriter

&Writer)

4157

: ASTDeclContextNameLookupTraitBase(Writer) {}

4159 static bool

EqualKey(key_type_ref a, key_type_ref

b

) {

return

a ==

b

; }

4162

llvm::FoldingSetNodeID

ID

;

4163 ID

.AddInteger(Key.first.getHash());

4164 ID

.AddInteger(Key.second);

4165 return ID

.computeStableHash();

4168

std::pair<unsigned, unsigned>

4169

EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {

4170 auto

[KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);

4171

KeyLen +=

sizeof

(Key.second);

4175 void

EmitKey(raw_ostream &Out, key_type Key,

unsigned

) {

4176

EmitKeyBase(Out, Key.first);

4177

llvm::support::endian::Writer

LE

(Out, llvm::endianness::little);

4178 LE

.write<primary_module_hash_type>(Key.second);

4181 void

EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,

4183

EmitDataBase(Out, Lookup, DataLen);

4187static bool

isModuleLocalDecl(

NamedDecl

*

D

) {

4192 return

isModuleLocalDecl(

Parent

);

4196 if

(

auto

*FTD = dyn_cast<FunctionTemplateDecl>(

D

))

4197 if

(

auto

*CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))

4198 return

isModuleLocalDecl(CDGD->getDeducedTemplate());

4206static bool

isTULocalInNamedModules(

NamedDecl

*

D

) {

4230template

<

bool

CollectingTULocalDecls>

4231class

ASTDeclContextNameLookupTrait :

public

ASTDeclContextNameLookupTraitBase {

4233 using

ModuleLevelDeclsMapTy =

4234

llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;

4237 using

key_type_ref = key_type;

4239 using

TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;

4242

ModuleLevelDeclsMapTy ModuleLocalDeclsMap;

4243

TULocalDeclsMapTy TULocalDeclsMap;

4246 explicit

ASTDeclContextNameLookupTrait(

ASTWriter

&Writer)

4247

: ASTDeclContextNameLookupTraitBase(Writer) {}

4249 template

<

typename

Coll> data_type getData(

const

Coll &Decls) {

4250 unsigned

Start = DeclIDs.size();

4268 if

(isModuleLocalDecl(

D

)) {

4269 if

(std::optional<unsigned> PrimaryModuleHash =

4271 auto

Key = std::make_pair(

D

->getDeclName(), *PrimaryModuleHash);

4272 auto Iter

= ModuleLocalDeclsMap.find(Key);

4273 if

(

Iter

== ModuleLocalDeclsMap.end())

4274

ModuleLocalDeclsMap.insert({Key, DeclIDsTy{

ID

}});

4276 Iter

->second.push_back(

ID

);

4281 if constexpr

(CollectingTULocalDecls) {

4282 if

(isTULocalInNamedModules(

D

)) {

4283 auto Iter

= TULocalDeclsMap.find(

D

->getDeclName());

4284 if

(

Iter

== TULocalDeclsMap.end())

4285

TULocalDeclsMap.insert({

D

->getDeclName(), DeclIDsTy{

ID

}});

4287 Iter

->second.push_back(

ID

);

4292

DeclIDs.push_back(

ID

);

4294 return

std::make_pair(Start, DeclIDs.size());

4297 using

ASTDeclContextNameLookupTraitBase::getData;

4299 const

ModuleLevelDeclsMapTy &getModuleLocalDecls() {

4300 return

ModuleLocalDeclsMap;

4303 const

TULocalDeclsMapTy &getTULocalDecls() {

return

TULocalDeclsMap; }

4305 static bool

EqualKey(key_type_ref a, key_type_ref

b

) {

return

a ==

b

; }

4307

hash_value_type

ComputeHash

(key_type Name) {

return

Name.getHash(); }

4309

std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,

4311

data_type_ref Lookup) {

4312 auto

[KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);

4317 return

EmitKeyBase(Out, Name);

4320 void

EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,

4322

EmitDataBase(Out, Lookup, DataLen);

4329class

LazySpecializationInfoLookupTrait {

4335 using

key_type_ref = key_type;

4338 using

data_type = std::pair<unsigned, unsigned>;

4339 using

data_type_ref =

const

data_type &;

4344 explicit

LazySpecializationInfoLookupTrait(

ASTWriter

&Writer)

4347 template

<

typename

Col,

typename

Col2>

4348

data_type getData(Col &&

C

, Col2 &ExistingInfo) {

4349 unsigned

Start = Specs.size();

4350 for

(

auto

*

D

:

C

) {

4357

Specs.push_back(Info);

4358 return

std::make_pair(Start, Specs.size());

4361

data_type ImportData(

4363 unsigned

Start = Specs.size();

4364 for

(

auto ID

: FromReader)

4365

Specs.push_back(

ID

);

4366 return

std::make_pair(Start, Specs.size());

4369 static bool

EqualKey(key_type_ref a, key_type_ref

b

) {

return

a ==

b

; }

4371

hash_value_type

ComputeHash

(key_type Name) {

return

Name; }

4373 void

EmitFileRef(raw_ostream &Out,

ModuleFile

*F)

const

{

4375 "have reference to loaded module file but no chain?"

);

4377 using namespace

llvm::support;

4379

llvm::endianness::little);

4382

std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,

4384

data_type_ref Lookup) {

4386 unsigned

KeyLen = 4;

4388

(Lookup.second - Lookup.first);

4393 void

EmitKey(raw_ostream &Out, key_type HashValue,

unsigned

) {

4394 using namespace

llvm::support;

4396

endian::Writer

LE

(Out, llvm::endianness::little);

4400 void

EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,

4402 using namespace

llvm::support;

4404

endian::Writer

LE

(Out, llvm::endianness::little);

4407 for

(

unsigned

I = Lookup.first, N = Lookup.second; I != N; ++I) {

4408 LE

.write<

DeclID

>(Specs[I].getRawValue());

4410

assert(Out.tell() - Start == DataLen &&

"Data length is wrong"

);

4414unsigned

CalculateODRHashForSpecs(

const Decl

*Spec) {

4416 if

(

auto

*CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))

4417

Args = CTSD->getTemplateArgs().asArray();

4418 else if

(

auto

*VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))

4419

Args = VTSD->getTemplateArgs().asArray();

4420 else if

(

auto

*FD = dyn_cast<FunctionDecl>(Spec))

4421

Args = FD->getTemplateSpecializationArgs()->asArray();

4423

llvm_unreachable(

"New Specialization Kind?"

);

4429void

ASTWriter::GenerateSpecializationInfoLookupTable(

4436

LazySpecializationInfoLookupTrait>

4438

LazySpecializationInfoLookupTrait Trait(*

this

);

4440

llvm::DenseMap<unsigned, llvm::SmallVector<const NamedDecl *, 4>>

4444 unsigned

HashedValue = CalculateODRHashForSpecs(

Specialization

);

4446 auto Iter

= SpecializationMaps.find(HashedValue);

4447 if

(

Iter

== SpecializationMaps.end())

4448 Iter

= SpecializationMaps

4449

.try_emplace(HashedValue,

4460 for

(

auto

&[HashValue, Specs] : SpecializationMaps) {

4471

ExisitingSpecs = Lookups->Table.find(HashValue);

4473 Generator

.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);

4476 Generator

.emit(LookupTable, Trait, Lookups ? &Lookups->Table :

nullptr

);

4479uint64_t

ASTWriter::WriteSpecializationInfoLookupTable(

4484

GenerateSpecializationInfoLookupTable(

D

, Specializations, LookupTable,

4487 uint64_t

Offset = Stream.GetCurrentBitNo();

4488

RecordData::value_type

Record

[] = {

static_cast<

RecordData::value_type

>

(

4490

Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev

4491

: DeclSpecializationsAbbrev,

4499 return Result

.hasExternalDecls() &&

4500

DC->hasNeedToReconcileExternalVisibleStorage();

4509 for

(

auto

*

D

:

Result

.getLookupResult()) {

4511 if

(LocalD->isFromASTFile())

4529void

ASTWriter::GenerateNameLookupTable(

4534

assert(!ConstDC->hasLazyLocalLexicalLookups() &&

4535

!ConstDC->hasLazyExternalLexicalLookups() &&

4536 "must call buildLookups first"

);

4545

ASTDeclContextNameLookupTrait<

true

>>

4547

ASTDeclContextNameLookupTrait<

true

> Trait(*

this

);

4559 auto

&Name = Lookup.first;

4560 auto

&

Result

= Lookup.second;

4575 if

((GeneratingReducedBMI || isLookupResultExternal(

Result

, DC)) &&

4593 if

(Lookup.second.getLookupResult().empty())

4596 switch

(Lookup.first.getNameKind()) {

4598

Names.push_back(Lookup.first);

4602

assert(isa<CXXRecordDecl>(DC) &&

4603 "Cannot have a constructor name outside of a class!"

);

4604

ConstructorNameSet.insert(Name);

4608

assert(isa<CXXRecordDecl>(DC) &&

4609 "Cannot have a conversion function name outside of a class!"

);

4610

ConversionNameSet.insert(Name);

4618 if

(

auto

*

D

= dyn_cast<CXXRecordDecl>(DC)) {

4632 if

(ConstructorNameSet.erase(ImplicitCtorName))

4633

Names.push_back(ImplicitCtorName);

4638 if

(!ConstructorNameSet.empty() || !ConversionNameSet.empty())

4639 for

(

Decl

*ChildD : cast<CXXRecordDecl>(DC)->decls())

4640 if

(

auto

*ChildND = dyn_cast<NamedDecl>(ChildD)) {

4641 auto

Name = ChildND->getDeclName();

4642 switch

(Name.getNameKind()) {

4647 if

(ConstructorNameSet.erase(Name))

4648

Names.push_back(Name);

4652 if

(ConversionNameSet.erase(Name))

4653

Names.push_back(Name);

4657 if

(ConstructorNameSet.empty() && ConversionNameSet.empty())

4661

assert(ConstructorNameSet.empty() &&

"Failed to find all of the visible " 4662 "constructors by walking all the " 4663 "lexical members of the context."

);

4664

assert(ConversionNameSet.empty() &&

"Failed to find all of the visible " 4665 "conversion functions by walking all " 4666 "the lexical members of the context."

);

4673 for

(

auto

&Name : Names)

4685 for

(

auto

&Name : Names) {

4688 switch

(Name.getNameKind()) {

4694

ConstructorDecls.append(

Result

.begin(),

Result

.end());

4698

ConversionDecls.append(

Result

.begin(),

Result

.end());

4706 if

(!ConstructorDecls.empty())

4707 Generator

.insert(ConstructorDecls.front()->getDeclName(),

4708

Trait.getData(ConstructorDecls), Trait);

4709 if

(!ConversionDecls.empty())

4710 Generator

.insert(ConversionDecls.front()->getDeclName(),

4711

Trait.getData(ConversionDecls), Trait);

4716 Generator

.emit(LookupTable, Trait, Lookups ? &Lookups->Table :

nullptr

);

4718 const auto

&ModuleLocalDecls = Trait.getModuleLocalDecls();

4719 if

(!ModuleLocalDecls.empty()) {

4721

ModuleLevelNameLookupTrait>

4722

ModuleLocalLookupGenerator;

4723

ModuleLevelNameLookupTrait ModuleLocalTrait(*

this

);

4725 for

(

const auto

&ModuleLocalIter : ModuleLocalDecls) {

4726 const auto

&Key = ModuleLocalIter.first;

4727 const auto

&IDs = ModuleLocalIter.second;

4728

ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),

4732 auto

*ModuleLocalLookups =

4734

ModuleLocalLookupGenerator.emit(

4735

ModuleLocalLookupTable, ModuleLocalTrait,

4736

ModuleLocalLookups ? &ModuleLocalLookups->Table :

nullptr

);

4739 const auto

&TULocalDecls = Trait.getTULocalDecls();

4743

ASTDeclContextNameLookupTrait<

false

>>

4745

ASTDeclContextNameLookupTrait<

false

> TULocalTrait(

4748 for

(

const auto

&TULocalIter : TULocalDecls) {

4749 const auto

&Key = TULocalIter.first;

4750 const auto

&IDs = TULocalIter.second;

4751

TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);

4755

TULookupGenerator.emit(TULookupTable, TULocalTrait,

4756

TULocalLookups ? &TULocalLookups->Table :

nullptr

);

4765void

ASTWriter::WriteDeclContextVisibleBlock(

ASTContext

&Context,

4767

uint64_t &VisibleBlockOffset,

4768

uint64_t &ModuleLocalBlockOffset,

4769

uint64_t &TULocalBlockOffset) {

4770

assert(VisibleBlockOffset == 0);

4771

assert(ModuleLocalBlockOffset == 0);

4772

assert(TULocalBlockOffset == 0);

4777 if

(isa<NamespaceDecl>(DC) && Chain &&

4780 for

(

auto

*Prev = cast<NamespaceDecl>(DC)->getPreviousDecl(); Prev;

4781

Prev = Prev->getPreviousDecl())

4782 if

(!Prev->isFromASTFile())

4795

LookupResults.reserve(Map->size());

4796 for

(

auto

&Entry : *Map)

4797

LookupResults.push_back(

4798

std::make_pair(Entry.first, Entry.second.getLookupResult()));

4801

llvm::sort(LookupResults, llvm::less_first());

4802 for

(

auto

&NameAndResult : LookupResults) {

4810

assert(

Result

.empty() &&

"Cannot have a constructor or conversion " 4811 "function name in a namespace!"

);

4853 if

(!Map || Map->empty())

4856

VisibleBlockOffset = Stream.GetCurrentBitNo();

4861

GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,

4866

Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,

Record

,

4868

++NumVisibleDeclContexts;

4870 if

(!ModuleLocalLookupTable.empty()) {

4871

ModuleLocalBlockOffset = Stream.GetCurrentBitNo();

4872

assert(ModuleLocalBlockOffset > VisibleBlockOffset);

4874

RecordData::value_type ModuleLocalRecord[] = {

4876

Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,

4877

ModuleLocalRecord, ModuleLocalLookupTable);

4878

++NumModuleLocalDeclContexts;

4881 if

(!TULookupTable.empty()) {

4882

TULocalBlockOffset = Stream.GetCurrentBitNo();

4884

RecordData::value_type TULocalDeclsRecord[] = {

4886

Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,

4888

++NumTULocalDeclContexts;

4898void

ASTWriter::WriteDeclContextVisibleUpdate(

ASTContext

&Context,

4901 if

(!Map || Map->empty())

4908

GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,

4913 if

(isa<NamespaceDecl>(DC))

4919

Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,

Record

, LookupTable);

4921 if

(!ModuleLocalLookupTable.empty()) {

4923

RecordData::value_type ModuleLocalRecord[] = {

4925

Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,

4926

ModuleLocalLookupTable);

4929 if

(!TULookupTable.empty()) {

4930

RecordData::value_type GMFRecord[] = {

4932

Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,

4944void

ASTWriter::WriteOpenCLExtensions(

Sema

&SemaRef) {

4950 for

(

const auto

&I:Opts.OptMap) {

4952 auto V

= I.getValue();

4953 Record

.push_back(

V

.Supported ? 1 : 0);

4954 Record

.push_back(

V

.Enabled ? 1 : 0);

4955 Record

.push_back(

V

.WithPragma ? 1 : 0);

4962void

ASTWriter::WriteCUDAPragmas(

Sema

&SemaRef) {

4963 if

(SemaRef.

CUDA

().ForceHostDeviceDepth > 0) {

4964

RecordData::value_type

Record

[] = {SemaRef.

CUDA

().ForceHostDeviceDepth};

4969void

ASTWriter::WriteObjCCategories() {

4973 for

(

unsigned

I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {

4975 unsigned

StartIndex = Categories.size();

4980

Categories.push_back(0);

4984

Cat =

Class

->known_categories_begin(),

4985

CatEnd =

Class

->known_categories_end();

4986

Cat != CatEnd; ++Cat, ++Size) {

4992

Categories[StartIndex] =

Size

;

4996

CategoriesMap.push_back(CatInfo);

5001

llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());

5004 using namespace llvm

;

5006 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

5008

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));

5009

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

5010 unsigned

AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));

5013

Stream.EmitRecordWithBlob(AbbrevID,

Record

,

5014 reinterpret_cast<char

*

>

(CategoriesMap.data()),

5021void

ASTWriter::WriteLateParsedTemplates(

Sema

&SemaRef) {

5028 for

(

auto

&LPTMapEntry : LPTMap) {

5036 for

(

const auto

&Tok : LPT.

Toks

) {

5044void

ASTWriter::WriteOptimizePragmaOptions(

Sema

&SemaRef) {

5052void

ASTWriter::WriteMSStructPragmaOptions(

Sema

&SemaRef) {

5060void

ASTWriter::WriteMSPointersToMembersPragmaOptions(

Sema

&SemaRef) {

5068void

ASTWriter::WritePackPragmaOptions(

Sema

&SemaRef) {

5088void

ASTWriter::WriteFloatControlPragmaOptions(

Sema

&SemaRef) {

5098 for

(

const auto

&StackEntry : SemaRef.

FpPragmaStack

.Stack) {

5099 Record

.push_back(StackEntry.Value.getAsOpaqueInt());

5108void

ASTWriter::WriteDeclsWithEffectsToVerify(

Sema

&SemaRef) {

5118void

ASTWriter::WriteModuleFileExtension(

Sema

&SemaRef,

5124 auto

Abv = std::make_shared<llvm::BitCodeAbbrev>();

5126

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

5127

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

5128

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

5129

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

5130

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

5131 unsigned

Abbrev = Stream.EmitAbbrev(std::move(Abv));

5137 Record

.push_back(Metadata.MajorVersion);

5138 Record

.push_back(Metadata.MinorVersion);

5139 Record

.push_back(Metadata.BlockName.size());

5140 Record

.push_back(Metadata.UserInfo.size());

5142

Buffer += Metadata.BlockName;

5143

Buffer += Metadata.UserInfo;

5144

Stream.EmitRecordWithBlob(Abbrev,

Record

, Buffer);

5162 if

(!A || (isa<PreferredNameAttr>(A) &&

5163

Writer->isWritingStdCXXNamedModules()))

5164 return Record

.push_back(0);

5174 Record

.push_back(A->getAttributeSpellingListIndexRaw());

5177#include "clang/Serialization/AttrPCHWrite.inc" 5183 for

(

const auto

*A : Attrs)

5197 case

tok::annot_pragma_loop_hint: {

5201 Record

.push_back(Info->Toks.size());

5202 for

(

const auto

&

T

: Info->Toks)

5206 case

tok::annot_pragma_pack: {

5209 Record

.push_back(

static_cast<unsigned>

(Info->Action));

5215 case

tok::annot_pragma_openmp:

5216 case

tok::annot_pragma_openmp_end:

5217 case

tok::annot_pragma_unused:

5218 case

tok::annot_pragma_openacc:

5219 case

tok::annot_pragma_openacc_end:

5220 case

tok::annot_repl_input_end:

5223

llvm_unreachable(

"missing serialization code for annotation token"

);

5234 Record

.push_back(Str.size());

5235 Record

.insert(

Record

.end(), Str.begin(), Str.end());

5240 Record

.push_back(Str.size());

5241

Blob.insert(Blob.end(), Str.begin(), Str.end());

5245

assert(WritingAST &&

"can't prepare path for output when not writing AST"

);

5248

StringRef PathStr(

Path

.data(),

Path

.size());

5249 if

(PathStr ==

"<built-in>"

|| PathStr ==

"<command line>"

)

5255 const char

*PathBegin =

Path

.data();

5256 const char

*PathPtr =

5258 if

(PathPtr != PathBegin) {

5259 Path

.erase(

Path

.begin(),

Path

.begin() + (PathPtr - PathBegin));

5283

Stream.EmitRecordWithBlob(Abbrev,

Record

, FilePath);

5288 Record

.push_back(Version.getMajor());

5289 if

(std::optional<unsigned> Minor = Version.getMinor())

5290 Record

.push_back(*Minor + 1);

5293 if

(std::optional<unsigned> Subminor = Version.getSubminor())

5294 Record

.push_back(*Subminor + 1);

5312

assert(ID < IdentifierOffsets.size());

5313

IdentifierOffsets[ID] = Offset;

5319 unsigned

ID = SelectorIDs[Sel];

5320

assert(ID &&

"Unknown selector"

);

5323 if

(ID < FirstSelectorID)

5325

SelectorOffsets[ID - FirstSelectorID] = Offset;

5331 ArrayRef

<std::shared_ptr<ModuleFileExtension>> Extensions,

5332 bool

IncludeTimestamps,

bool

BuildingImplicitModule,

5333 bool

GeneratingReducedBMI)

5334

: Stream(Stream), Buffer(Buffer), ModuleCache(ModuleCache),

5335

IncludeTimestamps(IncludeTimestamps),

5336

BuildingImplicitModule(BuildingImplicitModule),

5337

GeneratingReducedBMI(GeneratingReducedBMI) {

5338 for

(

const auto

&Ext : Extensions) {

5339 if

(

auto

Writer = Ext->createExtensionWriter(*

this

))

5340

ModuleFileExtensionWriters.push_back(std::move(Writer));

5347

assert(WritingAST &&

"can't determine lang opts when not writing AST"

);

5352 return

IncludeTimestamps ?

E

->getModificationTime() : 0;

5357

StringRef OutputFile,

Module

*WritingModule,

5358

StringRef isysroot,

bool

ShouldCacheASTInMemory) {

5359

llvm::TimeTraceScope scope(

"WriteAST"

, OutputFile);

5362 Sema

*SemaPtr = dyn_cast<Sema *>(Subject);

5364

SemaPtr ? SemaPtr->

getPreprocessor

() : *cast<Preprocessor *>(Subject);

5369

Stream.Emit((

unsigned

)

'C'

, 8);

5370

Stream.Emit((

unsigned

)

'P'

, 8);

5371

Stream.Emit((

unsigned

)

'C'

, 8);

5372

Stream.Emit((

unsigned

)

'H'

, 8);

5374

WriteBlockInfoBlock();

5377

this->WritingModule = WritingModule;

5378 ASTFileSignature

Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);

5380

this->WritingModule =

nullptr

;

5381

this->BaseDirectory.clear();

5383

WritingAST =

false

;

5390 if

(ShouldCacheASTInMemory) {

5393

llvm::MemoryBuffer::getMemBufferCopy(

5394

StringRef(Buffer.begin(), Buffer.size())));

5399template

<

typename

Vector>

5401 for

(

typename

Vector::iterator I = Vec.begin(

nullptr

,

true

),

E

= Vec.end();

5407template

<

typename

Vector>

5410 for

(

typename

Vector::iterator I = Vec.begin(

nullptr

,

true

),

E

= Vec.end();

5416void

ASTWriter::computeNonAffectingInputFiles() {

5420

IsSLocAffecting.resize(N,

true

);

5421

IsSLocFileEntryAffecting.resize(N,

true

);

5426 auto

AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);

5428 unsigned

FileIDAdjustment = 0;

5429 unsigned

OffsetAdjustment = 0;

5431

NonAffectingFileIDAdjustments.reserve(N);

5432

NonAffectingOffsetAdjustments.reserve(N);

5434

NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);

5435

NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);

5437 for

(

unsigned

I = 1; I != N; ++I) {

5439 FileID

FID = FileID::get(I);

5446 if

(!

Cache

->OrigEntry)

5454 if

(!AffectingModuleMaps)

5458 if

(AffectingModuleMaps->DefinitionFileIDs.contains(FID))

5461

IsSLocAffecting[I] =

false

;

5462

IsSLocFileEntryAffecting[I] =

5463

AffectingModuleMaps->DefinitionFiles.contains(*

Cache

->OrigEntry);

5465

FileIDAdjustment += 1;

5471 if

(!NonAffectingFileIDs.empty() &&

5472

NonAffectingFileIDs.back().ID == FID.ID - 1) {

5473

NonAffectingFileIDs.back() = FID;

5475

NonAffectingFileIDAdjustments.back() = FileIDAdjustment;

5476

NonAffectingOffsetAdjustments.back() = OffsetAdjustment;

5480

NonAffectingFileIDs.push_back(FID);

5483

NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);

5484

NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);

5493 for

(StringRef

Path

:

5496 for

(

unsigned

I = 1; I != N; ++I) {

5497 if

(IsSLocAffecting[I]) {

5503 if

(!

Cache

->OrigEntry)

5506 Cache

->OrigEntry->getNameAsRequested());

5512void

ASTWriter::PrepareWritingSpecialDecls(

Sema

&SemaRef) {

5515 bool

isModule = WritingModule !=

nullptr

;

5522

PredefinedDecls.insert(

D

);

5530

RegisterPredefDecl(Context.ObjCProtocolClassDecl,

5534

RegisterPredefDecl(Context.ObjCInstanceTypeDecl,

5538

RegisterPredefDecl(Context.BuiltinMSVaListDecl,

5543

RegisterPredefDecl(Context.MakeIntegerSeqDecl,

5545

RegisterPredefDecl(Context.CFConstantStringTypeDecl,

5547

RegisterPredefDecl(Context.CFConstantStringTagDecl,

5549

RegisterPredefDecl(Context.TypePackElementDecl,

5563 if

(GeneratingReducedBMI) {

5589 if

(GeneratingReducedBMI)

5612 for

(

unsigned

I = 0, N = SemaRef.

VTableUses

.size(); I != N; ++I)

5623 "There are local ones at end of translation unit!"

);

5636 for

(

const auto

&I : SemaRef.KnownNamespaces)

5643 for

(

const auto

&I : Undefined)

5649 for

(

const auto

&DeleteExprsInfo :

5656 for

(

const auto

*I : DeclsToEmitEvenIfUnreferenced)

5658

DeclsToEmitEvenIfUnreferenced.clear();

5670

llvm::sort(IIs, llvm::deref<std::less<>>());

5677 for

(

auto

*

D

: SemaRef.DeclsToCheckForDeferredDiags)

5685

PendingEmittingVTables.clear();

5688void

ASTWriter::WriteSpecialDeclRecords(

Sema

&SemaRef) {

5691 bool

isModule = WritingModule !=

nullptr

;

5694 if

(!EagerlyDeserializedDecls.empty())

5697 if

(!ModularCodegenDecls.empty())

5703

TentativeDefinitions);

5704 if

(!TentativeDefinitions.empty())

5711

UnusedFileScopedDecls);

5712 if

(!UnusedFileScopedDecls.empty())

5718 if

(!ExtVectorDecls.empty())

5724 for

(

unsigned

I = 0, N = SemaRef.

VTableUses

.size(); I != N; ++I) {

5740 if

(!UnusedLocalTypedefNameCandidates.empty())

5742

UnusedLocalTypedefNameCandidates);

5753 if

(!PendingInstantiations.empty())

5759 auto

AddEmittedDeclRefOrZero = [

this

, &SemaDeclRefs](

Decl

*

D

) {

5761

SemaDeclRefs.push_back(0);

5770 if

(!SemaDeclRefs.empty())

5775 for

(

auto

*

D

: SemaRef.DeclsToCheckForDeferredDiags)

5778 if

(!DeclsToCheckForDeferredDiags.empty())

5780

DeclsToCheckForDeferredDiags);

5786 AddDeclRef

(CudaCallDecl, CUDASpecialDeclRefs);

5794

DelegatingCtorDecls);

5795 if

(!DelegatingCtorDecls.empty())

5800 for

(

const auto

&I : SemaRef.KnownNamespaces) {

5804 if

(!KnownNamespaces.empty())

5811 for

(

const auto

&I : Undefined) {

5818 if

(!UndefinedButUsed.empty())

5825 for

(

const auto

&DeleteExprsInfo :

5830 AddDeclRef

(DeleteExprsInfo.first, DeleteExprsToAnalyze);

5831

DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());

5832 for

(

const auto

&DeleteLoc : DeleteExprsInfo.second) {

5834

DeleteExprsToAnalyze.push_back(DeleteLoc.second);

5838 if

(!DeleteExprsToAnalyze.empty())

5849 if

(!VTablesToEmit.empty())

5855 using namespace llvm

;

5857 bool

isModule = WritingModule !=

nullptr

;

5865

computeNonAffectingInputFiles();

5867

writeUnhashedControlBlock(*PP);

5880

IdentifierIDs.clear();

5893 if

(IsInterestingNonMacroIdentifier(

ID

.second, *

this

))

5894

IIs.push_back(

ID

.second);

5897

llvm::sort(IIs, llvm::deref<std::less<>>());

5906 for

(

const auto

&WeakUndeclaredIdentifierList :

5908 const IdentifierInfo

*

const

II = WeakUndeclaredIdentifierList.first;

5909 for

(

const auto

&WI : WeakUndeclaredIdentifierList.second) {

5925 AddTypeRef

(Context, Context.ObjCIdRedefinitionType, SpecialTypes);

5926 AddTypeRef

(Context, Context.ObjCClassRedefinitionType, SpecialTypes);

5927 AddTypeRef

(Context, Context.ObjCSelRedefinitionType, SpecialTypes);

5932

PrepareWritingSpecialDecls(*SemaPtr);

5935

WriteControlBlock(*PP, isysroot);

5938

Stream.FlushToWord();

5939

ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;

5941

ASTBlockStartOffset = Stream.GetCurrentBitNo();

5959 for

(

auto

&SelectorAndID : SelectorIDs)

5960

AllSelectors.push_back(SelectorAndID.first);

5961 for

(

auto

&

Selector

: AllSelectors)

5985 auto

Abbrev = std::make_shared<BitCodeAbbrev>();

5987

Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));

5988 unsigned

ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));

5991

llvm::raw_svector_ostream Out(Buffer);

5993 using namespace

llvm::support;

5995

endian::Writer

LE

(Out, llvm::endianness::little);

5996 LE

.write<uint8_t>(

static_cast<

uint8_t

>

(M.

Kind

));

5998 LE

.write<uint16_t>(Name.size());

5999

Out.write(Name.data(), Name.size());

6005 auto

writeBaseIDOrNone = [&](

auto

BaseID,

bool

ShouldWrite) {

6006

assert(BaseID < std::numeric_limits<uint32_t>::max() &&

"base id too high"

);

6023

Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,

Record

,

6024

Buffer.data(), Buffer.size());

6028

WriteDeclAndTypes(SemaPtr->

Context

);

6030

WriteFileDeclIDsMap();

6033

WriteComments(SemaPtr->

Context

);

6034

WritePreprocessor(*PP, isModule);

6037

WriteSelectors(*SemaPtr);

6038

WriteReferencedSelectorsPool(*SemaPtr);

6039

WriteLateParsedTemplates(*SemaPtr);

6041

WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->

IdResolver

:

nullptr

, isModule);

6044

WriteOpenCLExtensions(*SemaPtr);

6045

WriteCUDAPragmas(*SemaPtr);

6050

WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->

Context

:

nullptr

);

6055

WriteSpecialDeclRecords(*SemaPtr);

6058 if

(!WeakUndeclaredIdentifiers.empty())

6060

WeakUndeclaredIdentifiers);

6062 if

(!WritingModule) {

6067

ModuleInfo(uint64_t

ID

,

Module

*M) :

ID

(

ID

), M(M) {}

6072

assert(SubmoduleIDs.contains(I->getImportedModule()));

6073

Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],

6074

I->getImportedModule()));

6078 if

(!Imports.empty()) {

6079 auto

Cmp = [](

const

ModuleInfo &A,

const

ModuleInfo &B) {

6082 auto Eq

= [](

const

ModuleInfo &A,

const

ModuleInfo &B) {

6083 return

A.ID == B.ID;

6087

llvm::sort(Imports, Cmp);

6088

Imports.erase(std::unique(Imports.begin(), Imports.end(),

Eq

),

6092 for

(

const auto

&Import : Imports) {

6093

ImportedModules.push_back(

Import

.ID);

6104

WriteObjCCategories();

6106 if

(!WritingModule) {

6107

WriteOptimizePragmaOptions(*SemaPtr);

6108

WriteMSStructPragmaOptions(*SemaPtr);

6109

WriteMSPointersToMembersPragmaOptions(*SemaPtr);

6111

WritePackPragmaOptions(*SemaPtr);

6112

WriteFloatControlPragmaOptions(*SemaPtr);

6113

WriteDeclsWithEffectsToVerify(*SemaPtr);

6117

RecordData::value_type

Record

[] = {NumStatements,

6119

NumLexicalDeclContexts,

6120

NumVisibleDeclContexts,

6121

NumModuleLocalDeclContexts,

6122

NumTULocalDeclContexts};

6125

Stream.FlushToWord();

6126

ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;

6130 for

(

const auto

&ExtWriter : ModuleFileExtensionWriters)

6131

WriteModuleFileExtension(*SemaPtr, *ExtWriter);

6133 return

backpatchSignature();

6136void

ASTWriter::EnteringModulePurview() {

6139 if

(GeneratingReducedBMI)

6140

DeclUpdatesFromGMF.swap(DeclUpdates);

6146void

ASTWriter::AddedManglingNumber(

const Decl

*

D

,

unsigned

Number) {

6152void

ASTWriter::AddedStaticLocalNumbers(

const Decl

*

D

,

unsigned

Number) {

6171void

ASTWriter::WriteDeclAndTypes(

ASTContext

&Context) {

6176

DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();

6180

WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);

6181 while

(!DeclTypesToEmit.empty()) {

6182

DeclOrType DOT = DeclTypesToEmit.front();

6183

DeclTypesToEmit.pop();

6185

WriteType(Context, DOT.getType());

6187

WriteDecl(Context, DOT.getDecl());

6189

}

while

(!DeclUpdates.empty());

6191

DoneWritingDeclsAndTypes =

true

;

6195

assert(DelayedNamespace.empty() || GeneratingReducedBMI);

6198 uint64_t

LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);

6202

WriteDeclContextVisibleBlock(Context, NS, VisibleOffset, ModuleLocalOffset,

6207

LexicalOffset -= DeclTypesBlockStartOffset;

6210

VisibleOffset -= DeclTypesBlockStartOffset;

6212 if

(ModuleLocalOffset)

6213

ModuleLocalOffset -= DeclTypesBlockStartOffset;

6216

TULocalOffset -= DeclTypesBlockStartOffset;

6219

DelayedNamespaceRecord.push_back(LexicalOffset);

6220

DelayedNamespaceRecord.push_back(VisibleOffset);

6221

DelayedNamespaceRecord.push_back(ModuleLocalOffset);

6222

DelayedNamespaceRecord.push_back(TULocalOffset);

6227

assert(DeclTypesToEmit.empty());

6228

assert(DeclUpdates.empty());

6233

WriteTypeDeclOffsets();

6234 if

(!DeclUpdatesOffsetsRecord.empty())

6237 if

(!DelayedNamespaceRecord.empty())

6239

DelayedNamespaceRecord);

6241 if

(!RelatedDeclsMap.empty()) {

6245 for

(

const auto

&Pair : RelatedDeclsMap) {

6246

RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());

6247

RelatedDeclsMapRecord.push_back(Pair.second.size());

6248 for

(

const auto

&Lambda : Pair.second)

6249

RelatedDeclsMapRecord.push_back(Lambda.getRawValue());

6252 auto

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6254

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));

6255

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

6256 unsigned

FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));

6258

FunctionToLambdaMapAbbrev);

6261 if

(!SpecializationsUpdates.empty()) {

6262

WriteSpecializationsUpdates(

false

);

6263

SpecializationsUpdates.clear();

6266 if

(!PartialSpecializationsUpdates.empty()) {

6267

WriteSpecializationsUpdates(

true

);

6268

PartialSpecializationsUpdates.clear();

6283

NewGlobalKindDeclPairs.push_back(

D

->

getKind

());

6284

NewGlobalKindDeclPairs.push_back(

GetDeclRef

(

D

).getRawValue());

6287 auto

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6289

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

6290 unsigned

TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));

6293

Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,

Record

,

6294 bytes

(NewGlobalKindDeclPairs));

6296

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6298

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

6299

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

6300

UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));

6302

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6304

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

6305

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

6306

ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));

6308

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6310

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

6311

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

6312

TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));

6315

WriteDeclContextVisibleUpdate(Context, TU);

6318 if

(Context.ExternCContext)

6319

WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);

6322 for

(

auto

*DC : UpdatedDeclContexts)

6323

WriteDeclContextVisibleUpdate(Context, DC);

6326void

ASTWriter::WriteSpecializationsUpdates(

bool

IsPartial) {

6330 auto

Abv = std::make_shared<llvm::BitCodeAbbrev>();

6331

Abv->Add(llvm::BitCodeAbbrevOp(

RecordType

));

6332

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));

6333

Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));

6334 auto

UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));

6337

IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;

6338 for

(

auto

&SpecializationUpdate : SpecUpdates) {

6339 const NamedDecl

*

D

= SpecializationUpdate.first;

6342

GenerateSpecializationInfoLookupTable(

D

, SpecializationUpdate.second,

6343

LookupTable, IsPartial);

6346

RecordData::value_type

Record

[] = {

6347 static_cast<

RecordData::value_type

>

(

RecordType

),

6349

Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,

Record

, LookupTable);

6353void

ASTWriter::WriteDeclUpdatesBlocks(

ASTContext

&Context,

6354

RecordDataImpl &OffsetsRecord) {

6355 if

(DeclUpdates.empty())

6358

DeclUpdateMap LocalUpdates;

6359

LocalUpdates.swap(DeclUpdates);

6361 for

(

auto

&DeclUpdate : LocalUpdates) {

6362 const Decl

*

D

= DeclUpdate.first;

6364 bool

HasUpdatedBody =

false

;

6365 bool

HasAddedVarDefinition =

false

;

6368 for

(

auto

&

Update

: DeclUpdate.second) {

6374

HasUpdatedBody =

true

;

6376

HasAddedVarDefinition =

true

;

6383

assert(

Update

.getDecl() &&

"no decl to add?"

);

6397

cast<ParmVarDecl>(

Update

.getDecl())->getDefaultArg());

6402

cast<FieldDecl>(

Update

.getDecl())->getInClassInitializer());

6406 auto

*RD = cast<CXXRecordDecl>(

D

);

6407

UpdatedDeclContexts.insert(RD->getPrimaryContext());

6408 Record

.push_back(RD->isParamDestroyedInCallee());

6409 Record

.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));

6410 Record

.AddCXXDefinitionData(RD);

6411 Record

.AddOffset(WriteDeclContextLexicalBlock(Context, RD));

6416 if

(

auto

*MSInfo = RD->getMemberSpecializationInfo()) {

6417 Record

.push_back(MSInfo->getTemplateSpecializationKind());

6418 Record

.AddSourceLocation(MSInfo->getPointOfInstantiation());

6420 auto

*Spec = cast<ClassTemplateSpecializationDecl>(RD);

6421 Record

.push_back(Spec->getTemplateSpecializationKind());

6422 Record

.AddSourceLocation(Spec->getPointOfInstantiation());

6426 auto

From = Spec->getInstantiatedFrom();

6427 if

(

auto

PartialSpec =

6429 Record

.push_back(

true

);

6430 Record

.AddDeclRef(PartialSpec);

6431 Record

.AddTemplateArgumentList(

6432

&Spec->getTemplateInstantiationArgs());

6434 Record

.push_back(

false

);

6437 Record

.push_back(llvm::to_underlying(RD->getTagKind()));

6438 Record

.AddSourceLocation(RD->getLocation());

6439 Record

.AddSourceLocation(RD->getBeginLoc());

6440 Record

.AddSourceRange(RD->getBraceRange());

6453 Record

.AddStmt(cast<CXXDestructorDecl>(

D

)->getOperatorDeleteThisArg());

6459 Record

.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());

6477 D

->

getAttr

<OMPThreadPrivateDeclAttr>()->getRange());

6481 auto

*A =

D

->

getAttr

<OMPAllocateDeclAttr>();

6482 Record

.push_back(A->getAllocatorType());

6483 Record

.AddStmt(A->getAllocator());

6484 Record

.AddStmt(A->getAlignment());

6485 Record

.AddSourceRange(A->getRange());

6490 Record

.push_back(

D

->

getAttr

<OMPDeclareTargetDeclAttr>()->getMapType());

6492 D

->

getAttr

<OMPDeclareTargetDeclAttr>()->getRange());

6496 Record

.push_back(getSubmoduleID(

Update

.getModule()));

6508 if

(HasUpdatedBody) {

6509 const auto

*Def = cast<FunctionDecl>(

D

);

6511 Record

.push_back(Def->isInlined());

6512 Record

.AddSourceLocation(Def->getInnerLocStart());

6513 Record

.AddFunctionDefinition(Def);

6514

}

else if

(HasAddedVarDefinition) {

6515 const auto

*VD = cast<VarDecl>(

D

);

6517 Record

.push_back(VD->isInline());

6518 Record

.push_back(VD->isInlineSpecified());

6519 Record

.AddVarDeclInit(VD);

6534FileID

ASTWriter::getAdjustedFileID(

FileID

FID)

const

{

6536

NonAffectingFileIDs.empty())

6538 auto

It = llvm::lower_bound(NonAffectingFileIDs, FID);

6539 unsigned

Idx = std::distance(NonAffectingFileIDs.begin(), It);

6540 unsigned

Offset = NonAffectingFileIDAdjustments[Idx];

6541 return

FileID::get(FID.getOpaqueValue() - Offset);

6544unsigned

ASTWriter::getAdjustedNumCreatedFIDs(

FileID

FID)

const

{

6550 unsigned

AdjustedNumCreatedFIDs = 0;

6551 for

(

unsigned

I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)

6552 if

(IsSLocAffecting[I])

6553

++AdjustedNumCreatedFIDs;

6554 return

AdjustedNumCreatedFIDs;

6570 return

Offset - getAdjustment(Offset);

6575 if

(NonAffectingRanges.empty())

6581 if

(Offset > NonAffectingRanges.back().getEnd().getOffset())

6582 return

NonAffectingOffsetAdjustments.back();

6584 if

(Offset < NonAffectingRanges.front().getBegin().getOffset())

6591 auto

It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);

6592 unsigned

Idx = std::distance(NonAffectingRanges.begin(), It);

6593 return

NonAffectingOffsetAdjustments[Idx];

6597 Record

.push_back(getAdjustedFileID(FID).getOpaqueValue());

6602 unsigned

BaseOffset = 0;

6603 unsigned

ModuleFileIndex = 0;

6608 auto

SLocMapI =

getChain

()->GlobalSLocOffsetMap.

find

(

6609

SourceManager::MaxLoadedOffset -

Loc

.getOffset() - 1);

6610

assert(SLocMapI !=

getChain

()->GlobalSLocOffsetMap.end() &&

6611 "Corrupted global sloc offset map"

);

6616

ModuleFileIndex = F->

Index

+ 1;

6625 Loc

= getAdjustedLocation(

Loc

);

6663

MacroInfoToEmitData Info = { Name, MI, ID };

6664

MacroInfosToEmit.push_back(Info);

6673

assert(MacroIDs.contains(MI) &&

"Macro not emitted!"

);

6674 return

MacroIDs[MI];

6678 return

IdentMacroDirectivesOffsetMap.lookup(Name);

6682 Record

->push_back(Writer->getSelectorRef(SelRef));

6691 if

(SID == 0 && Chain) {

6695

SID = SelectorIDs[Sel];

6698

SID = NextSelectorID++;

6699

SelectorIDs[Sel] = SID;

6741 bool

InfoHasSameExpr

6743 Record

->push_back(InfoHasSameExpr);

6744 if

(InfoHasSameExpr)

6762

TypeLocWriter TLW(*

this

,

Seq

);

6772template

<

typename

IdxForTypeTy>

6774

IdxForTypeTy IdxForType) {

6778 unsigned

FastQuals =

T

.getLocalFastQualifiers();

6779 T

.removeLocalFastQualifiers();

6781 if

(

T

.hasLocalNonFastQualifiers())

6782 return

IdxForType(

T

).asTypeID(FastQuals);

6784

assert(!

T

.hasLocalQualifiers());

6786 if

(

const BuiltinType

*BT = dyn_cast<BuiltinType>(

T

.getTypePtr()))

6794 return

IdxForType(

T

).asTypeID(FastQuals);

6801

assert(!

T

.getLocalFastQualifiers());

6805 if

(DoneWritingDeclsAndTypes) {

6806

assert(0 &&

"New type seen after serializing all the types to emit!"

);

6812

Idx =

TypeIdx

(0, NextTypeID++);

6813

DeclTypesToEmit.push(

T

);

6831

assert(WritingAST &&

"Cannot request a declaration ID before AST writing"

);

6838 if

(

auto

*

Iter

= DeclUpdatesFromGMF.find(

D

);

6839 Iter

!= DeclUpdatesFromGMF.end()) {

6841

DeclUpdates[

D

].push_back(

Update

);

6842

DeclUpdatesFromGMF.erase(

Iter

);

6854

assert(!(

reinterpret_cast<uintptr_t>

(

D

) & 0x01) &&

"Invalid decl pointer"

);

6856 if

(ID.isInvalid()) {

6857 if

(DoneWritingDeclsAndTypes) {

6858

assert(0 &&

"New decl seen after serializing all the decls to emit!"

);

6865

DeclTypesToEmit.push(

const_cast<Decl

*

>

(

D

));

6880

assert(DeclIDs.contains(

D

) &&

"Declaration not emitted!"

);

6881 return

DeclIDs[

D

];

6887

assert(DoneWritingDeclsAndTypes &&

6888 "wasDeclEmitted should only be called after writing declarations"

);

6893 bool

Emitted = DeclIDs.contains(

D

);

6895

GeneratingReducedBMI) &&

6896 "The declaration within modules can only be omitted in reduced BMI."

);

6901

assert(ID.isValid());

6915 if

(isa<ParmVarDecl, TemplateTemplateParmDecl>(

D

))

6920

assert(

SM

.isLocalSourceLocation(FileLoc));

6923

std::tie(FID, Offset) =

SM

.getDecomposedLoc(FileLoc);

6926

assert(

SM

.getSLocEntry(FID).isFile());

6927

assert(IsSLocAffecting[FID.ID]);

6929

std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];

6931

Info = std::make_unique<DeclIDInFileInfo>();

6933

std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);

6934

LocDeclIDsTy &Decls = Info->DeclIDs;

6935

Decls.push_back(LocDecl);

6940 "expected an anonymous declaration"

);

6944 auto

It = AnonymousDeclarationNumbers.find(

D

);

6945 if

(It == AnonymousDeclarationNumbers.end()) {

6948

AnonymousDeclarationNumbers[ND] = Number;

6951

It = AnonymousDeclarationNumbers.find(

D

);

6952

assert(It != AnonymousDeclarationNumbers.end() &&

6953 "declaration not found within its lexical context"

);

6961 switch

(Name.getNameKind()) {

7008

NestedNames.push_back(NNS);

7012 Record

->push_back(NestedNames.size());

7013 while

(!NestedNames.empty()) {

7014

NNS = NestedNames.pop_back_val();

7017 Record

->push_back(Kind);

7056

assert(TemplateParams &&

"No TemplateParams!"

);

7061 Record

->push_back(TemplateParams->

size

());

7062 for

(

const auto

&

P

: *TemplateParams)

7065 Record

->push_back(

true

);

7068 Record

->push_back(

false

);

7075

assert(TemplateArgs &&

"No TemplateArgs!"

);

7077 for

(

int

i = 0, e = TemplateArgs->

size

(); i != e; ++i)

7083

assert(ASTTemplArgList &&

"No ASTTemplArgList!"

);

7095

I =

Set

.begin(),

E

=

Set

.end(); I !=

E

; ++I) {

7097 Record

->push_back(I.getAccess());

7105 Record

->push_back(

Base

.getAccessSpecifierAsWritten());

7106 Record

->push_back(

Base

.getInheritConstructors());

7119 for

(

auto

&

Base

: Bases)

7137 for

(

auto

*

Init

: CtorInits) {

7138 if

(

Init

->isBaseInitializer()) {

7142

}

else if

(

Init

->isDelegatingInitializer()) {

7145

}

else if

(

Init

->isMemberInitializer()){

7158 if

(

Init

->isWritten())

7172 auto

&

Data

=

D

->data();

7178#define FIELD(Name, Width, Merge) \ 7179 if (!DefinitionBits.canWriteNextNBits(Width)) { \ 7180 Record->push_back(DefinitionBits); \ 7181 DefinitionBits.reset(0); \ 7183 DefinitionBits.addBits(Data.Name, Width); 7185#include "clang/AST/CXXRecordDeclDefinitionBits.def" 7188 Record

->push_back(DefinitionBits);

7192 Record

->push_back(

D

->getODRHash());

7194 bool

ModulesCodegen =

7195

!

D

->isDependentType() &&

7196 D

->getTemplateSpecializationKind() !=

7199 Record

->push_back(ModulesCodegen);

7201

Writer->AddDeclRef(

D

, Writer->ModularCodegenDecls);

7206 Record

->push_back(

Data

.ComputedVisibleConversions);

7207 if

(

Data

.ComputedVisibleConversions)

7211 if

(!

Data

.IsLambda) {

7213 if

(

Data

.NumBases > 0)

7218 if

(

Data

.NumVBases > 0)

7223 auto

&Lambda =

D

->getLambdaData();

7226

LambdaBits.

addBits

(Lambda.DependencyKind,

2);

7227

LambdaBits.

addBit

(Lambda.IsGenericLambda);

7228

LambdaBits.

addBits

(Lambda.CaptureDefault,

2);

7229

LambdaBits.

addBits

(Lambda.NumCaptures,

15);

7230

LambdaBits.

addBit

(Lambda.HasKnownInternalLinkage);

7231 Record

->push_back(LambdaBits);

7233 Record

->push_back(Lambda.NumExplicitCaptures);

7234 Record

->push_back(Lambda.ManglingNumber);

7235 Record

->push_back(

D

->getDeviceLambdaManglingNumber());

7239 for

(

unsigned

I = 0, N = Lambda.NumCaptures; I != N; ++I) {

7246 Record

->push_back(CaptureBits);

7248 switch

(

Capture

.getCaptureKind()) {

7256 Capture

.capturesVariable() ?

Capture

.getCapturedVar() :

nullptr

;

7275

Val |= (ES->HasConstantInitialization ? 2 : 0);

7276

Val |= (ES->HasConstantDestruction ? 4 : 0);

7290void

ASTWriter::ReaderInitialized(

ASTReader

*Reader) {

7291

assert(Reader &&

"Cannot remove chain"

);

7292

assert((!Chain || Chain == Reader) &&

"Cannot replace chain"

);

7293

assert(FirstDeclID == NextDeclID &&

7294

FirstTypeID == NextTypeID &&

7295

FirstIdentID == NextIdentID &&

7296

FirstMacroID == NextMacroID &&

7297

FirstSubmoduleID == NextSubmoduleID &&

7298

FirstSelectorID == NextSelectorID &&

7299 "Setting chain after writing has started."

);

7308

NextMacroID = FirstMacroID;

7309

NextSelectorID = FirstSelectorID;

7310

NextSubmoduleID = FirstSubmoduleID;

7320 unsigned

OriginalModuleFileIndex = StoredID >> 32;

7324 if

(OriginalModuleFileIndex == 0 && StoredID)

7335 MacroID

&StoredID = MacroIDs[MI];

7352 TypeIdx

&StoredIdx = TypeIdxs[

T

];

7358 if

(ModuleFileIndex == 0 && StoredIdx.

getValue

())

7370

PredefinedDecls.insert(

D

);

7382

assert(!MacroDefinitions.contains(MD));

7383

MacroDefinitions[MD] =

ID

;

7387

assert(!SubmoduleIDs.contains(Mod));

7388

SubmoduleIDs[Mod] =

ID

;

7391void

ASTWriter::CompletedTagDefinition(

const TagDecl

*

D

) {

7393

assert(

D

->isCompleteDefinition());

7394

assert(!WritingAST &&

"Already writing the AST!"

);

7395 if

(

auto

*RD = dyn_cast<CXXRecordDecl>(

D

)) {

7397 if

(RD->isFromASTFile()) {

7402 "completed a tag from another module but not by instantiation?"

);

7403

DeclUpdates[RD].push_back(

7421 "Should not add lookup results to non-lookup contexts!"

);

7424 if

(isa<TranslationUnitDecl>(DC))

7432

!isa<FunctionTemplateDecl>(

D

))

7442

assert(!WritingAST &&

"Already writing the AST!"

);

7443 if

(UpdatedDeclContexts.insert(DC) && !cast<Decl>(DC)->isFromASTFile()) {

7447

llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->

decls

());

7449

DeclsToEmitEvenIfUnreferenced.push_back(

D

);

7461 if

(!isa<CXXMethodDecl>(

D

))

7466

assert(!WritingAST &&

"Already writing the AST!"

);

7470void

ASTWriter::ResolvedExceptionSpec(

const FunctionDecl

*FD) {

7472

assert(!DoneWritingDeclsAndTypes &&

"Already done writing updates!"

);

7473 if

(!Chain)

return

;

7479

->castAs<FunctionProtoType>()

7480

->getExceptionSpecType()))

7487

assert(!WritingAST &&

"Already writing the AST!"

);

7488 if

(!Chain)

return

;

7490

DeclUpdates[

D

].push_back(

7499

assert(!WritingAST &&

"Already writing the AST!"

);

7500

assert(

Delete

&&

"Not given an operator delete"

);

7501 if

(!Chain)

return

;

7507void

ASTWriter::CompletedImplicitDefinition(

const FunctionDecl

*

D

) {

7509

assert(!WritingAST &&

"Already writing the AST!"

);

7514 if

(!

D

->doesThisDeclarationHaveABody())

7521void

ASTWriter::VariableDefinitionInstantiated(

const VarDecl

*

D

) {

7523

assert(!WritingAST &&

"Already writing the AST!"

);

7530void

ASTWriter::FunctionDefinitionInstantiated(

const FunctionDecl

*

D

) {

7532

assert(!WritingAST &&

"Already writing the AST!"

);

7537 if

(!

D

->doesThisDeclarationHaveABody())

7543void

ASTWriter::InstantiationRequested(

const ValueDecl

*

D

) {

7545

assert(!WritingAST &&

"Already writing the AST!"

);

7552 if

(

auto

*VD = dyn_cast<VarDecl>(

D

))

7553

POI = VD->getPointOfInstantiation();

7555

POI = cast<FunctionDecl>(

D

)->getPointOfInstantiation();

7559void

ASTWriter::DefaultArgumentInstantiated(

const ParmVarDecl

*

D

) {

7561

assert(!WritingAST &&

"Already writing the AST!"

);

7565

DeclUpdates[

D

].push_back(

7569void

ASTWriter::DefaultMemberInitializerInstantiated(

const FieldDecl

*

D

) {

7570

assert(!WritingAST &&

"Already writing the AST!"

);

7574

DeclUpdates[

D

].push_back(

7581

assert(!WritingAST &&

"Already writing the AST!"

);

7585

assert(IFD->

getDefinition

() &&

"Category on a class without a definition?"

);

7586

ObjCClassesWithCategories.insert(

7590void

ASTWriter::DeclarationMarkedUsed(

const Decl

*

D

) {

7592

assert(!WritingAST &&

"Already writing the AST!"

);

7604void

ASTWriter::DeclarationMarkedOpenMPThreadPrivate(

const Decl

*

D

) {

7606

assert(!WritingAST &&

"Already writing the AST!"

);

7613void

ASTWriter::DeclarationMarkedOpenMPAllocate(

const Decl

*

D

,

const Attr

*A) {

7615

assert(!WritingAST &&

"Already writing the AST!"

);

7622void

ASTWriter::DeclarationMarkedOpenMPDeclareTarget(

const Decl

*

D

,

7625

assert(!WritingAST &&

"Already writing the AST!"

);

7629

DeclUpdates[

D

].push_back(

7633void

ASTWriter::RedefinedHiddenDefinition(

const NamedDecl

*

D

,

Module

*M) {

7635

assert(!WritingAST &&

"Already writing the AST!"

);

7640void

ASTWriter::AddedAttributeToRecord(

const Attr

*

Attr

,

7643

assert(!WritingAST &&

"Already writing the AST!"

);

7644 if

(!

Record

->isFromASTFile())

7649void

ASTWriter::AddedCXXTemplateSpecialization(

7651

assert(!WritingAST &&

"Already writing the AST!"

);

7658

DeclsToEmitEvenIfUnreferenced.push_back(

D

);

7661void

ASTWriter::AddedCXXTemplateSpecialization(

7663

assert(!WritingAST &&

"Already writing the AST!"

);

7670

DeclsToEmitEvenIfUnreferenced.push_back(

D

);

7675

assert(!WritingAST &&

"Already writing the AST!"

);

7682

DeclsToEmitEvenIfUnreferenced.push_back(

D

);

7696#define GEN_CLANG_CLAUSE_CLASS 7697#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S); 7698#include "llvm/Frontend/OpenMP/OMP.inc" 7707

OMPClauseWriter(*this).writeClause(

C

);

7710void

OMPClauseWriter::writeClause(

OMPClause

*

C

) {

7711 Record

.push_back(

unsigned

(

C

->getClauseKind()));

7713 Record

.AddSourceLocation(

C

->getBeginLoc());

7714 Record

.AddSourceLocation(

C

->getEndLoc());

7718 Record

.push_back(uint64_t(

C

->getCaptureRegion()));

7719 Record

.AddStmt(

C

->getPreInitStmt());

7723

VisitOMPClauseWithPreInit(

C

);

7724 Record

.AddStmt(

C

->getPostUpdateExpr());

7727void

OMPClauseWriter::VisitOMPIfClause(

OMPIfClause

*

C

) {

7728

VisitOMPClauseWithPreInit(

C

);

7730 Record

.AddSourceLocation(

C

->getNameModifierLoc());

7731 Record

.AddSourceLocation(

C

->getColonLoc());

7732 Record

.AddStmt(

C

->getCondition());

7733 Record

.AddSourceLocation(

C

->getLParenLoc());

7737

VisitOMPClauseWithPreInit(

C

);

7738 Record

.AddStmt(

C

->getCondition());

7739 Record

.AddSourceLocation(

C

->getLParenLoc());

7743

VisitOMPClauseWithPreInit(

C

);

7744 Record

.AddStmt(

C

->getNumThreads());

7745 Record

.AddSourceLocation(

C

->getLParenLoc());

7749 Record

.AddStmt(

C

->getSafelen());

7750 Record

.AddSourceLocation(

C

->getLParenLoc());

7754 Record

.AddStmt(

C

->getSimdlen());

7755 Record

.AddSourceLocation(

C

->getLParenLoc());

7759 Record

.push_back(

C

->getNumSizes());

7760 for

(

Expr

*Size :

C

->getSizesRefs())

7762 Record

.AddSourceLocation(

C

->getLParenLoc());

7766 Record

.push_back(

C

->getNumLoops());

7767 for

(

Expr

*Size :

C

->getArgsRefs())

7769 Record

.AddSourceLocation(

C

->getLParenLoc());

7775 Record

.AddStmt(

C

->getFactor());

7776 Record

.AddSourceLocation(

C

->getLParenLoc());

7780 Record

.AddStmt(

C

->getAllocator());

7781 Record

.AddSourceLocation(

C

->getLParenLoc());

7785 Record

.AddStmt(

C

->getNumForLoops());

7786 Record

.AddSourceLocation(

C

->getLParenLoc());

7790 Record

.AddStmt(

C

->getEventHandler());

7791 Record

.AddSourceLocation(

C

->getLParenLoc());

7795 Record

.push_back(

unsigned

(

C

->getDefaultKind()));

7796 Record

.AddSourceLocation(

C

->getLParenLoc());

7797 Record

.AddSourceLocation(

C

->getDefaultKindKwLoc());

7801 Record

.push_back(

unsigned

(

C

->getProcBindKind()));

7802 Record

.AddSourceLocation(

C

->getLParenLoc());

7803 Record

.AddSourceLocation(

C

->getProcBindKindKwLoc());

7807

VisitOMPClauseWithPreInit(

C

);

7808 Record

.push_back(

C

->getScheduleKind());

7809 Record

.push_back(

C

->getFirstScheduleModifier());

7810 Record

.push_back(

C

->getSecondScheduleModifier());

7811 Record

.AddStmt(

C

->getChunkSize());

7812 Record

.AddSourceLocation(

C

->getLParenLoc());

7813 Record

.AddSourceLocation(

C

->getFirstScheduleModifierLoc());

7814 Record

.AddSourceLocation(

C

->getSecondScheduleModifierLoc());

7815 Record

.AddSourceLocation(

C

->getScheduleKindLoc());

7816 Record

.AddSourceLocation(

C

->getCommaLoc());

7820 Record

.push_back(

C

->getLoopNumIterations().size());

7821 Record

.AddStmt(

C

->getNumForLoops());

7822 for

(

Expr

*NumIter :

C

->getLoopNumIterations())

7823 Record

.AddStmt(NumIter);

7824 for

(

unsigned

I = 0,

E

=

C

->getLoopNumIterations().size(); I <

E

; ++I)

7825 Record

.AddStmt(

C

->getLoopCounter(I));

7826 Record

.AddSourceLocation(

C

->getLParenLoc());

7835void

OMPClauseWriter::VisitOMPReadClause(

OMPReadClause

*) {}

7840 Record

.push_back(

C

->isExtended() ? 1 : 0);

7841 if

(

C

->isExtended()) {

7842 Record

.AddSourceLocation(

C

->getLParenLoc());

7843 Record

.AddSourceLocation(

C

->getArgumentLoc());

7844 Record

.writeEnum(

C

->getDependencyKind());

7854 Record

.AddSourceLocation(

C

->getLParenLoc());

7855 Record

.AddSourceLocation(

C

->getFailParameterLoc());

7856 Record

.writeEnum(

C

->getFailParameter());

7864 Record

.push_back(

static_cast<uint64_t>

(

C

->getDirectiveKinds().size()));

7865 Record

.AddSourceLocation(

C

->getLParenLoc());

7866 for

(

auto

K :

C

->getDirectiveKinds()) {

7872 Record

.AddStmt(

C

->getExpr());

7873 Record

.AddSourceLocation(

C

->getLParenLoc());

7877 Record

.push_back(

static_cast<uint64_t>

(

C

->getDirectiveKinds().size()));

7878 Record

.AddSourceLocation(

C

->getLParenLoc());

7879 for

(

auto

K :

C

->getDirectiveKinds()) {

7886void

OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(

7897void

OMPClauseWriter::VisitOMPWeakClause(

OMPWeakClause

*) {}

7901void

OMPClauseWriter::VisitOMPSIMDClause(

OMPSIMDClause

*) {}

7906 Record

.push_back(

C

->varlist_size());

7907 for

(

Expr

*VE :

C

->varlist())

7909 Record

.writeBool(

C

->getIsTarget());

7910 Record

.writeBool(

C

->getIsTargetSync());

7911 Record

.AddSourceLocation(

C

->getLParenLoc());

7912 Record

.AddSourceLocation(

C

->getVarLoc());

7915void

OMPClauseWriter::VisitOMPUseClause(

OMPUseClause

*

C

) {

7916 Record

.AddStmt(

C

->getInteropVar());

7917 Record

.AddSourceLocation(

C

->getLParenLoc());

7918 Record

.AddSourceLocation(

C

->getVarLoc());

7922 Record

.AddStmt(

C

->getInteropVar());

7923 Record

.AddSourceLocation(

C

->getLParenLoc());

7924 Record

.AddSourceLocation(

C

->getVarLoc());

7928

VisitOMPClauseWithPreInit(

C

);

7929 Record

.AddStmt(

C

->getCondition());

7930 Record

.AddSourceLocation(

C

->getLParenLoc());

7934

VisitOMPClauseWithPreInit(

C

);

7935 Record

.AddStmt(

C

->getCondition());

7936 Record

.AddSourceLocation(

C

->getLParenLoc());

7940

VisitOMPClauseWithPreInit(

C

);

7941 Record

.AddStmt(

C

->getThreadID());

7942 Record

.AddSourceLocation(

C

->getLParenLoc());

7946 Record

.AddStmt(

C

->getAlignment());

7947 Record

.AddSourceLocation(

C

->getLParenLoc());

7951 Record

.push_back(

C

->varlist_size());

7952 Record

.AddSourceLocation(

C

->getLParenLoc());

7953 for

(

auto

*VE :

C

->varlist()) {

7956 for

(

auto

*VE :

C

->private_copies()) {

7962 Record

.push_back(

C

->varlist_size());

7963

VisitOMPClauseWithPreInit(

C

);

7964 Record

.AddSourceLocation(

C

->getLParenLoc());

7965 for

(

auto

*VE :

C

->varlist()) {

7968 for

(

auto

*VE :

C

->private_copies()) {

7971 for

(

auto

*VE :

C

->inits()) {

7977 Record

.push_back(

C

->varlist_size());

7978

VisitOMPClauseWithPostUpdate(

C

);

7979 Record

.AddSourceLocation(

C

->getLParenLoc());

7980 Record

.writeEnum(

C

->getKind());

7981 Record

.AddSourceLocation(

C

->getKindLoc());

7982 Record

.AddSourceLocation(

C

->getColonLoc());

7983 for

(

auto

*VE :

C

->varlist())

7985 for

(

auto

*

E

:

C

->private_copies())

7987 for

(

auto

*

E

:

C

->source_exprs())

7989 for

(

auto

*

E

:

C

->destination_exprs())

7991 for

(

auto

*

E

:

C

->assignment_ops())

7996 Record

.push_back(

C

->varlist_size());

7997 Record

.AddSourceLocation(

C

->getLParenLoc());

7998 for

(

auto

*VE :

C

->varlist())

8003 Record

.push_back(

C

->varlist_size());

8004 Record

.writeEnum(

C

->getModifier());

8005

VisitOMPClauseWithPostUpdate(

C

);

8006 Record

.AddSourceLocation(

C

->getLParenLoc());

8007 Record

.AddSourceLocation(

C

->getModifierLoc());

8008 Record

.AddSourceLocation(

C

->getColonLoc());

8009 Record

.AddNestedNameSpecifierLoc(

C

->getQualifierLoc());

8010 Record

.AddDeclarationNameInfo(

C

->getNameInfo());

8011 for

(

auto

*VE :

C

->varlist())

8013 for

(

auto

*VE :

C

->privates())

8015 for

(

auto

*

E

:

C

->lhs_exprs())

8017 for

(

auto

*

E

:

C

->rhs_exprs())

8019 for

(

auto

*

E

:

C

->reduction_ops())

8021 if

(

C

->getModifier() == clang::OMPC_REDUCTION_inscan) {

8022 for

(

auto

*

E

:

C

->copy_ops())

8024 for

(

auto

*

E

:

C

->copy_array_temps())

8026 for

(

auto

*

E

:

C

->copy_array_elems())

8032 Record

.push_back(

C

->varlist_size());

8033

VisitOMPClauseWithPostUpdate(

C

);

8034 Record

.AddSourceLocation(

C

->getLParenLoc());

8035 Record

.AddSourceLocation(

C

->getColonLoc());

8036 Record

.AddNestedNameSpecifierLoc(

C

->getQualifierLoc());

8037 Record

.AddDeclarationNameInfo(

C

->getNameInfo());

8038 for

(

auto

*VE :

C

->varlist())

8040 for

(

auto

*VE :

C

->privates())

8042 for

(

auto

*

E

:

C

->lhs_exprs())

8044 for

(

auto

*

E

:

C

->rhs_exprs())

8046 for

(

auto

*

E

:

C

->reduction_ops())

8051 Record

.push_back(

C

->varlist_size());

8052

VisitOMPClauseWithPostUpdate(

C

);

8053 Record

.AddSourceLocation(

C

->getLParenLoc());

8054 Record

.AddSourceLocation(

C

->getColonLoc());

8055 Record

.AddNestedNameSpecifierLoc(

C

->getQualifierLoc());

8056 Record

.AddDeclarationNameInfo(

C

->getNameInfo());

8057 for

(

auto

*VE :

C

->varlist())

8059 for

(

auto

*VE :

C

->privates())

8061 for

(

auto

*

E

:

C

->lhs_exprs())

8063 for

(

auto

*

E

:

C

->rhs_exprs())

8065 for

(

auto

*

E

:

C

->reduction_ops())

8067 for

(

auto

*

E

:

C

->taskgroup_descriptors())

8072 Record

.push_back(

C

->varlist_size());

8073

VisitOMPClauseWithPostUpdate(

C

);

8074 Record

.AddSourceLocation(

C

->getLParenLoc());

8075 Record

.AddSourceLocation(

C

->getColonLoc());

8076 Record

.push_back(

C

->getModifier());

8077 Record

.AddSourceLocation(

C

->getModifierLoc());

8078 for

(

auto

*VE :

C

->varlist()) {

8081 for

(

auto

*VE :

C

->privates()) {

8084 for

(

auto

*VE :

C

->inits()) {

8087 for

(

auto

*VE :

C

->updates()) {

8090 for

(

auto

*VE :

C

->finals()) {

8093 Record

.AddStmt(

C

->getStep());

8094 Record

.AddStmt(

C

->getCalcStep());

8095 for

(

auto

*VE :

C

->used_expressions())

8100 Record

.push_back(

C

->varlist_size());

8101 Record

.AddSourceLocation(

C

->getLParenLoc());

8102 Record

.AddSourceLocation(

C

->getColonLoc());

8103 for

(

auto

*VE :

C

->varlist())

8105 Record

.AddStmt(

C

->getAlignment());

8109 Record

.push_back(

C

->varlist_size());

8110 Record

.AddSourceLocation(

C

->getLParenLoc());

8111 for

(

auto

*VE :

C

->varlist())

8113 for

(

auto

*

E

:

C

->source_exprs())

8115 for

(

auto

*

E

:

C

->destination_exprs())

8117 for

(

auto

*

E

:

C

->assignment_ops())

8122 Record

.push_back(

C

->varlist_size());

8123 Record

.AddSourceLocation(

C

->getLParenLoc());

8124 for

(

auto

*VE :

C

->varlist())

8126 for

(

auto

*

E

:

C

->source_exprs())

8128 for

(

auto

*

E

:

C

->destination_exprs())

8130 for

(

auto

*

E

:

C

->assignment_ops())

8135 Record

.push_back(

C

->varlist_size());

8136 Record

.AddSourceLocation(

C

->getLParenLoc());

8137 for

(

auto

*VE :

C

->varlist())

8142 Record

.AddStmt(

C

->getDepobj());

8143 Record

.AddSourceLocation(

C

->getLParenLoc());

8147 Record

.push_back(

C

->varlist_size());

8148 Record

.push_back(

C

->getNumLoops());

8149 Record

.AddSourceLocation(

C

->getLParenLoc());

8150 Record

.AddStmt(

C

->getModifier());

8151 Record

.push_back(

C

->getDependencyKind());

8152 Record

.AddSourceLocation(

C

->getDependencyLoc());

8153 Record

.AddSourceLocation(

C

->getColonLoc());

8154 Record

.AddSourceLocation(

C

->getOmpAllMemoryLoc());

8155 for

(

auto

*VE :

C

->varlist())

8157 for

(

unsigned

I = 0,

E

=

C

->getNumLoops(); I <

E

; ++I)

8158 Record

.AddStmt(

C

->getLoopData(I));

8162

VisitOMPClauseWithPreInit(

C

);

8163 Record

.writeEnum(

C

->getModifier());

8164 Record

.AddStmt(

C

->getDevice());

8165 Record

.AddSourceLocation(

C

->getModifierLoc());

8166 Record

.AddSourceLocation(

C

->getLParenLoc());

8169void

OMPClauseWriter::VisitOMPMapClause(

OMPMapClause

*

C

) {

8170 Record

.push_back(

C

->varlist_size());

8171 Record

.push_back(

C

->getUniqueDeclarationsNum());

8172 Record

.push_back(

C

->getTotalComponentListNum());

8173 Record

.push_back(

C

->getTotalComponentsNum());

8174 Record

.AddSourceLocation(

C

->getLParenLoc());

8175 bool

HasIteratorModifier =

false

;

8177 Record

.push_back(

C

->getMapTypeModifier(I));

8178 Record

.AddSourceLocation(

C

->getMapTypeModifierLoc(I));

8179 if

(

C

->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)

8180

HasIteratorModifier =

true

;

8182 Record

.AddNestedNameSpecifierLoc(

C

->getMapperQualifierLoc());

8183 Record

.AddDeclarationNameInfo(

C

->getMapperIdInfo());

8184 Record

.push_back(

C

->getMapType());

8185 Record

.AddSourceLocation(

C

->getMapLoc());

8186 Record

.AddSourceLocation(

C

->getColonLoc());

8187 for

(

auto

*

E

:

C

->varlist())

8189 for

(

auto

*

E

:

C

->mapperlists())

8191 if

(HasIteratorModifier)

8192 Record

.AddStmt(

C

->getIteratorModifier());

8193 for

(

auto

*

D

:

C

->all_decls())

8195 for

(

auto

N :

C

->all_num_lists())

8197 for

(

auto

N :

C

->all_lists_sizes())

8199 for

(

auto

&M :

C

->all_components()) {

8200 Record

.AddStmt(M.getAssociatedExpression());

8201 Record

.AddDeclRef(M.getAssociatedDeclaration());

8206 Record

.push_back(

C

->varlist_size());

8207 Record

.writeEnum(

C

->getFirstAllocateModifier());

8208 Record

.writeEnum(

C

->getSecondAllocateModifier());

8209 Record

.AddSourceLocation(

C

->getLParenLoc());

8210 Record

.AddSourceLocation(

C

->getColonLoc());

8211 Record

.AddStmt(

C

->getAllocator());

8212 Record

.AddStmt(

C

->getAlignment());

8213 for

(

auto

*VE :

C

->varlist())

8218 Record

.push_back(

C

->varlist_size());

8219

VisitOMPClauseWithPreInit(

C

);

8220 Record

.AddSourceLocation(

C

->getLParenLoc());

8221 for

(

auto

*VE :

C

->varlist())

8226 Record

.push_back(

C

->varlist_size());

8227

VisitOMPClauseWithPreInit(

C

);

8228 Record

.AddSourceLocation(

C

->getLParenLoc());

8229 for

(

auto

*VE :

C

->varlist())

8234

VisitOMPClauseWithPreInit(

C

);

8235 Record

.AddStmt(

C

->getPriority());

8236 Record

.AddSourceLocation(

C

->getLParenLoc());

8240

VisitOMPClauseWithPreInit(

C

);

8241 Record

.writeEnum(

C

->getModifier());

8242 Record

.AddStmt(

C

->getGrainsize());

8243 Record

.AddSourceLocation(

C

->getModifierLoc());

8244 Record

.AddSourceLocation(

C

->getLParenLoc());

8248

VisitOMPClauseWithPreInit(

C

);

8249 Record

.writeEnum(

C

->getModifier());

8250 Record

.AddStmt(

C

->getNumTasks());

8251 Record

.AddSourceLocation(

C

->getModifierLoc());

8252 Record

.AddSourceLocation(

C

->getLParenLoc());

8256 Record

.AddStmt(

C

->getHint());

8257 Record

.AddSourceLocation(

C

->getLParenLoc());

8261

VisitOMPClauseWithPreInit(

C

);

8262 Record

.push_back(

C

->getDistScheduleKind());

8263 Record

.AddStmt(

C

->getChunkSize());

8264 Record

.AddSourceLocation(

C

->getLParenLoc());

8265 Record

.AddSourceLocation(

C

->getDistScheduleKindLoc());

8266 Record

.AddSourceLocation(

C

->getCommaLoc());

8270 Record

.push_back(

C

->getDefaultmapKind());

8271 Record

.push_back(

C

->getDefaultmapModifier());

8272 Record

.AddSourceLocation(

C

->getLParenLoc());

8273 Record

.AddSourceLocation(

C

->getDefaultmapModifierLoc());

8274 Record

.AddSourceLocation(

C

->getDefaultmapKindLoc());

8277void

OMPClauseWriter::VisitOMPToClause(

OMPToClause

*

C

) {

8278 Record

.push_back(

C

->varlist_size());

8279 Record

.push_back(

C

->getUniqueDeclarationsNum());

8280 Record

.push_back(

C

->getTotalComponentListNum());

8281 Record

.push_back(

C

->getTotalComponentsNum());

8282 Record

.AddSourceLocation(

C

->getLParenLoc());

8284 Record

.push_back(

C

->getMotionModifier(I));

8285 Record

.AddSourceLocation(

C

->getMotionModifierLoc(I));

8287 Record

.AddNestedNameSpecifierLoc(

C

->getMapperQualifierLoc());

8288 Record

.AddDeclarationNameInfo(

C

->getMapperIdInfo());

8289 Record

.AddSourceLocation(

C

->getColonLoc());

8290 for

(

auto

*

E

:

C

->varlist())

8292 for

(

auto

*

E

:

C

->mapperlists())

8294 for

(

auto

*

D

:

C

->all_decls())

8296 for

(

auto

N :

C

->all_num_lists())

8298 for

(

auto

N :

C

->all_lists_sizes())

8300 for

(

auto

&M :

C

->all_components()) {

8301 Record

.AddStmt(M.getAssociatedExpression());

8302 Record

.writeBool(M.isNonContiguous());

8303 Record

.AddDeclRef(M.getAssociatedDeclaration());

8308 Record

.push_back(

C

->varlist_size());

8309 Record

.push_back(

C

->getUniqueDeclarationsNum());

8310 Record

.push_back(

C

->getTotalComponentListNum());

8311 Record

.push_back(

C

->getTotalComponentsNum());

8312 Record

.AddSourceLocation(

C

->getLParenLoc());

8314 Record

.push_back(

C

->getMotionModifier(I));

8315 Record

.AddSourceLocation(

C

->getMotionModifierLoc(I));

8317 Record

.AddNestedNameSpecifierLoc(

C

->getMapperQualifierLoc());

8318 Record

.AddDeclarationNameInfo(

C

->getMapperIdInfo());

8319 Record

.AddSourceLocation(

C

->getColonLoc());

8320 for

(

auto

*

E

:

C

->varlist())

8322 for

(

auto

*

E

:

C

->mapperlists())

8324 for

(

auto

*

D

:

C

->all_decls())

8326 for

(

auto

N :

C

->all_num_lists())

8328 for

(

auto

N :

C

->all_lists_sizes())

8330 for

(

auto

&M :

C

->all_components()) {

8331 Record

.AddStmt(M.getAssociatedExpression());

8332 Record

.writeBool(M.isNonContiguous());

8333 Record

.AddDeclRef(M.getAssociatedDeclaration());

8338 Record

.push_back(

C

->varlist_size());

8339 Record

.push_back(

C

->getUniqueDeclarationsNum());

8340 Record

.push_back(

C

->getTotalComponentListNum());

8341 Record

.push_back(

C

->getTotalComponentsNum());

8342 Record

.AddSourceLocation(

C

->getLParenLoc());

8343 for

(

auto

*

E

:

C

->varlist())

8345 for

(

auto

*VE :

C

->private_copies())

8347 for

(

auto

*VE :

C

->inits())

8349 for

(

auto

*

D

:

C

->all_decls())

8351 for

(

auto

N :

C

->all_num_lists())

8353 for

(

auto

N :

C

->all_lists_sizes())

8355 for

(

auto

&M :

C

->all_components()) {

8356 Record

.AddStmt(M.getAssociatedExpression());

8357 Record

.AddDeclRef(M.getAssociatedDeclaration());

8362 Record

.push_back(

C

->varlist_size());

8363 Record

.push_back(

C

->getUniqueDeclarationsNum());

8364 Record

.push_back(

C

->getTotalComponentListNum());

8365 Record

.push_back(

C

->getTotalComponentsNum());

8366 Record

.AddSourceLocation(

C

->getLParenLoc());

8367 for

(

auto

*

E

:

C

->varlist())

8369 for

(

auto

*

D

:

C

->all_decls())

8371 for

(

auto

N :

C

->all_num_lists())

8373 for

(

auto

N :

C

->all_lists_sizes())

8375 for

(

auto

&M :

C

->all_components()) {

8376 Record

.AddStmt(M.getAssociatedExpression());

8377 Record

.AddDeclRef(M.getAssociatedDeclaration());

8382 Record

.push_back(

C

->varlist_size());

8383 Record

.push_back(

C

->getUniqueDeclarationsNum());

8384 Record

.push_back(

C

->getTotalComponentListNum());

8385 Record

.push_back(

C

->getTotalComponentsNum());

8386 Record

.AddSourceLocation(

C

->getLParenLoc());

8387 for

(

auto

*

E

:

C

->varlist())

8389 for

(

auto

*

D

:

C

->all_decls())

8391 for

(

auto

N :

C

->all_num_lists())

8393 for

(

auto

N :

C

->all_lists_sizes())

8395 for

(

auto

&M :

C

->all_components()) {

8396 Record

.AddStmt(M.getAssociatedExpression());

8397 Record

.AddDeclRef(M.getAssociatedDeclaration());

8402 Record

.push_back(

C

->varlist_size());

8403 Record

.push_back(

C

->getUniqueDeclarationsNum());

8404 Record

.push_back(

C

->getTotalComponentListNum());

8405 Record

.push_back(

C

->getTotalComponentsNum());

8406 Record

.AddSourceLocation(

C

->getLParenLoc());

8407 for

(

auto

*

E

:

C

->varlist())

8409 for

(

auto

*

D

:

C

->all_decls())

8411 for

(

auto

N :

C

->all_num_lists())

8413 for

(

auto

N :

C

->all_lists_sizes())

8415 for

(

auto

&M :

C

->all_components()) {

8416 Record

.AddStmt(M.getAssociatedExpression());

8417 Record

.AddDeclRef(M.getAssociatedDeclaration());

8423void

OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(

8432void

OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(

8434 Record

.push_back(

C

->getAtomicDefaultMemOrderKind());

8435 Record

.AddSourceLocation(

C

->getLParenLoc());

8436 Record

.AddSourceLocation(

C

->getAtomicDefaultMemOrderKindKwLoc());

8439void

OMPClauseWriter::VisitOMPAtClause(

OMPAtClause

*

C

) {

8440 Record

.push_back(

C

->getAtKind());

8441 Record

.AddSourceLocation(

C

->getLParenLoc());

8442 Record

.AddSourceLocation(

C

->getAtKindKwLoc());

8446 Record

.push_back(

C

->getSeverityKind());

8447 Record

.AddSourceLocation(

C

->getLParenLoc());

8448 Record

.AddSourceLocation(

C

->getSeverityKindKwLoc());

8452 Record

.AddStmt(

C

->getMessageString());

8453 Record

.AddSourceLocation(

C

->getLParenLoc());

8457 Record

.push_back(

C

->varlist_size());

8458 Record

.AddSourceLocation(

C

->getLParenLoc());

8459 for

(

auto

*VE :

C

->varlist())

8461 for

(

auto

*

E

:

C

->private_refs())

8466 Record

.push_back(

C

->varlist_size());

8467 Record

.AddSourceLocation(

C

->getLParenLoc());

8468 for

(

auto

*VE :

C

->varlist())

8473 Record

.push_back(

C

->varlist_size());

8474 Record

.AddSourceLocation(

C

->getLParenLoc());

8475 for

(

auto

*VE :

C

->varlist())

8480 Record

.writeEnum(

C

->getKind());

8481 Record

.writeEnum(

C

->getModifier());

8482 Record

.AddSourceLocation(

C

->getLParenLoc());

8483 Record

.AddSourceLocation(

C

->getKindKwLoc());

8484 Record

.AddSourceLocation(

C

->getModifierKwLoc());

8488 Record

.push_back(

C

->getNumberOfAllocators());

8489 Record

.AddSourceLocation(

C

->getLParenLoc());

8490 for

(

unsigned

I = 0,

E

=

C

->getNumberOfAllocators(); I <

E

; ++I) {

8500 Record

.push_back(

C

->varlist_size());

8501 Record

.AddSourceLocation(

C

->getLParenLoc());

8502 Record

.AddStmt(

C

->getModifier());

8503 Record

.AddSourceLocation(

C

->getColonLoc());

8504 for

(

Expr

*

E

:

C

->varlist())

8509 Record

.writeEnum(

C

->getBindKind());

8510 Record

.AddSourceLocation(

C

->getLParenLoc());

8511 Record

.AddSourceLocation(

C

->getBindKindLoc());

8515

VisitOMPClauseWithPreInit(

C

);

8516 Record

.AddStmt(

C

->getSize());

8517 Record

.AddSourceLocation(

C

->getLParenLoc());

8521 Record

.push_back(

C

->varlist_size());

8522 Record

.push_back(

C

->getNumLoops());

8523 Record

.AddSourceLocation(

C

->getLParenLoc());

8524 Record

.push_back(

C

->getDependenceType());

8525 Record

.AddSourceLocation(

C

->getDependenceLoc());

8526 Record

.AddSourceLocation(

C

->getColonLoc());

8527 for

(

auto

*VE :

C

->varlist())

8529 for

(

unsigned

I = 0,

E

=

C

->getNumLoops(); I <

E

; ++I)

8530 Record

.AddStmt(

C

->getLoopData(I));

8534 Record

.AddAttributes(

C

->getAttrs());

8535 Record

.AddSourceLocation(

C

->getBeginLoc());

8536 Record

.AddSourceLocation(

C

->getLParenLoc());

8537 Record

.AddSourceLocation(

C

->getEndLoc());

8544 for

(

const auto

&

Set

: TI->

Sets

) {

8551

writeExprRef(

Selector

.ScoreOrCondition);

8565 for

(

unsigned

I = 0,

E

=

Data

->getNumClauses(); I <

E

; ++I)

8567 if

(

Data

->hasAssociatedStmt())

8569 for

(

unsigned

I = 0,

E

=

Data

->getNumChildren(); I <

E

; ++I)

8575 for

(

Expr

*

E

:

C

->getVarList())

8581 for

(

Expr

*

E

: Exprs)

8590 switch

(

C

->getClauseKind()) {

8592 const auto

*DC = cast<OpenACCDefaultClause>(

C

);

8598 const auto

*IC = cast<OpenACCIfClause>(

C

);

8600 AddStmt

(

const_cast<Expr

*

>

(IC->getConditionExpr()));

8604 const auto

*SC = cast<OpenACCSelfClause>(

C

);

8606 writeBool

(SC->isConditionExprClause());

8607 if

(SC->isConditionExprClause()) {

8609 if

(SC->hasConditionExpr())

8610 AddStmt

(

const_cast<Expr

*

>

(SC->getConditionExpr()));

8613 for

(

Expr

*

E

: SC->getVarList())

8619 const auto

*NGC = cast<OpenACCNumGangsClause>(

C

);

8622 for

(

Expr

*

E

: NGC->getIntExprs())

8627 const auto

*DNC = cast<OpenACCDeviceNumClause>(

C

);

8629 AddStmt

(

const_cast<Expr

*

>

(DNC->getIntExpr()));

8633 const auto

*DAC = cast<OpenACCDefaultAsyncClause>(

C

);

8635 AddStmt

(

const_cast<Expr

*

>

(DAC->getIntExpr()));

8639 const auto

*NWC = cast<OpenACCNumWorkersClause>(

C

);

8641 AddStmt

(

const_cast<Expr

*

>

(NWC->getIntExpr()));

8645 const auto

*NWC = cast<OpenACCVectorLengthClause>(

C

);

8647 AddStmt

(

const_cast<Expr

*

>

(NWC->getIntExpr()));

8651 const auto

*PC = cast<OpenACCPrivateClause>(

C

);

8657 const auto

*HC = cast<OpenACCHostClause>(

C

);

8663 const auto

*DC = cast<OpenACCDeviceClause>(

C

);

8669 const auto

*FPC = cast<OpenACCFirstPrivateClause>(

C

);

8675 const auto

*AC = cast<OpenACCAttachClause>(

C

);

8681 const auto

*DC = cast<OpenACCDetachClause>(

C

);

8687 const auto

*DC = cast<OpenACCDeleteClause>(

C

);

8693 const auto

*UDC = cast<OpenACCUseDeviceClause>(

C

);

8699 const auto

*DPC = cast<OpenACCDevicePtrClause>(

C

);

8705 const auto

*NCC = cast<OpenACCNoCreateClause>(

C

);

8711 const auto

*PC = cast<OpenACCPresentClause>(

C

);

8719 const auto

*CC = cast<OpenACCCopyClause>(

C

);

8727 const auto

*CIC = cast<OpenACCCopyInClause>(

C

);

8736 const auto

*COC = cast<OpenACCCopyOutClause>(

C

);

8745 const auto

*CC = cast<OpenACCCreateClause>(

C

);

8752 const auto

*AC = cast<OpenACCAsyncClause>(

C

);

8755 if

(AC->hasIntExpr())

8756 AddStmt

(

const_cast<Expr

*

>

(AC->getIntExpr()));

8760 const auto

*WC = cast<OpenACCWaitClause>(

C

);

8763 if

(

Expr

*DNE = WC->getDevNumExpr())

8772 const auto

*DTC = cast<OpenACCDeviceTypeClause>(

C

);

8784 const auto

*RC = cast<OpenACCReductionClause>(

C

);

8799 const auto

*CC = cast<OpenACCCollapseClause>(

C

);

8802 AddStmt

(

const_cast<Expr

*

>

(CC->getLoopCount()));

8806 const auto

*TC = cast<OpenACCTileClause>(

C

);

8809 for

(

Expr

*

E

: TC->getSizeExprs())

8814 const auto

*GC = cast<OpenACCGangClause>(

C

);

8817 for

(

unsigned

I = 0; I < GC->getNumExprs(); ++I) {

8819 AddStmt

(

const_cast<Expr

*

>

(GC->getExpr(I).second));

8824 const auto

*WC = cast<OpenACCWorkerClause>(

C

);

8827 if

(WC->hasIntExpr())

8828 AddStmt

(

const_cast<Expr

*

>

(WC->getIntExpr()));

8832 const auto

*VC = cast<OpenACCVectorClause>(

C

);

8835 if

(VC->hasIntExpr())

8836 AddStmt

(

const_cast<Expr

*

>

(VC->getIntExpr()));

8845

llvm_unreachable(

"Clause serialization not yet implemented"

);

8847

llvm_unreachable(

"Invalid Clause Kind"

);

Defines the clang::ASTContext interface.

static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)

Whether the given identifier is "interesting".

static NamedDecl * getDeclForLocalLookup(const LangOptions &LangOpts, NamedDecl *D)

Determine the declaration that should be put into the name lookup table to represent the given declar...

static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream)

Create an abbreviation for the SLocEntry that refers to a buffer.

static bool isLookupResultNotInteresting(ASTWriter &Writer, StoredDeclsList &Result)

Returns ture if all of the lookup result are either external, not emitted or predefined.

static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec)

static bool IsInternalDeclFromFileContext(const Decl *D)

static TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType)

static void AddLazyVectorEmiitedDecls(ASTWriter &Writer, Vector &Vec, ASTWriter::RecordData &Record)

static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream)

Create an abbreviation for the SLocEntry that refers to a macro expansion.

static StringRef bytes(const std::vector< T, Allocator > &v)

static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream, bool Compressed)

Create an abbreviation for the SLocEntry that refers to a buffer's blob.

static void BackpatchSignatureAt(llvm::BitstreamWriter &Stream, const ASTFileSignature &S, uint64_t BitNo)

static const char * adjustFilenameForRelocatableAST(const char *Filename, StringRef BaseDir)

Adjusts the given filename to only write out the portion of the filename that is not part of the syst...

static bool isLocalIdentifierID(IdentifierID ID)

If the.

static unsigned getNumberOfModules(Module *Mod)

Compute the number of modules within the given tree (including the given module).

static bool isImportedDeclContext(ASTReader *Chain, const Decl *D)

static TypeCode getTypeCodeForTypeClass(Type::TypeClass id)

static void AddStmtsExprs(llvm::BitstreamWriter &Stream, ASTWriter::RecordDataImpl &Record)

static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob, unsigned SLocBufferBlobCompressedAbbrv, unsigned SLocBufferBlobAbbrv)

static uint64_t EmitCXXBaseSpecifiers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXBaseSpecifier > Bases)

static std::pair< unsigned, unsigned > emitULEBKeyDataLength(unsigned KeyLen, unsigned DataLen, raw_ostream &Out)

Emit key length and data length as ULEB-encoded data, and return them as a pair.

static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule, const Preprocessor &PP)

static bool cleanPathForOutput(FileManager &FileMgr, SmallVectorImpl< char > &Path)

Prepares a path for being written to an AST file by converting it to an absolute path and removing ne...

static uint64_t EmitCXXCtorInitializers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXCtorInitializer * > CtorInits)

static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream)

Create an abbreviation for the SLocEntry that refers to a file.

Defines the Diagnostic-related interfaces.

Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....

Defines the C++ template declaration subclasses.

Defines the clang::Expr interface and subclasses for C++ expressions.

Defines interfaces for clang::FileEntry and clang::FileEntryRef.

Defines the clang::FileManager interface and associated types.

Defines the clang::FileSystemOptions interface.

Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.

Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.

Defines the LambdaCapture class.

Defines several types used to describe C++ lambda expressions that are shared between the parser and ...

Defines the clang::LangOptions interface.

static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)

Produce a diagnostic highlighting some portion of a literal.

llvm::MachO::Target Target

llvm::MachO::Record Record

Defines the clang::MacroInfo and clang::MacroDirective classes.

Defines the clang::Module class, which describes a module in the source code.

Defines types useful for describing an Objective-C runtime.

Defines some OpenACC-specific enums and functions.

Defines the clang::OpenCLOptions class.

This file defines OpenMP AST classes for clauses.

Defines the clang::Preprocessor interface.

This file declares semantic analysis for CUDA constructs.

This file declares semantic analysis for Objective-C.

static void EmitBlockID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)

Emits a block ID in the BLOCKINFO block.

static void EmitRecordID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)

Emits a record ID in the BLOCKINFO block.

Defines the clang::SourceLocation class and associated facilities.

Defines implementation details of the clang::SourceManager class.

Defines the SourceManager interface.

Defines various enumerations that describe declaration and type specifiers.

Defines the clang::TargetOptions class.

#define IMPORT(DERIVED, BASE)

#define BLOCK(DERIVED, BASE)

Defines the clang::TypeLoc interface and its subclasses.

C Language Family Type Representation.

Defines version macros and version-related utility functions for Clang.

__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)

APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

TranslationUnitDecl * getTranslationUnitDecl() const

DeclarationNameTable DeclarationNames

QualType getRawCFConstantStringType() const

Get the structure type used to representation CFStrings, or NULL if it hasn't yet been built.

QualType getucontext_tType() const

Retrieve the C ucontext_t type.

QualType getRecordType(const RecordDecl *Decl) const

CanQualType getCanonicalType(QualType T) const

Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...

QualType getFILEType() const

Retrieve the C FILE type.

ArrayRef< Decl * > getModuleInitializers(Module *M)

Get the initializations to perform when importing a module, if any.

const LangOptions & getLangOpts() const

RawCommentList Comments

All comments in this translation unit.

QualType getjmp_bufType() const

Retrieve the C jmp_buf type.

QualType getsigjmp_bufType() const

Retrieve the C sigjmp_buf type.

QualType AutoRRefDeductTy

Decl * getVaListTagDecl() const

Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...

FunctionDecl * getcudaConfigureCallDecl()

import_range local_imports() const

Reads an AST files chain containing the contents of a translation unit.

ModuleManager & getModuleManager()

Retrieve the module manager.

const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const

Get the loaded lookup tables for Primary, if any.

const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const

unsigned getTotalNumSubmodules() const

Returns the number of submodules known.

void finalizeForWriting()

Finalizes the AST reader's state before writing an AST file to disk.

void forEachImportedKeyDecl(const Decl *D, Fn Visit)

Run a callback on each imported key declaration of D.

unsigned getTotalNumSelectors() const

Returns the number of selectors found in the chain.

unsigned getModuleFileID(ModuleFile *M)

Get an ID for the given module file.

Decl * getKeyDeclaration(Decl *D)

Returns the first key declaration for the given declaration.

void LoadSelector(Selector Sel)

Load a selector from disk, registering its ID if it exists.

bool isProcessingUpdateRecords()

serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)

Get the loaded specializations lookup tables for D, if any.

unsigned getTotalNumMacros() const

Returns the number of macros found in the chain.

const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const

An object for streaming information to a record.

void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo)

void AddCXXBaseSpecifiers(ArrayRef< CXXBaseSpecifier > Bases)

Emit a set of C++ base specifiers.

void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs)

Emit a template argument list.

uint64_t Emit(unsigned Code, unsigned Abbrev=0)

Emit the record to the stream, followed by its substatements, and return its offset.

void AddCXXTemporary(const CXXTemporary *Temp)

Emit a CXXTemporary.

void writeOMPTraitInfo(const OMPTraitInfo *TI)

Write an OMPTraitInfo object.

void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base)

Emit a C++ base specifier.

void writeOMPClause(OMPClause *C)

void writeBool(bool Value)

void AddAPValue(const APValue &Value)

Emit an APvalue.

void AddUnresolvedSet(const ASTUnresolvedSet &Set)

Emit a UnresolvedSet structure.

void AddIdentifierRef(const IdentifierInfo *II)

Emit a reference to an identifier.

void AddStmt(Stmt *S)

Add the given statement or expression to the queue of statements to emit.

void AddDeclarationName(DeclarationName Name)

Emit a declaration name.

void AddSelectorRef(Selector S)

Emit a Selector (which is a smart pointer reference).

void AddSourceRange(SourceRange Range, LocSeq *Seq=nullptr)

Emit a source range.

void writeSourceLocation(SourceLocation Loc)

void AddOffset(uint64_t BitOffset)

Add a bit offset into the record.

void AddTypeRef(QualType T)

Emit a reference to a type.

void writeQualType(QualType T)

void writeOpenACCClauseList(ArrayRef< const OpenACCClause * > Clauses)

Writes out a list of OpenACC clauses.

void AddSourceLocation(SourceLocation Loc, LocSeq *Seq=nullptr)

Emit a source location.

void push_back(uint64_t N)

Minimal vector-like interface.

void AddTypeLoc(TypeLoc TL, LocSeq *Seq=nullptr)

Emits source location information for a type. Does not emit the type.

void AddCXXCtorInitializers(ArrayRef< CXXCtorInitializer * > CtorInits)

Emit a CXXCtorInitializer array.

void AddTemplateParameterList(const TemplateParameterList *TemplateParams)

Emit a template parameter list.

void AddTemplateArgument(const TemplateArgument &Arg)

Emit a template argument.

void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, DeclarationName Name)

void writeOpenACCIntExprList(ArrayRef< Expr * > Exprs)

void AddAPFloat(const llvm::APFloat &Value)

Emit a floating-point value.

void AddTypeSourceInfo(TypeSourceInfo *TInfo)

Emits a reference to a declarator info.

void AddQualifierInfo(const QualifierInfo &Info)

void writeUInt32(uint32_t Value)

void AddDeclRef(const Decl *D)

Emit a reference to a declaration.

void writeOMPChildren(OMPChildren *Data)

Writes data related to the OpenMP directives.

void AddConceptReference(const ConceptReference *CR)

void AddAPInt(const llvm::APInt &Value)

Emit an integral value.

void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind, const TemplateArgumentLocInfo &Arg)

Emits a template argument location info.

void writeOpenACCVarList(const OpenACCClauseWithVarList *C)

void AddAttributes(ArrayRef< const Attr * > Attrs)

Emit a list of attributes.

void AddASTTemplateArgumentListInfo(const ASTTemplateArgumentListInfo *ASTTemplArgList)

Emits an AST template argument list info.

void AddCXXDefinitionData(const CXXRecordDecl *D)

void AddVarDeclInit(const VarDecl *VD)

Emit information about the initializer of a VarDecl.

void writeStmtRef(const Stmt *S)

void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg)

Emits a template argument location.

void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)

Emit a nested name specifier with source-location information.

void writeOpenACCClause(const OpenACCClause *C)

Writes out a single OpenACC Clause.

void AddAttr(const Attr *A)

An UnresolvedSet-like class which uses the ASTContext's allocator.

Writes an AST file containing the contents of a translation unit.

serialization::MacroID getMacroID(MacroInfo *MI)

Determine the ID of an already-emitted macro.

void AddEmittedDeclRef(const Decl *D, RecordDataImpl &Record)

void AddSourceRange(SourceRange Range, RecordDataImpl &Record, LocSeq *Seq=nullptr)

Emit a source range.

bool isWritingStdCXXNamedModules() const

void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, StringRef Path)

Emit the current record with the given path as a blob.

void AddFileID(FileID FID, RecordDataImpl &Record)

Emit a FileID.

bool isDeclPredefined(const Decl *D) const

void AddPath(StringRef Path, RecordDataImpl &Record)

Add a path to the given record.

unsigned getTypeExtQualAbbrev() const

void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record)

Add a version tuple to the given record.

bool isGeneratingReducedBMI() const

uint32_t getMacroDirectivesOffset(const IdentifierInfo *Name)

void AddAlignPackInfo(const Sema::AlignPackInfo &Info, RecordDataImpl &Record)

Emit a AlignPackInfo.

void AddPathBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)

bool IsLocalDecl(const Decl *D)

Is this a local declaration (that is, one that will be written to our AST file)? This is the case for...

void AddTypeRef(ASTContext &Context, QualType T, RecordDataImpl &Record)

Emit a reference to a type.

bool wasDeclEmitted(const Decl *D) const

Whether or not the declaration got emitted.

void AddString(StringRef Str, RecordDataImpl &Record)

Add a string to the given record.

time_t getTimestampForOutput(const FileEntry *E) const

Get a timestamp for output into the AST file.

bool isWritingModule() const

LocalDeclID GetDeclRef(const Decl *D)

Force a declaration to be emitted and get its local ID to the module file been writing.

LocalDeclID getDeclID(const Decl *D)

Determine the local declaration ID of an already-emitted declaration.

void AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record)

Emit a reference to an identifier.

serialization::MacroID getMacroRef(MacroInfo *MI, const IdentifierInfo *Name)

Get the unique number used to refer to the given macro.

void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record, LocSeq *Seq=nullptr)

Emit a source location.

ASTFileSignature WriteAST(llvm::PointerUnion< Sema *, Preprocessor * > Subject, StringRef OutputFile, Module *WritingModule, StringRef isysroot, bool ShouldCacheASTInMemory=false)

Write a precompiled header or a module with the AST produced by the Sema object, or a dependency scan...

ASTReader * getChain() const

bool getDoneWritingDeclsAndTypes() const

serialization::IdentifierID getIdentifierRef(const IdentifierInfo *II)

Get the unique number used to refer to the given identifier.

void handleVTable(CXXRecordDecl *RD)

unsigned getLocalOrImportedSubmoduleID(const Module *Mod)

Retrieve or create a submodule ID for this module, or return 0 if the submodule is neither local (a s...

void AddToken(const Token &Tok, RecordDataImpl &Record)

Emit a token.

serialization::SelectorID getSelectorRef(Selector Sel)

Get the unique number used to refer to the given selector.

SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc, LocSeq *Seq=nullptr)

Return the raw encodings for source locations.

ASTWriter(llvm::BitstreamWriter &Stream, SmallVectorImpl< char > &Buffer, InMemoryModuleCache &ModuleCache, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, bool IncludeTimestamps=true, bool BuildingImplicitModule=false, bool GeneratingReducedBMI=false)

Create a new precompiled header writer that outputs to the given bitstream.

SmallVector< uint64_t, 64 > RecordData

serialization::TypeID GetOrCreateTypeID(ASTContext &Context, QualType T)

Force a type to be emitted and get its ID.

unsigned getAnonymousDeclarationNumber(const NamedDecl *D)

const LangOptions & getLangOpts() const

void SetSelectorOffset(Selector Sel, uint32_t Offset)

Note that the selector Sel occurs at the given offset within the method pool/selector table.

bool PreparePathForOutput(SmallVectorImpl< char > &Path)

Convert a path from this build process into one that is appropriate for emission in the module file.

void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset)

Note that the identifier II occurs at the given offset within the identifier table.

void AddDeclRef(const Decl *D, RecordDataImpl &Record)

Emit a reference to a declaration.

void AddStringBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)

Wrapper for source info for array parameter types.

Wrapper for source info for arrays.

SourceLocation getLBracketLoc() const

Expr * getSizeExpr() const

SourceLocation getRBracketLoc() const

SourceLocation getRParenLoc() const

SourceLocation getKWLoc() const

SourceLocation getLParenLoc() const

Attr - This represents one attribute.

attr::Kind getKind() const

SourceLocation getScopeLoc() const

SourceRange getRange() const

const IdentifierInfo * getScopeName() const

bool isRegularKeywordAttribute() const

const IdentifierInfo * getAttrName() const

Kind getParsedKind() const

Type source information for an attributed type.

const Attr * getAttr() const

The type attribute.

SourceLocation getRParenLoc() const

bool isDecltypeAuto() const

bool isConstrained() const

ConceptReference * getConceptReference() const

Type source information for an btf_tag attributed type.

A simple helper class to pack several bits in order into (a) 32 bit integer(s).

void addBits(uint32_t Value, uint32_t BitsWidth)

Wrapper for source info for block pointers.

SourceLocation getCaretLoc() const

Wrapper for source info for builtin types.

SourceLocation getBuiltinLoc() const

TypeSpecifierType getWrittenTypeSpec() const

TypeSpecifierWidth getWrittenWidthSpec() const

bool needsExtraLocalData() const

TypeSpecifierSign getWrittenSignSpec() const

This class is used for builtin types like 'int'.

Represents a base class of a C++ class.

Represents a C++ destructor within a class.

Represents a C++ struct/union/class.

Represents a C++ temporary.

const CXXDestructorDecl * getDestructor() const

Declaration of a class template.

Represents a class template specialization, which refers to a class template with a given set of temp...

A reference to a concept and its template args, as it appears in the code.

const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const

NamedDecl * getFoundDecl() const

const DeclarationNameInfo & getConceptNameInfo() const

ConceptDecl * getNamedConcept() const

const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const

SourceLocation getTemplateKWLoc() const

Wrapper for source info for pointers decayed from arrays and functions.

The results of name lookup within a DeclContext.

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

bool isFileContext() const

lookup_result lookup(DeclarationName Name) const

lookup - Find the declarations (if any) with the given Name in this context.

bool isLookupContext() const

Test whether the context supports looking up names.

bool isTranslationUnit() const

DeclContext * getRedeclContext()

getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...

StoredDeclsMap * buildLookup()

Ensure the lookup structure is fully-built and return it.

lookup_result noload_lookup(DeclarationName Name)

Find the declarations with the given name that are visible within this context; don't attempt to retr...

decl_range noload_decls() const

noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...

DeclContext * getPrimaryContext()

getPrimaryContext - There may be many different declarations of the same entity (including forward de...

decl_range decls() const

decls_begin/decls_end - Iterate over the declarations stored in this context.

bool isFunctionOrMethod() const

StoredDeclsMap * getLookupPtr() const

Retrieve the internal representation of the lookup structure.

DeclID getRawValue() const

A helper iterator adaptor to convert the iterators to SmallVector<SomeDeclID> to the iterators to Sma...

Decl - This represents one declaration (or definition), e.g.

Decl * getPreviousDecl()

Retrieve the previous declaration that declares the same entity as this declaration,...

Decl * getMostRecentDecl()

Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...

Module * getTopLevelOwningNamedModule() const

Get the top level owning named module that owns this declaration if any.

FriendObjectKind getFriendObjectKind() const

Determines whether this declaration is the object of a friend declaration and, if so,...

ASTContext & getASTContext() const LLVM_READONLY

bool isImplicit() const

isImplicit - Indicates whether the declaration was implicitly generated by the implementation.

bool isInNamedModule() const

Whether this declaration comes from a named module.

bool isUnconditionallyVisible() const

Determine whether this declaration is definitely visible to name lookup, independent of whether the o...

@ FOK_None

Not a friend object.

bool isCanonicalDecl() const

Whether this particular Decl is a canonical one.

Module * getOwningModule() const

Get the module that owns this declaration (for visibility purposes).

bool isFirstDecl() const

True if this is the first declaration in its redeclaration chain.

bool isFromExplicitGlobalModule() const

Whether this declaration comes from explicit global module.

bool isFromASTFile() const

Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...

DeclContext * getNonTransparentDeclContext()

Return the non transparent context.

SourceLocation getLocation() const

DeclContext * getDeclContext()

DeclContext * getLexicalDeclContext()

getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).

virtual Decl * getCanonicalDecl()

Retrieves the "canonical" declaration of the given declaration.

GlobalDeclID getGlobalID() const

Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...

DeclarationNameLoc - Additional source/type location info for a declaration name.

SourceLocation getCXXLiteralOperatorNameLoc() const

Return the location of the literal operator name (without the operator keyword).

TypeSourceInfo * getNamedTypeInfo() const

Returns the source type info.

SourceRange getCXXOperatorNameRange() const

Return the range of the operator name (without the operator keyword).

The name of a declaration.

@ CXXConversionFunctionName

SourceLocation getDecltypeLoc() const

SourceLocation getRParenLoc() const

SourceLocation getTemplateNameLoc() const

Expr * getAttrExprOperand() const

The attribute's expression operand, if it has one.

SourceRange getAttrOperandParensRange() const

The location of the parentheses around the operand, if there is an operand.

SourceLocation getAttrNameLoc() const

The location of the attribute name, i.e.

NestedNameSpecifierLoc getQualifierLoc() const

SourceLocation getNameLoc() const

SourceLocation getElaboratedKeywordLoc() const

SourceLocation getNameLoc() const

unsigned getNumArgs() const

SourceLocation getTemplateNameLoc() const

SourceLocation getLAngleLoc() const

SourceLocation getTemplateKeywordLoc() const

TemplateArgumentLoc getArgLoc(unsigned i) const

SourceLocation getRAngleLoc() const

SourceLocation getElaboratedKeywordLoc() const

NestedNameSpecifierLoc getQualifierLoc() const

SourceLocation getNameLoc() const

Options for controlling the compiler diagnostics engine.

std::vector< std::string > Remarks

The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.

std::vector< std::string > Warnings

The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.

Concrete class used by the front-end to report problems and issues.

bool hasUncompilableErrorOccurred() const

Errors that actually prevent compilation, not those that are upgraded from a warning by -Werror.

StringRef getName() const

SourceLocation getElaboratedKeywordLoc() const

NestedNameSpecifierLoc getQualifierLoc() const

Wrapper for source info for enum types.

This represents one expression.

Represents difference between two FPOptions values.

storage_type getAsOpaqueInt() const

storage_type getAsOpaqueInt() const

Represents a member of a struct/union/class.

A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...

StringRef getName() const

The name of this FileEntry.

Cached information about one file (either on disk or in the virtual file system).

An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...

Implements support for file system lookup, file system caching, and directory search management.

void trackVFSUsage(bool Active)

Enable or disable tracking of VFS usage.

llvm::vfs::FileSystem & getVirtualFileSystem() const

void GetUniqueIDMapping(SmallVectorImpl< OptionalFileEntryRef > &UIDToFiles) const

Produce an array mapping from the unique IDs assigned to each file to the corresponding FileEntryRef.

bool makeAbsolutePath(SmallVectorImpl< char > &Path) const

Makes Path absolute taking into account FileSystemOptions and the working directory option.

FileSystemOptions & getFileSystemOpts()

Returns the current file system options.

OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)

Get a DirectoryEntryRef if it exists, without doing anything on error.

Keeps track of options that affect how file operations are performed.

std::string WorkingDir

If set, paths are resolved as if the working directory was set to the value of WorkingDir.

Represents a function declaration or definition.

Represents a prototype with parameter type info, e.g.

Declaration of a template function.

Wrapper for source info for functions.

unsigned getNumParams() const

ParmVarDecl * getParam(unsigned i) const

SourceLocation getLocalRangeEnd() const

SourceRange getExceptionSpecRange() const

SourceLocation getLocalRangeBegin() const

SourceLocation getLParenLoc() const

SourceLocation getRParenLoc() const

Type source information for HLSL attributed resource type.

One of these records is kept for each identifier that is lexed.

unsigned getLength() const

Efficiently return the length of this identifier info.

unsigned getBuiltinID() const

Return a value indicating whether this is a builtin function.

bool hasChangedSinceDeserialization() const

Determine whether this identifier has changed since it was loaded from an AST file.

bool isCPlusPlusOperatorKeyword() const

bool hasFETokenInfoChangedSinceDeserialization() const

Determine whether the frontend token information for this identifier has changed since it was loaded ...

bool isFromAST() const

Return true if the identifier in its current state was loaded from an AST file.

bool isPoisoned() const

Return true if this token has been poisoned.

bool hasRevertedTokenIDToIdentifier() const

True if revertTokenIDToIdentifier() was called.

const char * getNameStart() const

Return the beginning of the actual null-terminated string for this identifier.

tok::NotableIdentifierKind getNotableIdentifierID() const

unsigned getObjCOrBuiltinID() const

tok::ObjCKeywordKind getObjCKeywordID() const

Return the Objective-C keyword ID for the this identifier.

void * getFETokenInfo() const

Get and set FETokenInfo.

StringRef getName() const

Return the actual identifier string.

bool isExtensionToken() const

get/setExtension - Initialize information about whether or not this language token is an extension.

IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.

iterator begin(DeclarationName Name)

Returns an iterator over decls with the name 'Name'.

iterator end()

Returns the end iterator.

llvm::iterator_range< iterator > decls(DeclarationName Name)

Returns a range of decls with the name 'Name'.

Implements an efficient mapping from strings to IdentifierInfo nodes.

In-memory cache for modules.

llvm::MemoryBuffer & addBuiltPCM(llvm::StringRef Filename, std::unique_ptr< llvm::MemoryBuffer > Buffer)

Store a just-built PCM under the Filename.

Wrapper for source info for injected class names of class templates.

SourceLocation getAmpLoc() const

Describes the capture of a variable or of this, or of a C++1y init-capture.

Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...

clang::ObjCRuntime ObjCRuntime

CommentOptions CommentOpts

Options for parsing comments.

std::string OMPHostIRFile

Name of the IR file that contains the result of the OpenMP target host code generation.

std::vector< llvm::Triple > OMPTargetTriples

Triples of the OpenMP targets that the host code codegen should take into account in order to generat...

std::string CurrentModule

The name of the current module, of which the main source file is a part.

std::vector< std::string > ModuleFeatures

The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...

Used to hold and unique data used to represent #line information.

Record the location of a macro definition.

Encapsulates changes to the "macros namespace" (the location where the macro name became active,...

const MacroDirective * getPrevious() const

Get previous definition of the macro with the same name.

const MacroInfo * getMacroInfo() const

SourceLocation getLocation() const

Encapsulates the data about a macro definition (e.g.

bool isUsed() const

Return false if this macro is defined in the main file and has not yet been used.

bool isC99Varargs() const

SourceLocation getDefinitionEndLoc() const

Return the location of the last token in the macro.

ArrayRef< const IdentifierInfo * > params() const

unsigned getNumTokens() const

Return the number of tokens that this macro expands to.

unsigned getNumParams() const

const Token & getReplacementToken(unsigned Tok) const

bool isBuiltinMacro() const

Return true if this macro requires processing before expansion.

SourceLocation getDefinitionLoc() const

Return the location that the macro was defined at.

bool hasCommaPasting() const

bool isObjectLike() const

bool isUsedForHeaderGuard() const

Determine whether this macro was used for a header guard.

bool isGNUVarargs() const

SourceLocation getExpansionLoc() const

Expr * getAttrColumnOperand() const

The attribute's column operand, if it has one.

SourceRange getAttrOperandParensRange() const

The location of the parentheses around the operand, if there is an operand.

SourceLocation getAttrNameLoc() const

The location of the attribute name, i.e.

Expr * getAttrRowOperand() const

The attribute's row operand, if it has one.

Wrapper for source info for member pointers.

TypeSourceInfo * getClassTInfo() const

SourceLocation getStarLoc() const

Abstract base class that writes a module file extension block into a module file.

virtual void writeExtensionContents(Sema &SemaRef, llvm::BitstreamWriter &Stream)=0

Write the contents of the extension block into the given bitstream.

ModuleFileExtension * getExtension() const

Retrieve the module file extension with which this writer is associated.

virtual ModuleFileExtensionMetadata getExtensionMetadata() const =0

Retrieves the metadata for this module file extension.

void resolveHeaderDirectives(const FileEntry *File) const

Resolve all lazy header directives for the specified file.

ArrayRef< KnownHeader > findResolvedModulesForHeader(FileEntryRef File) const

Like findAllModulesForHeader, but do not attempt to infer module ownership from umbrella headers if w...

FileID getModuleMapFileIDForUniquing(const Module *M) const

Get the module map file that (along with the module name) uniquely identifies this module.

FileID getContainingModuleMapFileID(const Module *Module) const

Retrieve the module map file containing the definition of the given module.

ModuleHeaderRole

Flags describing the role of a module header.

static ModuleHeaderRole headerKindToRole(Module::HeaderKind Kind)

Convert a header kind to a role. Requires Kind to not be HK_Excluded.

Describes a module or submodule.

unsigned IsExplicit

Whether this is an explicit submodule.

SmallVector< ExportDecl, 2 > Exports

The set of export declarations.

unsigned InferSubmodules

Whether we should infer submodules for this module based on the headers.

std::vector< std::string > ConfigMacros

The set of "configuration macros", which are macros that (intentionally) change how this module is bu...

SourceLocation DefinitionLoc

The location of the module definition.

SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders

Headers that are mentioned in the module map file but could not be found on the file system.

Module * Parent

The parent of this module.

ModuleKind Kind

The kind of this module.

bool isUnimportable() const

Determine whether this module has been declared unimportable.

unsigned IsInferred

Whether this is an inferred submodule (module * { ... }).

llvm::SmallSetVector< Module *, 2 > Imports

The set of modules imported by this module, and on which this module depends.

unsigned IsSystem

Whether this is a "system" module (which assumes that all headers in it are system headers).

std::string Name

The name of this module.

llvm::iterator_range< submodule_iterator > submodules()

unsigned IsExternC

Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...

unsigned ModuleMapIsPrivate

Whether this module came from a "private" module map, found next to a regular (public) module map.

llvm::SmallVector< LinkLibrary, 2 > LinkLibraries

The set of libraries or frameworks to link against when an entity from this module is used.

std::optional< Header > getUmbrellaHeaderAsWritten() const

Retrieve the umbrella header as written.

SmallVector< Requirement, 2 > Requirements

The set of language features required to use this module.

llvm::SmallSetVector< const Module *, 2 > UndeclaredUses

When NoUndeclaredIncludes is true, the set of modules this module tried to import but didn't because ...

OptionalDirectoryEntryRef Directory

The build directory of this module.

unsigned NamedModuleHasInit

Whether this C++20 named modules doesn't need an initializer.

llvm::SmallSetVector< Module *, 2 > AffectingClangModules

The set of top-level modules that affected the compilation of this module, but were not imported.

unsigned ConfigMacrosExhaustive

Whether the set of configuration macros is exhaustive.

std::string PresumedModuleMapFile

The presumed file name for the module map defining this module.

ASTFileSignature Signature

The module signature.

ArrayRef< Header > getHeaders(HeaderKind HK) const

unsigned InferExportWildcard

Whether, when inferring submodules, the inferr submodules should export all modules they import (e....

ArrayRef< FileEntryRef > getTopHeaders(FileManager &FileMgr)

The top-level headers associated with this module.

std::optional< DirectoryName > getUmbrellaDirAsWritten() const

Retrieve the umbrella directory as written.

bool isHeaderUnit() const

Is this module a header unit.

@ ModuleMapModule

This is a module that was defined by a module map and built out of header files.

unsigned IsFramework

Whether this is a framework module.

std::string ExportAsModule

The module through which entities defined in this module will eventually be exposed,...

std::string getFullModuleName(bool AllowStringLiterals=false) const

Retrieve the full name of this module, including the path from its top-level module.

bool isNamedModule() const

Does this Module is a named module of a standard named module?

unsigned InferExplicitSubmodules

Whether, when inferring submodules, the inferred submodules should be explicit.

Module * getTopLevelModule()

Retrieve the top-level module for this (sub)module, which may be this module.

std::vector< Conflict > Conflicts

The list of conflicts.

This represents a decl that may have a name.

Represent a C++ namespace.

A C++ nested-name-specifier augmented with source location information.

TypeLoc getTypeLoc() const

For a nested-name-specifier that refers to a type, retrieve the type with source-location information...

NestedNameSpecifierLoc getPrefix() const

Return the prefix of this nested-name-specifier.

SourceRange getLocalSourceRange() const

Retrieve the source range covering just the last part of this nested-name-specifier,...

NestedNameSpecifier * getNestedNameSpecifier() const

Retrieve the nested-name-specifier to which this instance refers.

CXXRecordDecl * getAsRecordDecl() const

Retrieve the record declaration stored in this nested name specifier.

SpecifierKind getKind() const

Determine what kind of nested name specifier is stored.

NamespaceAliasDecl * getAsNamespaceAlias() const

Retrieve the namespace alias stored in this nested name specifier.

IdentifierInfo * getAsIdentifier() const

Retrieve the identifier stored in this nested name specifier.

SpecifierKind

The kind of specifier that completes this nested name specifier.

@ NamespaceAlias

A namespace alias, stored as a NamespaceAliasDecl*.

@ TypeSpec

A type, stored as a Type*.

@ TypeSpecWithTemplate

A type that was preceded by the 'template' keyword, stored as a Type*.

@ Super

Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.

@ Identifier

An identifier, stored as an IdentifierInfo*.

@ Global

The global specifier '::'. There is no stored value.

@ Namespace

A namespace, stored as a NamespaceDecl*.

NamespaceDecl * getAsNamespace() const

Retrieve the namespace stored in this nested name specifier.

This represents the 'absent' clause in the '#pragma omp assume' directive.

This represents 'acq_rel' clause in the '#pragma omp atomic|flush' directives.

This represents 'acquire' clause in the '#pragma omp atomic|flush' directives.

This represents clause 'affinity' in the '#pragma omp task'-based directives.

This represents the 'align' clause in the '#pragma omp allocate' directive.

This represents clause 'aligned' in the '#pragma omp ...' directives.

This represents clause 'allocate' in the '#pragma omp ...' directives.

This represents 'allocator' clause in the '#pragma omp ...' directive.

This represents 'at' clause in the '#pragma omp error' directive.

This represents 'atomic_default_mem_order' clause in the '#pragma omp requires' directive.

This represents 'bind' clause in the '#pragma omp ...' directives.

This represents 'capture' clause in the '#pragma omp atomic' directive.

Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...

Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.

Class that handles pre-initialization statement for some clauses, like 'schedule',...

This is a basic class for representing single OpenMP clause.

This represents 'collapse' clause in the '#pragma omp ...' directive.

This represents 'compare' clause in the '#pragma omp atomic' directive.

This represents the 'contains' clause in the '#pragma omp assume' directive.

This represents clause 'copyin' in the '#pragma omp ...' directives.

This represents clause 'copyprivate' in the '#pragma omp ...' directives.

This represents 'default' clause in the '#pragma omp ...' directive.

This represents 'defaultmap' clause in the '#pragma omp ...' directive.

This represents implicit clause 'depend' for the '#pragma omp task' directive.

This represents implicit clause 'depobj' for the '#pragma omp depobj' directive.

This represents 'destroy' clause in the '#pragma omp depobj' directive or the '#pragma omp interop' d...

This represents 'detach' clause in the '#pragma omp task' directive.

This represents 'device' clause in the '#pragma omp ...' directive.

This represents 'dist_schedule' clause in the '#pragma omp ...' directive.

This represents the 'doacross' clause for the '#pragma omp ordered' directive.

This represents 'dynamic_allocators' clause in the '#pragma omp requires' directive.

This represents clause 'exclusive' in the '#pragma omp scan' directive.

This represents 'fail' clause in the '#pragma omp atomic' directive.

This represents 'filter' clause in the '#pragma omp ...' directive.

This represents 'final' clause in the '#pragma omp ...' directive.

This represents clause 'firstprivate' in the '#pragma omp ...' directives.

This represents implicit clause 'flush' for the '#pragma omp flush' directive.

This represents clause 'from' in the '#pragma omp ...' directives.

Representation of the 'full' clause of the '#pragma omp unroll' directive.

This represents 'grainsize' clause in the '#pragma omp ...' directive.

This represents clause 'has_device_ptr' in the '#pragma omp ...' directives.

This represents 'hint' clause in the '#pragma omp ...' directive.

This represents the 'holds' clause in the '#pragma omp assume' directive.

This represents 'if' clause in the '#pragma omp ...' directive.

This represents clause 'in_reduction' in the '#pragma omp task' directives.

This represents clause 'inclusive' in the '#pragma omp scan' directive.

This represents the 'init' clause in '#pragma omp ...' directives.

This represents clause 'is_device_ptr' in the '#pragma omp ...' directives.

This represents clause 'lastprivate' in the '#pragma omp ...' directives.

This represents clause 'linear' in the '#pragma omp ...' directives.

This represents clause 'map' in the '#pragma omp ...' directives.

This represents 'mergeable' clause in the '#pragma omp ...' directive.

This represents 'message' clause in the '#pragma omp error' directive.

This represents the 'no_openmp' clause in the '#pragma omp assume' directive.

This represents the 'no_openmp_routines' clause in the '#pragma omp assume' directive.

This represents the 'no_parallelism' clause in the '#pragma omp assume' directive.

This represents 'nocontext' clause in the '#pragma omp ...' directive.

This represents 'nogroup' clause in the '#pragma omp ...' directive.

This represents clause 'nontemporal' in the '#pragma omp ...' directives.

This represents 'novariants' clause in the '#pragma omp ...' directive.

This represents 'nowait' clause in the '#pragma omp ...' directive.

This represents 'num_tasks' clause in the '#pragma omp ...' directive.

This represents 'num_teams' clause in the '#pragma omp ...' directive.

This represents 'num_threads' clause in the '#pragma omp ...' directive.

This represents 'order' clause in the '#pragma omp ...' directive.

This represents 'ordered' clause in the '#pragma omp ...' directive.

Representation of the 'partial' clause of the '#pragma omp unroll' directive.

This class represents the 'permutation' clause in the '#pragma omp interchange' directive.

This represents 'priority' clause in the '#pragma omp ...' directive.

This represents clause 'private' in the '#pragma omp ...' directives.

This represents 'proc_bind' clause in the '#pragma omp ...' directive.

This represents 'read' clause in the '#pragma omp atomic' directive.

This represents clause 'reduction' in the '#pragma omp ...' directives.

This represents 'relaxed' clause in the '#pragma omp atomic' directives.

This represents 'release' clause in the '#pragma omp atomic|flush' directives.

This represents 'reverse_offload' clause in the '#pragma omp requires' directive.

This represents 'simd' clause in the '#pragma omp ...' directive.

This represents 'safelen' clause in the '#pragma omp ...' directive.

This represents 'schedule' clause in the '#pragma omp ...' directive.

This represents 'seq_cst' clause in the '#pragma omp atomic|flush' directives.

This represents 'severity' clause in the '#pragma omp error' directive.

This represents 'simdlen' clause in the '#pragma omp ...' directive.

This represents the 'sizes' clause in the '#pragma omp tile' directive.

This represents clause 'task_reduction' in the '#pragma omp taskgroup' directives.

This represents 'thread_limit' clause in the '#pragma omp ...' directive.

This represents 'threads' clause in the '#pragma omp ...' directive.

This represents clause 'to' in the '#pragma omp ...' directives.

Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...

llvm::SmallVector< OMPTraitSet, 2 > Sets

The outermost level of selector sets.

This represents 'unified_address' clause in the '#pragma omp requires' directive.

This represents 'untied' clause in the '#pragma omp ...' directive.

This represents 'update' clause in the '#pragma omp atomic' directive.

This represents the 'use' clause in '#pragma omp ...' directives.

This represents clause 'use_device_addr' in the '#pragma omp ...' directives.

This represents clause 'use_device_ptr' in the '#pragma omp ...' directives.

This represents clause 'uses_allocators' in the '#pragma omp target'-based directives.

This represents 'weak' clause in the '#pragma omp atomic' directives.

This represents 'write' clause in the '#pragma omp atomic' directive.

This represents 'ompx_attribute' clause in a directive that might generate an outlined function.

This represents 'ompx_bare' clause in the '#pragma omp target teams ...' directive.

This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...' directive.

ObjCCategoryDecl - Represents a category declaration.

Iterator that walks over the list of categories, filtering out those that do not meet specific criter...

Represents an ObjC class declaration.

ObjCInterfaceDecl * getDefinition()

Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...

Wrapper for source info for ObjC interfaces.

SourceLocation getNameEndLoc() const

SourceLocation getNameLoc() const

Wraps an ObjCPointerType with source location information.

SourceLocation getStarLoc() const

bool hasBaseTypeAsWritten() const

SourceLocation getTypeArgsLAngleLoc() const

unsigned getNumTypeArgs() const

unsigned getNumProtocols() const

TypeSourceInfo * getTypeArgTInfo(unsigned i) const

SourceLocation getProtocolRAngleLoc() const

SourceLocation getProtocolLoc(unsigned i) const

SourceLocation getProtocolLAngleLoc() const

SourceLocation getTypeArgsRAngleLoc() const

const VersionTuple & getVersion() const

ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...

unsigned getNumProtocols() const

SourceLocation getProtocolLoc(unsigned i) const

SourceLocation getProtocolLAngleLoc() const

SourceLocation getProtocolRAngleLoc() const

Represents a clause with one or more 'var' objects, represented as an expr, as its arguments.

This is the base type for all OpenACC Clauses.

OpenCL supported extensions and optional core features.

SourceLocation getEllipsisLoc() const

SourceLocation getEllipsisLoc() const

SourceLocation getRParenLoc() const

SourceLocation getLParenLoc() const

Represents a parameter to a function.

SourceLocation getKWLoc() const

Wrapper for source info for pointers.

SourceLocation getStarLoc() const

Iteration over the preprocessed entities.

A record of the steps taken while preprocessing a source file, including the various preprocessing di...

MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)

Retrieve the macro definition that corresponds to the given MacroInfo.

const std::vector< SourceRange > & getSkippedRanges()

Retrieve all ranges that got skipped while preprocessing.

iterator local_begin()

Begin iterator for local, non-loaded, preprocessed entities.

iterator local_end()

End iterator for local, non-loaded, preprocessed entities.

PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...

std::vector< std::string > MacroIncludes

std::vector< std::string > Includes

bool WriteCommentListToPCH

Whether to write comment locations into the PCH when building it.

ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary

The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...

bool DetailedRecord

Whether we should maintain a detailed record of all macro definitions and expansions.

std::string ImplicitPCHInclude

The implicit PCH included at the start of the translation unit, or empty.

bool UsePredefines

Initialize the preprocessor with the compiler and target specific predefines.

std::vector< std::pair< std::string, bool > > Macros

Engages in a tight little dance with the lexer to efficiently preprocess tokens.

ArrayRef< ModuleMacro * > getLeafModuleMacros(const IdentifierInfo *II) const

Get the list of leaf (non-overridden) module macros for a name.

ArrayRef< PPConditionalInfo > getPreambleConditionalStack() const

SourceLocation getModuleImportLoc(Module *M) const

bool isRecordingPreamble() const

MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const

Given an identifier, return the latest non-imported macro directive for that identifier.

bool SawDateOrTime() const

Returns true if the preprocessor has seen a use of DATE or TIME in the file so far.

unsigned getCounterValue() const

SourceManager & getSourceManager() const

std::optional< PreambleSkipInfo > getPreambleSkipInfo() const

bool hasRecordedPreamble() const

const TargetInfo & getTargetInfo() const

FileManager & getFileManager() const

PreprocessorOptions & getPreprocessorOpts() const

Retrieve the preprocessor options used to initialize this preprocessor.

bool alreadyIncluded(FileEntryRef File) const

Return true if this header has already been included.

FileID getPredefinesFileID() const

Returns the FileID for the preprocessor predefines.

HeaderSearch & getHeaderSearchInfo() const

SmallVector< SourceLocation, 64 > serializeSafeBufferOptOutMap() const

IdentifierTable & getIdentifierTable()

const LangOptions & getLangOpts() const

PreprocessingRecord * getPreprocessingRecord() const

Retrieve the preprocessing record, or NULL if there is no preprocessing record.

DiagnosticsEngine & getDiagnostics() const

SourceLocation getPreambleRecordedPragmaAssumeNonNullLoc() const

Get the location of the recorded unterminated #pragma clang assume_nonnull begin in the preamble,...

DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const

Forwarding function for diagnostics.

A (possibly-)qualified type.

Wrapper of type source information for a type with non-trivial direct qualifiers.

The collection of all-type qualifiers we support.

SourceLocation getAmpAmpLoc() const

Represents a struct/union/class.

Wrapper for source info for record types.

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...

decl_type * getFirstDecl()

Return the first declaration of this declaration or itself if this is the only declaration.

Smart pointer class that efficiently represents Objective-C method names.

const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const

Retrieve the identifier at a given position in the selector.

void * getAsOpaquePtr() const

unsigned getNumArgs() const

void updateOutOfDateSelector(Selector Sel)

llvm::MapVector< Selector, SourceLocation > ReferencedSelectors

Method selectors used in a @selector expression.

GlobalMethodPool MethodPool

Method Pool - allows efficient lookup when typechecking messages to "id".

static uint32_t getRawEncoding(const AlignPackInfo &Info)

Sema - This implements semantic analysis and AST building for C.

llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates

Set containing all typedefs that are likely unused.

DelegatingCtorDeclsType DelegatingCtorDecls

All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...

Preprocessor & getPreprocessor() const

PragmaStack< FPOptionsOverride > FpPragmaStack

ExtVectorDeclsType ExtVectorDecls

ExtVectorDecls - This is a list all the extended vector types.

SourceLocation getOptimizeOffPragmaLocation() const

Get the location for the currently active "\#pragma clang optimize off". If this location is invalid,...

FPOptionsOverride CurFPFeatureOverrides()

LateParsedTemplateMapT LateParsedTemplateMap

UnusedFileScopedDeclsType UnusedFileScopedDecls

The set of file scoped decls seen so far that have not been used and must warn if not used.

SmallVector< const Decl * > DeclsWithEffectsToVerify

All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...

EnumDecl * getStdAlignValT() const

LazyDeclPtr StdBadAlloc

The C++ "std::bad_alloc" class, which is defined by the C++ standard library.

SmallVector< VTableUse, 16 > VTableUses

The list of vtables that are required but have not yet been materialized.

llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > LateParsedTemplateMapT

CXXRecordDecl * getStdBadAlloc() const

SourceLocation ImplicitMSInheritanceAttrLoc

Source location for newly created implicit MSInheritanceAttrs.

llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed

The set of classes whose vtables have been used within this translation unit, and a bit that will be ...

PragmaStack< AlignPackInfo > AlignPackStack

std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations

The queue of implicit template instantiations that are required and must be performed within the curr...

void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)

Obtain a sorted list of functions that are undefined but ODR-used.

LazyDeclPtr StdNamespace

The C++ "std" namespace, where the standard library resides.

std::deque< PendingImplicitInstantiation > PendingInstantiations

The queue of implicit template instantiations that are required but have not yet been performed.

TentativeDefinitionsType TentativeDefinitions

All the tentative definitions encountered in the TU.

const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const

Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.

OpenCLOptions & getOpenCLOptions()

NamespaceDecl * getStdNamespace() const

LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod

Controls member pointer representation format under the MS ABI.

llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers

WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.

LazyDeclPtr StdAlignValT

The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.

IdentifierResolver IdResolver

static RawLocEncoding encode(SourceLocation Loc, UIntTy BaseOffset, unsigned BaseModuleFileIndex, SourceLocationSequence *=nullptr)

This object establishes a SourceLocationSequence.

Serialized encoding of a sequence of SourceLocations.

Encodes a location in the source.

bool isValid() const

Return true if this is a valid SourceLocation object.

SourceLocation getLocWithOffset(IntTy Offset) const

Return a source location with the specified offset from this SourceLocation.

This class handles loading and caching of source files into memory.

FileID getFileID(SourceLocation SpellingLoc) const

Return the FileID for a SourceLocation.

DiagnosticsEngine & getDiagnostics() const

SourceLocation::UIntTy getNextLocalOffset() const

OptionalFileEntryRef getFileEntryRefForID(FileID FID) const

Returns the FileEntryRef for the provided FileID.

const SrcMgr::SLocEntry & getLocalSLocEntry(unsigned Index) const

Get a local SLocEntry. This is exposed for indexing.

FileManager & getFileManager() const

unsigned local_sloc_entry_size() const

Get the number of local SLocEntries we have.

SourceLocation getLocForEndOfFile(FileID FID) const

Return the source location corresponding to the last byte of the specified file.

FileID getMainFileID() const

Returns the FileID of the main source file.

unsigned getFileIDSize(FileID FID) const

The size of the SLocEntry that FID represents.

bool hasLineTable() const

Determine if the source manager has a line table.

bool isLoadedSourceLocation(SourceLocation Loc) const

Returns true if Loc came from a PCH/Module.

bool isLoadedFileID(FileID FID) const

Returns true if FID came from a PCH/Module.

SourceLocation getLocForStartOfFile(FileID FID) const

Return the source location corresponding to the first byte of the specified file.

LineTableInfo & getLineTable()

Retrieve the stored line table.

const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const

A trivial tuple used to represent a source range.

SourceLocation getEnd() const

SourceLocation getBegin() const

One instance of this struct is kept for every file loaded or used.

OptionalFileEntryRef ContentsEntry

References the file which the contents were actually loaded from.

unsigned IsTransient

True if this file may be transient, that is, if it might not exist at some later point in time when t...

std::optional< llvm::MemoryBufferRef > getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc=SourceLocation()) const

Returns the memory buffer for the associated content.

unsigned BufferOverridden

Indicates whether the buffer itself was provided to override the actual file contents.

OptionalFileEntryRef OrigEntry

Reference to the file entry representing this ContentCache.

Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...

SourceLocation getExpansionLocStart() const

bool isExpansionTokenRange() const

SourceLocation getSpellingLoc() const

bool isMacroArgExpansion() const

SourceLocation getExpansionLocEnd() const

Information about a FileID, basically just the logical file that it represents and include stack info...

const ContentCache & getContentCache() const

This is a discriminated union of FileInfo and ExpansionInfo.

SourceLocation::UIntTy getOffset() const

const FileInfo & getFile() const

const ExpansionInfo & getExpansion() const

An array of decls optimized for the common case of only containing one entry.

Wrapper for substituted template type parameters.

Wrapper for substituted template type parameters.

Represents the declaration of a struct/union/class/enum.

bool isCompleteDefinition() const

Return true if this decl has its body fully specified.

Exposes information about the current target.

Options for controlling the target.

std::string Triple

The name of the target triple to compile for.

std::vector< std::string > Features

The list of target specific features to enable or disable – this should be a list of strings starting...

std::string ABI

If given, the name of the target ABI to use.

std::string TuneCPU

If given, the name of the target CPU to tune code for.

std::string CPU

If given, the name of the target CPU to generate code for.

std::vector< std::string > FeaturesAsWritten

The list of target specific features to enable or disable, as written on the command line.

A template argument list.

unsigned size() const

Retrieve the number of template arguments in this template argument list.

const TemplateArgument & get(unsigned Idx) const

Retrieve the template argument at a given index.

Location wrapper for a TemplateArgument.

TemplateArgumentLocInfo getLocInfo() const

const TemplateArgument & getArgument() const

Expr * getAsExpr() const

Retrieve the template argument as an expression.

ArgKind

The kind of template argument we're storing.

@ Declaration

The template argument is a declaration that was provided for a pointer, reference,...

@ Template

The template argument is a template name that was provided for a template template parameter.

@ StructuralValue

The template argument is a non-type template argument that can't be represented by the special-case D...

@ Pack

The template argument is actually a parameter pack.

@ TemplateExpansion

The template argument is a pack expansion of a template name that was provided for a template templat...

@ NullPtr

The template argument is a null pointer or null pointer to member that was provided for a non-type te...

@ Type

The template argument is a type.

@ Null

Represents an empty template argument, e.g., one that has not been deduced.

@ Integral

The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...

@ Expression

The template argument is an expression, and we've not resolved it to one of the other forms yet,...

ArgKind getKind() const

Return the kind of stored template argument.

Stores a list of template parameters for a TemplateDecl and its derived classes.

Expr * getRequiresClause()

The constraint-expression of the associated requires-clause.

SourceLocation getRAngleLoc() const

SourceLocation getLAngleLoc() const

SourceLocation getTemplateLoc() const

unsigned getNumArgs() const

SourceLocation getLAngleLoc() const

TemplateArgumentLoc getArgLoc(unsigned i) const

SourceLocation getRAngleLoc() const

SourceLocation getTemplateNameLoc() const

SourceLocation getTemplateKeywordLoc() const

Wrapper for template type parameters.

Token - This structure provides full information about a lexed token.

IdentifierInfo * getIdentifierInfo() const

unsigned getFlags() const

Return the internal represtation of the flags.

SourceLocation getLocation() const

Return a source location identifier for the specified offset in the current file.

unsigned getLength() const

SourceLocation getAnnotationEndLoc() const

void * getAnnotationValue() const

tok::TokenKind getKind() const

bool isAnnotation() const

Return true if this is any of tok::annot_* kind tokens.

The top declaration context.

NamespaceDecl * getAnonymousNamespace() const

Base wrapper for a particular "section" of type source info.

QualType getType() const

Get the type for which this source info wrapper provides information.

TypeLoc getNextTypeLoc() const

Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...

TypeSourceInfo * getUnmodifiedTInfo() const

A container of type source information.

TypeLoc getTypeLoc() const

Return the TypeLoc wrapper for the type source info.

QualType getType() const

Return the type wrapped by this type source info.

SourceLocation getNameLoc() const

The base class of the type hierarchy.

TypeClass getTypeClass() const

Base class for declarations which introduce a typedef-name.

Wrapper for source info for typedefs.

SourceLocation getLParenLoc() const

SourceLocation getRParenLoc() const

SourceLocation getTypeofLoc() const

SourceLocation getKWLoc() const

SourceLocation getRParenLoc() const

TypeSourceInfo * getUnderlyingTInfo() const

SourceLocation getLParenLoc() const

The iterator over UnresolvedSets.

Wrapper for source info for unresolved typename using decls.

Wrapper for source info for types used via transparent aliases.

Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...

Represents a variable declaration or definition.

EvaluatedStmt * getEvaluatedStmt() const

const Expr * getInit() const

APValue * getEvaluatedValue() const

Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...

Declaration of a variable template.

Represents a variable template specialization, which refers to a variable template with a given set o...

SourceLocation getNameLoc() const

SourceLocation getLocation() const

Retrieve the location at which this variable was captured.

SourceLocation getEllipsisLoc() const

Retrieve the source location of the ellipsis, whose presence indicates that the capture is a pack exp...

void writeQualifiers(Qualifiers value)

A key used when looking up entities by DeclarationName.

Information about a module that has been loaded by the ASTReader.

serialization::PreprocessedEntityID BasePreprocessedEntityID

Base preprocessed entity ID for preprocessed entities local to this module.

serialization::SelectorID BaseSelectorID

Base selector ID for selectors local to this module.

unsigned LocalNumSubmodules

The number of submodules in this module.

bool isModule() const

Is this a module file for a module (rather than a PCH or similar).

unsigned NumPreprocessedEntities

unsigned Index

The index of this module in the list of modules.

serialization::SubmoduleID BaseSubmoduleID

Base submodule ID for submodules local to this module.

std::string FileName

The file name of the module file.

SourceLocation::UIntTy SLocEntryBaseOffset

The base offset in the source manager's view of this module.

unsigned LocalNumMacros

The number of macros in this AST file.

unsigned LocalNumSelectors

The number of selectors new to this file.

ModuleKind Kind

The type of this module.

std::string ModuleName

The name of the module.

serialization::MacroID BaseMacroID

Base macro ID for macros local to this module.

Writer for the on-disk hash table.

A type index; the type ID with the qualifier bits removed.

uint32_t getModuleFileIndex() const

TypeID asTypeID(unsigned FastQuals) const

uint64_t getValue() const

Class that performs name lookup into a DeclContext stored in an AST file.

Class that performs lookup to specialized decls.

const unsigned int LOCAL_REDECLARATIONS

Record code for a list of local redeclarations of a declaration.

TypeCode

Record codes for each kind of type.

const unsigned int DECL_UPDATES

Record of updates for a declaration that was modified after being deserialized.

@ PREDEF_TYPE_AUTO_RREF_DEDUCT

The "auto &&" deduction type.

@ PREDEF_TYPE_NULL_ID

The NULL type.

@ PREDEF_TYPE_AUTO_DEDUCT

The "auto" deduction type.

@ CTOR_INITIALIZER_MEMBER

@ CTOR_INITIALIZER_DELEGATING

@ CTOR_INITIALIZER_INDIRECT_MEMBER

@ DECL_EMPTY

An EmptyDecl record.

@ DECL_CXX_BASE_SPECIFIERS

A record containing CXXBaseSpecifiers.

@ DECL_CXX_RECORD

A CXXRecordDecl record.

@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION

A VarTemplatePartialSpecializationDecl record.

@ DECL_OMP_ALLOCATE

An OMPAllocateDcl record.

@ DECL_MS_PROPERTY

A MSPropertyDecl record.

@ DECL_REQUIRES_EXPR_BODY

A RequiresExprBodyDecl record.

@ DECL_STATIC_ASSERT

A StaticAssertDecl record.

@ DECL_INDIRECTFIELD

A IndirectFieldDecl record.

@ DECL_TEMPLATE_TEMPLATE_PARM

A TemplateTemplateParmDecl record.

@ DECL_IMPORT

An ImportDecl recording a module import.

@ DECL_ACCESS_SPEC

An AccessSpecDecl record.

@ DECL_OBJC_TYPE_PARAM

An ObjCTypeParamDecl record.

@ DECL_OBJC_CATEGORY_IMPL

A ObjCCategoryImplDecl record.

@ DECL_ENUM_CONSTANT

An EnumConstantDecl record.

@ DECL_PARM_VAR

A ParmVarDecl record.

@ DECL_TYPEDEF

A TypedefDecl record.

@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK

A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.

@ DECL_HLSL_BUFFER

A HLSLBufferDecl record.

@ DECL_NAMESPACE_ALIAS

A NamespaceAliasDecl record.

@ DECL_TYPEALIAS

A TypeAliasDecl record.

@ DECL_FUNCTION_TEMPLATE

A FunctionTemplateDecl record.

@ DECL_UNRESOLVED_USING_TYPENAME

An UnresolvedUsingTypenameDecl record.

@ DECL_CLASS_TEMPLATE_SPECIALIZATION

A ClassTemplateSpecializationDecl record.

@ DECL_FILE_SCOPE_ASM

A FileScopeAsmDecl record.

@ DECL_PARTIAL_SPECIALIZATIONS

@ DECL_CXX_CONSTRUCTOR

A CXXConstructorDecl record.

@ DECL_CXX_CONVERSION

A CXXConversionDecl record.

@ DECL_FIELD

A FieldDecl record.

@ DECL_LINKAGE_SPEC

A LinkageSpecDecl record.

@ DECL_CONTEXT_TU_LOCAL_VISIBLE

A record that stores the set of declarations that are only visible to the TU.

@ DECL_NAMESPACE

A NamespaceDecl record.

@ DECL_NON_TYPE_TEMPLATE_PARM

A NonTypeTemplateParmDecl record.

@ DECL_FUNCTION

A FunctionDecl record.

@ DECL_USING_DIRECTIVE

A UsingDirecitveDecl record.

@ DECL_RECORD

A RecordDecl record.

@ DECL_CONTEXT_LEXICAL

A record that stores the set of declarations that are lexically stored within a given DeclContext.

@ DECL_BLOCK

A BlockDecl record.

@ DECL_UNRESOLVED_USING_VALUE

An UnresolvedUsingValueDecl record.

@ DECL_TYPE_ALIAS_TEMPLATE

A TypeAliasTemplateDecl record.

@ DECL_CXX_CTOR_INITIALIZERS

A record containing CXXCtorInitializers.

@ DECL_OBJC_CATEGORY

A ObjCCategoryDecl record.

@ DECL_VAR

A VarDecl record.

@ DECL_USING

A UsingDecl record.

@ DECL_OBJC_PROTOCOL

A ObjCProtocolDecl record.

@ DECL_TEMPLATE_TYPE_PARM

A TemplateTypeParmDecl record.

@ DECL_VAR_TEMPLATE_SPECIALIZATION

A VarTemplateSpecializationDecl record.

@ DECL_OBJC_IMPLEMENTATION

A ObjCImplementationDecl record.

@ DECL_OBJC_COMPATIBLE_ALIAS

A ObjCCompatibleAliasDecl record.

@ DECL_FRIEND_TEMPLATE

A FriendTemplateDecl record.

@ DECL_PRAGMA_DETECT_MISMATCH

A PragmaDetectMismatchDecl record.

@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK

A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.

@ DECL_OBJC_AT_DEFS_FIELD

A ObjCAtDefsFieldDecl record.

@ DECL_IMPLICIT_PARAM

An ImplicitParamDecl record.

@ DECL_FRIEND

A FriendDecl record.

@ DECL_CXX_METHOD

A CXXMethodDecl record.

@ DECL_EXPORT

An ExportDecl record.

@ DECL_PRAGMA_COMMENT

A PragmaCommentDecl record.

@ DECL_ENUM

An EnumDecl record.

@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE

A record containing the set of declarations that are only visible from DeclContext in the same module...

@ DECL_OMP_DECLARE_REDUCTION

An OMPDeclareReductionDecl record.

@ DECL_OMP_THREADPRIVATE

An OMPThreadPrivateDecl record.

@ DECL_OBJC_METHOD

A ObjCMethodDecl record.

@ DECL_CXX_DESTRUCTOR

A CXXDestructorDecl record.

@ DECL_OMP_CAPTUREDEXPR

An OMPCapturedExprDecl record.

@ DECL_CLASS_TEMPLATE

A ClassTemplateDecl record.

@ DECL_USING_SHADOW

A UsingShadowDecl record.

@ DECL_CONCEPT

A ConceptDecl record.

@ DECL_OBJC_IVAR

A ObjCIvarDecl record.

@ DECL_OBJC_PROPERTY

A ObjCPropertyDecl record.

@ DECL_OBJC_INTERFACE

A ObjCInterfaceDecl record.

@ DECL_VAR_TEMPLATE

A VarTemplateDecl record.

@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION

A ClassTemplatePartialSpecializationDecl record.

@ DECL_CONTEXT_VISIBLE

A record that stores the set of declarations that are visible from a given DeclContext.

@ DECL_OBJC_PROPERTY_IMPL

A ObjCPropertyImplDecl record.

@ TYPE_EXT_QUAL

An ExtQualType record.

@ EXPR_DESIGNATED_INIT

A DesignatedInitExpr record.

@ EXPR_COMPOUND_LITERAL

A CompoundLiteralExpr record.

@ EXPR_OBJC_IVAR_REF_EXPR

An ObjCIvarRefExpr record.

@ EXPR_MEMBER

A MemberExpr record.

@ EXPR_CXX_TEMPORARY_OBJECT

A CXXTemporaryObjectExpr record.

@ EXPR_CXX_UNRESOLVED_LOOKUP

@ EXPR_COMPOUND_ASSIGN_OPERATOR

A CompoundAssignOperator record.

@ EXPR_EXPR_WITH_CLEANUPS

@ EXPR_CXX_STATIC_CAST

A CXXStaticCastExpr record.

@ EXPR_OBJC_STRING_LITERAL

An ObjCStringLiteral record.

@ EXPR_VA_ARG

A VAArgExpr record.

@ EXPR_CXX_OPERATOR_CALL

A CXXOperatorCallExpr record.

@ STMT_OBJC_AT_TRY

An ObjCAtTryStmt record.

@ EXPR_CXX_UNRESOLVED_CONSTRUCT

@ EXPR_FIXEDPOINT_LITERAL

@ STMT_DO

A DoStmt record.

@ STMT_OBJC_CATCH

An ObjCAtCatchStmt record.

@ STMT_IF

An IfStmt record.

@ EXPR_CXX_EXPRESSION_TRAIT

@ EXPR_STRING_LITERAL

A StringLiteral record.

@ EXPR_IMPLICIT_CAST

An ImplicitCastExpr record.

@ STMT_GCCASM

A GCC-style AsmStmt record.

@ EXPR_IMAGINARY_LITERAL

An ImaginaryLiteral record.

@ STMT_WHILE

A WhileStmt record.

@ EXPR_STMT

A StmtExpr record.

@ EXPR_CXX_REINTERPRET_CAST

A CXXReinterpretCastExpr record.

@ EXPR_DESIGNATED_INIT_UPDATE

A DesignatedInitUpdateExpr record.

@ STMT_OBJC_AT_SYNCHRONIZED

An ObjCAtSynchronizedStmt record.

@ EXPR_CXX_PSEUDO_DESTRUCTOR

@ EXPR_CHARACTER_LITERAL

A CharacterLiteral record.

@ EXPR_OBJC_ENCODE

An ObjCEncodeExpr record.

@ EXPR_CSTYLE_CAST

A CStyleCastExpr record.

@ EXPR_OBJC_BOXED_EXPRESSION

@ EXPR_OBJC_BOOL_LITERAL

An ObjCBoolLiteralExpr record.

@ EXPR_CXX_BIND_TEMPORARY

@ EXPR_EXT_VECTOR_ELEMENT

An ExtVectorElementExpr record.

@ STMT_RETURN

A ReturnStmt record.

@ STMT_OBJC_FOR_COLLECTION

An ObjCForCollectionStmt record.

@ STMT_CONTINUE

A ContinueStmt record.

@ EXPR_PREDEFINED

A PredefinedExpr record.

@ EXPR_CXX_BOOL_LITERAL

A CXXBoolLiteralExpr record.

@ EXPR_PAREN_LIST

A ParenListExpr record.

@ EXPR_CXX_PAREN_LIST_INIT

A CXXParenListInitExpr record.

@ STMT_COMPOUND

A CompoundStmt record.

@ STMT_FOR

A ForStmt record.

@ STMT_ATTRIBUTED

An AttributedStmt record.

@ EXPR_CXX_REWRITTEN_BINARY_OPERATOR

A CXXRewrittenBinaryOperator record.

@ STMT_GOTO

A GotoStmt record.

@ EXPR_NO_INIT

An NoInitExpr record.

@ EXPR_OBJC_ARRAY_LITERAL

@ EXPR_OBJC_PROTOCOL_EXPR

An ObjCProtocolExpr record.

@ EXPR_CXX_CONSTRUCT

A CXXConstructExpr record.

@ EXPR_OBJC_DICTIONARY_LITERAL

@ EXPR_CXX_DYNAMIC_CAST

A CXXDynamicCastExpr record.

@ STMT_CXX_TRY

A CXXTryStmt record.

@ EXPR_GENERIC_SELECTION

A GenericSelectionExpr record.

@ EXPR_CALL

A CallExpr record.

@ EXPR_GNU_NULL

A GNUNullExpr record.

@ EXPR_BINARY_CONDITIONAL_OPERATOR

@ EXPR_OBJC_PROPERTY_REF_EXPR

An ObjCPropertyRefExpr record.

@ EXPR_CXX_CONST_CAST

A CXXConstCastExpr record.

@ STMT_REF_PTR

A reference to a previously [de]serialized Stmt record.

@ EXPR_OBJC_MESSAGE_EXPR

An ObjCMessageExpr record.

@ EXPR_CXX_DEPENDENT_SCOPE_DECL_REF

@ STMT_CASE

A CaseStmt record.

@ EXPR_FUNCTION_PARM_PACK

@ STMT_STOP

A marker record that indicates that we are at the end of an expression.

@ EXPR_CXX_NULL_PTR_LITERAL

@ STMT_MSASM

A MS-style AsmStmt record.

@ EXPR_CONDITIONAL_OPERATOR

A ConditionOperator record.

@ EXPR_BINARY_OPERATOR

A BinaryOperator record.

@ EXPR_CXX_STD_INITIALIZER_LIST

A CXXStdInitializerListExpr record.

@ EXPR_SHUFFLE_VECTOR

A ShuffleVectorExpr record.

@ STMT_OBJC_FINALLY

An ObjCAtFinallyStmt record.

@ EXPR_OBJC_SELECTOR_EXPR

An ObjCSelectorExpr record.

@ EXPR_FLOATING_LITERAL

A FloatingLiteral record.

@ EXPR_CXX_DEPENDENT_SCOPE_MEMBER

@ STMT_NULL_PTR

A NULL expression.

@ STMT_DEFAULT

A DefaultStmt record.

@ EXPR_CHOOSE

A ChooseExpr record.

@ STMT_NULL

A NullStmt record.

@ EXPR_DECL_REF

A DeclRefExpr record.

@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM

@ EXPR_INIT_LIST

An InitListExpr record.

@ EXPR_IMPLICIT_VALUE_INIT

An ImplicitValueInitExpr record.

@ EXPR_PAREN

A ParenExpr record.

@ STMT_LABEL

A LabelStmt record.

@ EXPR_CXX_FUNCTIONAL_CAST

A CXXFunctionalCastExpr record.

@ EXPR_USER_DEFINED_LITERAL

A UserDefinedLiteral record.

@ EXPR_INTEGER_LITERAL

An IntegerLiteral record.

@ EXPR_RESOLVED_UNEXPANDED_PACK

@ EXPR_MATERIALIZE_TEMPORARY

@ EXPR_CXX_MEMBER_CALL

A CXXMemberCallExpr record.

@ STMT_SWITCH

A SwitchStmt record.

@ STMT_DECL

A DeclStmt record.

@ EXPR_CXX_UNRESOLVED_MEMBER

@ EXPR_OBJC_KVC_REF_EXPR

UNUSED.

@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK

@ EXPR_CXX_SCALAR_VALUE_INIT

@ EXPR_SIZEOF_ALIGN_OF

A SizefAlignOfExpr record.

@ STMT_BREAK

A BreakStmt record.

@ STMT_OBJC_AT_THROW

An ObjCAtThrowStmt record.

@ EXPR_ADDR_LABEL

An AddrLabelExpr record.

@ STMT_CXX_FOR_RANGE

A CXXForRangeStmt record.

@ EXPR_CXX_ADDRSPACE_CAST

A CXXAddrspaceCastExpr record.

@ EXPR_ARRAY_SUBSCRIPT

An ArraySubscriptExpr record.

@ EXPR_UNARY_OPERATOR

A UnaryOperator record.

@ STMT_CXX_CATCH

A CXXCatchStmt record.

@ STMT_INDIRECT_GOTO

An IndirectGotoStmt record.

Defines the clang::TargetInfo interface.

bool isSystem(CharacteristicKind CK)

Determine whether a file / directory characteristic is for system code.

bool isModuleMap(CharacteristicKind CK)

Determine whether a file characteristic is for a module map.

bool LE(InterpState &S, CodePtr OpPC)

GlobalDeclID LazySpecializationInfo

uint64_t TypeID

An ID number that refers to a type in an AST file.

@ EXTENSION_METADATA

Metadata describing this particular extension.

@ SUBMODULE_EXCLUDED_HEADER

Specifies a header that has been explicitly excluded from this submodule.

@ SUBMODULE_TOPHEADER

Specifies a top-level header that falls into this (sub)module.

@ SUBMODULE_PRIVATE_TEXTUAL_HEADER

Specifies a header that is private to this submodule but must be textually included.

@ SUBMODULE_HEADER

Specifies a header that falls into this (sub)module.

@ SUBMODULE_EXPORT_AS

Specifies the name of the module that will eventually re-export the entities in this module.

@ SUBMODULE_UMBRELLA_DIR

Specifies an umbrella directory.

@ SUBMODULE_UMBRELLA_HEADER

Specifies the umbrella header used to create this module, if any.

@ SUBMODULE_METADATA

Metadata for submodules as a whole.

@ SUBMODULE_REQUIRES

Specifies a required feature.

@ SUBMODULE_PRIVATE_HEADER

Specifies a header that is private to this submodule.

@ SUBMODULE_IMPORTS

Specifies the submodules that are imported by this submodule.

@ SUBMODULE_CONFLICT

Specifies a conflict with another module.

@ SUBMODULE_INITIALIZERS

Specifies some declarations with initializers that must be emitted to initialize the module.

@ SUBMODULE_DEFINITION

Defines the major attributes of a submodule, including its name and parent.

@ SUBMODULE_LINK_LIBRARY

Specifies a library or framework to link against.

@ SUBMODULE_CONFIG_MACRO

Specifies a configuration macro for this module.

@ SUBMODULE_EXPORTS

Specifies the submodules that are re-exported from this submodule.

@ SUBMODULE_TEXTUAL_HEADER

Specifies a header that is part of the module but must be textually included.

@ SUBMODULE_AFFECTING_MODULES

Specifies affecting modules that were not imported.

TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT)

const unsigned int NUM_PREDEF_IDENT_IDS

The number of predefined identifier IDs.

uint32_t SubmoduleID

An ID number that refers to a submodule in a module file.

@ FILE_SYSTEM_OPTIONS

Record code for the filesystem options table.

@ TARGET_OPTIONS

Record code for the target options table.

@ PREPROCESSOR_OPTIONS

Record code for the preprocessor options table.

@ HEADER_SEARCH_OPTIONS

Record code for the headers search options table.

@ LANGUAGE_OPTIONS

Record code for the language options table.

uint32_t SelectorID

An ID number that refers to an ObjC selector in an AST file.

const unsigned int NUM_PREDEF_PP_ENTITY_IDS

The number of predefined preprocessed entity IDs.

uint32_t PreprocessedEntityID

An ID number that refers to an entity in the detailed preprocessing record.

const unsigned int NUM_PREDEF_SUBMODULE_IDS

The number of predefined submodule IDs.

@ SUBMODULE_BLOCK_ID

The block containing the submodule structure.

@ PREPROCESSOR_DETAIL_BLOCK_ID

The block containing the detailed preprocessing record.

@ AST_BLOCK_ID

The AST block, which acts as a container around the full AST block.

@ SOURCE_MANAGER_BLOCK_ID

The block containing information about the source manager.

@ CONTROL_BLOCK_ID

The control block, which contains all of the information that needs to be validated prior to committi...

@ DECLTYPES_BLOCK_ID

The block containing the definitions of all of the types and decls used within the AST file.

@ PREPROCESSOR_BLOCK_ID

The block containing information about the preprocessor.

@ COMMENTS_BLOCK_ID

The block containing comments.

@ UNHASHED_CONTROL_BLOCK_ID

A block with unhashed content.

@ EXTENSION_BLOCK_ID

A block containing a module file extension.

@ OPTIONS_BLOCK_ID

The block of configuration options, used to check that a module is being used in a configuration comp...

@ INPUT_FILES_BLOCK_ID

The block of input files, which were used as inputs to create this AST file.

unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)

Calculate a stable hash value for template arguments.

const unsigned VERSION_MINOR

AST file minor version number supported by this version of Clang.

@ SM_SLOC_FILE_ENTRY

Describes a source location entry (SLocEntry) for a file.

@ SM_SLOC_BUFFER_BLOB_COMPRESSED

Describes a zlib-compressed blob that contains the data for a buffer entry.

@ SM_SLOC_BUFFER_ENTRY

Describes a source location entry (SLocEntry) for a buffer.

@ SM_SLOC_BUFFER_BLOB

Describes a blob that contains the data for a buffer entry.

@ SM_SLOC_EXPANSION_ENTRY

Describes a source location entry (SLocEntry) for a macro expansion.

const unsigned int NUM_PREDEF_SELECTOR_IDS

The number of predefined selector IDs.

bool needsAnonymousDeclarationNumber(const NamedDecl *D)

Determine whether the given declaration needs an anonymous declaration number.

const unsigned VERSION_MAJOR

AST file major version number supported by this version of Clang.

DeclIDBase::DeclID DeclID

An ID number that refers to a declaration in an AST file.

@ PP_TOKEN

Describes one token.

@ PP_MACRO_FUNCTION_LIKE

A function-like macro definition.

@ PP_MACRO_OBJECT_LIKE

An object-like macro definition.

@ PP_MACRO_DIRECTIVE_HISTORY

The macro directives history for a particular identifier.

@ PP_MODULE_MACRO

A macro directive exported by a module.

void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)

Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...

@ MODULE_MAP_FILE

Record code for the module map file that was used to build this AST file.

@ MODULE_DIRECTORY

Record code for the module build directory.

@ ORIGINAL_FILE_ID

Record code for file ID of the file or buffer that was used to generate the AST file.

@ MODULE_NAME

Record code for the module name.

@ ORIGINAL_FILE

Record code for the original file that was used to generate the AST file, including both its file ID ...

@ INPUT_FILE_OFFSETS

Offsets into the input-files block where input files reside.

@ METADATA

AST file metadata, including the AST file version number and information about the compiler used to b...

@ DIAGNOSTIC_OPTIONS

Record code for the diagnostic options table.

@ HEADER_SEARCH_ENTRY_USAGE

Record code for the indices of used header search entries.

@ AST_BLOCK_HASH

Record code for the content hash of the AST block.

@ DIAG_PRAGMA_MAPPINGS

Record code for #pragma diagnostic mappings.

@ SIGNATURE

Record code for the signature that identifiers this AST file.

@ HEADER_SEARCH_PATHS

Record code for the headers search paths.

@ VFS_USAGE

Record code for the indices of used VFSs.

@ INPUT_FILE_HASH

The input file content hash.

@ INPUT_FILE

An input file.

const DeclContext * getDefinitiveDeclContext(const DeclContext *DC)

Retrieve the "definitive" declaration that provides all of the visible entries for the given declarat...

void updateModuleTimestamp(StringRef ModuleFilename)

@ PPD_INCLUSION_DIRECTIVE

Describes an inclusion directive within the preprocessing record.

@ PPD_MACRO_EXPANSION

Describes a macro expansion within the preprocessing record.

@ PPD_MACRO_DEFINITION

Describes a macro definition within the preprocessing record.

uint64_t IdentifierID

An ID number that refers to an identifier in an AST file.

const unsigned int NUM_PREDEF_MACRO_IDS

The number of predefined macro IDs.

@ DECL_UPDATE_OFFSETS

Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...

@ STATISTICS

Record code for the extra statistics we gather while generating an AST file.

@ FLOAT_CONTROL_PRAGMA_OPTIONS

Record code for #pragma float_control options.

@ KNOWN_NAMESPACES

Record code for the set of known namespaces, which are used for typo correction.

@ SPECIAL_TYPES

Record code for the set of non-builtin, special types.

@ PENDING_IMPLICIT_INSTANTIATIONS

Record code for pending implicit instantiations.

@ CXX_ADDED_TEMPLATE_SPECIALIZATION

@ TYPE_OFFSET

Record code for the offsets of each type.

@ DELEGATING_CTORS

The list of delegating constructor declarations.

@ PP_ASSUME_NONNULL_LOC

ID 66 used to be the list of included files.

@ EXT_VECTOR_DECLS

Record code for the set of ext_vector type names.

@ OPENCL_EXTENSIONS

Record code for enabled OpenCL extensions.

@ FP_PRAGMA_OPTIONS

Record code for floating point #pragma options.

@ PP_UNSAFE_BUFFER_USAGE

Record code for #pragma clang unsafe_buffer_usage begin/end.

@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION

@ DECLS_WITH_EFFECTS_TO_VERIFY

Record code for Sema's vector of functions/blocks with effects to be verified.

@ VTABLE_USES

Record code for the array of VTable uses.

@ LATE_PARSED_TEMPLATE

Record code for late parsed template functions.

@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS

Record code for the Decls to be checked for deferred diags.

@ DECL_OFFSET

Record code for the offsets of each decl.

@ SOURCE_MANAGER_LINE_TABLE

Record code for the source manager line table information, which stores information about #line direc...

@ PP_COUNTER_VALUE

The value of the next COUNTER to dispense.

@ DELETE_EXPRS_TO_ANALYZE

Delete expressions that will be analyzed later.

@ RELATED_DECLS_MAP

Record code for related declarations that have to be deserialized together from the same module.

@ UPDATE_VISIBLE

Record code for an update to a decl context's lookup table.

@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH

Number of unmatched #pragma clang cuda_force_host_device begin directives we've seen.

@ MACRO_OFFSET

Record code for the table of offsets of each macro ID.

@ PPD_ENTITIES_OFFSETS

Record code for the table of offsets to entries in the preprocessing record.

@ OPENCL_EXTENSION_DECLS

Record code for declarations associated with OpenCL extensions.

@ VTABLES_TO_EMIT

Record code for vtables to emit.

@ UPDATE_MODULE_LOCAL_VISIBLE

@ IDENTIFIER_OFFSET

Record code for the table of offsets of each identifier ID.

@ OBJC_CATEGORIES

Record code for the array of Objective-C categories (including extensions).

@ METHOD_POOL

Record code for the Objective-C method pool,.

@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD

Record code for lexical and visible block for delayed namespace in reduced BMI.

@ PP_CONDITIONAL_STACK

The stack of open #ifs/#ifdefs recorded in a preamble.

@ REFERENCED_SELECTOR_POOL

Record code for referenced selector pool.

@ SOURCE_LOCATION_OFFSETS

Record code for the table of offsets into the block of source-location information.

@ WEAK_UNDECLARED_IDENTIFIERS

Record code for weak undeclared identifiers.

@ UNDEFINED_BUT_USED

Record code for undefined but used functions and variables that need a definition in this TU.

@ FILE_SORTED_DECLS

Record code for a file sorted array of DeclIDs in a module.

@ MSSTRUCT_PRAGMA_OPTIONS

Record code for #pragma ms_struct options.

@ TENTATIVE_DEFINITIONS

Record code for the array of tentative definitions.

@ UPDATE_TU_LOCAL_VISIBLE

@ UNUSED_FILESCOPED_DECLS

Record code for the array of unused file scoped decls.

@ ALIGN_PACK_PRAGMA_OPTIONS

Record code for #pragma align/pack options.

@ IMPORTED_MODULES

Record code for an array of all of the (sub)modules that were imported by the AST file.

@ SELECTOR_OFFSETS

Record code for the table of offsets into the Objective-C method pool.

@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES

Record code for potentially unused local typedef names.

@ OPENCL_EXTENSION_TYPES

Record code for types associated with OpenCL extensions.

@ EAGERLY_DESERIALIZED_DECLS

Record code for the array of eagerly deserialized decls.

@ INTERESTING_IDENTIFIERS

A list of "interesting" identifiers.

@ HEADER_SEARCH_TABLE

Record code for header search information.

@ OBJC_CATEGORIES_MAP

Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...

@ METADATA_OLD_FORMAT

This is so that older clang versions, before the introduction of the control block,...

@ CUDA_SPECIAL_DECL_REFS

Record code for special CUDA declarations.

@ TU_UPDATE_LEXICAL

Record code for an update to the TU's lexically contained declarations.

@ PPD_SKIPPED_RANGES

A table of skipped ranges within the preprocessing record.

@ IDENTIFIER_TABLE

Record code for the identifier table.

@ SEMA_DECL_REFS

Record code for declarations that Sema keeps references of.

@ OPTIMIZE_PRAGMA_OPTIONS

Record code for #pragma optimize options.

@ MODULE_OFFSET_MAP

Record code for the remapping information used to relate loaded modules to the various offsets and ID...

@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS

Record code for #pragma ms_struct options.

uint32_t MacroID

An ID number that refers to a macro in an AST file.

unsigned ComputeHash(Selector Sel)

@ UPD_CXX_RESOLVED_DTOR_DELETE

@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER

@ UPD_CXX_DEDUCED_RETURN_TYPE

@ UPD_CXX_ADDED_IMPLICIT_MEMBER

@ UPD_DECL_MARKED_OPENMP_DECLARETARGET

@ UPD_CXX_POINT_OF_INSTANTIATION

@ UPD_CXX_RESOLVED_EXCEPTION_SPEC

@ UPD_CXX_ADDED_FUNCTION_DEFINITION

@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE

@ UPD_STATIC_LOCAL_NUMBER

@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT

@ UPD_ADDED_ATTR_TO_RECORD

@ UPD_DECL_MARKED_OPENMP_ALLOCATE

@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE

@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION

@ UPD_CXX_ADDED_VAR_DEFINITION

RangeSelector range(RangeSelector Begin, RangeSelector End)

DEPRECATED. Use enclose.

std::shared_ptr< MatchComputation< T > > Generator

The JSON file list parser is used to communicate input to InstallAPI.

@ NUM_OVERLOADED_OPERATORS

bool isTemplateInstantiation(TemplateSpecializationKind Kind)

Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...

@ Specialization

We are substituting template parameters for template arguments in order to form a template specializa...

bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)

@ LCK_ByCopy

Capturing by copy (a.k.a., by value)

@ LCK_ByRef

Capturing by reference.

@ LCK_VLAType

Capturing variable-length array type.

@ LCK_StarThis

Capturing the *this object by copy.

@ LCK_This

Capturing the *this object by reference.

@ Auto

'auto' clause, allowed on 'loop' directives.

@ Bind

'bind' clause, allowed on routine constructs.

@ Gang

'gang' clause, allowed on 'loop' and Combined constructs.

@ Wait

'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.

@ DevicePtr

'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.

@ PCopyOut

'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.

@ VectorLength

'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...

@ Async

'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.

@ PresentOrCreate

'create' clause alias 'present_or_create'.

@ Collapse

'collapse' clause, allowed on 'loop' and Combined constructs.

@ NoHost

'nohost' clause, allowed on 'routine' directives.

@ PresentOrCopy

'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.

@ DeviceNum

'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.

@ Private

'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...

@ Invalid

Represents an invalid clause, for the purposes of parsing.

@ Vector

'vector' clause, allowed on 'loop', Combined, and 'routine' directives.

@ Copy

'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.

@ Worker

'worker' clause, allowed on 'loop', Combined, and 'routine' directives.

@ Create

'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...

@ DeviceType

'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...

@ DefaultAsync

'default_async' clause, allowed on 'set' construct.

@ Attach

'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.

@ NumGangs

'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.

@ If

'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...

@ Default

'default' clause, allowed on parallel, serial, kernel (and compound) constructs.

@ UseDevice

'use_device' clause, allowed on 'host_data' construct.

@ NoCreate

'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.

@ PresentOrCopyOut

'copyout' clause alias 'present_or_copyout'.

@ Link

'link' clause, allowed on 'declare' construct.

@ Reduction

'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.

@ Self

'self' clause, allowed on Compute and Combined Constructs, plus 'update'.

@ CopyOut

'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...

@ Seq

'seq' clause, allowed on 'loop' and 'routine' directives.

@ FirstPrivate

'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...

@ Host

'host' clause, allowed on 'update' construct.

@ PCopy

'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.

@ Tile

'tile' clause, allowed on 'loop' and Combined constructs.

@ PCopyIn

'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.

@ DeviceResident

'device_resident' clause, allowed on the 'declare' construct.

@ PCreate

'create' clause alias 'pcreate'. Preserved for diagnostic purposes.

@ Present

'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.

@ DType

'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.

@ CopyIn

'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...

@ Device

'device' clause, allowed on the 'update' construct.

@ Independent

'independent' clause, allowed on 'loop' directives.

@ NumWorkers

'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...

@ IfPresent

'if_present' clause, allowed on 'host_data' and 'update' directives.

@ Detach

'detach' clause, allowed on the 'exit data' construct.

@ Delete

'delete' clause, allowed on the 'exit data' construct.

@ PresentOrCopyIn

'copyin' clause alias 'present_or_copyin'.

@ Finalize

'finalize' clause, allowed on 'exit data' directive.

static constexpr unsigned NumberOfOMPMapClauseModifiers

Number of allowed map-type-modifiers.

@ Internal

Internal linkage, which indicates that the entity can be referred to from within the translation unit...

@ Module

Module linkage, which indicates that the entity can be referred to from other translation units withi...

PredefinedDeclIDs

Predefined declaration IDs.

@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID

The internal '__NSConstantString' tag type.

@ PREDEF_DECL_COMMON_TYPE_ID

The internal '__builtin_common_type' template.

@ PREDEF_DECL_TRANSLATION_UNIT_ID

The translation unit.

@ PREDEF_DECL_TYPE_PACK_ELEMENT_ID

The internal '__type_pack_element' template.

@ PREDEF_DECL_OBJC_CLASS_ID

The Objective-C 'Class' type.

@ PREDEF_DECL_BUILTIN_MS_GUID_ID

The predeclared '_GUID' struct.

@ PREDEF_DECL_OBJC_INSTANCETYPE_ID

The internal 'instancetype' typedef.

@ PREDEF_DECL_OBJC_PROTOCOL_ID

The Objective-C 'Protocol' type.

@ PREDEF_DECL_UNSIGNED_INT_128_ID

The unsigned 128-bit integer type.

@ PREDEF_DECL_OBJC_SEL_ID

The Objective-C 'SEL' type.

@ PREDEF_DECL_INT_128_ID

The signed 128-bit integer type.

@ PREDEF_DECL_VA_LIST_TAG

The internal '__va_list_tag' struct, if any.

@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID

The internal '__builtin_ms_va_list' typedef.

@ PREDEF_DECL_CF_CONSTANT_STRING_ID

The internal '__NSConstantString' typedef.

@ PREDEF_DECL_BUILTIN_VA_LIST_ID

The internal '__builtin_va_list' typedef.

@ PREDEF_DECL_EXTERN_C_CONTEXT_ID

The extern "C" context.

@ PREDEF_DECL_OBJC_ID_ID

The Objective-C 'id' type.

@ PREDEF_DECL_MAKE_INTEGER_SEQ_ID

The internal '__make_integer_seq' template.

@ Property

The type of a property.

@ Result

The result type of a method or function.

bool CanElideDeclDef(const Decl *D)

If we can elide the definition of.

std::pair< IdentifierInfo *, SourceLocation > DeviceTypeArgument

static constexpr unsigned NumberOfOMPMotionModifiers

Number of allowed motion-modifiers.

std::optional< unsigned > getPrimaryModuleHash(const Module *M)

Calculate a hash value for the primary module name of the given module.

for(const auto &A :T->param_types())

const FunctionProtoType * T

std::string getClangFullRepositoryVersion()

Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...

@ TSK_ExplicitInstantiationDeclaration

This template specialization was instantiated from a template due to an explicit instantiation declar...

@ None

The alignment was not explicit in code.

@ Class

The "class" keyword introduces the elaborated-type-specifier.

Diagnostic wrappers for TextAPI types for error reporting.

__UINTPTR_TYPE__ uintptr_t

An unsigned integer type with the property that any valid pointer to void can be converted to this ty...

The signature of a module, which is a hash of the AST content.

static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)

static ASTFileSignature createDummy()

Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".

SourceLocation RAngleLoc

The source location of the right angle bracket ('>').

const TemplateArgumentLoc * getTemplateArgs() const

Retrieve the template arguments.

SourceLocation LAngleLoc

The source location of the left angle bracket ('<').

unsigned NumTemplateArgs

The number of template arguments in TemplateArgs.

DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...

SourceLocation getLoc() const

getLoc - Returns the main location of the declaration name.

DeclarationName getName() const

getName - Returns the embedded declaration name.

const DeclarationNameLoc & getInfo() const

Structure used to store a statement, the constant value to which it was evaluated (if any),...

Contains a late templated function.

FPOptions FPO

Floating-point options in the point of definition.

Decl * D

The template function declaration to be late parsed.

Data for list of allocators.

a linked list of methods with the same selector name but different signatures.

ObjCMethodList * getNext() const

A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...

TemplateParameterList ** TemplParamLists

A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...

NestedNameSpecifierLoc QualifierLoc

unsigned NumTemplParamLists

The number of "outer" template parameter lists.

Location information for a TemplateArgument.

SourceLocation getTemplateEllipsisLoc() const

NestedNameSpecifierLoc getTemplateQualifierLoc() const

TypeSourceInfo * getAsTypeSourceInfo() const

SourceLocation getTemplateNameLoc() const

Describes the categories of an Objective-C class.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4