blob: c84be9b93a295ef61a2d0b843cde37eace2bf1c6 [file] [log] [blame]
Chris Lattnerdbb17352002-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"
13
14class InternalizePass : public Pass {
Chris Lattner96c466b2002-04-29 14:57:45 +000015 const char *getPassName() const { return "Internalize Functions"; }
16
Chris Lattnerdbb17352002-04-28 05:43:27 +000017 virtual bool run(Module *M) {
18 bool FoundMain = false; // Look for a function named main...
19 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
Chris Lattner100d6da2002-04-28 05:48:34 +000020 if ((*I)->getName() == "main" && !(*I)->isExternal()) {
Chris Lattnerdbb17352002-04-28 05:43:27 +000021 FoundMain = true;
22 break;
23 }
24
25 if (!FoundMain) return false; // No main found, must be a library...
26
27 bool Changed = false;
28
29 // Found a main function, mark all functions not named main as internal.
30 for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
Chris Lattner100d6da2002-04-28 05:48:34 +000031 if ((*I)->getName() != "main" && // Leave the main function external
32 !(*I)->isExternal()) // Function must be defined here
Chris Lattnerdbb17352002-04-28 05:43:27 +000033 (*I)->setInternalLinkage(Changed = true);
34
35 return Changed;
36 }
37};
38
39Pass *createInternalizePass() {
40 return new InternalizePass();
41}