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