• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- CFG.cpp - Classes for representing and building CFGs----*- C++ -*-===//
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 defines the CFG and CFGBuilder classes for representing and
11 //  building Control-Flow Graphs (CFGs) from ASTs.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "clang/Analysis/Support/SaveAndRestore.h"
16 #include "clang/Analysis/CFG.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/StmtVisitor.h"
19 #include "clang/AST/PrettyPrinter.h"
20 #include "clang/AST/CharUnits.h"
21 #include "llvm/Support/GraphWriter.h"
22 #include "llvm/Support/Allocator.h"
23 #include "llvm/Support/Format.h"
24 #include "llvm/ADT/DenseMap.h"
25 #include "llvm/ADT/SmallPtrSet.h"
26 #include "llvm/ADT/OwningPtr.h"
27 
28 using namespace clang;
29 
30 namespace {
31 
GetEndLoc(Decl * D)32 static SourceLocation GetEndLoc(Decl* D) {
33   if (VarDecl* VD = dyn_cast<VarDecl>(D))
34     if (Expr* Ex = VD->getInit())
35       return Ex->getSourceRange().getEnd();
36   return D->getLocation();
37 }
38 
39 class CFGBuilder;
40 
41 /// The CFG builder uses a recursive algorithm to build the CFG.  When
42 ///  we process an expression, sometimes we know that we must add the
43 ///  subexpressions as block-level expressions.  For example:
44 ///
45 ///    exp1 || exp2
46 ///
47 ///  When processing the '||' expression, we know that exp1 and exp2
48 ///  need to be added as block-level expressions, even though they
49 ///  might not normally need to be.  AddStmtChoice records this
50 ///  contextual information.  If AddStmtChoice is 'NotAlwaysAdd', then
51 ///  the builder has an option not to add a subexpression as a
52 ///  block-level expression.
53 ///
54 class AddStmtChoice {
55 public:
56   enum Kind { NotAlwaysAdd = 0, AlwaysAdd = 1 };
57 
AddStmtChoice(Kind a_kind=NotAlwaysAdd)58   AddStmtChoice(Kind a_kind = NotAlwaysAdd) : kind(a_kind) {}
59 
60   bool alwaysAdd(CFGBuilder &builder,
61                  const Stmt *stmt) const;
62 
63   /// Return a copy of this object, except with the 'always-add' bit
64   ///  set as specified.
withAlwaysAdd(bool alwaysAdd) const65   AddStmtChoice withAlwaysAdd(bool alwaysAdd) const {
66     return AddStmtChoice(alwaysAdd ? AlwaysAdd : NotAlwaysAdd);
67   }
68 
69 private:
70   Kind kind;
71 };
72 
73 /// LocalScope - Node in tree of local scopes created for C++ implicit
74 /// destructor calls generation. It contains list of automatic variables
75 /// declared in the scope and link to position in previous scope this scope
76 /// began in.
77 ///
78 /// The process of creating local scopes is as follows:
79 /// - Init CFGBuilder::ScopePos with invalid position (equivalent for null),
80 /// - Before processing statements in scope (e.g. CompoundStmt) create
81 ///   LocalScope object using CFGBuilder::ScopePos as link to previous scope
82 ///   and set CFGBuilder::ScopePos to the end of new scope,
83 /// - On every occurrence of VarDecl increase CFGBuilder::ScopePos if it points
84 ///   at this VarDecl,
85 /// - For every normal (without jump) end of scope add to CFGBlock destructors
86 ///   for objects in the current scope,
87 /// - For every jump add to CFGBlock destructors for objects
88 ///   between CFGBuilder::ScopePos and local scope position saved for jump
89 ///   target. Thanks to C++ restrictions on goto jumps we can be sure that
90 ///   jump target position will be on the path to root from CFGBuilder::ScopePos
91 ///   (adding any variable that doesn't need constructor to be called to
92 ///   LocalScope can break this assumption),
93 ///
94 class LocalScope {
95 public:
96   typedef BumpVector<VarDecl*> AutomaticVarsTy;
97 
98   /// const_iterator - Iterates local scope backwards and jumps to previous
99   /// scope on reaching the beginning of currently iterated scope.
100   class const_iterator {
101     const LocalScope* Scope;
102 
103     /// VarIter is guaranteed to be greater then 0 for every valid iterator.
104     /// Invalid iterator (with null Scope) has VarIter equal to 0.
105     unsigned VarIter;
106 
107   public:
108     /// Create invalid iterator. Dereferencing invalid iterator is not allowed.
109     /// Incrementing invalid iterator is allowed and will result in invalid
110     /// iterator.
const_iterator()111     const_iterator()
112         : Scope(NULL), VarIter(0) {}
113 
114     /// Create valid iterator. In case when S.Prev is an invalid iterator and
115     /// I is equal to 0, this will create invalid iterator.
const_iterator(const LocalScope & S,unsigned I)116     const_iterator(const LocalScope& S, unsigned I)
117         : Scope(&S), VarIter(I) {
118       // Iterator to "end" of scope is not allowed. Handle it by going up
119       // in scopes tree possibly up to invalid iterator in the root.
120       if (VarIter == 0 && Scope)
121         *this = Scope->Prev;
122     }
123 
operator ->() const124     VarDecl* const* operator->() const {
125       assert (Scope && "Dereferencing invalid iterator is not allowed");
126       assert (VarIter != 0 && "Iterator has invalid value of VarIter member");
127       return &Scope->Vars[VarIter - 1];
128     }
operator *() const129     VarDecl* operator*() const {
130       return *this->operator->();
131     }
132 
operator ++()133     const_iterator& operator++() {
134       if (!Scope)
135         return *this;
136 
137       assert (VarIter != 0 && "Iterator has invalid value of VarIter member");
138       --VarIter;
139       if (VarIter == 0)
140         *this = Scope->Prev;
141       return *this;
142     }
operator ++(int)143     const_iterator operator++(int) {
144       const_iterator P = *this;
145       ++*this;
146       return P;
147     }
148 
operator ==(const const_iterator & rhs) const149     bool operator==(const const_iterator& rhs) const {
150       return Scope == rhs.Scope && VarIter == rhs.VarIter;
151     }
operator !=(const const_iterator & rhs) const152     bool operator!=(const const_iterator& rhs) const {
153       return !(*this == rhs);
154     }
155 
operator bool() const156     operator bool() const {
157       return *this != const_iterator();
158     }
159 
160     int distance(const_iterator L);
161   };
162 
163   friend class const_iterator;
164 
165 private:
166   BumpVectorContext ctx;
167 
168   /// Automatic variables in order of declaration.
169   AutomaticVarsTy Vars;
170   /// Iterator to variable in previous scope that was declared just before
171   /// begin of this scope.
172   const_iterator Prev;
173 
174 public:
175   /// Constructs empty scope linked to previous scope in specified place.
LocalScope(BumpVectorContext & ctx,const_iterator P)176   LocalScope(BumpVectorContext &ctx, const_iterator P)
177       : ctx(ctx), Vars(ctx, 4), Prev(P) {}
178 
179   /// Begin of scope in direction of CFG building (backwards).
begin() const180   const_iterator begin() const { return const_iterator(*this, Vars.size()); }
181 
addVar(VarDecl * VD)182   void addVar(VarDecl* VD) {
183     Vars.push_back(VD, ctx);
184   }
185 };
186 
187 /// distance - Calculates distance from this to L. L must be reachable from this
188 /// (with use of ++ operator). Cost of calculating the distance is linear w.r.t.
189 /// number of scopes between this and L.
distance(LocalScope::const_iterator L)190 int LocalScope::const_iterator::distance(LocalScope::const_iterator L) {
191   int D = 0;
192   const_iterator F = *this;
193   while (F.Scope != L.Scope) {
194     assert (F != const_iterator()
195         && "L iterator is not reachable from F iterator.");
196     D += F.VarIter;
197     F = F.Scope->Prev;
198   }
199   D += F.VarIter - L.VarIter;
200   return D;
201 }
202 
203 /// BlockScopePosPair - Structure for specifying position in CFG during its
204 /// build process. It consists of CFGBlock that specifies position in CFG graph
205 /// and  LocalScope::const_iterator that specifies position in LocalScope graph.
206 struct BlockScopePosPair {
BlockScopePosPair__anonf7c928c20111::BlockScopePosPair207   BlockScopePosPair() : block(0) {}
BlockScopePosPair__anonf7c928c20111::BlockScopePosPair208   BlockScopePosPair(CFGBlock* b, LocalScope::const_iterator scopePos)
209       : block(b), scopePosition(scopePos) {}
210 
211   CFGBlock *block;
212   LocalScope::const_iterator scopePosition;
213 };
214 
215 /// TryResult - a class representing a variant over the values
216 ///  'true', 'false', or 'unknown'.  This is returned by tryEvaluateBool,
217 ///  and is used by the CFGBuilder to decide if a branch condition
218 ///  can be decided up front during CFG construction.
219 class TryResult {
220   int X;
221 public:
TryResult(bool b)222   TryResult(bool b) : X(b ? 1 : 0) {}
TryResult()223   TryResult() : X(-1) {}
224 
isTrue() const225   bool isTrue() const { return X == 1; }
isFalse() const226   bool isFalse() const { return X == 0; }
isKnown() const227   bool isKnown() const { return X >= 0; }
negate()228   void negate() {
229     assert(isKnown());
230     X ^= 0x1;
231   }
232 };
233 
234 /// CFGBuilder - This class implements CFG construction from an AST.
235 ///   The builder is stateful: an instance of the builder should be used to only
236 ///   construct a single CFG.
237 ///
238 ///   Example usage:
239 ///
240 ///     CFGBuilder builder;
241 ///     CFG* cfg = builder.BuildAST(stmt1);
242 ///
243 ///  CFG construction is done via a recursive walk of an AST.  We actually parse
244 ///  the AST in reverse order so that the successor of a basic block is
245 ///  constructed prior to its predecessor.  This allows us to nicely capture
246 ///  implicit fall-throughs without extra basic blocks.
247 ///
248 class CFGBuilder {
249   typedef BlockScopePosPair JumpTarget;
250   typedef BlockScopePosPair JumpSource;
251 
252   ASTContext *Context;
253   llvm::OwningPtr<CFG> cfg;
254 
255   CFGBlock* Block;
256   CFGBlock* Succ;
257   JumpTarget ContinueJumpTarget;
258   JumpTarget BreakJumpTarget;
259   CFGBlock* SwitchTerminatedBlock;
260   CFGBlock* DefaultCaseBlock;
261   CFGBlock* TryTerminatedBlock;
262 
263   // Current position in local scope.
264   LocalScope::const_iterator ScopePos;
265 
266   // LabelMap records the mapping from Label expressions to their jump targets.
267   typedef llvm::DenseMap<LabelDecl*, JumpTarget> LabelMapTy;
268   LabelMapTy LabelMap;
269 
270   // A list of blocks that end with a "goto" that must be backpatched to their
271   // resolved targets upon completion of CFG construction.
272   typedef std::vector<JumpSource> BackpatchBlocksTy;
273   BackpatchBlocksTy BackpatchBlocks;
274 
275   // A list of labels whose address has been taken (for indirect gotos).
276   typedef llvm::SmallPtrSet<LabelDecl*, 5> LabelSetTy;
277   LabelSetTy AddressTakenLabels;
278 
279   bool badCFG;
280   const CFG::BuildOptions &BuildOpts;
281 
282   // State to track for building switch statements.
283   bool switchExclusivelyCovered;
284   Expr::EvalResult *switchCond;
285 
286   CFG::BuildOptions::ForcedBlkExprs::value_type *cachedEntry;
287   const Stmt *lastLookup;
288 
289 public:
CFGBuilder(ASTContext * astContext,const CFG::BuildOptions & buildOpts)290   explicit CFGBuilder(ASTContext *astContext,
291                       const CFG::BuildOptions &buildOpts)
292     : Context(astContext), cfg(new CFG()), // crew a new CFG
293       Block(NULL), Succ(NULL),
294       SwitchTerminatedBlock(NULL), DefaultCaseBlock(NULL),
295       TryTerminatedBlock(NULL), badCFG(false), BuildOpts(buildOpts),
296       switchExclusivelyCovered(false), switchCond(0),
297       cachedEntry(0), lastLookup(0) {}
298 
299   // buildCFG - Used by external clients to construct the CFG.
300   CFG* buildCFG(const Decl *D, Stmt *Statement);
301 
302   bool alwaysAdd(const Stmt *stmt);
303 
304 private:
305   // Visitors to walk an AST and construct the CFG.
306   CFGBlock *VisitAddrLabelExpr(AddrLabelExpr *A, AddStmtChoice asc);
307   CFGBlock *VisitBinaryOperator(BinaryOperator *B, AddStmtChoice asc);
308   CFGBlock *VisitBlockExpr(BlockExpr* E, AddStmtChoice asc);
309   CFGBlock *VisitBreakStmt(BreakStmt *B);
310   CFGBlock *VisitCXXCatchStmt(CXXCatchStmt *S);
311   CFGBlock *VisitExprWithCleanups(ExprWithCleanups *E,
312       AddStmtChoice asc);
313   CFGBlock *VisitCXXThrowExpr(CXXThrowExpr *T);
314   CFGBlock *VisitCXXTryStmt(CXXTryStmt *S);
315   CFGBlock *VisitCXXForRangeStmt(CXXForRangeStmt *S);
316   CFGBlock *VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E,
317                                       AddStmtChoice asc);
318   CFGBlock *VisitCXXConstructExpr(CXXConstructExpr *C, AddStmtChoice asc);
319   CFGBlock *VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E,
320                                        AddStmtChoice asc);
321   CFGBlock *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *C,
322                                         AddStmtChoice asc);
323   CFGBlock *VisitCallExpr(CallExpr *C, AddStmtChoice asc);
324   CFGBlock *VisitCaseStmt(CaseStmt *C);
325   CFGBlock *VisitChooseExpr(ChooseExpr *C, AddStmtChoice asc);
326   CFGBlock *VisitCompoundStmt(CompoundStmt *C);
327   CFGBlock *VisitConditionalOperator(AbstractConditionalOperator *C,
328                                      AddStmtChoice asc);
329   CFGBlock *VisitContinueStmt(ContinueStmt *C);
330   CFGBlock *VisitDeclStmt(DeclStmt *DS);
331   CFGBlock *VisitDeclSubExpr(DeclStmt* DS);
332   CFGBlock *VisitDefaultStmt(DefaultStmt *D);
333   CFGBlock *VisitDoStmt(DoStmt *D);
334   CFGBlock *VisitForStmt(ForStmt *F);
335   CFGBlock *VisitGotoStmt(GotoStmt* G);
336   CFGBlock *VisitIfStmt(IfStmt *I);
337   CFGBlock *VisitImplicitCastExpr(ImplicitCastExpr *E, AddStmtChoice asc);
338   CFGBlock *VisitIndirectGotoStmt(IndirectGotoStmt *I);
339   CFGBlock *VisitLabelStmt(LabelStmt *L);
340   CFGBlock *VisitMemberExpr(MemberExpr *M, AddStmtChoice asc);
341   CFGBlock *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
342   CFGBlock *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
343   CFGBlock *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
344   CFGBlock *VisitObjCAtTryStmt(ObjCAtTryStmt *S);
345   CFGBlock *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
346   CFGBlock *VisitReturnStmt(ReturnStmt* R);
347   CFGBlock *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E,
348                                           AddStmtChoice asc);
349   CFGBlock *VisitStmtExpr(StmtExpr *S, AddStmtChoice asc);
350   CFGBlock *VisitSwitchStmt(SwitchStmt *S);
351   CFGBlock *VisitUnaryOperator(UnaryOperator *U, AddStmtChoice asc);
352   CFGBlock *VisitWhileStmt(WhileStmt *W);
353 
354   CFGBlock *Visit(Stmt *S, AddStmtChoice asc = AddStmtChoice::NotAlwaysAdd);
355   CFGBlock *VisitStmt(Stmt *S, AddStmtChoice asc);
356   CFGBlock *VisitChildren(Stmt* S);
357 
358   // Visitors to walk an AST and generate destructors of temporaries in
359   // full expression.
360   CFGBlock *VisitForTemporaryDtors(Stmt *E, bool BindToTemporary = false);
361   CFGBlock *VisitChildrenForTemporaryDtors(Stmt *E);
362   CFGBlock *VisitBinaryOperatorForTemporaryDtors(BinaryOperator *E);
363   CFGBlock *VisitCXXBindTemporaryExprForTemporaryDtors(CXXBindTemporaryExpr *E,
364       bool BindToTemporary);
365   CFGBlock *
366   VisitConditionalOperatorForTemporaryDtors(AbstractConditionalOperator *E,
367                                             bool BindToTemporary);
368 
369   // NYS == Not Yet Supported
NYS()370   CFGBlock* NYS() {
371     badCFG = true;
372     return Block;
373   }
374 
autoCreateBlock()375   void autoCreateBlock() { if (!Block) Block = createBlock(); }
376   CFGBlock *createBlock(bool add_successor = true);
377 
addStmt(Stmt * S)378   CFGBlock *addStmt(Stmt *S) {
379     return Visit(S, AddStmtChoice::AlwaysAdd);
380   }
381   CFGBlock *addInitializer(CXXCtorInitializer *I);
382   void addAutomaticObjDtors(LocalScope::const_iterator B,
383                             LocalScope::const_iterator E, Stmt* S);
384   void addImplicitDtorsForDestructor(const CXXDestructorDecl *DD);
385 
386   // Local scopes creation.
387   LocalScope* createOrReuseLocalScope(LocalScope* Scope);
388 
389   void addLocalScopeForStmt(Stmt* S);
390   LocalScope* addLocalScopeForDeclStmt(DeclStmt* DS, LocalScope* Scope = NULL);
391   LocalScope* addLocalScopeForVarDecl(VarDecl* VD, LocalScope* Scope = NULL);
392 
393   void addLocalScopeAndDtors(Stmt* S);
394 
395   // Interface to CFGBlock - adding CFGElements.
appendStmt(CFGBlock * B,const Stmt * S)396   void appendStmt(CFGBlock *B, const Stmt *S) {
397     if (alwaysAdd(S) && cachedEntry)
398       cachedEntry->second = B;
399 
400     // All block-level expressions should have already been IgnoreParens()ed.
401     assert(!isa<Expr>(S) || cast<Expr>(S)->IgnoreParens() == S);
402     B->appendStmt(const_cast<Stmt*>(S), cfg->getBumpVectorContext());
403   }
appendInitializer(CFGBlock * B,CXXCtorInitializer * I)404   void appendInitializer(CFGBlock *B, CXXCtorInitializer *I) {
405     B->appendInitializer(I, cfg->getBumpVectorContext());
406   }
appendBaseDtor(CFGBlock * B,const CXXBaseSpecifier * BS)407   void appendBaseDtor(CFGBlock *B, const CXXBaseSpecifier *BS) {
408     B->appendBaseDtor(BS, cfg->getBumpVectorContext());
409   }
appendMemberDtor(CFGBlock * B,FieldDecl * FD)410   void appendMemberDtor(CFGBlock *B, FieldDecl *FD) {
411     B->appendMemberDtor(FD, cfg->getBumpVectorContext());
412   }
appendTemporaryDtor(CFGBlock * B,CXXBindTemporaryExpr * E)413   void appendTemporaryDtor(CFGBlock *B, CXXBindTemporaryExpr *E) {
414     B->appendTemporaryDtor(E, cfg->getBumpVectorContext());
415   }
416 
417   void insertAutomaticObjDtors(CFGBlock* Blk, CFGBlock::iterator I,
418     LocalScope::const_iterator B, LocalScope::const_iterator E, Stmt* S);
419   void appendAutomaticObjDtors(CFGBlock* Blk, LocalScope::const_iterator B,
420       LocalScope::const_iterator E, Stmt* S);
421   void prependAutomaticObjDtorsWithTerminator(CFGBlock* Blk,
422       LocalScope::const_iterator B, LocalScope::const_iterator E);
423 
addSuccessor(CFGBlock * B,CFGBlock * S)424   void addSuccessor(CFGBlock *B, CFGBlock *S) {
425     B->addSuccessor(S, cfg->getBumpVectorContext());
426   }
427 
428   /// Try and evaluate an expression to an integer constant.
tryEvaluate(Expr * S,Expr::EvalResult & outResult)429   bool tryEvaluate(Expr *S, Expr::EvalResult &outResult) {
430     if (!BuildOpts.PruneTriviallyFalseEdges)
431       return false;
432     return !S->isTypeDependent() &&
433            !S->isValueDependent() &&
434            S->Evaluate(outResult, *Context);
435   }
436 
437   /// tryEvaluateBool - Try and evaluate the Stmt and return 0 or 1
438   /// if we can evaluate to a known value, otherwise return -1.
tryEvaluateBool(Expr * S)439   TryResult tryEvaluateBool(Expr *S) {
440     Expr::EvalResult Result;
441     if (!tryEvaluate(S, Result))
442       return TryResult();
443 
444     if (Result.Val.isInt())
445       return Result.Val.getInt().getBoolValue();
446 
447     if (Result.Val.isLValue()) {
448       const Expr *e = Result.Val.getLValueBase();
449       const CharUnits &c = Result.Val.getLValueOffset();
450       if (!e && c.isZero())
451         return false;
452     }
453     return TryResult();
454   }
455 
456 };
457 
alwaysAdd(CFGBuilder & builder,const Stmt * stmt) const458 inline bool AddStmtChoice::alwaysAdd(CFGBuilder &builder,
459                                      const Stmt *stmt) const {
460   return builder.alwaysAdd(stmt) || kind == AlwaysAdd;
461 }
462 
alwaysAdd(const Stmt * stmt)463 bool CFGBuilder::alwaysAdd(const Stmt *stmt) {
464   bool shouldAdd = BuildOpts.alwaysAdd(stmt);
465 
466   if (!BuildOpts.forcedBlkExprs)
467     return shouldAdd;
468 
469   if (lastLookup == stmt) {
470     if (cachedEntry) {
471       assert(cachedEntry->first == stmt);
472       return true;
473     }
474     return shouldAdd;
475   }
476 
477   lastLookup = stmt;
478 
479   // Perform the lookup!
480   CFG::BuildOptions::ForcedBlkExprs *fb = *BuildOpts.forcedBlkExprs;
481 
482   if (!fb) {
483     // No need to update 'cachedEntry', since it will always be null.
484     assert(cachedEntry == 0);
485     return shouldAdd;
486   }
487 
488   CFG::BuildOptions::ForcedBlkExprs::iterator itr = fb->find(stmt);
489   if (itr == fb->end()) {
490     cachedEntry = 0;
491     return shouldAdd;
492   }
493 
494   cachedEntry = &*itr;
495   return true;
496 }
497 
498 // FIXME: Add support for dependent-sized array types in C++?
499 // Does it even make sense to build a CFG for an uninstantiated template?
FindVA(const Type * t)500 static const VariableArrayType *FindVA(const Type *t) {
501   while (const ArrayType *vt = dyn_cast<ArrayType>(t)) {
502     if (const VariableArrayType *vat = dyn_cast<VariableArrayType>(vt))
503       if (vat->getSizeExpr())
504         return vat;
505 
506     t = vt->getElementType().getTypePtr();
507   }
508 
509   return 0;
510 }
511 
512 /// BuildCFG - Constructs a CFG from an AST (a Stmt*).  The AST can represent an
513 ///  arbitrary statement.  Examples include a single expression or a function
514 ///  body (compound statement).  The ownership of the returned CFG is
515 ///  transferred to the caller.  If CFG construction fails, this method returns
516 ///  NULL.
buildCFG(const Decl * D,Stmt * Statement)517 CFG* CFGBuilder::buildCFG(const Decl *D, Stmt* Statement) {
518   assert(cfg.get());
519   if (!Statement)
520     return NULL;
521 
522   // Create an empty block that will serve as the exit block for the CFG.  Since
523   // this is the first block added to the CFG, it will be implicitly registered
524   // as the exit block.
525   Succ = createBlock();
526   assert(Succ == &cfg->getExit());
527   Block = NULL;  // the EXIT block is empty.  Create all other blocks lazily.
528 
529   if (BuildOpts.AddImplicitDtors)
530     if (const CXXDestructorDecl *DD = dyn_cast_or_null<CXXDestructorDecl>(D))
531       addImplicitDtorsForDestructor(DD);
532 
533   // Visit the statements and create the CFG.
534   CFGBlock *B = addStmt(Statement);
535 
536   if (badCFG)
537     return NULL;
538 
539   // For C++ constructor add initializers to CFG.
540   if (const CXXConstructorDecl *CD = dyn_cast_or_null<CXXConstructorDecl>(D)) {
541     for (CXXConstructorDecl::init_const_reverse_iterator I = CD->init_rbegin(),
542         E = CD->init_rend(); I != E; ++I) {
543       B = addInitializer(*I);
544       if (badCFG)
545         return NULL;
546     }
547   }
548 
549   if (B)
550     Succ = B;
551 
552   // Backpatch the gotos whose label -> block mappings we didn't know when we
553   // encountered them.
554   for (BackpatchBlocksTy::iterator I = BackpatchBlocks.begin(),
555                                    E = BackpatchBlocks.end(); I != E; ++I ) {
556 
557     CFGBlock* B = I->block;
558     GotoStmt* G = cast<GotoStmt>(B->getTerminator());
559     LabelMapTy::iterator LI = LabelMap.find(G->getLabel());
560 
561     // If there is no target for the goto, then we are looking at an
562     // incomplete AST.  Handle this by not registering a successor.
563     if (LI == LabelMap.end()) continue;
564 
565     JumpTarget JT = LI->second;
566     prependAutomaticObjDtorsWithTerminator(B, I->scopePosition,
567                                            JT.scopePosition);
568     addSuccessor(B, JT.block);
569   }
570 
571   // Add successors to the Indirect Goto Dispatch block (if we have one).
572   if (CFGBlock* B = cfg->getIndirectGotoBlock())
573     for (LabelSetTy::iterator I = AddressTakenLabels.begin(),
574                               E = AddressTakenLabels.end(); I != E; ++I ) {
575 
576       // Lookup the target block.
577       LabelMapTy::iterator LI = LabelMap.find(*I);
578 
579       // If there is no target block that contains label, then we are looking
580       // at an incomplete AST.  Handle this by not registering a successor.
581       if (LI == LabelMap.end()) continue;
582 
583       addSuccessor(B, LI->second.block);
584     }
585 
586   // Create an empty entry block that has no predecessors.
587   cfg->setEntry(createBlock());
588 
589   return cfg.take();
590 }
591 
592 /// createBlock - Used to lazily create blocks that are connected
593 ///  to the current (global) succcessor.
createBlock(bool add_successor)594 CFGBlock* CFGBuilder::createBlock(bool add_successor) {
595   CFGBlock* B = cfg->createBlock();
596   if (add_successor && Succ)
597     addSuccessor(B, Succ);
598   return B;
599 }
600 
601 /// addInitializer - Add C++ base or member initializer element to CFG.
addInitializer(CXXCtorInitializer * I)602 CFGBlock *CFGBuilder::addInitializer(CXXCtorInitializer *I) {
603   if (!BuildOpts.AddInitializers)
604     return Block;
605 
606   bool IsReference = false;
607   bool HasTemporaries = false;
608 
609   // Destructors of temporaries in initialization expression should be called
610   // after initialization finishes.
611   Expr *Init = I->getInit();
612   if (Init) {
613     if (FieldDecl *FD = I->getAnyMember())
614       IsReference = FD->getType()->isReferenceType();
615     HasTemporaries = isa<ExprWithCleanups>(Init);
616 
617     if (BuildOpts.AddImplicitDtors && HasTemporaries) {
618       // Generate destructors for temporaries in initialization expression.
619       VisitForTemporaryDtors(cast<ExprWithCleanups>(Init)->getSubExpr(),
620           IsReference);
621     }
622   }
623 
624   autoCreateBlock();
625   appendInitializer(Block, I);
626 
627   if (Init) {
628     if (HasTemporaries) {
629       // For expression with temporaries go directly to subexpression to omit
630       // generating destructors for the second time.
631       return Visit(cast<ExprWithCleanups>(Init)->getSubExpr());
632     }
633     return Visit(Init);
634   }
635 
636   return Block;
637 }
638 
639 /// addAutomaticObjDtors - Add to current block automatic objects destructors
640 /// for objects in range of local scope positions. Use S as trigger statement
641 /// for destructors.
addAutomaticObjDtors(LocalScope::const_iterator B,LocalScope::const_iterator E,Stmt * S)642 void CFGBuilder::addAutomaticObjDtors(LocalScope::const_iterator B,
643                                       LocalScope::const_iterator E, Stmt* S) {
644   if (!BuildOpts.AddImplicitDtors)
645     return;
646 
647   if (B == E)
648     return;
649 
650   autoCreateBlock();
651   appendAutomaticObjDtors(Block, B, E, S);
652 }
653 
654 /// addImplicitDtorsForDestructor - Add implicit destructors generated for
655 /// base and member objects in destructor.
addImplicitDtorsForDestructor(const CXXDestructorDecl * DD)656 void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) {
657   assert (BuildOpts.AddImplicitDtors
658       && "Can be called only when dtors should be added");
659   const CXXRecordDecl *RD = DD->getParent();
660 
661   // At the end destroy virtual base objects.
662   for (CXXRecordDecl::base_class_const_iterator VI = RD->vbases_begin(),
663       VE = RD->vbases_end(); VI != VE; ++VI) {
664     const CXXRecordDecl *CD = VI->getType()->getAsCXXRecordDecl();
665     if (!CD->hasTrivialDestructor()) {
666       autoCreateBlock();
667       appendBaseDtor(Block, VI);
668     }
669   }
670 
671   // Before virtual bases destroy direct base objects.
672   for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(),
673       BE = RD->bases_end(); BI != BE; ++BI) {
674     if (!BI->isVirtual()) {
675       const CXXRecordDecl *CD = BI->getType()->getAsCXXRecordDecl();
676       if (!CD->hasTrivialDestructor()) {
677         autoCreateBlock();
678         appendBaseDtor(Block, BI);
679       }
680     }
681   }
682 
683   // First destroy member objects.
684   for (CXXRecordDecl::field_iterator FI = RD->field_begin(),
685       FE = RD->field_end(); FI != FE; ++FI) {
686     // Check for constant size array. Set type to array element type.
687     QualType QT = FI->getType();
688     if (const ConstantArrayType *AT = Context->getAsConstantArrayType(QT)) {
689       if (AT->getSize() == 0)
690         continue;
691       QT = AT->getElementType();
692     }
693 
694     if (const CXXRecordDecl *CD = QT->getAsCXXRecordDecl())
695       if (!CD->hasTrivialDestructor()) {
696         autoCreateBlock();
697         appendMemberDtor(Block, *FI);
698       }
699   }
700 }
701 
702 /// createOrReuseLocalScope - If Scope is NULL create new LocalScope. Either
703 /// way return valid LocalScope object.
createOrReuseLocalScope(LocalScope * Scope)704 LocalScope* CFGBuilder::createOrReuseLocalScope(LocalScope* Scope) {
705   if (!Scope) {
706     llvm::BumpPtrAllocator &alloc = cfg->getAllocator();
707     Scope = alloc.Allocate<LocalScope>();
708     BumpVectorContext ctx(alloc);
709     new (Scope) LocalScope(ctx, ScopePos);
710   }
711   return Scope;
712 }
713 
714 /// addLocalScopeForStmt - Add LocalScope to local scopes tree for statement
715 /// that should create implicit scope (e.g. if/else substatements).
addLocalScopeForStmt(Stmt * S)716 void CFGBuilder::addLocalScopeForStmt(Stmt* S) {
717   if (!BuildOpts.AddImplicitDtors)
718     return;
719 
720   LocalScope *Scope = 0;
721 
722   // For compound statement we will be creating explicit scope.
723   if (CompoundStmt *CS = dyn_cast<CompoundStmt>(S)) {
724     for (CompoundStmt::body_iterator BI = CS->body_begin(), BE = CS->body_end()
725         ; BI != BE; ++BI) {
726       Stmt *SI = *BI;
727       if (LabelStmt *LS = dyn_cast<LabelStmt>(SI))
728         SI = LS->getSubStmt();
729       if (DeclStmt *DS = dyn_cast<DeclStmt>(SI))
730         Scope = addLocalScopeForDeclStmt(DS, Scope);
731     }
732     return;
733   }
734 
735   // For any other statement scope will be implicit and as such will be
736   // interesting only for DeclStmt.
737   if (LabelStmt *LS = dyn_cast<LabelStmt>(S))
738     S = LS->getSubStmt();
739   if (DeclStmt *DS = dyn_cast<DeclStmt>(S))
740     addLocalScopeForDeclStmt(DS);
741 }
742 
743 /// addLocalScopeForDeclStmt - Add LocalScope for declaration statement. Will
744 /// reuse Scope if not NULL.
addLocalScopeForDeclStmt(DeclStmt * DS,LocalScope * Scope)745 LocalScope* CFGBuilder::addLocalScopeForDeclStmt(DeclStmt* DS,
746                                                  LocalScope* Scope) {
747   if (!BuildOpts.AddImplicitDtors)
748     return Scope;
749 
750   for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end()
751       ; DI != DE; ++DI) {
752     if (VarDecl* VD = dyn_cast<VarDecl>(*DI))
753       Scope = addLocalScopeForVarDecl(VD, Scope);
754   }
755   return Scope;
756 }
757 
758 /// addLocalScopeForVarDecl - Add LocalScope for variable declaration. It will
759 /// create add scope for automatic objects and temporary objects bound to
760 /// const reference. Will reuse Scope if not NULL.
addLocalScopeForVarDecl(VarDecl * VD,LocalScope * Scope)761 LocalScope* CFGBuilder::addLocalScopeForVarDecl(VarDecl* VD,
762                                                 LocalScope* Scope) {
763   if (!BuildOpts.AddImplicitDtors)
764     return Scope;
765 
766   // Check if variable is local.
767   switch (VD->getStorageClass()) {
768   case SC_None:
769   case SC_Auto:
770   case SC_Register:
771     break;
772   default: return Scope;
773   }
774 
775   // Check for const references bound to temporary. Set type to pointee.
776   QualType QT = VD->getType();
777   if (const ReferenceType* RT = QT.getTypePtr()->getAs<ReferenceType>()) {
778     QT = RT->getPointeeType();
779     if (!QT.isConstQualified())
780       return Scope;
781     if (!VD->extendsLifetimeOfTemporary())
782       return Scope;
783   }
784 
785   // Check for constant size array. Set type to array element type.
786   if (const ConstantArrayType *AT = Context->getAsConstantArrayType(QT)) {
787     if (AT->getSize() == 0)
788       return Scope;
789     QT = AT->getElementType();
790   }
791 
792   // Check if type is a C++ class with non-trivial destructor.
793   if (const CXXRecordDecl* CD = QT->getAsCXXRecordDecl())
794     if (!CD->hasTrivialDestructor()) {
795       // Add the variable to scope
796       Scope = createOrReuseLocalScope(Scope);
797       Scope->addVar(VD);
798       ScopePos = Scope->begin();
799     }
800   return Scope;
801 }
802 
803 /// addLocalScopeAndDtors - For given statement add local scope for it and
804 /// add destructors that will cleanup the scope. Will reuse Scope if not NULL.
addLocalScopeAndDtors(Stmt * S)805 void CFGBuilder::addLocalScopeAndDtors(Stmt* S) {
806   if (!BuildOpts.AddImplicitDtors)
807     return;
808 
809   LocalScope::const_iterator scopeBeginPos = ScopePos;
810   addLocalScopeForStmt(S);
811   addAutomaticObjDtors(ScopePos, scopeBeginPos, S);
812 }
813 
814 /// insertAutomaticObjDtors - Insert destructor CFGElements for variables with
815 /// automatic storage duration to CFGBlock's elements vector. Insertion will be
816 /// performed in place specified with iterator.
insertAutomaticObjDtors(CFGBlock * Blk,CFGBlock::iterator I,LocalScope::const_iterator B,LocalScope::const_iterator E,Stmt * S)817 void CFGBuilder::insertAutomaticObjDtors(CFGBlock* Blk, CFGBlock::iterator I,
818     LocalScope::const_iterator B, LocalScope::const_iterator E, Stmt* S) {
819   BumpVectorContext& C = cfg->getBumpVectorContext();
820   I = Blk->beginAutomaticObjDtorsInsert(I, B.distance(E), C);
821   while (B != E)
822     I = Blk->insertAutomaticObjDtor(I, *B++, S);
823 }
824 
825 /// appendAutomaticObjDtors - Append destructor CFGElements for variables with
826 /// automatic storage duration to CFGBlock's elements vector. Elements will be
827 /// appended to physical end of the vector which happens to be logical
828 /// beginning.
appendAutomaticObjDtors(CFGBlock * Blk,LocalScope::const_iterator B,LocalScope::const_iterator E,Stmt * S)829 void CFGBuilder::appendAutomaticObjDtors(CFGBlock* Blk,
830     LocalScope::const_iterator B, LocalScope::const_iterator E, Stmt* S) {
831   insertAutomaticObjDtors(Blk, Blk->begin(), B, E, S);
832 }
833 
834 /// prependAutomaticObjDtorsWithTerminator - Prepend destructor CFGElements for
835 /// variables with automatic storage duration to CFGBlock's elements vector.
836 /// Elements will be prepended to physical beginning of the vector which
837 /// happens to be logical end. Use blocks terminator as statement that specifies
838 /// destructors call site.
prependAutomaticObjDtorsWithTerminator(CFGBlock * Blk,LocalScope::const_iterator B,LocalScope::const_iterator E)839 void CFGBuilder::prependAutomaticObjDtorsWithTerminator(CFGBlock* Blk,
840     LocalScope::const_iterator B, LocalScope::const_iterator E) {
841   insertAutomaticObjDtors(Blk, Blk->end(), B, E, Blk->getTerminator());
842 }
843 
844 /// Visit - Walk the subtree of a statement and add extra
845 ///   blocks for ternary operators, &&, and ||.  We also process "," and
846 ///   DeclStmts (which may contain nested control-flow).
Visit(Stmt * S,AddStmtChoice asc)847 CFGBlock* CFGBuilder::Visit(Stmt * S, AddStmtChoice asc) {
848   if (!S) {
849     badCFG = true;
850     return 0;
851   }
852 
853   if (Expr *E = dyn_cast<Expr>(S))
854     S = E->IgnoreParens();
855 
856   switch (S->getStmtClass()) {
857     default:
858       return VisitStmt(S, asc);
859 
860     case Stmt::AddrLabelExprClass:
861       return VisitAddrLabelExpr(cast<AddrLabelExpr>(S), asc);
862 
863     case Stmt::BinaryConditionalOperatorClass:
864       return VisitConditionalOperator(cast<BinaryConditionalOperator>(S), asc);
865 
866     case Stmt::BinaryOperatorClass:
867       return VisitBinaryOperator(cast<BinaryOperator>(S), asc);
868 
869     case Stmt::BlockExprClass:
870       return VisitBlockExpr(cast<BlockExpr>(S), asc);
871 
872     case Stmt::BreakStmtClass:
873       return VisitBreakStmt(cast<BreakStmt>(S));
874 
875     case Stmt::CallExprClass:
876     case Stmt::CXXOperatorCallExprClass:
877     case Stmt::CXXMemberCallExprClass:
878       return VisitCallExpr(cast<CallExpr>(S), asc);
879 
880     case Stmt::CaseStmtClass:
881       return VisitCaseStmt(cast<CaseStmt>(S));
882 
883     case Stmt::ChooseExprClass:
884       return VisitChooseExpr(cast<ChooseExpr>(S), asc);
885 
886     case Stmt::CompoundStmtClass:
887       return VisitCompoundStmt(cast<CompoundStmt>(S));
888 
889     case Stmt::ConditionalOperatorClass:
890       return VisitConditionalOperator(cast<ConditionalOperator>(S), asc);
891 
892     case Stmt::ContinueStmtClass:
893       return VisitContinueStmt(cast<ContinueStmt>(S));
894 
895     case Stmt::CXXCatchStmtClass:
896       return VisitCXXCatchStmt(cast<CXXCatchStmt>(S));
897 
898     case Stmt::ExprWithCleanupsClass:
899       return VisitExprWithCleanups(cast<ExprWithCleanups>(S), asc);
900 
901     case Stmt::CXXBindTemporaryExprClass:
902       return VisitCXXBindTemporaryExpr(cast<CXXBindTemporaryExpr>(S), asc);
903 
904     case Stmt::CXXConstructExprClass:
905       return VisitCXXConstructExpr(cast<CXXConstructExpr>(S), asc);
906 
907     case Stmt::CXXFunctionalCastExprClass:
908       return VisitCXXFunctionalCastExpr(cast<CXXFunctionalCastExpr>(S), asc);
909 
910     case Stmt::CXXTemporaryObjectExprClass:
911       return VisitCXXTemporaryObjectExpr(cast<CXXTemporaryObjectExpr>(S), asc);
912 
913     case Stmt::CXXThrowExprClass:
914       return VisitCXXThrowExpr(cast<CXXThrowExpr>(S));
915 
916     case Stmt::CXXTryStmtClass:
917       return VisitCXXTryStmt(cast<CXXTryStmt>(S));
918 
919     case Stmt::CXXForRangeStmtClass:
920       return VisitCXXForRangeStmt(cast<CXXForRangeStmt>(S));
921 
922     case Stmt::DeclStmtClass:
923       return VisitDeclStmt(cast<DeclStmt>(S));
924 
925     case Stmt::DefaultStmtClass:
926       return VisitDefaultStmt(cast<DefaultStmt>(S));
927 
928     case Stmt::DoStmtClass:
929       return VisitDoStmt(cast<DoStmt>(S));
930 
931     case Stmt::ForStmtClass:
932       return VisitForStmt(cast<ForStmt>(S));
933 
934     case Stmt::GotoStmtClass:
935       return VisitGotoStmt(cast<GotoStmt>(S));
936 
937     case Stmt::IfStmtClass:
938       return VisitIfStmt(cast<IfStmt>(S));
939 
940     case Stmt::ImplicitCastExprClass:
941       return VisitImplicitCastExpr(cast<ImplicitCastExpr>(S), asc);
942 
943     case Stmt::IndirectGotoStmtClass:
944       return VisitIndirectGotoStmt(cast<IndirectGotoStmt>(S));
945 
946     case Stmt::LabelStmtClass:
947       return VisitLabelStmt(cast<LabelStmt>(S));
948 
949     case Stmt::MemberExprClass:
950       return VisitMemberExpr(cast<MemberExpr>(S), asc);
951 
952     case Stmt::ObjCAtCatchStmtClass:
953       return VisitObjCAtCatchStmt(cast<ObjCAtCatchStmt>(S));
954 
955     case Stmt::ObjCAtSynchronizedStmtClass:
956       return VisitObjCAtSynchronizedStmt(cast<ObjCAtSynchronizedStmt>(S));
957 
958     case Stmt::ObjCAtThrowStmtClass:
959       return VisitObjCAtThrowStmt(cast<ObjCAtThrowStmt>(S));
960 
961     case Stmt::ObjCAtTryStmtClass:
962       return VisitObjCAtTryStmt(cast<ObjCAtTryStmt>(S));
963 
964     case Stmt::ObjCForCollectionStmtClass:
965       return VisitObjCForCollectionStmt(cast<ObjCForCollectionStmt>(S));
966 
967     case Stmt::NullStmtClass:
968       return Block;
969 
970     case Stmt::ReturnStmtClass:
971       return VisitReturnStmt(cast<ReturnStmt>(S));
972 
973     case Stmt::UnaryExprOrTypeTraitExprClass:
974       return VisitUnaryExprOrTypeTraitExpr(cast<UnaryExprOrTypeTraitExpr>(S),
975                                            asc);
976 
977     case Stmt::StmtExprClass:
978       return VisitStmtExpr(cast<StmtExpr>(S), asc);
979 
980     case Stmt::SwitchStmtClass:
981       return VisitSwitchStmt(cast<SwitchStmt>(S));
982 
983     case Stmt::UnaryOperatorClass:
984       return VisitUnaryOperator(cast<UnaryOperator>(S), asc);
985 
986     case Stmt::WhileStmtClass:
987       return VisitWhileStmt(cast<WhileStmt>(S));
988   }
989 }
990 
VisitStmt(Stmt * S,AddStmtChoice asc)991 CFGBlock *CFGBuilder::VisitStmt(Stmt *S, AddStmtChoice asc) {
992   if (asc.alwaysAdd(*this, S)) {
993     autoCreateBlock();
994     appendStmt(Block, S);
995   }
996 
997   return VisitChildren(S);
998 }
999 
1000 /// VisitChildren - Visit the children of a Stmt.
VisitChildren(Stmt * Terminator)1001 CFGBlock *CFGBuilder::VisitChildren(Stmt* Terminator) {
1002   CFGBlock *lastBlock = Block;
1003   for (Stmt::child_range I = Terminator->children(); I; ++I)
1004     if (Stmt *child = *I)
1005       if (CFGBlock *b = Visit(child))
1006         lastBlock = b;
1007 
1008   return lastBlock;
1009 }
1010 
VisitAddrLabelExpr(AddrLabelExpr * A,AddStmtChoice asc)1011 CFGBlock *CFGBuilder::VisitAddrLabelExpr(AddrLabelExpr *A,
1012                                          AddStmtChoice asc) {
1013   AddressTakenLabels.insert(A->getLabel());
1014 
1015   if (asc.alwaysAdd(*this, A)) {
1016     autoCreateBlock();
1017     appendStmt(Block, A);
1018   }
1019 
1020   return Block;
1021 }
1022 
VisitUnaryOperator(UnaryOperator * U,AddStmtChoice asc)1023 CFGBlock *CFGBuilder::VisitUnaryOperator(UnaryOperator *U,
1024            AddStmtChoice asc) {
1025   if (asc.alwaysAdd(*this, U)) {
1026     autoCreateBlock();
1027     appendStmt(Block, U);
1028   }
1029 
1030   return Visit(U->getSubExpr(), AddStmtChoice());
1031 }
1032 
VisitBinaryOperator(BinaryOperator * B,AddStmtChoice asc)1033 CFGBlock *CFGBuilder::VisitBinaryOperator(BinaryOperator *B,
1034                                           AddStmtChoice asc) {
1035   if (B->isLogicalOp()) { // && or ||
1036     CFGBlock* ConfluenceBlock = Block ? Block : createBlock();
1037     appendStmt(ConfluenceBlock, B);
1038 
1039     if (badCFG)
1040       return 0;
1041 
1042     // create the block evaluating the LHS
1043     CFGBlock* LHSBlock = createBlock(false);
1044     LHSBlock->setTerminator(B);
1045 
1046     // create the block evaluating the RHS
1047     Succ = ConfluenceBlock;
1048     Block = NULL;
1049     CFGBlock* RHSBlock = addStmt(B->getRHS());
1050 
1051     if (RHSBlock) {
1052       if (badCFG)
1053         return 0;
1054     } else {
1055       // Create an empty block for cases where the RHS doesn't require
1056       // any explicit statements in the CFG.
1057       RHSBlock = createBlock();
1058     }
1059 
1060     // See if this is a known constant.
1061     TryResult KnownVal = tryEvaluateBool(B->getLHS());
1062     if (KnownVal.isKnown() && (B->getOpcode() == BO_LOr))
1063       KnownVal.negate();
1064 
1065     // Now link the LHSBlock with RHSBlock.
1066     if (B->getOpcode() == BO_LOr) {
1067       addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock);
1068       addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock);
1069     } else {
1070       assert(B->getOpcode() == BO_LAnd);
1071       addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock);
1072       addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock);
1073     }
1074 
1075     // Generate the blocks for evaluating the LHS.
1076     Block = LHSBlock;
1077     return addStmt(B->getLHS());
1078   }
1079 
1080   if (B->getOpcode() == BO_Comma) { // ,
1081     autoCreateBlock();
1082     appendStmt(Block, B);
1083     addStmt(B->getRHS());
1084     return addStmt(B->getLHS());
1085   }
1086 
1087   if (B->isAssignmentOp()) {
1088     if (asc.alwaysAdd(*this, B)) {
1089       autoCreateBlock();
1090       appendStmt(Block, B);
1091     }
1092     Visit(B->getLHS());
1093     return Visit(B->getRHS());
1094   }
1095 
1096   if (asc.alwaysAdd(*this, B)) {
1097     autoCreateBlock();
1098     appendStmt(Block, B);
1099   }
1100 
1101   CFGBlock *RBlock = Visit(B->getRHS());
1102   CFGBlock *LBlock = Visit(B->getLHS());
1103   // If visiting RHS causes us to finish 'Block', e.g. the RHS is a StmtExpr
1104   // containing a DoStmt, and the LHS doesn't create a new block, then we should
1105   // return RBlock.  Otherwise we'll incorrectly return NULL.
1106   return (LBlock ? LBlock : RBlock);
1107 }
1108 
VisitBlockExpr(BlockExpr * E,AddStmtChoice asc)1109 CFGBlock *CFGBuilder::VisitBlockExpr(BlockExpr *E, AddStmtChoice asc) {
1110   if (asc.alwaysAdd(*this, E)) {
1111     autoCreateBlock();
1112     appendStmt(Block, E);
1113   }
1114   return Block;
1115 }
1116 
VisitBreakStmt(BreakStmt * B)1117 CFGBlock *CFGBuilder::VisitBreakStmt(BreakStmt *B) {
1118   // "break" is a control-flow statement.  Thus we stop processing the current
1119   // block.
1120   if (badCFG)
1121     return 0;
1122 
1123   // Now create a new block that ends with the break statement.
1124   Block = createBlock(false);
1125   Block->setTerminator(B);
1126 
1127   // If there is no target for the break, then we are looking at an incomplete
1128   // AST.  This means that the CFG cannot be constructed.
1129   if (BreakJumpTarget.block) {
1130     addAutomaticObjDtors(ScopePos, BreakJumpTarget.scopePosition, B);
1131     addSuccessor(Block, BreakJumpTarget.block);
1132   } else
1133     badCFG = true;
1134 
1135 
1136   return Block;
1137 }
1138 
CanThrow(Expr * E,ASTContext & Ctx)1139 static bool CanThrow(Expr *E, ASTContext &Ctx) {
1140   QualType Ty = E->getType();
1141   if (Ty->isFunctionPointerType())
1142     Ty = Ty->getAs<PointerType>()->getPointeeType();
1143   else if (Ty->isBlockPointerType())
1144     Ty = Ty->getAs<BlockPointerType>()->getPointeeType();
1145 
1146   const FunctionType *FT = Ty->getAs<FunctionType>();
1147   if (FT) {
1148     if (const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(FT))
1149       if (Proto->isNothrow(Ctx))
1150         return false;
1151   }
1152   return true;
1153 }
1154 
VisitCallExpr(CallExpr * C,AddStmtChoice asc)1155 CFGBlock *CFGBuilder::VisitCallExpr(CallExpr *C, AddStmtChoice asc) {
1156   // Compute the callee type.
1157   QualType calleeType = C->getCallee()->getType();
1158   if (calleeType == Context->BoundMemberTy) {
1159     QualType boundType = Expr::findBoundMemberType(C->getCallee());
1160 
1161     // We should only get a null bound type if processing a dependent
1162     // CFG.  Recover by assuming nothing.
1163     if (!boundType.isNull()) calleeType = boundType;
1164   }
1165 
1166   // If this is a call to a no-return function, this stops the block here.
1167   bool NoReturn = getFunctionExtInfo(*calleeType).getNoReturn();
1168 
1169   bool AddEHEdge = false;
1170 
1171   // Languages without exceptions are assumed to not throw.
1172   if (Context->getLangOptions().Exceptions) {
1173     if (BuildOpts.AddEHEdges)
1174       AddEHEdge = true;
1175   }
1176 
1177   if (FunctionDecl *FD = C->getDirectCallee()) {
1178     if (FD->hasAttr<NoReturnAttr>())
1179       NoReturn = true;
1180     if (FD->hasAttr<NoThrowAttr>())
1181       AddEHEdge = false;
1182   }
1183 
1184   if (!CanThrow(C->getCallee(), *Context))
1185     AddEHEdge = false;
1186 
1187   if (!NoReturn && !AddEHEdge)
1188     return VisitStmt(C, asc.withAlwaysAdd(true));
1189 
1190   if (Block) {
1191     Succ = Block;
1192     if (badCFG)
1193       return 0;
1194   }
1195 
1196   Block = createBlock(!NoReturn);
1197   appendStmt(Block, C);
1198 
1199   if (NoReturn) {
1200     // Wire this to the exit block directly.
1201     addSuccessor(Block, &cfg->getExit());
1202   }
1203   if (AddEHEdge) {
1204     // Add exceptional edges.
1205     if (TryTerminatedBlock)
1206       addSuccessor(Block, TryTerminatedBlock);
1207     else
1208       addSuccessor(Block, &cfg->getExit());
1209   }
1210 
1211   return VisitChildren(C);
1212 }
1213 
VisitChooseExpr(ChooseExpr * C,AddStmtChoice asc)1214 CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C,
1215                                       AddStmtChoice asc) {
1216   CFGBlock* ConfluenceBlock = Block ? Block : createBlock();
1217   appendStmt(ConfluenceBlock, C);
1218   if (badCFG)
1219     return 0;
1220 
1221   AddStmtChoice alwaysAdd = asc.withAlwaysAdd(true);
1222   Succ = ConfluenceBlock;
1223   Block = NULL;
1224   CFGBlock* LHSBlock = Visit(C->getLHS(), alwaysAdd);
1225   if (badCFG)
1226     return 0;
1227 
1228   Succ = ConfluenceBlock;
1229   Block = NULL;
1230   CFGBlock* RHSBlock = Visit(C->getRHS(), alwaysAdd);
1231   if (badCFG)
1232     return 0;
1233 
1234   Block = createBlock(false);
1235   // See if this is a known constant.
1236   const TryResult& KnownVal = tryEvaluateBool(C->getCond());
1237   addSuccessor(Block, KnownVal.isFalse() ? NULL : LHSBlock);
1238   addSuccessor(Block, KnownVal.isTrue() ? NULL : RHSBlock);
1239   Block->setTerminator(C);
1240   return addStmt(C->getCond());
1241 }
1242 
1243 
VisitCompoundStmt(CompoundStmt * C)1244 CFGBlock* CFGBuilder::VisitCompoundStmt(CompoundStmt* C) {
1245   addLocalScopeAndDtors(C);
1246   CFGBlock* LastBlock = Block;
1247 
1248   for (CompoundStmt::reverse_body_iterator I=C->body_rbegin(), E=C->body_rend();
1249        I != E; ++I ) {
1250     // If we hit a segment of code just containing ';' (NullStmts), we can
1251     // get a null block back.  In such cases, just use the LastBlock
1252     if (CFGBlock *newBlock = addStmt(*I))
1253       LastBlock = newBlock;
1254 
1255     if (badCFG)
1256       return NULL;
1257   }
1258 
1259   return LastBlock;
1260 }
1261 
VisitConditionalOperator(AbstractConditionalOperator * C,AddStmtChoice asc)1262 CFGBlock *CFGBuilder::VisitConditionalOperator(AbstractConditionalOperator *C,
1263                                                AddStmtChoice asc) {
1264   const BinaryConditionalOperator *BCO = dyn_cast<BinaryConditionalOperator>(C);
1265   const OpaqueValueExpr *opaqueValue = (BCO ? BCO->getOpaqueValue() : NULL);
1266 
1267   // Create the confluence block that will "merge" the results of the ternary
1268   // expression.
1269   CFGBlock* ConfluenceBlock = Block ? Block : createBlock();
1270   appendStmt(ConfluenceBlock, C);
1271   if (badCFG)
1272     return 0;
1273 
1274   AddStmtChoice alwaysAdd = asc.withAlwaysAdd(true);
1275 
1276   // Create a block for the LHS expression if there is an LHS expression.  A
1277   // GCC extension allows LHS to be NULL, causing the condition to be the
1278   // value that is returned instead.
1279   //  e.g: x ?: y is shorthand for: x ? x : y;
1280   Succ = ConfluenceBlock;
1281   Block = NULL;
1282   CFGBlock* LHSBlock = 0;
1283   const Expr *trueExpr = C->getTrueExpr();
1284   if (trueExpr != opaqueValue) {
1285     LHSBlock = Visit(C->getTrueExpr(), alwaysAdd);
1286     if (badCFG)
1287       return 0;
1288     Block = NULL;
1289   }
1290   else
1291     LHSBlock = ConfluenceBlock;
1292 
1293   // Create the block for the RHS expression.
1294   Succ = ConfluenceBlock;
1295   CFGBlock* RHSBlock = Visit(C->getFalseExpr(), alwaysAdd);
1296   if (badCFG)
1297     return 0;
1298 
1299   // Create the block that will contain the condition.
1300   Block = createBlock(false);
1301 
1302   // See if this is a known constant.
1303   const TryResult& KnownVal = tryEvaluateBool(C->getCond());
1304   addSuccessor(Block, KnownVal.isFalse() ? NULL : LHSBlock);
1305   addSuccessor(Block, KnownVal.isTrue() ? NULL : RHSBlock);
1306   Block->setTerminator(C);
1307   Expr *condExpr = C->getCond();
1308 
1309   if (opaqueValue) {
1310     // Run the condition expression if it's not trivially expressed in
1311     // terms of the opaque value (or if there is no opaque value).
1312     if (condExpr != opaqueValue)
1313       addStmt(condExpr);
1314 
1315     // Before that, run the common subexpression if there was one.
1316     // At least one of this or the above will be run.
1317     return addStmt(BCO->getCommon());
1318   }
1319 
1320   return addStmt(condExpr);
1321 }
1322 
VisitDeclStmt(DeclStmt * DS)1323 CFGBlock *CFGBuilder::VisitDeclStmt(DeclStmt *DS) {
1324   // Check if the Decl is for an __label__.  If so, elide it from the
1325   // CFG entirely.
1326   if (isa<LabelDecl>(*DS->decl_begin()))
1327     return Block;
1328 
1329   // This case also handles static_asserts.
1330   if (DS->isSingleDecl())
1331     return VisitDeclSubExpr(DS);
1332 
1333   CFGBlock *B = 0;
1334 
1335   // FIXME: Add a reverse iterator for DeclStmt to avoid this extra copy.
1336   typedef llvm::SmallVector<Decl*,10> BufTy;
1337   BufTy Buf(DS->decl_begin(), DS->decl_end());
1338 
1339   for (BufTy::reverse_iterator I = Buf.rbegin(), E = Buf.rend(); I != E; ++I) {
1340     // Get the alignment of the new DeclStmt, padding out to >=8 bytes.
1341     unsigned A = llvm::AlignOf<DeclStmt>::Alignment < 8
1342                ? 8 : llvm::AlignOf<DeclStmt>::Alignment;
1343 
1344     // Allocate the DeclStmt using the BumpPtrAllocator.  It will get
1345     // automatically freed with the CFG.
1346     DeclGroupRef DG(*I);
1347     Decl *D = *I;
1348     void *Mem = cfg->getAllocator().Allocate(sizeof(DeclStmt), A);
1349     DeclStmt *DSNew = new (Mem) DeclStmt(DG, D->getLocation(), GetEndLoc(D));
1350 
1351     // Append the fake DeclStmt to block.
1352     B = VisitDeclSubExpr(DSNew);
1353   }
1354 
1355   return B;
1356 }
1357 
1358 /// VisitDeclSubExpr - Utility method to add block-level expressions for
1359 /// DeclStmts and initializers in them.
VisitDeclSubExpr(DeclStmt * DS)1360 CFGBlock *CFGBuilder::VisitDeclSubExpr(DeclStmt* DS) {
1361   assert(DS->isSingleDecl() && "Can handle single declarations only.");
1362   Decl *D = DS->getSingleDecl();
1363 
1364   if (isa<StaticAssertDecl>(D)) {
1365     // static_asserts aren't added to the CFG because they do not impact
1366     // runtime semantics.
1367     return Block;
1368   }
1369 
1370   VarDecl *VD = dyn_cast<VarDecl>(DS->getSingleDecl());
1371 
1372   if (!VD) {
1373     autoCreateBlock();
1374     appendStmt(Block, DS);
1375     return Block;
1376   }
1377 
1378   bool IsReference = false;
1379   bool HasTemporaries = false;
1380 
1381   // Destructors of temporaries in initialization expression should be called
1382   // after initialization finishes.
1383   Expr *Init = VD->getInit();
1384   if (Init) {
1385     IsReference = VD->getType()->isReferenceType();
1386     HasTemporaries = isa<ExprWithCleanups>(Init);
1387 
1388     if (BuildOpts.AddImplicitDtors && HasTemporaries) {
1389       // Generate destructors for temporaries in initialization expression.
1390       VisitForTemporaryDtors(cast<ExprWithCleanups>(Init)->getSubExpr(),
1391           IsReference);
1392     }
1393   }
1394 
1395   autoCreateBlock();
1396   appendStmt(Block, DS);
1397 
1398   if (Init) {
1399     if (HasTemporaries)
1400       // For expression with temporaries go directly to subexpression to omit
1401       // generating destructors for the second time.
1402       Visit(cast<ExprWithCleanups>(Init)->getSubExpr());
1403     else
1404       Visit(Init);
1405   }
1406 
1407   // If the type of VD is a VLA, then we must process its size expressions.
1408   for (const VariableArrayType* VA = FindVA(VD->getType().getTypePtr());
1409        VA != 0; VA = FindVA(VA->getElementType().getTypePtr()))
1410     Block = addStmt(VA->getSizeExpr());
1411 
1412   // Remove variable from local scope.
1413   if (ScopePos && VD == *ScopePos)
1414     ++ScopePos;
1415 
1416   return Block;
1417 }
1418 
VisitIfStmt(IfStmt * I)1419 CFGBlock* CFGBuilder::VisitIfStmt(IfStmt* I) {
1420   // We may see an if statement in the middle of a basic block, or it may be the
1421   // first statement we are processing.  In either case, we create a new basic
1422   // block.  First, we create the blocks for the then...else statements, and
1423   // then we create the block containing the if statement.  If we were in the
1424   // middle of a block, we stop processing that block.  That block is then the
1425   // implicit successor for the "then" and "else" clauses.
1426 
1427   // Save local scope position because in case of condition variable ScopePos
1428   // won't be restored when traversing AST.
1429   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
1430 
1431   // Create local scope for possible condition variable.
1432   // Store scope position. Add implicit destructor.
1433   if (VarDecl* VD = I->getConditionVariable()) {
1434     LocalScope::const_iterator BeginScopePos = ScopePos;
1435     addLocalScopeForVarDecl(VD);
1436     addAutomaticObjDtors(ScopePos, BeginScopePos, I);
1437   }
1438 
1439   // The block we were processing is now finished.  Make it the successor
1440   // block.
1441   if (Block) {
1442     Succ = Block;
1443     if (badCFG)
1444       return 0;
1445   }
1446 
1447   // Process the false branch.
1448   CFGBlock* ElseBlock = Succ;
1449 
1450   if (Stmt* Else = I->getElse()) {
1451     SaveAndRestore<CFGBlock*> sv(Succ);
1452 
1453     // NULL out Block so that the recursive call to Visit will
1454     // create a new basic block.
1455     Block = NULL;
1456 
1457     // If branch is not a compound statement create implicit scope
1458     // and add destructors.
1459     if (!isa<CompoundStmt>(Else))
1460       addLocalScopeAndDtors(Else);
1461 
1462     ElseBlock = addStmt(Else);
1463 
1464     if (!ElseBlock) // Can occur when the Else body has all NullStmts.
1465       ElseBlock = sv.get();
1466     else if (Block) {
1467       if (badCFG)
1468         return 0;
1469     }
1470   }
1471 
1472   // Process the true branch.
1473   CFGBlock* ThenBlock;
1474   {
1475     Stmt* Then = I->getThen();
1476     assert(Then);
1477     SaveAndRestore<CFGBlock*> sv(Succ);
1478     Block = NULL;
1479 
1480     // If branch is not a compound statement create implicit scope
1481     // and add destructors.
1482     if (!isa<CompoundStmt>(Then))
1483       addLocalScopeAndDtors(Then);
1484 
1485     ThenBlock = addStmt(Then);
1486 
1487     if (!ThenBlock) {
1488       // We can reach here if the "then" body has all NullStmts.
1489       // Create an empty block so we can distinguish between true and false
1490       // branches in path-sensitive analyses.
1491       ThenBlock = createBlock(false);
1492       addSuccessor(ThenBlock, sv.get());
1493     } else if (Block) {
1494       if (badCFG)
1495         return 0;
1496     }
1497   }
1498 
1499   // Now create a new block containing the if statement.
1500   Block = createBlock(false);
1501 
1502   // Set the terminator of the new block to the If statement.
1503   Block->setTerminator(I);
1504 
1505   // See if this is a known constant.
1506   const TryResult &KnownVal = tryEvaluateBool(I->getCond());
1507 
1508   // Now add the successors.
1509   addSuccessor(Block, KnownVal.isFalse() ? NULL : ThenBlock);
1510   addSuccessor(Block, KnownVal.isTrue()? NULL : ElseBlock);
1511 
1512   // Add the condition as the last statement in the new block.  This may create
1513   // new blocks as the condition may contain control-flow.  Any newly created
1514   // blocks will be pointed to be "Block".
1515   Block = addStmt(I->getCond());
1516 
1517   // Finally, if the IfStmt contains a condition variable, add both the IfStmt
1518   // and the condition variable initialization to the CFG.
1519   if (VarDecl *VD = I->getConditionVariable()) {
1520     if (Expr *Init = VD->getInit()) {
1521       autoCreateBlock();
1522       appendStmt(Block, I->getConditionVariableDeclStmt());
1523       addStmt(Init);
1524     }
1525   }
1526 
1527   return Block;
1528 }
1529 
1530 
VisitReturnStmt(ReturnStmt * R)1531 CFGBlock* CFGBuilder::VisitReturnStmt(ReturnStmt* R) {
1532   // If we were in the middle of a block we stop processing that block.
1533   //
1534   // NOTE: If a "return" appears in the middle of a block, this means that the
1535   //       code afterwards is DEAD (unreachable).  We still keep a basic block
1536   //       for that code; a simple "mark-and-sweep" from the entry block will be
1537   //       able to report such dead blocks.
1538 
1539   // Create the new block.
1540   Block = createBlock(false);
1541 
1542   // The Exit block is the only successor.
1543   addAutomaticObjDtors(ScopePos, LocalScope::const_iterator(), R);
1544   addSuccessor(Block, &cfg->getExit());
1545 
1546   // Add the return statement to the block.  This may create new blocks if R
1547   // contains control-flow (short-circuit operations).
1548   return VisitStmt(R, AddStmtChoice::AlwaysAdd);
1549 }
1550 
VisitLabelStmt(LabelStmt * L)1551 CFGBlock* CFGBuilder::VisitLabelStmt(LabelStmt *L) {
1552   // Get the block of the labeled statement.  Add it to our map.
1553   addStmt(L->getSubStmt());
1554   CFGBlock *LabelBlock = Block;
1555 
1556   if (!LabelBlock)              // This can happen when the body is empty, i.e.
1557     LabelBlock = createBlock(); // scopes that only contains NullStmts.
1558 
1559   assert(LabelMap.find(L->getDecl()) == LabelMap.end() &&
1560          "label already in map");
1561   LabelMap[L->getDecl()] = JumpTarget(LabelBlock, ScopePos);
1562 
1563   // Labels partition blocks, so this is the end of the basic block we were
1564   // processing (L is the block's label).  Because this is label (and we have
1565   // already processed the substatement) there is no extra control-flow to worry
1566   // about.
1567   LabelBlock->setLabel(L);
1568   if (badCFG)
1569     return 0;
1570 
1571   // We set Block to NULL to allow lazy creation of a new block (if necessary);
1572   Block = NULL;
1573 
1574   // This block is now the implicit successor of other blocks.
1575   Succ = LabelBlock;
1576 
1577   return LabelBlock;
1578 }
1579 
VisitGotoStmt(GotoStmt * G)1580 CFGBlock* CFGBuilder::VisitGotoStmt(GotoStmt* G) {
1581   // Goto is a control-flow statement.  Thus we stop processing the current
1582   // block and create a new one.
1583 
1584   Block = createBlock(false);
1585   Block->setTerminator(G);
1586 
1587   // If we already know the mapping to the label block add the successor now.
1588   LabelMapTy::iterator I = LabelMap.find(G->getLabel());
1589 
1590   if (I == LabelMap.end())
1591     // We will need to backpatch this block later.
1592     BackpatchBlocks.push_back(JumpSource(Block, ScopePos));
1593   else {
1594     JumpTarget JT = I->second;
1595     addAutomaticObjDtors(ScopePos, JT.scopePosition, G);
1596     addSuccessor(Block, JT.block);
1597   }
1598 
1599   return Block;
1600 }
1601 
VisitForStmt(ForStmt * F)1602 CFGBlock* CFGBuilder::VisitForStmt(ForStmt* F) {
1603   CFGBlock* LoopSuccessor = NULL;
1604 
1605   // Save local scope position because in case of condition variable ScopePos
1606   // won't be restored when traversing AST.
1607   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
1608 
1609   // Create local scope for init statement and possible condition variable.
1610   // Add destructor for init statement and condition variable.
1611   // Store scope position for continue statement.
1612   if (Stmt* Init = F->getInit())
1613     addLocalScopeForStmt(Init);
1614   LocalScope::const_iterator LoopBeginScopePos = ScopePos;
1615 
1616   if (VarDecl* VD = F->getConditionVariable())
1617     addLocalScopeForVarDecl(VD);
1618   LocalScope::const_iterator ContinueScopePos = ScopePos;
1619 
1620   addAutomaticObjDtors(ScopePos, save_scope_pos.get(), F);
1621 
1622   // "for" is a control-flow statement.  Thus we stop processing the current
1623   // block.
1624   if (Block) {
1625     if (badCFG)
1626       return 0;
1627     LoopSuccessor = Block;
1628   } else
1629     LoopSuccessor = Succ;
1630 
1631   // Save the current value for the break targets.
1632   // All breaks should go to the code following the loop.
1633   SaveAndRestore<JumpTarget> save_break(BreakJumpTarget);
1634   BreakJumpTarget = JumpTarget(LoopSuccessor, ScopePos);
1635 
1636   // Because of short-circuit evaluation, the condition of the loop can span
1637   // multiple basic blocks.  Thus we need the "Entry" and "Exit" blocks that
1638   // evaluate the condition.
1639   CFGBlock* ExitConditionBlock = createBlock(false);
1640   CFGBlock* EntryConditionBlock = ExitConditionBlock;
1641 
1642   // Set the terminator for the "exit" condition block.
1643   ExitConditionBlock->setTerminator(F);
1644 
1645   // Now add the actual condition to the condition block.  Because the condition
1646   // itself may contain control-flow, new blocks may be created.
1647   if (Stmt* C = F->getCond()) {
1648     Block = ExitConditionBlock;
1649     EntryConditionBlock = addStmt(C);
1650     if (badCFG)
1651       return 0;
1652     assert(Block == EntryConditionBlock ||
1653            (Block == 0 && EntryConditionBlock == Succ));
1654 
1655     // If this block contains a condition variable, add both the condition
1656     // variable and initializer to the CFG.
1657     if (VarDecl *VD = F->getConditionVariable()) {
1658       if (Expr *Init = VD->getInit()) {
1659         autoCreateBlock();
1660         appendStmt(Block, F->getConditionVariableDeclStmt());
1661         EntryConditionBlock = addStmt(Init);
1662         assert(Block == EntryConditionBlock);
1663       }
1664     }
1665 
1666     if (Block) {
1667       if (badCFG)
1668         return 0;
1669     }
1670   }
1671 
1672   // The condition block is the implicit successor for the loop body as well as
1673   // any code above the loop.
1674   Succ = EntryConditionBlock;
1675 
1676   // See if this is a known constant.
1677   TryResult KnownVal(true);
1678 
1679   if (F->getCond())
1680     KnownVal = tryEvaluateBool(F->getCond());
1681 
1682   // Now create the loop body.
1683   {
1684     assert(F->getBody());
1685 
1686    // Save the current values for Block, Succ, and continue targets.
1687    SaveAndRestore<CFGBlock*> save_Block(Block), save_Succ(Succ);
1688    SaveAndRestore<JumpTarget> save_continue(ContinueJumpTarget);
1689 
1690     // Create a new block to contain the (bottom) of the loop body.
1691     Block = NULL;
1692 
1693     // Loop body should end with destructor of Condition variable (if any).
1694     addAutomaticObjDtors(ScopePos, LoopBeginScopePos, F);
1695 
1696     if (Stmt* I = F->getInc()) {
1697       // Generate increment code in its own basic block.  This is the target of
1698       // continue statements.
1699       Succ = addStmt(I);
1700     } else {
1701       // No increment code.  Create a special, empty, block that is used as the
1702       // target block for "looping back" to the start of the loop.
1703       assert(Succ == EntryConditionBlock);
1704       Succ = Block ? Block : createBlock();
1705     }
1706 
1707     // Finish up the increment (or empty) block if it hasn't been already.
1708     if (Block) {
1709       assert(Block == Succ);
1710       if (badCFG)
1711         return 0;
1712       Block = 0;
1713     }
1714 
1715     ContinueJumpTarget = JumpTarget(Succ, ContinueScopePos);
1716 
1717     // The starting block for the loop increment is the block that should
1718     // represent the 'loop target' for looping back to the start of the loop.
1719     ContinueJumpTarget.block->setLoopTarget(F);
1720 
1721     // If body is not a compound statement create implicit scope
1722     // and add destructors.
1723     if (!isa<CompoundStmt>(F->getBody()))
1724       addLocalScopeAndDtors(F->getBody());
1725 
1726     // Now populate the body block, and in the process create new blocks as we
1727     // walk the body of the loop.
1728     CFGBlock* BodyBlock = addStmt(F->getBody());
1729 
1730     if (!BodyBlock)
1731       BodyBlock = ContinueJumpTarget.block;//can happen for "for (...;...;...);"
1732     else if (badCFG)
1733       return 0;
1734 
1735     // This new body block is a successor to our "exit" condition block.
1736     addSuccessor(ExitConditionBlock, KnownVal.isFalse() ? NULL : BodyBlock);
1737   }
1738 
1739   // Link up the condition block with the code that follows the loop.  (the
1740   // false branch).
1741   addSuccessor(ExitConditionBlock, KnownVal.isTrue() ? NULL : LoopSuccessor);
1742 
1743   // If the loop contains initialization, create a new block for those
1744   // statements.  This block can also contain statements that precede the loop.
1745   if (Stmt* I = F->getInit()) {
1746     Block = createBlock();
1747     return addStmt(I);
1748   }
1749 
1750   // There is no loop initialization.  We are thus basically a while loop.
1751   // NULL out Block to force lazy block construction.
1752   Block = NULL;
1753   Succ = EntryConditionBlock;
1754   return EntryConditionBlock;
1755 }
1756 
VisitMemberExpr(MemberExpr * M,AddStmtChoice asc)1757 CFGBlock *CFGBuilder::VisitMemberExpr(MemberExpr *M, AddStmtChoice asc) {
1758   if (asc.alwaysAdd(*this, M)) {
1759     autoCreateBlock();
1760     appendStmt(Block, M);
1761   }
1762   return Visit(M->getBase());
1763 }
1764 
VisitObjCForCollectionStmt(ObjCForCollectionStmt * S)1765 CFGBlock* CFGBuilder::VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) {
1766   // Objective-C fast enumeration 'for' statements:
1767   //  http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC
1768   //
1769   //  for ( Type newVariable in collection_expression ) { statements }
1770   //
1771   //  becomes:
1772   //
1773   //   prologue:
1774   //     1. collection_expression
1775   //     T. jump to loop_entry
1776   //   loop_entry:
1777   //     1. side-effects of element expression
1778   //     1. ObjCForCollectionStmt [performs binding to newVariable]
1779   //     T. ObjCForCollectionStmt  TB, FB  [jumps to TB if newVariable != nil]
1780   //   TB:
1781   //     statements
1782   //     T. jump to loop_entry
1783   //   FB:
1784   //     what comes after
1785   //
1786   //  and
1787   //
1788   //  Type existingItem;
1789   //  for ( existingItem in expression ) { statements }
1790   //
1791   //  becomes:
1792   //
1793   //   the same with newVariable replaced with existingItem; the binding works
1794   //   the same except that for one ObjCForCollectionStmt::getElement() returns
1795   //   a DeclStmt and the other returns a DeclRefExpr.
1796   //
1797 
1798   CFGBlock* LoopSuccessor = 0;
1799 
1800   if (Block) {
1801     if (badCFG)
1802       return 0;
1803     LoopSuccessor = Block;
1804     Block = 0;
1805   } else
1806     LoopSuccessor = Succ;
1807 
1808   // Build the condition blocks.
1809   CFGBlock* ExitConditionBlock = createBlock(false);
1810   CFGBlock* EntryConditionBlock = ExitConditionBlock;
1811 
1812   // Set the terminator for the "exit" condition block.
1813   ExitConditionBlock->setTerminator(S);
1814 
1815   // The last statement in the block should be the ObjCForCollectionStmt, which
1816   // performs the actual binding to 'element' and determines if there are any
1817   // more items in the collection.
1818   appendStmt(ExitConditionBlock, S);
1819   Block = ExitConditionBlock;
1820 
1821   // Walk the 'element' expression to see if there are any side-effects.  We
1822   // generate new blocks as necessary.  We DON'T add the statement by default to
1823   // the CFG unless it contains control-flow.
1824   EntryConditionBlock = Visit(S->getElement(), AddStmtChoice::NotAlwaysAdd);
1825   if (Block) {
1826     if (badCFG)
1827       return 0;
1828     Block = 0;
1829   }
1830 
1831   // The condition block is the implicit successor for the loop body as well as
1832   // any code above the loop.
1833   Succ = EntryConditionBlock;
1834 
1835   // Now create the true branch.
1836   {
1837     // Save the current values for Succ, continue and break targets.
1838     SaveAndRestore<CFGBlock*> save_Succ(Succ);
1839     SaveAndRestore<JumpTarget> save_continue(ContinueJumpTarget),
1840         save_break(BreakJumpTarget);
1841 
1842     BreakJumpTarget = JumpTarget(LoopSuccessor, ScopePos);
1843     ContinueJumpTarget = JumpTarget(EntryConditionBlock, ScopePos);
1844 
1845     CFGBlock* BodyBlock = addStmt(S->getBody());
1846 
1847     if (!BodyBlock)
1848       BodyBlock = EntryConditionBlock; // can happen for "for (X in Y) ;"
1849     else if (Block) {
1850       if (badCFG)
1851         return 0;
1852     }
1853 
1854     // This new body block is a successor to our "exit" condition block.
1855     addSuccessor(ExitConditionBlock, BodyBlock);
1856   }
1857 
1858   // Link up the condition block with the code that follows the loop.
1859   // (the false branch).
1860   addSuccessor(ExitConditionBlock, LoopSuccessor);
1861 
1862   // Now create a prologue block to contain the collection expression.
1863   Block = createBlock();
1864   return addStmt(S->getCollection());
1865 }
1866 
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)1867 CFGBlock* CFGBuilder::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt* S) {
1868   // FIXME: Add locking 'primitives' to CFG for @synchronized.
1869 
1870   // Inline the body.
1871   CFGBlock *SyncBlock = addStmt(S->getSynchBody());
1872 
1873   // The sync body starts its own basic block.  This makes it a little easier
1874   // for diagnostic clients.
1875   if (SyncBlock) {
1876     if (badCFG)
1877       return 0;
1878 
1879     Block = 0;
1880     Succ = SyncBlock;
1881   }
1882 
1883   // Add the @synchronized to the CFG.
1884   autoCreateBlock();
1885   appendStmt(Block, S);
1886 
1887   // Inline the sync expression.
1888   return addStmt(S->getSynchExpr());
1889 }
1890 
VisitObjCAtTryStmt(ObjCAtTryStmt * S)1891 CFGBlock* CFGBuilder::VisitObjCAtTryStmt(ObjCAtTryStmt* S) {
1892   // FIXME
1893   return NYS();
1894 }
1895 
VisitWhileStmt(WhileStmt * W)1896 CFGBlock* CFGBuilder::VisitWhileStmt(WhileStmt* W) {
1897   CFGBlock* LoopSuccessor = NULL;
1898 
1899   // Save local scope position because in case of condition variable ScopePos
1900   // won't be restored when traversing AST.
1901   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
1902 
1903   // Create local scope for possible condition variable.
1904   // Store scope position for continue statement.
1905   LocalScope::const_iterator LoopBeginScopePos = ScopePos;
1906   if (VarDecl* VD = W->getConditionVariable()) {
1907     addLocalScopeForVarDecl(VD);
1908     addAutomaticObjDtors(ScopePos, LoopBeginScopePos, W);
1909   }
1910 
1911   // "while" is a control-flow statement.  Thus we stop processing the current
1912   // block.
1913   if (Block) {
1914     if (badCFG)
1915       return 0;
1916     LoopSuccessor = Block;
1917     Block = 0;
1918   } else
1919     LoopSuccessor = Succ;
1920 
1921   // Because of short-circuit evaluation, the condition of the loop can span
1922   // multiple basic blocks.  Thus we need the "Entry" and "Exit" blocks that
1923   // evaluate the condition.
1924   CFGBlock* ExitConditionBlock = createBlock(false);
1925   CFGBlock* EntryConditionBlock = ExitConditionBlock;
1926 
1927   // Set the terminator for the "exit" condition block.
1928   ExitConditionBlock->setTerminator(W);
1929 
1930   // Now add the actual condition to the condition block.  Because the condition
1931   // itself may contain control-flow, new blocks may be created.  Thus we update
1932   // "Succ" after adding the condition.
1933   if (Stmt* C = W->getCond()) {
1934     Block = ExitConditionBlock;
1935     EntryConditionBlock = addStmt(C);
1936     // The condition might finish the current 'Block'.
1937     Block = EntryConditionBlock;
1938 
1939     // If this block contains a condition variable, add both the condition
1940     // variable and initializer to the CFG.
1941     if (VarDecl *VD = W->getConditionVariable()) {
1942       if (Expr *Init = VD->getInit()) {
1943         autoCreateBlock();
1944         appendStmt(Block, W->getConditionVariableDeclStmt());
1945         EntryConditionBlock = addStmt(Init);
1946         assert(Block == EntryConditionBlock);
1947       }
1948     }
1949 
1950     if (Block) {
1951       if (badCFG)
1952         return 0;
1953     }
1954   }
1955 
1956   // The condition block is the implicit successor for the loop body as well as
1957   // any code above the loop.
1958   Succ = EntryConditionBlock;
1959 
1960   // See if this is a known constant.
1961   const TryResult& KnownVal = tryEvaluateBool(W->getCond());
1962 
1963   // Process the loop body.
1964   {
1965     assert(W->getBody());
1966 
1967     // Save the current values for Block, Succ, and continue and break targets
1968     SaveAndRestore<CFGBlock*> save_Block(Block), save_Succ(Succ);
1969     SaveAndRestore<JumpTarget> save_continue(ContinueJumpTarget),
1970         save_break(BreakJumpTarget);
1971 
1972     // Create an empty block to represent the transition block for looping back
1973     // to the head of the loop.
1974     Block = 0;
1975     assert(Succ == EntryConditionBlock);
1976     Succ = createBlock();
1977     Succ->setLoopTarget(W);
1978     ContinueJumpTarget = JumpTarget(Succ, LoopBeginScopePos);
1979 
1980     // All breaks should go to the code following the loop.
1981     BreakJumpTarget = JumpTarget(LoopSuccessor, ScopePos);
1982 
1983     // NULL out Block to force lazy instantiation of blocks for the body.
1984     Block = NULL;
1985 
1986     // Loop body should end with destructor of Condition variable (if any).
1987     addAutomaticObjDtors(ScopePos, LoopBeginScopePos, W);
1988 
1989     // If body is not a compound statement create implicit scope
1990     // and add destructors.
1991     if (!isa<CompoundStmt>(W->getBody()))
1992       addLocalScopeAndDtors(W->getBody());
1993 
1994     // Create the body.  The returned block is the entry to the loop body.
1995     CFGBlock* BodyBlock = addStmt(W->getBody());
1996 
1997     if (!BodyBlock)
1998       BodyBlock = ContinueJumpTarget.block; // can happen for "while(...) ;"
1999     else if (Block) {
2000       if (badCFG)
2001         return 0;
2002     }
2003 
2004     // Add the loop body entry as a successor to the condition.
2005     addSuccessor(ExitConditionBlock, KnownVal.isFalse() ? NULL : BodyBlock);
2006   }
2007 
2008   // Link up the condition block with the code that follows the loop.  (the
2009   // false branch).
2010   addSuccessor(ExitConditionBlock, KnownVal.isTrue() ? NULL : LoopSuccessor);
2011 
2012   // There can be no more statements in the condition block since we loop back
2013   // to this block.  NULL out Block to force lazy creation of another block.
2014   Block = NULL;
2015 
2016   // Return the condition block, which is the dominating block for the loop.
2017   Succ = EntryConditionBlock;
2018   return EntryConditionBlock;
2019 }
2020 
2021 
VisitObjCAtCatchStmt(ObjCAtCatchStmt * S)2022 CFGBlock *CFGBuilder::VisitObjCAtCatchStmt(ObjCAtCatchStmt* S) {
2023   // FIXME: For now we pretend that @catch and the code it contains does not
2024   //  exit.
2025   return Block;
2026 }
2027 
VisitObjCAtThrowStmt(ObjCAtThrowStmt * S)2028 CFGBlock* CFGBuilder::VisitObjCAtThrowStmt(ObjCAtThrowStmt* S) {
2029   // FIXME: This isn't complete.  We basically treat @throw like a return
2030   //  statement.
2031 
2032   // If we were in the middle of a block we stop processing that block.
2033   if (badCFG)
2034     return 0;
2035 
2036   // Create the new block.
2037   Block = createBlock(false);
2038 
2039   // The Exit block is the only successor.
2040   addSuccessor(Block, &cfg->getExit());
2041 
2042   // Add the statement to the block.  This may create new blocks if S contains
2043   // control-flow (short-circuit operations).
2044   return VisitStmt(S, AddStmtChoice::AlwaysAdd);
2045 }
2046 
VisitCXXThrowExpr(CXXThrowExpr * T)2047 CFGBlock* CFGBuilder::VisitCXXThrowExpr(CXXThrowExpr* T) {
2048   // If we were in the middle of a block we stop processing that block.
2049   if (badCFG)
2050     return 0;
2051 
2052   // Create the new block.
2053   Block = createBlock(false);
2054 
2055   if (TryTerminatedBlock)
2056     // The current try statement is the only successor.
2057     addSuccessor(Block, TryTerminatedBlock);
2058   else
2059     // otherwise the Exit block is the only successor.
2060     addSuccessor(Block, &cfg->getExit());
2061 
2062   // Add the statement to the block.  This may create new blocks if S contains
2063   // control-flow (short-circuit operations).
2064   return VisitStmt(T, AddStmtChoice::AlwaysAdd);
2065 }
2066 
VisitDoStmt(DoStmt * D)2067 CFGBlock *CFGBuilder::VisitDoStmt(DoStmt* D) {
2068   CFGBlock* LoopSuccessor = NULL;
2069 
2070   // "do...while" is a control-flow statement.  Thus we stop processing the
2071   // current block.
2072   if (Block) {
2073     if (badCFG)
2074       return 0;
2075     LoopSuccessor = Block;
2076   } else
2077     LoopSuccessor = Succ;
2078 
2079   // Because of short-circuit evaluation, the condition of the loop can span
2080   // multiple basic blocks.  Thus we need the "Entry" and "Exit" blocks that
2081   // evaluate the condition.
2082   CFGBlock* ExitConditionBlock = createBlock(false);
2083   CFGBlock* EntryConditionBlock = ExitConditionBlock;
2084 
2085   // Set the terminator for the "exit" condition block.
2086   ExitConditionBlock->setTerminator(D);
2087 
2088   // Now add the actual condition to the condition block.  Because the condition
2089   // itself may contain control-flow, new blocks may be created.
2090   if (Stmt* C = D->getCond()) {
2091     Block = ExitConditionBlock;
2092     EntryConditionBlock = addStmt(C);
2093     if (Block) {
2094       if (badCFG)
2095         return 0;
2096     }
2097   }
2098 
2099   // The condition block is the implicit successor for the loop body.
2100   Succ = EntryConditionBlock;
2101 
2102   // See if this is a known constant.
2103   const TryResult &KnownVal = tryEvaluateBool(D->getCond());
2104 
2105   // Process the loop body.
2106   CFGBlock* BodyBlock = NULL;
2107   {
2108     assert(D->getBody());
2109 
2110     // Save the current values for Block, Succ, and continue and break targets
2111     SaveAndRestore<CFGBlock*> save_Block(Block), save_Succ(Succ);
2112     SaveAndRestore<JumpTarget> save_continue(ContinueJumpTarget),
2113         save_break(BreakJumpTarget);
2114 
2115     // All continues within this loop should go to the condition block
2116     ContinueJumpTarget = JumpTarget(EntryConditionBlock, ScopePos);
2117 
2118     // All breaks should go to the code following the loop.
2119     BreakJumpTarget = JumpTarget(LoopSuccessor, ScopePos);
2120 
2121     // NULL out Block to force lazy instantiation of blocks for the body.
2122     Block = NULL;
2123 
2124     // If body is not a compound statement create implicit scope
2125     // and add destructors.
2126     if (!isa<CompoundStmt>(D->getBody()))
2127       addLocalScopeAndDtors(D->getBody());
2128 
2129     // Create the body.  The returned block is the entry to the loop body.
2130     BodyBlock = addStmt(D->getBody());
2131 
2132     if (!BodyBlock)
2133       BodyBlock = EntryConditionBlock; // can happen for "do ; while(...)"
2134     else if (Block) {
2135       if (badCFG)
2136         return 0;
2137     }
2138 
2139     if (!KnownVal.isFalse()) {
2140       // Add an intermediate block between the BodyBlock and the
2141       // ExitConditionBlock to represent the "loop back" transition.  Create an
2142       // empty block to represent the transition block for looping back to the
2143       // head of the loop.
2144       // FIXME: Can we do this more efficiently without adding another block?
2145       Block = NULL;
2146       Succ = BodyBlock;
2147       CFGBlock *LoopBackBlock = createBlock();
2148       LoopBackBlock->setLoopTarget(D);
2149 
2150       // Add the loop body entry as a successor to the condition.
2151       addSuccessor(ExitConditionBlock, LoopBackBlock);
2152     }
2153     else
2154       addSuccessor(ExitConditionBlock, NULL);
2155   }
2156 
2157   // Link up the condition block with the code that follows the loop.
2158   // (the false branch).
2159   addSuccessor(ExitConditionBlock, KnownVal.isTrue() ? NULL : LoopSuccessor);
2160 
2161   // There can be no more statements in the body block(s) since we loop back to
2162   // the body.  NULL out Block to force lazy creation of another block.
2163   Block = NULL;
2164 
2165   // Return the loop body, which is the dominating block for the loop.
2166   Succ = BodyBlock;
2167   return BodyBlock;
2168 }
2169 
VisitContinueStmt(ContinueStmt * C)2170 CFGBlock* CFGBuilder::VisitContinueStmt(ContinueStmt* C) {
2171   // "continue" is a control-flow statement.  Thus we stop processing the
2172   // current block.
2173   if (badCFG)
2174     return 0;
2175 
2176   // Now create a new block that ends with the continue statement.
2177   Block = createBlock(false);
2178   Block->setTerminator(C);
2179 
2180   // If there is no target for the continue, then we are looking at an
2181   // incomplete AST.  This means the CFG cannot be constructed.
2182   if (ContinueJumpTarget.block) {
2183     addAutomaticObjDtors(ScopePos, ContinueJumpTarget.scopePosition, C);
2184     addSuccessor(Block, ContinueJumpTarget.block);
2185   } else
2186     badCFG = true;
2187 
2188   return Block;
2189 }
2190 
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E,AddStmtChoice asc)2191 CFGBlock *CFGBuilder::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E,
2192                                                     AddStmtChoice asc) {
2193 
2194   if (asc.alwaysAdd(*this, E)) {
2195     autoCreateBlock();
2196     appendStmt(Block, E);
2197   }
2198 
2199   // VLA types have expressions that must be evaluated.
2200   CFGBlock *lastBlock = Block;
2201 
2202   if (E->isArgumentType()) {
2203     for (const VariableArrayType *VA =FindVA(E->getArgumentType().getTypePtr());
2204          VA != 0; VA = FindVA(VA->getElementType().getTypePtr()))
2205       lastBlock = addStmt(VA->getSizeExpr());
2206   }
2207 
2208   return lastBlock;
2209 }
2210 
2211 /// VisitStmtExpr - Utility method to handle (nested) statement
2212 ///  expressions (a GCC extension).
VisitStmtExpr(StmtExpr * SE,AddStmtChoice asc)2213 CFGBlock* CFGBuilder::VisitStmtExpr(StmtExpr *SE, AddStmtChoice asc) {
2214   if (asc.alwaysAdd(*this, SE)) {
2215     autoCreateBlock();
2216     appendStmt(Block, SE);
2217   }
2218   return VisitCompoundStmt(SE->getSubStmt());
2219 }
2220 
VisitSwitchStmt(SwitchStmt * Terminator)2221 CFGBlock* CFGBuilder::VisitSwitchStmt(SwitchStmt* Terminator) {
2222   // "switch" is a control-flow statement.  Thus we stop processing the current
2223   // block.
2224   CFGBlock* SwitchSuccessor = NULL;
2225 
2226   // Save local scope position because in case of condition variable ScopePos
2227   // won't be restored when traversing AST.
2228   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
2229 
2230   // Create local scope for possible condition variable.
2231   // Store scope position. Add implicit destructor.
2232   if (VarDecl* VD = Terminator->getConditionVariable()) {
2233     LocalScope::const_iterator SwitchBeginScopePos = ScopePos;
2234     addLocalScopeForVarDecl(VD);
2235     addAutomaticObjDtors(ScopePos, SwitchBeginScopePos, Terminator);
2236   }
2237 
2238   if (Block) {
2239     if (badCFG)
2240       return 0;
2241     SwitchSuccessor = Block;
2242   } else SwitchSuccessor = Succ;
2243 
2244   // Save the current "switch" context.
2245   SaveAndRestore<CFGBlock*> save_switch(SwitchTerminatedBlock),
2246                             save_default(DefaultCaseBlock);
2247   SaveAndRestore<JumpTarget> save_break(BreakJumpTarget);
2248 
2249   // Set the "default" case to be the block after the switch statement.  If the
2250   // switch statement contains a "default:", this value will be overwritten with
2251   // the block for that code.
2252   DefaultCaseBlock = SwitchSuccessor;
2253 
2254   // Create a new block that will contain the switch statement.
2255   SwitchTerminatedBlock = createBlock(false);
2256 
2257   // Now process the switch body.  The code after the switch is the implicit
2258   // successor.
2259   Succ = SwitchSuccessor;
2260   BreakJumpTarget = JumpTarget(SwitchSuccessor, ScopePos);
2261 
2262   // When visiting the body, the case statements should automatically get linked
2263   // up to the switch.  We also don't keep a pointer to the body, since all
2264   // control-flow from the switch goes to case/default statements.
2265   assert(Terminator->getBody() && "switch must contain a non-NULL body");
2266   Block = NULL;
2267 
2268   // For pruning unreachable case statements, save the current state
2269   // for tracking the condition value.
2270   SaveAndRestore<bool> save_switchExclusivelyCovered(switchExclusivelyCovered,
2271                                                      false);
2272 
2273   // Determine if the switch condition can be explicitly evaluated.
2274   assert(Terminator->getCond() && "switch condition must be non-NULL");
2275   Expr::EvalResult result;
2276   bool b = tryEvaluate(Terminator->getCond(), result);
2277   SaveAndRestore<Expr::EvalResult*> save_switchCond(switchCond,
2278                                                     b ? &result : 0);
2279 
2280   // If body is not a compound statement create implicit scope
2281   // and add destructors.
2282   if (!isa<CompoundStmt>(Terminator->getBody()))
2283     addLocalScopeAndDtors(Terminator->getBody());
2284 
2285   addStmt(Terminator->getBody());
2286   if (Block) {
2287     if (badCFG)
2288       return 0;
2289   }
2290 
2291   // If we have no "default:" case, the default transition is to the code
2292   // following the switch body.  Moreover, take into account if all the
2293   // cases of a switch are covered (e.g., switching on an enum value).
2294   addSuccessor(SwitchTerminatedBlock,
2295                switchExclusivelyCovered || Terminator->isAllEnumCasesCovered()
2296                ? 0 : DefaultCaseBlock);
2297 
2298   // Add the terminator and condition in the switch block.
2299   SwitchTerminatedBlock->setTerminator(Terminator);
2300   Block = SwitchTerminatedBlock;
2301   Block = addStmt(Terminator->getCond());
2302 
2303   // Finally, if the SwitchStmt contains a condition variable, add both the
2304   // SwitchStmt and the condition variable initialization to the CFG.
2305   if (VarDecl *VD = Terminator->getConditionVariable()) {
2306     if (Expr *Init = VD->getInit()) {
2307       autoCreateBlock();
2308       appendStmt(Block, Terminator->getConditionVariableDeclStmt());
2309       addStmt(Init);
2310     }
2311   }
2312 
2313   return Block;
2314 }
2315 
shouldAddCase(bool & switchExclusivelyCovered,const Expr::EvalResult * switchCond,const CaseStmt * CS,ASTContext & Ctx)2316 static bool shouldAddCase(bool &switchExclusivelyCovered,
2317                           const Expr::EvalResult *switchCond,
2318                           const CaseStmt *CS,
2319                           ASTContext &Ctx) {
2320   if (!switchCond)
2321     return true;
2322 
2323   bool addCase = false;
2324 
2325   if (!switchExclusivelyCovered) {
2326     if (switchCond->Val.isInt()) {
2327       // Evaluate the LHS of the case value.
2328       Expr::EvalResult V1;
2329       CS->getLHS()->Evaluate(V1, Ctx);
2330       assert(V1.Val.isInt());
2331       const llvm::APSInt &condInt = switchCond->Val.getInt();
2332       const llvm::APSInt &lhsInt = V1.Val.getInt();
2333 
2334       if (condInt == lhsInt) {
2335         addCase = true;
2336         switchExclusivelyCovered = true;
2337       }
2338       else if (condInt < lhsInt) {
2339         if (const Expr *RHS = CS->getRHS()) {
2340           // Evaluate the RHS of the case value.
2341           Expr::EvalResult V2;
2342           RHS->Evaluate(V2, Ctx);
2343           assert(V2.Val.isInt());
2344           if (V2.Val.getInt() <= condInt) {
2345             addCase = true;
2346             switchExclusivelyCovered = true;
2347           }
2348         }
2349       }
2350     }
2351     else
2352       addCase = true;
2353   }
2354   return addCase;
2355 }
2356 
VisitCaseStmt(CaseStmt * CS)2357 CFGBlock* CFGBuilder::VisitCaseStmt(CaseStmt* CS) {
2358   // CaseStmts are essentially labels, so they are the first statement in a
2359   // block.
2360   CFGBlock *TopBlock = 0, *LastBlock = 0;
2361 
2362   if (Stmt *Sub = CS->getSubStmt()) {
2363     // For deeply nested chains of CaseStmts, instead of doing a recursion
2364     // (which can blow out the stack), manually unroll and create blocks
2365     // along the way.
2366     while (isa<CaseStmt>(Sub)) {
2367       CFGBlock *currentBlock = createBlock(false);
2368       currentBlock->setLabel(CS);
2369 
2370       if (TopBlock)
2371         addSuccessor(LastBlock, currentBlock);
2372       else
2373         TopBlock = currentBlock;
2374 
2375       addSuccessor(SwitchTerminatedBlock,
2376                    shouldAddCase(switchExclusivelyCovered, switchCond,
2377                                  CS, *Context)
2378                    ? currentBlock : 0);
2379 
2380       LastBlock = currentBlock;
2381       CS = cast<CaseStmt>(Sub);
2382       Sub = CS->getSubStmt();
2383     }
2384 
2385     addStmt(Sub);
2386   }
2387 
2388   CFGBlock* CaseBlock = Block;
2389   if (!CaseBlock)
2390     CaseBlock = createBlock();
2391 
2392   // Cases statements partition blocks, so this is the top of the basic block we
2393   // were processing (the "case XXX:" is the label).
2394   CaseBlock->setLabel(CS);
2395 
2396   if (badCFG)
2397     return 0;
2398 
2399   // Add this block to the list of successors for the block with the switch
2400   // statement.
2401   assert(SwitchTerminatedBlock);
2402   addSuccessor(SwitchTerminatedBlock,
2403                shouldAddCase(switchExclusivelyCovered, switchCond,
2404                              CS, *Context)
2405                ? CaseBlock : 0);
2406 
2407   // We set Block to NULL to allow lazy creation of a new block (if necessary)
2408   Block = NULL;
2409 
2410   if (TopBlock) {
2411     addSuccessor(LastBlock, CaseBlock);
2412     Succ = TopBlock;
2413   } else {
2414     // This block is now the implicit successor of other blocks.
2415     Succ = CaseBlock;
2416   }
2417 
2418   return Succ;
2419 }
2420 
VisitDefaultStmt(DefaultStmt * Terminator)2421 CFGBlock* CFGBuilder::VisitDefaultStmt(DefaultStmt* Terminator) {
2422   if (Terminator->getSubStmt())
2423     addStmt(Terminator->getSubStmt());
2424 
2425   DefaultCaseBlock = Block;
2426 
2427   if (!DefaultCaseBlock)
2428     DefaultCaseBlock = createBlock();
2429 
2430   // Default statements partition blocks, so this is the top of the basic block
2431   // we were processing (the "default:" is the label).
2432   DefaultCaseBlock->setLabel(Terminator);
2433 
2434   if (badCFG)
2435     return 0;
2436 
2437   // Unlike case statements, we don't add the default block to the successors
2438   // for the switch statement immediately.  This is done when we finish
2439   // processing the switch statement.  This allows for the default case
2440   // (including a fall-through to the code after the switch statement) to always
2441   // be the last successor of a switch-terminated block.
2442 
2443   // We set Block to NULL to allow lazy creation of a new block (if necessary)
2444   Block = NULL;
2445 
2446   // This block is now the implicit successor of other blocks.
2447   Succ = DefaultCaseBlock;
2448 
2449   return DefaultCaseBlock;
2450 }
2451 
VisitCXXTryStmt(CXXTryStmt * Terminator)2452 CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
2453   // "try"/"catch" is a control-flow statement.  Thus we stop processing the
2454   // current block.
2455   CFGBlock* TrySuccessor = NULL;
2456 
2457   if (Block) {
2458     if (badCFG)
2459       return 0;
2460     TrySuccessor = Block;
2461   } else TrySuccessor = Succ;
2462 
2463   CFGBlock *PrevTryTerminatedBlock = TryTerminatedBlock;
2464 
2465   // Create a new block that will contain the try statement.
2466   CFGBlock *NewTryTerminatedBlock = createBlock(false);
2467   // Add the terminator in the try block.
2468   NewTryTerminatedBlock->setTerminator(Terminator);
2469 
2470   bool HasCatchAll = false;
2471   for (unsigned h = 0; h <Terminator->getNumHandlers(); ++h) {
2472     // The code after the try is the implicit successor.
2473     Succ = TrySuccessor;
2474     CXXCatchStmt *CS = Terminator->getHandler(h);
2475     if (CS->getExceptionDecl() == 0) {
2476       HasCatchAll = true;
2477     }
2478     Block = NULL;
2479     CFGBlock *CatchBlock = VisitCXXCatchStmt(CS);
2480     if (CatchBlock == 0)
2481       return 0;
2482     // Add this block to the list of successors for the block with the try
2483     // statement.
2484     addSuccessor(NewTryTerminatedBlock, CatchBlock);
2485   }
2486   if (!HasCatchAll) {
2487     if (PrevTryTerminatedBlock)
2488       addSuccessor(NewTryTerminatedBlock, PrevTryTerminatedBlock);
2489     else
2490       addSuccessor(NewTryTerminatedBlock, &cfg->getExit());
2491   }
2492 
2493   // The code after the try is the implicit successor.
2494   Succ = TrySuccessor;
2495 
2496   // Save the current "try" context.
2497   SaveAndRestore<CFGBlock*> save_try(TryTerminatedBlock);
2498   TryTerminatedBlock = NewTryTerminatedBlock;
2499 
2500   assert(Terminator->getTryBlock() && "try must contain a non-NULL body");
2501   Block = NULL;
2502   Block = addStmt(Terminator->getTryBlock());
2503   return Block;
2504 }
2505 
VisitCXXCatchStmt(CXXCatchStmt * CS)2506 CFGBlock* CFGBuilder::VisitCXXCatchStmt(CXXCatchStmt* CS) {
2507   // CXXCatchStmt are treated like labels, so they are the first statement in a
2508   // block.
2509 
2510   // Save local scope position because in case of exception variable ScopePos
2511   // won't be restored when traversing AST.
2512   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
2513 
2514   // Create local scope for possible exception variable.
2515   // Store scope position. Add implicit destructor.
2516   if (VarDecl* VD = CS->getExceptionDecl()) {
2517     LocalScope::const_iterator BeginScopePos = ScopePos;
2518     addLocalScopeForVarDecl(VD);
2519     addAutomaticObjDtors(ScopePos, BeginScopePos, CS);
2520   }
2521 
2522   if (CS->getHandlerBlock())
2523     addStmt(CS->getHandlerBlock());
2524 
2525   CFGBlock* CatchBlock = Block;
2526   if (!CatchBlock)
2527     CatchBlock = createBlock();
2528 
2529   CatchBlock->setLabel(CS);
2530 
2531   if (badCFG)
2532     return 0;
2533 
2534   // We set Block to NULL to allow lazy creation of a new block (if necessary)
2535   Block = NULL;
2536 
2537   return CatchBlock;
2538 }
2539 
VisitCXXForRangeStmt(CXXForRangeStmt * S)2540 CFGBlock* CFGBuilder::VisitCXXForRangeStmt(CXXForRangeStmt* S) {
2541   // C++0x for-range statements are specified as [stmt.ranged]:
2542   //
2543   // {
2544   //   auto && __range = range-init;
2545   //   for ( auto __begin = begin-expr,
2546   //         __end = end-expr;
2547   //         __begin != __end;
2548   //         ++__begin ) {
2549   //     for-range-declaration = *__begin;
2550   //     statement
2551   //   }
2552   // }
2553 
2554   // Save local scope position before the addition of the implicit variables.
2555   SaveAndRestore<LocalScope::const_iterator> save_scope_pos(ScopePos);
2556 
2557   // Create local scopes and destructors for range, begin and end variables.
2558   if (Stmt *Range = S->getRangeStmt())
2559     addLocalScopeForStmt(Range);
2560   if (Stmt *BeginEnd = S->getBeginEndStmt())
2561     addLocalScopeForStmt(BeginEnd);
2562   addAutomaticObjDtors(ScopePos, save_scope_pos.get(), S);
2563 
2564   LocalScope::const_iterator ContinueScopePos = ScopePos;
2565 
2566   // "for" is a control-flow statement.  Thus we stop processing the current
2567   // block.
2568   CFGBlock* LoopSuccessor = NULL;
2569   if (Block) {
2570     if (badCFG)
2571       return 0;
2572     LoopSuccessor = Block;
2573   } else
2574     LoopSuccessor = Succ;
2575 
2576   // Save the current value for the break targets.
2577   // All breaks should go to the code following the loop.
2578   SaveAndRestore<JumpTarget> save_break(BreakJumpTarget);
2579   BreakJumpTarget = JumpTarget(LoopSuccessor, ScopePos);
2580 
2581   // The block for the __begin != __end expression.
2582   CFGBlock* ConditionBlock = createBlock(false);
2583   ConditionBlock->setTerminator(S);
2584 
2585   // Now add the actual condition to the condition block.
2586   if (Expr *C = S->getCond()) {
2587     Block = ConditionBlock;
2588     CFGBlock *BeginConditionBlock = addStmt(C);
2589     if (badCFG)
2590       return 0;
2591     assert(BeginConditionBlock == ConditionBlock &&
2592            "condition block in for-range was unexpectedly complex");
2593     (void)BeginConditionBlock;
2594   }
2595 
2596   // The condition block is the implicit successor for the loop body as well as
2597   // any code above the loop.
2598   Succ = ConditionBlock;
2599 
2600   // See if this is a known constant.
2601   TryResult KnownVal(true);
2602 
2603   if (S->getCond())
2604     KnownVal = tryEvaluateBool(S->getCond());
2605 
2606   // Now create the loop body.
2607   {
2608     assert(S->getBody());
2609 
2610     // Save the current values for Block, Succ, and continue targets.
2611     SaveAndRestore<CFGBlock*> save_Block(Block), save_Succ(Succ);
2612     SaveAndRestore<JumpTarget> save_continue(ContinueJumpTarget);
2613 
2614     // Generate increment code in its own basic block.  This is the target of
2615     // continue statements.
2616     Block = 0;
2617     Succ = addStmt(S->getInc());
2618     ContinueJumpTarget = JumpTarget(Succ, ContinueScopePos);
2619 
2620     // The starting block for the loop increment is the block that should
2621     // represent the 'loop target' for looping back to the start of the loop.
2622     ContinueJumpTarget.block->setLoopTarget(S);
2623 
2624     // Finish up the increment block and prepare to start the loop body.
2625     assert(Block);
2626     if (badCFG)
2627       return 0;
2628     Block = 0;
2629 
2630 
2631     // Add implicit scope and dtors for loop variable.
2632     addLocalScopeAndDtors(S->getLoopVarStmt());
2633 
2634     // Populate a new block to contain the loop body and loop variable.
2635     Block = addStmt(S->getBody());
2636     if (badCFG)
2637       return 0;
2638     Block = addStmt(S->getLoopVarStmt());
2639     if (badCFG)
2640       return 0;
2641 
2642     // This new body block is a successor to our condition block.
2643     addSuccessor(ConditionBlock, KnownVal.isFalse() ? 0 : Block);
2644   }
2645 
2646   // Link up the condition block with the code that follows the loop (the
2647   // false branch).
2648   addSuccessor(ConditionBlock, KnownVal.isTrue() ? 0 : LoopSuccessor);
2649 
2650   // Add the initialization statements.
2651   Block = createBlock();
2652   addStmt(S->getBeginEndStmt());
2653   return addStmt(S->getRangeStmt());
2654 }
2655 
VisitExprWithCleanups(ExprWithCleanups * E,AddStmtChoice asc)2656 CFGBlock *CFGBuilder::VisitExprWithCleanups(ExprWithCleanups *E,
2657     AddStmtChoice asc) {
2658   if (BuildOpts.AddImplicitDtors) {
2659     // If adding implicit destructors visit the full expression for adding
2660     // destructors of temporaries.
2661     VisitForTemporaryDtors(E->getSubExpr());
2662 
2663     // Full expression has to be added as CFGStmt so it will be sequenced
2664     // before destructors of it's temporaries.
2665     asc = asc.withAlwaysAdd(true);
2666   }
2667   return Visit(E->getSubExpr(), asc);
2668 }
2669 
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * E,AddStmtChoice asc)2670 CFGBlock *CFGBuilder::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E,
2671                                                 AddStmtChoice asc) {
2672   if (asc.alwaysAdd(*this, E)) {
2673     autoCreateBlock();
2674     appendStmt(Block, E);
2675 
2676     // We do not want to propagate the AlwaysAdd property.
2677     asc = asc.withAlwaysAdd(false);
2678   }
2679   return Visit(E->getSubExpr(), asc);
2680 }
2681 
VisitCXXConstructExpr(CXXConstructExpr * C,AddStmtChoice asc)2682 CFGBlock *CFGBuilder::VisitCXXConstructExpr(CXXConstructExpr *C,
2683                                             AddStmtChoice asc) {
2684   autoCreateBlock();
2685   if (!C->isElidable())
2686     appendStmt(Block, C);
2687 
2688   return VisitChildren(C);
2689 }
2690 
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * E,AddStmtChoice asc)2691 CFGBlock *CFGBuilder::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E,
2692                                                  AddStmtChoice asc) {
2693   if (asc.alwaysAdd(*this, E)) {
2694     autoCreateBlock();
2695     appendStmt(Block, E);
2696     // We do not want to propagate the AlwaysAdd property.
2697     asc = asc.withAlwaysAdd(false);
2698   }
2699   return Visit(E->getSubExpr(), asc);
2700 }
2701 
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * C,AddStmtChoice asc)2702 CFGBlock *CFGBuilder::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *C,
2703                                                   AddStmtChoice asc) {
2704   autoCreateBlock();
2705   appendStmt(Block, C);
2706   return VisitChildren(C);
2707 }
2708 
VisitImplicitCastExpr(ImplicitCastExpr * E,AddStmtChoice asc)2709 CFGBlock *CFGBuilder::VisitImplicitCastExpr(ImplicitCastExpr *E,
2710                                             AddStmtChoice asc) {
2711   if (asc.alwaysAdd(*this, E)) {
2712     autoCreateBlock();
2713     appendStmt(Block, E);
2714   }
2715   return Visit(E->getSubExpr(), AddStmtChoice());
2716 }
2717 
VisitIndirectGotoStmt(IndirectGotoStmt * I)2718 CFGBlock* CFGBuilder::VisitIndirectGotoStmt(IndirectGotoStmt* I) {
2719   // Lazily create the indirect-goto dispatch block if there isn't one already.
2720   CFGBlock* IBlock = cfg->getIndirectGotoBlock();
2721 
2722   if (!IBlock) {
2723     IBlock = createBlock(false);
2724     cfg->setIndirectGotoBlock(IBlock);
2725   }
2726 
2727   // IndirectGoto is a control-flow statement.  Thus we stop processing the
2728   // current block and create a new one.
2729   if (badCFG)
2730     return 0;
2731 
2732   Block = createBlock(false);
2733   Block->setTerminator(I);
2734   addSuccessor(Block, IBlock);
2735   return addStmt(I->getTarget());
2736 }
2737 
VisitForTemporaryDtors(Stmt * E,bool BindToTemporary)2738 CFGBlock *CFGBuilder::VisitForTemporaryDtors(Stmt *E, bool BindToTemporary) {
2739 tryAgain:
2740   if (!E) {
2741     badCFG = true;
2742     return NULL;
2743   }
2744   switch (E->getStmtClass()) {
2745     default:
2746       return VisitChildrenForTemporaryDtors(E);
2747 
2748     case Stmt::BinaryOperatorClass:
2749       return VisitBinaryOperatorForTemporaryDtors(cast<BinaryOperator>(E));
2750 
2751     case Stmt::CXXBindTemporaryExprClass:
2752       return VisitCXXBindTemporaryExprForTemporaryDtors(
2753           cast<CXXBindTemporaryExpr>(E), BindToTemporary);
2754 
2755     case Stmt::BinaryConditionalOperatorClass:
2756     case Stmt::ConditionalOperatorClass:
2757       return VisitConditionalOperatorForTemporaryDtors(
2758           cast<AbstractConditionalOperator>(E), BindToTemporary);
2759 
2760     case Stmt::ImplicitCastExprClass:
2761       // For implicit cast we want BindToTemporary to be passed further.
2762       E = cast<CastExpr>(E)->getSubExpr();
2763       goto tryAgain;
2764 
2765     case Stmt::ParenExprClass:
2766       E = cast<ParenExpr>(E)->getSubExpr();
2767       goto tryAgain;
2768 
2769     case Stmt::MaterializeTemporaryExprClass:
2770       E = cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr();
2771       goto tryAgain;
2772   }
2773 }
2774 
VisitChildrenForTemporaryDtors(Stmt * E)2775 CFGBlock *CFGBuilder::VisitChildrenForTemporaryDtors(Stmt *E) {
2776   // When visiting children for destructors we want to visit them in reverse
2777   // order. Because there's no reverse iterator for children must to reverse
2778   // them in helper vector.
2779   typedef llvm::SmallVector<Stmt *, 4> ChildrenVect;
2780   ChildrenVect ChildrenRev;
2781   for (Stmt::child_range I = E->children(); I; ++I) {
2782     if (*I) ChildrenRev.push_back(*I);
2783   }
2784 
2785   CFGBlock *B = Block;
2786   for (ChildrenVect::reverse_iterator I = ChildrenRev.rbegin(),
2787       L = ChildrenRev.rend(); I != L; ++I) {
2788     if (CFGBlock *R = VisitForTemporaryDtors(*I))
2789       B = R;
2790   }
2791   return B;
2792 }
2793 
VisitBinaryOperatorForTemporaryDtors(BinaryOperator * E)2794 CFGBlock *CFGBuilder::VisitBinaryOperatorForTemporaryDtors(BinaryOperator *E) {
2795   if (E->isLogicalOp()) {
2796     // Destructors for temporaries in LHS expression should be called after
2797     // those for RHS expression. Even if this will unnecessarily create a block,
2798     // this block will be used at least by the full expression.
2799     autoCreateBlock();
2800     CFGBlock *ConfluenceBlock = VisitForTemporaryDtors(E->getLHS());
2801     if (badCFG)
2802       return NULL;
2803 
2804     Succ = ConfluenceBlock;
2805     Block = NULL;
2806     CFGBlock *RHSBlock = VisitForTemporaryDtors(E->getRHS());
2807 
2808     if (RHSBlock) {
2809       if (badCFG)
2810         return NULL;
2811 
2812       // If RHS expression did produce destructors we need to connect created
2813       // blocks to CFG in same manner as for binary operator itself.
2814       CFGBlock *LHSBlock = createBlock(false);
2815       LHSBlock->setTerminator(CFGTerminator(E, true));
2816 
2817       // For binary operator LHS block is before RHS in list of predecessors
2818       // of ConfluenceBlock.
2819       std::reverse(ConfluenceBlock->pred_begin(),
2820           ConfluenceBlock->pred_end());
2821 
2822       // See if this is a known constant.
2823       TryResult KnownVal = tryEvaluateBool(E->getLHS());
2824       if (KnownVal.isKnown() && (E->getOpcode() == BO_LOr))
2825         KnownVal.negate();
2826 
2827       // Link LHSBlock with RHSBlock exactly the same way as for binary operator
2828       // itself.
2829       if (E->getOpcode() == BO_LOr) {
2830         addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock);
2831         addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock);
2832       } else {
2833         assert (E->getOpcode() == BO_LAnd);
2834         addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock);
2835         addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock);
2836       }
2837 
2838       Block = LHSBlock;
2839       return LHSBlock;
2840     }
2841 
2842     Block = ConfluenceBlock;
2843     return ConfluenceBlock;
2844   }
2845 
2846   if (E->isAssignmentOp()) {
2847     // For assignment operator (=) LHS expression is visited
2848     // before RHS expression. For destructors visit them in reverse order.
2849     CFGBlock *RHSBlock = VisitForTemporaryDtors(E->getRHS());
2850     CFGBlock *LHSBlock = VisitForTemporaryDtors(E->getLHS());
2851     return LHSBlock ? LHSBlock : RHSBlock;
2852   }
2853 
2854   // For any other binary operator RHS expression is visited before
2855   // LHS expression (order of children). For destructors visit them in reverse
2856   // order.
2857   CFGBlock *LHSBlock = VisitForTemporaryDtors(E->getLHS());
2858   CFGBlock *RHSBlock = VisitForTemporaryDtors(E->getRHS());
2859   return RHSBlock ? RHSBlock : LHSBlock;
2860 }
2861 
VisitCXXBindTemporaryExprForTemporaryDtors(CXXBindTemporaryExpr * E,bool BindToTemporary)2862 CFGBlock *CFGBuilder::VisitCXXBindTemporaryExprForTemporaryDtors(
2863     CXXBindTemporaryExpr *E, bool BindToTemporary) {
2864   // First add destructors for temporaries in subexpression.
2865   CFGBlock *B = VisitForTemporaryDtors(E->getSubExpr());
2866   if (!BindToTemporary) {
2867     // If lifetime of temporary is not prolonged (by assigning to constant
2868     // reference) add destructor for it.
2869     autoCreateBlock();
2870     appendTemporaryDtor(Block, E);
2871     B = Block;
2872   }
2873   return B;
2874 }
2875 
VisitConditionalOperatorForTemporaryDtors(AbstractConditionalOperator * E,bool BindToTemporary)2876 CFGBlock *CFGBuilder::VisitConditionalOperatorForTemporaryDtors(
2877     AbstractConditionalOperator *E, bool BindToTemporary) {
2878   // First add destructors for condition expression.  Even if this will
2879   // unnecessarily create a block, this block will be used at least by the full
2880   // expression.
2881   autoCreateBlock();
2882   CFGBlock *ConfluenceBlock = VisitForTemporaryDtors(E->getCond());
2883   if (badCFG)
2884     return NULL;
2885   if (BinaryConditionalOperator *BCO
2886         = dyn_cast<BinaryConditionalOperator>(E)) {
2887     ConfluenceBlock = VisitForTemporaryDtors(BCO->getCommon());
2888     if (badCFG)
2889       return NULL;
2890   }
2891 
2892   // Try to add block with destructors for LHS expression.
2893   CFGBlock *LHSBlock = NULL;
2894   Succ = ConfluenceBlock;
2895   Block = NULL;
2896   LHSBlock = VisitForTemporaryDtors(E->getTrueExpr(), BindToTemporary);
2897   if (badCFG)
2898     return NULL;
2899 
2900   // Try to add block with destructors for RHS expression;
2901   Succ = ConfluenceBlock;
2902   Block = NULL;
2903   CFGBlock *RHSBlock = VisitForTemporaryDtors(E->getFalseExpr(),
2904                                               BindToTemporary);
2905   if (badCFG)
2906     return NULL;
2907 
2908   if (!RHSBlock && !LHSBlock) {
2909     // If neither LHS nor RHS expression had temporaries to destroy don't create
2910     // more blocks.
2911     Block = ConfluenceBlock;
2912     return Block;
2913   }
2914 
2915   Block = createBlock(false);
2916   Block->setTerminator(CFGTerminator(E, true));
2917 
2918   // See if this is a known constant.
2919   const TryResult &KnownVal = tryEvaluateBool(E->getCond());
2920 
2921   if (LHSBlock) {
2922     addSuccessor(Block, KnownVal.isFalse() ? NULL : LHSBlock);
2923   } else if (KnownVal.isFalse()) {
2924     addSuccessor(Block, NULL);
2925   } else {
2926     addSuccessor(Block, ConfluenceBlock);
2927     std::reverse(ConfluenceBlock->pred_begin(), ConfluenceBlock->pred_end());
2928   }
2929 
2930   if (!RHSBlock)
2931     RHSBlock = ConfluenceBlock;
2932   addSuccessor(Block, KnownVal.isTrue() ? NULL : RHSBlock);
2933 
2934   return Block;
2935 }
2936 
2937 } // end anonymous namespace
2938 
2939 /// createBlock - Constructs and adds a new CFGBlock to the CFG.  The block has
2940 ///  no successors or predecessors.  If this is the first block created in the
2941 ///  CFG, it is automatically set to be the Entry and Exit of the CFG.
createBlock()2942 CFGBlock* CFG::createBlock() {
2943   bool first_block = begin() == end();
2944 
2945   // Create the block.
2946   CFGBlock *Mem = getAllocator().Allocate<CFGBlock>();
2947   new (Mem) CFGBlock(NumBlockIDs++, BlkBVC);
2948   Blocks.push_back(Mem, BlkBVC);
2949 
2950   // If this is the first block, set it as the Entry and Exit.
2951   if (first_block)
2952     Entry = Exit = &back();
2953 
2954   // Return the block.
2955   return &back();
2956 }
2957 
2958 /// buildCFG - Constructs a CFG from an AST.  Ownership of the returned
2959 ///  CFG is returned to the caller.
buildCFG(const Decl * D,Stmt * Statement,ASTContext * C,const BuildOptions & BO)2960 CFG* CFG::buildCFG(const Decl *D, Stmt* Statement, ASTContext *C,
2961     const BuildOptions &BO) {
2962   CFGBuilder Builder(C, BO);
2963   return Builder.buildCFG(D, Statement);
2964 }
2965 
2966 const CXXDestructorDecl *
getDestructorDecl(ASTContext & astContext) const2967 CFGImplicitDtor::getDestructorDecl(ASTContext &astContext) const {
2968   switch (getKind()) {
2969     case CFGElement::Invalid:
2970     case CFGElement::Statement:
2971     case CFGElement::Initializer:
2972       llvm_unreachable("getDestructorDecl should only be used with "
2973                        "ImplicitDtors");
2974     case CFGElement::AutomaticObjectDtor: {
2975       const VarDecl *var = cast<CFGAutomaticObjDtor>(this)->getVarDecl();
2976       QualType ty = var->getType();
2977       ty = ty.getNonReferenceType();
2978       if (const ArrayType *arrayType = astContext.getAsArrayType(ty)) {
2979         ty = arrayType->getElementType();
2980       }
2981       const RecordType *recordType = ty->getAs<RecordType>();
2982       const CXXRecordDecl *classDecl =
2983       cast<CXXRecordDecl>(recordType->getDecl());
2984       return classDecl->getDestructor();
2985     }
2986     case CFGElement::TemporaryDtor: {
2987       const CXXBindTemporaryExpr *bindExpr =
2988         cast<CFGTemporaryDtor>(this)->getBindTemporaryExpr();
2989       const CXXTemporary *temp = bindExpr->getTemporary();
2990       return temp->getDestructor();
2991     }
2992     case CFGElement::BaseDtor:
2993     case CFGElement::MemberDtor:
2994 
2995       // Not yet supported.
2996       return 0;
2997   }
2998   llvm_unreachable("getKind() returned bogus value");
2999   return 0;
3000 }
3001 
isNoReturn(ASTContext & astContext) const3002 bool CFGImplicitDtor::isNoReturn(ASTContext &astContext) const {
3003   if (const CXXDestructorDecl *cdecl = getDestructorDecl(astContext)) {
3004     QualType ty = cdecl->getType();
3005     return cast<FunctionType>(ty)->getNoReturnAttr();
3006   }
3007   return false;
3008 }
3009 
3010 //===----------------------------------------------------------------------===//
3011 // CFG: Queries for BlkExprs.
3012 //===----------------------------------------------------------------------===//
3013 
3014 namespace {
3015   typedef llvm::DenseMap<const Stmt*,unsigned> BlkExprMapTy;
3016 }
3017 
FindSubExprAssignments(Stmt * S,llvm::SmallPtrSet<Expr *,50> & Set)3018 static void FindSubExprAssignments(Stmt *S,
3019                                    llvm::SmallPtrSet<Expr*,50>& Set) {
3020   if (!S)
3021     return;
3022 
3023   for (Stmt::child_range I = S->children(); I; ++I) {
3024     Stmt *child = *I;
3025     if (!child)
3026       continue;
3027 
3028     if (BinaryOperator* B = dyn_cast<BinaryOperator>(child))
3029       if (B->isAssignmentOp()) Set.insert(B);
3030 
3031     FindSubExprAssignments(child, Set);
3032   }
3033 }
3034 
PopulateBlkExprMap(CFG & cfg)3035 static BlkExprMapTy* PopulateBlkExprMap(CFG& cfg) {
3036   BlkExprMapTy* M = new BlkExprMapTy();
3037 
3038   // Look for assignments that are used as subexpressions.  These are the only
3039   // assignments that we want to *possibly* register as a block-level
3040   // expression.  Basically, if an assignment occurs both in a subexpression and
3041   // at the block-level, it is a block-level expression.
3042   llvm::SmallPtrSet<Expr*,50> SubExprAssignments;
3043 
3044   for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I)
3045     for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI)
3046       if (const CFGStmt *S = BI->getAs<CFGStmt>())
3047         FindSubExprAssignments(S->getStmt(), SubExprAssignments);
3048 
3049   for (CFG::iterator I=cfg.begin(), E=cfg.end(); I != E; ++I) {
3050 
3051     // Iterate over the statements again on identify the Expr* and Stmt* at the
3052     // block-level that are block-level expressions.
3053 
3054     for (CFGBlock::iterator BI=(*I)->begin(), EI=(*I)->end(); BI != EI; ++BI) {
3055       const CFGStmt *CS = BI->getAs<CFGStmt>();
3056       if (!CS)
3057         continue;
3058       if (Expr* Exp = dyn_cast<Expr>(CS->getStmt())) {
3059         assert((Exp->IgnoreParens() == Exp) && "No parens on block-level exps");
3060 
3061         if (BinaryOperator* B = dyn_cast<BinaryOperator>(Exp)) {
3062           // Assignment expressions that are not nested within another
3063           // expression are really "statements" whose value is never used by
3064           // another expression.
3065           if (B->isAssignmentOp() && !SubExprAssignments.count(Exp))
3066             continue;
3067         } else if (const StmtExpr* SE = dyn_cast<StmtExpr>(Exp)) {
3068           // Special handling for statement expressions.  The last statement in
3069           // the statement expression is also a block-level expr.
3070           const CompoundStmt* C = SE->getSubStmt();
3071           if (!C->body_empty()) {
3072             const Stmt *Last = C->body_back();
3073             if (const Expr *LastEx = dyn_cast<Expr>(Last))
3074               Last = LastEx->IgnoreParens();
3075             unsigned x = M->size();
3076             (*M)[Last] = x;
3077           }
3078         }
3079 
3080         unsigned x = M->size();
3081         (*M)[Exp] = x;
3082       }
3083     }
3084 
3085     // Look at terminators.  The condition is a block-level expression.
3086 
3087     Stmt* S = (*I)->getTerminatorCondition();
3088 
3089     if (S && M->find(S) == M->end()) {
3090       unsigned x = M->size();
3091       (*M)[S] = x;
3092     }
3093   }
3094 
3095   return M;
3096 }
3097 
getBlkExprNum(const Stmt * S)3098 CFG::BlkExprNumTy CFG::getBlkExprNum(const Stmt* S) {
3099   assert(S != NULL);
3100   if (!BlkExprMap) { BlkExprMap = (void*) PopulateBlkExprMap(*this); }
3101 
3102   BlkExprMapTy* M = reinterpret_cast<BlkExprMapTy*>(BlkExprMap);
3103   BlkExprMapTy::iterator I = M->find(S);
3104   return (I == M->end()) ? CFG::BlkExprNumTy() : CFG::BlkExprNumTy(I->second);
3105 }
3106 
getNumBlkExprs()3107 unsigned CFG::getNumBlkExprs() {
3108   if (const BlkExprMapTy* M = reinterpret_cast<const BlkExprMapTy*>(BlkExprMap))
3109     return M->size();
3110 
3111   // We assume callers interested in the number of BlkExprs will want
3112   // the map constructed if it doesn't already exist.
3113   BlkExprMap = (void*) PopulateBlkExprMap(*this);
3114   return reinterpret_cast<BlkExprMapTy*>(BlkExprMap)->size();
3115 }
3116 
3117 //===----------------------------------------------------------------------===//
3118 // Filtered walking of the CFG.
3119 //===----------------------------------------------------------------------===//
3120 
FilterEdge(const CFGBlock::FilterOptions & F,const CFGBlock * From,const CFGBlock * To)3121 bool CFGBlock::FilterEdge(const CFGBlock::FilterOptions &F,
3122         const CFGBlock *From, const CFGBlock *To) {
3123 
3124   if (To && F.IgnoreDefaultsWithCoveredEnums) {
3125     // If the 'To' has no label or is labeled but the label isn't a
3126     // CaseStmt then filter this edge.
3127     if (const SwitchStmt *S =
3128         dyn_cast_or_null<SwitchStmt>(From->getTerminator().getStmt())) {
3129       if (S->isAllEnumCasesCovered()) {
3130         const Stmt *L = To->getLabel();
3131         if (!L || !isa<CaseStmt>(L))
3132           return true;
3133       }
3134     }
3135   }
3136 
3137   return false;
3138 }
3139 
3140 //===----------------------------------------------------------------------===//
3141 // Cleanup: CFG dstor.
3142 //===----------------------------------------------------------------------===//
3143 
~CFG()3144 CFG::~CFG() {
3145   delete reinterpret_cast<const BlkExprMapTy*>(BlkExprMap);
3146 }
3147 
3148 //===----------------------------------------------------------------------===//
3149 // CFG pretty printing
3150 //===----------------------------------------------------------------------===//
3151 
3152 namespace {
3153 
3154 class StmtPrinterHelper : public PrinterHelper  {
3155   typedef llvm::DenseMap<const Stmt*,std::pair<unsigned,unsigned> > StmtMapTy;
3156   typedef llvm::DenseMap<const Decl*,std::pair<unsigned,unsigned> > DeclMapTy;
3157   StmtMapTy StmtMap;
3158   DeclMapTy DeclMap;
3159   signed currentBlock;
3160   unsigned currentStmt;
3161   const LangOptions &LangOpts;
3162 public:
3163 
StmtPrinterHelper(const CFG * cfg,const LangOptions & LO)3164   StmtPrinterHelper(const CFG* cfg, const LangOptions &LO)
3165     : currentBlock(0), currentStmt(0), LangOpts(LO)
3166   {
3167     for (CFG::const_iterator I = cfg->begin(), E = cfg->end(); I != E; ++I ) {
3168       unsigned j = 1;
3169       for (CFGBlock::const_iterator BI = (*I)->begin(), BEnd = (*I)->end() ;
3170            BI != BEnd; ++BI, ++j ) {
3171         if (const CFGStmt *SE = BI->getAs<CFGStmt>()) {
3172           const Stmt *stmt= SE->getStmt();
3173           std::pair<unsigned, unsigned> P((*I)->getBlockID(), j);
3174           StmtMap[stmt] = P;
3175 
3176           switch (stmt->getStmtClass()) {
3177             case Stmt::DeclStmtClass:
3178                 DeclMap[cast<DeclStmt>(stmt)->getSingleDecl()] = P;
3179                 break;
3180             case Stmt::IfStmtClass: {
3181               const VarDecl *var = cast<IfStmt>(stmt)->getConditionVariable();
3182               if (var)
3183                 DeclMap[var] = P;
3184               break;
3185             }
3186             case Stmt::ForStmtClass: {
3187               const VarDecl *var = cast<ForStmt>(stmt)->getConditionVariable();
3188               if (var)
3189                 DeclMap[var] = P;
3190               break;
3191             }
3192             case Stmt::WhileStmtClass: {
3193               const VarDecl *var =
3194                 cast<WhileStmt>(stmt)->getConditionVariable();
3195               if (var)
3196                 DeclMap[var] = P;
3197               break;
3198             }
3199             case Stmt::SwitchStmtClass: {
3200               const VarDecl *var =
3201                 cast<SwitchStmt>(stmt)->getConditionVariable();
3202               if (var)
3203                 DeclMap[var] = P;
3204               break;
3205             }
3206             case Stmt::CXXCatchStmtClass: {
3207               const VarDecl *var =
3208                 cast<CXXCatchStmt>(stmt)->getExceptionDecl();
3209               if (var)
3210                 DeclMap[var] = P;
3211               break;
3212             }
3213             default:
3214               break;
3215           }
3216         }
3217       }
3218     }
3219   }
3220 
3221 
~StmtPrinterHelper()3222   virtual ~StmtPrinterHelper() {}
3223 
getLangOpts() const3224   const LangOptions &getLangOpts() const { return LangOpts; }
setBlockID(signed i)3225   void setBlockID(signed i) { currentBlock = i; }
setStmtID(unsigned i)3226   void setStmtID(unsigned i) { currentStmt = i; }
3227 
handledStmt(Stmt * S,llvm::raw_ostream & OS)3228   virtual bool handledStmt(Stmt* S, llvm::raw_ostream& OS) {
3229     StmtMapTy::iterator I = StmtMap.find(S);
3230 
3231     if (I == StmtMap.end())
3232       return false;
3233 
3234     if (currentBlock >= 0 && I->second.first == (unsigned) currentBlock
3235                           && I->second.second == currentStmt) {
3236       return false;
3237     }
3238 
3239     OS << "[B" << I->second.first << "." << I->second.second << "]";
3240     return true;
3241   }
3242 
handleDecl(const Decl * D,llvm::raw_ostream & OS)3243   bool handleDecl(const Decl* D, llvm::raw_ostream& OS) {
3244     DeclMapTy::iterator I = DeclMap.find(D);
3245 
3246     if (I == DeclMap.end())
3247       return false;
3248 
3249     if (currentBlock >= 0 && I->second.first == (unsigned) currentBlock
3250                           && I->second.second == currentStmt) {
3251       return false;
3252     }
3253 
3254     OS << "[B" << I->second.first << "." << I->second.second << "]";
3255     return true;
3256   }
3257 };
3258 } // end anonymous namespace
3259 
3260 
3261 namespace {
3262 class CFGBlockTerminatorPrint
3263   : public StmtVisitor<CFGBlockTerminatorPrint,void> {
3264 
3265   llvm::raw_ostream& OS;
3266   StmtPrinterHelper* Helper;
3267   PrintingPolicy Policy;
3268 public:
CFGBlockTerminatorPrint(llvm::raw_ostream & os,StmtPrinterHelper * helper,const PrintingPolicy & Policy)3269   CFGBlockTerminatorPrint(llvm::raw_ostream& os, StmtPrinterHelper* helper,
3270                           const PrintingPolicy &Policy)
3271     : OS(os), Helper(helper), Policy(Policy) {}
3272 
VisitIfStmt(IfStmt * I)3273   void VisitIfStmt(IfStmt* I) {
3274     OS << "if ";
3275     I->getCond()->printPretty(OS,Helper,Policy);
3276   }
3277 
3278   // Default case.
VisitStmt(Stmt * Terminator)3279   void VisitStmt(Stmt* Terminator) {
3280     Terminator->printPretty(OS, Helper, Policy);
3281   }
3282 
VisitForStmt(ForStmt * F)3283   void VisitForStmt(ForStmt* F) {
3284     OS << "for (" ;
3285     if (F->getInit())
3286       OS << "...";
3287     OS << "; ";
3288     if (Stmt* C = F->getCond())
3289       C->printPretty(OS, Helper, Policy);
3290     OS << "; ";
3291     if (F->getInc())
3292       OS << "...";
3293     OS << ")";
3294   }
3295 
VisitWhileStmt(WhileStmt * W)3296   void VisitWhileStmt(WhileStmt* W) {
3297     OS << "while " ;
3298     if (Stmt* C = W->getCond())
3299       C->printPretty(OS, Helper, Policy);
3300   }
3301 
VisitDoStmt(DoStmt * D)3302   void VisitDoStmt(DoStmt* D) {
3303     OS << "do ... while ";
3304     if (Stmt* C = D->getCond())
3305       C->printPretty(OS, Helper, Policy);
3306   }
3307 
VisitSwitchStmt(SwitchStmt * Terminator)3308   void VisitSwitchStmt(SwitchStmt* Terminator) {
3309     OS << "switch ";
3310     Terminator->getCond()->printPretty(OS, Helper, Policy);
3311   }
3312 
VisitCXXTryStmt(CXXTryStmt * CS)3313   void VisitCXXTryStmt(CXXTryStmt* CS) {
3314     OS << "try ...";
3315   }
3316 
VisitAbstractConditionalOperator(AbstractConditionalOperator * C)3317   void VisitAbstractConditionalOperator(AbstractConditionalOperator* C) {
3318     C->getCond()->printPretty(OS, Helper, Policy);
3319     OS << " ? ... : ...";
3320   }
3321 
VisitChooseExpr(ChooseExpr * C)3322   void VisitChooseExpr(ChooseExpr* C) {
3323     OS << "__builtin_choose_expr( ";
3324     C->getCond()->printPretty(OS, Helper, Policy);
3325     OS << " )";
3326   }
3327 
VisitIndirectGotoStmt(IndirectGotoStmt * I)3328   void VisitIndirectGotoStmt(IndirectGotoStmt* I) {
3329     OS << "goto *";
3330     I->getTarget()->printPretty(OS, Helper, Policy);
3331   }
3332 
VisitBinaryOperator(BinaryOperator * B)3333   void VisitBinaryOperator(BinaryOperator* B) {
3334     if (!B->isLogicalOp()) {
3335       VisitExpr(B);
3336       return;
3337     }
3338 
3339     B->getLHS()->printPretty(OS, Helper, Policy);
3340 
3341     switch (B->getOpcode()) {
3342       case BO_LOr:
3343         OS << " || ...";
3344         return;
3345       case BO_LAnd:
3346         OS << " && ...";
3347         return;
3348       default:
3349         assert(false && "Invalid logical operator.");
3350     }
3351   }
3352 
VisitExpr(Expr * E)3353   void VisitExpr(Expr* E) {
3354     E->printPretty(OS, Helper, Policy);
3355   }
3356 };
3357 } // end anonymous namespace
3358 
print_elem(llvm::raw_ostream & OS,StmtPrinterHelper * Helper,const CFGElement & E)3359 static void print_elem(llvm::raw_ostream &OS, StmtPrinterHelper* Helper,
3360                        const CFGElement &E) {
3361   if (const CFGStmt *CS = E.getAs<CFGStmt>()) {
3362     Stmt *S = CS->getStmt();
3363 
3364     if (Helper) {
3365 
3366       // special printing for statement-expressions.
3367       if (StmtExpr* SE = dyn_cast<StmtExpr>(S)) {
3368         CompoundStmt* Sub = SE->getSubStmt();
3369 
3370         if (Sub->children()) {
3371           OS << "({ ... ; ";
3372           Helper->handledStmt(*SE->getSubStmt()->body_rbegin(),OS);
3373           OS << " })\n";
3374           return;
3375         }
3376       }
3377       // special printing for comma expressions.
3378       if (BinaryOperator* B = dyn_cast<BinaryOperator>(S)) {
3379         if (B->getOpcode() == BO_Comma) {
3380           OS << "... , ";
3381           Helper->handledStmt(B->getRHS(),OS);
3382           OS << '\n';
3383           return;
3384         }
3385       }
3386     }
3387     S->printPretty(OS, Helper, PrintingPolicy(Helper->getLangOpts()));
3388 
3389     if (isa<CXXOperatorCallExpr>(S)) {
3390       OS << " (OperatorCall)";
3391     } else if (isa<CXXBindTemporaryExpr>(S)) {
3392       OS << " (BindTemporary)";
3393     }
3394 
3395     // Expressions need a newline.
3396     if (isa<Expr>(S))
3397       OS << '\n';
3398 
3399   } else if (const CFGInitializer *IE = E.getAs<CFGInitializer>()) {
3400     const CXXCtorInitializer *I = IE->getInitializer();
3401     if (I->isBaseInitializer())
3402       OS << I->getBaseClass()->getAsCXXRecordDecl()->getName();
3403     else OS << I->getAnyMember()->getName();
3404 
3405     OS << "(";
3406     if (Expr* IE = I->getInit())
3407       IE->printPretty(OS, Helper, PrintingPolicy(Helper->getLangOpts()));
3408     OS << ")";
3409 
3410     if (I->isBaseInitializer())
3411       OS << " (Base initializer)\n";
3412     else OS << " (Member initializer)\n";
3413 
3414   } else if (const CFGAutomaticObjDtor *DE = E.getAs<CFGAutomaticObjDtor>()){
3415     const VarDecl* VD = DE->getVarDecl();
3416     Helper->handleDecl(VD, OS);
3417 
3418     const Type* T = VD->getType().getTypePtr();
3419     if (const ReferenceType* RT = T->getAs<ReferenceType>())
3420       T = RT->getPointeeType().getTypePtr();
3421     else if (const Type *ET = T->getArrayElementTypeNoTypeQual())
3422       T = ET;
3423 
3424     OS << ".~" << T->getAsCXXRecordDecl()->getName().str() << "()";
3425     OS << " (Implicit destructor)\n";
3426 
3427   } else if (const CFGBaseDtor *BE = E.getAs<CFGBaseDtor>()) {
3428     const CXXBaseSpecifier *BS = BE->getBaseSpecifier();
3429     OS << "~" << BS->getType()->getAsCXXRecordDecl()->getName() << "()";
3430     OS << " (Base object destructor)\n";
3431 
3432   } else if (const CFGMemberDtor *ME = E.getAs<CFGMemberDtor>()) {
3433     const FieldDecl *FD = ME->getFieldDecl();
3434 
3435     const Type *T = FD->getType().getTypePtr();
3436     if (const Type *ET = T->getArrayElementTypeNoTypeQual())
3437       T = ET;
3438 
3439     OS << "this->" << FD->getName();
3440     OS << ".~" << T->getAsCXXRecordDecl()->getName() << "()";
3441     OS << " (Member object destructor)\n";
3442 
3443   } else if (const CFGTemporaryDtor *TE = E.getAs<CFGTemporaryDtor>()) {
3444     const CXXBindTemporaryExpr *BT = TE->getBindTemporaryExpr();
3445     OS << "~" << BT->getType()->getAsCXXRecordDecl()->getName() << "()";
3446     OS << " (Temporary object destructor)\n";
3447   }
3448 }
3449 
print_block(llvm::raw_ostream & OS,const CFG * cfg,const CFGBlock & B,StmtPrinterHelper * Helper,bool print_edges)3450 static void print_block(llvm::raw_ostream& OS, const CFG* cfg,
3451                         const CFGBlock& B,
3452                         StmtPrinterHelper* Helper, bool print_edges) {
3453 
3454   if (Helper) Helper->setBlockID(B.getBlockID());
3455 
3456   // Print the header.
3457   OS << "\n [ B" << B.getBlockID();
3458 
3459   if (&B == &cfg->getEntry())
3460     OS << " (ENTRY) ]\n";
3461   else if (&B == &cfg->getExit())
3462     OS << " (EXIT) ]\n";
3463   else if (&B == cfg->getIndirectGotoBlock())
3464     OS << " (INDIRECT GOTO DISPATCH) ]\n";
3465   else
3466     OS << " ]\n";
3467 
3468   // Print the label of this block.
3469   if (Stmt* Label = const_cast<Stmt*>(B.getLabel())) {
3470 
3471     if (print_edges)
3472       OS << "    ";
3473 
3474     if (LabelStmt* L = dyn_cast<LabelStmt>(Label))
3475       OS << L->getName();
3476     else if (CaseStmt* C = dyn_cast<CaseStmt>(Label)) {
3477       OS << "case ";
3478       C->getLHS()->printPretty(OS, Helper,
3479                                PrintingPolicy(Helper->getLangOpts()));
3480       if (C->getRHS()) {
3481         OS << " ... ";
3482         C->getRHS()->printPretty(OS, Helper,
3483                                  PrintingPolicy(Helper->getLangOpts()));
3484       }
3485     } else if (isa<DefaultStmt>(Label))
3486       OS << "default";
3487     else if (CXXCatchStmt *CS = dyn_cast<CXXCatchStmt>(Label)) {
3488       OS << "catch (";
3489       if (CS->getExceptionDecl())
3490         CS->getExceptionDecl()->print(OS, PrintingPolicy(Helper->getLangOpts()),
3491                                       0);
3492       else
3493         OS << "...";
3494       OS << ")";
3495 
3496     } else
3497       assert(false && "Invalid label statement in CFGBlock.");
3498 
3499     OS << ":\n";
3500   }
3501 
3502   // Iterate through the statements in the block and print them.
3503   unsigned j = 1;
3504 
3505   for (CFGBlock::const_iterator I = B.begin(), E = B.end() ;
3506        I != E ; ++I, ++j ) {
3507 
3508     // Print the statement # in the basic block and the statement itself.
3509     if (print_edges)
3510       OS << "    ";
3511 
3512     OS << llvm::format("%3d", j) << ": ";
3513 
3514     if (Helper)
3515       Helper->setStmtID(j);
3516 
3517     print_elem(OS,Helper,*I);
3518   }
3519 
3520   // Print the terminator of this block.
3521   if (B.getTerminator()) {
3522     if (print_edges)
3523       OS << "    ";
3524 
3525     OS << "  T: ";
3526 
3527     if (Helper) Helper->setBlockID(-1);
3528 
3529     CFGBlockTerminatorPrint TPrinter(OS, Helper,
3530                                      PrintingPolicy(Helper->getLangOpts()));
3531     TPrinter.Visit(const_cast<Stmt*>(B.getTerminator().getStmt()));
3532     OS << '\n';
3533   }
3534 
3535   if (print_edges) {
3536     // Print the predecessors of this block.
3537     OS << "    Predecessors (" << B.pred_size() << "):";
3538     unsigned i = 0;
3539 
3540     for (CFGBlock::const_pred_iterator I = B.pred_begin(), E = B.pred_end();
3541          I != E; ++I, ++i) {
3542 
3543       if (i == 8 || (i-8) == 0)
3544         OS << "\n     ";
3545 
3546       OS << " B" << (*I)->getBlockID();
3547     }
3548 
3549     OS << '\n';
3550 
3551     // Print the successors of this block.
3552     OS << "    Successors (" << B.succ_size() << "):";
3553     i = 0;
3554 
3555     for (CFGBlock::const_succ_iterator I = B.succ_begin(), E = B.succ_end();
3556          I != E; ++I, ++i) {
3557 
3558       if (i == 8 || (i-8) % 10 == 0)
3559         OS << "\n    ";
3560 
3561       if (*I)
3562         OS << " B" << (*I)->getBlockID();
3563       else
3564         OS  << " NULL";
3565     }
3566 
3567     OS << '\n';
3568   }
3569 }
3570 
3571 
3572 /// dump - A simple pretty printer of a CFG that outputs to stderr.
dump(const LangOptions & LO) const3573 void CFG::dump(const LangOptions &LO) const { print(llvm::errs(), LO); }
3574 
3575 /// print - A simple pretty printer of a CFG that outputs to an ostream.
print(llvm::raw_ostream & OS,const LangOptions & LO) const3576 void CFG::print(llvm::raw_ostream &OS, const LangOptions &LO) const {
3577   StmtPrinterHelper Helper(this, LO);
3578 
3579   // Print the entry block.
3580   print_block(OS, this, getEntry(), &Helper, true);
3581 
3582   // Iterate through the CFGBlocks and print them one by one.
3583   for (const_iterator I = Blocks.begin(), E = Blocks.end() ; I != E ; ++I) {
3584     // Skip the entry block, because we already printed it.
3585     if (&(**I) == &getEntry() || &(**I) == &getExit())
3586       continue;
3587 
3588     print_block(OS, this, **I, &Helper, true);
3589   }
3590 
3591   // Print the exit block.
3592   print_block(OS, this, getExit(), &Helper, true);
3593   OS.flush();
3594 }
3595 
3596 /// dump - A simply pretty printer of a CFGBlock that outputs to stderr.
dump(const CFG * cfg,const LangOptions & LO) const3597 void CFGBlock::dump(const CFG* cfg, const LangOptions &LO) const {
3598   print(llvm::errs(), cfg, LO);
3599 }
3600 
3601 /// print - A simple pretty printer of a CFGBlock that outputs to an ostream.
3602 ///   Generally this will only be called from CFG::print.
print(llvm::raw_ostream & OS,const CFG * cfg,const LangOptions & LO) const3603 void CFGBlock::print(llvm::raw_ostream& OS, const CFG* cfg,
3604                      const LangOptions &LO) const {
3605   StmtPrinterHelper Helper(cfg, LO);
3606   print_block(OS, cfg, *this, &Helper, true);
3607 }
3608 
3609 /// printTerminator - A simple pretty printer of the terminator of a CFGBlock.
printTerminator(llvm::raw_ostream & OS,const LangOptions & LO) const3610 void CFGBlock::printTerminator(llvm::raw_ostream &OS,
3611                                const LangOptions &LO) const {
3612   CFGBlockTerminatorPrint TPrinter(OS, NULL, PrintingPolicy(LO));
3613   TPrinter.Visit(const_cast<Stmt*>(getTerminator().getStmt()));
3614 }
3615 
getTerminatorCondition()3616 Stmt* CFGBlock::getTerminatorCondition() {
3617   Stmt *Terminator = this->Terminator;
3618   if (!Terminator)
3619     return NULL;
3620 
3621   Expr* E = NULL;
3622 
3623   switch (Terminator->getStmtClass()) {
3624     default:
3625       break;
3626 
3627     case Stmt::ForStmtClass:
3628       E = cast<ForStmt>(Terminator)->getCond();
3629       break;
3630 
3631     case Stmt::WhileStmtClass:
3632       E = cast<WhileStmt>(Terminator)->getCond();
3633       break;
3634 
3635     case Stmt::DoStmtClass:
3636       E = cast<DoStmt>(Terminator)->getCond();
3637       break;
3638 
3639     case Stmt::IfStmtClass:
3640       E = cast<IfStmt>(Terminator)->getCond();
3641       break;
3642 
3643     case Stmt::ChooseExprClass:
3644       E = cast<ChooseExpr>(Terminator)->getCond();
3645       break;
3646 
3647     case Stmt::IndirectGotoStmtClass:
3648       E = cast<IndirectGotoStmt>(Terminator)->getTarget();
3649       break;
3650 
3651     case Stmt::SwitchStmtClass:
3652       E = cast<SwitchStmt>(Terminator)->getCond();
3653       break;
3654 
3655     case Stmt::BinaryConditionalOperatorClass:
3656       E = cast<BinaryConditionalOperator>(Terminator)->getCond();
3657       break;
3658 
3659     case Stmt::ConditionalOperatorClass:
3660       E = cast<ConditionalOperator>(Terminator)->getCond();
3661       break;
3662 
3663     case Stmt::BinaryOperatorClass: // '&&' and '||'
3664       E = cast<BinaryOperator>(Terminator)->getLHS();
3665       break;
3666 
3667     case Stmt::ObjCForCollectionStmtClass:
3668       return Terminator;
3669   }
3670 
3671   return E ? E->IgnoreParens() : NULL;
3672 }
3673 
3674 //===----------------------------------------------------------------------===//
3675 // CFG Graphviz Visualization
3676 //===----------------------------------------------------------------------===//
3677 
3678 
3679 #ifndef NDEBUG
3680 static StmtPrinterHelper* GraphHelper;
3681 #endif
3682 
viewCFG(const LangOptions & LO) const3683 void CFG::viewCFG(const LangOptions &LO) const {
3684 #ifndef NDEBUG
3685   StmtPrinterHelper H(this, LO);
3686   GraphHelper = &H;
3687   llvm::ViewGraph(this,"CFG");
3688   GraphHelper = NULL;
3689 #endif
3690 }
3691 
3692 namespace llvm {
3693 template<>
3694 struct DOTGraphTraits<const CFG*> : public DefaultDOTGraphTraits {
3695 
DOTGraphTraitsllvm::DOTGraphTraits3696   DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
3697 
getNodeLabelllvm::DOTGraphTraits3698   static std::string getNodeLabel(const CFGBlock* Node, const CFG* Graph) {
3699 
3700 #ifndef NDEBUG
3701     std::string OutSStr;
3702     llvm::raw_string_ostream Out(OutSStr);
3703     print_block(Out,Graph, *Node, GraphHelper, false);
3704     std::string& OutStr = Out.str();
3705 
3706     if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
3707 
3708     // Process string output to make it nicer...
3709     for (unsigned i = 0; i != OutStr.length(); ++i)
3710       if (OutStr[i] == '\n') {                            // Left justify
3711         OutStr[i] = '\\';
3712         OutStr.insert(OutStr.begin()+i+1, 'l');
3713       }
3714 
3715     return OutStr;
3716 #else
3717     return "";
3718 #endif
3719   }
3720 };
3721 } // end namespace llvm
3722