Internalize.cpp revision dbb1735673ed177a85f04698b9cd89f2dc1b4e91
1dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//===-- Internalize.cpp - Mark functions internal -------------------------===//
2dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//
3dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner// This pass loops over all of the functions in the input module, looking for a
4dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner// main function.  If a main function is found, all other functions are marked
5dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner// as internal.
6dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//
7dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner//===----------------------------------------------------------------------===//
8dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
9dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner#include "llvm/Transforms/IPO/Internalize.h"
10dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner#include "llvm/Pass.h"
11dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner#include "llvm/Module.h"
12dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner#include "llvm/Function.h"
13dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
14dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattnerclass InternalizePass : public Pass {
15dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner  virtual bool run(Module *M) {
16dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    bool FoundMain = false;   // Look for a function named main...
17dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
18dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner      if ((*I)->getName() == "main") {
19dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner        FoundMain = true;
20dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner        break;
21dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner      }
22dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
23dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    if (!FoundMain) return false;  // No main found, must be a library...
24dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
25dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    bool Changed = false;
26dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
27dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    // Found a main function, mark all functions not named main as internal.
28dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
29dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner      if ((*I)->getName() != "main")  // Leave the main function external
30dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner        (*I)->setInternalLinkage(Changed = true);
31dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
32dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner    return Changed;
33dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner  }
34dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner};
35dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner
36dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris LattnerPass *createInternalizePass() {
37dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner  return new InternalizePass();
38dbb1735673ed177a85f04698b9cd89f2dc1b4e91Chris Lattner}
39