[cfe-commits] r113449 - in /cfe/trunk: include/clang/Analysis/CFG.h lib/Analysis/CFG.cpp

Tom Care tcare at apple.com
Wed Sep 8 18:51:18 PDT 2010


FYI, line 213's ';' is triggering a -pedantic warning for me, and lines 219, 229, and 230 contain tabs.

Tom

On Sep 8, 2010, at 5:06 PM, Ted Kremenek wrote:

> Author: kremenek
> Date: Wed Sep  8 19:06:04 2010
> New Revision: 113449
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=113449&view=rev
> Log:
> Add 'filtered_pred_iterator' and 'filtered_succ_iterator' to CFGBlock.  This allows a client
> to selectively walk successors/predecessors based on commonly used filters.  For starters, add
> a filter to ignore 'default:' cases for SwitchStmts when all enum values are covered by CaseStmts.
> 
> Modified:
>    cfe/trunk/include/clang/Analysis/CFG.h
>    cfe/trunk/lib/Analysis/CFG.cpp
> 
> Modified: cfe/trunk/include/clang/Analysis/CFG.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=113449&r1=113448&r2=113449&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/CFG.h (original)
> +++ cfe/trunk/include/clang/Analysis/CFG.h Wed Sep  8 19:06:04 2010
> @@ -205,6 +205,59 @@
>   unsigned                     pred_size()   const { return Preds.size();    }
>   bool                         pred_empty()  const { return Preds.empty();   }
> 
> +
> +  class FilterOptions {
> +  public:
> +    FilterOptions() {
> +      IgnoreDefaultsWithCoveredEnums = 0;
> +    };
> +
> +    unsigned IgnoreDefaultsWithCoveredEnums : 1;
> +  };
> +
> +  static bool FilterEdge(const FilterOptions &F, const CFGBlock *Src,
> +			 const CFGBlock *Dst);
> +
> +  template <typename IMPL, bool IsPred>
> +  class FilteredCFGBlockIterator {
> +  private:
> +    IMPL I, E;
> +    const FilterOptions F;
> +    const CFGBlock *From;
> +   public:
> +    explicit FilteredCFGBlockIterator(const IMPL &i, const IMPL &e,
> +				      const CFGBlock *from,
> +				      const FilterOptions &f)
> +      : I(i), E(e), F(f), From(from) {}
> +
> +    bool hasMore() const { return I != E; }
> +
> +    FilteredCFGBlockIterator &operator++() {
> +      do { ++I; } while (hasMore() && Filter(*I));
> +      return *this;
> +    }
> +
> +    const CFGBlock *operator*() const { return *I; }
> +  private:
> +    bool Filter(const CFGBlock *To) {
> +      return IsPred ? FilterEdge(F, To, From) : FilterEdge(F, From, To);
> +    }
> +  };
> +
> +  typedef FilteredCFGBlockIterator<const_pred_iterator, true>
> +          filtered_pred_iterator;
> +
> +  typedef FilteredCFGBlockIterator<const_succ_iterator, false>
> +          filtered_succ_iterator;
> +
> +  filtered_pred_iterator filtered_pred_start_end(const FilterOptions &f) const {
> +    return filtered_pred_iterator(pred_begin(), pred_end(), this, f);
> +  }
> +
> +  filtered_succ_iterator filtered_succ_start_end(const FilterOptions &f) const {
> +    return filtered_succ_iterator(succ_begin(), succ_end(), this, f);
> +  }
> +
>   // Manipulation of block contents
> 
>   void setTerminator(Stmt* Statement) { Terminator = Statement; }
> 
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=113449&r1=113448&r2=113449&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Wed Sep  8 19:06:04 2010
> @@ -1937,6 +1937,29 @@
> }
> 
> //===----------------------------------------------------------------------===//
> +// Filtered walking of the CFG.
> +//===----------------------------------------------------------------------===//
> +
> +bool CFGBlock::FilterEdge(const CFGBlock::FilterOptions &F,
> +			  const CFGBlock *From, const CFGBlock *To) {
> +
> +  if (F.IgnoreDefaultsWithCoveredEnums) {
> +    // If the 'To' has no label or is labeled but the label isn't a
> +    // CaseStmt then filter this edge.
> +    if (const SwitchStmt *S =
> +	dyn_cast_or_null<SwitchStmt>(From->getTerminator())) {
> +      if (S->isAllEnumCasesCovered()) {
> +	const Stmt *L = To->getLabel();
> +	if (!L || !isa<CaseStmt>(L))
> +	  return true;
> +      }
> +    }
> +  }
> +
> +  return false;
> +}
> +
> +//===----------------------------------------------------------------------===//
> // Cleanup: CFG dstor.
> //===----------------------------------------------------------------------===//
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list