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 "clang/AST/Decl.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/SmallPtrSet.h" 20 #include "llvm/ADT/BitVector.h" 21 22 namespace clang { 23 namespace ento { 24 typedef llvm::SmallPtrSet<Decl*, 24> SetOfDecls; 25 typedef llvm::SmallPtrSet<const Decl*, 24> SetOfConstDecls; 26 27 class FunctionSummariesTy { 28 struct FunctionSummary { 29 /// True if this function has reached a max block count while inlined from 30 /// at least one call site. 31 bool MayReachMaxBlockCount; 32 33 /// Total number of blocks in the function. 34 unsigned TotalBasicBlocks; 35 36 /// Marks the IDs of the basic blocks visited during the analyzes. 37 llvm::BitVector VisitedBasicBlocks; 38 39 FunctionSummary() : 40 MayReachMaxBlockCount(false), 41 TotalBasicBlocks(0), 42 VisitedBasicBlocks(0) {} 43 }; 44 45 typedef llvm::DenseMap<const Decl*, FunctionSummary*> MapTy; 46 MapTy Map; 47 48 public: 49 ~FunctionSummariesTy(); 50 51 MapTy::iterator findOrInsertSummary(const Decl *D) { 52 MapTy::iterator I = Map.find(D); 53 if (I != Map.end()) 54 return I; 55 FunctionSummary *DS = new FunctionSummary(); 56 I = Map.insert(std::pair<const Decl*, FunctionSummary*>(D, DS)).first; 57 assert(I != Map.end()); 58 return I; 59 } 60 61 void markReachedMaxBlockCount(const Decl* D) { 62 MapTy::iterator I = findOrInsertSummary(D); 63 I->second->MayReachMaxBlockCount = true; 64 } 65 66 bool hasReachedMaxBlockCount(const Decl* D) { 67 MapTy::const_iterator I = Map.find(D); 68 if (I != Map.end()) 69 return I->second->MayReachMaxBlockCount; 70 return false; 71 } 72 73 void markVisitedBasicBlock(unsigned ID, const Decl* D, unsigned TotalIDs) { 74 MapTy::iterator I = findOrInsertSummary(D); 75 llvm::BitVector &Blocks = I->second->VisitedBasicBlocks; 76 assert(ID < TotalIDs); 77 if (TotalIDs > Blocks.size()) { 78 Blocks.resize(TotalIDs); 79 I->second->TotalBasicBlocks = TotalIDs; 80 } 81 Blocks[ID] = true; 82 } 83 84 unsigned getNumVisitedBasicBlocks(const Decl* D) { 85 MapTy::const_iterator I = Map.find(D); 86 if (I != Map.end()) 87 return I->second->VisitedBasicBlocks.count(); 88 return 0; 89 } 90 91 /// Get the percentage of the reachable blocks. 92 unsigned getPercentBlocksReachable(const Decl *D) { 93 MapTy::const_iterator I = Map.find(D); 94 if (I != Map.end()) 95 return ((I->second->VisitedBasicBlocks.count() * 100) / 96 I->second->TotalBasicBlocks); 97 return 0; 98 } 99 100 unsigned getTotalNumBasicBlocks(); 101 unsigned getTotalNumVisitedBasicBlocks(); 102 103 }; 104 105 }} // end clang ento namespaces 106 107 #endif 108