1//===- ReachableCode.h -----------------------------------------*- 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// A flow-sensitive, path-insensitive analysis of unreachable code. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H 15#define LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H 16 17#include "clang/Basic/SourceLocation.h" 18 19//===----------------------------------------------------------------------===// 20// Forward declarations. 21//===----------------------------------------------------------------------===// 22 23namespace llvm { 24 class BitVector; 25} 26 27namespace clang { 28 class AnalysisDeclContext; 29 class CFGBlock; 30 class Preprocessor; 31} 32 33//===----------------------------------------------------------------------===// 34// API. 35//===----------------------------------------------------------------------===// 36 37namespace clang { 38namespace reachable_code { 39 40/// Classifications of unreachable code. 41enum UnreachableKind { 42 UK_Return, 43 UK_Break, 44 UK_Loop_Increment, 45 UK_Other 46}; 47 48class Callback { 49 virtual void anchor(); 50public: 51 virtual ~Callback() {} 52 virtual void HandleUnreachable(UnreachableKind UK, 53 SourceLocation L, 54 SourceRange ConditionVal, 55 SourceRange R1, 56 SourceRange R2) = 0; 57}; 58 59/// ScanReachableFromBlock - Mark all blocks reachable from Start. 60/// Returns the total number of blocks that were marked reachable. 61unsigned ScanReachableFromBlock(const CFGBlock *Start, 62 llvm::BitVector &Reachable); 63 64void FindUnreachableCode(AnalysisDeclContext &AC, Preprocessor &PP, 65 Callback &CB); 66 67}} // end namespace clang::reachable_code 68 69#endif 70