[vmkit-commits] [vmkit] r68305 - in /vmkit/trunk/tools/llcj: ./ LinkPaths.h.in Makefile libjnjvm/ libjnjvm/Makefile llcj.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Apr 2 07:10:14 PDT 2009


Author: geoffray
Date: Thu Apr  2 09:10:13 2009
New Revision: 68305

URL: http://llvm.org/viewvc/llvm-project?rev=68305&view=rev
Log:
Add a driver for generating executable files out of Java files.


Added:
    vmkit/trunk/tools/llcj/
    vmkit/trunk/tools/llcj/LinkPaths.h.in
    vmkit/trunk/tools/llcj/Makefile   (with props)
    vmkit/trunk/tools/llcj/libjnjvm/
    vmkit/trunk/tools/llcj/libjnjvm/Makefile   (with props)
    vmkit/trunk/tools/llcj/llcj.cpp

Added: vmkit/trunk/tools/llcj/LinkPaths.h.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/llcj/LinkPaths.h.in?rev=68305&view=auto

==============================================================================
--- vmkit/trunk/tools/llcj/LinkPaths.h.in (added)
+++ vmkit/trunk/tools/llcj/LinkPaths.h.in Thu Apr  2 09:10:13 2009
@@ -0,0 +1,14 @@
+//===---- LinkPaths.h - Library paths for generating executables ----------===//
+//
+//                              VMKit
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#define LLVMLibs "-L at LLVM_OBJ@/Release/lib";
+#define VMKITLibs1 "-L at abs_top_objdir@/Release/lib";
+#define VMKITLibs2 "-L at abs_top_srcdir@/Release/lib";
+#define VMKITLibs3 "-L at PROJ_INSTALL_ROOT@/lib";

Added: vmkit/trunk/tools/llcj/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/llcj/Makefile?rev=68305&view=auto

==============================================================================
--- vmkit/trunk/tools/llcj/Makefile (added)
+++ vmkit/trunk/tools/llcj/Makefile Thu Apr  2 09:10:13 2009
@@ -0,0 +1,18 @@
+##===- tools/llcj/Makefile ---------------------------------*- Makefile -*-===##
+# 
+#                     The vmkit project
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+# 
+##===----------------------------------------------------------------------===##
+LEVEL = ../..
+
+DIRS = libjnjvm
+
+include $(LEVEL)/Makefile.config
+
+TOOLNAME = llcj
+LINK_COMPONENTS = support
+
+include $(LEVEL)/Makefile.common

Propchange: vmkit/trunk/tools/llcj/Makefile

------------------------------------------------------------------------------
    svn:executable = *

Added: vmkit/trunk/tools/llcj/libjnjvm/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/llcj/libjnjvm/Makefile?rev=68305&view=auto

==============================================================================
--- vmkit/trunk/tools/llcj/libjnjvm/Makefile (added)
+++ vmkit/trunk/tools/llcj/libjnjvm/Makefile Thu Apr  2 09:10:13 2009
@@ -0,0 +1,17 @@
+##===- tools/llcj/libjnjvm/Makefile-------------------------*- Makefile -*-===##
+# 
+#                     The vmkit project
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+# 
+##===----------------------------------------------------------------------===##
+LEVEL = ../../..
+
+include $(LEVEL)/Makefile.config
+
+VMKIT_LIBRARYNAME = jnjvm
+VMKIT_BUILD_ARCHIVE = 1
+USEDLIBS = Allocator CommonThread Mvm JnJVM Classpath $(GCLIB)
+
+include $(LEVEL)/Makefile.common

Propchange: vmkit/trunk/tools/llcj/libjnjvm/Makefile

------------------------------------------------------------------------------
    svn:executable = *

Added: vmkit/trunk/tools/llcj/llcj.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/llcj/llcj.cpp?rev=68305&view=auto

