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