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

Reid Spencer reid at x10sys.com
Tue Dec 20 21:03:34 PST 2005



Changes in directory llvm/tools/llvm-ld:

llvm-ld.cpp updated: 1.27 -> 1.28
---
Log message:

Implement PR512: http://llvm.cs.uiuc.edu/PR512 :
This patch adds a -post-link-opts option to llvm-ld which allows an arbitrary
program to optimize bytecode after linking. The program is passed two file
names. The first is the input (linked bytecode) the second is where it must
place its output (presumably after optimizing). If the output file is bytecode,
it is used as a substitute for the input. This will allow things like poolalloc
to be written as a separate program instead of a loadable module or built into
LLVM.


---
Diffs of the changes:  (+39 -0)

 llvm-ld.cpp |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+)


Index: llvm/tools/llvm-ld/llvm-ld.cpp
diff -u llvm/tools/llvm-ld/llvm-ld.cpp:1.27 llvm/tools/llvm-ld/llvm-ld.cpp:1.28
--- llvm/tools/llvm-ld/llvm-ld.cpp:1.27	Tue Dec 13 14:00:37 2005
+++ llvm/tools/llvm-ld/llvm-ld.cpp	Tue Dec 20 23:03:23 2005
@@ -76,6 +76,10 @@
 static cl::opt<bool>DisableCompression("disable-compression",cl::init(false),
   cl::desc("Disable writing of compressed bytecode files"));
 
+static cl::list<std::string> PostLinkOpts("post-link-opts",
+  cl::value_desc("path to post-link optimization programs"),
+  cl::desc("Run one or more optimization programs after linking"));
+
 // Compatibility options that are ignored but supported by LD
 static cl::opt<std::string> CO3("soname", cl::Hidden,
   cl::desc("Compatibility option: ignored"));
@@ -450,6 +454,41 @@
     // If we are not linking a library, generate either a native executable
     // or a JIT shell script, depending upon what the user wants.
     if (!LinkAsLibrary) {
+      // If the user wants to run a post-link optimization, run it now.
+      if (!PostLinkOpts.empty()) {
+        std::vector<std::string> opts = PostLinkOpts;
+        for (std::vector<std::string>::iterator I = opts.begin(),
+             E = opts.end(); I != E; ++I) {
+          sys::Path prog(*I);
+          if (!prog.canExecute()) {
+            prog = sys::Program::FindProgramByName(*I);
+            if (prog.isEmpty())
+              return PrintAndReturn(std::string("Optimization program '") + *I +
+                "' is not found or not executable.");
+          }
+          // Get the program arguments
+          sys::Path tmp_output("opt_result");
+          if (!tmp_output.createTemporaryFileOnDisk()) {
+            return PrintAndReturn(
+              "Can't create temporary file for post-link optimization");
+          }
+          const char* args[4];
+          args[0] = I->c_str();
+          args[1] = RealBytecodeOutput.c_str();
+          args[2] = tmp_output.c_str();
+          args[3] = 0;
+          if (0 == sys::Program::ExecuteAndWait(prog, args)) {
+            if (tmp_output.isBytecodeFile()) {
+              sys::Path target(RealBytecodeOutput);
+              target.eraseFromDisk();
+              tmp_output.renamePathOnDisk(target);
+            } else
+              return PrintAndReturn(
+                "Post-link optimization output is not bytecode");
+          }
+        }
+      }
+
       // If the user wants to generate a native executable, compile it from the
       // bytecode file.
       //






More information about the llvm-commits mailing list