1e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===- ReachableCode.h -----------------------------------------*- C++ --*-===//
2e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//
3e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//                     The LLVM Compiler Infrastructure
4e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//
5e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek// This file is distributed under the University of Illinois Open Source
6e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek// License. See LICENSE.TXT for details.
7e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//
8e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
9e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//
10e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek// A flow-sensitive, path-insensitive analysis of unreachable code.
11e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//
12e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
13e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
14e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek#ifndef LLVM_CLANG_REACHABLECODE_H
15e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek#define LLVM_CLANG_REACHABLECODE_H
16e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
1772919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek#include "clang/Basic/SourceLocation.h"
1872919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek
19e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
20e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek// Forward declarations.
21e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
22e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
23e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremeneknamespace llvm {
2472919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek  class BitVector;
2572919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek}
26e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
27e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremeneknamespace clang {
281d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  class AnalysisDeclContext;
2972919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek  class CFGBlock;
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class Preprocessor;
3172919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek}
32e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
33e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
34e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek// API.
35e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek//===----------------------------------------------------------------------===//
36e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
37e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremeneknamespace clang {
3872919a334752bc87001a7e3a0b6e5892768fac20Ted Kremeneknamespace reachable_code {
3972919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Classifications of unreachable code.
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum UnreachableKind {
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  UK_Return,
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  UK_Break,
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  UK_Loop_Increment,
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  UK_Other
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4872919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenekclass Callback {
4999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
5072919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenekpublic:
5172919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek  virtual ~Callback() {}
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual void HandleUnreachable(UnreachableKind UK,
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 SourceLocation L,
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 SourceRange ConditionVal,
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 SourceRange R1,
5672919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek                                 SourceRange R2) = 0;
5772919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek};
58e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
59e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek/// ScanReachableFromBlock - Mark all blocks reachable from Start.
6072919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek/// Returns the total number of blocks that were marked reachable.
610f3b4ca1764cd6d457f511d340fba504f41763c3Ted Kremenekunsigned ScanReachableFromBlock(const CFGBlock *Start,
6272919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek                                llvm::BitVector &Reachable);
6372919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid FindUnreachableCode(AnalysisDeclContext &AC, Preprocessor &PP,
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         Callback &CB);
66e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
6772919a334752bc87001a7e3a0b6e5892768fac20Ted Kremenek}} // end namespace clang::reachable_code
68e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek
69e5064ab8a8be7fbb8bb9727bea954c9fea7b40abTed Kremenek#endif
70