Home | History | Annotate | Line # | Download | only in Analyses
      1 //===- ReachableCode.h -----------------------------------------*- C++ --*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // A flow-sensitive, path-insensitive analysis of unreachable code.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H
     14 #define LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H
     15 
     16 #include "clang/Basic/SourceLocation.h"
     17 
     18 //===----------------------------------------------------------------------===//
     19 // Forward declarations.
     20 //===----------------------------------------------------------------------===//
     21 
     22 namespace llvm {
     23   class BitVector;
     24 }
     25 
     26 namespace clang {
     27   class AnalysisDeclContext;
     28   class CFGBlock;
     29   class Preprocessor;
     30 }
     31 
     32 //===----------------------------------------------------------------------===//
     33 // API.
     34 //===----------------------------------------------------------------------===//
     35 
     36 namespace clang {
     37 namespace reachable_code {
     38 
     39 /// Classifications of unreachable code.
     40 enum UnreachableKind {
     41   UK_Return,
     42   UK_Break,
     43   UK_Loop_Increment,
     44   UK_Other
     45 };
     46 
     47 class Callback {
     48   virtual void anchor();
     49 public:
     50   virtual ~Callback() {}
     51   virtual void HandleUnreachable(UnreachableKind UK,
     52                                  SourceLocation L,
     53                                  SourceRange ConditionVal,
     54                                  SourceRange R1,
     55                                  SourceRange R2) = 0;
     56 };
     57 
     58 /// ScanReachableFromBlock - Mark all blocks reachable from Start.
     59 /// Returns the total number of blocks that were marked reachable.
     60 unsigned ScanReachableFromBlock(const CFGBlock *Start,
     61                                 llvm::BitVector &Reachable);
     62 
     63 void FindUnreachableCode(AnalysisDeclContext &AC, Preprocessor &PP,
     64                          Callback &CB);
     65 
     66 }} // end namespace clang::reachable_code
     67 
     68 #endif
     69