diff options
author | Ted Kremenek <kremenek@apple.com> | 2014-02-27 00:24:00 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2014-02-27 00:24:00 +0000 |
commit | 4b6fee6cc4f367bf6a6728cd8ae02928a422d8ce (patch) | |
tree | cbfb44fa698024af9f3c0a051f642ed3cecfd3dc /clang/lib/Analysis/CFGReachabilityAnalysis.cpp | |
parent | 2eab2bd86d82637df6df12a3792e5f0513a88e35 (diff) | |
download | bcm5719-llvm-4b6fee6cc4f367bf6a6728cd8ae02928a422d8ce.tar.gz bcm5719-llvm-4b6fee6cc4f367bf6a6728cd8ae02928a422d8ce.zip |
Rework CFG edges to encode potentially unreachable edges, instead of just making them NULL.
This is to support some analyses, like -Wunreachable-code, that
will need to recover the original unprunned CFG edges in order
to suppress issues that aren't really bugs in practice.
There are two important changes here:
- AdjacentBlock replaces CFGBlock* for CFG successors/predecessors.
This has the size of 2 pointers, instead of 1. This is unlikely
to have a significant memory impact on Sema since a single
CFG usually exists at one time, but could impact the memory
usage of the static analyzer. This could possibly be optimized
down to a single pointer with some cleverness.
- Predecessors can now contain null predecessors, which means
some analyses doing a reverse traversal will need to take into
account. This already exists for successors, which contain
successor slots for specific branch kinds (e.g., 'if') that
expect a fixed number of successors, even if a branch is
not reachable.
llvm-svn: 202325
Diffstat (limited to 'clang/lib/Analysis/CFGReachabilityAnalysis.cpp')
-rw-r--r-- | clang/lib/Analysis/CFGReachabilityAnalysis.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CFGReachabilityAnalysis.cpp b/clang/lib/Analysis/CFGReachabilityAnalysis.cpp index 492e66fe817..4ae135f1ea7 100644 --- a/clang/lib/Analysis/CFGReachabilityAnalysis.cpp +++ b/clang/lib/Analysis/CFGReachabilityAnalysis.cpp @@ -69,7 +69,8 @@ void CFGReverseBlockReachabilityAnalysis::mapReachability(const CFGBlock *Dst) { // Add the predecessors to the worklist. for (CFGBlock::const_pred_iterator i = block->pred_begin(), e = block->pred_end(); i != e; ++i) { - worklist.push_back(*i); + if (*i) + worklist.push_back(*i); } } } |