diff src/share/vm/runtime/arguments.cpp @ 4155:394404b2d9bd

Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
author Doug Simon <doug.simon@oracle.com>
date Wed, 21 Dec 2011 11:25:27 +0100
parents 04b9a2566eec
children 2af849af1723
line wrap: on
line diff
--- a/src/share/vm/runtime/arguments.cpp	Tue Dec 20 15:59:32 2011 +0100
+++ b/src/share/vm/runtime/arguments.cpp	Wed Dec 21 11:25:27 2011 +0100
@@ -2011,6 +2011,45 @@
 
 // Parse JavaVMInitArgs structure
 
+static void prepend_to_graal_classpath(SysClassPath &cp, const char* graal_dir, const char* project) {
+  const int BUFFER_SIZE = 1024;
+  char path[BUFFER_SIZE];
+
+  sprintf(path, "%s/%s/bin", graal_dir, project);
+  DIR* dir = os::opendir(path);
+  if (dir == NULL) {
+    jio_fprintf(defaultStream::output_stream(), "Error while starting Graal VM: The Graal class directory %s could not be opened.\n", path);
+    vm_exit(1);
+  }
+  os::closedir(dir);
+  cp.add_prefix(path);
+}
+
+// Walk up the directory hierarchy starting from JAVA_HOME looking
+// for a directory named "graal". If found, then the full path to
+// this directory is returned in graal_dir.
+static bool find_graal_dir(char* graal_dir) {
+  strcpy(graal_dir, Arguments::get_java_home());
+  char* end = graal_dir + strlen(graal_dir);
+  while (end != graal_dir) {
+    strcat(graal_dir, "/graal");
+    DIR* dir = os::opendir(graal_dir);
+    if (dir != NULL) {
+      os::closedir(dir);
+      return true;
+    }
+    *end = 0;
+    while (end != graal_dir) {
+      if (*end == '/') {
+        *end = 0;
+        break;
+      }
+      end--;
+    }
+  }
+  return false;
+}
+
 jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) {
   // For components of the system classpath.
   SysClassPath scp(Arguments::get_sysclasspath());
@@ -2043,37 +2082,28 @@
     }
     const int BUFFER_SIZE = 1024;
     char graal_dir[BUFFER_SIZE];
-    char temp[BUFFER_SIZE];
     if (!os::getenv("GRAAL", graal_dir, sizeof(graal_dir))) {
-      jio_fprintf(defaultStream::output_stream(), "Error while starting Graal VM: The GRAAL environment variable needs to point to the directory containing the Graal projects.\n");
-      vm_exit(0);
+      if (find_graal_dir(graal_dir) == false) {
+        jio_fprintf(defaultStream::output_stream(), "Error while starting Graal VM: The GRAAL environment variable needs to point to the directory containing the Graal projects.\n");
+        vm_exit(0);
+      }
     }
     if (PrintVMOptions) tty->print_cr("GRAAL=%s", graal_dir);
-      SysClassPath scp_compiler(Arguments::get_sysclasspath());
-      sprintf(temp, "%s/com.oracle.max.cri/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.criutils/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.base/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.asmdis/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.asm/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.graph/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.compiler/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.nodes/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.snippets/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.criutils/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      sprintf(temp, "%s/com.oracle.max.graal.hotspot/bin", graal_dir);
-      scp_compiler.add_prefix(temp);
-      scp_compiler.expand_endorsed();
-      Arguments::set_compilerclasspath(scp_compiler.combined_path());
+
+    SysClassPath scp_compiler(Arguments::get_sysclasspath());
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.cri");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.criutils");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.base");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.asmdis");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.asm");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.graal.graph");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.graal.compiler");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.graal.nodes");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.graal.snippets");
+    prepend_to_graal_classpath(scp_compiler, graal_dir, "com.oracle.max.graal.hotspot");
+    scp_compiler.expand_endorsed();
+
+    Arguments::set_compilerclasspath(scp_compiler.combined_path());
   }
 
   if (AggressiveOpts) {