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