18 #include "llvm/ADT/BitVector.h" 19 #include "llvm/ADT/SmallVector.h" 21 using namespace clang;
25 : analyzed(cfg.getNumBlockIDs(),
false) {}
32 if (!analyzed[DstBlockID]) {
34 analyzed[DstBlockID] =
true;
38 return reachable[DstBlockID][Src->
getBlockID()];
43 void CFGReverseBlockReachabilityAnalysis::mapReachability(
const CFGBlock *Dst) {
45 llvm::BitVector visited(analyzed.size());
47 ReachableSet &DstReachability = reachable[Dst->
getBlockID()];
48 DstReachability.resize(analyzed.size(),
false);
52 worklist.push_back(Dst);
55 while (!worklist.empty()) {
56 const CFGBlock *block = worklist.pop_back_val();
72 e = block->
pred_end(); i != e; ++i) {
74 worklist.push_back(*i);
AdjacentBlocks::const_iterator const_pred_iterator
unsigned getBlockID() const
Represents a single basic block in a source-level CFG.
Represents a source-level, intra-procedural CFG that represents the control-flow of a Stmt...
bool isReachable(const CFGBlock *Src, const CFGBlock *Dst)
Returns true if the block 'Dst' can be reached from block 'Src'.
CFGReverseBlockReachabilityAnalysis(const CFG &cfg)
pred_iterator pred_begin()
Dataflow Directional Tag Classes.