1204643Srdivacky//===- ReachableCode.h -----------------------------------------*- C++ --*-===//
2204643Srdivacky//
3204643Srdivacky//                     The LLVM Compiler Infrastructure
4204643Srdivacky//
5204643Srdivacky// This file is distributed under the University of Illinois Open Source
6204643Srdivacky// License. See LICENSE.TXT for details.
7204643Srdivacky//
8204643Srdivacky//===----------------------------------------------------------------------===//
9204643Srdivacky//
10204643Srdivacky// A flow-sensitive, path-insensitive analysis of unreachable code.
11204643Srdivacky//
12204643Srdivacky//===----------------------------------------------------------------------===//
13204643Srdivacky
14204643Srdivacky#ifndef LLVM_CLANG_REACHABLECODE_H
15204643Srdivacky#define LLVM_CLANG_REACHABLECODE_H
16204643Srdivacky
17204643Srdivacky#include "clang/Basic/SourceLocation.h"
18204643Srdivacky
19204643Srdivacky//===----------------------------------------------------------------------===//
20204643Srdivacky// Forward declarations.
21204643Srdivacky//===----------------------------------------------------------------------===//
22204643Srdivacky
23204643Srdivackynamespace llvm {
24204643Srdivacky  class BitVector;
25204643Srdivacky}
26204643Srdivacky
27204643Srdivackynamespace clang {
28234353Sdim  class AnalysisDeclContext;
29204643Srdivacky  class CFGBlock;
30204643Srdivacky}
31204643Srdivacky
32204643Srdivacky//===----------------------------------------------------------------------===//
33204643Srdivacky// API.
34204643Srdivacky//===----------------------------------------------------------------------===//
35204643Srdivacky
36204643Srdivackynamespace clang {
37204643Srdivackynamespace reachable_code {
38204643Srdivacky
39204643Srdivackyclass Callback {
40234353Sdim  virtual void anchor();
41204643Srdivackypublic:
42204643Srdivacky  virtual ~Callback() {}
43204643Srdivacky  virtual void HandleUnreachable(SourceLocation L, SourceRange R1,
44204643Srdivacky                                 SourceRange R2) = 0;
45204643Srdivacky};
46204643Srdivacky
47204643Srdivacky/// ScanReachableFromBlock - Mark all blocks reachable from Start.
48204643Srdivacky/// Returns the total number of blocks that were marked reachable.
49226633Sdimunsigned ScanReachableFromBlock(const CFGBlock *Start,
50204643Srdivacky                                llvm::BitVector &Reachable);
51204643Srdivacky
52234353Sdimvoid FindUnreachableCode(AnalysisDeclContext &AC, Callback &CB);
53204643Srdivacky
54204643Srdivacky}} // end namespace clang::reachable_code
55204643Srdivacky
56204643Srdivacky#endif
57