aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/IPO/Internalize.cpp
blob: 8bb1a9c111c59186269fe7de7a54d8f3cde913ad (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
//===-- 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/Internalize.h"
#include "llvm/Pass.h"
#include "llvm/Module.h"
#include "llvm/Function.h"

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(Changed = true);

    return Changed;
  }
};

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