aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/IPO/Internalize.cpp
blob: b6a48b4e22d6a819587b4b3a515034174db3745a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//===-- Internalize.cpp - Mark functions internal -------------------------===//
//
// This pass loops over all of the functions in the input module, looking for a
// main function.  If a main function is found, all other functions are marked
// as internal.
//
//===----------------------------------------------------------------------===//

#include "llvm/Transforms/IPO.h"
#include "llvm/Pass.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "Support/StatisticReporter.h"

static Statistic<> NumChanged("internalize\t- Number of functions internal'd");

namespace {
class InternalizePass : public Pass {
  virtual bool run(Module &M) {
    bool FoundMain = false;   // Look for a function named main...
    for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
      if (I->getName() == "main" && !I->isExternal()) {
        FoundMain = true;
        break;
      }
    
    if (!FoundMain) return false;  // No main found, must be a library...

    bool Changed = false;

    // Found a main function, mark all functions not named main as internal.
    for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
      if (I->getName() != "main" &&   // Leave the main function external
          !I->isExternal()) {         // Function must be defined here
        I->setInternalLinkage(true);
        Changed = true;
        ++NumChanged;
      }

    return Changed;
  }
};

RegisterPass<InternalizePass> X("internalize", "Internalize Functions");
} // end anonymous namespace

Pass *createInternalizePass() {
  return new InternalizePass();
}