BlockCounter.h revision 5a4f98ff943e6a501b0fe47ade007c9bbf96cb88
18e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//==- GRBlockCounter.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//
108e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//  This file defines GRBlockCounter, an abstract data type used to count
118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//  the number of times a given block has been visited along a path
124d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek//  analyzed by GRCoreEngine.
138e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//
148e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek//===----------------------------------------------------------------------===//
158e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_GRBLOCKCOUNTER
175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_GRBLOCKCOUNTER
188e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
198e49dd6e7e73b275a74338a5127a524f0765303cTed Kremeneknamespace llvm {
208e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  class BumpPtrAllocator;
218e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek}
228e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
238e49dd6e7e73b275a74338a5127a524f0765303cTed Kremeneknamespace clang {
248e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
25d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xuclass StackFrameContext;
26d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu
275a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisnamespace GR {
285a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
298e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenekclass GRBlockCounter {
308e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  void* Data;
311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  GRBlockCounter(void* D) : Data(D) {}
338e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
348e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenekpublic:
358e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  GRBlockCounter() : Data(0) {}
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu  unsigned getNumVisited(const StackFrameContext *CallSite,
38d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                         unsigned BlockID) const;
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
408e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  class Factory {
418e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    void* F;
428e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  public:
438e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    Factory(llvm::BumpPtrAllocator& Alloc);
448e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    ~Factory();
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
468e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek    GRBlockCounter GetEmptyCounter();
47d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu    GRBlockCounter IncrementCount(GRBlockCounter BC,
48d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                                  const StackFrameContext *CallSite,
49d9e0c0fc47d5881a609ec34372d554e3652db66cZhongxing Xu                                  unsigned BlockID);
508e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  };
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
528e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek  friend class Factory;
538e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek};
548e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek
555a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
565a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
578e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek} // end clang namespace
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
598e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek#endif
60