1d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis//==- BlockCounter.h - ADT for counting block visits ---------------*- C++ -*-//
21eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//
38e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//                     The LLVM Compiler Infrastructure
48e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//
58e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek// This file is distributed under the University of Illinois Open Source
68e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek// License. See LICENSE.TXT for details.
78e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//
88e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//===----------------------------------------------------------------------===//
98e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//
10d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis//  This file defines BlockCounter, an abstract data type used to count
118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//  the number of times a given block has been visited along a path
12d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis//  analyzed by CoreEngine.
138e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//
148e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//===----------------------------------------------------------------------===//
158e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
16d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_BLOCKCOUNTER
17d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis#define LLVM_CLANG_GR_BLOCKCOUNTER
188e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Allocator.h"
208e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
218e49dd6e7e73b275a74338a5127a524f0765303cTed Kremeneknamespace clang {
228e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
23d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xuclass StackFrameContext;
24d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu
259ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
265a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
275d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks/// \class BlockCounter
285d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks/// \brief An abstract data type used to count the number of times a given
295d0ea6d62e076c776ddad028c4eb615783be1323Anna Zaks/// block has been visited along a path analyzed by CoreEngine.
30d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidisclass BlockCounter {
319c378f705405d37f49795d5e915989de774fe11fTed Kremenek  void *Data;
321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339c378f705405d37f49795d5e915989de774fe11fTed Kremenek  BlockCounter(void *D) : Data(D) {}
348e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
358e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenekpublic:
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  BlockCounter() : Data(nullptr) {}
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu  unsigned getNumVisited(const StackFrameContext *CallSite,
39d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                         unsigned BlockID) const;
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
418e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  class Factory {
429c378f705405d37f49795d5e915989de774fe11fTed Kremenek    void *F;
438e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  public:
448e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    Factory(llvm::BumpPtrAllocator& Alloc);
458e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    ~Factory();
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    BlockCounter GetEmptyCounter();
48d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    BlockCounter IncrementCount(BlockCounter BC,
49d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                                  const StackFrameContext *CallSite,
50d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                                  unsigned BlockID);
518e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  };
521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
538e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  friend class Factory;
548e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek};
558e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
565a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
575a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
588e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek} // end clang namespace
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
608e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek#endif
61