]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r305145, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / AST / StmtProfile.cpp
1 //===---- StmtProfile.cpp - Profile implementation for Stmt ASTs ----------===//
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 // This file implements the Stmt::Profile method, which builds a unique bit
11 // representation that identifies a statement/expression.
12 //
13 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/DeclCXX.h"
16 #include "clang/AST/DeclObjC.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/ExprCXX.h"
20 #include "clang/AST/ExprObjC.h"
21 #include "clang/AST/ExprOpenMP.h"
22 #include "clang/AST/ODRHash.h"
23 #include "clang/AST/StmtVisitor.h"
24 #include "llvm/ADT/FoldingSet.h"
25 using namespace clang;
26
27 namespace {
28   class StmtProfiler : public ConstStmtVisitor<StmtProfiler> {
29   protected:
30     llvm::FoldingSetNodeID &ID;
31     bool Canonical;
32
33   public:
34     StmtProfiler(llvm::FoldingSetNodeID &ID, bool Canonical)
35         : ID(ID), Canonical(Canonical) {}
36
37     virtual ~StmtProfiler() {}
38
39     void VisitStmt(const Stmt *S);
40
41 #define STMT(Node, Base) void Visit##Node(const Node *S);
42 #include "clang/AST/StmtNodes.inc"
43
44     /// \brief Visit a declaration that is referenced within an expression
45     /// or statement.
46     virtual void VisitDecl(const Decl *D) = 0;
47
48     /// \brief Visit a type that is referenced within an expression or
49     /// statement.
50     virtual void VisitType(QualType T) = 0;
51
52     /// \brief Visit a name that occurs within an expression or statement.
53     virtual void VisitName(DeclarationName Name) = 0;
54
55     /// \brief Visit identifiers that are not in Decl's or Type's.
56     virtual void VisitIdentifierInfo(IdentifierInfo *II) = 0;
57
58     /// \brief Visit a nested-name-specifier that occurs within an expression
59     /// or statement.
60     virtual void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) = 0;
61
62     /// \brief Visit a template name that occurs within an expression or
63     /// statement.
64     virtual void VisitTemplateName(TemplateName Name) = 0;
65
66     /// \brief Visit template arguments that occur within an expression or
67     /// statement.
68     void VisitTemplateArguments(const TemplateArgumentLoc *Args,
69                                 unsigned NumArgs);
70
71     /// \brief Visit a single template argument.
72     void VisitTemplateArgument(const TemplateArgument &Arg);
73   };
74
75   class StmtProfilerWithPointers : public StmtProfiler {
76     const ASTContext &Context;
77
78   public:
79     StmtProfilerWithPointers(llvm::FoldingSetNodeID &ID,
80                              const ASTContext &Context, bool Canonical)
81         : StmtProfiler(ID, Canonical), Context(Context) {}
82   private:
83     void VisitDecl(const Decl *D) override {
84       ID.AddInteger(D ? D->getKind() : 0);
85
86       if (Canonical && D) {
87         if (const NonTypeTemplateParmDecl *NTTP =
88                 dyn_cast<NonTypeTemplateParmDecl>(D)) {
89           ID.AddInteger(NTTP->getDepth());
90           ID.AddInteger(NTTP->getIndex());
91           ID.AddBoolean(NTTP->isParameterPack());
92           VisitType(NTTP->getType());
93           return;
94         }
95
96         if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
97           // The Itanium C++ ABI uses the type, scope depth, and scope
98           // index of a parameter when mangling expressions that involve
99           // function parameters, so we will use the parameter's type for
100           // establishing function parameter identity. That way, our
101           // definition of "equivalent" (per C++ [temp.over.link]) is at
102           // least as strong as the definition of "equivalent" used for
103           // name mangling.
104           VisitType(Parm->getType());
105           ID.AddInteger(Parm->getFunctionScopeDepth());
106           ID.AddInteger(Parm->getFunctionScopeIndex());
107           return;
108         }
109
110         if (const TemplateTypeParmDecl *TTP =
111                 dyn_cast<TemplateTypeParmDecl>(D)) {
112           ID.AddInteger(TTP->getDepth());
113           ID.AddInteger(TTP->getIndex());
114           ID.AddBoolean(TTP->isParameterPack());
115           return;
116         }
117
118         if (const TemplateTemplateParmDecl *TTP =
119                 dyn_cast<TemplateTemplateParmDecl>(D)) {
120           ID.AddInteger(TTP->getDepth());
121           ID.AddInteger(TTP->getIndex());
122           ID.AddBoolean(TTP->isParameterPack());
123           return;
124         }
125       }
126
127       ID.AddPointer(D ? D->getCanonicalDecl() : nullptr);
128     }
129
130     void VisitType(QualType T) override {
131       if (Canonical && !T.isNull())
132         T = Context.getCanonicalType(T);
133
134       ID.AddPointer(T.getAsOpaquePtr());
135     }
136
137     void VisitName(DeclarationName Name) override {
138       ID.AddPointer(Name.getAsOpaquePtr());
139     }
140
141     void VisitIdentifierInfo(IdentifierInfo *II) override {
142       ID.AddPointer(II);
143     }
144
145     void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
146       if (Canonical)
147         NNS = Context.getCanonicalNestedNameSpecifier(NNS);
148       ID.AddPointer(NNS);
149     }
150
151     void VisitTemplateName(TemplateName Name) override {
152       if (Canonical)
153         Name = Context.getCanonicalTemplateName(Name);
154
155       Name.Profile(ID);
156     }
157   };
158
159   class StmtProfilerWithoutPointers : public StmtProfiler {
160     ODRHash &Hash;
161   public:
162     StmtProfilerWithoutPointers(llvm::FoldingSetNodeID &ID, ODRHash &Hash)
163         : StmtProfiler(ID, false), Hash(Hash) {}
164
165   private:
166     void VisitType(QualType T) override {
167       Hash.AddQualType(T);
168     }
169
170     void VisitName(DeclarationName Name) override {
171       Hash.AddDeclarationName(Name);
172     }
173     void VisitIdentifierInfo(IdentifierInfo *II) override {
174       ID.AddBoolean(II);
175       if (II) {
176         Hash.AddIdentifierInfo(II);
177       }
178     }
179     void VisitDecl(const Decl *D) override {
180       ID.AddBoolean(D);
181       if (D) {
182         Hash.AddDecl(D);
183       }
184     }
185     void VisitTemplateName(TemplateName Name) override {
186       Hash.AddTemplateName(Name);
187     }
188     void VisitNestedNameSpecifier(NestedNameSpecifier *NNS) override {
189       Hash.AddNestedNameSpecifier(NNS);
190     }
191   };
192 }
193
194 void StmtProfiler::VisitStmt(const Stmt *S) {
195   assert(S && "Requires non-null Stmt pointer");
196   ID.AddInteger(S->getStmtClass());
197   for (const Stmt *SubStmt : S->children()) {
198     if (SubStmt)
199       Visit(SubStmt);
200     else
201       ID.AddInteger(0);
202   }
203 }
204
205 void StmtProfiler::VisitDeclStmt(const DeclStmt *S) {
206   VisitStmt(S);
207   for (const auto *D : S->decls())
208     VisitDecl(D);
209 }
210
211 void StmtProfiler::VisitNullStmt(const NullStmt *S) {
212   VisitStmt(S);
213 }
214
215 void StmtProfiler::VisitCompoundStmt(const CompoundStmt *S) {
216   VisitStmt(S);
217 }
218
219 void StmtProfiler::VisitCaseStmt(const CaseStmt *S) {
220   VisitStmt(S);
221 }
222
223 void StmtProfiler::VisitDefaultStmt(const DefaultStmt *S) {
224   VisitStmt(S);
225 }
226
227 void StmtProfiler::VisitLabelStmt(const LabelStmt *S) {
228   VisitStmt(S);
229   VisitDecl(S->getDecl());
230 }
231
232 void StmtProfiler::VisitAttributedStmt(const AttributedStmt *S) {
233   VisitStmt(S);
234   // TODO: maybe visit attributes?
235 }
236
237 void StmtProfiler::VisitIfStmt(const IfStmt *S) {
238   VisitStmt(S);
239   VisitDecl(S->getConditionVariable());
240 }
241
242 void StmtProfiler::VisitSwitchStmt(const SwitchStmt *S) {
243   VisitStmt(S);
244   VisitDecl(S->getConditionVariable());
245 }
246
247 void StmtProfiler::VisitWhileStmt(const WhileStmt *S) {
248   VisitStmt(S);
249   VisitDecl(S->getConditionVariable());
250 }
251
252 void StmtProfiler::VisitDoStmt(const DoStmt *S) {
253   VisitStmt(S);
254 }
255
256 void StmtProfiler::VisitForStmt(const ForStmt *S) {
257   VisitStmt(S);
258 }
259
260 void StmtProfiler::VisitGotoStmt(const GotoStmt *S) {
261   VisitStmt(S);
262   VisitDecl(S->getLabel());
263 }
264
265 void StmtProfiler::VisitIndirectGotoStmt(const IndirectGotoStmt *S) {
266   VisitStmt(S);
267 }
268
269 void StmtProfiler::VisitContinueStmt(const ContinueStmt *S) {
270   VisitStmt(S);
271 }
272
273 void StmtProfiler::VisitBreakStmt(const BreakStmt *S) {
274   VisitStmt(S);
275 }
276
277 void StmtProfiler::VisitReturnStmt(const ReturnStmt *S) {
278   VisitStmt(S);
279 }
280
281 void StmtProfiler::VisitGCCAsmStmt(const GCCAsmStmt *S) {
282   VisitStmt(S);
283   ID.AddBoolean(S->isVolatile());
284   ID.AddBoolean(S->isSimple());
285   VisitStringLiteral(S->getAsmString());
286   ID.AddInteger(S->getNumOutputs());
287   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
288     ID.AddString(S->getOutputName(I));
289     VisitStringLiteral(S->getOutputConstraintLiteral(I));
290   }
291   ID.AddInteger(S->getNumInputs());
292   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
293     ID.AddString(S->getInputName(I));
294     VisitStringLiteral(S->getInputConstraintLiteral(I));
295   }
296   ID.AddInteger(S->getNumClobbers());
297   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
298     VisitStringLiteral(S->getClobberStringLiteral(I));
299 }
300
301 void StmtProfiler::VisitMSAsmStmt(const MSAsmStmt *S) {
302   // FIXME: Implement MS style inline asm statement profiler.
303   VisitStmt(S);
304 }
305
306 void StmtProfiler::VisitCXXCatchStmt(const CXXCatchStmt *S) {
307   VisitStmt(S);
308   VisitType(S->getCaughtType());
309 }
310
311 void StmtProfiler::VisitCXXTryStmt(const CXXTryStmt *S) {
312   VisitStmt(S);
313 }
314
315 void StmtProfiler::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
316   VisitStmt(S);
317 }
318
319 void StmtProfiler::VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
320   VisitStmt(S);
321   ID.AddBoolean(S->isIfExists());
322   VisitNestedNameSpecifier(S->getQualifierLoc().getNestedNameSpecifier());
323   VisitName(S->getNameInfo().getName());
324 }
325
326 void StmtProfiler::VisitSEHTryStmt(const SEHTryStmt *S) {
327   VisitStmt(S);
328 }
329
330 void StmtProfiler::VisitSEHFinallyStmt(const SEHFinallyStmt *S) {
331   VisitStmt(S);
332 }
333
334 void StmtProfiler::VisitSEHExceptStmt(const SEHExceptStmt *S) {
335   VisitStmt(S);
336 }
337
338 void StmtProfiler::VisitSEHLeaveStmt(const SEHLeaveStmt *S) {
339   VisitStmt(S);
340 }
341
342 void StmtProfiler::VisitCapturedStmt(const CapturedStmt *S) {
343   VisitStmt(S);
344 }
345
346 void StmtProfiler::VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
347   VisitStmt(S);
348 }
349
350 void StmtProfiler::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *S) {
351   VisitStmt(S);
352   ID.AddBoolean(S->hasEllipsis());
353   if (S->getCatchParamDecl())
354     VisitType(S->getCatchParamDecl()->getType());
355 }
356
357 void StmtProfiler::VisitObjCAtFinallyStmt(const ObjCAtFinallyStmt *S) {
358   VisitStmt(S);
359 }
360
361 void StmtProfiler::VisitObjCAtTryStmt(const ObjCAtTryStmt *S) {
362   VisitStmt(S);
363 }
364
365 void
366 StmtProfiler::VisitObjCAtSynchronizedStmt(const ObjCAtSynchronizedStmt *S) {
367   VisitStmt(S);
368 }
369
370 void StmtProfiler::VisitObjCAtThrowStmt(const ObjCAtThrowStmt *S) {
371   VisitStmt(S);
372 }
373
374 void
375 StmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) {
376   VisitStmt(S);
377 }
378
379 namespace {
380 class OMPClauseProfiler : public ConstOMPClauseVisitor<OMPClauseProfiler> {
381   StmtProfiler *Profiler;
382   /// \brief Process clauses with list of variables.
383   template <typename T>
384   void VisitOMPClauseList(T *Node);
385
386 public:
387   OMPClauseProfiler(StmtProfiler *P) : Profiler(P) { }
388 #define OPENMP_CLAUSE(Name, Class)                                             \
389   void Visit##Class(const Class *C);
390 #include "clang/Basic/OpenMPKinds.def"
391   void VistOMPClauseWithPreInit(const OMPClauseWithPreInit *C);
392   void VistOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C);
393 };
394
395 void OMPClauseProfiler::VistOMPClauseWithPreInit(
396     const OMPClauseWithPreInit *C) {
397   if (auto *S = C->getPreInitStmt())
398     Profiler->VisitStmt(S);
399 }
400
401 void OMPClauseProfiler::VistOMPClauseWithPostUpdate(
402     const OMPClauseWithPostUpdate *C) {
403   VistOMPClauseWithPreInit(C);
404   if (auto *E = C->getPostUpdateExpr())
405     Profiler->VisitStmt(E);
406 }
407
408 void OMPClauseProfiler::VisitOMPIfClause(const OMPIfClause *C) {
409   VistOMPClauseWithPreInit(C);
410   if (C->getCondition())
411     Profiler->VisitStmt(C->getCondition());
412 }
413
414 void OMPClauseProfiler::VisitOMPFinalClause(const OMPFinalClause *C) {
415   if (C->getCondition())
416     Profiler->VisitStmt(C->getCondition());
417 }
418
419 void OMPClauseProfiler::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
420   VistOMPClauseWithPreInit(C);
421   if (C->getNumThreads())
422     Profiler->VisitStmt(C->getNumThreads());
423 }
424
425 void OMPClauseProfiler::VisitOMPSafelenClause(const OMPSafelenClause *C) {
426   if (C->getSafelen())
427     Profiler->VisitStmt(C->getSafelen());
428 }
429
430 void OMPClauseProfiler::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
431   if (C->getSimdlen())
432     Profiler->VisitStmt(C->getSimdlen());
433 }
434
435 void OMPClauseProfiler::VisitOMPCollapseClause(const OMPCollapseClause *C) {
436   if (C->getNumForLoops())
437     Profiler->VisitStmt(C->getNumForLoops());
438 }
439
440 void OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
441
442 void OMPClauseProfiler::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
443
444 void OMPClauseProfiler::VisitOMPScheduleClause(const OMPScheduleClause *C) {
445   VistOMPClauseWithPreInit(C);
446   if (auto *S = C->getChunkSize())
447     Profiler->VisitStmt(S);
448 }
449
450 void OMPClauseProfiler::VisitOMPOrderedClause(const OMPOrderedClause *C) {
451   if (auto *Num = C->getNumForLoops())
452     Profiler->VisitStmt(Num);
453 }
454
455 void OMPClauseProfiler::VisitOMPNowaitClause(const OMPNowaitClause *) {}
456
457 void OMPClauseProfiler::VisitOMPUntiedClause(const OMPUntiedClause *) {}
458
459 void OMPClauseProfiler::VisitOMPMergeableClause(const OMPMergeableClause *) {}
460
461 void OMPClauseProfiler::VisitOMPReadClause(const OMPReadClause *) {}
462
463 void OMPClauseProfiler::VisitOMPWriteClause(const OMPWriteClause *) {}
464
465 void OMPClauseProfiler::VisitOMPUpdateClause(const OMPUpdateClause *) {}
466
467 void OMPClauseProfiler::VisitOMPCaptureClause(const OMPCaptureClause *) {}
468
469 void OMPClauseProfiler::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
470
471 void OMPClauseProfiler::VisitOMPThreadsClause(const OMPThreadsClause *) {}
472
473 void OMPClauseProfiler::VisitOMPSIMDClause(const OMPSIMDClause *) {}
474
475 void OMPClauseProfiler::VisitOMPNogroupClause(const OMPNogroupClause *) {}
476
477 template<typename T>
478 void OMPClauseProfiler::VisitOMPClauseList(T *Node) {
479   for (auto *E : Node->varlists()) {
480     if (E)
481       Profiler->VisitStmt(E);
482   }
483 }
484
485 void OMPClauseProfiler::VisitOMPPrivateClause(const OMPPrivateClause *C) {
486   VisitOMPClauseList(C);
487   for (auto *E : C->private_copies()) {
488     if (E)
489       Profiler->VisitStmt(E);
490   }
491 }
492 void
493 OMPClauseProfiler::VisitOMPFirstprivateClause(const OMPFirstprivateClause *C) {
494   VisitOMPClauseList(C);
495   VistOMPClauseWithPreInit(C);
496   for (auto *E : C->private_copies()) {
497     if (E)
498       Profiler->VisitStmt(E);
499   }
500   for (auto *E : C->inits()) {
501     if (E)
502       Profiler->VisitStmt(E);
503   }
504 }
505 void
506 OMPClauseProfiler::VisitOMPLastprivateClause(const OMPLastprivateClause *C) {
507   VisitOMPClauseList(C);
508   VistOMPClauseWithPostUpdate(C);
509   for (auto *E : C->source_exprs()) {
510     if (E)
511       Profiler->VisitStmt(E);
512   }
513   for (auto *E : C->destination_exprs()) {
514     if (E)
515       Profiler->VisitStmt(E);
516   }
517   for (auto *E : C->assignment_ops()) {
518     if (E)
519       Profiler->VisitStmt(E);
520   }
521 }
522 void OMPClauseProfiler::VisitOMPSharedClause(const OMPSharedClause *C) {
523   VisitOMPClauseList(C);
524 }
525 void OMPClauseProfiler::VisitOMPReductionClause(
526                                          const OMPReductionClause *C) {
527   Profiler->VisitNestedNameSpecifier(
528       C->getQualifierLoc().getNestedNameSpecifier());
529   Profiler->VisitName(C->getNameInfo().getName());
530   VisitOMPClauseList(C);
531   VistOMPClauseWithPostUpdate(C);
532   for (auto *E : C->privates()) {
533     if (E)
534       Profiler->VisitStmt(E);
535   }
536   for (auto *E : C->lhs_exprs()) {
537     if (E)
538       Profiler->VisitStmt(E);
539   }
540   for (auto *E : C->rhs_exprs()) {
541     if (E)
542       Profiler->VisitStmt(E);
543   }
544   for (auto *E : C->reduction_ops()) {
545     if (E)
546       Profiler->VisitStmt(E);
547   }
548 }
549 void OMPClauseProfiler::VisitOMPLinearClause(const OMPLinearClause *C) {
550   VisitOMPClauseList(C);
551   VistOMPClauseWithPostUpdate(C);
552   for (auto *E : C->privates()) {
553     if (E)
554       Profiler->VisitStmt(E);
555   }
556   for (auto *E : C->inits()) {
557     if (E)
558       Profiler->VisitStmt(E);
559   }
560   for (auto *E : C->updates()) {
561     if (E)
562       Profiler->VisitStmt(E);
563   }
564   for (auto *E : C->finals()) {
565     if (E)
566       Profiler->VisitStmt(E);
567   }
568   if (C->getStep())
569     Profiler->VisitStmt(C->getStep());
570   if (C->getCalcStep())
571     Profiler->VisitStmt(C->getCalcStep());
572 }
573 void OMPClauseProfiler::VisitOMPAlignedClause(const OMPAlignedClause *C) {
574   VisitOMPClauseList(C);
575   if (C->getAlignment())
576     Profiler->VisitStmt(C->getAlignment());
577 }
578 void OMPClauseProfiler::VisitOMPCopyinClause(const OMPCopyinClause *C) {
579   VisitOMPClauseList(C);
580   for (auto *E : C->source_exprs()) {
581     if (E)
582       Profiler->VisitStmt(E);
583   }
584   for (auto *E : C->destination_exprs()) {
585     if (E)
586       Profiler->VisitStmt(E);
587   }
588   for (auto *E : C->assignment_ops()) {
589     if (E)
590       Profiler->VisitStmt(E);
591   }
592 }
593 void
594 OMPClauseProfiler::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
595   VisitOMPClauseList(C);
596   for (auto *E : C->source_exprs()) {
597     if (E)
598       Profiler->VisitStmt(E);
599   }
600   for (auto *E : C->destination_exprs()) {
601     if (E)
602       Profiler->VisitStmt(E);
603   }
604   for (auto *E : C->assignment_ops()) {
605     if (E)
606       Profiler->VisitStmt(E);
607   }
608 }
609 void OMPClauseProfiler::VisitOMPFlushClause(const OMPFlushClause *C) {
610   VisitOMPClauseList(C);
611 }
612 void OMPClauseProfiler::VisitOMPDependClause(const OMPDependClause *C) {
613   VisitOMPClauseList(C);
614 }
615 void OMPClauseProfiler::VisitOMPDeviceClause(const OMPDeviceClause *C) {
616   if (C->getDevice())
617     Profiler->VisitStmt(C->getDevice());
618 }
619 void OMPClauseProfiler::VisitOMPMapClause(const OMPMapClause *C) {
620   VisitOMPClauseList(C);
621 }
622 void OMPClauseProfiler::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
623   VistOMPClauseWithPreInit(C);
624   if (C->getNumTeams())
625     Profiler->VisitStmt(C->getNumTeams());
626 }
627 void OMPClauseProfiler::VisitOMPThreadLimitClause(
628     const OMPThreadLimitClause *C) {
629   VistOMPClauseWithPreInit(C);
630   if (C->getThreadLimit())
631     Profiler->VisitStmt(C->getThreadLimit());
632 }
633 void OMPClauseProfiler::VisitOMPPriorityClause(const OMPPriorityClause *C) {
634   if (C->getPriority())
635     Profiler->VisitStmt(C->getPriority());
636 }
637 void OMPClauseProfiler::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
638   if (C->getGrainsize())
639     Profiler->VisitStmt(C->getGrainsize());
640 }
641 void OMPClauseProfiler::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
642   if (C->getNumTasks())
643     Profiler->VisitStmt(C->getNumTasks());
644 }
645 void OMPClauseProfiler::VisitOMPHintClause(const OMPHintClause *C) {
646   if (C->getHint())
647     Profiler->VisitStmt(C->getHint());
648 }
649 void OMPClauseProfiler::VisitOMPToClause(const OMPToClause *C) {
650   VisitOMPClauseList(C);
651 }
652 void OMPClauseProfiler::VisitOMPFromClause(const OMPFromClause *C) {
653   VisitOMPClauseList(C);
654 }
655 void OMPClauseProfiler::VisitOMPUseDevicePtrClause(
656     const OMPUseDevicePtrClause *C) {
657   VisitOMPClauseList(C);
658 }
659 void OMPClauseProfiler::VisitOMPIsDevicePtrClause(
660     const OMPIsDevicePtrClause *C) {
661   VisitOMPClauseList(C);
662 }
663 }
664
665 void
666 StmtProfiler::VisitOMPExecutableDirective(const OMPExecutableDirective *S) {
667   VisitStmt(S);
668   OMPClauseProfiler P(this);
669   ArrayRef<OMPClause *> Clauses = S->clauses();
670   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
671        I != E; ++I)
672     if (*I)
673       P.Visit(*I);
674 }
675
676 void StmtProfiler::VisitOMPLoopDirective(const OMPLoopDirective *S) {
677   VisitOMPExecutableDirective(S);
678 }
679
680 void StmtProfiler::VisitOMPParallelDirective(const OMPParallelDirective *S) {
681   VisitOMPExecutableDirective(S);
682 }
683
684 void StmtProfiler::VisitOMPSimdDirective(const OMPSimdDirective *S) {
685   VisitOMPLoopDirective(S);
686 }
687
688 void StmtProfiler::VisitOMPForDirective(const OMPForDirective *S) {
689   VisitOMPLoopDirective(S);
690 }
691
692 void StmtProfiler::VisitOMPForSimdDirective(const OMPForSimdDirective *S) {
693   VisitOMPLoopDirective(S);
694 }
695
696 void StmtProfiler::VisitOMPSectionsDirective(const OMPSectionsDirective *S) {
697   VisitOMPExecutableDirective(S);
698 }
699
700 void StmtProfiler::VisitOMPSectionDirective(const OMPSectionDirective *S) {
701   VisitOMPExecutableDirective(S);
702 }
703
704 void StmtProfiler::VisitOMPSingleDirective(const OMPSingleDirective *S) {
705   VisitOMPExecutableDirective(S);
706 }
707
708 void StmtProfiler::VisitOMPMasterDirective(const OMPMasterDirective *S) {
709   VisitOMPExecutableDirective(S);
710 }
711
712 void StmtProfiler::VisitOMPCriticalDirective(const OMPCriticalDirective *S) {
713   VisitOMPExecutableDirective(S);
714   VisitName(S->getDirectiveName().getName());
715 }
716
717 void
718 StmtProfiler::VisitOMPParallelForDirective(const OMPParallelForDirective *S) {
719   VisitOMPLoopDirective(S);
720 }
721
722 void StmtProfiler::VisitOMPParallelForSimdDirective(
723     const OMPParallelForSimdDirective *S) {
724   VisitOMPLoopDirective(S);
725 }
726
727 void StmtProfiler::VisitOMPParallelSectionsDirective(
728     const OMPParallelSectionsDirective *S) {
729   VisitOMPExecutableDirective(S);
730 }
731
732 void StmtProfiler::VisitOMPTaskDirective(const OMPTaskDirective *S) {
733   VisitOMPExecutableDirective(S);
734 }
735
736 void StmtProfiler::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *S) {
737   VisitOMPExecutableDirective(S);
738 }
739
740 void StmtProfiler::VisitOMPBarrierDirective(const OMPBarrierDirective *S) {
741   VisitOMPExecutableDirective(S);
742 }
743
744 void StmtProfiler::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *S) {
745   VisitOMPExecutableDirective(S);
746 }
747
748 void StmtProfiler::VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *S) {
749   VisitOMPExecutableDirective(S);
750 }
751
752 void StmtProfiler::VisitOMPFlushDirective(const OMPFlushDirective *S) {
753   VisitOMPExecutableDirective(S);
754 }
755
756 void StmtProfiler::VisitOMPOrderedDirective(const OMPOrderedDirective *S) {
757   VisitOMPExecutableDirective(S);
758 }
759
760 void StmtProfiler::VisitOMPAtomicDirective(const OMPAtomicDirective *S) {
761   VisitOMPExecutableDirective(S);
762 }
763
764 void StmtProfiler::VisitOMPTargetDirective(const OMPTargetDirective *S) {
765   VisitOMPExecutableDirective(S);
766 }
767
768 void StmtProfiler::VisitOMPTargetDataDirective(const OMPTargetDataDirective *S) {
769   VisitOMPExecutableDirective(S);
770 }
771
772 void StmtProfiler::VisitOMPTargetEnterDataDirective(
773     const OMPTargetEnterDataDirective *S) {
774   VisitOMPExecutableDirective(S);
775 }
776
777 void StmtProfiler::VisitOMPTargetExitDataDirective(
778     const OMPTargetExitDataDirective *S) {
779   VisitOMPExecutableDirective(S);
780 }
781
782 void StmtProfiler::VisitOMPTargetParallelDirective(
783     const OMPTargetParallelDirective *S) {
784   VisitOMPExecutableDirective(S);
785 }
786
787 void StmtProfiler::VisitOMPTargetParallelForDirective(
788     const OMPTargetParallelForDirective *S) {
789   VisitOMPExecutableDirective(S);
790 }
791
792 void StmtProfiler::VisitOMPTeamsDirective(const OMPTeamsDirective *S) {
793   VisitOMPExecutableDirective(S);
794 }
795
796 void StmtProfiler::VisitOMPCancellationPointDirective(
797     const OMPCancellationPointDirective *S) {
798   VisitOMPExecutableDirective(S);
799 }
800
801 void StmtProfiler::VisitOMPCancelDirective(const OMPCancelDirective *S) {
802   VisitOMPExecutableDirective(S);
803 }
804
805 void StmtProfiler::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *S) {
806   VisitOMPLoopDirective(S);
807 }
808
809 void StmtProfiler::VisitOMPTaskLoopSimdDirective(
810     const OMPTaskLoopSimdDirective *S) {
811   VisitOMPLoopDirective(S);
812 }
813
814 void StmtProfiler::VisitOMPDistributeDirective(
815     const OMPDistributeDirective *S) {
816   VisitOMPLoopDirective(S);
817 }
818
819 void OMPClauseProfiler::VisitOMPDistScheduleClause(
820     const OMPDistScheduleClause *C) {
821   VistOMPClauseWithPreInit(C);
822   if (auto *S = C->getChunkSize())
823     Profiler->VisitStmt(S);
824 }
825
826 void OMPClauseProfiler::VisitOMPDefaultmapClause(const OMPDefaultmapClause *) {}
827
828 void StmtProfiler::VisitOMPTargetUpdateDirective(
829     const OMPTargetUpdateDirective *S) {
830   VisitOMPExecutableDirective(S);
831 }
832
833 void StmtProfiler::VisitOMPDistributeParallelForDirective(
834     const OMPDistributeParallelForDirective *S) {
835   VisitOMPLoopDirective(S);
836 }
837
838 void StmtProfiler::VisitOMPDistributeParallelForSimdDirective(
839     const OMPDistributeParallelForSimdDirective *S) {
840   VisitOMPLoopDirective(S);
841 }
842
843 void StmtProfiler::VisitOMPDistributeSimdDirective(
844     const OMPDistributeSimdDirective *S) {
845   VisitOMPLoopDirective(S);
846 }
847
848 void StmtProfiler::VisitOMPTargetParallelForSimdDirective(
849     const OMPTargetParallelForSimdDirective *S) {
850   VisitOMPLoopDirective(S);
851 }
852
853 void StmtProfiler::VisitOMPTargetSimdDirective(
854     const OMPTargetSimdDirective *S) {
855   VisitOMPLoopDirective(S);
856 }
857
858 void StmtProfiler::VisitOMPTeamsDistributeDirective(
859     const OMPTeamsDistributeDirective *S) {
860   VisitOMPLoopDirective(S);
861 }
862
863 void StmtProfiler::VisitOMPTeamsDistributeSimdDirective(
864     const OMPTeamsDistributeSimdDirective *S) {
865   VisitOMPLoopDirective(S);
866 }
867
868 void StmtProfiler::VisitOMPTeamsDistributeParallelForSimdDirective(
869     const OMPTeamsDistributeParallelForSimdDirective *S) {
870   VisitOMPLoopDirective(S);
871 }
872
873 void StmtProfiler::VisitOMPTeamsDistributeParallelForDirective(
874     const OMPTeamsDistributeParallelForDirective *S) {
875   VisitOMPLoopDirective(S);
876 }
877
878 void StmtProfiler::VisitOMPTargetTeamsDirective(
879     const OMPTargetTeamsDirective *S) {
880   VisitOMPExecutableDirective(S);
881 }
882
883 void StmtProfiler::VisitOMPTargetTeamsDistributeDirective(
884     const OMPTargetTeamsDistributeDirective *S) {
885   VisitOMPLoopDirective(S);
886 }
887
888 void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForDirective(
889     const OMPTargetTeamsDistributeParallelForDirective *S) {
890   VisitOMPLoopDirective(S);
891 }
892
893 void StmtProfiler::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
894     const OMPTargetTeamsDistributeParallelForSimdDirective *S) {
895   VisitOMPLoopDirective(S);
896 }
897
898 void StmtProfiler::VisitOMPTargetTeamsDistributeSimdDirective(
899     const OMPTargetTeamsDistributeSimdDirective *S) {
900   VisitOMPLoopDirective(S);
901 }
902
903 void StmtProfiler::VisitExpr(const Expr *S) {
904   VisitStmt(S);
905 }
906
907 void StmtProfiler::VisitDeclRefExpr(const DeclRefExpr *S) {
908   VisitExpr(S);
909   if (!Canonical)
910     VisitNestedNameSpecifier(S->getQualifier());
911   VisitDecl(S->getDecl());
912   if (!Canonical)
913     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
914 }
915
916 void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
917   VisitExpr(S);
918   ID.AddInteger(S->getIdentType());
919 }
920
921 void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
922   VisitExpr(S);
923   S->getValue().Profile(ID);
924   ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
925 }
926
927 void StmtProfiler::VisitCharacterLiteral(const CharacterLiteral *S) {
928   VisitExpr(S);
929   ID.AddInteger(S->getKind());
930   ID.AddInteger(S->getValue());
931 }
932
933 void StmtProfiler::VisitFloatingLiteral(const FloatingLiteral *S) {
934   VisitExpr(S);
935   S->getValue().Profile(ID);
936   ID.AddBoolean(S->isExact());
937   ID.AddInteger(S->getType()->castAs<BuiltinType>()->getKind());
938 }
939
940 void StmtProfiler::VisitImaginaryLiteral(const ImaginaryLiteral *S) {
941   VisitExpr(S);
942 }
943
944 void StmtProfiler::VisitStringLiteral(const StringLiteral *S) {
945   VisitExpr(S);
946   ID.AddString(S->getBytes());
947   ID.AddInteger(S->getKind());
948 }
949
950 void StmtProfiler::VisitParenExpr(const ParenExpr *S) {
951   VisitExpr(S);
952 }
953
954 void StmtProfiler::VisitParenListExpr(const ParenListExpr *S) {
955   VisitExpr(S);
956 }
957
958 void StmtProfiler::VisitUnaryOperator(const UnaryOperator *S) {
959   VisitExpr(S);
960   ID.AddInteger(S->getOpcode());
961 }
962
963 void StmtProfiler::VisitOffsetOfExpr(const OffsetOfExpr *S) {
964   VisitType(S->getTypeSourceInfo()->getType());
965   unsigned n = S->getNumComponents();
966   for (unsigned i = 0; i < n; ++i) {
967     const OffsetOfNode &ON = S->getComponent(i);
968     ID.AddInteger(ON.getKind());
969     switch (ON.getKind()) {
970     case OffsetOfNode::Array:
971       // Expressions handled below.
972       break;
973
974     case OffsetOfNode::Field:
975       VisitDecl(ON.getField());
976       break;
977
978     case OffsetOfNode::Identifier:
979       VisitIdentifierInfo(ON.getFieldName());
980       break;
981
982     case OffsetOfNode::Base:
983       // These nodes are implicit, and therefore don't need profiling.
984       break;
985     }
986   }
987
988   VisitExpr(S);
989 }
990
991 void
992 StmtProfiler::VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *S) {
993   VisitExpr(S);
994   ID.AddInteger(S->getKind());
995   if (S->isArgumentType())
996     VisitType(S->getArgumentType());
997 }
998
999 void StmtProfiler::VisitArraySubscriptExpr(const ArraySubscriptExpr *S) {
1000   VisitExpr(S);
1001 }
1002
1003 void StmtProfiler::VisitOMPArraySectionExpr(const OMPArraySectionExpr *S) {
1004   VisitExpr(S);
1005 }
1006
1007 void StmtProfiler::VisitCallExpr(const CallExpr *S) {
1008   VisitExpr(S);
1009 }
1010
1011 void StmtProfiler::VisitMemberExpr(const MemberExpr *S) {
1012   VisitExpr(S);
1013   VisitDecl(S->getMemberDecl());
1014   if (!Canonical)
1015     VisitNestedNameSpecifier(S->getQualifier());
1016   ID.AddBoolean(S->isArrow());
1017 }
1018
1019 void StmtProfiler::VisitCompoundLiteralExpr(const CompoundLiteralExpr *S) {
1020   VisitExpr(S);
1021   ID.AddBoolean(S->isFileScope());
1022 }
1023
1024 void StmtProfiler::VisitCastExpr(const CastExpr *S) {
1025   VisitExpr(S);
1026 }
1027
1028 void StmtProfiler::VisitImplicitCastExpr(const ImplicitCastExpr *S) {
1029   VisitCastExpr(S);
1030   ID.AddInteger(S->getValueKind());
1031 }
1032
1033 void StmtProfiler::VisitExplicitCastExpr(const ExplicitCastExpr *S) {
1034   VisitCastExpr(S);
1035   VisitType(S->getTypeAsWritten());
1036 }
1037
1038 void StmtProfiler::VisitCStyleCastExpr(const CStyleCastExpr *S) {
1039   VisitExplicitCastExpr(S);
1040 }
1041
1042 void StmtProfiler::VisitBinaryOperator(const BinaryOperator *S) {
1043   VisitExpr(S);
1044   ID.AddInteger(S->getOpcode());
1045 }
1046
1047 void
1048 StmtProfiler::VisitCompoundAssignOperator(const CompoundAssignOperator *S) {
1049   VisitBinaryOperator(S);
1050 }
1051
1052 void StmtProfiler::VisitConditionalOperator(const ConditionalOperator *S) {
1053   VisitExpr(S);
1054 }
1055
1056 void StmtProfiler::VisitBinaryConditionalOperator(
1057     const BinaryConditionalOperator *S) {
1058   VisitExpr(S);
1059 }
1060
1061 void StmtProfiler::VisitAddrLabelExpr(const AddrLabelExpr *S) {
1062   VisitExpr(S);
1063   VisitDecl(S->getLabel());
1064 }
1065
1066 void StmtProfiler::VisitStmtExpr(const StmtExpr *S) {
1067   VisitExpr(S);
1068 }
1069
1070 void StmtProfiler::VisitShuffleVectorExpr(const ShuffleVectorExpr *S) {
1071   VisitExpr(S);
1072 }
1073
1074 void StmtProfiler::VisitConvertVectorExpr(const ConvertVectorExpr *S) {
1075   VisitExpr(S);
1076 }
1077
1078 void StmtProfiler::VisitChooseExpr(const ChooseExpr *S) {
1079   VisitExpr(S);
1080 }
1081
1082 void StmtProfiler::VisitGNUNullExpr(const GNUNullExpr *S) {
1083   VisitExpr(S);
1084 }
1085
1086 void StmtProfiler::VisitVAArgExpr(const VAArgExpr *S) {
1087   VisitExpr(S);
1088 }
1089
1090 void StmtProfiler::VisitInitListExpr(const InitListExpr *S) {
1091   if (S->getSyntacticForm()) {
1092     VisitInitListExpr(S->getSyntacticForm());
1093     return;
1094   }
1095
1096   VisitExpr(S);
1097 }
1098
1099 void StmtProfiler::VisitDesignatedInitExpr(const DesignatedInitExpr *S) {
1100   VisitExpr(S);
1101   ID.AddBoolean(S->usesGNUSyntax());
1102   for (const DesignatedInitExpr::Designator &D : S->designators()) {
1103     if (D.isFieldDesignator()) {
1104       ID.AddInteger(0);
1105       VisitName(D.getFieldName());
1106       continue;
1107     }
1108
1109     if (D.isArrayDesignator()) {
1110       ID.AddInteger(1);
1111     } else {
1112       assert(D.isArrayRangeDesignator());
1113       ID.AddInteger(2);
1114     }
1115     ID.AddInteger(D.getFirstExprIndex());
1116   }
1117 }
1118
1119 // Seems that if VisitInitListExpr() only works on the syntactic form of an
1120 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
1121 void StmtProfiler::VisitDesignatedInitUpdateExpr(
1122     const DesignatedInitUpdateExpr *S) {
1123   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
1124                    "initializer");
1125 }
1126
1127 void StmtProfiler::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *S) {
1128   VisitExpr(S);
1129 }
1130
1131 void StmtProfiler::VisitArrayInitIndexExpr(const ArrayInitIndexExpr *S) {
1132   VisitExpr(S);
1133 }
1134
1135 void StmtProfiler::VisitNoInitExpr(const NoInitExpr *S) {
1136   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
1137 }
1138
1139 void StmtProfiler::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *S) {
1140   VisitExpr(S);
1141 }
1142
1143 void StmtProfiler::VisitExtVectorElementExpr(const ExtVectorElementExpr *S) {
1144   VisitExpr(S);
1145   VisitName(&S->getAccessor());
1146 }
1147
1148 void StmtProfiler::VisitBlockExpr(const BlockExpr *S) {
1149   VisitExpr(S);
1150   VisitDecl(S->getBlockDecl());
1151 }
1152
1153 void StmtProfiler::VisitGenericSelectionExpr(const GenericSelectionExpr *S) {
1154   VisitExpr(S);
1155   for (unsigned i = 0; i != S->getNumAssocs(); ++i) {
1156     QualType T = S->getAssocType(i);
1157     if (T.isNull())
1158       ID.AddPointer(nullptr);
1159     else
1160       VisitType(T);
1161     VisitExpr(S->getAssocExpr(i));
1162   }
1163 }
1164
1165 void StmtProfiler::VisitPseudoObjectExpr(const PseudoObjectExpr *S) {
1166   VisitExpr(S);
1167   for (PseudoObjectExpr::const_semantics_iterator
1168          i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i)
1169     // Normally, we would not profile the source expressions of OVEs.
1170     if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(*i))
1171       Visit(OVE->getSourceExpr());
1172 }
1173
1174 void StmtProfiler::VisitAtomicExpr(const AtomicExpr *S) {
1175   VisitExpr(S);
1176   ID.AddInteger(S->getOp());
1177 }
1178
1179 static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
1180                                           UnaryOperatorKind &UnaryOp,
1181                                           BinaryOperatorKind &BinaryOp) {
1182   switch (S->getOperator()) {
1183   case OO_None:
1184   case OO_New:
1185   case OO_Delete:
1186   case OO_Array_New:
1187   case OO_Array_Delete:
1188   case OO_Arrow:
1189   case OO_Call:
1190   case OO_Conditional:
1191   case OO_Coawait:
1192   case NUM_OVERLOADED_OPERATORS:
1193     llvm_unreachable("Invalid operator call kind");
1194       
1195   case OO_Plus:
1196     if (S->getNumArgs() == 1) {
1197       UnaryOp = UO_Plus;
1198       return Stmt::UnaryOperatorClass;
1199     }
1200     
1201     BinaryOp = BO_Add;
1202     return Stmt::BinaryOperatorClass;
1203       
1204   case OO_Minus:
1205     if (S->getNumArgs() == 1) {
1206       UnaryOp = UO_Minus;
1207       return Stmt::UnaryOperatorClass;
1208     }
1209     
1210     BinaryOp = BO_Sub;
1211     return Stmt::BinaryOperatorClass;
1212
1213   case OO_Star:
1214     if (S->getNumArgs() == 1) {
1215       UnaryOp = UO_Deref;
1216       return Stmt::UnaryOperatorClass;
1217     }
1218     
1219     BinaryOp = BO_Mul;
1220     return Stmt::BinaryOperatorClass;
1221
1222   case OO_Slash:
1223     BinaryOp = BO_Div;
1224     return Stmt::BinaryOperatorClass;
1225       
1226   case OO_Percent:
1227     BinaryOp = BO_Rem;
1228     return Stmt::BinaryOperatorClass;
1229
1230   case OO_Caret:
1231     BinaryOp = BO_Xor;
1232     return Stmt::BinaryOperatorClass;
1233
1234   case OO_Amp:
1235     if (S->getNumArgs() == 1) {
1236       UnaryOp = UO_AddrOf;
1237       return Stmt::UnaryOperatorClass;
1238     }
1239     
1240     BinaryOp = BO_And;
1241     return Stmt::BinaryOperatorClass;
1242       
1243   case OO_Pipe:
1244     BinaryOp = BO_Or;
1245     return Stmt::BinaryOperatorClass;
1246
1247   case OO_Tilde:
1248     UnaryOp = UO_Not;
1249     return Stmt::UnaryOperatorClass;
1250
1251   case OO_Exclaim:
1252     UnaryOp = UO_LNot;
1253     return Stmt::UnaryOperatorClass;
1254
1255   case OO_Equal:
1256     BinaryOp = BO_Assign;
1257     return Stmt::BinaryOperatorClass;
1258
1259   case OO_Less:
1260     BinaryOp = BO_LT;
1261     return Stmt::BinaryOperatorClass;
1262
1263   case OO_Greater:
1264     BinaryOp = BO_GT;
1265     return Stmt::BinaryOperatorClass;
1266       
1267   case OO_PlusEqual:
1268     BinaryOp = BO_AddAssign;
1269     return Stmt::CompoundAssignOperatorClass;
1270
1271   case OO_MinusEqual:
1272     BinaryOp = BO_SubAssign;
1273     return Stmt::CompoundAssignOperatorClass;
1274
1275   case OO_StarEqual:
1276     BinaryOp = BO_MulAssign;
1277     return Stmt::CompoundAssignOperatorClass;
1278
1279   case OO_SlashEqual:
1280     BinaryOp = BO_DivAssign;
1281     return Stmt::CompoundAssignOperatorClass;
1282
1283   case OO_PercentEqual:
1284     BinaryOp = BO_RemAssign;
1285     return Stmt::CompoundAssignOperatorClass;
1286
1287   case OO_CaretEqual:
1288     BinaryOp = BO_XorAssign;
1289     return Stmt::CompoundAssignOperatorClass;
1290     
1291   case OO_AmpEqual:
1292     BinaryOp = BO_AndAssign;
1293     return Stmt::CompoundAssignOperatorClass;
1294     
1295   case OO_PipeEqual:
1296     BinaryOp = BO_OrAssign;
1297     return Stmt::CompoundAssignOperatorClass;
1298       
1299   case OO_LessLess:
1300     BinaryOp = BO_Shl;
1301     return Stmt::BinaryOperatorClass;
1302     
1303   case OO_GreaterGreater:
1304     BinaryOp = BO_Shr;
1305     return Stmt::BinaryOperatorClass;
1306
1307   case OO_LessLessEqual:
1308     BinaryOp = BO_ShlAssign;
1309     return Stmt::CompoundAssignOperatorClass;
1310     
1311   case OO_GreaterGreaterEqual:
1312     BinaryOp = BO_ShrAssign;
1313     return Stmt::CompoundAssignOperatorClass;
1314
1315   case OO_EqualEqual:
1316     BinaryOp = BO_EQ;
1317     return Stmt::BinaryOperatorClass;
1318     
1319   case OO_ExclaimEqual:
1320     BinaryOp = BO_NE;
1321     return Stmt::BinaryOperatorClass;
1322       
1323   case OO_LessEqual:
1324     BinaryOp = BO_LE;
1325     return Stmt::BinaryOperatorClass;
1326     
1327   case OO_GreaterEqual:
1328     BinaryOp = BO_GE;
1329     return Stmt::BinaryOperatorClass;
1330       
1331   case OO_AmpAmp:
1332     BinaryOp = BO_LAnd;
1333     return Stmt::BinaryOperatorClass;
1334     
1335   case OO_PipePipe:
1336     BinaryOp = BO_LOr;
1337     return Stmt::BinaryOperatorClass;
1338
1339   case OO_PlusPlus:
1340     UnaryOp = S->getNumArgs() == 1? UO_PreInc 
1341                                   : UO_PostInc;
1342     return Stmt::UnaryOperatorClass;
1343
1344   case OO_MinusMinus:
1345     UnaryOp = S->getNumArgs() == 1? UO_PreDec
1346                                   : UO_PostDec;
1347     return Stmt::UnaryOperatorClass;
1348
1349   case OO_Comma:
1350     BinaryOp = BO_Comma;
1351     return Stmt::BinaryOperatorClass;
1352
1353   case OO_ArrowStar:
1354     BinaryOp = BO_PtrMemI;
1355     return Stmt::BinaryOperatorClass;
1356       
1357   case OO_Subscript:
1358     return Stmt::ArraySubscriptExprClass;
1359   }
1360   
1361   llvm_unreachable("Invalid overloaded operator expression");
1362 }
1363
1364 void StmtProfiler::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *S) {
1365   if (S->isTypeDependent()) {
1366     // Type-dependent operator calls are profiled like their underlying
1367     // syntactic operator.
1368     //
1369     // An operator call to operator-> is always implicit, so just skip it. The
1370     // enclosing MemberExpr will profile the actual member access.
1371     if (S->getOperator() == OO_Arrow)
1372       return Visit(S->getArg(0));
1373
1374     UnaryOperatorKind UnaryOp = UO_Extension;
1375     BinaryOperatorKind BinaryOp = BO_Comma;
1376     Stmt::StmtClass SC = DecodeOperatorCall(S, UnaryOp, BinaryOp);
1377
1378     ID.AddInteger(SC);
1379     for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
1380       Visit(S->getArg(I));
1381     if (SC == Stmt::UnaryOperatorClass)
1382       ID.AddInteger(UnaryOp);
1383     else if (SC == Stmt::BinaryOperatorClass || 
1384              SC == Stmt::CompoundAssignOperatorClass)
1385       ID.AddInteger(BinaryOp);
1386     else
1387       assert(SC == Stmt::ArraySubscriptExprClass);
1388
1389     return;
1390   }
1391
1392   VisitCallExpr(S);
1393   ID.AddInteger(S->getOperator());
1394 }
1395
1396 void StmtProfiler::VisitCXXMemberCallExpr(const CXXMemberCallExpr *S) {
1397   VisitCallExpr(S);
1398 }
1399
1400 void StmtProfiler::VisitCUDAKernelCallExpr(const CUDAKernelCallExpr *S) {
1401   VisitCallExpr(S);
1402 }
1403
1404 void StmtProfiler::VisitAsTypeExpr(const AsTypeExpr *S) {
1405   VisitExpr(S);
1406 }
1407
1408 void StmtProfiler::VisitCXXNamedCastExpr(const CXXNamedCastExpr *S) {
1409   VisitExplicitCastExpr(S);
1410 }
1411
1412 void StmtProfiler::VisitCXXStaticCastExpr(const CXXStaticCastExpr *S) {
1413   VisitCXXNamedCastExpr(S);
1414 }
1415
1416 void StmtProfiler::VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *S) {
1417   VisitCXXNamedCastExpr(S);
1418 }
1419
1420 void
1421 StmtProfiler::VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *S) {
1422   VisitCXXNamedCastExpr(S);
1423 }
1424
1425 void StmtProfiler::VisitCXXConstCastExpr(const CXXConstCastExpr *S) {
1426   VisitCXXNamedCastExpr(S);
1427 }
1428
1429 void StmtProfiler::VisitUserDefinedLiteral(const UserDefinedLiteral *S) {
1430   VisitCallExpr(S);
1431 }
1432
1433 void StmtProfiler::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *S) {
1434   VisitExpr(S);
1435   ID.AddBoolean(S->getValue());
1436 }
1437
1438 void StmtProfiler::VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *S) {
1439   VisitExpr(S);
1440 }
1441
1442 void StmtProfiler::VisitCXXStdInitializerListExpr(
1443     const CXXStdInitializerListExpr *S) {
1444   VisitExpr(S);
1445 }
1446
1447 void StmtProfiler::VisitCXXTypeidExpr(const CXXTypeidExpr *S) {
1448   VisitExpr(S);
1449   if (S->isTypeOperand())
1450     VisitType(S->getTypeOperandSourceInfo()->getType());
1451 }
1452
1453 void StmtProfiler::VisitCXXUuidofExpr(const CXXUuidofExpr *S) {
1454   VisitExpr(S);
1455   if (S->isTypeOperand())
1456     VisitType(S->getTypeOperandSourceInfo()->getType());
1457 }
1458
1459 void StmtProfiler::VisitMSPropertyRefExpr(const MSPropertyRefExpr *S) {
1460   VisitExpr(S);
1461   VisitDecl(S->getPropertyDecl());
1462 }
1463
1464 void StmtProfiler::VisitMSPropertySubscriptExpr(
1465     const MSPropertySubscriptExpr *S) {
1466   VisitExpr(S);
1467 }
1468
1469 void StmtProfiler::VisitCXXThisExpr(const CXXThisExpr *S) {
1470   VisitExpr(S);
1471   ID.AddBoolean(S->isImplicit());
1472 }
1473
1474 void StmtProfiler::VisitCXXThrowExpr(const CXXThrowExpr *S) {
1475   VisitExpr(S);
1476 }
1477
1478 void StmtProfiler::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *S) {
1479   VisitExpr(S);
1480   VisitDecl(S->getParam());
1481 }
1482
1483 void StmtProfiler::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *S) {
1484   VisitExpr(S);
1485   VisitDecl(S->getField());
1486 }
1487
1488 void StmtProfiler::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *S) {
1489   VisitExpr(S);
1490   VisitDecl(
1491          const_cast<CXXDestructorDecl *>(S->getTemporary()->getDestructor()));
1492 }
1493
1494 void StmtProfiler::VisitCXXConstructExpr(const CXXConstructExpr *S) {
1495   VisitExpr(S);
1496   VisitDecl(S->getConstructor());
1497   ID.AddBoolean(S->isElidable());
1498 }
1499
1500 void StmtProfiler::VisitCXXInheritedCtorInitExpr(
1501     const CXXInheritedCtorInitExpr *S) {
1502   VisitExpr(S);
1503   VisitDecl(S->getConstructor());
1504 }
1505
1506 void StmtProfiler::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *S) {
1507   VisitExplicitCastExpr(S);
1508 }
1509
1510 void
1511 StmtProfiler::VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *S) {
1512   VisitCXXConstructExpr(S);
1513 }
1514
1515 void
1516 StmtProfiler::VisitLambdaExpr(const LambdaExpr *S) {
1517   VisitExpr(S);
1518   for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
1519                                  CEnd = S->explicit_capture_end();
1520        C != CEnd; ++C) {
1521     ID.AddInteger(C->getCaptureKind());
1522     switch (C->getCaptureKind()) {
1523     case LCK_StarThis:
1524     case LCK_This:
1525       break;
1526     case LCK_ByRef:
1527     case LCK_ByCopy:
1528       VisitDecl(C->getCapturedVar());
1529       ID.AddBoolean(C->isPackExpansion());
1530       break;
1531     case LCK_VLAType:
1532       llvm_unreachable("VLA type in explicit captures.");
1533     }
1534   }
1535   // Note: If we actually needed to be able to match lambda
1536   // expressions, we would have to consider parameters and return type
1537   // here, among other things.
1538   VisitStmt(S->getBody());
1539 }
1540
1541 void
1542 StmtProfiler::VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *S) {
1543   VisitExpr(S);
1544 }
1545
1546 void StmtProfiler::VisitCXXDeleteExpr(const CXXDeleteExpr *S) {
1547   VisitExpr(S);
1548   ID.AddBoolean(S->isGlobalDelete());
1549   ID.AddBoolean(S->isArrayForm());
1550   VisitDecl(S->getOperatorDelete());
1551 }
1552
1553 void StmtProfiler::VisitCXXNewExpr(const CXXNewExpr *S) {
1554   VisitExpr(S);
1555   VisitType(S->getAllocatedType());
1556   VisitDecl(S->getOperatorNew());
1557   VisitDecl(S->getOperatorDelete());
1558   ID.AddBoolean(S->isArray());
1559   ID.AddInteger(S->getNumPlacementArgs());
1560   ID.AddBoolean(S->isGlobalNew());
1561   ID.AddBoolean(S->isParenTypeId());
1562   ID.AddInteger(S->getInitializationStyle());
1563 }
1564
1565 void
1566 StmtProfiler::VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *S) {
1567   VisitExpr(S);
1568   ID.AddBoolean(S->isArrow());
1569   VisitNestedNameSpecifier(S->getQualifier());
1570   ID.AddBoolean(S->getScopeTypeInfo() != nullptr);
1571   if (S->getScopeTypeInfo())
1572     VisitType(S->getScopeTypeInfo()->getType());
1573   ID.AddBoolean(S->getDestroyedTypeInfo() != nullptr);
1574   if (S->getDestroyedTypeInfo())
1575     VisitType(S->getDestroyedType());
1576   else
1577     VisitIdentifierInfo(S->getDestroyedTypeIdentifier());
1578 }
1579
1580 void StmtProfiler::VisitOverloadExpr(const OverloadExpr *S) {
1581   VisitExpr(S);
1582   VisitNestedNameSpecifier(S->getQualifier());
1583   VisitName(S->getName());
1584   ID.AddBoolean(S->hasExplicitTemplateArgs());
1585   if (S->hasExplicitTemplateArgs())
1586     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1587 }
1588
1589 void
1590 StmtProfiler::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *S) {
1591   VisitOverloadExpr(S);
1592 }
1593
1594 void StmtProfiler::VisitTypeTraitExpr(const TypeTraitExpr *S) {
1595   VisitExpr(S);
1596   ID.AddInteger(S->getTrait());
1597   ID.AddInteger(S->getNumArgs());
1598   for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
1599     VisitType(S->getArg(I)->getType());
1600 }
1601
1602 void StmtProfiler::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *S) {
1603   VisitExpr(S);
1604   ID.AddInteger(S->getTrait());
1605   VisitType(S->getQueriedType());
1606 }
1607
1608 void StmtProfiler::VisitExpressionTraitExpr(const ExpressionTraitExpr *S) {
1609   VisitExpr(S);
1610   ID.AddInteger(S->getTrait());
1611   VisitExpr(S->getQueriedExpression());
1612 }
1613
1614 void StmtProfiler::VisitDependentScopeDeclRefExpr(
1615     const DependentScopeDeclRefExpr *S) {
1616   VisitExpr(S);
1617   VisitName(S->getDeclName());
1618   VisitNestedNameSpecifier(S->getQualifier());
1619   ID.AddBoolean(S->hasExplicitTemplateArgs());
1620   if (S->hasExplicitTemplateArgs())
1621     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1622 }
1623
1624 void StmtProfiler::VisitExprWithCleanups(const ExprWithCleanups *S) {
1625   VisitExpr(S);
1626 }
1627
1628 void StmtProfiler::VisitCXXUnresolvedConstructExpr(
1629     const CXXUnresolvedConstructExpr *S) {
1630   VisitExpr(S);
1631   VisitType(S->getTypeAsWritten());
1632 }
1633
1634 void StmtProfiler::VisitCXXDependentScopeMemberExpr(
1635     const CXXDependentScopeMemberExpr *S) {
1636   ID.AddBoolean(S->isImplicitAccess());
1637   if (!S->isImplicitAccess()) {
1638     VisitExpr(S);
1639     ID.AddBoolean(S->isArrow());
1640   }
1641   VisitNestedNameSpecifier(S->getQualifier());
1642   VisitName(S->getMember());
1643   ID.AddBoolean(S->hasExplicitTemplateArgs());
1644   if (S->hasExplicitTemplateArgs())
1645     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1646 }
1647
1648 void StmtProfiler::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *S) {
1649   ID.AddBoolean(S->isImplicitAccess());
1650   if (!S->isImplicitAccess()) {
1651     VisitExpr(S);
1652     ID.AddBoolean(S->isArrow());
1653   }
1654   VisitNestedNameSpecifier(S->getQualifier());
1655   VisitName(S->getMemberName());
1656   ID.AddBoolean(S->hasExplicitTemplateArgs());
1657   if (S->hasExplicitTemplateArgs())
1658     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
1659 }
1660
1661 void StmtProfiler::VisitCXXNoexceptExpr(const CXXNoexceptExpr *S) {
1662   VisitExpr(S);
1663 }
1664
1665 void StmtProfiler::VisitPackExpansionExpr(const PackExpansionExpr *S) {
1666   VisitExpr(S);
1667 }
1668
1669 void StmtProfiler::VisitSizeOfPackExpr(const SizeOfPackExpr *S) {
1670   VisitExpr(S);
1671   VisitDecl(S->getPack());
1672   if (S->isPartiallySubstituted()) {
1673     auto Args = S->getPartialArguments();
1674     ID.AddInteger(Args.size());
1675     for (const auto &TA : Args)
1676       VisitTemplateArgument(TA);
1677   } else {
1678     ID.AddInteger(0);
1679   }
1680 }
1681
1682 void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr(
1683     const SubstNonTypeTemplateParmPackExpr *S) {
1684   VisitExpr(S);
1685   VisitDecl(S->getParameterPack());
1686   VisitTemplateArgument(S->getArgumentPack());
1687 }
1688
1689 void StmtProfiler::VisitSubstNonTypeTemplateParmExpr(
1690     const SubstNonTypeTemplateParmExpr *E) {
1691   // Profile exactly as the replacement expression.
1692   Visit(E->getReplacement());
1693 }
1694
1695 void StmtProfiler::VisitFunctionParmPackExpr(const FunctionParmPackExpr *S) {
1696   VisitExpr(S);
1697   VisitDecl(S->getParameterPack());
1698   ID.AddInteger(S->getNumExpansions());
1699   for (FunctionParmPackExpr::iterator I = S->begin(), E = S->end(); I != E; ++I)
1700     VisitDecl(*I);
1701 }
1702
1703 void StmtProfiler::VisitMaterializeTemporaryExpr(
1704                                            const MaterializeTemporaryExpr *S) {
1705   VisitExpr(S);
1706 }
1707
1708 void StmtProfiler::VisitCXXFoldExpr(const CXXFoldExpr *S) {
1709   VisitExpr(S);
1710   ID.AddInteger(S->getOperator());
1711 }
1712
1713 void StmtProfiler::VisitCoroutineBodyStmt(const CoroutineBodyStmt *S) {
1714   VisitStmt(S);
1715 }
1716
1717 void StmtProfiler::VisitCoreturnStmt(const CoreturnStmt *S) {
1718   VisitStmt(S);
1719 }
1720
1721 void StmtProfiler::VisitCoawaitExpr(const CoawaitExpr *S) {
1722   VisitExpr(S);
1723 }
1724
1725 void StmtProfiler::VisitDependentCoawaitExpr(const DependentCoawaitExpr *S) {
1726   VisitExpr(S);
1727 }
1728
1729 void StmtProfiler::VisitCoyieldExpr(const CoyieldExpr *S) {
1730   VisitExpr(S);
1731 }
1732
1733 void StmtProfiler::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
1734   VisitExpr(E);  
1735 }
1736
1737 void StmtProfiler::VisitTypoExpr(const TypoExpr *E) {
1738   VisitExpr(E);
1739 }
1740
1741 void StmtProfiler::VisitObjCStringLiteral(const ObjCStringLiteral *S) {
1742   VisitExpr(S);
1743 }
1744
1745 void StmtProfiler::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
1746   VisitExpr(E);
1747 }
1748
1749 void StmtProfiler::VisitObjCArrayLiteral(const ObjCArrayLiteral *E) {
1750   VisitExpr(E);
1751 }
1752
1753 void StmtProfiler::VisitObjCDictionaryLiteral(const ObjCDictionaryLiteral *E) {
1754   VisitExpr(E);
1755 }
1756
1757 void StmtProfiler::VisitObjCEncodeExpr(const ObjCEncodeExpr *S) {
1758   VisitExpr(S);
1759   VisitType(S->getEncodedType());
1760 }
1761
1762 void StmtProfiler::VisitObjCSelectorExpr(const ObjCSelectorExpr *S) {
1763   VisitExpr(S);
1764   VisitName(S->getSelector());
1765 }
1766
1767 void StmtProfiler::VisitObjCProtocolExpr(const ObjCProtocolExpr *S) {
1768   VisitExpr(S);
1769   VisitDecl(S->getProtocol());
1770 }
1771
1772 void StmtProfiler::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *S) {
1773   VisitExpr(S);
1774   VisitDecl(S->getDecl());
1775   ID.AddBoolean(S->isArrow());
1776   ID.AddBoolean(S->isFreeIvar());
1777 }
1778
1779 void StmtProfiler::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *S) {
1780   VisitExpr(S);
1781   if (S->isImplicitProperty()) {
1782     VisitDecl(S->getImplicitPropertyGetter());
1783     VisitDecl(S->getImplicitPropertySetter());
1784   } else {
1785     VisitDecl(S->getExplicitProperty());
1786   }
1787   if (S->isSuperReceiver()) {
1788     ID.AddBoolean(S->isSuperReceiver());
1789     VisitType(S->getSuperReceiverType());
1790   }
1791 }
1792
1793 void StmtProfiler::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *S) {
1794   VisitExpr(S);
1795   VisitDecl(S->getAtIndexMethodDecl());
1796   VisitDecl(S->setAtIndexMethodDecl());
1797 }
1798
1799 void StmtProfiler::VisitObjCMessageExpr(const ObjCMessageExpr *S) {
1800   VisitExpr(S);
1801   VisitName(S->getSelector());
1802   VisitDecl(S->getMethodDecl());
1803 }
1804
1805 void StmtProfiler::VisitObjCIsaExpr(const ObjCIsaExpr *S) {
1806   VisitExpr(S);
1807   ID.AddBoolean(S->isArrow());
1808 }
1809
1810 void StmtProfiler::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *S) {
1811   VisitExpr(S);
1812   ID.AddBoolean(S->getValue());
1813 }
1814
1815 void StmtProfiler::VisitObjCIndirectCopyRestoreExpr(
1816     const ObjCIndirectCopyRestoreExpr *S) {
1817   VisitExpr(S);
1818   ID.AddBoolean(S->shouldCopy());
1819 }
1820
1821 void StmtProfiler::VisitObjCBridgedCastExpr(const ObjCBridgedCastExpr *S) {
1822   VisitExplicitCastExpr(S);
1823   ID.AddBoolean(S->getBridgeKind());
1824 }
1825
1826 void StmtProfiler::VisitObjCAvailabilityCheckExpr(
1827     const ObjCAvailabilityCheckExpr *S) {
1828   VisitExpr(S);
1829 }
1830
1831 void StmtProfiler::VisitTemplateArguments(const TemplateArgumentLoc *Args,
1832                                           unsigned NumArgs) {
1833   ID.AddInteger(NumArgs);
1834   for (unsigned I = 0; I != NumArgs; ++I)
1835     VisitTemplateArgument(Args[I].getArgument());
1836 }
1837
1838 void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
1839   // Mostly repetitive with TemplateArgument::Profile!
1840   ID.AddInteger(Arg.getKind());
1841   switch (Arg.getKind()) {
1842   case TemplateArgument::Null:
1843     break;
1844
1845   case TemplateArgument::Type:
1846     VisitType(Arg.getAsType());
1847     break;
1848
1849   case TemplateArgument::Template:
1850   case TemplateArgument::TemplateExpansion:
1851     VisitTemplateName(Arg.getAsTemplateOrTemplatePattern());
1852     break;
1853       
1854   case TemplateArgument::Declaration:
1855     VisitDecl(Arg.getAsDecl());
1856     break;
1857
1858   case TemplateArgument::NullPtr:
1859     VisitType(Arg.getNullPtrType());
1860     break;
1861
1862   case TemplateArgument::Integral:
1863     Arg.getAsIntegral().Profile(ID);
1864     VisitType(Arg.getIntegralType());
1865     break;
1866
1867   case TemplateArgument::Expression:
1868     Visit(Arg.getAsExpr());
1869     break;
1870
1871   case TemplateArgument::Pack:
1872     for (const auto &P : Arg.pack_elements())
1873       VisitTemplateArgument(P);
1874     break;
1875   }
1876 }
1877
1878 void Stmt::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
1879                    bool Canonical) const {
1880   StmtProfilerWithPointers Profiler(ID, Context, Canonical);
1881   Profiler.Visit(this);
1882 }
1883
1884 void Stmt::ProcessODRHash(llvm::FoldingSetNodeID &ID,
1885                           class ODRHash &Hash) const {
1886   StmtProfilerWithoutPointers Profiler(ID, Hash);
1887   Profiler.Visit(this);
1888 }