Home | History | Annotate | Line # | Download | only in PathSensitive
      1 //==- BlockCounter.h - ADT for counting block visits ---------------*- 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 //  This file defines BlockCounter, an abstract data type used to count
     10 //  the number of times a given block has been visited along a path
     11 //  analyzed by CoreEngine.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_BLOCKCOUNTER_H
     16 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_BLOCKCOUNTER_H
     17 
     18 #include "llvm/Support/Allocator.h"
     19 
     20 namespace clang {
     21 
     22 class StackFrameContext;
     23 
     24 namespace ento {
     25 
     26 /// \class BlockCounter
     27 /// An abstract data type used to count the number of times a given
     28 /// block has been visited along a path analyzed by CoreEngine.
     29 class BlockCounter {
     30   void *Data;
     31 
     32   BlockCounter(void *D) : Data(D) {}
     33 
     34 public:
     35   BlockCounter() : Data(nullptr) {}
     36 
     37   unsigned getNumVisited(const StackFrameContext *CallSite,
     38                          unsigned BlockID) const;
     39 
     40   class Factory {
     41     void *F;
     42   public:
     43     Factory(llvm::BumpPtrAllocator& Alloc);
     44     ~Factory();
     45 
     46     BlockCounter GetEmptyCounter();
     47     BlockCounter IncrementCount(BlockCounter BC,
     48                                   const StackFrameContext *CallSite,
     49                                   unsigned BlockID);
     50   };
     51 
     52   friend class Factory;
     53 };
     54 
     55 } // end GR namespace
     56 
     57 } // end clang namespace
     58 
     59 #endif
     60