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