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