//==- GRBlockCounter.h - ADT for counting block visits -------------*- C++ -*-// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines GRBlockCounter, an abstract data type used to count // the number of times a given block has been visited along a path // analyzed by GRCoreEngine. // //===----------------------------------------------------------------------===// #include "clang/Analysis/PathSensitive/GRBlockCounter.h" #include "llvm/ADT/ImmutableMap.h" using namespace clang; typedef llvm::ImmutableMap CountMap; static inline CountMap GetMap(void* D) { return CountMap(static_cast(D)); } static inline CountMap::Factory& GetFactory(void* F) { return *static_cast(F); } unsigned GRBlockCounter::getNumVisited(unsigned BlockID) const { CountMap M = GetMap(Data); CountMap::data_type* T = M.lookup(BlockID); return T ? *T : 0; } GRBlockCounter::Factory::Factory(llvm::BumpPtrAllocator& Alloc) { F = new CountMap::Factory(Alloc); } GRBlockCounter::Factory::~Factory() { delete static_cast(F); } GRBlockCounter GRBlockCounter::Factory::IncrementCount(GRBlockCounter BC, unsigned BlockID) { return GRBlockCounter(GetFactory(F).Add(GetMap(BC.Data), BlockID, BC.getNumVisited(BlockID)+1).getRoot()); } GRBlockCounter GRBlockCounter::Factory::GetEmptyCounter() { return GRBlockCounter(GetFactory(F).GetEmptyMap().getRoot()); }