src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
changeset 54732 2d012a75d35c
parent 54708 b7e6fc77c2f3
child 54786 ebf733a324d4
equal deleted inserted replaced
54731:81de17a33575 54732:2d012a75d35c
    60     _holder = Handle(_thread, klass->klass_holder());
    60     _holder = Handle(_thread, klass->klass_holder());
    61   }
    61   }
    62   return *this;
    62   return *this;
    63 }
    63 }
    64 
    64 
    65 void JNIHandleMark::push_jni_handle_block() {
    65 static void requireInHotSpot(const char* caller, JVMCI_TRAPS) {
    66   JavaThread* thread = JavaThread::current();
    66   if (!JVMCIENV->is_hotspot()) {
       
    67     JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot call %s from JVMCI shared library", caller));
       
    68   }
       
    69 }
       
    70 
       
    71 void JNIHandleMark::push_jni_handle_block(JavaThread* thread) {
    67   if (thread != NULL) {
    72   if (thread != NULL) {
    68     // Allocate a new block for JNI handles.
    73     // Allocate a new block for JNI handles.
    69     // Inlined code from jni_PushLocalFrame()
    74     // Inlined code from jni_PushLocalFrame()
    70     JNIHandleBlock* java_handles = ((JavaThread*)thread)->active_handles();
    75     JNIHandleBlock* java_handles = thread->active_handles();
    71     JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
    76     JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread);
    72     assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
    77     assert(compile_handles != NULL && java_handles != NULL, "should not be NULL");
    73     compile_handles->set_pop_frame_link(java_handles);
    78     compile_handles->set_pop_frame_link(java_handles);
    74     thread->set_active_handles(compile_handles);
    79     thread->set_active_handles(compile_handles);
    75   }
    80   }
    76 }
    81 }
    77 
    82 
    78 void JNIHandleMark::pop_jni_handle_block() {
    83 void JNIHandleMark::pop_jni_handle_block(JavaThread* thread) {
    79   JavaThread* thread = JavaThread::current();
       
    80   if (thread != NULL) {
    84   if (thread != NULL) {
    81     // Release our JNI handle block
    85     // Release our JNI handle block
    82     JNIHandleBlock* compile_handles = thread->active_handles();
    86     JNIHandleBlock* compile_handles = thread->active_handles();
    83     JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
    87     JNIHandleBlock* java_handles = compile_handles->pop_frame_link();
    84     thread->set_active_handles(java_handles);
    88     thread->set_active_handles(java_handles);
   109   oop arg=((objArrayOop) (_args))->obj_at(_index++);
   113   oop arg=((objArrayOop) (_args))->obj_at(_index++);
   110   assert(expectedType == T_OBJECT || java_lang_boxing_object::is_instance(arg, expectedType), "arg type mismatch");
   114   assert(expectedType == T_OBJECT || java_lang_boxing_object::is_instance(arg, expectedType), "arg type mismatch");
   111   return Handle(Thread::current(), arg);
   115   return Handle(Thread::current(), arg);
   112 }
   116 }
   113 
   117 
   114 // Entry to native method implementation that transitions current thread to '_thread_in_vm'.
   118 // Bring the JVMCI compiler thread into the VM state.
       
   119 #define JVMCI_VM_ENTRY_MARK                   \
       
   120   ThreadInVMfromNative __tiv(thread);         \
       
   121   ResetNoHandleMark rnhm;                     \
       
   122   HandleMarkCleaner __hm(thread);             \
       
   123   Thread* THREAD = thread;                    \
       
   124   debug_only(VMNativeEntryWrapper __vew;)
       
   125 
       
   126 // Native method block that transitions current thread to '_thread_in_vm'.
       
   127 #define C2V_BLOCK(result_type, name, signature)      \
       
   128   TRACE_CALL(result_type, jvmci_ ## name signature)  \
       
   129   JVMCI_VM_ENTRY_MARK;                               \
       
   130   ResourceMark rm;                                   \
       
   131   JNI_JVMCIENV(thread, env);
       
   132 
       
   133 static Thread* get_current_thread() {
       
   134   return Thread::current_or_null_safe();
       
   135 }
       
   136 
       
   137 // Entry to native method implementation that transitions
       
   138 // current thread to '_thread_in_vm'.
   115 #define C2V_VMENTRY(result_type, name, signature)        \
   139 #define C2V_VMENTRY(result_type, name, signature)        \
   116   JNIEXPORT result_type JNICALL c2v_ ## name signature { \
   140   JNIEXPORT result_type JNICALL c2v_ ## name signature { \
       
   141   Thread* base_thread = get_current_thread();            \
       
   142   if (base_thread == NULL) {                             \
       
   143     env->ThrowNew(JNIJVMCI::InternalError::clazz(),      \
       
   144         err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
       
   145     return;                                              \
       
   146   }                                                      \
       
   147   assert(base_thread->is_Java_thread(), "just checking");\
       
   148   JavaThread* thread = (JavaThread*) base_thread;        \
   117   JVMCITraceMark jtm("CompilerToVM::" #name);            \
   149   JVMCITraceMark jtm("CompilerToVM::" #name);            \
   118   TRACE_CALL(result_type, jvmci_ ## name signature)      \
   150   C2V_BLOCK(result_type, name, signature)
   119   JVMCI_VM_ENTRY_MARK;                                   \
   151 
   120   ResourceMark rm;                                       \
   152 #define C2V_VMENTRY_(result_type, name, signature, result) \
   121   JNI_JVMCIENV(env);
   153   JNIEXPORT result_type JNICALL c2v_ ## name signature { \
       
   154   Thread* base_thread = get_current_thread();            \
       
   155   if (base_thread == NULL) {                             \
       
   156     env->ThrowNew(JNIJVMCI::InternalError::clazz(),      \
       
   157         err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \
       
   158     return result;                                       \
       
   159   }                                                      \
       
   160   assert(base_thread->is_Java_thread(), "just checking");\
       
   161   JavaThread* thread = (JavaThread*) base_thread;        \
       
   162   JVMCITraceMark jtm("CompilerToVM::" #name);            \
       
   163   C2V_BLOCK(result_type, name, signature)
       
   164 
       
   165 #define C2V_VMENTRY_NULL(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, NULL)
       
   166 #define C2V_VMENTRY_0(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, 0)
       
   167 
       
   168 // Entry to native method implementation that does not transition
       
   169 // current thread to '_thread_in_vm'.
       
   170 #define C2V_VMENTRY_PREFIX(result_type, name, signature) \
       
   171   JNIEXPORT result_type JNICALL c2v_ ## name signature { \
       
   172   Thread* base_thread = get_current_thread();
   122 
   173 
   123 #define C2V_END }
   174 #define C2V_END }
   124 
   175 
       
   176 #define JNI_THROW(caller, name, msg) do {                                         \
       
   177     jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg);               \
       
   178     if (__throw_res != JNI_OK) {                                                  \
       
   179       tty->print_cr("Throwing " #name " in " caller " returned %d", __throw_res); \
       
   180     }                                                                             \
       
   181     return;                                                                       \
       
   182   } while (0);
       
   183 
       
   184 #define JNI_THROW_(caller, name, msg, result) do {                                \
       
   185     jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg);               \
       
   186     if (__throw_res != JNI_OK) {                                                  \
       
   187       tty->print_cr("Throwing " #name " in " caller " returned %d", __throw_res); \
       
   188     }                                                                             \
       
   189     return result;                                                                \
       
   190   } while (0)
       
   191 
   125 jobjectArray readConfiguration0(JNIEnv *env, JVMCI_TRAPS);
   192 jobjectArray readConfiguration0(JNIEnv *env, JVMCI_TRAPS);
   126 
   193 
   127 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv* env))
   194 C2V_VMENTRY_NULL(jobjectArray, readConfiguration, (JNIEnv* env))
   128   jobjectArray config = readConfiguration0(env, JVMCI_CHECK_NULL);
   195   jobjectArray config = readConfiguration0(env, JVMCI_CHECK_NULL);
   129   return config;
   196   return config;
   130 }
   197 }
   131 
   198 
   132 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv* env, jobject c2vm, jobject name_handle))
   199 C2V_VMENTRY_NULL(jobject, getFlagValue, (JNIEnv* env, jobject c2vm, jobject name_handle))
   133 #define RETURN_BOXED_LONG(value) jvalue p; p.j = (jlong) (value); JVMCIObject box = JVMCIENV->create_box(T_LONG, &p, JVMCI_CHECK_NULL); return box.as_jobject();
   200 #define RETURN_BOXED_LONG(value) jvalue p; p.j = (jlong) (value); JVMCIObject box = JVMCIENV->create_box(T_LONG, &p, JVMCI_CHECK_NULL); return box.as_jobject();
   134 #define RETURN_BOXED_DOUBLE(value) jvalue p; p.d = (jdouble) (value); JVMCIObject box = JVMCIENV->create_box(T_DOUBLE, &p, JVMCI_CHECK_NULL); return box.as_jobject();
   201 #define RETURN_BOXED_DOUBLE(value) jvalue p; p.d = (jdouble) (value); JVMCIObject box = JVMCIENV->create_box(T_DOUBLE, &p, JVMCI_CHECK_NULL); return box.as_jobject();
   135   JVMCIObject name = JVMCIENV->wrap(name_handle);
   202   JVMCIObject name = JVMCIENV->wrap(name_handle);
   136   if (name.is_null()) {
   203   if (name.is_null()) {
   137     JVMCI_THROW_NULL(NullPointerException);
   204     JVMCI_THROW_NULL(NullPointerException);
   168   }
   235   }
   169 #undef RETURN_BOXED_LONG
   236 #undef RETURN_BOXED_LONG
   170 #undef RETURN_BOXED_DOUBLE
   237 #undef RETURN_BOXED_DOUBLE
   171 C2V_END
   238 C2V_END
   172 
   239 
   173 C2V_VMENTRY(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
   240 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
   174   if (env != JavaThread::current()->jni_environment()) {
   241   requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
   175     JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot");
       
   176   }
       
   177   if (oop_address == 0) {
   242   if (oop_address == 0) {
   178     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
   243     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
   179   }
   244   }
   180   oop obj = *((oopDesc**) oop_address);
   245   oop obj = *((oopDesc**) oop_address);
   181   if (obj != NULL) {
   246   if (obj != NULL) {
   182     oopDesc::verify(obj);
   247     oopDesc::verify(obj);
   183   }
   248   }
   184   return JNIHandles::make_local(obj);
   249   return JNIHandles::make_local(obj);
   185 C2V_END
   250 C2V_END
   186 
   251 
   187 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
   252 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
   188   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   253   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   189 
   254 
   190   int code_size = method->code_size();
   255   int code_size = method->code_size();
   191   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
   256   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
   192 
   257 
   260   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
   325   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
   261   JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size);
   326   JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size);
   262   return JVMCIENV->get_jbyteArray(result);
   327   return JVMCIENV->get_jbyteArray(result);
   263 C2V_END
   328 C2V_END
   264 
   329 
   265 C2V_VMENTRY(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
   330 C2V_VMENTRY_0(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
   266   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   331   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   267   return method->exception_table_length();
   332   return method->exception_table_length();
   268 C2V_END
   333 C2V_END
   269 
   334 
   270 C2V_VMENTRY(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
   335 C2V_VMENTRY_0(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
   271   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   336   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   272   if (method->exception_table_length() == 0) {
   337   if (method->exception_table_length() == 0) {
   273     return 0L;
   338     return 0L;
   274   }
   339   }
   275   return (jlong) (address) method->exception_table_start();
   340   return (jlong) (address) method->exception_table_start();
   276 C2V_END
   341 C2V_END
   277 
   342 
   278 C2V_VMENTRY(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle))
   343 C2V_VMENTRY_NULL(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle))
   279   if (env != JavaThread::current()->jni_environment()) {
   344   requireInHotSpot("asResolvedJavaMethod", JVMCI_CHECK_NULL);
   280     JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot");
       
   281   }
       
   282 
       
   283   oop executable = JNIHandles::resolve(executable_handle);
   345   oop executable = JNIHandles::resolve(executable_handle);
   284   oop mirror = NULL;
   346   oop mirror = NULL;
   285   int slot = 0;
   347   int slot = 0;
   286 
   348 
   287   if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) {
   349   if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) {
   296   methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot);
   358   methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot);
   297   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   359   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   298   return JVMCIENV->get_jobject(result);
   360   return JVMCIENV->get_jobject(result);
   299 }
   361 }
   300 
   362 
   301 C2V_VMENTRY(jobject, getResolvedJavaMethod, (JNIEnv* env, jobject, jobject base, jlong offset))
   363 C2V_VMENTRY_NULL(jobject, getResolvedJavaMethod, (JNIEnv* env, jobject, jobject base, jlong offset))
   302   methodHandle method;
   364   methodHandle method;
   303   JVMCIObject base_object = JVMCIENV->wrap(base);
   365   JVMCIObject base_object = JVMCIENV->wrap(base);
   304   if (base_object.is_null()) {
   366   if (base_object.is_null()) {
   305     method = *((Method**)(offset));
   367     method = *((Method**)(offset));
   306   } else if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
   368   } else if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
   319   assert (method.is_null() || method->is_method(), "invalid read");
   381   assert (method.is_null() || method->is_method(), "invalid read");
   320   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   382   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   321   return JVMCIENV->get_jobject(result);
   383   return JVMCIENV->get_jobject(result);
   322 }
   384 }
   323 
   385 
   324 C2V_VMENTRY(jobject, getConstantPool, (JNIEnv* env, jobject, jobject object_handle))
   386 C2V_VMENTRY_NULL(jobject, getConstantPool, (JNIEnv* env, jobject, jobject object_handle))
   325   constantPoolHandle cp;
   387   constantPoolHandle cp;
   326   JVMCIObject object = JVMCIENV->wrap(object_handle);
   388   JVMCIObject object = JVMCIENV->wrap(object_handle);
   327   if (object.is_null()) {
   389   if (object.is_null()) {
   328     JVMCI_THROW_NULL(NullPointerException);
   390     JVMCI_THROW_NULL(NullPointerException);
   329   }
   391   }
   339 
   401 
   340   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(cp, JVMCI_CHECK_NULL);
   402   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(cp, JVMCI_CHECK_NULL);
   341   return JVMCIENV->get_jobject(result);
   403   return JVMCIENV->get_jobject(result);
   342 }
   404 }
   343 
   405 
   344 C2V_VMENTRY(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
   406 C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
   345   JVMCIKlassHandle klass(THREAD);
   407   JVMCIKlassHandle klass(THREAD);
   346   JVMCIObject base_object = JVMCIENV->wrap(base);
   408   JVMCIObject base_object = JVMCIENV->wrap(base);
   347   jlong base_address = 0;
   409   jlong base_address = 0;
   348   if (base_object.is_non_null() && offset == oopDesc::klass_offset_in_bytes()) {
   410   if (base_object.is_non_null() && offset == oopDesc::klass_offset_in_bytes()) {
   349     // klass = JVMCIENV->unhandle(base_object)->klass();
   411     // klass = JVMCIENV->unhandle(base_object)->klass();
   382   assert (klass == NULL || klass->is_klass(), "invalid read");
   444   assert (klass == NULL || klass->is_klass(), "invalid read");
   383   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
   445   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
   384   return JVMCIENV->get_jobject(result);
   446   return JVMCIENV->get_jobject(result);
   385 }
   447 }
   386 
   448 
   387 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
   449 C2V_VMENTRY_NULL(jobject, findUniqueConcreteMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
   388   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   450   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   389   Klass* holder = JVMCIENV->asKlass(jvmci_type);
   451   Klass* holder = JVMCIENV->asKlass(jvmci_type);
   390   if (holder->is_interface()) {
   452   if (holder->is_interface()) {
   391     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Interface %s should be handled in Java code", holder->external_name()));
   453     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Interface %s should be handled in Java code", holder->external_name()));
   392   }
   454   }
   398   }
   460   }
   399   JVMCIObject result = JVMCIENV->get_jvmci_method(ucm, JVMCI_CHECK_NULL);
   461   JVMCIObject result = JVMCIENV->get_jvmci_method(ucm, JVMCI_CHECK_NULL);
   400   return JVMCIENV->get_jobject(result);
   462   return JVMCIENV->get_jobject(result);
   401 C2V_END
   463 C2V_END
   402 
   464 
   403 C2V_VMENTRY(jobject, getImplementor, (JNIEnv* env, jobject, jobject jvmci_type))
   465 C2V_VMENTRY_NULL(jobject, getImplementor, (JNIEnv* env, jobject, jobject jvmci_type))
   404   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   466   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   405   if (!klass->is_interface()) {
   467   if (!klass->is_interface()) {
   406     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
   468     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
   407         err_msg("Expected interface type, got %s", klass->external_name()));
   469         err_msg("Expected interface type, got %s", klass->external_name()));
   408   }
   470   }
   415   }
   477   }
   416   JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
   478   JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
   417   return JVMCIENV->get_jobject(implementor);
   479   return JVMCIENV->get_jobject(implementor);
   418 C2V_END
   480 C2V_END
   419 
   481 
   420 C2V_VMENTRY(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method))
   482 C2V_VMENTRY_0(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method))
   421   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   483   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   422   return method->is_ignored_by_security_stack_walk();
   484   return method->is_ignored_by_security_stack_walk();
   423 C2V_END
   485 C2V_END
   424 
   486 
   425 C2V_VMENTRY(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method))
   487 C2V_VMENTRY_0(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method))
   426   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   488   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   427   constantPoolHandle cp = method->constMethod()->constants();
   489   constantPoolHandle cp = method->constMethod()->constants();
   428   assert(!cp.is_null(), "npe");
   490   assert(!cp.is_null(), "npe");
   429   // don't inline method when constant pool contains a CONSTANT_Dynamic
   491   // don't inline method when constant pool contains a CONSTANT_Dynamic
   430   return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant();
   492   return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant();
   431 C2V_END
   493 C2V_END
   432 
   494 
   433 C2V_VMENTRY(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method))
   495 C2V_VMENTRY_0(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method))
   434   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   496   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   435   return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline();
   497   return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline();
   436 C2V_END
   498 C2V_END
   437 
   499 
   438 C2V_VMENTRY(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method))
   500 C2V_VMENTRY_0(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method))
   439   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   501   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   440   return CompilerOracle::should_inline(method) || method->force_inline();
   502   return CompilerOracle::should_inline(method) || method->force_inline();
   441 C2V_END
   503 C2V_END
   442 
   504 
   443 C2V_VMENTRY(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve))
   505 C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve))
   444   JVMCIObject name = JVMCIENV->wrap(jname);
   506   JVMCIObject name = JVMCIENV->wrap(jname);
   445   const char* str = JVMCIENV->as_utf8_string(name);
   507   const char* str = JVMCIENV->as_utf8_string(name);
   446   TempNewSymbol class_name = SymbolTable::new_symbol(str, CHECK_NULL);
   508   TempNewSymbol class_name = SymbolTable::new_symbol(str, CHECK_NULL);
   447 
   509 
   448   if (class_name->utf8_length() <= 1) {
   510   if (class_name->utf8_length() <= 1) {
   463     JVMCIENV->runtime()->initialize(JVMCIENV);
   525     JVMCIENV->runtime()->initialize(JVMCIENV);
   464   }
   526   }
   465 
   527 
   466   if (resolve) {
   528   if (resolve) {
   467     resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
   529     resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
       
   530     if (resolved_klass == NULL) {
       
   531       JVMCI_THROW_MSG_NULL(ClassNotFoundException, str);
       
   532     }
   468   } else {
   533   } else {
   469     if (class_name->char_at(0) == 'L' &&
   534     if (class_name->char_at(0) == 'L' &&
   470       class_name->char_at(class_name->utf8_length()-1) == ';') {
   535       class_name->char_at(class_name->utf8_length()-1) == ';') {
   471       // This is a name from a signature.  Strip off the trimmings.
   536       // This is a name from a signature.  Strip off the trimmings.
   472       // Call recursive to keep scope of strippedsym.
   537       // Call recursive to keep scope of strippedsym.
   481       BasicType t = FieldType::get_array_info(class_name, fd, CHECK_0);
   546       BasicType t = FieldType::get_array_info(class_name, fd, CHECK_0);
   482       if (t == T_OBJECT) {
   547       if (t == T_OBJECT) {
   483         TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1+fd.dimension(),
   548         TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1+fd.dimension(),
   484                                                             class_name->utf8_length()-2-fd.dimension(),
   549                                                             class_name->utf8_length()-2-fd.dimension(),
   485                                                             CHECK_0);
   550                                                             CHECK_0);
   486         // naked oop "k" is OK here -- we assign back into it
       
   487         resolved_klass = SystemDictionary::find(strippedsym,
   551         resolved_klass = SystemDictionary::find(strippedsym,
   488                                                              class_loader,
   552                                                              class_loader,
   489                                                              protection_domain,
   553                                                              protection_domain,
   490                                                              CHECK_0);
   554                                                              CHECK_0);
   491         if (!resolved_klass.is_null()) {
   555         if (!resolved_klass.is_null()) {
   500   }
   564   }
   501   JVMCIObject result = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
   565   JVMCIObject result = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
   502   return JVMCIENV->get_jobject(result);
   566   return JVMCIENV->get_jobject(result);
   503 C2V_END
   567 C2V_END
   504 
   568 
   505 C2V_VMENTRY(jobject, lookupClass, (JNIEnv* env, jobject, jclass mirror))
   569 C2V_VMENTRY_NULL(jobject, lookupClass, (JNIEnv* env, jobject, jclass mirror))
   506   if (env != JavaThread::current()->jni_environment()) {
   570   requireInHotSpot("lookupClass", JVMCI_CHECK_NULL);
   507     JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot");
       
   508   }
       
   509   if (mirror == NULL) {
   571   if (mirror == NULL) {
   510     return NULL;
   572     return NULL;
   511   }
   573   }
   512   JVMCIKlassHandle klass(THREAD);
   574   JVMCIKlassHandle klass(THREAD);
   513   klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
   575   klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
   516   }
   578   }
   517   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
   579   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
   518   return JVMCIENV->get_jobject(result);
   580   return JVMCIENV->get_jobject(result);
   519 }
   581 }
   520 
   582 
   521 C2V_VMENTRY(jobject, resolveConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   583 C2V_VMENTRY_NULL(jobject, resolveConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   522   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   584   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   523   oop result = cp->resolve_constant_at(index, CHECK_NULL);
   585   oop result = cp->resolve_constant_at(index, CHECK_NULL);
   524   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
   586   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
   525 C2V_END
   587 C2V_END
   526 
   588 
   527 C2V_VMENTRY(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   589 C2V_VMENTRY_NULL(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   528   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   590   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   529   oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL);
   591   oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL);
   530   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
   592   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
   531 C2V_END
   593 C2V_END
   532 
   594 
   533 C2V_VMENTRY(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   595 C2V_VMENTRY_0(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   534   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   596   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   535   return cp->name_and_type_ref_index_at(index);
   597   return cp->name_and_type_ref_index_at(index);
   536 C2V_END
   598 C2V_END
   537 
   599 
   538 C2V_VMENTRY(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
   600 C2V_VMENTRY_NULL(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
   539   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   601   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   540   JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL);
   602   JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL);
   541   return JVMCIENV->get_jobject(sym);
   603   return JVMCIENV->get_jobject(sym);
   542 C2V_END
   604 C2V_END
   543 
   605 
   544 C2V_VMENTRY(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
   606 C2V_VMENTRY_NULL(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
   545   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   607   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   546   JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL);
   608   JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL);
   547   return JVMCIENV->get_jobject(sym);
   609   return JVMCIENV->get_jobject(sym);
   548 C2V_END
   610 C2V_END
   549 
   611 
   550 C2V_VMENTRY(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   612 C2V_VMENTRY_0(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   551   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   613   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   552   return cp->klass_ref_index_at(index);
   614   return cp->klass_ref_index_at(index);
   553 C2V_END
   615 C2V_END
   554 
   616 
   555 C2V_VMENTRY(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   617 C2V_VMENTRY_NULL(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   556   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   618   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   557   Klass* klass = cp->klass_at(index, CHECK_NULL);
   619   Klass* klass = cp->klass_at(index, CHECK_NULL);
   558   JVMCIKlassHandle resolved_klass(THREAD, klass);
   620   JVMCIKlassHandle resolved_klass(THREAD, klass);
   559   if (resolved_klass->is_instance_klass()) {
   621   if (resolved_klass->is_instance_klass()) {
   560     bool linked = InstanceKlass::cast(resolved_klass())->link_class_or_fail(CHECK_NULL);
   622     InstanceKlass::cast(resolved_klass())->link_class(CHECK_NULL);
   561     if (!linked) {
   623     if (!InstanceKlass::cast(resolved_klass())->is_linked()) {
   562       return NULL;
   624       // link_class() should not return here if there is an issue.
       
   625       JVMCI_THROW_MSG_NULL(InternalError, err_msg("Class %s must be linked", resolved_klass()->external_name()));
   563     }
   626     }
   564   }
   627   }
   565   JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
   628   JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
   566   return JVMCIENV->get_jobject(klassObject);
   629   return JVMCIENV->get_jobject(klassObject);
   567 C2V_END
   630 C2V_END
   568 
   631 
   569 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   632 C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   570   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   633   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   571   Klass* loading_klass = cp->pool_holder();
   634   Klass* loading_klass = cp->pool_holder();
   572   bool is_accessible = false;
   635   bool is_accessible = false;
   573   JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass));
   636   JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass));
   574   Symbol* symbol = NULL;
   637   Symbol* symbol = NULL;
   592     result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL);
   655     result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL);
   593   }
   656   }
   594   return JVMCIENV->get_jobject(result);
   657   return JVMCIENV->get_jobject(result);
   595 C2V_END
   658 C2V_END
   596 
   659 
   597 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   660 C2V_VMENTRY_NULL(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   598   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   661   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   599   oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
   662   oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
   600   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop));
   663   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop));
   601 C2V_END
   664 C2V_END
   602 
   665 
   603 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   666 C2V_VMENTRY_NULL(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   604   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   667   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   605   InstanceKlass* pool_holder = cp->pool_holder();
   668   InstanceKlass* pool_holder = cp->pool_holder();
   606   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
   669   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
   607   methodHandle method = JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder);
   670   methodHandle method = JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder);
   608   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   671   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
   609   return JVMCIENV->get_jobject(result);
   672   return JVMCIENV->get_jobject(result);
   610 C2V_END
   673 C2V_END
   611 
   674 
   612 C2V_VMENTRY(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   675 C2V_VMENTRY_0(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
   613   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   676   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   614   return cp->remap_instruction_operand_from_cache(index);
   677   return cp->remap_instruction_operand_from_cache(index);
   615 C2V_END
   678 C2V_END
   616 
   679 
   617 C2V_VMENTRY(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle))
   680 C2V_VMENTRY_NULL(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle))
   618   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   681   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
   619   Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
   682   Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
   620   fieldDescriptor fd;
   683   fieldDescriptor fd;
   621   LinkInfo link_info(cp, index, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL, CHECK_0);
   684   LinkInfo link_info(cp, index, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL, CHECK_0);
   622   LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
   685   LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
   630   JVMCIKlassHandle handle(THREAD, fd.field_holder());
   693   JVMCIKlassHandle handle(THREAD, fd.field_holder());
   631   JVMCIObject field_holder = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
   694   JVMCIObject field_holder = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
   632   return JVMCIENV->get_jobject(field_holder);
   695   return JVMCIENV->get_jobject(field_holder);
   633 C2V_END
   696 C2V_END
   634 
   697 
   635 C2V_VMENTRY(jint, getVtableIndexForInterfaceMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
   698 C2V_VMENTRY_0(jint, getVtableIndexForInterfaceMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
   636   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   699   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   637   Method* method = JVMCIENV->asMethod(jvmci_method);
   700   Method* method = JVMCIENV->asMethod(jvmci_method);
   638   if (klass->is_interface()) {
   701   if (klass->is_interface()) {
   639     JVMCI_THROW_MSG_0(InternalError, err_msg("Interface %s should be handled in Java code", klass->external_name()));
   702     JVMCI_THROW_MSG_0(InternalError, err_msg("Interface %s should be handled in Java code", klass->external_name()));
   640   }
   703   }
   648     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be linked", klass->external_name()));
   711     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be linked", klass->external_name()));
   649   }
   712   }
   650   return LinkResolver::vtable_index_of_interface_method(klass, method);
   713   return LinkResolver::vtable_index_of_interface_method(klass, method);
   651 C2V_END
   714 C2V_END
   652 
   715 
   653 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv* env, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   716 C2V_VMENTRY_NULL(jobject, resolveMethod, (JNIEnv* env, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   654   Klass* recv_klass = JVMCIENV->asKlass(receiver_jvmci_type);
   717   Klass* recv_klass = JVMCIENV->asKlass(receiver_jvmci_type);
   655   Klass* caller_klass = JVMCIENV->asKlass(caller_jvmci_type);
   718   Klass* caller_klass = JVMCIENV->asKlass(caller_jvmci_type);
   656   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   719   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   657 
   720 
   658   Klass* resolved     = method->method_holder();
   721   Klass* resolved     = method->method_holder();
   695 
   758 
   696   JVMCIObject result = JVMCIENV->get_jvmci_method(m, JVMCI_CHECK_NULL);
   759   JVMCIObject result = JVMCIENV->get_jvmci_method(m, JVMCI_CHECK_NULL);
   697   return JVMCIENV->get_jobject(result);
   760   return JVMCIENV->get_jobject(result);
   698 C2V_END
   761 C2V_END
   699 
   762 
   700 C2V_VMENTRY(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type))
   763 C2V_VMENTRY_0(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type))
   701   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   764   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   702   assert(klass != NULL, "method must not be called for primitive types");
   765   assert(klass != NULL, "method must not be called for primitive types");
   703   return Dependencies::find_finalizable_subclass(klass) != NULL;
   766   return Dependencies::find_finalizable_subclass(klass) != NULL;
   704 C2V_END
   767 C2V_END
   705 
   768 
   706 C2V_VMENTRY(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type))
   769 C2V_VMENTRY_NULL(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type))
   707   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   770   Klass* klass = JVMCIENV->asKlass(jvmci_type);
   708   if (!klass->is_instance_klass()) {
   771   if (!klass->is_instance_klass()) {
   709     return NULL;
   772     return NULL;
   710   }
   773   }
   711   InstanceKlass* iklass = InstanceKlass::cast(klass);
   774   InstanceKlass* iklass = InstanceKlass::cast(klass);
   712   JVMCIObject result = JVMCIENV->get_jvmci_method(iklass->class_initializer(), JVMCI_CHECK_NULL);
   775   JVMCIObject result = JVMCIENV->get_jvmci_method(iklass->class_initializer(), JVMCI_CHECK_NULL);
   713   return JVMCIENV->get_jobject(result);
   776   return JVMCIENV->get_jobject(result);
   714 C2V_END
   777 C2V_END
   715 
   778 
   716 C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr))
   779 C2V_VMENTRY_0(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr))
   717   address target_addr = (address) addr;
   780   address target_addr = (address) addr;
   718   if (target_addr != 0x0) {
   781   if (target_addr != 0x0) {
   719     int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
   782     int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
   720     int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
   783     int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
   721     return MAX2(ABS(off_low), ABS(off_high));
   784     return MAX2(ABS(off_low), ABS(off_high));
   728   method->set_not_c1_compilable();
   791   method->set_not_c1_compilable();
   729   method->set_not_c2_compilable();
   792   method->set_not_c2_compilable();
   730   method->set_dont_inline(true);
   793   method->set_dont_inline(true);
   731 C2V_END
   794 C2V_END
   732 
   795 
   733 C2V_VMENTRY(jint, installCode, (JNIEnv *env, jobject, jobject target, jobject compiled_code,
   796 C2V_VMENTRY_0(jint, installCode, (JNIEnv *env, jobject, jobject target, jobject compiled_code,
   734             jobject installed_code, jlong failed_speculations_address, jbyteArray speculations_obj))
   797             jobject installed_code, jlong failed_speculations_address, jbyteArray speculations_obj))
   735   HandleMark hm;
   798   HandleMark hm;
   736   JNIHandleMark jni_hm;
   799   JNIHandleMark jni_hm(thread);
   737 
   800 
   738   JVMCIObject target_handle = JVMCIENV->wrap(target);
   801   JVMCIObject target_handle = JVMCIENV->wrap(target);
   739   JVMCIObject compiled_code_handle = JVMCIENV->wrap(compiled_code);
   802   JVMCIObject compiled_code_handle = JVMCIENV->wrap(compiled_code);
   740   CodeBlob* cb = NULL;
   803   CodeBlob* cb = NULL;
   741   JVMCIObject installed_code_handle = JVMCIENV->wrap(installed_code);
   804   JVMCIObject installed_code_handle = JVMCIENV->wrap(installed_code);
   789     }
   852     }
   790   }
   853   }
   791   return result;
   854   return result;
   792 C2V_END
   855 C2V_END
   793 
   856 
   794 C2V_VMENTRY(jint, getMetadata, (JNIEnv *env, jobject, jobject target, jobject compiled_code, jobject metadata))
   857 C2V_VMENTRY_0(jint, getMetadata, (JNIEnv *env, jobject, jobject target, jobject compiled_code, jobject metadata))
   795 #if INCLUDE_AOT
   858 #if INCLUDE_AOT
   796   HandleMark hm;
   859   HandleMark hm;
   797   assert(JVMCIENV->is_hotspot(), "AOT code is executed only in HotSpot mode");
   860   assert(JVMCIENV->is_hotspot(), "AOT code is executed only in HotSpot mode");
   798 
   861 
   799   JVMCIObject target_handle = JVMCIENV->wrap(target);
   862   JVMCIObject target_handle = JVMCIENV->wrap(target);
   870   CompilerStatistics* stats = compiler->stats();
   933   CompilerStatistics* stats = compiler->stats();
   871   stats->_standard.reset();
   934   stats->_standard.reset();
   872   stats->_osr.reset();
   935   stats->_osr.reset();
   873 C2V_END
   936 C2V_END
   874 
   937 
   875 C2V_VMENTRY(jobject, disassembleCodeBlob, (JNIEnv* env, jobject, jobject installedCode))
   938 C2V_VMENTRY_NULL(jobject, disassembleCodeBlob, (JNIEnv* env, jobject, jobject installedCode))
   876   HandleMark hm;
   939   HandleMark hm;
   877 
   940 
   878   if (installedCode == NULL) {
   941   if (installedCode == NULL) {
   879     JVMCI_THROW_MSG_NULL(NullPointerException, "installedCode is null");
   942     JVMCI_THROW_MSG_NULL(NullPointerException, "installedCode is null");
   880   }
   943   }
   907 
   970 
   908   JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL);
   971   JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL);
   909   return JVMCIENV->get_jobject(result);
   972   return JVMCIENV->get_jobject(result);
   910 C2V_END
   973 C2V_END
   911 
   974 
   912 C2V_VMENTRY(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci))
   975 C2V_VMENTRY_NULL(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci))
   913   HandleMark hm;
   976   HandleMark hm;
   914 
   977 
   915   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   978   methodHandle method = JVMCIENV->asMethod(jvmci_method);
   916   JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL);
   979   JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL);
   917   return JVMCIENV->get_jobject(element);
   980   return JVMCIENV->get_jobject(element);
   918 C2V_END
   981 C2V_END
   919 
   982 
   920 C2V_VMENTRY(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod))
   983 C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod))
   921   if (env != JavaThread::current()->jni_environment()) {
   984   // The incoming arguments array would have to contain JavaConstants instead of regular objects
   922     // The incoming arguments array would have to contain JavaConstants instead of regular objects
   985   // and the return value would have to be wrapped as a JavaConstant.
   923     // and the return value would have to be wrapped as a JavaConstant.
   986   requireInHotSpot("executeHotSpotNmethod", JVMCI_CHECK_NULL);
   924     JVMCI_THROW_MSG_NULL(InternalError, "Wrapping of arguments is currently unsupported");
       
   925   }
       
   926 
   987 
   927   HandleMark hm;
   988   HandleMark hm;
   928 
   989 
   929   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
   990   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
   930   nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror);
   991   nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror);
   966     JVMCIObject o = JVMCIENV->create_box(jap.get_ret_type(), value, JVMCI_CHECK_NULL);
  1027     JVMCIObject o = JVMCIENV->create_box(jap.get_ret_type(), value, JVMCI_CHECK_NULL);
   967     return JVMCIENV->get_jobject(o);
  1028     return JVMCIENV->get_jobject(o);
   968   }
  1029   }
   969 C2V_END
  1030 C2V_END
   970 
  1031 
   971 C2V_VMENTRY(jlongArray, getLineNumberTable, (JNIEnv* env, jobject, jobject jvmci_method))
  1032 C2V_VMENTRY_NULL(jlongArray, getLineNumberTable, (JNIEnv* env, jobject, jobject jvmci_method))
   972   Method* method = JVMCIENV->asMethod(jvmci_method);
  1033   Method* method = JVMCIENV->asMethod(jvmci_method);
   973   if (!method->has_linenumber_table()) {
  1034   if (!method->has_linenumber_table()) {
   974     return NULL;
  1035     return NULL;
   975   }
  1036   }
   976   u2 num_entries = 0;
  1037   u2 num_entries = 0;
   993   }
  1054   }
   994 
  1055 
   995   return (jlongArray) JVMCIENV->get_jobject(result);
  1056   return (jlongArray) JVMCIENV->get_jobject(result);
   996 C2V_END
  1057 C2V_END
   997 
  1058 
   998 C2V_VMENTRY(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
  1059 C2V_VMENTRY_0(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
   999   Method* method = JVMCIENV->asMethod(jvmci_method);
  1060   Method* method = JVMCIENV->asMethod(jvmci_method);
  1000   if (!method->has_localvariable_table()) {
  1061   if (!method->has_localvariable_table()) {
  1001     return 0;
  1062     return 0;
  1002   }
  1063   }
  1003   return (jlong) (address) method->localvariable_table_start();
  1064   return (jlong) (address) method->localvariable_table_start();
  1004 C2V_END
  1065 C2V_END
  1005 
  1066 
  1006 C2V_VMENTRY(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
  1067 C2V_VMENTRY_0(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
  1007   Method* method = JVMCIENV->asMethod(jvmci_method);
  1068   Method* method = JVMCIENV->asMethod(jvmci_method);
  1008   return method->localvariable_table_length();
  1069   return method->localvariable_table_length();
  1009 C2V_END
  1070 C2V_END
  1010 
  1071 
  1011 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method))
  1072 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method))
  1035 C2V_VMENTRY(void, invalidateHotSpotNmethod, (JNIEnv* env, jobject, jobject hs_nmethod))
  1096 C2V_VMENTRY(void, invalidateHotSpotNmethod, (JNIEnv* env, jobject, jobject hs_nmethod))
  1036   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
  1097   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
  1037   JVMCIENV->invalidate_nmethod_mirror(nmethod_mirror, JVMCI_CHECK);
  1098   JVMCIENV->invalidate_nmethod_mirror(nmethod_mirror, JVMCI_CHECK);
  1038 C2V_END
  1099 C2V_END
  1039 
  1100 
  1040 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv* env, jobject, jlong addr))
  1101 C2V_VMENTRY_NULL(jobject, readUncompressedOop, (JNIEnv* env, jobject, jlong addr))
  1041   oop ret = RawAccess<>::oop_load((oop*)(address)addr);
  1102   oop ret = RawAccess<>::oop_load((oop*)(address)addr);
  1042   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(ret));
  1103   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(ret));
  1043  C2V_END
  1104  C2V_END
  1044 
  1105 
  1045 C2V_VMENTRY(jlongArray, collectCounters, (JNIEnv* env, jobject))
  1106 C2V_VMENTRY_NULL(jlongArray, collectCounters, (JNIEnv* env, jobject))
       
  1107   // Returns a zero length array if counters aren't enabled
  1046   JVMCIPrimitiveArray array = JVMCIENV->new_longArray(JVMCICounterSize, JVMCI_CHECK_NULL);
  1108   JVMCIPrimitiveArray array = JVMCIENV->new_longArray(JVMCICounterSize, JVMCI_CHECK_NULL);
  1047   JavaThread::collect_counters(JVMCIENV, array);
  1109   if (JVMCICounterSize > 0) {
       
  1110     jlong* temp_array = NEW_RESOURCE_ARRAY(jlong, JVMCICounterSize);
       
  1111     JavaThread::collect_counters(temp_array, JVMCICounterSize);
       
  1112     JVMCIENV->copy_longs_from(temp_array, array, 0, JVMCICounterSize);
       
  1113   }
  1048   return (jlongArray) JVMCIENV->get_jobject(array);
  1114   return (jlongArray) JVMCIENV->get_jobject(array);
  1049 C2V_END
  1115 C2V_END
  1050 
  1116 
  1051 C2V_VMENTRY(int, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci))
  1117 C2V_VMENTRY_0(int, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci))
  1052   HandleMark hm;
  1118   HandleMark hm;
  1053   if (jvmci_method == NULL) {
  1119   if (jvmci_method == NULL) {
  1054     JVMCI_THROW_0(NullPointerException);
  1120     JVMCI_THROW_0(NullPointerException);
  1055   }
  1121   }
  1056   Method* method = JVMCIENV->asMethod(jvmci_method);
  1122   Method* method = JVMCIENV->asMethod(jvmci_method);
  1059   }
  1125   }
  1060   return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci);
  1126   return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci);
  1061 C2V_END
  1127 C2V_END
  1062 
  1128 
  1063 
  1129 
  1064 C2V_VMENTRY(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data))
  1130 C2V_VMENTRY_0(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data))
  1065   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
  1131   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
  1066   return mdo != NULL && mdo->is_mature();
  1132   return mdo != NULL && mdo->is_mature();
  1067 C2V_END
  1133 C2V_END
  1068 
  1134 
  1069 C2V_VMENTRY(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level))
  1135 C2V_VMENTRY_0(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level))
  1070   Method* method = JVMCIENV->asMethod(jvmci_method);
  1136   Method* method = JVMCIENV->asMethod(jvmci_method);
  1071   return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL;
  1137   return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL;
  1072 C2V_END
  1138 C2V_END
  1073 
  1139 
  1074 C2V_VMENTRY(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol))
  1140 C2V_VMENTRY_NULL(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol))
  1075   JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL);
  1141   JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL);
  1076   return JVMCIENV->get_jobject(sym);
  1142   return JVMCIENV->get_jobject(sym);
  1077 C2V_END
  1143 C2V_END
  1078 
  1144 
  1079 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) {
  1145 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) {
  1100 
  1166 
  1101   // Invoke the method
  1167   // Invoke the method
  1102   JavaCalls::call(result, method, args, CHECK);
  1168   JavaCalls::call(result, method, args, CHECK);
  1103 }
  1169 }
  1104 
  1170 
  1105 C2V_VMENTRY(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle))
  1171 C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle))
  1106 
  1172 
  1107   if (!thread->has_last_Java_frame()) {
  1173   if (!thread->has_last_Java_frame()) {
  1108     return NULL;
  1174     return NULL;
  1109   }
  1175   }
  1110   Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle));
  1176   Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle));
  1111 
  1177 
  1112   if (env != JavaThread::current()->jni_environment()) {
  1178   requireInHotSpot("iterateFrames", JVMCI_CHECK_NULL);
  1113     JVMCI_THROW_MSG_NULL(InternalError, "getNextStackFrame is only supported for HotSpot stack walking");
       
  1114   }
       
  1115 
  1179 
  1116   HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL);
  1180   HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL);
  1117   Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL);
  1181   Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL);
  1118 
  1182 
  1119   StackFrameStream fst(thread);
  1183   StackFrameStream fst(thread);
  1281     ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1345     ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1282     cp_cache_entry->set_method_handle(cp, callInfo);
  1346     cp_cache_entry->set_method_handle(cp, callInfo);
  1283   }
  1347   }
  1284 C2V_END
  1348 C2V_END
  1285 
  1349 
  1286 C2V_VMENTRY(jint, isResolvedInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
  1350 C2V_VMENTRY_0(jint, isResolvedInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
  1287   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
  1351   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
  1288   ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1352   ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1289   if (cp_cache_entry->is_resolved(Bytecodes::_invokehandle)) {
  1353   if (cp_cache_entry->is_resolved(Bytecodes::_invokehandle)) {
  1290     // MethodHandle.invoke* --> LambdaForm?
  1354     // MethodHandle.invoke* --> LambdaForm?
  1291     ResourceMark rm;
  1355     ResourceMark rm;
  1322   }
  1386   }
  1323   return -1;
  1387   return -1;
  1324 C2V_END
  1388 C2V_END
  1325 
  1389 
  1326 
  1390 
  1327 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject))
  1391 C2V_VMENTRY_NULL(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject))
  1328   JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL);
  1392   JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL);
  1329   JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL);
  1393   JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL);
  1330   JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL);
  1394   JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL);
  1331   JVMCIENV->put_object_at(holders, 0, mh);
  1395   JVMCIENV->put_object_at(holders, 0, mh);
  1332   JVMCIENV->put_object_at(holders, 1, vh);
  1396   JVMCIENV->put_object_at(holders, 1, vh);
  1333   return JVMCIENV->get_jobject(holders);
  1397   return JVMCIENV->get_jobject(holders);
  1334 C2V_END
  1398 C2V_END
  1335 
  1399 
  1336 C2V_VMENTRY(jboolean, shouldDebugNonSafepoints, (JNIEnv* env, jobject))
  1400 C2V_VMENTRY_0(jboolean, shouldDebugNonSafepoints, (JNIEnv* env, jobject))
  1337   //see compute_recording_non_safepoints in debugInfroRec.cpp
  1401   //see compute_recording_non_safepoints in debugInfroRec.cpp
  1338   if (JvmtiExport::should_post_compiled_method_load() && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
  1402   if (JvmtiExport::should_post_compiled_method_load() && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
  1339     return true;
  1403     return true;
  1340   }
  1404   }
  1341   return DebugNonSafepoints;
  1405   return DebugNonSafepoints;
  1346   JVMCIObject hs_frame = JVMCIENV->wrap(_hs_frame);
  1410   JVMCIObject hs_frame = JVMCIENV->wrap(_hs_frame);
  1347   if (hs_frame.is_null()) {
  1411   if (hs_frame.is_null()) {
  1348     JVMCI_THROW_MSG(NullPointerException, "stack frame is null");
  1412     JVMCI_THROW_MSG(NullPointerException, "stack frame is null");
  1349   }
  1413   }
  1350 
  1414 
  1351   if (env != JavaThread::current()->jni_environment()) {
  1415   requireInHotSpot("materializeVirtualObjects", JVMCI_CHECK);
  1352     JVMCI_THROW_MSG(InternalError, "getNextStackFrame is only supported for HotSpot stack walking");
       
  1353   }
       
  1354 
  1416 
  1355   JVMCIENV->HotSpotStackFrameReference_initialize(JVMCI_CHECK);
  1417   JVMCIENV->HotSpotStackFrameReference_initialize(JVMCI_CHECK);
  1356 
  1418 
  1357   // look for the given stack frame
  1419   // look for the given stack frame
  1358   StackFrameStream fst(thread);
  1420   StackFrameStream fst(thread);
  1463     }
  1525     }
  1464   }
  1526   }
  1465   HotSpotJVMCI::HotSpotStackFrameReference::set_objectsMaterialized(JVMCIENV, hs_frame, JNI_TRUE);
  1527   HotSpotJVMCI::HotSpotStackFrameReference::set_objectsMaterialized(JVMCIENV, hs_frame, JNI_TRUE);
  1466 C2V_END
  1528 C2V_END
  1467 
  1529 
  1468 C2V_VMENTRY(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length))
  1530 // Creates a scope where the current thread is attached and detached
       
  1531 // from HotSpot if it wasn't already attached when entering the scope.
       
  1532 extern "C" void jio_printf(const char *fmt, ...);
       
  1533 class AttachDetach : public StackObj {
       
  1534  public:
       
  1535   bool _attached;
       
  1536   AttachDetach(JNIEnv* env, Thread* current_thread) {
       
  1537     if (current_thread == NULL) {
       
  1538       extern struct JavaVM_ main_vm;
       
  1539       JNIEnv* hotspotEnv;
       
  1540       jint res = main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL);
       
  1541       _attached = res == JNI_OK;
       
  1542       static volatile int report_attach_error = 0;
       
  1543       if (res != JNI_OK && report_attach_error == 0 && Atomic::cmpxchg(1, &report_attach_error, 0) == 0) {
       
  1544         // Only report an attach error once
       
  1545         jio_printf("Warning: attaching current thread to VM failed with %d (future attach errors are suppressed)\n", res);
       
  1546       }
       
  1547     } else {
       
  1548       _attached = false;
       
  1549     }
       
  1550   }
       
  1551   ~AttachDetach() {
       
  1552     if (_attached && get_current_thread() != NULL) {
       
  1553       extern struct JavaVM_ main_vm;
       
  1554       jint res = main_vm.DetachCurrentThread();
       
  1555       static volatile int report_detach_error = 0;
       
  1556       if (res != JNI_OK && report_detach_error == 0 && Atomic::cmpxchg(1, &report_detach_error, 0) == 0) {
       
  1557         // Only report an attach error once
       
  1558         jio_printf("Warning: detaching current thread from VM failed with %d (future attach errors are suppressed)\n", res);
       
  1559       }
       
  1560     }
       
  1561   }
       
  1562 };
       
  1563 
       
  1564 C2V_VMENTRY_PREFIX(jint, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length, bool flush, bool can_throw))
       
  1565   AttachDetach ad(env, base_thread);
       
  1566   bool use_tty = true;
       
  1567   if (base_thread == NULL) {
       
  1568     if (!ad._attached) {
       
  1569       // Can only use tty if the current thread is attached
       
  1570       return 0;
       
  1571     }
       
  1572     base_thread = get_current_thread();
       
  1573   }
       
  1574   JVMCITraceMark jtm("writeDebugOutput");
       
  1575   assert(base_thread->is_Java_thread(), "just checking");
       
  1576   JavaThread* thread = (JavaThread*) base_thread;
       
  1577   C2V_BLOCK(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length))
  1469   if (bytes == NULL) {
  1578   if (bytes == NULL) {
  1470     JVMCI_THROW(NullPointerException);
  1579     if (can_throw) {
       
  1580       JVMCI_THROW_0(NullPointerException);
       
  1581     }
       
  1582     return -1;
  1471   }
  1583   }
  1472   JVMCIPrimitiveArray array = JVMCIENV->wrap(bytes);
  1584   JVMCIPrimitiveArray array = JVMCIENV->wrap(bytes);
  1473 
  1585 
  1474   // Check if offset and length are non negative.
  1586   // Check if offset and length are non negative.
  1475   if (offset < 0 || length < 0) {
  1587   if (offset < 0 || length < 0) {
  1476     JVMCI_THROW(ArrayIndexOutOfBoundsException);
  1588     if (can_throw) {
       
  1589       JVMCI_THROW_0(ArrayIndexOutOfBoundsException);
       
  1590     }
       
  1591     return -2;
  1477   }
  1592   }
  1478   // Check if the range is valid.
  1593   // Check if the range is valid.
  1479   int array_length = JVMCIENV->get_length(array);
  1594   int array_length = JVMCIENV->get_length(array);
  1480   if ((((unsigned int) length + (unsigned int) offset) > (unsigned int) array_length)) {
  1595   if ((((unsigned int) length + (unsigned int) offset) > (unsigned int) array_length)) {
  1481     JVMCI_THROW(ArrayIndexOutOfBoundsException);
  1596     if (can_throw) {
       
  1597       JVMCI_THROW_0(ArrayIndexOutOfBoundsException);
       
  1598     }
       
  1599     return -2;
  1482   }
  1600   }
  1483   jbyte buffer[O_BUFLEN];
  1601   jbyte buffer[O_BUFLEN];
  1484   while (length > 0) {
  1602   while (length > 0) {
  1485     int copy_len = MIN2(length, (jint)O_BUFLEN);
  1603     int copy_len = MIN2(length, (jint)O_BUFLEN);
  1486     JVMCIENV->copy_bytes_to(array, buffer, offset, copy_len);
  1604     JVMCIENV->copy_bytes_to(array, buffer, offset, copy_len);
  1487     tty->write((char*) buffer, copy_len);
  1605     tty->write((char*) buffer, copy_len);
  1488     length -= O_BUFLEN;
  1606     length -= O_BUFLEN;
  1489     offset += O_BUFLEN;
  1607     offset += O_BUFLEN;
  1490   }
  1608   }
       
  1609   if (flush) {
       
  1610     tty->flush();
       
  1611   }
       
  1612   return 0;
  1491 C2V_END
  1613 C2V_END
  1492 
  1614 
  1493 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv* env, jobject))
  1615 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv* env, jobject))
  1494   tty->flush();
  1616   tty->flush();
  1495 C2V_END
  1617 C2V_END
  1496 
  1618 
  1497 C2V_VMENTRY(int, methodDataProfileDataSize, (JNIEnv* env, jobject, jlong metaspace_method_data, jint position))
  1619 C2V_VMENTRY_0(int, methodDataProfileDataSize, (JNIEnv* env, jobject, jlong metaspace_method_data, jint position))
  1498   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
  1620   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
  1499   ProfileData* profile_data = mdo->data_at(position);
  1621   ProfileData* profile_data = mdo->data_at(position);
  1500   if (mdo->is_valid(profile_data)) {
  1622   if (mdo->is_valid(profile_data)) {
  1501     return profile_data->size_in_bytes();
  1623     return profile_data->size_in_bytes();
  1502   }
  1624   }
  1510     }
  1632     }
  1511   }
  1633   }
  1512   JVMCI_THROW_MSG_0(IllegalArgumentException, err_msg("Invalid profile data position %d", position));
  1634   JVMCI_THROW_MSG_0(IllegalArgumentException, err_msg("Invalid profile data position %d", position));
  1513 C2V_END
  1635 C2V_END
  1514 
  1636 
  1515 C2V_VMENTRY(jlong, getFingerprint, (JNIEnv* env, jobject, jlong metaspace_klass))
  1637 C2V_VMENTRY_0(jlong, getFingerprint, (JNIEnv* env, jobject, jlong metaspace_klass))
  1516 #if INCLUDE_AOT
  1638 #if INCLUDE_AOT
  1517   Klass *k = (Klass*) (address) metaspace_klass;
  1639   Klass *k = (Klass*) (address) metaspace_klass;
  1518   if (k->is_instance_klass()) {
  1640   if (k->is_instance_klass()) {
  1519     return InstanceKlass::cast(k)->get_stored_fingerprint();
  1641     return InstanceKlass::cast(k)->get_stored_fingerprint();
  1520   } else {
  1642   } else {
  1523 #else
  1645 #else
  1524   JVMCI_THROW_MSG_0(InternalError, "unimplemented");
  1646   JVMCI_THROW_MSG_0(InternalError, "unimplemented");
  1525 #endif
  1647 #endif
  1526 C2V_END
  1648 C2V_END
  1527 
  1649 
  1528 C2V_VMENTRY(jobject, getHostClass, (JNIEnv* env, jobject, jobject jvmci_type))
  1650 C2V_VMENTRY_NULL(jobject, getHostClass, (JNIEnv* env, jobject, jobject jvmci_type))
  1529   InstanceKlass* k = InstanceKlass::cast(JVMCIENV->asKlass(jvmci_type));
  1651   InstanceKlass* k = InstanceKlass::cast(JVMCIENV->asKlass(jvmci_type));
  1530   InstanceKlass* host = k->unsafe_anonymous_host();
  1652   InstanceKlass* host = k->unsafe_anonymous_host();
  1531   JVMCIKlassHandle handle(THREAD, host);
  1653   JVMCIKlassHandle handle(THREAD, host);
  1532   JVMCIObject result = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
  1654   JVMCIObject result = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
  1533   return JVMCIENV->get_jobject(result);
  1655   return JVMCIENV->get_jobject(result);
  1534 C2V_END
  1656 C2V_END
  1535 
  1657 
  1536 C2V_VMENTRY(jobject, getInterfaces, (JNIEnv* env, jobject, jobject jvmci_type))
  1658 C2V_VMENTRY_NULL(jobject, getInterfaces, (JNIEnv* env, jobject, jobject jvmci_type))
  1537   if (jvmci_type == NULL) {
  1659   if (jvmci_type == NULL) {
  1538     JVMCI_THROW_0(NullPointerException);
  1660     JVMCI_THROW_0(NullPointerException);
  1539   }
  1661   }
  1540 
  1662 
  1541   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  1663   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  1558     JVMCIENV->put_object_at(interfaces, index, type);
  1680     JVMCIENV->put_object_at(interfaces, index, type);
  1559   }
  1681   }
  1560   return JVMCIENV->get_jobject(interfaces);
  1682   return JVMCIENV->get_jobject(interfaces);
  1561 C2V_END
  1683 C2V_END
  1562 
  1684 
  1563 C2V_VMENTRY(jobject, getComponentType, (JNIEnv* env, jobject, jobject jvmci_type))
  1685 C2V_VMENTRY_NULL(jobject, getComponentType, (JNIEnv* env, jobject, jobject jvmci_type))
  1564   if (jvmci_type == NULL) {
  1686   if (jvmci_type == NULL) {
  1565     JVMCI_THROW_0(NullPointerException);
  1687     JVMCI_THROW_0(NullPointerException);
  1566   }
  1688   }
  1567 
  1689 
  1568   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  1690   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  1598     InstanceKlass* k = InstanceKlass::cast(klass);
  1720     InstanceKlass* k = InstanceKlass::cast(klass);
  1599     k->initialize(CHECK);
  1721     k->initialize(CHECK);
  1600   }
  1722   }
  1601 C2V_END
  1723 C2V_END
  1602 
  1724 
  1603 C2V_VMENTRY(int, interpreterFrameSize, (JNIEnv* env, jobject, jobject bytecode_frame_handle))
  1725 C2V_VMENTRY_0(int, interpreterFrameSize, (JNIEnv* env, jobject, jobject bytecode_frame_handle))
  1604   if (bytecode_frame_handle == NULL) {
  1726   if (bytecode_frame_handle == NULL) {
  1605     JVMCI_THROW_0(NullPointerException);
  1727     JVMCI_THROW_0(NullPointerException);
  1606   }
  1728   }
  1607 
  1729 
  1608   JVMCIObject top_bytecode_frame = JVMCIENV->wrap(bytecode_frame_handle);
  1730   JVMCIObject top_bytecode_frame = JVMCIENV->wrap(bytecode_frame_handle);
  1646     JVMCI_THROW_MSG(IllegalArgumentException,
  1768     JVMCI_THROW_MSG(IllegalArgumentException,
  1647                     err_msg("Unexpected type: %s", lambda_form->klass()->external_name()))
  1769                     err_msg("Unexpected type: %s", lambda_form->klass()->external_name()))
  1648   }
  1770   }
  1649 C2V_END
  1771 C2V_END
  1650 
  1772 
  1651 C2V_VMENTRY(int, getIdentityHashCode, (JNIEnv* env, jobject, jobject object))
  1773 C2V_VMENTRY_0(int, getIdentityHashCode, (JNIEnv* env, jobject, jobject object))
  1652   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1774   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1653   return obj->identity_hash();
  1775   return obj->identity_hash();
  1654 C2V_END
  1776 C2V_END
  1655 
  1777 
  1656 C2V_VMENTRY(jboolean, isInternedString, (JNIEnv* env, jobject, jobject object))
  1778 C2V_VMENTRY_0(jboolean, isInternedString, (JNIEnv* env, jobject, jobject object))
  1657   Handle str = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1779   Handle str = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1658   if (!java_lang_String::is_instance(str())) {
  1780   if (!java_lang_String::is_instance(str())) {
  1659     return false;
  1781     return false;
  1660   }
  1782   }
  1661   int len;
  1783   int len;
  1662   jchar* name = java_lang_String::as_unicode_string(str(), len, CHECK_0);
  1784   jchar* name = java_lang_String::as_unicode_string(str(), len, CHECK_0);
  1663   return (StringTable::lookup(name, len) != NULL);
  1785   return (StringTable::lookup(name, len) != NULL);
  1664 C2V_END
  1786 C2V_END
  1665 
  1787 
  1666 
  1788 
  1667 C2V_VMENTRY(jobject, unboxPrimitive, (JNIEnv* env, jobject, jobject object))
  1789 C2V_VMENTRY_NULL(jobject, unboxPrimitive, (JNIEnv* env, jobject, jobject object))
  1668   if (object == NULL) {
  1790   if (object == NULL) {
  1669     JVMCI_THROW_0(NullPointerException);
  1791     JVMCI_THROW_0(NullPointerException);
  1670   }
  1792   }
  1671   Handle box = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  1793   Handle box = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  1672   BasicType type = java_lang_boxing_object::basic_type(box());
  1794   BasicType type = java_lang_boxing_object::basic_type(box());
  1676   }
  1798   }
  1677   JVMCIObject boxResult = JVMCIENV->create_box(type, &result, JVMCI_CHECK_NULL);
  1799   JVMCIObject boxResult = JVMCIENV->create_box(type, &result, JVMCI_CHECK_NULL);
  1678   return JVMCIENV->get_jobject(boxResult);
  1800   return JVMCIENV->get_jobject(boxResult);
  1679 C2V_END
  1801 C2V_END
  1680 
  1802 
  1681 C2V_VMENTRY(jobject, boxPrimitive, (JNIEnv* env, jobject, jobject object))
  1803 C2V_VMENTRY_NULL(jobject, boxPrimitive, (JNIEnv* env, jobject, jobject object))
  1682   if (object == NULL) {
  1804   if (object == NULL) {
  1683     JVMCI_THROW_0(NullPointerException);
  1805     JVMCI_THROW_0(NullPointerException);
  1684   }
  1806   }
  1685   JVMCIObject box = JVMCIENV->wrap(object);
  1807   JVMCIObject box = JVMCIENV->wrap(object);
  1686   BasicType type = JVMCIENV->get_box_type(box);
  1808   BasicType type = JVMCIENV->get_box_type(box);
  1720   oop hotspot_box = (oop) box_result.get_jobject();
  1842   oop hotspot_box = (oop) box_result.get_jobject();
  1721   JVMCIObject result = JVMCIENV->get_object_constant(hotspot_box, false);
  1843   JVMCIObject result = JVMCIENV->get_object_constant(hotspot_box, false);
  1722   return JVMCIENV->get_jobject(result);
  1844   return JVMCIENV->get_jobject(result);
  1723 C2V_END
  1845 C2V_END
  1724 
  1846 
  1725 C2V_VMENTRY(jobjectArray, getDeclaredConstructors, (JNIEnv* env, jobject, jobject holder))
  1847 C2V_VMENTRY_NULL(jobjectArray, getDeclaredConstructors, (JNIEnv* env, jobject, jobject holder))
  1726   if (holder == NULL) {
  1848   if (holder == NULL) {
  1727     JVMCI_THROW_0(NullPointerException);
  1849     JVMCI_THROW_0(NullPointerException);
  1728   }
  1850   }
  1729   Klass* klass = JVMCIENV->asKlass(holder);
  1851   Klass* klass = JVMCIENV->asKlass(holder);
  1730   if (!klass->is_instance_klass()) {
  1852   if (!klass->is_instance_klass()) {
  1749     JVMCIENV->put_object_at(methods, i, method);
  1871     JVMCIENV->put_object_at(methods, i, method);
  1750   }
  1872   }
  1751   return JVMCIENV->get_jobjectArray(methods);
  1873   return JVMCIENV->get_jobjectArray(methods);
  1752 C2V_END
  1874 C2V_END
  1753 
  1875 
  1754 C2V_VMENTRY(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
  1876 C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
  1755   if (holder == NULL) {
  1877   if (holder == NULL) {
  1756     JVMCI_THROW_0(NullPointerException);
  1878     JVMCI_THROW_0(NullPointerException);
  1757   }
  1879   }
  1758   Klass* klass = JVMCIENV->asKlass(holder);
  1880   Klass* klass = JVMCIENV->asKlass(holder);
  1759   if (!klass->is_instance_klass()) {
  1881   if (!klass->is_instance_klass()) {
  1778     JVMCIENV->put_object_at(methods, i, method);
  1900     JVMCIENV->put_object_at(methods, i, method);
  1779   }
  1901   }
  1780   return JVMCIENV->get_jobjectArray(methods);
  1902   return JVMCIENV->get_jobjectArray(methods);
  1781 C2V_END
  1903 C2V_END
  1782 
  1904 
  1783 C2V_VMENTRY(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
  1905 C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
  1784   if (object == NULL || field == NULL) {
  1906   if (object == NULL || field == NULL) {
  1785     JVMCI_THROW_0(NullPointerException);
  1907     JVMCI_THROW_0(NullPointerException);
  1786   }
  1908   }
  1787   JVMCIObject field_object = JVMCIENV->wrap(field);
  1909   JVMCIObject field_object = JVMCIENV->wrap(field);
  1788   JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
  1910   JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
  1846   }
  1968   }
  1847   JVMCIObject result = JVMCIENV->call_PrimitiveConstant_forTypeChar(type2char(constant_type), value, JVMCI_CHECK_NULL);
  1969   JVMCIObject result = JVMCIENV->call_PrimitiveConstant_forTypeChar(type2char(constant_type), value, JVMCI_CHECK_NULL);
  1848   return JVMCIENV->get_jobject(result);
  1970   return JVMCIENV->get_jobject(result);
  1849 C2V_END
  1971 C2V_END
  1850 
  1972 
  1851 C2V_VMENTRY(jboolean, isInstance, (JNIEnv* env, jobject, jobject holder, jobject object))
  1973 C2V_VMENTRY_0(jboolean, isInstance, (JNIEnv* env, jobject, jobject holder, jobject object))
  1852   if (object == NULL || holder == NULL) {
  1974   if (object == NULL || holder == NULL) {
  1853     JVMCI_THROW_0(NullPointerException);
  1975     JVMCI_THROW_0(NullPointerException);
  1854   }
  1976   }
  1855   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1977   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0);
  1856   Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder));
  1978   Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder));
  1857   return obj->is_a(klass);
  1979   return obj->is_a(klass);
  1858 C2V_END
  1980 C2V_END
  1859 
  1981 
  1860 C2V_VMENTRY(jboolean, isAssignableFrom, (JNIEnv* env, jobject, jobject holder, jobject otherHolder))
  1982 C2V_VMENTRY_0(jboolean, isAssignableFrom, (JNIEnv* env, jobject, jobject holder, jobject otherHolder))
  1861   if (holder == NULL || otherHolder == NULL) {
  1983   if (holder == NULL || otherHolder == NULL) {
  1862     JVMCI_THROW_0(NullPointerException);
  1984     JVMCI_THROW_0(NullPointerException);
  1863   }
  1985   }
  1864   Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder));
  1986   Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder));
  1865   Klass* otherKlass = JVMCIENV->asKlass(JVMCIENV->wrap(otherHolder));
  1987   Klass* otherKlass = JVMCIENV->asKlass(JVMCIENV->wrap(otherHolder));
  1866   return otherKlass->is_subtype_of(klass);
  1988   return otherKlass->is_subtype_of(klass);
  1867 C2V_END
  1989 C2V_END
  1868 
  1990 
  1869 C2V_VMENTRY(jboolean, isTrustedForIntrinsics, (JNIEnv* env, jobject, jobject holder))
  1991 C2V_VMENTRY_0(jboolean, isTrustedForIntrinsics, (JNIEnv* env, jobject, jobject holder))
  1870   if (holder == NULL) {
  1992   if (holder == NULL) {
  1871     JVMCI_THROW_0(NullPointerException);
  1993     JVMCI_THROW_0(NullPointerException);
  1872   }
  1994   }
  1873   InstanceKlass* ik = InstanceKlass::cast(JVMCIENV->asKlass(JVMCIENV->wrap(holder)));
  1995   InstanceKlass* ik = InstanceKlass::cast(JVMCIENV->asKlass(JVMCIENV->wrap(holder)));
  1874   if (ik->class_loader_data()->is_builtin_class_loader_data()) {
  1996   if (ik->class_loader_data()->is_builtin_class_loader_data()) {
  1875     return true;
  1997     return true;
  1876   }
  1998   }
  1877   return false;
  1999   return false;
  1878 C2V_END
  2000 C2V_END
  1879 
  2001 
  1880 C2V_VMENTRY(jobject, asJavaType, (JNIEnv* env, jobject, jobject object))
  2002 C2V_VMENTRY_NULL(jobject, asJavaType, (JNIEnv* env, jobject, jobject object))
  1881   if (object == NULL) {
  2003   if (object == NULL) {
  1882     JVMCI_THROW_0(NullPointerException);
  2004     JVMCI_THROW_0(NullPointerException);
  1883   }
  2005   }
  1884   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  2006   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  1885   if (java_lang_Class::is_instance(obj())) {
  2007   if (java_lang_Class::is_instance(obj())) {
  1895   }
  2017   }
  1896   return NULL;
  2018   return NULL;
  1897 C2V_END
  2019 C2V_END
  1898 
  2020 
  1899 
  2021 
  1900 C2V_VMENTRY(jobject, asString, (JNIEnv* env, jobject, jobject object))
  2022 C2V_VMENTRY_NULL(jobject, asString, (JNIEnv* env, jobject, jobject object))
  1901   if (object == NULL) {
  2023   if (object == NULL) {
  1902     JVMCI_THROW_0(NullPointerException);
  2024     JVMCI_THROW_0(NullPointerException);
  1903   }
  2025   }
  1904   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  2026   Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL);
  1905   const char* str = java_lang_String::as_utf8_string(obj());
  2027   const char* str = java_lang_String::as_utf8_string(obj());
  1906   JVMCIObject result = JVMCIENV->create_string(str, JVMCI_CHECK_NULL);
  2028   JVMCIObject result = JVMCIENV->create_string(str, JVMCI_CHECK_NULL);
  1907   return JVMCIENV->get_jobject(result);
  2029   return JVMCIENV->get_jobject(result);
  1908 C2V_END
  2030 C2V_END
  1909 
  2031 
  1910 
  2032 
  1911 C2V_VMENTRY(jboolean, equals, (JNIEnv* env, jobject, jobject x, jlong xHandle, jobject y, jlong yHandle))
  2033 C2V_VMENTRY_0(jboolean, equals, (JNIEnv* env, jobject, jobject x, jlong xHandle, jobject y, jlong yHandle))
  1912   if (x == NULL || y == NULL) {
  2034   if (x == NULL || y == NULL) {
  1913     JVMCI_THROW_0(NullPointerException);
  2035     JVMCI_THROW_0(NullPointerException);
  1914   }
  2036   }
  1915   return JVMCIENV->resolve_handle(xHandle) == JVMCIENV->resolve_handle(yHandle);
  2037   return JVMCIENV->resolve_handle(xHandle) == JVMCIENV->resolve_handle(yHandle);
  1916 C2V_END
  2038 C2V_END
  1917 
  2039 
  1918 C2V_VMENTRY(jobject, getJavaMirror, (JNIEnv* env, jobject, jobject object))
  2040 C2V_VMENTRY_NULL(jobject, getJavaMirror, (JNIEnv* env, jobject, jobject object))
  1919   if (object == NULL) {
  2041   if (object == NULL) {
  1920     JVMCI_THROW_0(NullPointerException);
  2042     JVMCI_THROW_0(NullPointerException);
  1921   }
  2043   }
  1922   JVMCIObject base_object = JVMCIENV->wrap(object);
  2044   JVMCIObject base_object = JVMCIENV->wrap(object);
  1923   Handle mirror;
  2045   Handle mirror;
  1932   JVMCIObject result = JVMCIENV->get_object_constant(mirror());
  2054   JVMCIObject result = JVMCIENV->get_object_constant(mirror());
  1933   return JVMCIENV->get_jobject(result);
  2055   return JVMCIENV->get_jobject(result);
  1934 C2V_END
  2056 C2V_END
  1935 
  2057 
  1936 
  2058 
  1937 C2V_VMENTRY(jint, getArrayLength, (JNIEnv* env, jobject, jobject x))
  2059 C2V_VMENTRY_0(jint, getArrayLength, (JNIEnv* env, jobject, jobject x))
  1938   if (x == NULL) {
  2060   if (x == NULL) {
  1939     JVMCI_THROW_0(NullPointerException);
  2061     JVMCI_THROW_0(NullPointerException);
  1940   }
  2062   }
  1941   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2063   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  1942   if (xobj->klass()->is_array_klass()) {
  2064   if (xobj->klass()->is_array_klass()) {
  1944   }
  2066   }
  1945   return -1;
  2067   return -1;
  1946  C2V_END
  2068  C2V_END
  1947 
  2069 
  1948 
  2070 
  1949 C2V_VMENTRY(jobject, readArrayElement, (JNIEnv* env, jobject, jobject x, int index))
  2071 C2V_VMENTRY_NULL(jobject, readArrayElement, (JNIEnv* env, jobject, jobject x, int index))
  1950   if (x == NULL) {
  2072   if (x == NULL) {
  1951     JVMCI_THROW_0(NullPointerException);
  2073     JVMCI_THROW_0(NullPointerException);
  1952   }
  2074   }
  1953   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_NULL);
  2075   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_NULL);
  1954   if (xobj->klass()->is_array_klass()) {
  2076   if (xobj->klass()->is_array_klass()) {
  1984   }
  2106   }
  1985   return NULL;;
  2107   return NULL;;
  1986 C2V_END
  2108 C2V_END
  1987 
  2109 
  1988 
  2110 
  1989 C2V_VMENTRY(jint, arrayBaseOffset, (JNIEnv* env, jobject, jobject kind))
  2111 C2V_VMENTRY_0(jint, arrayBaseOffset, (JNIEnv* env, jobject, jobject kind))
  1990   if (kind == NULL) {
  2112   if (kind == NULL) {
  1991     JVMCI_THROW_0(NullPointerException);
  2113     JVMCI_THROW_0(NullPointerException);
  1992   }
  2114   }
  1993   BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0);
  2115   BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0);
  1994   return arrayOopDesc::header_size(type) * HeapWordSize;
  2116   return arrayOopDesc::header_size(type) * HeapWordSize;
  1995 C2V_END
  2117 C2V_END
  1996 
  2118 
  1997 C2V_VMENTRY(jint, arrayIndexScale, (JNIEnv* env, jobject, jobject kind))
  2119 C2V_VMENTRY_0(jint, arrayIndexScale, (JNIEnv* env, jobject, jobject kind))
  1998   if (kind == NULL) {
  2120   if (kind == NULL) {
  1999     JVMCI_THROW_0(NullPointerException);
  2121     JVMCI_THROW_0(NullPointerException);
  2000   }
  2122   }
  2001   BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0);
  2123   BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0);
  2002   return type2aelembytes(type);
  2124   return type2aelembytes(type);
  2003 C2V_END
  2125 C2V_END
  2004 
  2126 
  2005 C2V_VMENTRY(jbyte, getByte, (JNIEnv* env, jobject, jobject x, long displacement))
  2127 C2V_VMENTRY_0(jbyte, getByte, (JNIEnv* env, jobject, jobject x, long displacement))
  2006   if (x == NULL) {
  2128   if (x == NULL) {
  2007     JVMCI_THROW_0(NullPointerException);
  2129     JVMCI_THROW_0(NullPointerException);
  2008   }
  2130   }
  2009   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2131   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2010   return xobj->byte_field(displacement);
  2132   return xobj->byte_field(displacement);
  2011 }
  2133 }
  2012 
  2134 
  2013 C2V_VMENTRY(jshort, getShort, (JNIEnv* env, jobject, jobject x, long displacement))
  2135 C2V_VMENTRY_0(jshort, getShort, (JNIEnv* env, jobject, jobject x, long displacement))
  2014   if (x == NULL) {
  2136   if (x == NULL) {
  2015     JVMCI_THROW_0(NullPointerException);
  2137     JVMCI_THROW_0(NullPointerException);
  2016   }
  2138   }
  2017   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2139   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2018   return xobj->short_field(displacement);
  2140   return xobj->short_field(displacement);
  2019 }
  2141 }
  2020 
  2142 
  2021 C2V_VMENTRY(jint, getInt, (JNIEnv* env, jobject, jobject x, long displacement))
  2143 C2V_VMENTRY_0(jint, getInt, (JNIEnv* env, jobject, jobject x, long displacement))
  2022   if (x == NULL) {
  2144   if (x == NULL) {
  2023     JVMCI_THROW_0(NullPointerException);
  2145     JVMCI_THROW_0(NullPointerException);
  2024   }
  2146   }
  2025   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2147   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2026   return xobj->int_field(displacement);
  2148   return xobj->int_field(displacement);
  2027 }
  2149 }
  2028 
  2150 
  2029 C2V_VMENTRY(jlong, getLong, (JNIEnv* env, jobject, jobject x, long displacement))
  2151 C2V_VMENTRY_0(jlong, getLong, (JNIEnv* env, jobject, jobject x, long displacement))
  2030   if (x == NULL) {
  2152   if (x == NULL) {
  2031     JVMCI_THROW_0(NullPointerException);
  2153     JVMCI_THROW_0(NullPointerException);
  2032   }
  2154   }
  2033   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2155   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2034   return xobj->long_field(displacement);
  2156   return xobj->long_field(displacement);
  2035 }
  2157 }
  2036 
  2158 
  2037 C2V_VMENTRY(jobject, getObject, (JNIEnv* env, jobject, jobject x, long displacement))
  2159 C2V_VMENTRY_NULL(jobject, getObject, (JNIEnv* env, jobject, jobject x, long displacement))
  2038   if (x == NULL) {
  2160   if (x == NULL) {
  2039     JVMCI_THROW_0(NullPointerException);
  2161     JVMCI_THROW_0(NullPointerException);
  2040   }
  2162   }
  2041   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2163   Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
  2042   oop res = xobj->obj_field(displacement);
  2164   oop res = xobj->obj_field(displacement);
  2050     assert(JVMCI::is_global_handle(handle), "Invalid delete of global JNI handle");
  2172     assert(JVMCI::is_global_handle(handle), "Invalid delete of global JNI handle");
  2051     *((oop*)handle) = NULL; // Mark the handle as deleted, allocate will reuse it
  2173     *((oop*)handle) = NULL; // Mark the handle as deleted, allocate will reuse it
  2052   }
  2174   }
  2053 }
  2175 }
  2054 
  2176 
  2055 C2V_VMENTRY(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror))
  2177 static void requireJVMCINativeLibrary(JVMCI_TRAPS) {
  2056   if (!UseJVMCINativeLibrary) {
  2178   if (!UseJVMCINativeLibrary) {
  2057     JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)");
  2179     JVMCI_THROW_MSG(UnsupportedOperationException, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)");
  2058   }
  2180   }
  2059   if (!JVMCIENV->is_hotspot()) {
  2181 }
  2060     JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "Cannot call registerNativeMethods from JVMCI shared library");
  2182 
  2061   }
  2183 static JavaVM* requireNativeLibraryJavaVM(const char* caller, JVMCI_TRAPS) {
       
  2184   JavaVM* javaVM = JVMCIEnv::get_shared_library_javavm();
       
  2185   if (javaVM == NULL) {
       
  2186     JVMCI_THROW_MSG_NULL(IllegalStateException, err_msg("Require JVMCI shared library to be initialized in %s", caller));
       
  2187   }
       
  2188   return javaVM;
       
  2189 }
       
  2190 
       
  2191 C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror))
       
  2192   requireJVMCINativeLibrary(JVMCI_CHECK_NULL);
       
  2193   requireInHotSpot("registerNativeMethods", JVMCI_CHECK_NULL);
  2062   void* shared_library = JVMCIEnv::get_shared_library_handle();
  2194   void* shared_library = JVMCIEnv::get_shared_library_handle();
  2063   if (shared_library == NULL) {
  2195   if (shared_library == NULL) {
  2064     // Ensure the JVMCI shared library runtime is initialized.
  2196     // Ensure the JVMCI shared library runtime is initialized.
  2065     JVMCIEnv __peer_jvmci_env__(false, __FILE__, __LINE__);
  2197     JVMCIEnv __peer_jvmci_env__(thread, false, __FILE__, __LINE__);
  2066     JVMCIEnv* peerEnv = &__peer_jvmci_env__;
  2198     JVMCIEnv* peerEnv = &__peer_jvmci_env__;
  2067     HandleMark hm;
  2199     HandleMark hm;
  2068     JVMCIRuntime* runtime = JVMCI::compiler_runtime();
  2200     JVMCIRuntime* runtime = JVMCI::compiler_runtime();
  2069     JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
  2201     JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
  2070     if (peerEnv->has_pending_exception()) {
  2202     if (peerEnv->has_pending_exception()) {
  2071       peerEnv->describe_pending_exception(true);
  2203       peerEnv->describe_pending_exception(true);
       
  2204     }
       
  2205     shared_library = JVMCIEnv::get_shared_library_handle();
       
  2206     if (shared_library == NULL) {
  2072       JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime");
  2207       JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime");
  2073     }
  2208     }
  2074     shared_library = JVMCIEnv::get_shared_library_handle();
       
  2075   }
       
  2076 
       
  2077   if (shared_library == NULL) {
       
  2078     JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "JVMCI shared library is unavailable");
       
  2079   }
  2209   }
  2080 
  2210 
  2081   if (mirror == NULL) {
  2211   if (mirror == NULL) {
  2082     JVMCI_THROW_0(NullPointerException);
  2212     JVMCI_THROW_0(NullPointerException);
  2083   }
  2213   }
  2111         char* long_name = NativeLookup::long_jni_name(method);
  2241         char* long_name = NativeLookup::long_jni_name(method);
  2112         os::print_jni_name_prefix_on(&st, args_size);
  2242         os::print_jni_name_prefix_on(&st, args_size);
  2113         st.print_raw(pure_name);
  2243         st.print_raw(pure_name);
  2114         st.print_raw(long_name);
  2244         st.print_raw(long_name);
  2115         os::print_jni_name_suffix_on(&st, args_size);
  2245         os::print_jni_name_suffix_on(&st, args_size);
  2116         jni_name = st.as_string();
  2246         char* jni_long_name = st.as_string();
  2117         entry = (address) os::dll_lookup(shared_library, jni_name);
  2247         entry = (address) os::dll_lookup(shared_library, jni_long_name);
       
  2248         if (entry == NULL) {
       
  2249           JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
       
  2250               method->name_and_sig_as_C_string(),
       
  2251               jni_name, jni_long_name, JVMCIEnv::get_shared_library_path()));
       
  2252         }
  2118       }
  2253       }
  2119       if (entry == NULL) {
  2254 
  2120         JVMCI_THROW_MSG_0(UnsatisfiedLinkError, method->name_and_sig_as_C_string());
       
  2121       }
       
  2122       if (method->has_native_function() && entry != method->native_function()) {
  2255       if (method->has_native_function() && entry != method->native_function()) {
  2123         JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("Cannot overwrite existing native implementation for %s",
  2256         JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
  2124             method->name_and_sig_as_C_string()));
  2257             method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
  2125       }
  2258       }
  2126       method->set_native_function(entry, Method::native_bind_event_is_interesting);
  2259       method->set_native_function(entry, Method::native_bind_event_is_interesting);
  2127       if (PrintJNIResolving) {
  2260       if (PrintJNIResolving) {
  2128         tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]",
  2261         tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]",
  2129           method->method_holder()->external_name(),
  2262           method->method_holder()->external_name(),
  2139   JVMCIENV->put_long_at(result, 2, (jlong) (address) javaVM->functions->reserved1);
  2272   JVMCIENV->put_long_at(result, 2, (jlong) (address) javaVM->functions->reserved1);
  2140   JVMCIENV->put_long_at(result, 3, (jlong) (address) javaVM->functions->reserved2);
  2273   JVMCIENV->put_long_at(result, 3, (jlong) (address) javaVM->functions->reserved2);
  2141   return (jlongArray) JVMCIENV->get_jobject(result);
  2274   return (jlongArray) JVMCIENV->get_jobject(result);
  2142 }
  2275 }
  2143 
  2276 
  2144 C2V_VMENTRY(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
  2277 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
       
  2278   if (base_thread == NULL) {
       
  2279     // Called from unattached JVMCI shared library thread
       
  2280     return false;
       
  2281   }
       
  2282   JVMCITraceMark jtm("isCurrentThreadAttached");
       
  2283   assert(base_thread->is_Java_thread(), "just checking");
       
  2284   JavaThread* thread = (JavaThread*) base_thread;
       
  2285   if (thread->jni_environment() == env) {
       
  2286     C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
       
  2287     requireJVMCINativeLibrary(JVMCI_CHECK_0);
       
  2288     JavaVM* javaVM = requireNativeLibraryJavaVM("isCurrentThreadAttached", JVMCI_CHECK_0);
       
  2289     JNIEnv* peerEnv;
       
  2290     return javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK;
       
  2291   }
       
  2292   return true;
       
  2293 C2V_END
       
  2294 
       
  2295 C2V_VMENTRY_PREFIX(jboolean, attachCurrentThread, (JNIEnv* env, jobject c2vm, jboolean as_daemon))
       
  2296   if (base_thread == NULL) {
       
  2297     // Called from unattached JVMCI shared library thread
       
  2298     extern struct JavaVM_ main_vm;
       
  2299     JNIEnv* hotspotEnv;
       
  2300     jint res = as_daemon ? main_vm.AttachCurrentThreadAsDaemon((void**)&hotspotEnv, NULL) :
       
  2301                            main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL);
       
  2302     if (res != JNI_OK) {
       
  2303       JNI_THROW_("attachCurrentThread", InternalError, err_msg("Trying to attach thread returned %d", res), false);
       
  2304     }
       
  2305     return true;
       
  2306   }
       
  2307   JVMCITraceMark jtm("attachCurrentThread");
       
  2308   assert(base_thread->is_Java_thread(), "just checking");\
       
  2309   JavaThread* thread = (JavaThread*) base_thread;
       
  2310   if (thread->jni_environment() == env) {
       
  2311     // Called from HotSpot
       
  2312     C2V_BLOCK(jboolean, attachCurrentThread, (JNIEnv* env, jobject, jboolean))
       
  2313     requireJVMCINativeLibrary(JVMCI_CHECK_0);
       
  2314     JavaVM* javaVM = requireNativeLibraryJavaVM("attachCurrentThread", JVMCI_CHECK_0);
       
  2315     JavaVMAttachArgs attach_args;
       
  2316     attach_args.version = JNI_VERSION_1_2;
       
  2317     attach_args.name = thread->name();
       
  2318     attach_args.group = NULL;
       
  2319     JNIEnv* peerEnv;
       
  2320     if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK) {
       
  2321       return false;
       
  2322     }
       
  2323     jint res = as_daemon ? javaVM->AttachCurrentThreadAsDaemon((void**)&peerEnv, &attach_args) :
       
  2324                            javaVM->AttachCurrentThread((void**)&peerEnv, &attach_args);
       
  2325     if (res == JNI_OK) {
       
  2326       guarantee(peerEnv != NULL, "must be");
       
  2327       return true;
       
  2328     }
       
  2329     JVMCI_THROW_MSG_0(InternalError, err_msg("Error %d while attaching %s", res, attach_args.name));
       
  2330   }
       
  2331   // Called from JVMCI shared library
       
  2332   return false;
       
  2333 C2V_END
       
  2334 
       
  2335 C2V_VMENTRY_PREFIX(void, detachCurrentThread, (JNIEnv* env, jobject c2vm))
       
  2336   if (base_thread == NULL) {
       
  2337     // Called from unattached JVMCI shared library thread
       
  2338     JNI_THROW("detachCurrentThread", IllegalStateException, err_msg("Cannot detach non-attached thread"));
       
  2339   }
       
  2340   JVMCITraceMark jtm("detachCurrentThread");
       
  2341   assert(base_thread->is_Java_thread(), "just checking");\
       
  2342   JavaThread* thread = (JavaThread*) base_thread;
       
  2343   if (thread->jni_environment() == env) {
       
  2344     // Called from HotSpot
       
  2345     C2V_BLOCK(void, detachCurrentThread, (JNIEnv* env, jobject))
       
  2346     requireJVMCINativeLibrary(JVMCI_CHECK);
       
  2347     requireInHotSpot("detachCurrentThread", JVMCI_CHECK);
       
  2348     JavaVM* javaVM = requireNativeLibraryJavaVM("detachCurrentThread", JVMCI_CHECK);
       
  2349     JNIEnv* peerEnv;
       
  2350     if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) != JNI_OK) {
       
  2351       JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot detach non-attached thread: %s", thread->name()));
       
  2352     }
       
  2353     jint res = javaVM->DetachCurrentThread();
       
  2354     if (res != JNI_OK) {
       
  2355       JVMCI_THROW_MSG(InternalError, err_msg("Error %d while attaching %s", res, thread->name()));
       
  2356     }
       
  2357   } else {
       
  2358     // Called from attached JVMCI shared library thread
       
  2359     extern struct JavaVM_ main_vm;
       
  2360     jint res = main_vm.DetachCurrentThread();
       
  2361     if (res != JNI_OK) {
       
  2362       JNI_THROW("detachCurrentThread", InternalError, err_msg("Cannot detach non-attached thread"));
       
  2363     }
       
  2364   }
       
  2365 C2V_END
       
  2366 
       
  2367 C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
       
  2368   requireJVMCINativeLibrary(JVMCI_CHECK_0);
  2145   if (obj_handle == NULL) {
  2369   if (obj_handle == NULL) {
  2146     return 0L;
  2370     return 0L;
  2147   }
  2371   }
  2148   JVMCIEnv __peer_jvmci_env__(!JVMCIENV->is_hotspot(), __FILE__, __LINE__);
  2372   JVMCIEnv __peer_jvmci_env__(thread, !JVMCIENV->is_hotspot(), __FILE__, __LINE__);
  2149   JVMCIEnv* peerEnv = &__peer_jvmci_env__;
  2373   JVMCIEnv* peerEnv = &__peer_jvmci_env__;
  2150   JVMCIEnv* thisEnv = JVMCIENV;
  2374   JVMCIEnv* thisEnv = JVMCIENV;
  2151 
  2375 
  2152   JVMCIObject obj = thisEnv->wrap(obj_handle);
  2376   JVMCIObject obj = thisEnv->wrap(obj_handle);
  2153   JVMCIObject result;
  2377   JVMCIObject result;
  2214                 err_msg("Cannot translate object of type: %s", thisEnv->klass_name(obj)));
  2438                 err_msg("Cannot translate object of type: %s", thisEnv->klass_name(obj)));
  2215   }
  2439   }
  2216   return (jlong) peerEnv->make_global(result).as_jobject();
  2440   return (jlong) peerEnv->make_global(result).as_jobject();
  2217 }
  2441 }
  2218 
  2442 
  2219 C2V_VMENTRY(jobject, unhand, (JNIEnv* env, jobject, jlong obj_handle))
  2443 C2V_VMENTRY_NULL(jobject, unhand, (JNIEnv* env, jobject, jlong obj_handle))
       
  2444   requireJVMCINativeLibrary(JVMCI_CHECK_NULL);
  2220   if (obj_handle == 0L) {
  2445   if (obj_handle == 0L) {
  2221     return NULL;
  2446     return NULL;
  2222   }
  2447   }
  2223   jobject global_handle = (jobject) obj_handle;
  2448   jobject global_handle = (jobject) obj_handle;
  2224   JVMCIObject global_handle_obj = JVMCIENV->wrap((jobject) obj_handle);
  2449   JVMCIObject global_handle_obj = JVMCIENV->wrap((jobject) obj_handle);
  2232   JVMCIObject code = JVMCIENV->wrap(code_handle);
  2457   JVMCIObject code = JVMCIENV->wrap(code_handle);
  2233   // Execute this operation for the side effect of updating the InstalledCode state
  2458   // Execute this operation for the side effect of updating the InstalledCode state
  2234   JVMCIENV->asNmethod(code);
  2459   JVMCIENV->asNmethod(code);
  2235 }
  2460 }
  2236 
  2461 
  2237 C2V_VMENTRY(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
  2462 C2V_VMENTRY_NULL(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
  2238   JVMCIObject code = JVMCIENV->wrap(code_handle);
  2463   JVMCIObject code = JVMCIENV->wrap(code_handle);
  2239   CodeBlob* cb = JVMCIENV->asCodeBlob(code);
  2464   CodeBlob* cb = JVMCIENV->asCodeBlob(code);
  2240   if (cb == NULL) {
  2465   if (cb == NULL) {
  2241     return NULL;
  2466     return NULL;
  2242   }
  2467   }
  2244   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
  2469   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
  2245   JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
  2470   JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
  2246   return JVMCIENV->get_jbyteArray(result);
  2471   return JVMCIENV->get_jbyteArray(result);
  2247 }
  2472 }
  2248 
  2473 
  2249 C2V_VMENTRY(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
  2474 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
  2250   if (env != JavaThread::current()->jni_environment()) {
  2475   requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL);
  2251     JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot");
       
  2252   }
       
  2253   methodHandle m = JVMCIENV->asMethod(jvmci_method);
  2476   methodHandle m = JVMCIENV->asMethod(jvmci_method);
  2254   oop executable;
  2477   oop executable;
  2255   if (m->is_initializer()) {
  2478   if (m->is_initializer()) {
  2256     if (m->is_static_initializer()) {
  2479     if (m->is_static_initializer()) {
  2257       JVMCI_THROW_MSG_NULL(IllegalArgumentException,
  2480       JVMCI_THROW_MSG_NULL(IllegalArgumentException,
  2262     executable = Reflection::new_method(m, false, CHECK_NULL);
  2485     executable = Reflection::new_method(m, false, CHECK_NULL);
  2263   }
  2486   }
  2264   return JNIHandles::make_local(THREAD, executable);
  2487   return JNIHandles::make_local(THREAD, executable);
  2265 }
  2488 }
  2266 
  2489 
  2267 C2V_VMENTRY(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
  2490 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
  2268   if (env != JavaThread::current()->jni_environment()) {
  2491   requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
  2269     JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot");
       
  2270   }
       
  2271   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  2492   Klass* klass = JVMCIENV->asKlass(jvmci_type);
  2272   if (!klass->is_instance_klass()) {
  2493   if (!klass->is_instance_klass()) {
  2273     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
  2494     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
  2274         err_msg("Expected non-primitive type, got %s", klass->external_name()));
  2495         err_msg("Expected non-primitive type, got %s", klass->external_name()));
  2275   }
  2496   }
  2282   fieldDescriptor fd(iklass, index);
  2503   fieldDescriptor fd(iklass, index);
  2283   oop reflected = Reflection::new_field(&fd, CHECK_NULL);
  2504   oop reflected = Reflection::new_field(&fd, CHECK_NULL);
  2284   return JNIHandles::make_local(env, reflected);
  2505   return JNIHandles::make_local(env, reflected);
  2285 }
  2506 }
  2286 
  2507 
  2287 C2V_VMENTRY(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
  2508 C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
  2288   FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
  2509   FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
  2289   int result_length = 0;
  2510   int result_length = 0;
  2290   for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
  2511   for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
  2291     result_length++;
  2512     result_length++;
  2292   }
  2513   }
  2314     JVMCIENV->put_object_at(result, result_index++, entry);
  2535     JVMCIENV->put_object_at(result, result_index++, entry);
  2315   }
  2536   }
  2316   return JVMCIENV->get_jobjectArray(result);
  2537   return JVMCIENV->get_jobjectArray(result);
  2317 }
  2538 }
  2318 
  2539 
  2319 C2V_VMENTRY(jlong, getFailedSpeculationsAddress, (JNIEnv* env, jobject, jobject jvmci_method))
  2540 C2V_VMENTRY_0(jlong, getFailedSpeculationsAddress, (JNIEnv* env, jobject, jobject jvmci_method))
  2320   methodHandle method = JVMCIENV->asMethod(jvmci_method);
  2541   methodHandle method = JVMCIENV->asMethod(jvmci_method);
  2321   MethodData* method_data = method->method_data();
  2542   MethodData* method_data = method->method_data();
  2322   if (method_data == NULL) {
  2543   if (method_data == NULL) {
  2323     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
  2544     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
  2324     method_data = MethodData::allocate(loader_data, method, CHECK_0);
  2545     method_data = MethodData::allocate(loader_data, method, CHECK_0);
  2329 
  2550 
  2330 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address))
  2551 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address))
  2331   FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address);
  2552   FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address);
  2332 }
  2553 }
  2333 
  2554 
  2334 C2V_VMENTRY(bool, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj))
  2555 C2V_VMENTRY_0(bool, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj))
  2335   JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj);
  2556   JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj);
  2336   int speculation_len = JVMCIENV->get_length(speculation_handle);
  2557   int speculation_len = JVMCIENV->get_length(speculation_handle);
  2337   char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len);
  2558   char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len);
  2338   JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len);
  2559   JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len);
  2339   return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len);
  2560   return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len);
  2429   {CC "hasCompiledCodeForOSR",                        CC "(" HS_RESOLVED_METHOD "II)Z",                                                     FN_PTR(hasCompiledCodeForOSR)},
  2650   {CC "hasCompiledCodeForOSR",                        CC "(" HS_RESOLVED_METHOD "II)Z",                                                     FN_PTR(hasCompiledCodeForOSR)},
  2430   {CC "getSymbol",                                    CC "(J)" STRING,                                                                      FN_PTR(getSymbol)},
  2651   {CC "getSymbol",                                    CC "(J)" STRING,                                                                      FN_PTR(getSymbol)},
  2431   {CC "iterateFrames",                                CC "([" RESOLVED_METHOD "[" RESOLVED_METHOD "I" INSPECTED_FRAME_VISITOR ")" OBJECT,   FN_PTR(iterateFrames)},
  2652   {CC "iterateFrames",                                CC "([" RESOLVED_METHOD "[" RESOLVED_METHOD "I" INSPECTED_FRAME_VISITOR ")" OBJECT,   FN_PTR(iterateFrames)},
  2432   {CC "materializeVirtualObjects",                    CC "(" HS_STACK_FRAME_REF "Z)V",                                                      FN_PTR(materializeVirtualObjects)},
  2653   {CC "materializeVirtualObjects",                    CC "(" HS_STACK_FRAME_REF "Z)V",                                                      FN_PTR(materializeVirtualObjects)},
  2433   {CC "shouldDebugNonSafepoints",                     CC "()Z",                                                                             FN_PTR(shouldDebugNonSafepoints)},
  2654   {CC "shouldDebugNonSafepoints",                     CC "()Z",                                                                             FN_PTR(shouldDebugNonSafepoints)},
  2434   {CC "writeDebugOutput",                             CC "([BII)V",                                                                         FN_PTR(writeDebugOutput)},
  2655   {CC "writeDebugOutput",                             CC "([BIIZZ)I",                                                                       FN_PTR(writeDebugOutput)},
  2435   {CC "flushDebugOutput",                             CC "()V",                                                                             FN_PTR(flushDebugOutput)},
  2656   {CC "flushDebugOutput",                             CC "()V",                                                                             FN_PTR(flushDebugOutput)},
  2436   {CC "methodDataProfileDataSize",                    CC "(JI)I",                                                                           FN_PTR(methodDataProfileDataSize)},
  2657   {CC "methodDataProfileDataSize",                    CC "(JI)I",                                                                           FN_PTR(methodDataProfileDataSize)},
  2437   {CC "getFingerprint",                               CC "(J)J",                                                                            FN_PTR(getFingerprint)},
  2658   {CC "getFingerprint",                               CC "(J)J",                                                                            FN_PTR(getFingerprint)},
  2438   {CC "getHostClass",                                 CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS,                                       FN_PTR(getHostClass)},
  2659   {CC "getHostClass",                                 CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS,                                       FN_PTR(getHostClass)},
  2439   {CC "interpreterFrameSize",                         CC "(" BYTECODE_FRAME ")I",                                                           FN_PTR(interpreterFrameSize)},
  2660   {CC "interpreterFrameSize",                         CC "(" BYTECODE_FRAME ")I",                                                           FN_PTR(interpreterFrameSize)},
  2467   {CC "getInt",                                       CC "(" OBJECTCONSTANT "J)I",                                                          FN_PTR(getInt)},
  2688   {CC "getInt",                                       CC "(" OBJECTCONSTANT "J)I",                                                          FN_PTR(getInt)},
  2468   {CC "getLong",                                      CC "(" OBJECTCONSTANT "J)J",                                                          FN_PTR(getLong)},
  2689   {CC "getLong",                                      CC "(" OBJECTCONSTANT "J)J",                                                          FN_PTR(getLong)},
  2469   {CC "getObject",                                    CC "(" OBJECTCONSTANT "J)" OBJECTCONSTANT,                                            FN_PTR(getObject)},
  2690   {CC "getObject",                                    CC "(" OBJECTCONSTANT "J)" OBJECTCONSTANT,                                            FN_PTR(getObject)},
  2470   {CC "deleteGlobalHandle",                           CC "(J)V",                                                                            FN_PTR(deleteGlobalHandle)},
  2691   {CC "deleteGlobalHandle",                           CC "(J)V",                                                                            FN_PTR(deleteGlobalHandle)},
  2471   {CC "registerNativeMethods",                        CC "(" CLASS ")[J",                                                                   FN_PTR(registerNativeMethods)},
  2692   {CC "registerNativeMethods",                        CC "(" CLASS ")[J",                                                                   FN_PTR(registerNativeMethods)},
       
  2693   {CC "isCurrentThreadAttached",                      CC "()Z",                                                                             FN_PTR(isCurrentThreadAttached)},
       
  2694   {CC "attachCurrentThread",                          CC "(Z)Z",                                                                            FN_PTR(attachCurrentThread)},
       
  2695   {CC "detachCurrentThread",                          CC "()V",                                                                             FN_PTR(detachCurrentThread)},
  2472   {CC "translate",                                    CC "(" OBJECT ")J",                                                                   FN_PTR(translate)},
  2696   {CC "translate",                                    CC "(" OBJECT ")J",                                                                   FN_PTR(translate)},
  2473   {CC "unhand",                                       CC "(J)" OBJECT,                                                                      FN_PTR(unhand)},
  2697   {CC "unhand",                                       CC "(J)" OBJECT,                                                                      FN_PTR(unhand)},
  2474   {CC "updateHotSpotNmethod",                         CC "(" HS_NMETHOD ")V",                                                               FN_PTR(updateHotSpotNmethod)},
  2698   {CC "updateHotSpotNmethod",                         CC "(" HS_NMETHOD ")V",                                                               FN_PTR(updateHotSpotNmethod)},
  2475   {CC "getCode",                                      CC "(" HS_INSTALLED_CODE ")[B",                                                       FN_PTR(getCode)},
  2699   {CC "getCode",                                      CC "(" HS_INSTALLED_CODE ")[B",                                                       FN_PTR(getCode)},
  2476   {CC "asReflectionExecutable",                       CC "(" HS_RESOLVED_METHOD ")" REFLECTION_EXECUTABLE,                                  FN_PTR(asReflectionExecutable)},
  2700   {CC "asReflectionExecutable",                       CC "(" HS_RESOLVED_METHOD ")" REFLECTION_EXECUTABLE,                                  FN_PTR(asReflectionExecutable)},