8190415: [JVMCI] JVMCIRuntime::adjust_comp_level must not swallow ThreadDeath
authordnsimon
Mon, 06 Nov 2017 09:44:42 +0100
changeset 47785 5692c538ecef
parent 47784 1360c7949d2f
child 47786 97dde3171e7e
8190415: [JVMCI] JVMCIRuntime::adjust_comp_level must not swallow ThreadDeath Reviewed-by: never, thartmann
src/hotspot/.mx.jvmci/mx_jvmci.py
src/hotspot/share/jvmci/jvmciRuntime.cpp
--- a/src/hotspot/.mx.jvmci/mx_jvmci.py	Mon Nov 06 11:11:44 2017 +0100
+++ b/src/hotspot/.mx.jvmci/mx_jvmci.py	Mon Nov 06 09:44:42 2017 +0100
@@ -42,11 +42,6 @@
 
 JVMCI_VERSION = 9
 
-"""
-Top level directory of the JDK source workspace.
-"""
-_jdkSourceRoot = dirname(_suite.dir)
-
 _JVMCI_JDK_TAG = 'jvmci'
 
 _minVersion = mx.VersionSpec('1.9')
@@ -145,7 +140,7 @@
     return True
 
 def _makehelp():
-    return subprocess.check_output([mx.gmake_cmd(), 'help'], cwd=_jdkSourceRoot)
+    return subprocess.check_output([mx.gmake_cmd(), 'help'], cwd=_get_jdk_dir())
 
 def _runmake(args):
     """run the JDK make process
@@ -155,12 +150,12 @@
 
     jdkBuildDir = _get_jdk_build_dir()
     if not exists(jdkBuildDir):
-        # JDK9 must be bootstrapped with a JDK8
-        compliance = mx.JavaCompliance('8')
-        jdk8 = mx.get_jdk(compliance.exactMatch, versionDescription=compliance.value)
+        # JDK10 must be bootstrapped with a JDK9
+        compliance = mx.JavaCompliance('9')
+        jdk9 = mx.get_jdk(compliance.exactMatch, versionDescription=compliance.value)
         cmd = ['sh', 'configure', '--with-debug-level=' + _vm.debugLevel, '--with-native-debug-symbols=external', '--disable-precompiled-headers', '--with-jvm-features=graal',
-               '--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk8.home, '--with-jvm-features=graal']
-        mx.run(cmd, cwd=_jdkSourceRoot)
+               '--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk9.home, '--with-jvm-features=graal']
+        mx.run(cmd, cwd=_get_jdk_dir())
     cmd = [mx.gmake_cmd(), 'CONF=' + _vm.debugLevel]
     if mx.get_opts().verbose:
         cmd.append('LOG=debug')
@@ -170,11 +165,11 @@
 
     if not mx.get_opts().verbose:
         mx.log('--------------- make execution ----------------------')
-        mx.log('Working directory: ' + _jdkSourceRoot)
+        mx.log('Working directory: ' + _get_jdk_dir())
         mx.log('Command line: ' + ' '.join(cmd))
         mx.log('-----------------------------------------------------')
 
-    mx.run(cmd, cwd=_jdkSourceRoot)
+    mx.run(cmd, cwd=_get_jdk_dir())
 
 def _runmultimake(args):
     """run the JDK make process for one or more configurations"""
--- a/src/hotspot/share/jvmci/jvmciRuntime.cpp	Mon Nov 06 11:11:44 2017 +0100
+++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp	Mon Nov 06 09:44:42 2017 +0100
@@ -825,24 +825,33 @@
   if (compiler != NULL && compiler->is_bootstrapping()) {
     return level;
   }
-  if (!is_HotSpotJVMCIRuntime_initialized() || !_comp_level_adjustment) {
+  if (!is_HotSpotJVMCIRuntime_initialized() || _comp_level_adjustment == JVMCIRuntime::none) {
     // JVMCI cannot participate in compilation scheduling until
     // JVMCI is initialized and indicates it wants to participate.
     return level;
   }
 
 #define CHECK_RETURN THREAD); \
-if (HAS_PENDING_EXCEPTION) { \
-  Handle exception(THREAD, PENDING_EXCEPTION); \
-  CLEAR_PENDING_EXCEPTION; \
-\
-  java_lang_Throwable::java_printStackTrace(exception, THREAD); \
   if (HAS_PENDING_EXCEPTION) { \
+    Handle exception(THREAD, PENDING_EXCEPTION); \
     CLEAR_PENDING_EXCEPTION; \
+  \
+    if (exception->is_a(SystemDictionary::ThreadDeath_klass())) { \
+      /* In the special case of ThreadDeath, we need to reset the */ \
+      /* pending async exception so that it is propagated.        */ \
+      thread->set_pending_async_exception(exception()); \
+      return level; \
+    } \
+    tty->print("Uncaught exception while adjusting compilation level: "); \
+    java_lang_Throwable::print(exception(), tty); \
+    tty->cr(); \
+    java_lang_Throwable::print_stack_trace(exception, tty); \
+    if (HAS_PENDING_EXCEPTION) { \
+      CLEAR_PENDING_EXCEPTION; \
+    } \
+    return level; \
   } \
-  return level; \
-} \
-(void)(0
+  (void)(0
 
 
   Thread* THREAD = thread;