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