[llvm-commits] CVS: llvm/tools/llvm-ld/Optimize.cpp

Reid Spencer reid at x10sys.com
Sun Aug 20 12:18:50 PDT 2006



Changes in directory llvm/tools/llvm-ld:

Optimize.cpp updated: 1.9 -> 1.10
---
Log message:

Convert llvm-ld to use the PluginLoader like opt instead of having its
one-off (and broken) RunOptimizations function. Also, run some cleanup
passes after the user's loaded passes run. This make sure to clean up
any cruft left around by thos passes.

This patch was inspired by a patch submitted by Bram Adams. 


---
Diffs of the changes:  (+31 -19)

 Optimize.cpp |   50 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 31 insertions(+), 19 deletions(-)


Index: llvm/tools/llvm-ld/Optimize.cpp
diff -u llvm/tools/llvm-ld/Optimize.cpp:1.9 llvm/tools/llvm-ld/Optimize.cpp:1.10
--- llvm/tools/llvm-ld/Optimize.cpp:1.9	Fri Jun 16 13:23:48 2006
+++ llvm/tools/llvm-ld/Optimize.cpp	Sun Aug 20 14:18:36 2006
@@ -19,12 +19,19 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/System/DynamicLibrary.h"
 #include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetMachine.h"
 #include "llvm/Transforms/IPO.h"
 #include "llvm/Transforms/Scalar.h"
+#include "llvm/Support/PassNameParser.h"
+#include "llvm/Support/PluginLoader.h"
 using namespace llvm;
 
-// Optimization Options
+// Pass Name Options as generated by the PassNameParser
+static cl::list<const PassInfo*, bool, 
+  FilteredPassNameParser<PassInfo::Optimization> >
+  OptimizationList(cl::desc("Optimizations available:"));
 
+// Optimization Enumeration
 enum OptimizationLevels {
   OPT_FAST_COMPILE         = 1,
   OPT_SIMPLE               = 2,
@@ -33,6 +40,7 @@
   OPT_AGGRESSIVE_LINK_TIME = 5
 };
 
+// Optimization Options
 static cl::opt<OptimizationLevels> OptLevel(
   cl::desc("Choose level of optimization to apply:"),
   cl::init(OPT_FAST_COMPILE), cl::values(
@@ -72,10 +80,6 @@
   cl::aliasopt(DisableInternalize),
   cl::desc("Alias for -disable-internalize"));
 
-static cl::list<std::string> LoadableModules("load",
-  cl::value_desc("path"),
-  cl::desc("Load an optimization module and run it"));
-
 // A utility function that adds a pass to the pass manager but will also add
 // a verifier pass after if we're supposed to verify.
 static inline void addPass(PassManager &PM, Pass *P) {
@@ -150,9 +154,8 @@
 
     addPass(Passes, createScalarReplAggregatesPass()); // Break up allocas
 
-    // Run a few AA driven optimizations here and now, to cleanup the code.
+    // Run a few AA driven optimizations, to cleanup the code.
     addPass(Passes, createGlobalsModRefPass());      // IP alias analysis
-
     addPass(Passes, createLICMPass());               // Hoist loop invariants
     addPass(Passes, createLoadValueNumberingPass()); // GVN for load instrs
     addPass(Passes, createGCSEPass());               // Remove common subexprs
@@ -168,18 +171,27 @@
     addPass(Passes, createGlobalDCEPass());
   }
 
-  std::vector<std::string> plugins = LoadableModules;
-  for (std::vector<std::string>::iterator I = plugins.begin(),
-      E = plugins.end(); I != E; ++I) {
-    sys::DynamicLibrary dll(I->c_str());
-    typedef void (*OptimizeFunc)(PassManager&,int);
-    OptimizeFunc OF = OptimizeFunc(
-        (intptr_t)dll.GetAddressOfSymbol("RunOptimizations"));
-    if (OF == 0) {
-      throw std::string("Optimization Module '") + *I +
-        "' is missing the RunOptimizations symbol";
-    }
-    (*OF)(Passes,OptLevel);
+  // Create a new optimization pass for each one specified on the command line
+  std::auto_ptr<TargetMachine> target;
+  for (unsigned i = 0; i < OptimizationList.size(); ++i) {
+    const PassInfo *Opt = OptimizationList[i];
+    
+    if (Opt->getNormalCtor())
+      Passes.add(Opt->getNormalCtor()());
+    else if (Opt->getTargetCtor()) {
+      assert(target.get() && "Could not allocate target machine!");
+      Passes.add(Opt->getTargetCtor()(*target.get()));
+    } else
+      std::cerr << "llvm-ld: cannot create pass: " << Opt->getPassName() 
+                << "\n";
+  }
+
+  // The user's passes may leave cruft around. Clean up after them them but
+  // only if we haven't got DisableOptimizations set
+  if (!DisableOptimizations) {
+    addPass(Passes, createInstructionCombiningPass());
+    addPass(Passes, createCFGSimplificationPass());
+    addPass(Passes, createGlobalDCEPass());
   }
 
   // Make sure everything is still good.






More information about the llvm-commits mailing list