ASTWriterStmt.cpp 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268
  1. //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. ///
  10. /// \file
  11. /// \brief Implements serialization for Statements and Expressions.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Serialization/ASTWriter.h"
  15. #include "clang/AST/ASTContext.h"
  16. #include "clang/AST/DeclCXX.h"
  17. #include "clang/AST/DeclObjC.h"
  18. #include "clang/AST/DeclTemplate.h"
  19. #include "clang/AST/StmtVisitor.h"
  20. #include "clang/Lex/Token.h"
  21. #include "llvm/Bitcode/BitstreamWriter.h"
  22. using namespace clang;
  23. //===----------------------------------------------------------------------===//
  24. // Statement/expression serialization
  25. //===----------------------------------------------------------------------===//
  26. namespace clang {
  27. class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
  28. friend class OMPClauseWriter;
  29. ASTWriter &Writer;
  30. ASTWriter::RecordData &Record;
  31. public:
  32. serialization::StmtCode Code;
  33. unsigned AbbrevToUse;
  34. ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
  35. : Writer(Writer), Record(Record) { }
  36. void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args);
  37. void VisitStmt(Stmt *S);
  38. #define STMT(Type, Base) \
  39. void Visit##Type(Type *);
  40. #include "clang/AST/StmtNodes.inc"
  41. };
  42. }
  43. void ASTStmtWriter::
  44. AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &Args) {
  45. Writer.AddSourceLocation(Args.getTemplateKeywordLoc(), Record);
  46. Writer.AddSourceLocation(Args.LAngleLoc, Record);
  47. Writer.AddSourceLocation(Args.RAngleLoc, Record);
  48. for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
  49. Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
  50. }
  51. void ASTStmtWriter::VisitStmt(Stmt *S) {
  52. }
  53. void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
  54. VisitStmt(S);
  55. Writer.AddSourceLocation(S->getSemiLoc(), Record);
  56. Record.push_back(S->HasLeadingEmptyMacro);
  57. Code = serialization::STMT_NULL;
  58. }
  59. // HLSL Change: adding support for HLSL discard stmt.
  60. void ASTStmtWriter::VisitDiscardStmt(DiscardStmt *S) {
  61. VisitStmt(S);
  62. Writer.AddSourceLocation(S->getLoc(), Record);
  63. Code = serialization::STMT_DISCARD;
  64. }
  65. void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
  66. VisitStmt(S);
  67. Record.push_back(S->size());
  68. for (auto *CS : S->body())
  69. Writer.AddStmt(CS);
  70. Writer.AddSourceLocation(S->getLBracLoc(), Record);
  71. Writer.AddSourceLocation(S->getRBracLoc(), Record);
  72. Code = serialization::STMT_COMPOUND;
  73. }
  74. void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
  75. VisitStmt(S);
  76. Record.push_back(Writer.getSwitchCaseID(S));
  77. Writer.AddSourceLocation(S->getKeywordLoc(), Record);
  78. Writer.AddSourceLocation(S->getColonLoc(), Record);
  79. }
  80. void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
  81. VisitSwitchCase(S);
  82. Writer.AddStmt(S->getLHS());
  83. Writer.AddStmt(S->getRHS());
  84. Writer.AddStmt(S->getSubStmt());
  85. Writer.AddSourceLocation(S->getEllipsisLoc(), Record);
  86. Code = serialization::STMT_CASE;
  87. }
  88. void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
  89. VisitSwitchCase(S);
  90. Writer.AddStmt(S->getSubStmt());
  91. Code = serialization::STMT_DEFAULT;
  92. }
  93. void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
  94. VisitStmt(S);
  95. Writer.AddDeclRef(S->getDecl(), Record);
  96. Writer.AddStmt(S->getSubStmt());
  97. Writer.AddSourceLocation(S->getIdentLoc(), Record);
  98. Code = serialization::STMT_LABEL;
  99. }
  100. void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
  101. VisitStmt(S);
  102. Record.push_back(S->getAttrs().size());
  103. Writer.WriteAttributes(S->getAttrs(), Record);
  104. Writer.AddStmt(S->getSubStmt());
  105. Writer.AddSourceLocation(S->getAttrLoc(), Record);
  106. Code = serialization::STMT_ATTRIBUTED;
  107. }
  108. void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
  109. VisitStmt(S);
  110. Writer.AddDeclRef(S->getConditionVariable(), Record);
  111. Writer.AddStmt(S->getCond());
  112. Writer.AddStmt(S->getThen());
  113. Writer.AddStmt(S->getElse());
  114. Writer.AddSourceLocation(S->getIfLoc(), Record);
  115. Writer.AddSourceLocation(S->getElseLoc(), Record);
  116. Code = serialization::STMT_IF;
  117. }
  118. void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
  119. VisitStmt(S);
  120. Writer.AddDeclRef(S->getConditionVariable(), Record);
  121. Writer.AddStmt(S->getCond());
  122. Writer.AddStmt(S->getBody());
  123. Writer.AddSourceLocation(S->getSwitchLoc(), Record);
  124. Record.push_back(S->isAllEnumCasesCovered());
  125. for (SwitchCase *SC = S->getSwitchCaseList(); SC;
  126. SC = SC->getNextSwitchCase())
  127. Record.push_back(Writer.RecordSwitchCaseID(SC));
  128. Code = serialization::STMT_SWITCH;
  129. }
  130. void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
  131. VisitStmt(S);
  132. Writer.AddDeclRef(S->getConditionVariable(), Record);
  133. Writer.AddStmt(S->getCond());
  134. Writer.AddStmt(S->getBody());
  135. Writer.AddSourceLocation(S->getWhileLoc(), Record);
  136. Code = serialization::STMT_WHILE;
  137. }
  138. void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
  139. VisitStmt(S);
  140. Writer.AddStmt(S->getCond());
  141. Writer.AddStmt(S->getBody());
  142. Writer.AddSourceLocation(S->getDoLoc(), Record);
  143. Writer.AddSourceLocation(S->getWhileLoc(), Record);
  144. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  145. Code = serialization::STMT_DO;
  146. }
  147. void ASTStmtWriter::VisitForStmt(ForStmt *S) {
  148. VisitStmt(S);
  149. Writer.AddStmt(S->getInit());
  150. Writer.AddStmt(S->getCond());
  151. Writer.AddDeclRef(S->getConditionVariable(), Record);
  152. Writer.AddStmt(S->getInc());
  153. Writer.AddStmt(S->getBody());
  154. Writer.AddSourceLocation(S->getForLoc(), Record);
  155. Writer.AddSourceLocation(S->getLParenLoc(), Record);
  156. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  157. Code = serialization::STMT_FOR;
  158. }
  159. void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
  160. VisitStmt(S);
  161. Writer.AddDeclRef(S->getLabel(), Record);
  162. Writer.AddSourceLocation(S->getGotoLoc(), Record);
  163. Writer.AddSourceLocation(S->getLabelLoc(), Record);
  164. Code = serialization::STMT_GOTO;
  165. }
  166. void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
  167. VisitStmt(S);
  168. Writer.AddSourceLocation(S->getGotoLoc(), Record);
  169. Writer.AddSourceLocation(S->getStarLoc(), Record);
  170. Writer.AddStmt(S->getTarget());
  171. Code = serialization::STMT_INDIRECT_GOTO;
  172. }
  173. void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
  174. VisitStmt(S);
  175. Writer.AddSourceLocation(S->getContinueLoc(), Record);
  176. Code = serialization::STMT_CONTINUE;
  177. }
  178. void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
  179. VisitStmt(S);
  180. Writer.AddSourceLocation(S->getBreakLoc(), Record);
  181. Code = serialization::STMT_BREAK;
  182. }
  183. void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
  184. VisitStmt(S);
  185. Writer.AddStmt(S->getRetValue());
  186. Writer.AddSourceLocation(S->getReturnLoc(), Record);
  187. Writer.AddDeclRef(S->getNRVOCandidate(), Record);
  188. Code = serialization::STMT_RETURN;
  189. }
  190. void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
  191. VisitStmt(S);
  192. Writer.AddSourceLocation(S->getStartLoc(), Record);
  193. Writer.AddSourceLocation(S->getEndLoc(), Record);
  194. DeclGroupRef DG = S->getDeclGroup();
  195. for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
  196. Writer.AddDeclRef(*D, Record);
  197. Code = serialization::STMT_DECL;
  198. }
  199. void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
  200. VisitStmt(S);
  201. Record.push_back(S->getNumOutputs());
  202. Record.push_back(S->getNumInputs());
  203. Record.push_back(S->getNumClobbers());
  204. Writer.AddSourceLocation(S->getAsmLoc(), Record);
  205. Record.push_back(S->isVolatile());
  206. Record.push_back(S->isSimple());
  207. }
  208. void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
  209. VisitAsmStmt(S);
  210. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  211. Writer.AddStmt(S->getAsmString());
  212. // Outputs
  213. for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
  214. Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record);
  215. Writer.AddStmt(S->getOutputConstraintLiteral(I));
  216. Writer.AddStmt(S->getOutputExpr(I));
  217. }
  218. // Inputs
  219. for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
  220. Writer.AddIdentifierRef(S->getInputIdentifier(I), Record);
  221. Writer.AddStmt(S->getInputConstraintLiteral(I));
  222. Writer.AddStmt(S->getInputExpr(I));
  223. }
  224. // Clobbers
  225. for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
  226. Writer.AddStmt(S->getClobberStringLiteral(I));
  227. Code = serialization::STMT_GCCASM;
  228. }
  229. void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
  230. VisitAsmStmt(S);
  231. Writer.AddSourceLocation(S->getLBraceLoc(), Record);
  232. Writer.AddSourceLocation(S->getEndLoc(), Record);
  233. Record.push_back(S->getNumAsmToks());
  234. Writer.AddString(S->getAsmString(), Record);
  235. // Tokens
  236. for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {
  237. Writer.AddToken(S->getAsmToks()[I], Record);
  238. }
  239. // Clobbers
  240. for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {
  241. Writer.AddString(S->getClobber(I), Record);
  242. }
  243. // Outputs
  244. for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
  245. Writer.AddStmt(S->getOutputExpr(I));
  246. Writer.AddString(S->getOutputConstraint(I), Record);
  247. }
  248. // Inputs
  249. for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
  250. Writer.AddStmt(S->getInputExpr(I));
  251. Writer.AddString(S->getInputConstraint(I), Record);
  252. }
  253. Code = serialization::STMT_MSASM;
  254. }
  255. void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
  256. VisitStmt(S);
  257. // NumCaptures
  258. Record.push_back(std::distance(S->capture_begin(), S->capture_end()));
  259. // CapturedDecl and captured region kind
  260. Writer.AddDeclRef(S->getCapturedDecl(), Record);
  261. Record.push_back(S->getCapturedRegionKind());
  262. Writer.AddDeclRef(S->getCapturedRecordDecl(), Record);
  263. // Capture inits
  264. for (auto *I : S->capture_inits())
  265. Writer.AddStmt(I);
  266. // Body
  267. Writer.AddStmt(S->getCapturedStmt());
  268. // Captures
  269. for (const auto &I : S->captures()) {
  270. if (I.capturesThis() || I.capturesVariableArrayType())
  271. Writer.AddDeclRef(nullptr, Record);
  272. else
  273. Writer.AddDeclRef(I.getCapturedVar(), Record);
  274. Record.push_back(I.getCaptureKind());
  275. Writer.AddSourceLocation(I.getLocation(), Record);
  276. }
  277. Code = serialization::STMT_CAPTURED;
  278. }
  279. void ASTStmtWriter::VisitExpr(Expr *E) {
  280. VisitStmt(E);
  281. Writer.AddTypeRef(E->getType(), Record);
  282. Record.push_back(E->isTypeDependent());
  283. Record.push_back(E->isValueDependent());
  284. Record.push_back(E->isInstantiationDependent());
  285. Record.push_back(E->containsUnexpandedParameterPack());
  286. Record.push_back(E->getValueKind());
  287. Record.push_back(E->getObjectKind());
  288. }
  289. void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
  290. VisitExpr(E);
  291. Writer.AddSourceLocation(E->getLocation(), Record);
  292. Record.push_back(E->getIdentType()); // FIXME: stable encoding
  293. Writer.AddStmt(E->getFunctionName());
  294. Code = serialization::EXPR_PREDEFINED;
  295. }
  296. void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
  297. VisitExpr(E);
  298. Record.push_back(E->hasQualifier());
  299. Record.push_back(E->getDecl() != E->getFoundDecl());
  300. Record.push_back(E->hasTemplateKWAndArgsInfo());
  301. Record.push_back(E->hadMultipleCandidates());
  302. Record.push_back(E->refersToEnclosingVariableOrCapture());
  303. if (E->hasTemplateKWAndArgsInfo()) {
  304. unsigned NumTemplateArgs = E->getNumTemplateArgs();
  305. Record.push_back(NumTemplateArgs);
  306. }
  307. DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
  308. if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
  309. (E->getDecl() == E->getFoundDecl()) &&
  310. nk == DeclarationName::Identifier) {
  311. AbbrevToUse = Writer.getDeclRefExprAbbrev();
  312. }
  313. if (E->hasQualifier())
  314. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  315. if (E->getDecl() != E->getFoundDecl())
  316. Writer.AddDeclRef(E->getFoundDecl(), Record);
  317. if (E->hasTemplateKWAndArgsInfo())
  318. AddTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo());
  319. Writer.AddDeclRef(E->getDecl(), Record);
  320. Writer.AddSourceLocation(E->getLocation(), Record);
  321. Writer.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record);
  322. Code = serialization::EXPR_DECL_REF;
  323. }
  324. void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
  325. VisitExpr(E);
  326. Writer.AddSourceLocation(E->getLocation(), Record);
  327. Writer.AddAPInt(E->getValue(), Record);
  328. if (E->getValue().getBitWidth() == 32) {
  329. AbbrevToUse = Writer.getIntegerLiteralAbbrev();
  330. }
  331. Code = serialization::EXPR_INTEGER_LITERAL;
  332. }
  333. void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
  334. VisitExpr(E);
  335. Record.push_back(E->getRawSemantics());
  336. Record.push_back(E->isExact());
  337. Writer.AddAPFloat(E->getValue(), Record);
  338. Writer.AddSourceLocation(E->getLocation(), Record);
  339. Code = serialization::EXPR_FLOATING_LITERAL;
  340. }
  341. void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
  342. VisitExpr(E);
  343. Writer.AddStmt(E->getSubExpr());
  344. Code = serialization::EXPR_IMAGINARY_LITERAL;
  345. }
  346. void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
  347. VisitExpr(E);
  348. Record.push_back(E->getByteLength());
  349. Record.push_back(E->getNumConcatenated());
  350. Record.push_back(E->getKind());
  351. Record.push_back(E->isPascal());
  352. // FIXME: String data should be stored as a blob at the end of the
  353. // StringLiteral. However, we can't do so now because we have no
  354. // provision for coping with abbreviations when we're jumping around
  355. // the AST file during deserialization.
  356. Record.append(E->getBytes().begin(), E->getBytes().end());
  357. for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
  358. Writer.AddSourceLocation(E->getStrTokenLoc(I), Record);
  359. Code = serialization::EXPR_STRING_LITERAL;
  360. }
  361. void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
  362. VisitExpr(E);
  363. Record.push_back(E->getValue());
  364. Writer.AddSourceLocation(E->getLocation(), Record);
  365. Record.push_back(E->getKind());
  366. AbbrevToUse = Writer.getCharacterLiteralAbbrev();
  367. Code = serialization::EXPR_CHARACTER_LITERAL;
  368. }
  369. void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
  370. VisitExpr(E);
  371. Writer.AddSourceLocation(E->getLParen(), Record);
  372. Writer.AddSourceLocation(E->getRParen(), Record);
  373. Writer.AddStmt(E->getSubExpr());
  374. Code = serialization::EXPR_PAREN;
  375. }
  376. void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
  377. VisitExpr(E);
  378. Record.push_back(E->NumExprs);
  379. for (unsigned i=0; i != E->NumExprs; ++i)
  380. Writer.AddStmt(E->Exprs[i]);
  381. Writer.AddSourceLocation(E->LParenLoc, Record);
  382. Writer.AddSourceLocation(E->RParenLoc, Record);
  383. Code = serialization::EXPR_PAREN_LIST;
  384. }
  385. void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
  386. VisitExpr(E);
  387. Writer.AddStmt(E->getSubExpr());
  388. Record.push_back(E->getOpcode()); // FIXME: stable encoding
  389. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  390. Code = serialization::EXPR_UNARY_OPERATOR;
  391. }
  392. void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
  393. VisitExpr(E);
  394. Record.push_back(E->getNumComponents());
  395. Record.push_back(E->getNumExpressions());
  396. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  397. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  398. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  399. for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
  400. const OffsetOfExpr::OffsetOfNode &ON = E->getComponent(I);
  401. Record.push_back(ON.getKind()); // FIXME: Stable encoding
  402. Writer.AddSourceLocation(ON.getSourceRange().getBegin(), Record);
  403. Writer.AddSourceLocation(ON.getSourceRange().getEnd(), Record);
  404. switch (ON.getKind()) {
  405. case OffsetOfExpr::OffsetOfNode::Array:
  406. Record.push_back(ON.getArrayExprIndex());
  407. break;
  408. case OffsetOfExpr::OffsetOfNode::Field:
  409. Writer.AddDeclRef(ON.getField(), Record);
  410. break;
  411. case OffsetOfExpr::OffsetOfNode::Identifier:
  412. Writer.AddIdentifierRef(ON.getFieldName(), Record);
  413. break;
  414. case OffsetOfExpr::OffsetOfNode::Base:
  415. Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);
  416. break;
  417. }
  418. }
  419. for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
  420. Writer.AddStmt(E->getIndexExpr(I));
  421. Code = serialization::EXPR_OFFSETOF;
  422. }
  423. void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
  424. VisitExpr(E);
  425. Record.push_back(E->getKind());
  426. if (E->isArgumentType())
  427. Writer.AddTypeSourceInfo(E->getArgumentTypeInfo(), Record);
  428. else {
  429. Record.push_back(0);
  430. Writer.AddStmt(E->getArgumentExpr());
  431. }
  432. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  433. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  434. Code = serialization::EXPR_SIZEOF_ALIGN_OF;
  435. }
  436. void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
  437. VisitExpr(E);
  438. Writer.AddStmt(E->getLHS());
  439. Writer.AddStmt(E->getRHS());
  440. Writer.AddSourceLocation(E->getRBracketLoc(), Record);
  441. Code = serialization::EXPR_ARRAY_SUBSCRIPT;
  442. }
  443. void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
  444. VisitExpr(E);
  445. Record.push_back(E->getNumArgs());
  446. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  447. Writer.AddStmt(E->getCallee());
  448. for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
  449. Arg != ArgEnd; ++Arg)
  450. Writer.AddStmt(*Arg);
  451. Code = serialization::EXPR_CALL;
  452. }
  453. void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
  454. // Don't call VisitExpr, we'll write everything here.
  455. Record.push_back(E->hasQualifier());
  456. if (E->hasQualifier())
  457. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  458. Record.push_back(E->HasTemplateKWAndArgsInfo);
  459. if (E->HasTemplateKWAndArgsInfo) {
  460. Writer.AddSourceLocation(E->getTemplateKeywordLoc(), Record);
  461. unsigned NumTemplateArgs = E->getNumTemplateArgs();
  462. Record.push_back(NumTemplateArgs);
  463. Writer.AddSourceLocation(E->getLAngleLoc(), Record);
  464. Writer.AddSourceLocation(E->getRAngleLoc(), Record);
  465. for (unsigned i=0; i != NumTemplateArgs; ++i)
  466. Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
  467. }
  468. Record.push_back(E->hadMultipleCandidates());
  469. DeclAccessPair FoundDecl = E->getFoundDecl();
  470. Writer.AddDeclRef(FoundDecl.getDecl(), Record);
  471. Record.push_back(FoundDecl.getAccess());
  472. Writer.AddTypeRef(E->getType(), Record);
  473. Record.push_back(E->getValueKind());
  474. Record.push_back(E->getObjectKind());
  475. Writer.AddStmt(E->getBase());
  476. Writer.AddDeclRef(E->getMemberDecl(), Record);
  477. Writer.AddSourceLocation(E->getMemberLoc(), Record);
  478. Record.push_back(E->isArrow());
  479. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  480. Writer.AddDeclarationNameLoc(E->MemberDNLoc,
  481. E->getMemberDecl()->getDeclName(), Record);
  482. Code = serialization::EXPR_MEMBER;
  483. }
  484. void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
  485. VisitExpr(E);
  486. Writer.AddStmt(E->getBase());
  487. Writer.AddSourceLocation(E->getIsaMemberLoc(), Record);
  488. Writer.AddSourceLocation(E->getOpLoc(), Record);
  489. Record.push_back(E->isArrow());
  490. Code = serialization::EXPR_OBJC_ISA;
  491. }
  492. void ASTStmtWriter::
  493. VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
  494. VisitExpr(E);
  495. Writer.AddStmt(E->getSubExpr());
  496. Record.push_back(E->shouldCopy());
  497. Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
  498. }
  499. void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
  500. VisitExplicitCastExpr(E);
  501. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  502. Writer.AddSourceLocation(E->getBridgeKeywordLoc(), Record);
  503. Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
  504. Code = serialization::EXPR_OBJC_BRIDGED_CAST;
  505. }
  506. void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
  507. VisitExpr(E);
  508. Record.push_back(E->path_size());
  509. Writer.AddStmt(E->getSubExpr());
  510. Record.push_back(E->getCastKind()); // FIXME: stable encoding
  511. for (CastExpr::path_iterator
  512. PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
  513. Writer.AddCXXBaseSpecifier(**PI, Record);
  514. }
  515. void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
  516. VisitExpr(E);
  517. Writer.AddStmt(E->getLHS());
  518. Writer.AddStmt(E->getRHS());
  519. Record.push_back(E->getOpcode()); // FIXME: stable encoding
  520. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  521. Record.push_back(E->isFPContractable());
  522. Code = serialization::EXPR_BINARY_OPERATOR;
  523. }
  524. void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
  525. VisitBinaryOperator(E);
  526. Writer.AddTypeRef(E->getComputationLHSType(), Record);
  527. Writer.AddTypeRef(E->getComputationResultType(), Record);
  528. Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
  529. }
  530. void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
  531. VisitExpr(E);
  532. Writer.AddStmt(E->getCond());
  533. Writer.AddStmt(E->getLHS());
  534. Writer.AddStmt(E->getRHS());
  535. Writer.AddSourceLocation(E->getQuestionLoc(), Record);
  536. Writer.AddSourceLocation(E->getColonLoc(), Record);
  537. Code = serialization::EXPR_CONDITIONAL_OPERATOR;
  538. }
  539. void
  540. ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
  541. VisitExpr(E);
  542. Writer.AddStmt(E->getOpaqueValue());
  543. Writer.AddStmt(E->getCommon());
  544. Writer.AddStmt(E->getCond());
  545. Writer.AddStmt(E->getTrueExpr());
  546. Writer.AddStmt(E->getFalseExpr());
  547. Writer.AddSourceLocation(E->getQuestionLoc(), Record);
  548. Writer.AddSourceLocation(E->getColonLoc(), Record);
  549. Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
  550. }
  551. void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
  552. VisitCastExpr(E);
  553. if (E->path_size() == 0)
  554. AbbrevToUse = Writer.getExprImplicitCastAbbrev();
  555. Code = serialization::EXPR_IMPLICIT_CAST;
  556. }
  557. void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
  558. VisitCastExpr(E);
  559. Writer.AddTypeSourceInfo(E->getTypeInfoAsWritten(), Record);
  560. }
  561. void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
  562. VisitExplicitCastExpr(E);
  563. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  564. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  565. Code = serialization::EXPR_CSTYLE_CAST;
  566. }
  567. void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
  568. VisitExpr(E);
  569. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  570. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  571. Writer.AddStmt(E->getInitializer());
  572. Record.push_back(E->isFileScope());
  573. Code = serialization::EXPR_COMPOUND_LITERAL;
  574. }
  575. void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
  576. VisitExpr(E);
  577. Writer.AddStmt(E->getBase());
  578. Writer.AddIdentifierRef(&E->getAccessor(), Record);
  579. Writer.AddSourceLocation(E->getAccessorLoc(), Record);
  580. Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
  581. }
  582. // HLSL Change Starts
  583. void ASTStmtWriter::VisitExtMatrixElementExpr(ExtMatrixElementExpr *E) {
  584. // This requires a new serialization code that will break compatibility.
  585. // Until there is a scenario for serializing these AST tress this is left unimplemented.
  586. assert(false && "ASTStmtWriter::VisitExtMatrixElementExpr is unimplemented");
  587. }
  588. void ASTStmtWriter::VisitHLSLVectorElementExpr(HLSLVectorElementExpr *E) {
  589. // This requires a new serialization code that will break compatibility.
  590. // Until there is a scenario for serializing these AST tress this is left unimplemented.
  591. assert(false && "ASTStmtWriter::VisitHLSLVectorElementExpr is unimplemented");
  592. }
  593. // HLSL Change Ends
  594. void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
  595. VisitExpr(E);
  596. // NOTE: only add the (possibly null) syntactic form.
  597. // No need to serialize the isSemanticForm flag and the semantic form.
  598. Writer.AddStmt(E->getSyntacticForm());
  599. Writer.AddSourceLocation(E->getLBraceLoc(), Record);
  600. Writer.AddSourceLocation(E->getRBraceLoc(), Record);
  601. bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
  602. Record.push_back(isArrayFiller);
  603. if (isArrayFiller)
  604. Writer.AddStmt(E->getArrayFiller());
  605. else
  606. Writer.AddDeclRef(E->getInitializedFieldInUnion(), Record);
  607. Record.push_back(E->hadArrayRangeDesignator());
  608. Record.push_back(E->getNumInits());
  609. if (isArrayFiller) {
  610. // ArrayFiller may have filled "holes" due to designated initializer.
  611. // Replace them by 0 to indicate that the filler goes in that place.
  612. Expr *filler = E->getArrayFiller();
  613. for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
  614. Writer.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);
  615. } else {
  616. for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
  617. Writer.AddStmt(E->getInit(I));
  618. }
  619. Code = serialization::EXPR_INIT_LIST;
  620. }
  621. void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
  622. VisitExpr(E);
  623. Record.push_back(E->getNumSubExprs());
  624. for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
  625. Writer.AddStmt(E->getSubExpr(I));
  626. Writer.AddSourceLocation(E->getEqualOrColonLoc(), Record);
  627. Record.push_back(E->usesGNUSyntax());
  628. for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
  629. DEnd = E->designators_end();
  630. D != DEnd; ++D) {
  631. if (D->isFieldDesignator()) {
  632. if (FieldDecl *Field = D->getField()) {
  633. Record.push_back(serialization::DESIG_FIELD_DECL);
  634. Writer.AddDeclRef(Field, Record);
  635. } else {
  636. Record.push_back(serialization::DESIG_FIELD_NAME);
  637. Writer.AddIdentifierRef(D->getFieldName(), Record);
  638. }
  639. Writer.AddSourceLocation(D->getDotLoc(), Record);
  640. Writer.AddSourceLocation(D->getFieldLoc(), Record);
  641. } else if (D->isArrayDesignator()) {
  642. Record.push_back(serialization::DESIG_ARRAY);
  643. Record.push_back(D->getFirstExprIndex());
  644. Writer.AddSourceLocation(D->getLBracketLoc(), Record);
  645. Writer.AddSourceLocation(D->getRBracketLoc(), Record);
  646. } else {
  647. assert(D->isArrayRangeDesignator() && "Unknown designator");
  648. Record.push_back(serialization::DESIG_ARRAY_RANGE);
  649. Record.push_back(D->getFirstExprIndex());
  650. Writer.AddSourceLocation(D->getLBracketLoc(), Record);
  651. Writer.AddSourceLocation(D->getEllipsisLoc(), Record);
  652. Writer.AddSourceLocation(D->getRBracketLoc(), Record);
  653. }
  654. }
  655. Code = serialization::EXPR_DESIGNATED_INIT;
  656. }
  657. void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
  658. VisitExpr(E);
  659. Writer.AddStmt(E->getBase());
  660. Writer.AddStmt(E->getUpdater());
  661. Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;
  662. }
  663. void ASTStmtWriter::VisitNoInitExpr(NoInitExpr *E) {
  664. VisitExpr(E);
  665. Code = serialization::EXPR_NO_INIT;
  666. }
  667. void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
  668. VisitExpr(E);
  669. Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
  670. }
  671. void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
  672. VisitExpr(E);
  673. Writer.AddStmt(E->getSubExpr());
  674. Writer.AddTypeSourceInfo(E->getWrittenTypeInfo(), Record);
  675. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  676. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  677. Code = serialization::EXPR_VA_ARG;
  678. }
  679. void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
  680. VisitExpr(E);
  681. Writer.AddSourceLocation(E->getAmpAmpLoc(), Record);
  682. Writer.AddSourceLocation(E->getLabelLoc(), Record);
  683. Writer.AddDeclRef(E->getLabel(), Record);
  684. Code = serialization::EXPR_ADDR_LABEL;
  685. }
  686. void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
  687. VisitExpr(E);
  688. Writer.AddStmt(E->getSubStmt());
  689. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  690. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  691. Code = serialization::EXPR_STMT;
  692. }
  693. void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
  694. VisitExpr(E);
  695. Writer.AddStmt(E->getCond());
  696. Writer.AddStmt(E->getLHS());
  697. Writer.AddStmt(E->getRHS());
  698. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  699. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  700. Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());
  701. Code = serialization::EXPR_CHOOSE;
  702. }
  703. void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
  704. VisitExpr(E);
  705. Writer.AddSourceLocation(E->getTokenLocation(), Record);
  706. Code = serialization::EXPR_GNU_NULL;
  707. }
  708. void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
  709. VisitExpr(E);
  710. Record.push_back(E->getNumSubExprs());
  711. for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
  712. Writer.AddStmt(E->getExpr(I));
  713. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  714. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  715. Code = serialization::EXPR_SHUFFLE_VECTOR;
  716. }
  717. void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
  718. VisitExpr(E);
  719. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  720. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  721. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  722. Writer.AddStmt(E->getSrcExpr());
  723. Code = serialization::EXPR_CONVERT_VECTOR;
  724. }
  725. void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
  726. VisitExpr(E);
  727. Writer.AddDeclRef(E->getBlockDecl(), Record);
  728. Code = serialization::EXPR_BLOCK;
  729. }
  730. void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
  731. VisitExpr(E);
  732. Record.push_back(E->getNumAssocs());
  733. Writer.AddStmt(E->getControllingExpr());
  734. for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
  735. Writer.AddTypeSourceInfo(E->getAssocTypeSourceInfo(I), Record);
  736. Writer.AddStmt(E->getAssocExpr(I));
  737. }
  738. Record.push_back(E->isResultDependent() ? -1U : E->getResultIndex());
  739. Writer.AddSourceLocation(E->getGenericLoc(), Record);
  740. Writer.AddSourceLocation(E->getDefaultLoc(), Record);
  741. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  742. Code = serialization::EXPR_GENERIC_SELECTION;
  743. }
  744. void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
  745. VisitExpr(E);
  746. Record.push_back(E->getNumSemanticExprs());
  747. // Push the result index. Currently, this needs to exactly match
  748. // the encoding used internally for ResultIndex.
  749. unsigned result = E->getResultExprIndex();
  750. result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
  751. Record.push_back(result);
  752. Writer.AddStmt(E->getSyntacticForm());
  753. for (PseudoObjectExpr::semantics_iterator
  754. i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
  755. Writer.AddStmt(*i);
  756. }
  757. Code = serialization::EXPR_PSEUDO_OBJECT;
  758. }
  759. void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
  760. VisitExpr(E);
  761. Record.push_back(E->getOp());
  762. for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
  763. Writer.AddStmt(E->getSubExprs()[I]);
  764. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  765. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  766. Code = serialization::EXPR_ATOMIC;
  767. }
  768. //===----------------------------------------------------------------------===//
  769. // Objective-C Expressions and Statements.
  770. //===----------------------------------------------------------------------===//
  771. void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
  772. VisitExpr(E);
  773. Writer.AddStmt(E->getString());
  774. Writer.AddSourceLocation(E->getAtLoc(), Record);
  775. Code = serialization::EXPR_OBJC_STRING_LITERAL;
  776. }
  777. void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
  778. VisitExpr(E);
  779. Writer.AddStmt(E->getSubExpr());
  780. Writer.AddDeclRef(E->getBoxingMethod(), Record);
  781. Writer.AddSourceRange(E->getSourceRange(), Record);
  782. Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
  783. }
  784. void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
  785. VisitExpr(E);
  786. Record.push_back(E->getNumElements());
  787. for (unsigned i = 0; i < E->getNumElements(); i++)
  788. Writer.AddStmt(E->getElement(i));
  789. Writer.AddDeclRef(E->getArrayWithObjectsMethod(), Record);
  790. Writer.AddSourceRange(E->getSourceRange(), Record);
  791. Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
  792. }
  793. void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
  794. VisitExpr(E);
  795. Record.push_back(E->getNumElements());
  796. Record.push_back(E->HasPackExpansions);
  797. for (unsigned i = 0; i < E->getNumElements(); i++) {
  798. ObjCDictionaryElement Element = E->getKeyValueElement(i);
  799. Writer.AddStmt(Element.Key);
  800. Writer.AddStmt(Element.Value);
  801. if (E->HasPackExpansions) {
  802. Writer.AddSourceLocation(Element.EllipsisLoc, Record);
  803. unsigned NumExpansions = 0;
  804. if (Element.NumExpansions)
  805. NumExpansions = *Element.NumExpansions + 1;
  806. Record.push_back(NumExpansions);
  807. }
  808. }
  809. Writer.AddDeclRef(E->getDictWithObjectsMethod(), Record);
  810. Writer.AddSourceRange(E->getSourceRange(), Record);
  811. Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
  812. }
  813. void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
  814. VisitExpr(E);
  815. Writer.AddTypeSourceInfo(E->getEncodedTypeSourceInfo(), Record);
  816. Writer.AddSourceLocation(E->getAtLoc(), Record);
  817. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  818. Code = serialization::EXPR_OBJC_ENCODE;
  819. }
  820. void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
  821. VisitExpr(E);
  822. Writer.AddSelectorRef(E->getSelector(), Record);
  823. Writer.AddSourceLocation(E->getAtLoc(), Record);
  824. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  825. Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
  826. }
  827. void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
  828. VisitExpr(E);
  829. Writer.AddDeclRef(E->getProtocol(), Record);
  830. Writer.AddSourceLocation(E->getAtLoc(), Record);
  831. Writer.AddSourceLocation(E->ProtoLoc, Record);
  832. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  833. Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
  834. }
  835. void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
  836. VisitExpr(E);
  837. Writer.AddDeclRef(E->getDecl(), Record);
  838. Writer.AddSourceLocation(E->getLocation(), Record);
  839. Writer.AddSourceLocation(E->getOpLoc(), Record);
  840. Writer.AddStmt(E->getBase());
  841. Record.push_back(E->isArrow());
  842. Record.push_back(E->isFreeIvar());
  843. Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
  844. }
  845. void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
  846. VisitExpr(E);
  847. Record.push_back(E->SetterAndMethodRefFlags.getInt());
  848. Record.push_back(E->isImplicitProperty());
  849. if (E->isImplicitProperty()) {
  850. Writer.AddDeclRef(E->getImplicitPropertyGetter(), Record);
  851. Writer.AddDeclRef(E->getImplicitPropertySetter(), Record);
  852. } else {
  853. Writer.AddDeclRef(E->getExplicitProperty(), Record);
  854. }
  855. Writer.AddSourceLocation(E->getLocation(), Record);
  856. Writer.AddSourceLocation(E->getReceiverLocation(), Record);
  857. if (E->isObjectReceiver()) {
  858. Record.push_back(0);
  859. Writer.AddStmt(E->getBase());
  860. } else if (E->isSuperReceiver()) {
  861. Record.push_back(1);
  862. Writer.AddTypeRef(E->getSuperReceiverType(), Record);
  863. } else {
  864. Record.push_back(2);
  865. Writer.AddDeclRef(E->getClassReceiver(), Record);
  866. }
  867. Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
  868. }
  869. void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
  870. VisitExpr(E);
  871. Writer.AddSourceLocation(E->getRBracket(), Record);
  872. Writer.AddStmt(E->getBaseExpr());
  873. Writer.AddStmt(E->getKeyExpr());
  874. Writer.AddDeclRef(E->getAtIndexMethodDecl(), Record);
  875. Writer.AddDeclRef(E->setAtIndexMethodDecl(), Record);
  876. Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
  877. }
  878. void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
  879. VisitExpr(E);
  880. Record.push_back(E->getNumArgs());
  881. Record.push_back(E->getNumStoredSelLocs());
  882. Record.push_back(E->SelLocsKind);
  883. Record.push_back(E->isDelegateInitCall());
  884. Record.push_back(E->IsImplicit);
  885. Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
  886. switch (E->getReceiverKind()) {
  887. case ObjCMessageExpr::Instance:
  888. Writer.AddStmt(E->getInstanceReceiver());
  889. break;
  890. case ObjCMessageExpr::Class:
  891. Writer.AddTypeSourceInfo(E->getClassReceiverTypeInfo(), Record);
  892. break;
  893. case ObjCMessageExpr::SuperClass:
  894. case ObjCMessageExpr::SuperInstance:
  895. Writer.AddTypeRef(E->getSuperType(), Record);
  896. Writer.AddSourceLocation(E->getSuperLoc(), Record);
  897. break;
  898. }
  899. if (E->getMethodDecl()) {
  900. Record.push_back(1);
  901. Writer.AddDeclRef(E->getMethodDecl(), Record);
  902. } else {
  903. Record.push_back(0);
  904. Writer.AddSelectorRef(E->getSelector(), Record);
  905. }
  906. Writer.AddSourceLocation(E->getLeftLoc(), Record);
  907. Writer.AddSourceLocation(E->getRightLoc(), Record);
  908. for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
  909. Arg != ArgEnd; ++Arg)
  910. Writer.AddStmt(*Arg);
  911. SourceLocation *Locs = E->getStoredSelLocs();
  912. for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
  913. Writer.AddSourceLocation(Locs[i], Record);
  914. Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
  915. }
  916. void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
  917. VisitStmt(S);
  918. Writer.AddStmt(S->getElement());
  919. Writer.AddStmt(S->getCollection());
  920. Writer.AddStmt(S->getBody());
  921. Writer.AddSourceLocation(S->getForLoc(), Record);
  922. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  923. Code = serialization::STMT_OBJC_FOR_COLLECTION;
  924. }
  925. void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
  926. Writer.AddStmt(S->getCatchBody());
  927. Writer.AddDeclRef(S->getCatchParamDecl(), Record);
  928. Writer.AddSourceLocation(S->getAtCatchLoc(), Record);
  929. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  930. Code = serialization::STMT_OBJC_CATCH;
  931. }
  932. void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
  933. Writer.AddStmt(S->getFinallyBody());
  934. Writer.AddSourceLocation(S->getAtFinallyLoc(), Record);
  935. Code = serialization::STMT_OBJC_FINALLY;
  936. }
  937. void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
  938. Writer.AddStmt(S->getSubStmt());
  939. Writer.AddSourceLocation(S->getAtLoc(), Record);
  940. Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
  941. }
  942. void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
  943. Record.push_back(S->getNumCatchStmts());
  944. Record.push_back(S->getFinallyStmt() != nullptr);
  945. Writer.AddStmt(S->getTryBody());
  946. for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
  947. Writer.AddStmt(S->getCatchStmt(I));
  948. if (S->getFinallyStmt())
  949. Writer.AddStmt(S->getFinallyStmt());
  950. Writer.AddSourceLocation(S->getAtTryLoc(), Record);
  951. Code = serialization::STMT_OBJC_AT_TRY;
  952. }
  953. void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
  954. Writer.AddStmt(S->getSynchExpr());
  955. Writer.AddStmt(S->getSynchBody());
  956. Writer.AddSourceLocation(S->getAtSynchronizedLoc(), Record);
  957. Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
  958. }
  959. void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
  960. Writer.AddStmt(S->getThrowExpr());
  961. Writer.AddSourceLocation(S->getThrowLoc(), Record);
  962. Code = serialization::STMT_OBJC_AT_THROW;
  963. }
  964. void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
  965. VisitExpr(E);
  966. Record.push_back(E->getValue());
  967. Writer.AddSourceLocation(E->getLocation(), Record);
  968. Code = serialization::EXPR_OBJC_BOOL_LITERAL;
  969. }
  970. //===----------------------------------------------------------------------===//
  971. // C++ Expressions and Statements.
  972. //===----------------------------------------------------------------------===//
  973. void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
  974. VisitStmt(S);
  975. Writer.AddSourceLocation(S->getCatchLoc(), Record);
  976. Writer.AddDeclRef(S->getExceptionDecl(), Record);
  977. Writer.AddStmt(S->getHandlerBlock());
  978. Code = serialization::STMT_CXX_CATCH;
  979. }
  980. void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
  981. VisitStmt(S);
  982. Record.push_back(S->getNumHandlers());
  983. Writer.AddSourceLocation(S->getTryLoc(), Record);
  984. Writer.AddStmt(S->getTryBlock());
  985. for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
  986. Writer.AddStmt(S->getHandler(i));
  987. Code = serialization::STMT_CXX_TRY;
  988. }
  989. void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
  990. VisitStmt(S);
  991. Writer.AddSourceLocation(S->getForLoc(), Record);
  992. Writer.AddSourceLocation(S->getColonLoc(), Record);
  993. Writer.AddSourceLocation(S->getRParenLoc(), Record);
  994. Writer.AddStmt(S->getRangeStmt());
  995. Writer.AddStmt(S->getBeginEndStmt());
  996. Writer.AddStmt(S->getCond());
  997. Writer.AddStmt(S->getInc());
  998. Writer.AddStmt(S->getLoopVarStmt());
  999. Writer.AddStmt(S->getBody());
  1000. Code = serialization::STMT_CXX_FOR_RANGE;
  1001. }
  1002. void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
  1003. VisitStmt(S);
  1004. Writer.AddSourceLocation(S->getKeywordLoc(), Record);
  1005. Record.push_back(S->isIfExists());
  1006. Writer.AddNestedNameSpecifierLoc(S->getQualifierLoc(), Record);
  1007. Writer.AddDeclarationNameInfo(S->getNameInfo(), Record);
  1008. Writer.AddStmt(S->getSubStmt());
  1009. Code = serialization::STMT_MS_DEPENDENT_EXISTS;
  1010. }
  1011. void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
  1012. VisitCallExpr(E);
  1013. Record.push_back(E->getOperator());
  1014. Writer.AddSourceRange(E->Range, Record);
  1015. Record.push_back(E->isFPContractable());
  1016. Code = serialization::EXPR_CXX_OPERATOR_CALL;
  1017. }
  1018. void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
  1019. VisitCallExpr(E);
  1020. Code = serialization::EXPR_CXX_MEMBER_CALL;
  1021. }
  1022. void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
  1023. VisitExpr(E);
  1024. Record.push_back(E->getNumArgs());
  1025. for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
  1026. Writer.AddStmt(E->getArg(I));
  1027. Writer.AddDeclRef(E->getConstructor(), Record);
  1028. Writer.AddSourceLocation(E->getLocation(), Record);
  1029. Record.push_back(E->isElidable());
  1030. Record.push_back(E->hadMultipleCandidates());
  1031. Record.push_back(E->isListInitialization());
  1032. Record.push_back(E->isStdInitListInitialization());
  1033. Record.push_back(E->requiresZeroInitialization());
  1034. Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
  1035. Writer.AddSourceRange(E->getParenOrBraceRange(), Record);
  1036. Code = serialization::EXPR_CXX_CONSTRUCT;
  1037. }
  1038. void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
  1039. VisitCXXConstructExpr(E);
  1040. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  1041. Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
  1042. }
  1043. void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
  1044. VisitExpr(E);
  1045. Record.push_back(E->NumCaptures);
  1046. unsigned NumArrayIndexVars = 0;
  1047. if (E->HasArrayIndexVars)
  1048. NumArrayIndexVars = E->getArrayIndexStarts()[E->NumCaptures];
  1049. Record.push_back(NumArrayIndexVars);
  1050. Writer.AddSourceRange(E->IntroducerRange, Record);
  1051. Record.push_back(E->CaptureDefault); // FIXME: stable encoding
  1052. Writer.AddSourceLocation(E->CaptureDefaultLoc, Record);
  1053. Record.push_back(E->ExplicitParams);
  1054. Record.push_back(E->ExplicitResultType);
  1055. Writer.AddSourceLocation(E->ClosingBrace, Record);
  1056. // Add capture initializers.
  1057. for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
  1058. CEnd = E->capture_init_end();
  1059. C != CEnd; ++C) {
  1060. Writer.AddStmt(*C);
  1061. }
  1062. // Add array index variables, if any.
  1063. if (NumArrayIndexVars) {
  1064. Record.append(E->getArrayIndexStarts(),
  1065. E->getArrayIndexStarts() + E->NumCaptures + 1);
  1066. VarDecl **ArrayIndexVars = E->getArrayIndexVars();
  1067. for (unsigned I = 0; I != NumArrayIndexVars; ++I)
  1068. Writer.AddDeclRef(ArrayIndexVars[I], Record);
  1069. }
  1070. Code = serialization::EXPR_LAMBDA;
  1071. }
  1072. void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
  1073. VisitExpr(E);
  1074. Writer.AddStmt(E->getSubExpr());
  1075. Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;
  1076. }
  1077. void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
  1078. VisitExplicitCastExpr(E);
  1079. Writer.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()),
  1080. Record);
  1081. Writer.AddSourceRange(E->getAngleBrackets(), Record);
  1082. }
  1083. void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
  1084. VisitCXXNamedCastExpr(E);
  1085. Code = serialization::EXPR_CXX_STATIC_CAST;
  1086. }
  1087. void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
  1088. VisitCXXNamedCastExpr(E);
  1089. Code = serialization::EXPR_CXX_DYNAMIC_CAST;
  1090. }
  1091. void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
  1092. VisitCXXNamedCastExpr(E);
  1093. Code = serialization::EXPR_CXX_REINTERPRET_CAST;
  1094. }
  1095. void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
  1096. VisitCXXNamedCastExpr(E);
  1097. Code = serialization::EXPR_CXX_CONST_CAST;
  1098. }
  1099. void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
  1100. VisitExplicitCastExpr(E);
  1101. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  1102. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  1103. Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
  1104. }
  1105. void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
  1106. VisitCallExpr(E);
  1107. Writer.AddSourceLocation(E->UDSuffixLoc, Record);
  1108. Code = serialization::EXPR_USER_DEFINED_LITERAL;
  1109. }
  1110. void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
  1111. VisitExpr(E);
  1112. Record.push_back(E->getValue());
  1113. Writer.AddSourceLocation(E->getLocation(), Record);
  1114. Code = serialization::EXPR_CXX_BOOL_LITERAL;
  1115. }
  1116. void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
  1117. VisitExpr(E);
  1118. Writer.AddSourceLocation(E->getLocation(), Record);
  1119. Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
  1120. }
  1121. void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
  1122. VisitExpr(E);
  1123. Writer.AddSourceRange(E->getSourceRange(), Record);
  1124. if (E->isTypeOperand()) {
  1125. Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
  1126. Code = serialization::EXPR_CXX_TYPEID_TYPE;
  1127. } else {
  1128. Writer.AddStmt(E->getExprOperand());
  1129. Code = serialization::EXPR_CXX_TYPEID_EXPR;
  1130. }
  1131. }
  1132. void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
  1133. VisitExpr(E);
  1134. Writer.AddSourceLocation(E->getLocation(), Record);
  1135. Record.push_back(E->isImplicit());
  1136. Code = serialization::EXPR_CXX_THIS;
  1137. }
  1138. void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
  1139. VisitExpr(E);
  1140. Writer.AddSourceLocation(E->getThrowLoc(), Record);
  1141. Writer.AddStmt(E->getSubExpr());
  1142. Record.push_back(E->isThrownVariableInScope());
  1143. Code = serialization::EXPR_CXX_THROW;
  1144. }
  1145. void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
  1146. VisitExpr(E);
  1147. bool HasOtherExprStored = E->Param.getInt();
  1148. // Store these first, the reader reads them before creation.
  1149. Record.push_back(HasOtherExprStored);
  1150. if (HasOtherExprStored)
  1151. Writer.AddStmt(E->getExpr());
  1152. Writer.AddDeclRef(E->getParam(), Record);
  1153. Writer.AddSourceLocation(E->getUsedLocation(), Record);
  1154. Code = serialization::EXPR_CXX_DEFAULT_ARG;
  1155. }
  1156. void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
  1157. VisitExpr(E);
  1158. Writer.AddDeclRef(E->getField(), Record);
  1159. Writer.AddSourceLocation(E->getExprLoc(), Record);
  1160. Code = serialization::EXPR_CXX_DEFAULT_INIT;
  1161. }
  1162. void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
  1163. VisitExpr(E);
  1164. Writer.AddCXXTemporary(E->getTemporary(), Record);
  1165. Writer.AddStmt(E->getSubExpr());
  1166. Code = serialization::EXPR_CXX_BIND_TEMPORARY;
  1167. }
  1168. void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
  1169. VisitExpr(E);
  1170. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  1171. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  1172. Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
  1173. }
  1174. void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
  1175. VisitExpr(E);
  1176. Record.push_back(E->isGlobalNew());
  1177. Record.push_back(E->isArray());
  1178. Record.push_back(E->doesUsualArrayDeleteWantSize());
  1179. Record.push_back(E->getNumPlacementArgs());
  1180. Record.push_back(E->StoredInitializationStyle);
  1181. Writer.AddDeclRef(E->getOperatorNew(), Record);
  1182. Writer.AddDeclRef(E->getOperatorDelete(), Record);
  1183. Writer.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo(), Record);
  1184. Writer.AddSourceRange(E->getTypeIdParens(), Record);
  1185. Writer.AddSourceRange(E->getSourceRange(), Record);
  1186. Writer.AddSourceRange(E->getDirectInitRange(), Record);
  1187. for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), e = E->raw_arg_end();
  1188. I != e; ++I)
  1189. Writer.AddStmt(*I);
  1190. Code = serialization::EXPR_CXX_NEW;
  1191. }
  1192. void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
  1193. VisitExpr(E);
  1194. Record.push_back(E->isGlobalDelete());
  1195. Record.push_back(E->isArrayForm());
  1196. Record.push_back(E->isArrayFormAsWritten());
  1197. Record.push_back(E->doesUsualArrayDeleteWantSize());
  1198. Writer.AddDeclRef(E->getOperatorDelete(), Record);
  1199. Writer.AddStmt(E->getArgument());
  1200. Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
  1201. Code = serialization::EXPR_CXX_DELETE;
  1202. }
  1203. void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
  1204. VisitExpr(E);
  1205. Writer.AddStmt(E->getBase());
  1206. Record.push_back(E->isArrow());
  1207. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  1208. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  1209. Writer.AddTypeSourceInfo(E->getScopeTypeInfo(), Record);
  1210. Writer.AddSourceLocation(E->getColonColonLoc(), Record);
  1211. Writer.AddSourceLocation(E->getTildeLoc(), Record);
  1212. // PseudoDestructorTypeStorage.
  1213. Writer.AddIdentifierRef(E->getDestroyedTypeIdentifier(), Record);
  1214. if (E->getDestroyedTypeIdentifier())
  1215. Writer.AddSourceLocation(E->getDestroyedTypeLoc(), Record);
  1216. else
  1217. Writer.AddTypeSourceInfo(E->getDestroyedTypeInfo(), Record);
  1218. Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
  1219. }
  1220. void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
  1221. VisitExpr(E);
  1222. Record.push_back(E->getNumObjects());
  1223. for (unsigned i = 0, e = E->getNumObjects(); i != e; ++i)
  1224. Writer.AddDeclRef(E->getObject(i), Record);
  1225. Writer.AddStmt(E->getSubExpr());
  1226. Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
  1227. }
  1228. void
  1229. ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
  1230. VisitExpr(E);
  1231. // Don't emit anything here, HasTemplateKWAndArgsInfo must be
  1232. // emitted first.
  1233. Record.push_back(E->HasTemplateKWAndArgsInfo);
  1234. if (E->HasTemplateKWAndArgsInfo) {
  1235. const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
  1236. Record.push_back(Args.NumTemplateArgs);
  1237. AddTemplateKWAndArgsInfo(Args);
  1238. }
  1239. if (!E->isImplicitAccess())
  1240. Writer.AddStmt(E->getBase());
  1241. else
  1242. Writer.AddStmt(nullptr);
  1243. Writer.AddTypeRef(E->getBaseType(), Record);
  1244. Record.push_back(E->isArrow());
  1245. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  1246. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  1247. Writer.AddDeclRef(E->getFirstQualifierFoundInScope(), Record);
  1248. Writer.AddDeclarationNameInfo(E->MemberNameInfo, Record);
  1249. Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
  1250. }
  1251. void
  1252. ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
  1253. VisitExpr(E);
  1254. // Don't emit anything here, HasTemplateKWAndArgsInfo must be
  1255. // emitted first.
  1256. Record.push_back(E->HasTemplateKWAndArgsInfo);
  1257. if (E->HasTemplateKWAndArgsInfo) {
  1258. const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
  1259. Record.push_back(Args.NumTemplateArgs);
  1260. AddTemplateKWAndArgsInfo(Args);
  1261. }
  1262. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  1263. Writer.AddDeclarationNameInfo(E->NameInfo, Record);
  1264. Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
  1265. }
  1266. void
  1267. ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
  1268. VisitExpr(E);
  1269. Record.push_back(E->arg_size());
  1270. for (CXXUnresolvedConstructExpr::arg_iterator
  1271. ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
  1272. Writer.AddStmt(*ArgI);
  1273. Writer.AddTypeSourceInfo(E->getTypeSourceInfo(), Record);
  1274. Writer.AddSourceLocation(E->getLParenLoc(), Record);
  1275. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  1276. Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
  1277. }
  1278. void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
  1279. VisitExpr(E);
  1280. // Don't emit anything here, HasTemplateKWAndArgsInfo must be
  1281. // emitted first.
  1282. Record.push_back(E->HasTemplateKWAndArgsInfo);
  1283. if (E->HasTemplateKWAndArgsInfo) {
  1284. const ASTTemplateKWAndArgsInfo &Args = *E->getTemplateKWAndArgsInfo();
  1285. Record.push_back(Args.NumTemplateArgs);
  1286. AddTemplateKWAndArgsInfo(Args);
  1287. }
  1288. Record.push_back(E->getNumDecls());
  1289. for (OverloadExpr::decls_iterator
  1290. OvI = E->decls_begin(), OvE = E->decls_end(); OvI != OvE; ++OvI) {
  1291. Writer.AddDeclRef(OvI.getDecl(), Record);
  1292. Record.push_back(OvI.getAccess());
  1293. }
  1294. Writer.AddDeclarationNameInfo(E->NameInfo, Record);
  1295. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  1296. }
  1297. void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
  1298. VisitOverloadExpr(E);
  1299. Record.push_back(E->isArrow());
  1300. Record.push_back(E->hasUnresolvedUsing());
  1301. Writer.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);
  1302. Writer.AddTypeRef(E->getBaseType(), Record);
  1303. Writer.AddSourceLocation(E->getOperatorLoc(), Record);
  1304. Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
  1305. }
  1306. void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
  1307. VisitOverloadExpr(E);
  1308. Record.push_back(E->requiresADL());
  1309. Record.push_back(E->isOverloaded());
  1310. Writer.AddDeclRef(E->getNamingClass(), Record);
  1311. Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
  1312. }
  1313. void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
  1314. VisitExpr(E);
  1315. Record.push_back(E->TypeTraitExprBits.NumArgs);
  1316. Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
  1317. Record.push_back(E->TypeTraitExprBits.Value);
  1318. Writer.AddSourceRange(E->getSourceRange(), Record);
  1319. for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
  1320. Writer.AddTypeSourceInfo(E->getArg(I), Record);
  1321. Code = serialization::EXPR_TYPE_TRAIT;
  1322. }
  1323. void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
  1324. VisitExpr(E);
  1325. Record.push_back(E->getTrait());
  1326. Record.push_back(E->getValue());
  1327. Writer.AddSourceRange(E->getSourceRange(), Record);
  1328. Writer.AddTypeSourceInfo(E->getQueriedTypeSourceInfo(), Record);
  1329. Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
  1330. }
  1331. void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
  1332. VisitExpr(E);
  1333. Record.push_back(E->getTrait());
  1334. Record.push_back(E->getValue());
  1335. Writer.AddSourceRange(E->getSourceRange(), Record);
  1336. Writer.AddStmt(E->getQueriedExpression());
  1337. Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
  1338. }
  1339. void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
  1340. VisitExpr(E);
  1341. Record.push_back(E->getValue());
  1342. Writer.AddSourceRange(E->getSourceRange(), Record);
  1343. Writer.AddStmt(E->getOperand());
  1344. Code = serialization::EXPR_CXX_NOEXCEPT;
  1345. }
  1346. void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
  1347. VisitExpr(E);
  1348. Writer.AddSourceLocation(E->getEllipsisLoc(), Record);
  1349. Record.push_back(E->NumExpansions);
  1350. Writer.AddStmt(E->getPattern());
  1351. Code = serialization::EXPR_PACK_EXPANSION;
  1352. }
  1353. void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
  1354. VisitExpr(E);
  1355. Writer.AddSourceLocation(E->OperatorLoc, Record);
  1356. Writer.AddSourceLocation(E->PackLoc, Record);
  1357. Writer.AddSourceLocation(E->RParenLoc, Record);
  1358. Record.push_back(E->Length);
  1359. Writer.AddDeclRef(E->Pack, Record);
  1360. Code = serialization::EXPR_SIZEOF_PACK;
  1361. }
  1362. void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
  1363. SubstNonTypeTemplateParmExpr *E) {
  1364. VisitExpr(E);
  1365. Writer.AddDeclRef(E->getParameter(), Record);
  1366. Writer.AddSourceLocation(E->getNameLoc(), Record);
  1367. Writer.AddStmt(E->getReplacement());
  1368. Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
  1369. }
  1370. void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
  1371. SubstNonTypeTemplateParmPackExpr *E) {
  1372. VisitExpr(E);
  1373. Writer.AddDeclRef(E->getParameterPack(), Record);
  1374. Writer.AddTemplateArgument(E->getArgumentPack(), Record);
  1375. Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
  1376. Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
  1377. }
  1378. void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
  1379. VisitExpr(E);
  1380. Record.push_back(E->getNumExpansions());
  1381. Writer.AddDeclRef(E->getParameterPack(), Record);
  1382. Writer.AddSourceLocation(E->getParameterPackLocation(), Record);
  1383. for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
  1384. I != End; ++I)
  1385. Writer.AddDeclRef(*I, Record);
  1386. Code = serialization::EXPR_FUNCTION_PARM_PACK;
  1387. }
  1388. void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
  1389. VisitExpr(E);
  1390. Writer.AddStmt(E->getTemporary());
  1391. Writer.AddDeclRef(E->getExtendingDecl(), Record);
  1392. Record.push_back(E->getManglingNumber());
  1393. Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
  1394. }
  1395. void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {
  1396. VisitExpr(E);
  1397. Writer.AddSourceLocation(E->LParenLoc, Record);
  1398. Writer.AddSourceLocation(E->EllipsisLoc, Record);
  1399. Writer.AddSourceLocation(E->RParenLoc, Record);
  1400. Writer.AddStmt(E->SubExprs[0]);
  1401. Writer.AddStmt(E->SubExprs[1]);
  1402. Record.push_back(E->Opcode);
  1403. Code = serialization::EXPR_CXX_FOLD;
  1404. }
  1405. void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
  1406. VisitExpr(E);
  1407. Writer.AddStmt(E->getSourceExpr());
  1408. Writer.AddSourceLocation(E->getLocation(), Record);
  1409. Code = serialization::EXPR_OPAQUE_VALUE;
  1410. }
  1411. void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {
  1412. VisitExpr(E);
  1413. // TODO: Figure out sane writer behavior for a TypoExpr, if necessary
  1414. assert(false && "Cannot write TypoExpr nodes");
  1415. }
  1416. //===----------------------------------------------------------------------===//
  1417. // CUDA Expressions and Statements.
  1418. //===----------------------------------------------------------------------===//
  1419. void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
  1420. VisitCallExpr(E);
  1421. Writer.AddStmt(E->getConfig());
  1422. Code = serialization::EXPR_CUDA_KERNEL_CALL;
  1423. }
  1424. //===----------------------------------------------------------------------===//
  1425. // OpenCL Expressions and Statements.
  1426. //===----------------------------------------------------------------------===//
  1427. void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
  1428. VisitExpr(E);
  1429. Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
  1430. Writer.AddSourceLocation(E->getRParenLoc(), Record);
  1431. Writer.AddStmt(E->getSrcExpr());
  1432. Code = serialization::EXPR_ASTYPE;
  1433. }
  1434. //===----------------------------------------------------------------------===//
  1435. // Microsoft Expressions and Statements.
  1436. //===----------------------------------------------------------------------===//
  1437. void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
  1438. VisitExpr(E);
  1439. Record.push_back(E->isArrow());
  1440. Writer.AddStmt(E->getBaseExpr());
  1441. Writer.AddNestedNameSpecifierLoc(E->getQualifierLoc(), Record);
  1442. Writer.AddSourceLocation(E->getMemberLoc(), Record);
  1443. Writer.AddDeclRef(E->getPropertyDecl(), Record);
  1444. Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;
  1445. }
  1446. void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
  1447. VisitExpr(E);
  1448. Writer.AddSourceRange(E->getSourceRange(), Record);
  1449. if (E->isTypeOperand()) {
  1450. Writer.AddTypeSourceInfo(E->getTypeOperandSourceInfo(), Record);
  1451. Code = serialization::EXPR_CXX_UUIDOF_TYPE;
  1452. } else {
  1453. Writer.AddStmt(E->getExprOperand());
  1454. Code = serialization::EXPR_CXX_UUIDOF_EXPR;
  1455. }
  1456. }
  1457. void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
  1458. VisitStmt(S);
  1459. Writer.AddSourceLocation(S->getExceptLoc(), Record);
  1460. Writer.AddStmt(S->getFilterExpr());
  1461. Writer.AddStmt(S->getBlock());
  1462. Code = serialization::STMT_SEH_EXCEPT;
  1463. }
  1464. void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
  1465. VisitStmt(S);
  1466. Writer.AddSourceLocation(S->getFinallyLoc(), Record);
  1467. Writer.AddStmt(S->getBlock());
  1468. Code = serialization::STMT_SEH_FINALLY;
  1469. }
  1470. void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
  1471. VisitStmt(S);
  1472. Record.push_back(S->getIsCXXTry());
  1473. Writer.AddSourceLocation(S->getTryLoc(), Record);
  1474. Writer.AddStmt(S->getTryBlock());
  1475. Writer.AddStmt(S->getHandler());
  1476. Code = serialization::STMT_SEH_TRY;
  1477. }
  1478. void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
  1479. VisitStmt(S);
  1480. Writer.AddSourceLocation(S->getLeaveLoc(), Record);
  1481. Code = serialization::STMT_SEH_LEAVE;
  1482. }
  1483. //===----------------------------------------------------------------------===//
  1484. // OpenMP Clauses.
  1485. //===----------------------------------------------------------------------===//
  1486. namespace clang {
  1487. class OMPClauseWriter : public OMPClauseVisitor<OMPClauseWriter> {
  1488. ASTStmtWriter *Writer;
  1489. ASTWriter::RecordData &Record;
  1490. public:
  1491. OMPClauseWriter(ASTStmtWriter *W, ASTWriter::RecordData &Record)
  1492. : Writer(W), Record(Record) { }
  1493. #define OPENMP_CLAUSE(Name, Class) \
  1494. void Visit##Class(Class *S);
  1495. #include "clang/Basic/OpenMPKinds.def"
  1496. void writeClause(OMPClause *C);
  1497. };
  1498. }
  1499. void OMPClauseWriter::writeClause(OMPClause *C) {
  1500. Record.push_back(C->getClauseKind());
  1501. Visit(C);
  1502. Writer->Writer.AddSourceLocation(C->getLocStart(), Record);
  1503. Writer->Writer.AddSourceLocation(C->getLocEnd(), Record);
  1504. }
  1505. void OMPClauseWriter::VisitOMPIfClause(OMPIfClause *C) {
  1506. Writer->Writer.AddStmt(C->getCondition());
  1507. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1508. }
  1509. void OMPClauseWriter::VisitOMPFinalClause(OMPFinalClause *C) {
  1510. Writer->Writer.AddStmt(C->getCondition());
  1511. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1512. }
  1513. void OMPClauseWriter::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
  1514. Writer->Writer.AddStmt(C->getNumThreads());
  1515. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1516. }
  1517. void OMPClauseWriter::VisitOMPSafelenClause(OMPSafelenClause *C) {
  1518. Writer->Writer.AddStmt(C->getSafelen());
  1519. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1520. }
  1521. void OMPClauseWriter::VisitOMPCollapseClause(OMPCollapseClause *C) {
  1522. Writer->Writer.AddStmt(C->getNumForLoops());
  1523. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1524. }
  1525. void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) {
  1526. Record.push_back(C->getDefaultKind());
  1527. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1528. Writer->Writer.AddSourceLocation(C->getDefaultKindKwLoc(), Record);
  1529. }
  1530. void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *C) {
  1531. Record.push_back(C->getProcBindKind());
  1532. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1533. Writer->Writer.AddSourceLocation(C->getProcBindKindKwLoc(), Record);
  1534. }
  1535. void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *C) {
  1536. Record.push_back(C->getScheduleKind());
  1537. Writer->Writer.AddStmt(C->getChunkSize());
  1538. Writer->Writer.AddStmt(C->getHelperChunkSize());
  1539. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1540. Writer->Writer.AddSourceLocation(C->getScheduleKindLoc(), Record);
  1541. Writer->Writer.AddSourceLocation(C->getCommaLoc(), Record);
  1542. }
  1543. void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *) {}
  1544. void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *) {}
  1545. void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
  1546. void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
  1547. void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
  1548. void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
  1549. void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *) {}
  1550. void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
  1551. void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
  1552. void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) {
  1553. Record.push_back(C->varlist_size());
  1554. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1555. for (auto *VE : C->varlists()) {
  1556. Writer->Writer.AddStmt(VE);
  1557. }
  1558. for (auto *VE : C->private_copies()) {
  1559. Writer->Writer.AddStmt(VE);
  1560. }
  1561. }
  1562. void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
  1563. Record.push_back(C->varlist_size());
  1564. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1565. for (auto *VE : C->varlists()) {
  1566. Writer->Writer.AddStmt(VE);
  1567. }
  1568. for (auto *VE : C->private_copies()) {
  1569. Writer->Writer.AddStmt(VE);
  1570. }
  1571. for (auto *VE : C->inits()) {
  1572. Writer->Writer.AddStmt(VE);
  1573. }
  1574. }
  1575. void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
  1576. Record.push_back(C->varlist_size());
  1577. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1578. for (auto *VE : C->varlists())
  1579. Writer->Writer.AddStmt(VE);
  1580. for (auto *E : C->private_copies())
  1581. Writer->Writer.AddStmt(E);
  1582. for (auto *E : C->source_exprs())
  1583. Writer->Writer.AddStmt(E);
  1584. for (auto *E : C->destination_exprs())
  1585. Writer->Writer.AddStmt(E);
  1586. for (auto *E : C->assignment_ops())
  1587. Writer->Writer.AddStmt(E);
  1588. }
  1589. void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *C) {
  1590. Record.push_back(C->varlist_size());
  1591. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1592. for (auto *VE : C->varlists())
  1593. Writer->Writer.AddStmt(VE);
  1594. }
  1595. void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *C) {
  1596. Record.push_back(C->varlist_size());
  1597. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1598. Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
  1599. Writer->Writer.AddNestedNameSpecifierLoc(C->getQualifierLoc(), Record);
  1600. Writer->Writer.AddDeclarationNameInfo(C->getNameInfo(), Record);
  1601. for (auto *VE : C->varlists())
  1602. Writer->Writer.AddStmt(VE);
  1603. for (auto *E : C->lhs_exprs())
  1604. Writer->Writer.AddStmt(E);
  1605. for (auto *E : C->rhs_exprs())
  1606. Writer->Writer.AddStmt(E);
  1607. for (auto *E : C->reduction_ops())
  1608. Writer->Writer.AddStmt(E);
  1609. }
  1610. void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *C) {
  1611. Record.push_back(C->varlist_size());
  1612. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1613. Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
  1614. for (auto *VE : C->varlists()) {
  1615. Writer->Writer.AddStmt(VE);
  1616. }
  1617. for (auto *VE : C->inits()) {
  1618. Writer->Writer.AddStmt(VE);
  1619. }
  1620. for (auto *VE : C->updates()) {
  1621. Writer->Writer.AddStmt(VE);
  1622. }
  1623. for (auto *VE : C->finals()) {
  1624. Writer->Writer.AddStmt(VE);
  1625. }
  1626. Writer->Writer.AddStmt(C->getStep());
  1627. Writer->Writer.AddStmt(C->getCalcStep());
  1628. }
  1629. void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *C) {
  1630. Record.push_back(C->varlist_size());
  1631. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1632. Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
  1633. for (auto *VE : C->varlists())
  1634. Writer->Writer.AddStmt(VE);
  1635. Writer->Writer.AddStmt(C->getAlignment());
  1636. }
  1637. void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *C) {
  1638. Record.push_back(C->varlist_size());
  1639. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1640. for (auto *VE : C->varlists())
  1641. Writer->Writer.AddStmt(VE);
  1642. for (auto *E : C->source_exprs())
  1643. Writer->Writer.AddStmt(E);
  1644. for (auto *E : C->destination_exprs())
  1645. Writer->Writer.AddStmt(E);
  1646. for (auto *E : C->assignment_ops())
  1647. Writer->Writer.AddStmt(E);
  1648. }
  1649. void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
  1650. Record.push_back(C->varlist_size());
  1651. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1652. for (auto *VE : C->varlists())
  1653. Writer->Writer.AddStmt(VE);
  1654. for (auto *E : C->source_exprs())
  1655. Writer->Writer.AddStmt(E);
  1656. for (auto *E : C->destination_exprs())
  1657. Writer->Writer.AddStmt(E);
  1658. for (auto *E : C->assignment_ops())
  1659. Writer->Writer.AddStmt(E);
  1660. }
  1661. void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *C) {
  1662. Record.push_back(C->varlist_size());
  1663. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1664. for (auto *VE : C->varlists())
  1665. Writer->Writer.AddStmt(VE);
  1666. }
  1667. void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *C) {
  1668. Record.push_back(C->varlist_size());
  1669. Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record);
  1670. Record.push_back(C->getDependencyKind());
  1671. Writer->Writer.AddSourceLocation(C->getDependencyLoc(), Record);
  1672. Writer->Writer.AddSourceLocation(C->getColonLoc(), Record);
  1673. for (auto *VE : C->varlists())
  1674. Writer->Writer.AddStmt(VE);
  1675. }
  1676. //===----------------------------------------------------------------------===//
  1677. // OpenMP Directives.
  1678. //===----------------------------------------------------------------------===//
  1679. void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
  1680. Writer.AddSourceLocation(E->getLocStart(), Record);
  1681. Writer.AddSourceLocation(E->getLocEnd(), Record);
  1682. OMPClauseWriter ClauseWriter(this, Record);
  1683. for (unsigned i = 0; i < E->getNumClauses(); ++i) {
  1684. ClauseWriter.writeClause(E->getClause(i));
  1685. }
  1686. if (E->hasAssociatedStmt())
  1687. Writer.AddStmt(E->getAssociatedStmt());
  1688. }
  1689. void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {
  1690. VisitStmt(D);
  1691. Record.push_back(D->getNumClauses());
  1692. Record.push_back(D->getCollapsedNumber());
  1693. VisitOMPExecutableDirective(D);
  1694. Writer.AddStmt(D->getIterationVariable());
  1695. Writer.AddStmt(D->getLastIteration());
  1696. Writer.AddStmt(D->getCalcLastIteration());
  1697. Writer.AddStmt(D->getPreCond());
  1698. Writer.AddStmt(D->getCond());
  1699. Writer.AddStmt(D->getInit());
  1700. Writer.AddStmt(D->getInc());
  1701. if (isOpenMPWorksharingDirective(D->getDirectiveKind())) {
  1702. Writer.AddStmt(D->getIsLastIterVariable());
  1703. Writer.AddStmt(D->getLowerBoundVariable());
  1704. Writer.AddStmt(D->getUpperBoundVariable());
  1705. Writer.AddStmt(D->getStrideVariable());
  1706. Writer.AddStmt(D->getEnsureUpperBound());
  1707. Writer.AddStmt(D->getNextLowerBound());
  1708. Writer.AddStmt(D->getNextUpperBound());
  1709. }
  1710. for (auto I : D->counters()) {
  1711. Writer.AddStmt(I);
  1712. }
  1713. for (auto I : D->inits()) {
  1714. Writer.AddStmt(I);
  1715. }
  1716. for (auto I : D->updates()) {
  1717. Writer.AddStmt(I);
  1718. }
  1719. for (auto I : D->finals()) {
  1720. Writer.AddStmt(I);
  1721. }
  1722. }
  1723. void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
  1724. VisitStmt(D);
  1725. Record.push_back(D->getNumClauses());
  1726. VisitOMPExecutableDirective(D);
  1727. Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
  1728. }
  1729. void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
  1730. VisitOMPLoopDirective(D);
  1731. Code = serialization::STMT_OMP_SIMD_DIRECTIVE;
  1732. }
  1733. void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
  1734. VisitOMPLoopDirective(D);
  1735. Code = serialization::STMT_OMP_FOR_DIRECTIVE;
  1736. }
  1737. void ASTStmtWriter::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
  1738. VisitOMPLoopDirective(D);
  1739. Code = serialization::STMT_OMP_FOR_SIMD_DIRECTIVE;
  1740. }
  1741. void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
  1742. VisitStmt(D);
  1743. Record.push_back(D->getNumClauses());
  1744. VisitOMPExecutableDirective(D);
  1745. Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
  1746. }
  1747. void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
  1748. VisitStmt(D);
  1749. VisitOMPExecutableDirective(D);
  1750. Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
  1751. }
  1752. void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {
  1753. VisitStmt(D);
  1754. Record.push_back(D->getNumClauses());
  1755. VisitOMPExecutableDirective(D);
  1756. Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;
  1757. }
  1758. void ASTStmtWriter::VisitOMPMasterDirective(OMPMasterDirective *D) {
  1759. VisitStmt(D);
  1760. VisitOMPExecutableDirective(D);
  1761. Code = serialization::STMT_OMP_MASTER_DIRECTIVE;
  1762. }
  1763. void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
  1764. VisitStmt(D);
  1765. VisitOMPExecutableDirective(D);
  1766. Writer.AddDeclarationNameInfo(D->getDirectiveName(), Record);
  1767. Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;
  1768. }
  1769. void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
  1770. VisitOMPLoopDirective(D);
  1771. Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
  1772. }
  1773. void ASTStmtWriter::VisitOMPParallelForSimdDirective(
  1774. OMPParallelForSimdDirective *D) {
  1775. VisitOMPLoopDirective(D);
  1776. Code = serialization::STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE;
  1777. }
  1778. void ASTStmtWriter::VisitOMPParallelSectionsDirective(
  1779. OMPParallelSectionsDirective *D) {
  1780. VisitStmt(D);
  1781. Record.push_back(D->getNumClauses());
  1782. VisitOMPExecutableDirective(D);
  1783. Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
  1784. }
  1785. void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {
  1786. VisitStmt(D);
  1787. Record.push_back(D->getNumClauses());
  1788. VisitOMPExecutableDirective(D);
  1789. Code = serialization::STMT_OMP_TASK_DIRECTIVE;
  1790. }
  1791. void ASTStmtWriter::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
  1792. VisitStmt(D);
  1793. Record.push_back(D->getNumClauses());
  1794. VisitOMPExecutableDirective(D);
  1795. Writer.AddStmt(D->getX());
  1796. Writer.AddStmt(D->getV());
  1797. Writer.AddStmt(D->getExpr());
  1798. Writer.AddStmt(D->getUpdateExpr());
  1799. Record.push_back(D->isXLHSInRHSPart() ? 1 : 0);
  1800. Record.push_back(D->isPostfixUpdate() ? 1 : 0);
  1801. Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;
  1802. }
  1803. void ASTStmtWriter::VisitOMPTargetDirective(OMPTargetDirective *D) {
  1804. VisitStmt(D);
  1805. Record.push_back(D->getNumClauses());
  1806. VisitOMPExecutableDirective(D);
  1807. Code = serialization::STMT_OMP_TARGET_DIRECTIVE;
  1808. }
  1809. void ASTStmtWriter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
  1810. VisitStmt(D);
  1811. VisitOMPExecutableDirective(D);
  1812. Code = serialization::STMT_OMP_TASKYIELD_DIRECTIVE;
  1813. }
  1814. void ASTStmtWriter::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
  1815. VisitStmt(D);
  1816. VisitOMPExecutableDirective(D);
  1817. Code = serialization::STMT_OMP_BARRIER_DIRECTIVE;
  1818. }
  1819. void ASTStmtWriter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
  1820. VisitStmt(D);
  1821. VisitOMPExecutableDirective(D);
  1822. Code = serialization::STMT_OMP_TASKWAIT_DIRECTIVE;
  1823. }
  1824. void ASTStmtWriter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
  1825. VisitStmt(D);
  1826. VisitOMPExecutableDirective(D);
  1827. Code = serialization::STMT_OMP_TASKGROUP_DIRECTIVE;
  1828. }
  1829. void ASTStmtWriter::VisitOMPFlushDirective(OMPFlushDirective *D) {
  1830. VisitStmt(D);
  1831. Record.push_back(D->getNumClauses());
  1832. VisitOMPExecutableDirective(D);
  1833. Code = serialization::STMT_OMP_FLUSH_DIRECTIVE;
  1834. }
  1835. void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
  1836. VisitStmt(D);
  1837. VisitOMPExecutableDirective(D);
  1838. Code = serialization::STMT_OMP_ORDERED_DIRECTIVE;
  1839. }
  1840. void ASTStmtWriter::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
  1841. VisitStmt(D);
  1842. Record.push_back(D->getNumClauses());
  1843. VisitOMPExecutableDirective(D);
  1844. Code = serialization::STMT_OMP_TEAMS_DIRECTIVE;
  1845. }
  1846. void ASTStmtWriter::VisitOMPCancellationPointDirective(
  1847. OMPCancellationPointDirective *D) {
  1848. VisitStmt(D);
  1849. VisitOMPExecutableDirective(D);
  1850. Record.push_back(D->getCancelRegion());
  1851. Code = serialization::STMT_OMP_CANCELLATION_POINT_DIRECTIVE;
  1852. }
  1853. void ASTStmtWriter::VisitOMPCancelDirective(OMPCancelDirective *D) {
  1854. VisitStmt(D);
  1855. VisitOMPExecutableDirective(D);
  1856. Record.push_back(D->getCancelRegion());
  1857. Code = serialization::STMT_OMP_CANCEL_DIRECTIVE;
  1858. }
  1859. //===----------------------------------------------------------------------===//
  1860. // ASTWriter Implementation
  1861. //===----------------------------------------------------------------------===//
  1862. unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
  1863. assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
  1864. "SwitchCase recorded twice");
  1865. unsigned NextID = SwitchCaseIDs.size();
  1866. SwitchCaseIDs[S] = NextID;
  1867. return NextID;
  1868. }
  1869. unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
  1870. assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
  1871. "SwitchCase hasn't been seen yet");
  1872. return SwitchCaseIDs[S];
  1873. }
  1874. void ASTWriter::ClearSwitchCaseIDs() {
  1875. SwitchCaseIDs.clear();
  1876. }
  1877. /// \brief Write the given substatement or subexpression to the
  1878. /// bitstream.
  1879. void ASTWriter::WriteSubStmt(Stmt *S,
  1880. llvm::DenseMap<Stmt *, uint64_t> &SubStmtEntries,
  1881. llvm::DenseSet<Stmt *> &ParentStmts) {
  1882. RecordData Record;
  1883. ASTStmtWriter Writer(*this, Record);
  1884. ++NumStatements;
  1885. if (!S) {
  1886. Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
  1887. return;
  1888. }
  1889. llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
  1890. if (I != SubStmtEntries.end()) {
  1891. Record.push_back(I->second);
  1892. Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
  1893. return;
  1894. }
  1895. #ifndef NDEBUG
  1896. assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
  1897. struct ParentStmtInserterRAII {
  1898. Stmt *S;
  1899. llvm::DenseSet<Stmt *> &ParentStmts;
  1900. ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
  1901. : S(S), ParentStmts(ParentStmts) {
  1902. ParentStmts.insert(S);
  1903. }
  1904. ~ParentStmtInserterRAII() {
  1905. ParentStmts.erase(S);
  1906. }
  1907. };
  1908. ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
  1909. #endif
  1910. // Redirect ASTWriter::AddStmt to collect sub-stmts.
  1911. SmallVector<Stmt *, 16> SubStmts;
  1912. CollectedStmts = &SubStmts;
  1913. Writer.Code = serialization::STMT_NULL_PTR;
  1914. Writer.AbbrevToUse = 0;
  1915. Writer.Visit(S);
  1916. #ifndef NDEBUG
  1917. if (Writer.Code == serialization::STMT_NULL_PTR) {
  1918. SourceManager &SrcMgr
  1919. = DeclIDs.begin()->first->getASTContext().getSourceManager();
  1920. S->dump(SrcMgr);
  1921. llvm_unreachable("Unhandled sub-statement writing AST file");
  1922. }
  1923. #endif
  1924. // Revert ASTWriter::AddStmt.
  1925. CollectedStmts = &StmtsToEmit;
  1926. // Write the sub-stmts in reverse order, last to first. When reading them back
  1927. // we will read them in correct order by "pop"ing them from the Stmts stack.
  1928. // This simplifies reading and allows to store a variable number of sub-stmts
  1929. // without knowing it in advance.
  1930. while (!SubStmts.empty())
  1931. WriteSubStmt(SubStmts.pop_back_val(), SubStmtEntries, ParentStmts);
  1932. Stream.EmitRecord(Writer.Code, Record, Writer.AbbrevToUse);
  1933. SubStmtEntries[S] = Stream.GetCurrentBitNo();
  1934. }
  1935. /// \brief Flush all of the statements that have been added to the
  1936. /// queue via AddStmt().
  1937. void ASTWriter::FlushStmts() {
  1938. RecordData Record;
  1939. // We expect to be the only consumer of the two temporary statement maps,
  1940. // assert that they are empty.
  1941. assert(SubStmtEntries.empty() && "unexpected entries in sub-stmt map");
  1942. assert(ParentStmts.empty() && "unexpected entries in parent stmt map");
  1943. for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
  1944. WriteSubStmt(StmtsToEmit[I], SubStmtEntries, ParentStmts);
  1945. assert(N == StmtsToEmit.size() &&
  1946. "Substatement written via AddStmt rather than WriteSubStmt!");
  1947. // Note that we are at the end of a full expression. Any
  1948. // expression records that follow this one are part of a different
  1949. // expression.
  1950. Stream.EmitRecord(serialization::STMT_STOP, Record);
  1951. SubStmtEntries.clear();
  1952. ParentStmts.clear();
  1953. }
  1954. StmtsToEmit.clear();
  1955. }