~louis/ubuntu/trusty/clamav/lp799623_fix_logrotate

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/Transforms/Utils/BasicInliner.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2010-03-12 11:30:04 UTC
  • mfrom: (0.41.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100312113004-b0fop4bkycszdd0z
Tags: 0.96~rc1+dfsg-0ubuntu1
* New upstream RC - FFE (LP: #537636):
  - Add OfficialDatabaseOnly option to clamav-base.postinst.in
  - Add LocalSocketGroup option to clamav-base.postinst.in
  - Add LocalSocketMode option to clamav-base.postinst.in
  - Add CrossFilesystems option to clamav-base.postinst.in
  - Add ClamukoScannerCount option to clamav-base.postinst.in
  - Add BytecodeSecurity opiton to clamav-base.postinst.in
  - Add DetectionStatsHostID option to clamav-freshclam.postinst.in
  - Add Bytecode option to clamav-freshclam.postinst.in
  - Add MilterSocketGroup option to clamav-milter.postinst.in
  - Add MilterSocketMode option to clamav-milter.postinst.in
  - Add ReportHostname option to clamav-milter.postinst.in
  - Bump libclamav SO version to 6.1.0 in libclamav6.install
  - Drop clamdmon from clamav.examples (no longer shipped by upstream)
  - Drop libclamav.a from libclamav-dev.install (not built by upstream)
  - Update SO version for lintian override for libclamav6
  - Add new Bytecode Testing Tool, usr/bin/clambc, to clamav.install
  - Add build-depends on python and python-setuptools for new test suite
  - Update debian/copyright for the embedded copy of llvm (using the system
    llvm is not currently feasible)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===- BasicInliner.cpp - Basic function level inliner --------------------===//
 
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 simple function based inliner that does not use
 
11
// call graph information. 
 
12
//
 
13
//===----------------------------------------------------------------------===//
 
14
 
 
15
#define DEBUG_TYPE "basicinliner"
 
16
#include "llvm/Module.h"
 
17
#include "llvm/Function.h"
 
18
#include "llvm/Transforms/Utils/BasicInliner.h"
 
19
#include "llvm/Transforms/Utils/Cloning.h"
 
20
#include "llvm/Support/CallSite.h"
 
21
#include "llvm/Support/CommandLine.h"
 
22
#include "llvm/Support/Debug.h"
 
23
#include "llvm/Support/raw_ostream.h"
 
24
#include "llvm/ADT/SmallPtrSet.h"
 
25
#include <vector>
 
26
 
 
27
using namespace llvm;
 
28
 
 
29
static cl::opt<unsigned>     
 
30
BasicInlineThreshold("basic-inline-threshold", cl::Hidden, cl::init(200),
 
31
   cl::desc("Control the amount of basic inlining to perform (default = 200)"));
 
32
 
 
33
namespace llvm {
 
34
 
 
35
  /// BasicInlinerImpl - BasicInliner implemantation class. This hides
 
36
  /// container info, used by basic inliner, from public interface.
 
37
  struct BasicInlinerImpl {
 
38
    
 
39
    BasicInlinerImpl(const BasicInlinerImpl&); // DO NOT IMPLEMENT
 
40
    void operator=(const BasicInlinerImpl&); // DO NO IMPLEMENT
 
41
  public:
 
42
    BasicInlinerImpl(TargetData *T) : TD(T) {}
 
43
 
 
44
    /// addFunction - Add function into the list of functions to process.
 
45
    /// All functions must be inserted using this interface before invoking
 
46
    /// inlineFunctions().
 
47
    void addFunction(Function *F) {
 
48
      Functions.push_back(F);
 
49
    }
 
50
 
 
51
    /// neverInlineFunction - Sometimes a function is never to be inlined 
 
52
    /// because of one or other reason. 
 
53
    void neverInlineFunction(Function *F) {
 
54
      NeverInline.insert(F);
 
55
    }
 
56
 
 
57
    /// inlineFuctions - Walk all call sites in all functions supplied by
 
58
    /// client. Inline as many call sites as possible. Delete completely
 
59
    /// inlined functions.
 
60
    void inlineFunctions();
 
61
    
 
62
  private:
 
63
    TargetData *TD;
 
64
    std::vector<Function *> Functions;
 
65
    SmallPtrSet<const Function *, 16> NeverInline;
 
66
    SmallPtrSet<Function *, 8> DeadFunctions;
 
67
    InlineCostAnalyzer CA;
 
68
  };
 
69
 
 
70
/// inlineFuctions - Walk all call sites in all functions supplied by
 
71
/// client. Inline as many call sites as possible. Delete completely
 
72
/// inlined functions.
 
73
void BasicInlinerImpl::inlineFunctions() {
 
74
      
 
75
  // Scan through and identify all call sites ahead of time so that we only
 
76
  // inline call sites in the original functions, not call sites that result
 
77
  // from inlining other functions.
 
78
  std::vector<CallSite> CallSites;
 
79
  
 
80
  for (std::vector<Function *>::iterator FI = Functions.begin(),
 
81
         FE = Functions.end(); FI != FE; ++FI) {
 
82
    Function *F = *FI;
 
83
    for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
 
84
      for (BasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
 
85
        CallSite CS = CallSite::get(I);
 
86
        if (CS.getInstruction() && CS.getCalledFunction()
 
87
            && !CS.getCalledFunction()->isDeclaration())
 
88
          CallSites.push_back(CS);
 
89
      }
 
90
  }
 
91
  
 
92
  DEBUG(dbgs() << ": " << CallSites.size() << " call sites.\n");
 
93
  
 
94
  // Inline call sites.
 
95
  bool Changed = false;
 
96
  do {
 
97
    Changed = false;
 
98
    for (unsigned index = 0; index != CallSites.size() && !CallSites.empty(); 
 
99
         ++index) {
 
100
      CallSite CS = CallSites[index];
 
101
      if (Function *Callee = CS.getCalledFunction()) {
 
102
        
 
103
        // Eliminate calls that are never inlinable.
 
104
        if (Callee->isDeclaration() ||
 
105
            CS.getInstruction()->getParent()->getParent() == Callee) {
 
106
          CallSites.erase(CallSites.begin() + index);
 
107
          --index;
 
108
          continue;
 
109
        }
 
110
        InlineCost IC = CA.getInlineCost(CS, NeverInline);
 
111
        if (IC.isAlways()) {        
 
112
          DEBUG(dbgs() << "  Inlining: cost=always"
 
113
                       <<", call: " << *CS.getInstruction());
 
114
        } else if (IC.isNever()) {
 
115
          DEBUG(dbgs() << "  NOT Inlining: cost=never"
 
116
                       <<", call: " << *CS.getInstruction());
 
117
          continue;
 
118
        } else {
 
119
          int Cost = IC.getValue();
 
120
          
 
121
          if (Cost >= (int) BasicInlineThreshold) {
 
122
            DEBUG(dbgs() << "  NOT Inlining: cost = " << Cost
 
123
                         << ", call: " <<  *CS.getInstruction());
 
124
            continue;
 
125
          } else {
 
126
            DEBUG(dbgs() << "  Inlining: cost = " << Cost
 
127
                         << ", call: " <<  *CS.getInstruction());
 
128
          }
 
129
        }
 
130
        
 
131
        // Inline
 
132
        if (InlineFunction(CS, NULL, TD)) {
 
133
          if (Callee->use_empty() && (Callee->hasLocalLinkage() ||
 
134
                                      Callee->hasAvailableExternallyLinkage()))
 
135
            DeadFunctions.insert(Callee);
 
136
          Changed = true;
 
137
          CallSites.erase(CallSites.begin() + index);
 
138
          --index;
 
139
        }
 
140
      }
 
141
    }
 
142
  } while (Changed);
 
143
  
 
144
  // Remove completely inlined functions from module.
 
145
  for(SmallPtrSet<Function *, 8>::iterator I = DeadFunctions.begin(),
 
146
        E = DeadFunctions.end(); I != E; ++I) {
 
147
    Function *D = *I;
 
148
    Module *M = D->getParent();
 
149
    M->getFunctionList().remove(D);
 
150
  }
 
151
}
 
152
 
 
153
BasicInliner::BasicInliner(TargetData *TD) {
 
154
  Impl = new BasicInlinerImpl(TD);
 
155
}
 
156
 
 
157
BasicInliner::~BasicInliner() {
 
158
  delete Impl;
 
159
}
 
160
 
 
161
/// addFunction - Add function into the list of functions to process.
 
162
/// All functions must be inserted using this interface before invoking
 
163
/// inlineFunctions().
 
164
void BasicInliner::addFunction(Function *F) {
 
165
  Impl->addFunction(F);
 
166
}
 
167
 
 
168
/// neverInlineFunction - Sometimes a function is never to be inlined because
 
169
/// of one or other reason. 
 
170
void BasicInliner::neverInlineFunction(Function *F) {
 
171
  Impl->neverInlineFunction(F);
 
172
}
 
173
 
 
174
/// inlineFuctions - Walk all call sites in all functions supplied by
 
175
/// client. Inline as many call sites as possible. Delete completely
 
176
/// inlined functions.
 
177
void BasicInliner::inlineFunctions() {
 
178
  Impl->inlineFunctions();
 
179
}
 
180
 
 
181
}