[llvm-commits] CVS: llvm/lib/Transforms/IPO/Internalize.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu May 22 14:35:01 PDT 2003
Changes in directory llvm/lib/Transforms/IPO:
Internalize.cpp updated: 1.13 -> 1.14
---
Log message:
Add option to internalize to allow it to read a file to determine which symbols
should not be internalized
---
Diffs of the changes:
Index: llvm/lib/Transforms/IPO/Internalize.cpp
diff -u llvm/lib/Transforms/IPO/Internalize.cpp:1.13 llvm/lib/Transforms/IPO/Internalize.cpp:1.14
--- llvm/lib/Transforms/IPO/Internalize.cpp:1.13 Wed Apr 16 15:28:39 2003
+++ llvm/lib/Transforms/IPO/Internalize.cpp Thu May 22 14:34:49 2003
@@ -10,25 +10,55 @@
#include "llvm/Pass.h"
#include "llvm/Module.h"
#include "Support/Statistic.h"
+#include "Support/CommandLine.h"
+#include <fstream>
+#include <set>
namespace {
Statistic<> NumFunctions("internalize", "Number of functions internalized");
Statistic<> NumGlobals ("internalize", "Number of global vars internalized");
+ // APIFile - A file which contains a list of symbols that should not be marked
+ // external.
+ cl::opt<std::string>
+ APIFile("internalize-public-api-file", cl::value_desc("filename"),
+ cl::desc("A file containing list of globals to not internalize"));
+
class InternalizePass : public Pass {
- virtual bool run(Module &M) {
- Function *MainFunc = M.getMainFunction();
+ std::set<std::string> ExternalNames;
+ public:
+ InternalizePass() {
+ if (!APIFile.empty())
+ LoadFile(APIFile.c_str());
+ else
+ ExternalNames.insert("main");
+ }
- if (MainFunc == 0 || MainFunc->isExternal())
- return false; // No main found, must be a library...
-
+ void LoadFile(const char *Filename) {
+ // Load the APIFile...
+ std::ifstream In(Filename);
+ if (!In.good()) {
+ std::cerr << "WARNING: Internalize couldn't load file '" << Filename
+ << "'!: Not internalizing.\n";
+ return; // Do not internalize anything...
+ }
+ while (In) {
+ std::string Symbol;
+ In >> Symbol;
+ if (!Symbol.empty())
+ ExternalNames.insert(Symbol);
+ }
+ }
+
+ virtual bool run(Module &M) {
+ if (ExternalNames.empty()) return false; // Error loading file...
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 != MainFunc && // Leave the main function external
- !I->isExternal() && // Function must be defined here
- !I->hasInternalLinkage()) { // Can't already have internal linkage
+ if (!I->isExternal() && // Function must be defined here
+ !I->hasInternalLinkage() && // Can't already have internal linkage
+ !ExternalNames.count(I->getName())) {// Not marked to keep external?
I->setLinkage(GlobalValue::InternalLinkage);
Changed = true;
++NumFunctions;
@@ -37,7 +67,8 @@
// Mark all global variables with initializers as internal as well...
for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
- if (!I->isExternal() && I->hasExternalLinkage()) {
+ if (!I->isExternal() && !I->hasInternalLinkage() &&
+ !ExternalNames.count(I->getName())) {
I->setLinkage(GlobalValue::InternalLinkage);
Changed = true;
++NumGlobals;
@@ -48,7 +79,7 @@
}
};
- RegisterOpt<InternalizePass> X("internalize", "Internalize Functions");
+ RegisterOpt<InternalizePass> X("internalize", "Internalize Global Symbols");
} // end anonymous namespace
Pass *createInternalizePass() {
More information about the llvm-commits
mailing list