Path: blob/main/contrib/llvm-project/clang/lib/Serialization/ASTWriterStmt.cpp
35233 views
//===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// Implements serialization for Statements and Expressions.10///11//===----------------------------------------------------------------------===//1213#include "clang/AST/ASTConcept.h"14#include "clang/AST/ASTContext.h"15#include "clang/AST/DeclCXX.h"16#include "clang/AST/DeclObjC.h"17#include "clang/AST/DeclTemplate.h"18#include "clang/AST/ExprOpenMP.h"19#include "clang/AST/StmtVisitor.h"20#include "clang/Lex/Token.h"21#include "clang/Serialization/ASTReader.h"22#include "clang/Serialization/ASTRecordWriter.h"23#include "llvm/Bitstream/BitstreamWriter.h"24using namespace clang;2526//===----------------------------------------------------------------------===//27// Statement/expression serialization28//===----------------------------------------------------------------------===//2930namespace clang {3132class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {33ASTWriter &Writer;34ASTRecordWriter Record;3536serialization::StmtCode Code;37unsigned AbbrevToUse;3839/// A helper that can help us to write a packed bit across function40/// calls. For example, we may write separate bits in separate functions:41///42/// void VisitA(A* a) {43/// Record.push_back(a->isSomething());44/// }45///46/// void Visitb(B *b) {47/// VisitA(b);48/// Record.push_back(b->isAnother());49/// }50///51/// In such cases, it'll be better if we can pack these 2 bits. We achieve52/// this by writing a zero value in `VisitA` and recorded that first and add53/// the new bit to the recorded value.54class PakedBitsWriter {55public:56PakedBitsWriter(ASTRecordWriter &Record) : RecordRef(Record) {}57~PakedBitsWriter() { assert(!CurrentIndex); }5859void addBit(bool Value) {60assert(CurrentIndex && "Writing Bits without recording first!");61PackingBits.addBit(Value);62}63void addBits(uint32_t Value, uint32_t BitsWidth) {64assert(CurrentIndex && "Writing Bits without recording first!");65PackingBits.addBits(Value, BitsWidth);66}6768void writeBits() {69if (!CurrentIndex)70return;7172RecordRef[*CurrentIndex] = (uint32_t)PackingBits;73CurrentIndex = std::nullopt;74PackingBits.reset(0);75}7677void updateBits() {78writeBits();7980CurrentIndex = RecordRef.size();81RecordRef.push_back(0);82}8384private:85BitsPacker PackingBits;86ASTRecordWriter &RecordRef;87std::optional<unsigned> CurrentIndex;88};8990PakedBitsWriter CurrentPackingBits;9192public:93ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)94: Writer(Writer), Record(Writer, Record),95Code(serialization::STMT_NULL_PTR), AbbrevToUse(0),96CurrentPackingBits(this->Record) {}9798ASTStmtWriter(const ASTStmtWriter&) = delete;99ASTStmtWriter &operator=(const ASTStmtWriter &) = delete;100101uint64_t Emit() {102CurrentPackingBits.writeBits();103assert(Code != serialization::STMT_NULL_PTR &&104"unhandled sub-statement writing AST file");105return Record.EmitStmt(Code, AbbrevToUse);106}107108void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &ArgInfo,109const TemplateArgumentLoc *Args);110111void VisitStmt(Stmt *S);112#define STMT(Type, Base) \113void Visit##Type(Type *);114#include "clang/AST/StmtNodes.inc"115};116}117118void ASTStmtWriter::AddTemplateKWAndArgsInfo(119const ASTTemplateKWAndArgsInfo &ArgInfo, const TemplateArgumentLoc *Args) {120Record.AddSourceLocation(ArgInfo.TemplateKWLoc);121Record.AddSourceLocation(ArgInfo.LAngleLoc);122Record.AddSourceLocation(ArgInfo.RAngleLoc);123for (unsigned i = 0; i != ArgInfo.NumTemplateArgs; ++i)124Record.AddTemplateArgumentLoc(Args[i]);125}126127void ASTStmtWriter::VisitStmt(Stmt *S) {128}129130void ASTStmtWriter::VisitNullStmt(NullStmt *S) {131VisitStmt(S);132Record.AddSourceLocation(S->getSemiLoc());133Record.push_back(S->NullStmtBits.HasLeadingEmptyMacro);134Code = serialization::STMT_NULL;135}136137void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {138VisitStmt(S);139140Record.push_back(S->size());141Record.push_back(S->hasStoredFPFeatures());142143for (auto *CS : S->body())144Record.AddStmt(CS);145if (S->hasStoredFPFeatures())146Record.push_back(S->getStoredFPFeatures().getAsOpaqueInt());147Record.AddSourceLocation(S->getLBracLoc());148Record.AddSourceLocation(S->getRBracLoc());149150if (!S->hasStoredFPFeatures())151AbbrevToUse = Writer.getCompoundStmtAbbrev();152153Code = serialization::STMT_COMPOUND;154}155156void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {157VisitStmt(S);158Record.push_back(Writer.getSwitchCaseID(S));159Record.AddSourceLocation(S->getKeywordLoc());160Record.AddSourceLocation(S->getColonLoc());161}162163void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {164VisitSwitchCase(S);165Record.push_back(S->caseStmtIsGNURange());166Record.AddStmt(S->getLHS());167Record.AddStmt(S->getSubStmt());168if (S->caseStmtIsGNURange()) {169Record.AddStmt(S->getRHS());170Record.AddSourceLocation(S->getEllipsisLoc());171}172Code = serialization::STMT_CASE;173}174175void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {176VisitSwitchCase(S);177Record.AddStmt(S->getSubStmt());178Code = serialization::STMT_DEFAULT;179}180181void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {182VisitStmt(S);183Record.push_back(S->isSideEntry());184Record.AddDeclRef(S->getDecl());185Record.AddStmt(S->getSubStmt());186Record.AddSourceLocation(S->getIdentLoc());187Code = serialization::STMT_LABEL;188}189190void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {191VisitStmt(S);192Record.push_back(S->getAttrs().size());193Record.AddAttributes(S->getAttrs());194Record.AddStmt(S->getSubStmt());195Record.AddSourceLocation(S->getAttrLoc());196Code = serialization::STMT_ATTRIBUTED;197}198199void ASTStmtWriter::VisitIfStmt(IfStmt *S) {200VisitStmt(S);201202bool HasElse = S->getElse() != nullptr;203bool HasVar = S->getConditionVariableDeclStmt() != nullptr;204bool HasInit = S->getInit() != nullptr;205206CurrentPackingBits.updateBits();207208CurrentPackingBits.addBit(HasElse);209CurrentPackingBits.addBit(HasVar);210CurrentPackingBits.addBit(HasInit);211Record.push_back(static_cast<uint64_t>(S->getStatementKind()));212Record.AddStmt(S->getCond());213Record.AddStmt(S->getThen());214if (HasElse)215Record.AddStmt(S->getElse());216if (HasVar)217Record.AddStmt(S->getConditionVariableDeclStmt());218if (HasInit)219Record.AddStmt(S->getInit());220221Record.AddSourceLocation(S->getIfLoc());222Record.AddSourceLocation(S->getLParenLoc());223Record.AddSourceLocation(S->getRParenLoc());224if (HasElse)225Record.AddSourceLocation(S->getElseLoc());226227Code = serialization::STMT_IF;228}229230void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {231VisitStmt(S);232233bool HasInit = S->getInit() != nullptr;234bool HasVar = S->getConditionVariableDeclStmt() != nullptr;235Record.push_back(HasInit);236Record.push_back(HasVar);237Record.push_back(S->isAllEnumCasesCovered());238239Record.AddStmt(S->getCond());240Record.AddStmt(S->getBody());241if (HasInit)242Record.AddStmt(S->getInit());243if (HasVar)244Record.AddStmt(S->getConditionVariableDeclStmt());245246Record.AddSourceLocation(S->getSwitchLoc());247Record.AddSourceLocation(S->getLParenLoc());248Record.AddSourceLocation(S->getRParenLoc());249250for (SwitchCase *SC = S->getSwitchCaseList(); SC;251SC = SC->getNextSwitchCase())252Record.push_back(Writer.RecordSwitchCaseID(SC));253Code = serialization::STMT_SWITCH;254}255256void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {257VisitStmt(S);258259bool HasVar = S->getConditionVariableDeclStmt() != nullptr;260Record.push_back(HasVar);261262Record.AddStmt(S->getCond());263Record.AddStmt(S->getBody());264if (HasVar)265Record.AddStmt(S->getConditionVariableDeclStmt());266267Record.AddSourceLocation(S->getWhileLoc());268Record.AddSourceLocation(S->getLParenLoc());269Record.AddSourceLocation(S->getRParenLoc());270Code = serialization::STMT_WHILE;271}272273void ASTStmtWriter::VisitDoStmt(DoStmt *S) {274VisitStmt(S);275Record.AddStmt(S->getCond());276Record.AddStmt(S->getBody());277Record.AddSourceLocation(S->getDoLoc());278Record.AddSourceLocation(S->getWhileLoc());279Record.AddSourceLocation(S->getRParenLoc());280Code = serialization::STMT_DO;281}282283void ASTStmtWriter::VisitForStmt(ForStmt *S) {284VisitStmt(S);285Record.AddStmt(S->getInit());286Record.AddStmt(S->getCond());287Record.AddStmt(S->getConditionVariableDeclStmt());288Record.AddStmt(S->getInc());289Record.AddStmt(S->getBody());290Record.AddSourceLocation(S->getForLoc());291Record.AddSourceLocation(S->getLParenLoc());292Record.AddSourceLocation(S->getRParenLoc());293Code = serialization::STMT_FOR;294}295296void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {297VisitStmt(S);298Record.AddDeclRef(S->getLabel());299Record.AddSourceLocation(S->getGotoLoc());300Record.AddSourceLocation(S->getLabelLoc());301Code = serialization::STMT_GOTO;302}303304void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {305VisitStmt(S);306Record.AddSourceLocation(S->getGotoLoc());307Record.AddSourceLocation(S->getStarLoc());308Record.AddStmt(S->getTarget());309Code = serialization::STMT_INDIRECT_GOTO;310}311312void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {313VisitStmt(S);314Record.AddSourceLocation(S->getContinueLoc());315Code = serialization::STMT_CONTINUE;316}317318void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {319VisitStmt(S);320Record.AddSourceLocation(S->getBreakLoc());321Code = serialization::STMT_BREAK;322}323324void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {325VisitStmt(S);326327bool HasNRVOCandidate = S->getNRVOCandidate() != nullptr;328Record.push_back(HasNRVOCandidate);329330Record.AddStmt(S->getRetValue());331if (HasNRVOCandidate)332Record.AddDeclRef(S->getNRVOCandidate());333334Record.AddSourceLocation(S->getReturnLoc());335Code = serialization::STMT_RETURN;336}337338void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {339VisitStmt(S);340Record.AddSourceLocation(S->getBeginLoc());341Record.AddSourceLocation(S->getEndLoc());342DeclGroupRef DG = S->getDeclGroup();343for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)344Record.AddDeclRef(*D);345Code = serialization::STMT_DECL;346}347348void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {349VisitStmt(S);350Record.push_back(S->getNumOutputs());351Record.push_back(S->getNumInputs());352Record.push_back(S->getNumClobbers());353Record.AddSourceLocation(S->getAsmLoc());354Record.push_back(S->isVolatile());355Record.push_back(S->isSimple());356}357358void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {359VisitAsmStmt(S);360Record.push_back(S->getNumLabels());361Record.AddSourceLocation(S->getRParenLoc());362Record.AddStmt(S->getAsmString());363364// Outputs365for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {366Record.AddIdentifierRef(S->getOutputIdentifier(I));367Record.AddStmt(S->getOutputConstraintLiteral(I));368Record.AddStmt(S->getOutputExpr(I));369}370371// Inputs372for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {373Record.AddIdentifierRef(S->getInputIdentifier(I));374Record.AddStmt(S->getInputConstraintLiteral(I));375Record.AddStmt(S->getInputExpr(I));376}377378// Clobbers379for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)380Record.AddStmt(S->getClobberStringLiteral(I));381382// Labels383for (unsigned I = 0, N = S->getNumLabels(); I != N; ++I) {384Record.AddIdentifierRef(S->getLabelIdentifier(I));385Record.AddStmt(S->getLabelExpr(I));386}387388Code = serialization::STMT_GCCASM;389}390391void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {392VisitAsmStmt(S);393Record.AddSourceLocation(S->getLBraceLoc());394Record.AddSourceLocation(S->getEndLoc());395Record.push_back(S->getNumAsmToks());396Record.AddString(S->getAsmString());397398// Tokens399for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {400// FIXME: Move this to ASTRecordWriter?401Writer.AddToken(S->getAsmToks()[I], Record.getRecordData());402}403404// Clobbers405for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {406Record.AddString(S->getClobber(I));407}408409// Outputs410for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {411Record.AddStmt(S->getOutputExpr(I));412Record.AddString(S->getOutputConstraint(I));413}414415// Inputs416for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {417Record.AddStmt(S->getInputExpr(I));418Record.AddString(S->getInputConstraint(I));419}420421Code = serialization::STMT_MSASM;422}423424void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *CoroStmt) {425VisitStmt(CoroStmt);426Record.push_back(CoroStmt->getParamMoves().size());427for (Stmt *S : CoroStmt->children())428Record.AddStmt(S);429Code = serialization::STMT_COROUTINE_BODY;430}431432void ASTStmtWriter::VisitCoreturnStmt(CoreturnStmt *S) {433VisitStmt(S);434Record.AddSourceLocation(S->getKeywordLoc());435Record.AddStmt(S->getOperand());436Record.AddStmt(S->getPromiseCall());437Record.push_back(S->isImplicit());438Code = serialization::STMT_CORETURN;439}440441void ASTStmtWriter::VisitCoroutineSuspendExpr(CoroutineSuspendExpr *E) {442VisitExpr(E);443Record.AddSourceLocation(E->getKeywordLoc());444for (Stmt *S : E->children())445Record.AddStmt(S);446Record.AddStmt(E->getOpaqueValue());447}448449void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *E) {450VisitCoroutineSuspendExpr(E);451Record.push_back(E->isImplicit());452Code = serialization::EXPR_COAWAIT;453}454455void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *E) {456VisitCoroutineSuspendExpr(E);457Code = serialization::EXPR_COYIELD;458}459460void ASTStmtWriter::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {461VisitExpr(E);462Record.AddSourceLocation(E->getKeywordLoc());463for (Stmt *S : E->children())464Record.AddStmt(S);465Code = serialization::EXPR_DEPENDENT_COAWAIT;466}467468static void469addConstraintSatisfaction(ASTRecordWriter &Record,470const ASTConstraintSatisfaction &Satisfaction) {471Record.push_back(Satisfaction.IsSatisfied);472Record.push_back(Satisfaction.ContainsErrors);473if (!Satisfaction.IsSatisfied) {474Record.push_back(Satisfaction.NumRecords);475for (const auto &DetailRecord : Satisfaction) {476auto *E = DetailRecord.dyn_cast<Expr *>();477Record.push_back(/* IsDiagnostic */ E == nullptr);478if (E)479Record.AddStmt(E);480else {481auto *Diag = DetailRecord.get<std::pair<SourceLocation, StringRef> *>();482Record.AddSourceLocation(Diag->first);483Record.AddString(Diag->second);484}485}486}487}488489static void490addSubstitutionDiagnostic(491ASTRecordWriter &Record,492const concepts::Requirement::SubstitutionDiagnostic *D) {493Record.AddString(D->SubstitutedEntity);494Record.AddSourceLocation(D->DiagLoc);495Record.AddString(D->DiagMessage);496}497498void ASTStmtWriter::VisitConceptSpecializationExpr(499ConceptSpecializationExpr *E) {500VisitExpr(E);501Record.AddDeclRef(E->getSpecializationDecl());502const ConceptReference *CR = E->getConceptReference();503Record.push_back(CR != nullptr);504if (CR)505Record.AddConceptReference(CR);506if (!E->isValueDependent())507addConstraintSatisfaction(Record, E->getSatisfaction());508509Code = serialization::EXPR_CONCEPT_SPECIALIZATION;510}511512void ASTStmtWriter::VisitRequiresExpr(RequiresExpr *E) {513VisitExpr(E);514Record.push_back(E->getLocalParameters().size());515Record.push_back(E->getRequirements().size());516Record.AddSourceLocation(E->RequiresExprBits.RequiresKWLoc);517Record.push_back(E->RequiresExprBits.IsSatisfied);518Record.AddDeclRef(E->getBody());519for (ParmVarDecl *P : E->getLocalParameters())520Record.AddDeclRef(P);521for (concepts::Requirement *R : E->getRequirements()) {522if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(R)) {523Record.push_back(concepts::Requirement::RK_Type);524Record.push_back(TypeReq->Status);525if (TypeReq->Status == concepts::TypeRequirement::SS_SubstitutionFailure)526addSubstitutionDiagnostic(Record, TypeReq->getSubstitutionDiagnostic());527else528Record.AddTypeSourceInfo(TypeReq->getType());529} else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(R)) {530Record.push_back(ExprReq->getKind());531Record.push_back(ExprReq->Status);532if (ExprReq->isExprSubstitutionFailure()) {533addSubstitutionDiagnostic(Record,534ExprReq->Value.get<concepts::Requirement::SubstitutionDiagnostic *>());535} else536Record.AddStmt(ExprReq->Value.get<Expr *>());537if (ExprReq->getKind() == concepts::Requirement::RK_Compound) {538Record.AddSourceLocation(ExprReq->NoexceptLoc);539const auto &RetReq = ExprReq->getReturnTypeRequirement();540if (RetReq.isSubstitutionFailure()) {541Record.push_back(2);542addSubstitutionDiagnostic(Record, RetReq.getSubstitutionDiagnostic());543} else if (RetReq.isTypeConstraint()) {544Record.push_back(1);545Record.AddTemplateParameterList(546RetReq.getTypeConstraintTemplateParameterList());547if (ExprReq->Status >=548concepts::ExprRequirement::SS_ConstraintsNotSatisfied)549Record.AddStmt(550ExprReq->getReturnTypeRequirementSubstitutedConstraintExpr());551} else {552assert(RetReq.isEmpty());553Record.push_back(0);554}555}556} else {557auto *NestedReq = cast<concepts::NestedRequirement>(R);558Record.push_back(concepts::Requirement::RK_Nested);559Record.push_back(NestedReq->hasInvalidConstraint());560if (NestedReq->hasInvalidConstraint()) {561Record.AddString(NestedReq->getInvalidConstraintEntity());562addConstraintSatisfaction(Record, *NestedReq->Satisfaction);563} else {564Record.AddStmt(NestedReq->getConstraintExpr());565if (!NestedReq->isDependent())566addConstraintSatisfaction(Record, *NestedReq->Satisfaction);567}568}569}570Record.AddSourceLocation(E->getLParenLoc());571Record.AddSourceLocation(E->getRParenLoc());572Record.AddSourceLocation(E->getEndLoc());573574Code = serialization::EXPR_REQUIRES;575}576577578void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {579VisitStmt(S);580// NumCaptures581Record.push_back(std::distance(S->capture_begin(), S->capture_end()));582583// CapturedDecl and captured region kind584Record.AddDeclRef(S->getCapturedDecl());585Record.push_back(S->getCapturedRegionKind());586587Record.AddDeclRef(S->getCapturedRecordDecl());588589// Capture inits590for (auto *I : S->capture_inits())591Record.AddStmt(I);592593// Body594Record.AddStmt(S->getCapturedStmt());595596// Captures597for (const auto &I : S->captures()) {598if (I.capturesThis() || I.capturesVariableArrayType())599Record.AddDeclRef(nullptr);600else601Record.AddDeclRef(I.getCapturedVar());602Record.push_back(I.getCaptureKind());603Record.AddSourceLocation(I.getLocation());604}605606Code = serialization::STMT_CAPTURED;607}608609void ASTStmtWriter::VisitExpr(Expr *E) {610VisitStmt(E);611612CurrentPackingBits.updateBits();613CurrentPackingBits.addBits(E->getDependence(), /*BitsWidth=*/5);614CurrentPackingBits.addBits(E->getValueKind(), /*BitsWidth=*/2);615CurrentPackingBits.addBits(E->getObjectKind(), /*BitsWidth=*/3);616617Record.AddTypeRef(E->getType());618}619620void ASTStmtWriter::VisitConstantExpr(ConstantExpr *E) {621VisitExpr(E);622Record.push_back(E->ConstantExprBits.ResultKind);623624Record.push_back(E->ConstantExprBits.APValueKind);625Record.push_back(E->ConstantExprBits.IsUnsigned);626Record.push_back(E->ConstantExprBits.BitWidth);627// HasCleanup not serialized since we can just query the APValue.628Record.push_back(E->ConstantExprBits.IsImmediateInvocation);629630switch (E->getResultStorageKind()) {631case ConstantResultStorageKind::None:632break;633case ConstantResultStorageKind::Int64:634Record.push_back(E->Int64Result());635break;636case ConstantResultStorageKind::APValue:637Record.AddAPValue(E->APValueResult());638break;639}640641Record.AddStmt(E->getSubExpr());642Code = serialization::EXPR_CONSTANT;643}644645void ASTStmtWriter::VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr *E) {646VisitExpr(E);647648Record.AddSourceLocation(E->getLocation());649Record.AddSourceLocation(E->getLParenLocation());650Record.AddSourceLocation(E->getRParenLocation());651Record.AddTypeSourceInfo(E->getTypeSourceInfo());652653Code = serialization::EXPR_SYCL_UNIQUE_STABLE_NAME;654}655656void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {657VisitExpr(E);658659bool HasFunctionName = E->getFunctionName() != nullptr;660Record.push_back(HasFunctionName);661Record.push_back(662llvm::to_underlying(E->getIdentKind())); // FIXME: stable encoding663Record.push_back(E->isTransparent());664Record.AddSourceLocation(E->getLocation());665if (HasFunctionName)666Record.AddStmt(E->getFunctionName());667Code = serialization::EXPR_PREDEFINED;668}669670void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {671VisitExpr(E);672673CurrentPackingBits.updateBits();674675CurrentPackingBits.addBit(E->hadMultipleCandidates());676CurrentPackingBits.addBit(E->refersToEnclosingVariableOrCapture());677CurrentPackingBits.addBits(E->isNonOdrUse(), /*Width=*/2);678CurrentPackingBits.addBit(E->isImmediateEscalating());679CurrentPackingBits.addBit(E->getDecl() != E->getFoundDecl());680CurrentPackingBits.addBit(E->hasQualifier());681CurrentPackingBits.addBit(E->hasTemplateKWAndArgsInfo());682683if (E->hasTemplateKWAndArgsInfo()) {684unsigned NumTemplateArgs = E->getNumTemplateArgs();685Record.push_back(NumTemplateArgs);686}687688DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());689690if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&691(E->getDecl() == E->getFoundDecl()) &&692nk == DeclarationName::Identifier && E->getObjectKind() == OK_Ordinary) {693AbbrevToUse = Writer.getDeclRefExprAbbrev();694}695696if (E->hasQualifier())697Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());698699if (E->getDecl() != E->getFoundDecl())700Record.AddDeclRef(E->getFoundDecl());701702if (E->hasTemplateKWAndArgsInfo())703AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),704E->getTrailingObjects<TemplateArgumentLoc>());705706Record.AddDeclRef(E->getDecl());707Record.AddSourceLocation(E->getLocation());708Record.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName());709Code = serialization::EXPR_DECL_REF;710}711712void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {713VisitExpr(E);714Record.AddSourceLocation(E->getLocation());715Record.AddAPInt(E->getValue());716717if (E->getValue().getBitWidth() == 32) {718AbbrevToUse = Writer.getIntegerLiteralAbbrev();719}720721Code = serialization::EXPR_INTEGER_LITERAL;722}723724void ASTStmtWriter::VisitFixedPointLiteral(FixedPointLiteral *E) {725VisitExpr(E);726Record.AddSourceLocation(E->getLocation());727Record.push_back(E->getScale());728Record.AddAPInt(E->getValue());729Code = serialization::EXPR_FIXEDPOINT_LITERAL;730}731732void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {733VisitExpr(E);734Record.push_back(E->getRawSemantics());735Record.push_back(E->isExact());736Record.AddAPFloat(E->getValue());737Record.AddSourceLocation(E->getLocation());738Code = serialization::EXPR_FLOATING_LITERAL;739}740741void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {742VisitExpr(E);743Record.AddStmt(E->getSubExpr());744Code = serialization::EXPR_IMAGINARY_LITERAL;745}746747void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {748VisitExpr(E);749750// Store the various bits of data of StringLiteral.751Record.push_back(E->getNumConcatenated());752Record.push_back(E->getLength());753Record.push_back(E->getCharByteWidth());754Record.push_back(llvm::to_underlying(E->getKind()));755Record.push_back(E->isPascal());756757// Store the trailing array of SourceLocation.758for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)759Record.AddSourceLocation(E->getStrTokenLoc(I));760761// Store the trailing array of char holding the string data.762StringRef StrData = E->getBytes();763for (unsigned I = 0, N = E->getByteLength(); I != N; ++I)764Record.push_back(StrData[I]);765766Code = serialization::EXPR_STRING_LITERAL;767}768769void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {770VisitExpr(E);771Record.push_back(E->getValue());772Record.AddSourceLocation(E->getLocation());773Record.push_back(llvm::to_underlying(E->getKind()));774775AbbrevToUse = Writer.getCharacterLiteralAbbrev();776777Code = serialization::EXPR_CHARACTER_LITERAL;778}779780void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {781VisitExpr(E);782Record.AddSourceLocation(E->getLParen());783Record.AddSourceLocation(E->getRParen());784Record.AddStmt(E->getSubExpr());785Code = serialization::EXPR_PAREN;786}787788void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {789VisitExpr(E);790Record.push_back(E->getNumExprs());791for (auto *SubStmt : E->exprs())792Record.AddStmt(SubStmt);793Record.AddSourceLocation(E->getLParenLoc());794Record.AddSourceLocation(E->getRParenLoc());795Code = serialization::EXPR_PAREN_LIST;796}797798void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {799VisitExpr(E);800bool HasFPFeatures = E->hasStoredFPFeatures();801// Write this first for easy access when deserializing, as they affect the802// size of the UnaryOperator.803CurrentPackingBits.addBit(HasFPFeatures);804Record.AddStmt(E->getSubExpr());805CurrentPackingBits.addBits(E->getOpcode(),806/*Width=*/5); // FIXME: stable encoding807Record.AddSourceLocation(E->getOperatorLoc());808CurrentPackingBits.addBit(E->canOverflow());809810if (HasFPFeatures)811Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());812Code = serialization::EXPR_UNARY_OPERATOR;813}814815void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {816VisitExpr(E);817Record.push_back(E->getNumComponents());818Record.push_back(E->getNumExpressions());819Record.AddSourceLocation(E->getOperatorLoc());820Record.AddSourceLocation(E->getRParenLoc());821Record.AddTypeSourceInfo(E->getTypeSourceInfo());822for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {823const OffsetOfNode &ON = E->getComponent(I);824Record.push_back(ON.getKind()); // FIXME: Stable encoding825Record.AddSourceLocation(ON.getSourceRange().getBegin());826Record.AddSourceLocation(ON.getSourceRange().getEnd());827switch (ON.getKind()) {828case OffsetOfNode::Array:829Record.push_back(ON.getArrayExprIndex());830break;831832case OffsetOfNode::Field:833Record.AddDeclRef(ON.getField());834break;835836case OffsetOfNode::Identifier:837Record.AddIdentifierRef(ON.getFieldName());838break;839840case OffsetOfNode::Base:841Record.AddCXXBaseSpecifier(*ON.getBase());842break;843}844}845for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)846Record.AddStmt(E->getIndexExpr(I));847Code = serialization::EXPR_OFFSETOF;848}849850void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {851VisitExpr(E);852Record.push_back(E->getKind());853if (E->isArgumentType())854Record.AddTypeSourceInfo(E->getArgumentTypeInfo());855else {856Record.push_back(0);857Record.AddStmt(E->getArgumentExpr());858}859Record.AddSourceLocation(E->getOperatorLoc());860Record.AddSourceLocation(E->getRParenLoc());861Code = serialization::EXPR_SIZEOF_ALIGN_OF;862}863864void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {865VisitExpr(E);866Record.AddStmt(E->getLHS());867Record.AddStmt(E->getRHS());868Record.AddSourceLocation(E->getRBracketLoc());869Code = serialization::EXPR_ARRAY_SUBSCRIPT;870}871872void ASTStmtWriter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {873VisitExpr(E);874Record.AddStmt(E->getBase());875Record.AddStmt(E->getRowIdx());876Record.AddStmt(E->getColumnIdx());877Record.AddSourceLocation(E->getRBracketLoc());878Code = serialization::EXPR_ARRAY_SUBSCRIPT;879}880881void ASTStmtWriter::VisitArraySectionExpr(ArraySectionExpr *E) {882VisitExpr(E);883Record.writeEnum(E->ASType);884Record.AddStmt(E->getBase());885Record.AddStmt(E->getLowerBound());886Record.AddStmt(E->getLength());887if (E->isOMPArraySection())888Record.AddStmt(E->getStride());889Record.AddSourceLocation(E->getColonLocFirst());890891if (E->isOMPArraySection())892Record.AddSourceLocation(E->getColonLocSecond());893894Record.AddSourceLocation(E->getRBracketLoc());895Code = serialization::EXPR_ARRAY_SECTION;896}897898void ASTStmtWriter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {899VisitExpr(E);900Record.push_back(E->getDimensions().size());901Record.AddStmt(E->getBase());902for (Expr *Dim : E->getDimensions())903Record.AddStmt(Dim);904for (SourceRange SR : E->getBracketsRanges())905Record.AddSourceRange(SR);906Record.AddSourceLocation(E->getLParenLoc());907Record.AddSourceLocation(E->getRParenLoc());908Code = serialization::EXPR_OMP_ARRAY_SHAPING;909}910911void ASTStmtWriter::VisitOMPIteratorExpr(OMPIteratorExpr *E) {912VisitExpr(E);913Record.push_back(E->numOfIterators());914Record.AddSourceLocation(E->getIteratorKwLoc());915Record.AddSourceLocation(E->getLParenLoc());916Record.AddSourceLocation(E->getRParenLoc());917for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {918Record.AddDeclRef(E->getIteratorDecl(I));919Record.AddSourceLocation(E->getAssignLoc(I));920OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);921Record.AddStmt(Range.Begin);922Record.AddStmt(Range.End);923Record.AddStmt(Range.Step);924Record.AddSourceLocation(E->getColonLoc(I));925if (Range.Step)926Record.AddSourceLocation(E->getSecondColonLoc(I));927// Serialize helpers928OMPIteratorHelperData &HD = E->getHelper(I);929Record.AddDeclRef(HD.CounterVD);930Record.AddStmt(HD.Upper);931Record.AddStmt(HD.Update);932Record.AddStmt(HD.CounterUpdate);933}934Code = serialization::EXPR_OMP_ITERATOR;935}936937void ASTStmtWriter::VisitCallExpr(CallExpr *E) {938VisitExpr(E);939940Record.push_back(E->getNumArgs());941CurrentPackingBits.updateBits();942CurrentPackingBits.addBit(static_cast<bool>(E->getADLCallKind()));943CurrentPackingBits.addBit(E->hasStoredFPFeatures());944945Record.AddSourceLocation(E->getRParenLoc());946Record.AddStmt(E->getCallee());947for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();948Arg != ArgEnd; ++Arg)949Record.AddStmt(*Arg);950951if (E->hasStoredFPFeatures())952Record.push_back(E->getFPFeatures().getAsOpaqueInt());953954if (!E->hasStoredFPFeatures() && !static_cast<bool>(E->getADLCallKind()) &&955E->getStmtClass() == Stmt::CallExprClass)956AbbrevToUse = Writer.getCallExprAbbrev();957958Code = serialization::EXPR_CALL;959}960961void ASTStmtWriter::VisitRecoveryExpr(RecoveryExpr *E) {962VisitExpr(E);963Record.push_back(std::distance(E->children().begin(), E->children().end()));964Record.AddSourceLocation(E->getBeginLoc());965Record.AddSourceLocation(E->getEndLoc());966for (Stmt *Child : E->children())967Record.AddStmt(Child);968Code = serialization::EXPR_RECOVERY;969}970971void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {972VisitExpr(E);973974bool HasQualifier = E->hasQualifier();975bool HasFoundDecl = E->hasFoundDecl();976bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo();977unsigned NumTemplateArgs = E->getNumTemplateArgs();978979// Write these first for easy access when deserializing, as they affect the980// size of the MemberExpr.981CurrentPackingBits.updateBits();982CurrentPackingBits.addBit(HasQualifier);983CurrentPackingBits.addBit(HasFoundDecl);984CurrentPackingBits.addBit(HasTemplateInfo);985Record.push_back(NumTemplateArgs);986987Record.AddStmt(E->getBase());988Record.AddDeclRef(E->getMemberDecl());989Record.AddDeclarationNameLoc(E->MemberDNLoc,990E->getMemberDecl()->getDeclName());991Record.AddSourceLocation(E->getMemberLoc());992CurrentPackingBits.addBit(E->isArrow());993CurrentPackingBits.addBit(E->hadMultipleCandidates());994CurrentPackingBits.addBits(E->isNonOdrUse(), /*Width=*/2);995Record.AddSourceLocation(E->getOperatorLoc());996997if (HasQualifier)998Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());9991000if (HasFoundDecl) {1001DeclAccessPair FoundDecl = E->getFoundDecl();1002Record.AddDeclRef(FoundDecl.getDecl());1003CurrentPackingBits.addBits(FoundDecl.getAccess(), /*BitWidth=*/2);1004}10051006if (HasTemplateInfo)1007AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),1008E->getTrailingObjects<TemplateArgumentLoc>());10091010Code = serialization::EXPR_MEMBER;1011}10121013void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {1014VisitExpr(E);1015Record.AddStmt(E->getBase());1016Record.AddSourceLocation(E->getIsaMemberLoc());1017Record.AddSourceLocation(E->getOpLoc());1018Record.push_back(E->isArrow());1019Code = serialization::EXPR_OBJC_ISA;1020}10211022void ASTStmtWriter::1023VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {1024VisitExpr(E);1025Record.AddStmt(E->getSubExpr());1026Record.push_back(E->shouldCopy());1027Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;1028}10291030void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {1031VisitExplicitCastExpr(E);1032Record.AddSourceLocation(E->getLParenLoc());1033Record.AddSourceLocation(E->getBridgeKeywordLoc());1034Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding1035Code = serialization::EXPR_OBJC_BRIDGED_CAST;1036}10371038void ASTStmtWriter::VisitCastExpr(CastExpr *E) {1039VisitExpr(E);10401041Record.push_back(E->path_size());1042CurrentPackingBits.updateBits();1043// 7 bits should be enough to store the casting kinds.1044CurrentPackingBits.addBits(E->getCastKind(), /*Width=*/7);1045CurrentPackingBits.addBit(E->hasStoredFPFeatures());1046Record.AddStmt(E->getSubExpr());10471048for (CastExpr::path_iterator1049PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)1050Record.AddCXXBaseSpecifier(**PI);10511052if (E->hasStoredFPFeatures())1053Record.push_back(E->getFPFeatures().getAsOpaqueInt());1054}10551056void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {1057VisitExpr(E);10581059// Write this first for easy access when deserializing, as they affect the1060// size of the UnaryOperator.1061CurrentPackingBits.updateBits();1062CurrentPackingBits.addBits(E->getOpcode(), /*Width=*/6);1063bool HasFPFeatures = E->hasStoredFPFeatures();1064CurrentPackingBits.addBit(HasFPFeatures);1065Record.AddStmt(E->getLHS());1066Record.AddStmt(E->getRHS());1067Record.AddSourceLocation(E->getOperatorLoc());1068if (HasFPFeatures)1069Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());10701071if (!HasFPFeatures && E->getValueKind() == VK_PRValue &&1072E->getObjectKind() == OK_Ordinary)1073AbbrevToUse = Writer.getBinaryOperatorAbbrev();10741075Code = serialization::EXPR_BINARY_OPERATOR;1076}10771078void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {1079VisitBinaryOperator(E);1080Record.AddTypeRef(E->getComputationLHSType());1081Record.AddTypeRef(E->getComputationResultType());10821083if (!E->hasStoredFPFeatures() && E->getValueKind() == VK_PRValue &&1084E->getObjectKind() == OK_Ordinary)1085AbbrevToUse = Writer.getCompoundAssignOperatorAbbrev();10861087Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;1088}10891090void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {1091VisitExpr(E);1092Record.AddStmt(E->getCond());1093Record.AddStmt(E->getLHS());1094Record.AddStmt(E->getRHS());1095Record.AddSourceLocation(E->getQuestionLoc());1096Record.AddSourceLocation(E->getColonLoc());1097Code = serialization::EXPR_CONDITIONAL_OPERATOR;1098}10991100void1101ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {1102VisitExpr(E);1103Record.AddStmt(E->getOpaqueValue());1104Record.AddStmt(E->getCommon());1105Record.AddStmt(E->getCond());1106Record.AddStmt(E->getTrueExpr());1107Record.AddStmt(E->getFalseExpr());1108Record.AddSourceLocation(E->getQuestionLoc());1109Record.AddSourceLocation(E->getColonLoc());1110Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;1111}11121113void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {1114VisitCastExpr(E);1115CurrentPackingBits.addBit(E->isPartOfExplicitCast());11161117if (E->path_size() == 0 && !E->hasStoredFPFeatures())1118AbbrevToUse = Writer.getExprImplicitCastAbbrev();11191120Code = serialization::EXPR_IMPLICIT_CAST;1121}11221123void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {1124VisitCastExpr(E);1125Record.AddTypeSourceInfo(E->getTypeInfoAsWritten());1126}11271128void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {1129VisitExplicitCastExpr(E);1130Record.AddSourceLocation(E->getLParenLoc());1131Record.AddSourceLocation(E->getRParenLoc());1132Code = serialization::EXPR_CSTYLE_CAST;1133}11341135void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {1136VisitExpr(E);1137Record.AddSourceLocation(E->getLParenLoc());1138Record.AddTypeSourceInfo(E->getTypeSourceInfo());1139Record.AddStmt(E->getInitializer());1140Record.push_back(E->isFileScope());1141Code = serialization::EXPR_COMPOUND_LITERAL;1142}11431144void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {1145VisitExpr(E);1146Record.AddStmt(E->getBase());1147Record.AddIdentifierRef(&E->getAccessor());1148Record.AddSourceLocation(E->getAccessorLoc());1149Code = serialization::EXPR_EXT_VECTOR_ELEMENT;1150}11511152void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {1153VisitExpr(E);1154// NOTE: only add the (possibly null) syntactic form.1155// No need to serialize the isSemanticForm flag and the semantic form.1156Record.AddStmt(E->getSyntacticForm());1157Record.AddSourceLocation(E->getLBraceLoc());1158Record.AddSourceLocation(E->getRBraceLoc());1159bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();1160Record.push_back(isArrayFiller);1161if (isArrayFiller)1162Record.AddStmt(E->getArrayFiller());1163else1164Record.AddDeclRef(E->getInitializedFieldInUnion());1165Record.push_back(E->hadArrayRangeDesignator());1166Record.push_back(E->getNumInits());1167if (isArrayFiller) {1168// ArrayFiller may have filled "holes" due to designated initializer.1169// Replace them by 0 to indicate that the filler goes in that place.1170Expr *filler = E->getArrayFiller();1171for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)1172Record.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);1173} else {1174for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)1175Record.AddStmt(E->getInit(I));1176}1177Code = serialization::EXPR_INIT_LIST;1178}11791180void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {1181VisitExpr(E);1182Record.push_back(E->getNumSubExprs());1183for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)1184Record.AddStmt(E->getSubExpr(I));1185Record.AddSourceLocation(E->getEqualOrColonLoc());1186Record.push_back(E->usesGNUSyntax());1187for (const DesignatedInitExpr::Designator &D : E->designators()) {1188if (D.isFieldDesignator()) {1189if (FieldDecl *Field = D.getFieldDecl()) {1190Record.push_back(serialization::DESIG_FIELD_DECL);1191Record.AddDeclRef(Field);1192} else {1193Record.push_back(serialization::DESIG_FIELD_NAME);1194Record.AddIdentifierRef(D.getFieldName());1195}1196Record.AddSourceLocation(D.getDotLoc());1197Record.AddSourceLocation(D.getFieldLoc());1198} else if (D.isArrayDesignator()) {1199Record.push_back(serialization::DESIG_ARRAY);1200Record.push_back(D.getArrayIndex());1201Record.AddSourceLocation(D.getLBracketLoc());1202Record.AddSourceLocation(D.getRBracketLoc());1203} else {1204assert(D.isArrayRangeDesignator() && "Unknown designator");1205Record.push_back(serialization::DESIG_ARRAY_RANGE);1206Record.push_back(D.getArrayIndex());1207Record.AddSourceLocation(D.getLBracketLoc());1208Record.AddSourceLocation(D.getEllipsisLoc());1209Record.AddSourceLocation(D.getRBracketLoc());1210}1211}1212Code = serialization::EXPR_DESIGNATED_INIT;1213}12141215void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {1216VisitExpr(E);1217Record.AddStmt(E->getBase());1218Record.AddStmt(E->getUpdater());1219Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;1220}12211222void ASTStmtWriter::VisitNoInitExpr(NoInitExpr *E) {1223VisitExpr(E);1224Code = serialization::EXPR_NO_INIT;1225}12261227void ASTStmtWriter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {1228VisitExpr(E);1229Record.AddStmt(E->SubExprs[0]);1230Record.AddStmt(E->SubExprs[1]);1231Code = serialization::EXPR_ARRAY_INIT_LOOP;1232}12331234void ASTStmtWriter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {1235VisitExpr(E);1236Code = serialization::EXPR_ARRAY_INIT_INDEX;1237}12381239void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {1240VisitExpr(E);1241Code = serialization::EXPR_IMPLICIT_VALUE_INIT;1242}12431244void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {1245VisitExpr(E);1246Record.AddStmt(E->getSubExpr());1247Record.AddTypeSourceInfo(E->getWrittenTypeInfo());1248Record.AddSourceLocation(E->getBuiltinLoc());1249Record.AddSourceLocation(E->getRParenLoc());1250Record.push_back(E->isMicrosoftABI());1251Code = serialization::EXPR_VA_ARG;1252}12531254void ASTStmtWriter::VisitSourceLocExpr(SourceLocExpr *E) {1255VisitExpr(E);1256Record.AddDeclRef(cast_or_null<Decl>(E->getParentContext()));1257Record.AddSourceLocation(E->getBeginLoc());1258Record.AddSourceLocation(E->getEndLoc());1259Record.push_back(llvm::to_underlying(E->getIdentKind()));1260Code = serialization::EXPR_SOURCE_LOC;1261}12621263void ASTStmtWriter::VisitEmbedExpr(EmbedExpr *E) {1264VisitExpr(E);1265Record.AddSourceLocation(E->getBeginLoc());1266Record.AddSourceLocation(E->getEndLoc());1267Record.AddStmt(E->getDataStringLiteral());1268Record.writeUInt32(E->getStartingElementPos());1269Record.writeUInt32(E->getDataElementCount());1270Code = serialization::EXPR_BUILTIN_PP_EMBED;1271}12721273void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {1274VisitExpr(E);1275Record.AddSourceLocation(E->getAmpAmpLoc());1276Record.AddSourceLocation(E->getLabelLoc());1277Record.AddDeclRef(E->getLabel());1278Code = serialization::EXPR_ADDR_LABEL;1279}12801281void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {1282VisitExpr(E);1283Record.AddStmt(E->getSubStmt());1284Record.AddSourceLocation(E->getLParenLoc());1285Record.AddSourceLocation(E->getRParenLoc());1286Record.push_back(E->getTemplateDepth());1287Code = serialization::EXPR_STMT;1288}12891290void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {1291VisitExpr(E);1292Record.AddStmt(E->getCond());1293Record.AddStmt(E->getLHS());1294Record.AddStmt(E->getRHS());1295Record.AddSourceLocation(E->getBuiltinLoc());1296Record.AddSourceLocation(E->getRParenLoc());1297Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());1298Code = serialization::EXPR_CHOOSE;1299}13001301void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {1302VisitExpr(E);1303Record.AddSourceLocation(E->getTokenLocation());1304Code = serialization::EXPR_GNU_NULL;1305}13061307void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {1308VisitExpr(E);1309Record.push_back(E->getNumSubExprs());1310for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)1311Record.AddStmt(E->getExpr(I));1312Record.AddSourceLocation(E->getBuiltinLoc());1313Record.AddSourceLocation(E->getRParenLoc());1314Code = serialization::EXPR_SHUFFLE_VECTOR;1315}13161317void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {1318VisitExpr(E);1319Record.AddSourceLocation(E->getBuiltinLoc());1320Record.AddSourceLocation(E->getRParenLoc());1321Record.AddTypeSourceInfo(E->getTypeSourceInfo());1322Record.AddStmt(E->getSrcExpr());1323Code = serialization::EXPR_CONVERT_VECTOR;1324}13251326void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {1327VisitExpr(E);1328Record.AddDeclRef(E->getBlockDecl());1329Code = serialization::EXPR_BLOCK;1330}13311332void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {1333VisitExpr(E);13341335Record.push_back(E->getNumAssocs());1336Record.push_back(E->isExprPredicate());1337Record.push_back(E->ResultIndex);1338Record.AddSourceLocation(E->getGenericLoc());1339Record.AddSourceLocation(E->getDefaultLoc());1340Record.AddSourceLocation(E->getRParenLoc());13411342Stmt **Stmts = E->getTrailingObjects<Stmt *>();1343// Add 1 to account for the controlling expression which is the first1344// expression in the trailing array of Stmt *. This is not needed for1345// the trailing array of TypeSourceInfo *.1346for (unsigned I = 0, N = E->getNumAssocs() + 1; I < N; ++I)1347Record.AddStmt(Stmts[I]);13481349TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();1350for (unsigned I = 0, N = E->getNumAssocs(); I < N; ++I)1351Record.AddTypeSourceInfo(TSIs[I]);13521353Code = serialization::EXPR_GENERIC_SELECTION;1354}13551356void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {1357VisitExpr(E);1358Record.push_back(E->getNumSemanticExprs());13591360// Push the result index. Currently, this needs to exactly match1361// the encoding used internally for ResultIndex.1362unsigned result = E->getResultExprIndex();1363result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);1364Record.push_back(result);13651366Record.AddStmt(E->getSyntacticForm());1367for (PseudoObjectExpr::semantics_iterator1368i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {1369Record.AddStmt(*i);1370}1371Code = serialization::EXPR_PSEUDO_OBJECT;1372}13731374void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {1375VisitExpr(E);1376Record.push_back(E->getOp());1377for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)1378Record.AddStmt(E->getSubExprs()[I]);1379Record.AddSourceLocation(E->getBuiltinLoc());1380Record.AddSourceLocation(E->getRParenLoc());1381Code = serialization::EXPR_ATOMIC;1382}13831384//===----------------------------------------------------------------------===//1385// Objective-C Expressions and Statements.1386//===----------------------------------------------------------------------===//13871388void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {1389VisitExpr(E);1390Record.AddStmt(E->getString());1391Record.AddSourceLocation(E->getAtLoc());1392Code = serialization::EXPR_OBJC_STRING_LITERAL;1393}13941395void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {1396VisitExpr(E);1397Record.AddStmt(E->getSubExpr());1398Record.AddDeclRef(E->getBoxingMethod());1399Record.AddSourceRange(E->getSourceRange());1400Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;1401}14021403void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {1404VisitExpr(E);1405Record.push_back(E->getNumElements());1406for (unsigned i = 0; i < E->getNumElements(); i++)1407Record.AddStmt(E->getElement(i));1408Record.AddDeclRef(E->getArrayWithObjectsMethod());1409Record.AddSourceRange(E->getSourceRange());1410Code = serialization::EXPR_OBJC_ARRAY_LITERAL;1411}14121413void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {1414VisitExpr(E);1415Record.push_back(E->getNumElements());1416Record.push_back(E->HasPackExpansions);1417for (unsigned i = 0; i < E->getNumElements(); i++) {1418ObjCDictionaryElement Element = E->getKeyValueElement(i);1419Record.AddStmt(Element.Key);1420Record.AddStmt(Element.Value);1421if (E->HasPackExpansions) {1422Record.AddSourceLocation(Element.EllipsisLoc);1423unsigned NumExpansions = 0;1424if (Element.NumExpansions)1425NumExpansions = *Element.NumExpansions + 1;1426Record.push_back(NumExpansions);1427}1428}14291430Record.AddDeclRef(E->getDictWithObjectsMethod());1431Record.AddSourceRange(E->getSourceRange());1432Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;1433}14341435void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {1436VisitExpr(E);1437Record.AddTypeSourceInfo(E->getEncodedTypeSourceInfo());1438Record.AddSourceLocation(E->getAtLoc());1439Record.AddSourceLocation(E->getRParenLoc());1440Code = serialization::EXPR_OBJC_ENCODE;1441}14421443void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {1444VisitExpr(E);1445Record.AddSelectorRef(E->getSelector());1446Record.AddSourceLocation(E->getAtLoc());1447Record.AddSourceLocation(E->getRParenLoc());1448Code = serialization::EXPR_OBJC_SELECTOR_EXPR;1449}14501451void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {1452VisitExpr(E);1453Record.AddDeclRef(E->getProtocol());1454Record.AddSourceLocation(E->getAtLoc());1455Record.AddSourceLocation(E->ProtoLoc);1456Record.AddSourceLocation(E->getRParenLoc());1457Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;1458}14591460void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {1461VisitExpr(E);1462Record.AddDeclRef(E->getDecl());1463Record.AddSourceLocation(E->getLocation());1464Record.AddSourceLocation(E->getOpLoc());1465Record.AddStmt(E->getBase());1466Record.push_back(E->isArrow());1467Record.push_back(E->isFreeIvar());1468Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;1469}14701471void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {1472VisitExpr(E);1473Record.push_back(E->SetterAndMethodRefFlags.getInt());1474Record.push_back(E->isImplicitProperty());1475if (E->isImplicitProperty()) {1476Record.AddDeclRef(E->getImplicitPropertyGetter());1477Record.AddDeclRef(E->getImplicitPropertySetter());1478} else {1479Record.AddDeclRef(E->getExplicitProperty());1480}1481Record.AddSourceLocation(E->getLocation());1482Record.AddSourceLocation(E->getReceiverLocation());1483if (E->isObjectReceiver()) {1484Record.push_back(0);1485Record.AddStmt(E->getBase());1486} else if (E->isSuperReceiver()) {1487Record.push_back(1);1488Record.AddTypeRef(E->getSuperReceiverType());1489} else {1490Record.push_back(2);1491Record.AddDeclRef(E->getClassReceiver());1492}14931494Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;1495}14961497void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {1498VisitExpr(E);1499Record.AddSourceLocation(E->getRBracket());1500Record.AddStmt(E->getBaseExpr());1501Record.AddStmt(E->getKeyExpr());1502Record.AddDeclRef(E->getAtIndexMethodDecl());1503Record.AddDeclRef(E->setAtIndexMethodDecl());15041505Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;1506}15071508void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {1509VisitExpr(E);1510Record.push_back(E->getNumArgs());1511Record.push_back(E->getNumStoredSelLocs());1512Record.push_back(E->SelLocsKind);1513Record.push_back(E->isDelegateInitCall());1514Record.push_back(E->IsImplicit);1515Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding1516switch (E->getReceiverKind()) {1517case ObjCMessageExpr::Instance:1518Record.AddStmt(E->getInstanceReceiver());1519break;15201521case ObjCMessageExpr::Class:1522Record.AddTypeSourceInfo(E->getClassReceiverTypeInfo());1523break;15241525case ObjCMessageExpr::SuperClass:1526case ObjCMessageExpr::SuperInstance:1527Record.AddTypeRef(E->getSuperType());1528Record.AddSourceLocation(E->getSuperLoc());1529break;1530}15311532if (E->getMethodDecl()) {1533Record.push_back(1);1534Record.AddDeclRef(E->getMethodDecl());1535} else {1536Record.push_back(0);1537Record.AddSelectorRef(E->getSelector());1538}15391540Record.AddSourceLocation(E->getLeftLoc());1541Record.AddSourceLocation(E->getRightLoc());15421543for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();1544Arg != ArgEnd; ++Arg)1545Record.AddStmt(*Arg);15461547SourceLocation *Locs = E->getStoredSelLocs();1548for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)1549Record.AddSourceLocation(Locs[i]);15501551Code = serialization::EXPR_OBJC_MESSAGE_EXPR;1552}15531554void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {1555VisitStmt(S);1556Record.AddStmt(S->getElement());1557Record.AddStmt(S->getCollection());1558Record.AddStmt(S->getBody());1559Record.AddSourceLocation(S->getForLoc());1560Record.AddSourceLocation(S->getRParenLoc());1561Code = serialization::STMT_OBJC_FOR_COLLECTION;1562}15631564void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {1565VisitStmt(S);1566Record.AddStmt(S->getCatchBody());1567Record.AddDeclRef(S->getCatchParamDecl());1568Record.AddSourceLocation(S->getAtCatchLoc());1569Record.AddSourceLocation(S->getRParenLoc());1570Code = serialization::STMT_OBJC_CATCH;1571}15721573void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {1574VisitStmt(S);1575Record.AddStmt(S->getFinallyBody());1576Record.AddSourceLocation(S->getAtFinallyLoc());1577Code = serialization::STMT_OBJC_FINALLY;1578}15791580void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {1581VisitStmt(S); // FIXME: no test coverage.1582Record.AddStmt(S->getSubStmt());1583Record.AddSourceLocation(S->getAtLoc());1584Code = serialization::STMT_OBJC_AUTORELEASE_POOL;1585}15861587void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {1588VisitStmt(S);1589Record.push_back(S->getNumCatchStmts());1590Record.push_back(S->getFinallyStmt() != nullptr);1591Record.AddStmt(S->getTryBody());1592for (ObjCAtCatchStmt *C : S->catch_stmts())1593Record.AddStmt(C);1594if (S->getFinallyStmt())1595Record.AddStmt(S->getFinallyStmt());1596Record.AddSourceLocation(S->getAtTryLoc());1597Code = serialization::STMT_OBJC_AT_TRY;1598}15991600void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {1601VisitStmt(S); // FIXME: no test coverage.1602Record.AddStmt(S->getSynchExpr());1603Record.AddStmt(S->getSynchBody());1604Record.AddSourceLocation(S->getAtSynchronizedLoc());1605Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;1606}16071608void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {1609VisitStmt(S); // FIXME: no test coverage.1610Record.AddStmt(S->getThrowExpr());1611Record.AddSourceLocation(S->getThrowLoc());1612Code = serialization::STMT_OBJC_AT_THROW;1613}16141615void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {1616VisitExpr(E);1617Record.push_back(E->getValue());1618Record.AddSourceLocation(E->getLocation());1619Code = serialization::EXPR_OBJC_BOOL_LITERAL;1620}16211622void ASTStmtWriter::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {1623VisitExpr(E);1624Record.AddSourceRange(E->getSourceRange());1625Record.AddVersionTuple(E->getVersion());1626Code = serialization::EXPR_OBJC_AVAILABILITY_CHECK;1627}16281629//===----------------------------------------------------------------------===//1630// C++ Expressions and Statements.1631//===----------------------------------------------------------------------===//16321633void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {1634VisitStmt(S);1635Record.AddSourceLocation(S->getCatchLoc());1636Record.AddDeclRef(S->getExceptionDecl());1637Record.AddStmt(S->getHandlerBlock());1638Code = serialization::STMT_CXX_CATCH;1639}16401641void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {1642VisitStmt(S);1643Record.push_back(S->getNumHandlers());1644Record.AddSourceLocation(S->getTryLoc());1645Record.AddStmt(S->getTryBlock());1646for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)1647Record.AddStmt(S->getHandler(i));1648Code = serialization::STMT_CXX_TRY;1649}16501651void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {1652VisitStmt(S);1653Record.AddSourceLocation(S->getForLoc());1654Record.AddSourceLocation(S->getCoawaitLoc());1655Record.AddSourceLocation(S->getColonLoc());1656Record.AddSourceLocation(S->getRParenLoc());1657Record.AddStmt(S->getInit());1658Record.AddStmt(S->getRangeStmt());1659Record.AddStmt(S->getBeginStmt());1660Record.AddStmt(S->getEndStmt());1661Record.AddStmt(S->getCond());1662Record.AddStmt(S->getInc());1663Record.AddStmt(S->getLoopVarStmt());1664Record.AddStmt(S->getBody());1665Code = serialization::STMT_CXX_FOR_RANGE;1666}16671668void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {1669VisitStmt(S);1670Record.AddSourceLocation(S->getKeywordLoc());1671Record.push_back(S->isIfExists());1672Record.AddNestedNameSpecifierLoc(S->getQualifierLoc());1673Record.AddDeclarationNameInfo(S->getNameInfo());1674Record.AddStmt(S->getSubStmt());1675Code = serialization::STMT_MS_DEPENDENT_EXISTS;1676}16771678void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {1679VisitCallExpr(E);1680Record.push_back(E->getOperator());1681Record.AddSourceRange(E->Range);16821683if (!E->hasStoredFPFeatures() && !static_cast<bool>(E->getADLCallKind()))1684AbbrevToUse = Writer.getCXXOperatorCallExprAbbrev();16851686Code = serialization::EXPR_CXX_OPERATOR_CALL;1687}16881689void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {1690VisitCallExpr(E);16911692if (!E->hasStoredFPFeatures() && !static_cast<bool>(E->getADLCallKind()))1693AbbrevToUse = Writer.getCXXMemberCallExprAbbrev();16941695Code = serialization::EXPR_CXX_MEMBER_CALL;1696}16971698void ASTStmtWriter::VisitCXXRewrittenBinaryOperator(1699CXXRewrittenBinaryOperator *E) {1700VisitExpr(E);1701Record.push_back(E->isReversed());1702Record.AddStmt(E->getSemanticForm());1703Code = serialization::EXPR_CXX_REWRITTEN_BINARY_OPERATOR;1704}17051706void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {1707VisitExpr(E);17081709Record.push_back(E->getNumArgs());1710Record.push_back(E->isElidable());1711Record.push_back(E->hadMultipleCandidates());1712Record.push_back(E->isListInitialization());1713Record.push_back(E->isStdInitListInitialization());1714Record.push_back(E->requiresZeroInitialization());1715Record.push_back(1716llvm::to_underlying(E->getConstructionKind())); // FIXME: stable encoding1717Record.push_back(E->isImmediateEscalating());1718Record.AddSourceLocation(E->getLocation());1719Record.AddDeclRef(E->getConstructor());1720Record.AddSourceRange(E->getParenOrBraceRange());17211722for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)1723Record.AddStmt(E->getArg(I));17241725Code = serialization::EXPR_CXX_CONSTRUCT;1726}17271728void ASTStmtWriter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {1729VisitExpr(E);1730Record.AddDeclRef(E->getConstructor());1731Record.AddSourceLocation(E->getLocation());1732Record.push_back(E->constructsVBase());1733Record.push_back(E->inheritedFromVBase());1734Code = serialization::EXPR_CXX_INHERITED_CTOR_INIT;1735}17361737void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {1738VisitCXXConstructExpr(E);1739Record.AddTypeSourceInfo(E->getTypeSourceInfo());1740Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;1741}17421743void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {1744VisitExpr(E);1745Record.push_back(E->LambdaExprBits.NumCaptures);1746Record.AddSourceRange(E->IntroducerRange);1747Record.push_back(E->LambdaExprBits.CaptureDefault); // FIXME: stable encoding1748Record.AddSourceLocation(E->CaptureDefaultLoc);1749Record.push_back(E->LambdaExprBits.ExplicitParams);1750Record.push_back(E->LambdaExprBits.ExplicitResultType);1751Record.AddSourceLocation(E->ClosingBrace);17521753// Add capture initializers.1754for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),1755CEnd = E->capture_init_end();1756C != CEnd; ++C) {1757Record.AddStmt(*C);1758}17591760// Don't serialize the body. It belongs to the call operator declaration.1761// LambdaExpr only stores a copy of the Stmt *.17621763Code = serialization::EXPR_LAMBDA;1764}17651766void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {1767VisitExpr(E);1768Record.AddStmt(E->getSubExpr());1769Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;1770}17711772void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {1773VisitExplicitCastExpr(E);1774Record.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()));1775CurrentPackingBits.addBit(E->getAngleBrackets().isValid());1776if (E->getAngleBrackets().isValid())1777Record.AddSourceRange(E->getAngleBrackets());1778}17791780void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {1781VisitCXXNamedCastExpr(E);1782Code = serialization::EXPR_CXX_STATIC_CAST;1783}17841785void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {1786VisitCXXNamedCastExpr(E);1787Code = serialization::EXPR_CXX_DYNAMIC_CAST;1788}17891790void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {1791VisitCXXNamedCastExpr(E);1792Code = serialization::EXPR_CXX_REINTERPRET_CAST;1793}17941795void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {1796VisitCXXNamedCastExpr(E);1797Code = serialization::EXPR_CXX_CONST_CAST;1798}17991800void ASTStmtWriter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {1801VisitCXXNamedCastExpr(E);1802Code = serialization::EXPR_CXX_ADDRSPACE_CAST;1803}18041805void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {1806VisitExplicitCastExpr(E);1807Record.AddSourceLocation(E->getLParenLoc());1808Record.AddSourceLocation(E->getRParenLoc());1809Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;1810}18111812void ASTStmtWriter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {1813VisitExplicitCastExpr(E);1814Record.AddSourceLocation(E->getBeginLoc());1815Record.AddSourceLocation(E->getEndLoc());1816Code = serialization::EXPR_BUILTIN_BIT_CAST;1817}18181819void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {1820VisitCallExpr(E);1821Record.AddSourceLocation(E->UDSuffixLoc);1822Code = serialization::EXPR_USER_DEFINED_LITERAL;1823}18241825void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {1826VisitExpr(E);1827Record.push_back(E->getValue());1828Record.AddSourceLocation(E->getLocation());1829Code = serialization::EXPR_CXX_BOOL_LITERAL;1830}18311832void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {1833VisitExpr(E);1834Record.AddSourceLocation(E->getLocation());1835Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;1836}18371838void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {1839VisitExpr(E);1840Record.AddSourceRange(E->getSourceRange());1841if (E->isTypeOperand()) {1842Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());1843Code = serialization::EXPR_CXX_TYPEID_TYPE;1844} else {1845Record.AddStmt(E->getExprOperand());1846Code = serialization::EXPR_CXX_TYPEID_EXPR;1847}1848}18491850void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {1851VisitExpr(E);1852Record.AddSourceLocation(E->getLocation());1853Record.push_back(E->isImplicit());1854Record.push_back(E->isCapturedByCopyInLambdaWithExplicitObjectParameter());18551856Code = serialization::EXPR_CXX_THIS;1857}18581859void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {1860VisitExpr(E);1861Record.AddSourceLocation(E->getThrowLoc());1862Record.AddStmt(E->getSubExpr());1863Record.push_back(E->isThrownVariableInScope());1864Code = serialization::EXPR_CXX_THROW;1865}18661867void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {1868VisitExpr(E);1869Record.AddDeclRef(E->getParam());1870Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));1871Record.AddSourceLocation(E->getUsedLocation());1872Record.push_back(E->hasRewrittenInit());1873if (E->hasRewrittenInit())1874Record.AddStmt(E->getRewrittenExpr());1875Code = serialization::EXPR_CXX_DEFAULT_ARG;1876}18771878void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {1879VisitExpr(E);1880Record.push_back(E->hasRewrittenInit());1881Record.AddDeclRef(E->getField());1882Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));1883Record.AddSourceLocation(E->getExprLoc());1884if (E->hasRewrittenInit())1885Record.AddStmt(E->getRewrittenExpr());1886Code = serialization::EXPR_CXX_DEFAULT_INIT;1887}18881889void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {1890VisitExpr(E);1891Record.AddCXXTemporary(E->getTemporary());1892Record.AddStmt(E->getSubExpr());1893Code = serialization::EXPR_CXX_BIND_TEMPORARY;1894}18951896void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {1897VisitExpr(E);1898Record.AddTypeSourceInfo(E->getTypeSourceInfo());1899Record.AddSourceLocation(E->getRParenLoc());1900Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;1901}19021903void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {1904VisitExpr(E);19051906Record.push_back(E->isArray());1907Record.push_back(E->hasInitializer());1908Record.push_back(E->getNumPlacementArgs());1909Record.push_back(E->isParenTypeId());19101911Record.push_back(E->isGlobalNew());1912Record.push_back(E->passAlignment());1913Record.push_back(E->doesUsualArrayDeleteWantSize());1914Record.push_back(E->CXXNewExprBits.HasInitializer);1915Record.push_back(E->CXXNewExprBits.StoredInitializationStyle);19161917Record.AddDeclRef(E->getOperatorNew());1918Record.AddDeclRef(E->getOperatorDelete());1919Record.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo());1920if (E->isParenTypeId())1921Record.AddSourceRange(E->getTypeIdParens());1922Record.AddSourceRange(E->getSourceRange());1923Record.AddSourceRange(E->getDirectInitRange());19241925for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), N = E->raw_arg_end();1926I != N; ++I)1927Record.AddStmt(*I);19281929Code = serialization::EXPR_CXX_NEW;1930}19311932void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {1933VisitExpr(E);1934Record.push_back(E->isGlobalDelete());1935Record.push_back(E->isArrayForm());1936Record.push_back(E->isArrayFormAsWritten());1937Record.push_back(E->doesUsualArrayDeleteWantSize());1938Record.AddDeclRef(E->getOperatorDelete());1939Record.AddStmt(E->getArgument());1940Record.AddSourceLocation(E->getBeginLoc());19411942Code = serialization::EXPR_CXX_DELETE;1943}19441945void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {1946VisitExpr(E);19471948Record.AddStmt(E->getBase());1949Record.push_back(E->isArrow());1950Record.AddSourceLocation(E->getOperatorLoc());1951Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());1952Record.AddTypeSourceInfo(E->getScopeTypeInfo());1953Record.AddSourceLocation(E->getColonColonLoc());1954Record.AddSourceLocation(E->getTildeLoc());19551956// PseudoDestructorTypeStorage.1957Record.AddIdentifierRef(E->getDestroyedTypeIdentifier());1958if (E->getDestroyedTypeIdentifier())1959Record.AddSourceLocation(E->getDestroyedTypeLoc());1960else1961Record.AddTypeSourceInfo(E->getDestroyedTypeInfo());19621963Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;1964}19651966void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {1967VisitExpr(E);1968Record.push_back(E->getNumObjects());1969for (auto &Obj : E->getObjects()) {1970if (auto *BD = Obj.dyn_cast<BlockDecl *>()) {1971Record.push_back(serialization::COK_Block);1972Record.AddDeclRef(BD);1973} else if (auto *CLE = Obj.dyn_cast<CompoundLiteralExpr *>()) {1974Record.push_back(serialization::COK_CompoundLiteral);1975Record.AddStmt(CLE);1976}1977}19781979Record.push_back(E->cleanupsHaveSideEffects());1980Record.AddStmt(E->getSubExpr());1981Code = serialization::EXPR_EXPR_WITH_CLEANUPS;1982}19831984void ASTStmtWriter::VisitCXXDependentScopeMemberExpr(1985CXXDependentScopeMemberExpr *E) {1986VisitExpr(E);19871988// Don't emit anything here (or if you do you will have to update1989// the corresponding deserialization function).1990Record.push_back(E->getNumTemplateArgs());1991CurrentPackingBits.updateBits();1992CurrentPackingBits.addBit(E->hasTemplateKWAndArgsInfo());1993CurrentPackingBits.addBit(E->hasFirstQualifierFoundInScope());19941995if (E->hasTemplateKWAndArgsInfo()) {1996const ASTTemplateKWAndArgsInfo &ArgInfo =1997*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();1998AddTemplateKWAndArgsInfo(ArgInfo,1999E->getTrailingObjects<TemplateArgumentLoc>());2000}20012002CurrentPackingBits.addBit(E->isArrow());20032004Record.AddTypeRef(E->getBaseType());2005Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());2006CurrentPackingBits.addBit(!E->isImplicitAccess());2007if (!E->isImplicitAccess())2008Record.AddStmt(E->getBase());20092010Record.AddSourceLocation(E->getOperatorLoc());20112012if (E->hasFirstQualifierFoundInScope())2013Record.AddDeclRef(E->getFirstQualifierFoundInScope());20142015Record.AddDeclarationNameInfo(E->MemberNameInfo);2016Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;2017}20182019void2020ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {2021VisitExpr(E);20222023// Don't emit anything here, HasTemplateKWAndArgsInfo must be2024// emitted first.2025CurrentPackingBits.addBit(2026E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo);20272028if (E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo) {2029const ASTTemplateKWAndArgsInfo &ArgInfo =2030*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();2031// 16 bits should be enought to store the number of args2032CurrentPackingBits.addBits(ArgInfo.NumTemplateArgs, /*Width=*/16);2033AddTemplateKWAndArgsInfo(ArgInfo,2034E->getTrailingObjects<TemplateArgumentLoc>());2035}20362037Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());2038Record.AddDeclarationNameInfo(E->NameInfo);2039Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;2040}20412042void2043ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {2044VisitExpr(E);2045Record.push_back(E->getNumArgs());2046for (CXXUnresolvedConstructExpr::arg_iterator2047ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)2048Record.AddStmt(*ArgI);2049Record.AddTypeSourceInfo(E->getTypeSourceInfo());2050Record.AddSourceLocation(E->getLParenLoc());2051Record.AddSourceLocation(E->getRParenLoc());2052Record.push_back(E->isListInitialization());2053Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;2054}20552056void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {2057VisitExpr(E);20582059Record.push_back(E->getNumDecls());20602061CurrentPackingBits.updateBits();2062CurrentPackingBits.addBit(E->hasTemplateKWAndArgsInfo());2063if (E->hasTemplateKWAndArgsInfo()) {2064const ASTTemplateKWAndArgsInfo &ArgInfo =2065*E->getTrailingASTTemplateKWAndArgsInfo();2066Record.push_back(ArgInfo.NumTemplateArgs);2067AddTemplateKWAndArgsInfo(ArgInfo, E->getTrailingTemplateArgumentLoc());2068}20692070for (OverloadExpr::decls_iterator OvI = E->decls_begin(),2071OvE = E->decls_end();2072OvI != OvE; ++OvI) {2073Record.AddDeclRef(OvI.getDecl());2074Record.push_back(OvI.getAccess());2075}20762077Record.AddDeclarationNameInfo(E->getNameInfo());2078Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());2079}20802081void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {2082VisitOverloadExpr(E);2083CurrentPackingBits.addBit(E->isArrow());2084CurrentPackingBits.addBit(E->hasUnresolvedUsing());2085CurrentPackingBits.addBit(!E->isImplicitAccess());2086if (!E->isImplicitAccess())2087Record.AddStmt(E->getBase());20882089Record.AddSourceLocation(E->getOperatorLoc());20902091Record.AddTypeRef(E->getBaseType());2092Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;2093}20942095void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {2096VisitOverloadExpr(E);2097CurrentPackingBits.addBit(E->requiresADL());2098Record.AddDeclRef(E->getNamingClass());2099Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;21002101if (Writer.isWritingStdCXXNamedModules() && Writer.getChain()) {2102// Referencing all the possible declarations to make sure the change get2103// propagted.2104DeclarationName Name = E->getName();2105for (auto *Found :2106Writer.getASTContext().getTranslationUnitDecl()->lookup(Name))2107if (Found->isFromASTFile())2108Writer.GetDeclRef(Found);21092110llvm::SmallVector<NamespaceDecl *> ExternalNSs;2111Writer.getChain()->ReadKnownNamespaces(ExternalNSs);2112for (auto *NS : ExternalNSs)2113for (auto *Found : NS->lookup(Name))2114Writer.GetDeclRef(Found);2115}2116}21172118void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {2119VisitExpr(E);2120Record.push_back(E->TypeTraitExprBits.NumArgs);2121Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding2122Record.push_back(E->TypeTraitExprBits.Value);2123Record.AddSourceRange(E->getSourceRange());2124for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)2125Record.AddTypeSourceInfo(E->getArg(I));2126Code = serialization::EXPR_TYPE_TRAIT;2127}21282129void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {2130VisitExpr(E);2131Record.push_back(E->getTrait());2132Record.push_back(E->getValue());2133Record.AddSourceRange(E->getSourceRange());2134Record.AddTypeSourceInfo(E->getQueriedTypeSourceInfo());2135Record.AddStmt(E->getDimensionExpression());2136Code = serialization::EXPR_ARRAY_TYPE_TRAIT;2137}21382139void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {2140VisitExpr(E);2141Record.push_back(E->getTrait());2142Record.push_back(E->getValue());2143Record.AddSourceRange(E->getSourceRange());2144Record.AddStmt(E->getQueriedExpression());2145Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;2146}21472148void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {2149VisitExpr(E);2150Record.push_back(E->getValue());2151Record.AddSourceRange(E->getSourceRange());2152Record.AddStmt(E->getOperand());2153Code = serialization::EXPR_CXX_NOEXCEPT;2154}21552156void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {2157VisitExpr(E);2158Record.AddSourceLocation(E->getEllipsisLoc());2159Record.push_back(E->NumExpansions);2160Record.AddStmt(E->getPattern());2161Code = serialization::EXPR_PACK_EXPANSION;2162}21632164void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {2165VisitExpr(E);2166Record.push_back(E->isPartiallySubstituted() ? E->getPartialArguments().size()2167: 0);2168Record.AddSourceLocation(E->OperatorLoc);2169Record.AddSourceLocation(E->PackLoc);2170Record.AddSourceLocation(E->RParenLoc);2171Record.AddDeclRef(E->Pack);2172if (E->isPartiallySubstituted()) {2173for (const auto &TA : E->getPartialArguments())2174Record.AddTemplateArgument(TA);2175} else if (!E->isValueDependent()) {2176Record.push_back(E->getPackLength());2177}2178Code = serialization::EXPR_SIZEOF_PACK;2179}21802181void ASTStmtWriter::VisitPackIndexingExpr(PackIndexingExpr *E) {2182VisitExpr(E);2183Record.push_back(E->TransformedExpressions);2184Record.push_back(E->ExpandedToEmptyPack);2185Record.AddSourceLocation(E->getEllipsisLoc());2186Record.AddSourceLocation(E->getRSquareLoc());2187Record.AddStmt(E->getPackIdExpression());2188Record.AddStmt(E->getIndexExpr());2189for (Expr *Sub : E->getExpressions())2190Record.AddStmt(Sub);2191Code = serialization::EXPR_PACK_INDEXING;2192}21932194void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(2195SubstNonTypeTemplateParmExpr *E) {2196VisitExpr(E);2197Record.AddDeclRef(E->getAssociatedDecl());2198CurrentPackingBits.addBit(E->isReferenceParameter());2199CurrentPackingBits.addBits(E->getIndex(), /*Width=*/12);2200CurrentPackingBits.addBit((bool)E->getPackIndex());2201if (auto PackIndex = E->getPackIndex())2202Record.push_back(*PackIndex + 1);22032204Record.AddSourceLocation(E->getNameLoc());2205Record.AddStmt(E->getReplacement());2206Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;2207}22082209void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(2210SubstNonTypeTemplateParmPackExpr *E) {2211VisitExpr(E);2212Record.AddDeclRef(E->getAssociatedDecl());2213Record.push_back(E->getIndex());2214Record.AddTemplateArgument(E->getArgumentPack());2215Record.AddSourceLocation(E->getParameterPackLocation());2216Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;2217}22182219void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {2220VisitExpr(E);2221Record.push_back(E->getNumExpansions());2222Record.AddDeclRef(E->getParameterPack());2223Record.AddSourceLocation(E->getParameterPackLocation());2224for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();2225I != End; ++I)2226Record.AddDeclRef(*I);2227Code = serialization::EXPR_FUNCTION_PARM_PACK;2228}22292230void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {2231VisitExpr(E);2232Record.push_back(static_cast<bool>(E->getLifetimeExtendedTemporaryDecl()));2233if (E->getLifetimeExtendedTemporaryDecl())2234Record.AddDeclRef(E->getLifetimeExtendedTemporaryDecl());2235else2236Record.AddStmt(E->getSubExpr());2237Code = serialization::EXPR_MATERIALIZE_TEMPORARY;2238}22392240void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {2241VisitExpr(E);2242Record.AddSourceLocation(E->LParenLoc);2243Record.AddSourceLocation(E->EllipsisLoc);2244Record.AddSourceLocation(E->RParenLoc);2245Record.push_back(E->NumExpansions);2246Record.AddStmt(E->SubExprs[0]);2247Record.AddStmt(E->SubExprs[1]);2248Record.AddStmt(E->SubExprs[2]);2249Record.push_back(E->Opcode);2250Code = serialization::EXPR_CXX_FOLD;2251}22522253void ASTStmtWriter::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {2254VisitExpr(E);2255ArrayRef<Expr *> InitExprs = E->getInitExprs();2256Record.push_back(InitExprs.size());2257Record.push_back(E->getUserSpecifiedInitExprs().size());2258Record.AddSourceLocation(E->getInitLoc());2259Record.AddSourceLocation(E->getBeginLoc());2260Record.AddSourceLocation(E->getEndLoc());2261for (Expr *InitExpr : E->getInitExprs())2262Record.AddStmt(InitExpr);2263Expr *ArrayFiller = E->getArrayFiller();2264FieldDecl *UnionField = E->getInitializedFieldInUnion();2265bool HasArrayFillerOrUnionDecl = ArrayFiller || UnionField;2266Record.push_back(HasArrayFillerOrUnionDecl);2267if (HasArrayFillerOrUnionDecl) {2268Record.push_back(static_cast<bool>(ArrayFiller));2269if (ArrayFiller)2270Record.AddStmt(ArrayFiller);2271else2272Record.AddDeclRef(UnionField);2273}2274Code = serialization::EXPR_CXX_PAREN_LIST_INIT;2275}22762277void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {2278VisitExpr(E);2279Record.AddStmt(E->getSourceExpr());2280Record.AddSourceLocation(E->getLocation());2281Record.push_back(E->isUnique());2282Code = serialization::EXPR_OPAQUE_VALUE;2283}22842285void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {2286VisitExpr(E);2287// TODO: Figure out sane writer behavior for a TypoExpr, if necessary2288llvm_unreachable("Cannot write TypoExpr nodes");2289}22902291//===----------------------------------------------------------------------===//2292// CUDA Expressions and Statements.2293//===----------------------------------------------------------------------===//22942295void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {2296VisitCallExpr(E);2297Record.AddStmt(E->getConfig());2298Code = serialization::EXPR_CUDA_KERNEL_CALL;2299}23002301//===----------------------------------------------------------------------===//2302// OpenCL Expressions and Statements.2303//===----------------------------------------------------------------------===//2304void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {2305VisitExpr(E);2306Record.AddSourceLocation(E->getBuiltinLoc());2307Record.AddSourceLocation(E->getRParenLoc());2308Record.AddStmt(E->getSrcExpr());2309Code = serialization::EXPR_ASTYPE;2310}23112312//===----------------------------------------------------------------------===//2313// Microsoft Expressions and Statements.2314//===----------------------------------------------------------------------===//2315void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {2316VisitExpr(E);2317Record.push_back(E->isArrow());2318Record.AddStmt(E->getBaseExpr());2319Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());2320Record.AddSourceLocation(E->getMemberLoc());2321Record.AddDeclRef(E->getPropertyDecl());2322Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;2323}23242325void ASTStmtWriter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {2326VisitExpr(E);2327Record.AddStmt(E->getBase());2328Record.AddStmt(E->getIdx());2329Record.AddSourceLocation(E->getRBracketLoc());2330Code = serialization::EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR;2331}23322333void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {2334VisitExpr(E);2335Record.AddSourceRange(E->getSourceRange());2336Record.AddDeclRef(E->getGuidDecl());2337if (E->isTypeOperand()) {2338Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());2339Code = serialization::EXPR_CXX_UUIDOF_TYPE;2340} else {2341Record.AddStmt(E->getExprOperand());2342Code = serialization::EXPR_CXX_UUIDOF_EXPR;2343}2344}23452346void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {2347VisitStmt(S);2348Record.AddSourceLocation(S->getExceptLoc());2349Record.AddStmt(S->getFilterExpr());2350Record.AddStmt(S->getBlock());2351Code = serialization::STMT_SEH_EXCEPT;2352}23532354void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {2355VisitStmt(S);2356Record.AddSourceLocation(S->getFinallyLoc());2357Record.AddStmt(S->getBlock());2358Code = serialization::STMT_SEH_FINALLY;2359}23602361void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {2362VisitStmt(S);2363Record.push_back(S->getIsCXXTry());2364Record.AddSourceLocation(S->getTryLoc());2365Record.AddStmt(S->getTryBlock());2366Record.AddStmt(S->getHandler());2367Code = serialization::STMT_SEH_TRY;2368}23692370void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {2371VisitStmt(S);2372Record.AddSourceLocation(S->getLeaveLoc());2373Code = serialization::STMT_SEH_LEAVE;2374}23752376//===----------------------------------------------------------------------===//2377// OpenMP Directives.2378//===----------------------------------------------------------------------===//23792380void ASTStmtWriter::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {2381VisitStmt(S);2382for (Stmt *SubStmt : S->SubStmts)2383Record.AddStmt(SubStmt);2384Code = serialization::STMT_OMP_CANONICAL_LOOP;2385}23862387void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {2388Record.writeOMPChildren(E->Data);2389Record.AddSourceLocation(E->getBeginLoc());2390Record.AddSourceLocation(E->getEndLoc());2391Record.writeEnum(E->getMappedDirective());2392}23932394void ASTStmtWriter::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {2395VisitStmt(D);2396Record.writeUInt32(D->getLoopsNumber());2397VisitOMPExecutableDirective(D);2398}23992400void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {2401VisitOMPLoopBasedDirective(D);2402}24032404void ASTStmtWriter::VisitOMPMetaDirective(OMPMetaDirective *D) {2405VisitStmt(D);2406Record.push_back(D->getNumClauses());2407VisitOMPExecutableDirective(D);2408Code = serialization::STMT_OMP_META_DIRECTIVE;2409}24102411void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {2412VisitStmt(D);2413VisitOMPExecutableDirective(D);2414Record.writeBool(D->hasCancel());2415Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;2416}24172418void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {2419VisitOMPLoopDirective(D);2420Code = serialization::STMT_OMP_SIMD_DIRECTIVE;2421}24222423void ASTStmtWriter::VisitOMPLoopTransformationDirective(2424OMPLoopTransformationDirective *D) {2425VisitOMPLoopBasedDirective(D);2426Record.writeUInt32(D->getNumGeneratedLoops());2427}24282429void ASTStmtWriter::VisitOMPTileDirective(OMPTileDirective *D) {2430VisitOMPLoopTransformationDirective(D);2431Code = serialization::STMT_OMP_TILE_DIRECTIVE;2432}24332434void ASTStmtWriter::VisitOMPUnrollDirective(OMPUnrollDirective *D) {2435VisitOMPLoopTransformationDirective(D);2436Code = serialization::STMT_OMP_UNROLL_DIRECTIVE;2437}24382439void ASTStmtWriter::VisitOMPReverseDirective(OMPReverseDirective *D) {2440VisitOMPLoopTransformationDirective(D);2441Code = serialization::STMT_OMP_REVERSE_DIRECTIVE;2442}24432444void ASTStmtWriter::VisitOMPInterchangeDirective(OMPInterchangeDirective *D) {2445VisitOMPLoopTransformationDirective(D);2446Code = serialization::STMT_OMP_INTERCHANGE_DIRECTIVE;2447}24482449void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {2450VisitOMPLoopDirective(D);2451Record.writeBool(D->hasCancel());2452Code = serialization::STMT_OMP_FOR_DIRECTIVE;2453}24542455void ASTStmtWriter::VisitOMPForSimdDirective(OMPForSimdDirective *D) {2456VisitOMPLoopDirective(D);2457Code = serialization::STMT_OMP_FOR_SIMD_DIRECTIVE;2458}24592460void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {2461VisitStmt(D);2462VisitOMPExecutableDirective(D);2463Record.writeBool(D->hasCancel());2464Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;2465}24662467void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {2468VisitStmt(D);2469VisitOMPExecutableDirective(D);2470Record.writeBool(D->hasCancel());2471Code = serialization::STMT_OMP_SECTION_DIRECTIVE;2472}24732474void ASTStmtWriter::VisitOMPScopeDirective(OMPScopeDirective *D) {2475VisitStmt(D);2476VisitOMPExecutableDirective(D);2477Code = serialization::STMT_OMP_SCOPE_DIRECTIVE;2478}24792480void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {2481VisitStmt(D);2482VisitOMPExecutableDirective(D);2483Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;2484}24852486void ASTStmtWriter::VisitOMPMasterDirective(OMPMasterDirective *D) {2487VisitStmt(D);2488VisitOMPExecutableDirective(D);2489Code = serialization::STMT_OMP_MASTER_DIRECTIVE;2490}24912492void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {2493VisitStmt(D);2494VisitOMPExecutableDirective(D);2495Record.AddDeclarationNameInfo(D->getDirectiveName());2496Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;2497}24982499void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {2500VisitOMPLoopDirective(D);2501Record.writeBool(D->hasCancel());2502Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;2503}25042505void ASTStmtWriter::VisitOMPParallelForSimdDirective(2506OMPParallelForSimdDirective *D) {2507VisitOMPLoopDirective(D);2508Code = serialization::STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE;2509}25102511void ASTStmtWriter::VisitOMPParallelMasterDirective(2512OMPParallelMasterDirective *D) {2513VisitStmt(D);2514VisitOMPExecutableDirective(D);2515Code = serialization::STMT_OMP_PARALLEL_MASTER_DIRECTIVE;2516}25172518void ASTStmtWriter::VisitOMPParallelMaskedDirective(2519OMPParallelMaskedDirective *D) {2520VisitStmt(D);2521VisitOMPExecutableDirective(D);2522Code = serialization::STMT_OMP_PARALLEL_MASKED_DIRECTIVE;2523}25242525void ASTStmtWriter::VisitOMPParallelSectionsDirective(2526OMPParallelSectionsDirective *D) {2527VisitStmt(D);2528VisitOMPExecutableDirective(D);2529Record.writeBool(D->hasCancel());2530Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;2531}25322533void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {2534VisitStmt(D);2535VisitOMPExecutableDirective(D);2536Record.writeBool(D->hasCancel());2537Code = serialization::STMT_OMP_TASK_DIRECTIVE;2538}25392540void ASTStmtWriter::VisitOMPAtomicDirective(OMPAtomicDirective *D) {2541VisitStmt(D);2542VisitOMPExecutableDirective(D);2543Record.writeBool(D->isXLHSInRHSPart());2544Record.writeBool(D->isPostfixUpdate());2545Record.writeBool(D->isFailOnly());2546Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;2547}25482549void ASTStmtWriter::VisitOMPTargetDirective(OMPTargetDirective *D) {2550VisitStmt(D);2551VisitOMPExecutableDirective(D);2552Code = serialization::STMT_OMP_TARGET_DIRECTIVE;2553}25542555void ASTStmtWriter::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {2556VisitStmt(D);2557VisitOMPExecutableDirective(D);2558Code = serialization::STMT_OMP_TARGET_DATA_DIRECTIVE;2559}25602561void ASTStmtWriter::VisitOMPTargetEnterDataDirective(2562OMPTargetEnterDataDirective *D) {2563VisitStmt(D);2564VisitOMPExecutableDirective(D);2565Code = serialization::STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE;2566}25672568void ASTStmtWriter::VisitOMPTargetExitDataDirective(2569OMPTargetExitDataDirective *D) {2570VisitStmt(D);2571VisitOMPExecutableDirective(D);2572Code = serialization::STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE;2573}25742575void ASTStmtWriter::VisitOMPTargetParallelDirective(2576OMPTargetParallelDirective *D) {2577VisitStmt(D);2578VisitOMPExecutableDirective(D);2579Record.writeBool(D->hasCancel());2580Code = serialization::STMT_OMP_TARGET_PARALLEL_DIRECTIVE;2581}25822583void ASTStmtWriter::VisitOMPTargetParallelForDirective(2584OMPTargetParallelForDirective *D) {2585VisitOMPLoopDirective(D);2586Record.writeBool(D->hasCancel());2587Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE;2588}25892590void ASTStmtWriter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {2591VisitStmt(D);2592VisitOMPExecutableDirective(D);2593Code = serialization::STMT_OMP_TASKYIELD_DIRECTIVE;2594}25952596void ASTStmtWriter::VisitOMPBarrierDirective(OMPBarrierDirective *D) {2597VisitStmt(D);2598VisitOMPExecutableDirective(D);2599Code = serialization::STMT_OMP_BARRIER_DIRECTIVE;2600}26012602void ASTStmtWriter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {2603VisitStmt(D);2604Record.push_back(D->getNumClauses());2605VisitOMPExecutableDirective(D);2606Code = serialization::STMT_OMP_TASKWAIT_DIRECTIVE;2607}26082609void ASTStmtWriter::VisitOMPErrorDirective(OMPErrorDirective *D) {2610VisitStmt(D);2611Record.push_back(D->getNumClauses());2612VisitOMPExecutableDirective(D);2613Code = serialization::STMT_OMP_ERROR_DIRECTIVE;2614}26152616void ASTStmtWriter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {2617VisitStmt(D);2618VisitOMPExecutableDirective(D);2619Code = serialization::STMT_OMP_TASKGROUP_DIRECTIVE;2620}26212622void ASTStmtWriter::VisitOMPFlushDirective(OMPFlushDirective *D) {2623VisitStmt(D);2624VisitOMPExecutableDirective(D);2625Code = serialization::STMT_OMP_FLUSH_DIRECTIVE;2626}26272628void ASTStmtWriter::VisitOMPDepobjDirective(OMPDepobjDirective *D) {2629VisitStmt(D);2630VisitOMPExecutableDirective(D);2631Code = serialization::STMT_OMP_DEPOBJ_DIRECTIVE;2632}26332634void ASTStmtWriter::VisitOMPScanDirective(OMPScanDirective *D) {2635VisitStmt(D);2636VisitOMPExecutableDirective(D);2637Code = serialization::STMT_OMP_SCAN_DIRECTIVE;2638}26392640void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {2641VisitStmt(D);2642VisitOMPExecutableDirective(D);2643Code = serialization::STMT_OMP_ORDERED_DIRECTIVE;2644}26452646void ASTStmtWriter::VisitOMPTeamsDirective(OMPTeamsDirective *D) {2647VisitStmt(D);2648VisitOMPExecutableDirective(D);2649Code = serialization::STMT_OMP_TEAMS_DIRECTIVE;2650}26512652void ASTStmtWriter::VisitOMPCancellationPointDirective(2653OMPCancellationPointDirective *D) {2654VisitStmt(D);2655VisitOMPExecutableDirective(D);2656Record.writeEnum(D->getCancelRegion());2657Code = serialization::STMT_OMP_CANCELLATION_POINT_DIRECTIVE;2658}26592660void ASTStmtWriter::VisitOMPCancelDirective(OMPCancelDirective *D) {2661VisitStmt(D);2662VisitOMPExecutableDirective(D);2663Record.writeEnum(D->getCancelRegion());2664Code = serialization::STMT_OMP_CANCEL_DIRECTIVE;2665}26662667void ASTStmtWriter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {2668VisitOMPLoopDirective(D);2669Record.writeBool(D->hasCancel());2670Code = serialization::STMT_OMP_TASKLOOP_DIRECTIVE;2671}26722673void ASTStmtWriter::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {2674VisitOMPLoopDirective(D);2675Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;2676}26772678void ASTStmtWriter::VisitOMPMasterTaskLoopDirective(2679OMPMasterTaskLoopDirective *D) {2680VisitOMPLoopDirective(D);2681Record.writeBool(D->hasCancel());2682Code = serialization::STMT_OMP_MASTER_TASKLOOP_DIRECTIVE;2683}26842685void ASTStmtWriter::VisitOMPMaskedTaskLoopDirective(2686OMPMaskedTaskLoopDirective *D) {2687VisitOMPLoopDirective(D);2688Record.writeBool(D->hasCancel());2689Code = serialization::STMT_OMP_MASKED_TASKLOOP_DIRECTIVE;2690}26912692void ASTStmtWriter::VisitOMPMasterTaskLoopSimdDirective(2693OMPMasterTaskLoopSimdDirective *D) {2694VisitOMPLoopDirective(D);2695Code = serialization::STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE;2696}26972698void ASTStmtWriter::VisitOMPMaskedTaskLoopSimdDirective(2699OMPMaskedTaskLoopSimdDirective *D) {2700VisitOMPLoopDirective(D);2701Code = serialization::STMT_OMP_MASKED_TASKLOOP_SIMD_DIRECTIVE;2702}27032704void ASTStmtWriter::VisitOMPParallelMasterTaskLoopDirective(2705OMPParallelMasterTaskLoopDirective *D) {2706VisitOMPLoopDirective(D);2707Record.writeBool(D->hasCancel());2708Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE;2709}27102711void ASTStmtWriter::VisitOMPParallelMaskedTaskLoopDirective(2712OMPParallelMaskedTaskLoopDirective *D) {2713VisitOMPLoopDirective(D);2714Record.writeBool(D->hasCancel());2715Code = serialization::STMT_OMP_PARALLEL_MASKED_TASKLOOP_DIRECTIVE;2716}27172718void ASTStmtWriter::VisitOMPParallelMasterTaskLoopSimdDirective(2719OMPParallelMasterTaskLoopSimdDirective *D) {2720VisitOMPLoopDirective(D);2721Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE;2722}27232724void ASTStmtWriter::VisitOMPParallelMaskedTaskLoopSimdDirective(2725OMPParallelMaskedTaskLoopSimdDirective *D) {2726VisitOMPLoopDirective(D);2727Code = serialization::STMT_OMP_PARALLEL_MASKED_TASKLOOP_SIMD_DIRECTIVE;2728}27292730void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective *D) {2731VisitOMPLoopDirective(D);2732Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;2733}27342735void ASTStmtWriter::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {2736VisitStmt(D);2737VisitOMPExecutableDirective(D);2738Code = serialization::STMT_OMP_TARGET_UPDATE_DIRECTIVE;2739}27402741void ASTStmtWriter::VisitOMPDistributeParallelForDirective(2742OMPDistributeParallelForDirective *D) {2743VisitOMPLoopDirective(D);2744Record.writeBool(D->hasCancel());2745Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;2746}27472748void ASTStmtWriter::VisitOMPDistributeParallelForSimdDirective(2749OMPDistributeParallelForSimdDirective *D) {2750VisitOMPLoopDirective(D);2751Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;2752}27532754void ASTStmtWriter::VisitOMPDistributeSimdDirective(2755OMPDistributeSimdDirective *D) {2756VisitOMPLoopDirective(D);2757Code = serialization::STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE;2758}27592760void ASTStmtWriter::VisitOMPTargetParallelForSimdDirective(2761OMPTargetParallelForSimdDirective *D) {2762VisitOMPLoopDirective(D);2763Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE;2764}27652766void ASTStmtWriter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {2767VisitOMPLoopDirective(D);2768Code = serialization::STMT_OMP_TARGET_SIMD_DIRECTIVE;2769}27702771void ASTStmtWriter::VisitOMPTeamsDistributeDirective(2772OMPTeamsDistributeDirective *D) {2773VisitOMPLoopDirective(D);2774Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE;2775}27762777void ASTStmtWriter::VisitOMPTeamsDistributeSimdDirective(2778OMPTeamsDistributeSimdDirective *D) {2779VisitOMPLoopDirective(D);2780Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;2781}27822783void ASTStmtWriter::VisitOMPTeamsDistributeParallelForSimdDirective(2784OMPTeamsDistributeParallelForSimdDirective *D) {2785VisitOMPLoopDirective(D);2786Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;2787}27882789void ASTStmtWriter::VisitOMPTeamsDistributeParallelForDirective(2790OMPTeamsDistributeParallelForDirective *D) {2791VisitOMPLoopDirective(D);2792Record.writeBool(D->hasCancel());2793Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;2794}27952796void ASTStmtWriter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {2797VisitStmt(D);2798VisitOMPExecutableDirective(D);2799Code = serialization::STMT_OMP_TARGET_TEAMS_DIRECTIVE;2800}28012802void ASTStmtWriter::VisitOMPTargetTeamsDistributeDirective(2803OMPTargetTeamsDistributeDirective *D) {2804VisitOMPLoopDirective(D);2805Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE;2806}28072808void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForDirective(2809OMPTargetTeamsDistributeParallelForDirective *D) {2810VisitOMPLoopDirective(D);2811Record.writeBool(D->hasCancel());2812Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;2813}28142815void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(2816OMPTargetTeamsDistributeParallelForSimdDirective *D) {2817VisitOMPLoopDirective(D);2818Code = serialization::2819STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;2820}28212822void ASTStmtWriter::VisitOMPTargetTeamsDistributeSimdDirective(2823OMPTargetTeamsDistributeSimdDirective *D) {2824VisitOMPLoopDirective(D);2825Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;2826}28272828void ASTStmtWriter::VisitOMPInteropDirective(OMPInteropDirective *D) {2829VisitStmt(D);2830VisitOMPExecutableDirective(D);2831Code = serialization::STMT_OMP_INTEROP_DIRECTIVE;2832}28332834void ASTStmtWriter::VisitOMPDispatchDirective(OMPDispatchDirective *D) {2835VisitStmt(D);2836VisitOMPExecutableDirective(D);2837Record.AddSourceLocation(D->getTargetCallLoc());2838Code = serialization::STMT_OMP_DISPATCH_DIRECTIVE;2839}28402841void ASTStmtWriter::VisitOMPMaskedDirective(OMPMaskedDirective *D) {2842VisitStmt(D);2843VisitOMPExecutableDirective(D);2844Code = serialization::STMT_OMP_MASKED_DIRECTIVE;2845}28462847void ASTStmtWriter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {2848VisitOMPLoopDirective(D);2849Code = serialization::STMT_OMP_GENERIC_LOOP_DIRECTIVE;2850}28512852void ASTStmtWriter::VisitOMPTeamsGenericLoopDirective(2853OMPTeamsGenericLoopDirective *D) {2854VisitOMPLoopDirective(D);2855Code = serialization::STMT_OMP_TEAMS_GENERIC_LOOP_DIRECTIVE;2856}28572858void ASTStmtWriter::VisitOMPTargetTeamsGenericLoopDirective(2859OMPTargetTeamsGenericLoopDirective *D) {2860VisitOMPLoopDirective(D);2861Record.writeBool(D->canBeParallelFor());2862Code = serialization::STMT_OMP_TARGET_TEAMS_GENERIC_LOOP_DIRECTIVE;2863}28642865void ASTStmtWriter::VisitOMPParallelGenericLoopDirective(2866OMPParallelGenericLoopDirective *D) {2867VisitOMPLoopDirective(D);2868Code = serialization::STMT_OMP_PARALLEL_GENERIC_LOOP_DIRECTIVE;2869}28702871void ASTStmtWriter::VisitOMPTargetParallelGenericLoopDirective(2872OMPTargetParallelGenericLoopDirective *D) {2873VisitOMPLoopDirective(D);2874Code = serialization::STMT_OMP_TARGET_PARALLEL_GENERIC_LOOP_DIRECTIVE;2875}28762877//===----------------------------------------------------------------------===//2878// OpenACC Constructs/Directives.2879//===----------------------------------------------------------------------===//2880void ASTStmtWriter::VisitOpenACCConstructStmt(OpenACCConstructStmt *S) {2881Record.push_back(S->clauses().size());2882Record.writeEnum(S->Kind);2883Record.AddSourceRange(S->Range);2884Record.AddSourceLocation(S->DirectiveLoc);2885Record.writeOpenACCClauseList(S->clauses());2886}28872888void ASTStmtWriter::VisitOpenACCAssociatedStmtConstruct(2889OpenACCAssociatedStmtConstruct *S) {2890VisitOpenACCConstructStmt(S);2891Record.AddStmt(S->getAssociatedStmt());2892}28932894void ASTStmtWriter::VisitOpenACCComputeConstruct(OpenACCComputeConstruct *S) {2895VisitStmt(S);2896VisitOpenACCAssociatedStmtConstruct(S);2897Code = serialization::STMT_OPENACC_COMPUTE_CONSTRUCT;2898}28992900void ASTStmtWriter::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {2901VisitStmt(S);2902VisitOpenACCAssociatedStmtConstruct(S);2903Code = serialization::STMT_OPENACC_LOOP_CONSTRUCT;2904}29052906//===----------------------------------------------------------------------===//2907// ASTWriter Implementation2908//===----------------------------------------------------------------------===//29092910unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {2911assert(!SwitchCaseIDs.contains(S) && "SwitchCase recorded twice");2912unsigned NextID = SwitchCaseIDs.size();2913SwitchCaseIDs[S] = NextID;2914return NextID;2915}29162917unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {2918assert(SwitchCaseIDs.contains(S) && "SwitchCase hasn't been seen yet");2919return SwitchCaseIDs[S];2920}29212922void ASTWriter::ClearSwitchCaseIDs() {2923SwitchCaseIDs.clear();2924}29252926/// Write the given substatement or subexpression to the2927/// bitstream.2928void ASTWriter::WriteSubStmt(Stmt *S) {2929RecordData Record;2930ASTStmtWriter Writer(*this, Record);2931++NumStatements;29322933if (!S) {2934Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);2935return;2936}29372938llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);2939if (I != SubStmtEntries.end()) {2940Record.push_back(I->second);2941Stream.EmitRecord(serialization::STMT_REF_PTR, Record);2942return;2943}29442945#ifndef NDEBUG2946assert(!ParentStmts.count(S) && "There is a Stmt cycle!");29472948struct ParentStmtInserterRAII {2949Stmt *S;2950llvm::DenseSet<Stmt *> &ParentStmts;29512952ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)2953: S(S), ParentStmts(ParentStmts) {2954ParentStmts.insert(S);2955}2956~ParentStmtInserterRAII() {2957ParentStmts.erase(S);2958}2959};29602961ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);2962#endif29632964Writer.Visit(S);29652966uint64_t Offset = Writer.Emit();2967SubStmtEntries[S] = Offset;2968}29692970/// Flush all of the statements that have been added to the2971/// queue via AddStmt().2972void ASTRecordWriter::FlushStmts() {2973// We expect to be the only consumer of the two temporary statement maps,2974// assert that they are empty.2975assert(Writer->SubStmtEntries.empty() && "unexpected entries in sub-stmt map");2976assert(Writer->ParentStmts.empty() && "unexpected entries in parent stmt map");29772978for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {2979Writer->WriteSubStmt(StmtsToEmit[I]);29802981assert(N == StmtsToEmit.size() && "record modified while being written!");29822983// Note that we are at the end of a full expression. Any2984// expression records that follow this one are part of a different2985// expression.2986Writer->Stream.EmitRecord(serialization::STMT_STOP, ArrayRef<uint32_t>());29872988Writer->SubStmtEntries.clear();2989Writer->ParentStmts.clear();2990}29912992StmtsToEmit.clear();2993}29942995void ASTRecordWriter::FlushSubStmts() {2996// For a nested statement, write out the substatements in reverse order (so2997// that a simple stack machine can be used when loading), and don't emit a2998// STMT_STOP after each one.2999for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {3000Writer->WriteSubStmt(StmtsToEmit[N - I - 1]);3001assert(N == StmtsToEmit.size() && "record modified while being written!");3002}30033004StmtsToEmit.clear();3005}300630073008