blob: 6be64fce2db3d47c0348fcbe334a768bd7615678 [file] [log] [blame]
Chris Lattner1b94c002002-04-28 05:43:27 +00001//===-- 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 are marked
5// as internal.
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/Transforms/IPO/Internalize.h"
10#include "llvm/Pass.h"
11#include "llvm/Module.h"
12#include "llvm/Function.h"
Chris Lattner0b18c1d2002-05-10 15:38:35 +000013#include "Support/StatisticReporter.h"
14
15static Statistic<> NumChanged("internalize\t- Number of functions internal'd");
Chris Lattner1b94c002002-04-28 05:43:27 +000016
Chris Lattnerb28b6802002-07-23 18:06:35 +000017namespace {
Chris Lattner1b94c002002-04-28 05:43:27 +000018class InternalizePass : public Pass {
Chris Lattner7076ff22002-06-25 16:13:21 +000019 virtual bool run(Module &M) {
Chris Lattner1b94c002002-04-28 05:43:27 +000020 bool FoundMain = false; // Look for a function named main...
Chris Lattner7076ff22002-06-25 16:13:21 +000021 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
22 if (I->getName() == "main" && !I->isExternal()) {
Chris Lattner1b94c002002-04-28 05:43:27 +000023 FoundMain = true;
24 break;
25 }
26
27 if (!FoundMain) return false; // No main found, must be a library...
28
29 bool Changed = false;
30
31 // Found a main function, mark all functions not named main as internal.
Chris Lattner7076ff22002-06-25 16:13:21 +000032 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
33 if (I->getName() != "main" && // Leave the main function external
34 !I->isExternal()) { // Function must be defined here
35 I->setInternalLinkage(true);
Chris Lattner0b18c1d2002-05-10 15:38:35 +000036 Changed = true;
37 ++NumChanged;
38 }
Chris Lattner1b94c002002-04-28 05:43:27 +000039
40 return Changed;
41 }
42};
43
Chris Lattnerb28b6802002-07-23 18:06:35 +000044RegisterPass<InternalizePass> X("internalize", "Internalize Functions");
45} // end anonymous namespace
46
Chris Lattner1b94c002002-04-28 05:43:27 +000047Pass *createInternalizePass() {
48 return new InternalizePass();
49}