FunctionSummary.h revision e62f048960645b79363408fdead53fec2a063c52
1e62f048960645b79363408fdead53fec2a063c52Anna Zaks//== FunctionSummary.h - Stores summaries of functions. ------------*- C++ -*-// 2e62f048960645b79363408fdead53fec2a063c52Anna Zaks// 3e62f048960645b79363408fdead53fec2a063c52Anna Zaks// The LLVM Compiler Infrastructure 4e62f048960645b79363408fdead53fec2a063c52Anna Zaks// 5e62f048960645b79363408fdead53fec2a063c52Anna Zaks// This file is distributed under the University of Illinois Open Source 6e62f048960645b79363408fdead53fec2a063c52Anna Zaks// License. See LICENSE.TXT for details. 7e62f048960645b79363408fdead53fec2a063c52Anna Zaks// 8e62f048960645b79363408fdead53fec2a063c52Anna Zaks//===----------------------------------------------------------------------===// 9e62f048960645b79363408fdead53fec2a063c52Anna Zaks// 10e62f048960645b79363408fdead53fec2a063c52Anna Zaks// This file defines a summary of a function gathered/used by static analyzes. 11e62f048960645b79363408fdead53fec2a063c52Anna Zaks// 12e62f048960645b79363408fdead53fec2a063c52Anna Zaks//===----------------------------------------------------------------------===// 13e62f048960645b79363408fdead53fec2a063c52Anna Zaks 14e62f048960645b79363408fdead53fec2a063c52Anna Zaks#ifndef LLVM_CLANG_GR_FUNCTIONSUMMARY_H 15e62f048960645b79363408fdead53fec2a063c52Anna Zaks#define LLVM_CLANG_GR_FUNCTIONSUMMARY_H 16e62f048960645b79363408fdead53fec2a063c52Anna Zaks 17e62f048960645b79363408fdead53fec2a063c52Anna Zaks#include "clang/AST/Decl.h" 18e62f048960645b79363408fdead53fec2a063c52Anna Zaks#include "llvm/ADT/DenseMap.h" 19e62f048960645b79363408fdead53fec2a063c52Anna Zaks#include "llvm/ADT/SmallPtrSet.h" 20e62f048960645b79363408fdead53fec2a063c52Anna Zaks#include "llvm/ADT/BitVector.h" 21e62f048960645b79363408fdead53fec2a063c52Anna Zaks 22e62f048960645b79363408fdead53fec2a063c52Anna Zaksnamespace clang { 23e62f048960645b79363408fdead53fec2a063c52Anna Zaksnamespace ento { 24e62f048960645b79363408fdead53fec2a063c52Anna Zakstypedef llvm::SmallPtrSet<const Decl*,24> SetOfDecls; 25e62f048960645b79363408fdead53fec2a063c52Anna Zaks 26e62f048960645b79363408fdead53fec2a063c52Anna Zaksclass FunctionSummariesTy { 27e62f048960645b79363408fdead53fec2a063c52Anna Zaks struct FunctionSummary { 28e62f048960645b79363408fdead53fec2a063c52Anna Zaks /// True if this function has reached a max block count while inlined from 29e62f048960645b79363408fdead53fec2a063c52Anna Zaks /// at least one call site. 30e62f048960645b79363408fdead53fec2a063c52Anna Zaks bool MayReachMaxBlockCount; 31e62f048960645b79363408fdead53fec2a063c52Anna Zaks 32e62f048960645b79363408fdead53fec2a063c52Anna Zaks /// Total number of blocks in the function. 33e62f048960645b79363408fdead53fec2a063c52Anna Zaks unsigned TotalBasicBlocks; 34e62f048960645b79363408fdead53fec2a063c52Anna Zaks 35e62f048960645b79363408fdead53fec2a063c52Anna Zaks /// Marks the IDs of the basic blocks visited during the analyzes. 36e62f048960645b79363408fdead53fec2a063c52Anna Zaks llvm::BitVector VisitedBasicBlocks; 37e62f048960645b79363408fdead53fec2a063c52Anna Zaks 38e62f048960645b79363408fdead53fec2a063c52Anna Zaks FunctionSummary() : 39e62f048960645b79363408fdead53fec2a063c52Anna Zaks MayReachMaxBlockCount(false), 40e62f048960645b79363408fdead53fec2a063c52Anna Zaks TotalBasicBlocks(0), 41e62f048960645b79363408fdead53fec2a063c52Anna Zaks VisitedBasicBlocks(0) {} 42e62f048960645b79363408fdead53fec2a063c52Anna Zaks }; 43e62f048960645b79363408fdead53fec2a063c52Anna Zaks 44e62f048960645b79363408fdead53fec2a063c52Anna Zaks typedef llvm::DenseMap<const Decl*, FunctionSummary*> MapTy; 45e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy Map; 46e62f048960645b79363408fdead53fec2a063c52Anna Zaks 47e62f048960645b79363408fdead53fec2a063c52Anna Zakspublic: 48e62f048960645b79363408fdead53fec2a063c52Anna Zaks ~FunctionSummariesTy(); 49e62f048960645b79363408fdead53fec2a063c52Anna Zaks 50e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::iterator findOrInsertSummary(const Decl *D) { 51e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::iterator I = Map.find(D); 52e62f048960645b79363408fdead53fec2a063c52Anna Zaks if (I != Map.end()) 53e62f048960645b79363408fdead53fec2a063c52Anna Zaks return I; 54e62f048960645b79363408fdead53fec2a063c52Anna Zaks FunctionSummary *DS = new FunctionSummary(); 55e62f048960645b79363408fdead53fec2a063c52Anna Zaks I = Map.insert(std::pair<const Decl*, FunctionSummary*>(D, DS)).first; 56e62f048960645b79363408fdead53fec2a063c52Anna Zaks assert(I != Map.end()); 57e62f048960645b79363408fdead53fec2a063c52Anna Zaks return I; 58e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 59e62f048960645b79363408fdead53fec2a063c52Anna Zaks 60e62f048960645b79363408fdead53fec2a063c52Anna Zaks void markReachedMaxBlockCount(const Decl* D) { 61e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::iterator I = findOrInsertSummary(D); 62e62f048960645b79363408fdead53fec2a063c52Anna Zaks I->second->MayReachMaxBlockCount = true; 63e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 64e62f048960645b79363408fdead53fec2a063c52Anna Zaks 65e62f048960645b79363408fdead53fec2a063c52Anna Zaks bool hasReachedMaxBlockCount(const Decl* D) { 66e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::const_iterator I = Map.find(D); 67e62f048960645b79363408fdead53fec2a063c52Anna Zaks if (I != Map.end()) 68e62f048960645b79363408fdead53fec2a063c52Anna Zaks return I->second->MayReachMaxBlockCount; 69e62f048960645b79363408fdead53fec2a063c52Anna Zaks return false; 70e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 71e62f048960645b79363408fdead53fec2a063c52Anna Zaks 72e62f048960645b79363408fdead53fec2a063c52Anna Zaks void markVisitedBasicBlock(unsigned ID, const Decl* D, unsigned TotalIDs) { 73e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::iterator I = findOrInsertSummary(D); 74e62f048960645b79363408fdead53fec2a063c52Anna Zaks llvm::BitVector &Blocks = I->second->VisitedBasicBlocks; 75e62f048960645b79363408fdead53fec2a063c52Anna Zaks assert(ID < TotalIDs); 76e62f048960645b79363408fdead53fec2a063c52Anna Zaks if (TotalIDs > Blocks.size()) { 77e62f048960645b79363408fdead53fec2a063c52Anna Zaks Blocks.resize(TotalIDs); 78e62f048960645b79363408fdead53fec2a063c52Anna Zaks I->second->TotalBasicBlocks = TotalIDs; 79e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 80e62f048960645b79363408fdead53fec2a063c52Anna Zaks Blocks[ID] = true; 81e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 82e62f048960645b79363408fdead53fec2a063c52Anna Zaks 83e62f048960645b79363408fdead53fec2a063c52Anna Zaks unsigned getNumVisitedBasicBlocks(const Decl* D) { 84e62f048960645b79363408fdead53fec2a063c52Anna Zaks MapTy::const_iterator I = Map.find(D); 85e62f048960645b79363408fdead53fec2a063c52Anna Zaks if (I != Map.end()) 86e62f048960645b79363408fdead53fec2a063c52Anna Zaks return I->second->VisitedBasicBlocks.count(); 87e62f048960645b79363408fdead53fec2a063c52Anna Zaks return 0; 88e62f048960645b79363408fdead53fec2a063c52Anna Zaks } 89e62f048960645b79363408fdead53fec2a063c52Anna Zaks 90e62f048960645b79363408fdead53fec2a063c52Anna Zaks unsigned getTotalNumBasicBlocks(); 91e62f048960645b79363408fdead53fec2a063c52Anna Zaks unsigned getTotalNumVisitedBasicBlocks(); 92e62f048960645b79363408fdead53fec2a063c52Anna Zaks}; 93e62f048960645b79363408fdead53fec2a063c52Anna Zaks 94e62f048960645b79363408fdead53fec2a063c52Anna Zaks}} // end clang ento namespaces 95e62f048960645b79363408fdead53fec2a063c52Anna Zaks 96e62f048960645b79363408fdead53fec2a063c52Anna Zaks#endif 97