f0b0b1b0b7b5169f9afab181052773312f4bb657
[oota-llvm.git] / Internalize.cpp
1 //===-- Internalize.cpp - Mark functions internal -------------------------===//
2 //
3 // This pass loops over all of the functions in the input module, looking for a
4 // main function.  If a main function is found, all other functions and all
5 // global variables with initializers are marked as internal.
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/Transforms/IPO.h"
10 #include "llvm/Pass.h"
11 #include "llvm/Module.h"
12 #include "Support/StatisticReporter.h"
13
14 namespace {
15   Statistic<> NumFunctions("internalize\t- Number of functions internalized");
16   Statistic<> NumGlobals  ("internalize\t- Number of global vars internalized");
17
18
19   class InternalizePass : public Pass {
20     virtual bool run(Module &M) {
21       bool FoundMain = false;   // Look for a function named main...
22       for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
23         if (I->getName() == "main" && !I->isExternal() &&
24             I->hasExternalLinkage()) {
25           FoundMain = true;
26           break;
27         }
28       
29       if (!FoundMain) return false;  // No main found, must be a library...
30       
31       bool Changed = false;
32       
33       // Found a main function, mark all functions not named main as internal.
34       for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
35         if (I->getName() != "main" &&   // Leave the main function external
36             !I->isExternal() &&         // Function must be defined here
37             !I->hasInternalLinkage()) { // Can't already have internal linkage
38           I->setInternalLinkage(true);
39           Changed = true;
40           ++NumFunctions;
41           DEBUG(std::cerr << "Internalizing func " << I->getName() << "\n");
42         }
43
44       // Mark all global variables with initializers as internal as well...
45       for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
46         if (I->hasInitializer() && I->hasExternalLinkage()) {
47           I->setInternalLinkage(true);
48           Changed = true;
49           ++NumGlobals;
50           DEBUG(std::cerr << "Internalizing gvar " << I->getName() << "\n");
51         }
52       
53       return Changed;
54     }
55   };
56
57   RegisterOpt<InternalizePass> X("internalize", "Internalize Functions");
58 } // end anonymous namespace
59
60 Pass *createInternalizePass() {
61   return new InternalizePass();
62 }