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