==============================================================================
--- vmkit/trunk/tools/llcj/llcj.cpp (added)
+++ vmkit/trunk/tools/llcj/llcj.cpp Thu Apr  2 09:10:13 2009
@@ -0,0 +1,207 @@
+//===------------- llcj.cpp - Java ahead of time compiler -----------------===//
+//
+//                           The VMKit project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/System/Path.h"
+#include "llvm/System/Program.h"
+#include "llvm/System/Signals.h"
+
+#include "LinkPaths.h"
+
+using namespace llvm;
+
+int main(int argc, char **argv) {
+  llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
+
+  bool SaveTemps = false;
+  char* opt = 0;
+  
+  const char** vmjcArgv = new const char*[argc + 5];
+  int vmjcArgc = 1;
+  const char** gccArgv = new const char*[argc + 32];
+  int gccArgc = 1;
+ 
+  bool runGCC = true;
+  char* className = 0;
+
+  for (int i = 1; i < argc; ++i) {
+    if (!strcmp(argv[i], "-shared")) {
+      gccArgv[gccArgc++] = argv[i];
+    } else if (!strcmp(argv[i], "-O1") || !strcmp(argv[i], "-O2") ||
+               !strcmp(argv[i], "-O3")) {
+      opt = argv[i];
+      vmjcArgv[vmjcArgc++] = (char*)"-std-compile-opts";
+    } else if (argv[i][0] == '-' && argv[i][1] == 'S') {
+      runGCC = false;
+    } else if (argv[i][0] == '-' && argv[i][1] == 'c') {
+      gccArgv[gccArgc++] = argv[i];
+    } else if (argv[i][0] == '-' && argv[i][1] == 'l') {
+      gccArgv[gccArgc++] = argv[i];
+    } else if (argv[i][0] == '-' && argv[i][1] == 'L') {
+      gccArgv[gccArgc++] = argv[i];
+    } else if (argv[i][0] == '-' && argv[i][1] == 'W') {
+      gccArgv[gccArgc++] = argv[i];
+    } else if (argv[i][0] == '-' && argv[i][1] == 'o') {
+      gccArgv[gccArgc++] = argv[i++];
+      gccArgv[gccArgc] = argv[i];
+    } else if (argv[i][0] != '-') {
+      char* name = argv[i];
+      int len = strlen(name);
+      if (len > 4 && (!strcmp(&name[len - 4], ".jar") || 
+                      !strcmp(&name[len - 4], ".zip"))) {
+        vmjcArgv[vmjcArgc++] = name;
+        className = strndup(name, len - 4);
+      } else if (len > 6 && !strcmp(&name[len - 6], ".class")) {
+        vmjcArgv[vmjcArgc++] = name;
+        className = strndup(name, len - 6);
+      } else {
+        gccArgv[gccArgc++] = name;
+      }
+    } else if (!strcmp(argv[i], "--help")) {
+      fprintf(stderr, "Usage: llcj [options] file ...\n"
+                      "The Java to native compiler. Run vmjc --help for more "
+                      "information on the real AOT compiler.\n");
+      delete gccArgv;
+      delete vmjcArgv;
+      if (className) free(className);
+      return 0;
+    } else {
+      vmjcArgv[vmjcArgc++] = argv[i];
+    }
+  } 
+
+  vmjcArgv[vmjcArgc] = 0;
+  gccArgv[gccArgc] = 0;
+
+  std::string errMsg;
+ 
+  const sys::Path& tempDir = SaveTemps
+      ? sys::Path(sys::Path::GetCurrentDirectory())
+      : sys::Path(sys::Path::GetTemporaryDirectory());
+
+  sys::Path Out = tempDir;
+  int res = 0;
+  sys::Path Prog;
+  
+  if (!className) {
+    fprintf(stderr, "No Java file specified.... Abort\n");
+    goto cleanup;
+  }
+  
+  Prog = sys::Program::FindProgramByName("vmjc");
+
+  if (Prog.isEmpty()) {
+    fprintf(stderr, "Can't find vmjc.... Abort\n");
+    goto cleanup;
+  }
+  
+  Out.appendComponent(className);
+  Out.appendSuffix("bc");
+  
+  vmjcArgv[0] = Prog.toString().c_str();
+  vmjcArgv[vmjcArgc++] = "-f";
+  vmjcArgv[vmjcArgc++] = "-o";
+  vmjcArgv[vmjcArgc++] = Out.toString().c_str();
+ 
+  res = sys::Program::ExecuteAndWait(Prog, vmjcArgv);
+  
+  if (!res && opt) {
+    sys::Path OptOut = tempDir;
+    OptOut.appendComponent("llvmopt");
+    OptOut.appendSuffix("bc");
+    
+    sys::Path Prog = sys::Program::FindProgramByName("opt");
+  
+    if (Prog.isEmpty()) {
+      fprintf(stderr, "Can't find opt.... Abort\n");
+      goto cleanup;
+    }
+    
+    const char* optArgv[7];
+    optArgv[0] = Prog.toString().c_str();
+    optArgv[1] = Out.toString().c_str();
+    optArgv[2] = "-f";
+    optArgv[3] = "-o";
+    optArgv[4] = OptOut.toString().c_str();
+    if (opt) {
+      optArgv[5] = opt;
+      optArgv[6] = 0;
+    } else {
+      optArgv[5] = 0;
+    }
+  
+    res = sys::Program::ExecuteAndWait(Prog, optArgv);
+    Out = OptOut;
+  }
+
+  if (!res) {
+    sys::Path LlcOut = tempDir;
+    LlcOut.appendComponent(className);
+    LlcOut.appendSuffix("s");
+   
+    sys::Path Prog = sys::Program::FindProgramByName("llc");
+  
+    if (Prog.isEmpty()) {
+      fprintf(stderr, "Can't find llc.... Abort\n");
+      goto cleanup;
+    }
+    
+    const char* llcArgv[8];
+    llcArgv[0] = Prog.toString().c_str();
+    llcArgv[1] = Out.toString().c_str();
+    llcArgv[2] = "-relocation-model=pic";
+    llcArgv[3] = "-disable-fp-elim";
+    llcArgv[4] = "-f";
+    llcArgv[5] = "-o";
+    llcArgv[6] = LlcOut.toString().c_str();
+    llcArgv[7] = 0;
+  
+    res = sys::Program::ExecuteAndWait(Prog, llcArgv);
+    Out = LlcOut;
+  }
+
+  if (!res && runGCC) {
+    sys::Path Prog = sys::Program::FindProgramByName("g++");
+  
+    if (Prog.isEmpty()) {
+      fprintf(stderr, "Can't find gcc.... Abort\n");
+      goto cleanup;
+    }
+
+    gccArgv[0] = Prog.toString().c_str();
+    gccArgv[gccArgc++] = Out.toString().c_str();
+    gccArgv[gccArgc++] = LLVMLibs;
+    gccArgv[gccArgc++] = VMKITLibs1;
+    gccArgv[gccArgc++] = VMKITLibs2;
+    gccArgv[gccArgc++] = VMKITLibs3;
+    gccArgv[gccArgc++] = "-pthread";
+    gccArgv[gccArgc++] = "-lgc"; // does not hurt to add it
+    gccArgv[gccArgc++] = "-lm";
+    gccArgv[gccArgc++] = "-ldl";
+    gccArgv[gccArgc++] = "-lz";
+    gccArgv[gccArgc++] = "-ljnjvm";
+    gccArgv[gccArgc++] = "-lvmjc";
+    gccArgv[gccArgc++] = "-lLLVMSupport";
+    gccArgv[gccArgc++] = 0;
+    
+    res = sys::Program::ExecuteAndWait(Prog, gccArgv);
+    
+  }
+
+cleanup:
+  if (!SaveTemps) 
+    tempDir.eraseFromDisk(true);
+  
+  delete gccArgv;
+  delete vmjcArgv;
+  free(className);
+
+  return 0;
+}
+





More information about the vmkit-commits mailing list