Index: vm/include/jit_runtime_support.h =================================================================== --- vm/include/jit_runtime_support.h (revision 541236) +++ vm/include/jit_runtime_support.h (working copy) @@ -702,6 +702,13 @@ } VM_RT_SUPPORT; //VM_RT_SUPPORT +// VM RT helpers can be interrupted differently: +typedef +enum HELPER_INTERRUPTIBILITY_KIND { + INTERRUPTIBLE_NEVER, + INTERRUPTIBLE_SOMETIMES, + INTERRUPTIBLE_ALWAYS +} HELPER_INTERRUPTIBILITY_KIND; //INTERRUPTIBILITY_KIND NativeCodePtr rth_get_lil_helper(VM_RT_SUPPORT f); @@ -727,7 +734,7 @@ * Checks if helper is a suspension point */ -VMEXPORT Boolean vm_helper_is_gc_interruptible(VM_RT_SUPPORT f); +VMEXPORT HELPER_INTERRUPTIBILITY_KIND vm_helper_get_interruptibility_kind(VM_RT_SUPPORT f); #ifdef __cplusplus Index: vm/vmcore/src/jit/jit_runtime_support.cpp =================================================================== --- vm/vmcore/src/jit/jit_runtime_support.cpp (revision 541236) +++ vm/vmcore/src/jit/jit_runtime_support.cpp (working copy) @@ -2403,100 +2403,100 @@ * Checks if helper is a suspension point */ -VMEXPORT Boolean vm_helper_is_gc_interruptible(VM_RT_SUPPORT f) +VMEXPORT HELPER_INTERRUPTIBILITY_KIND vm_helper_get_interruptibility_kind(VM_RT_SUPPORT f) { switch(f) { case VM_RT_MULTIANEWARRAY_RESOLVED: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_LDC_STRING: - return TRUE; + return INTERRUPTIBLE_ALWAYS; // Exceptions case VM_RT_THROW: case VM_RT_THROW_SET_STACK_TRACE: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_THROW_LAZY: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_IDX_OUT_OF_BOUNDS: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_NULL_PTR_EXCEPTION: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_DIVIDE_BY_ZERO_EXCEPTION: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_ARRAY_STORE_EXCEPTION: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_THROW_LINKING_EXCEPTION: - return TRUE; + return INTERRUPTIBLE_ALWAYS; // Type tests case VM_RT_CHECKCAST: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_INSTANCEOF: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_AASTORE: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_AASTORE_TEST: - return TRUE; + return INTERRUPTIBLE_ALWAYS; // Misc case VM_RT_GET_INTERFACE_VTABLE_VER0: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_INITIALIZE_CLASS: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_GC_SAFE_POINT: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_GC_GET_TLS_BASE: - return FALSE; + return INTERRUPTIBLE_NEVER; // JVMTI case VM_RT_JVMTI_METHOD_ENTER_CALLBACK: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_JVMTI_METHOD_EXIT_CALLBACK: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_JVMTI_FIELD_ACCESS_CALLBACK: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_JVMTI_FIELD_MODIFICATION_CALLBACK: - return TRUE; + return INTERRUPTIBLE_ALWAYS; // Non-VM case VM_RT_F2I: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_F2L: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_D2I: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_D2L: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LSHL: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LSHR: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LUSHR: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LMUL: #ifdef VM_LONG_OPT case VM_RT_LMUL_CONST_MULTIPLIER: #endif - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LREM: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_LDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_ULDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_CONST_LDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_CONST_LREM: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_IMUL: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_IREM: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_IDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_FREM: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_FDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_DREM: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_DDIV: - return FALSE; + return INTERRUPTIBLE_NEVER; case VM_RT_NEWOBJ_WITHRESOLVE: case VM_RT_NEWARRAY_WITHRESOLVE: case VM_RT_INITIALIZE_CLASS_WITHRESOLVE: @@ -2508,32 +2508,32 @@ case VM_RT_GET_INVOKEINTERFACE_ADDR_WITHRESOLVE: case VM_RT_GET_INVOKEVIRTUAL_ADDR_WITHRESOLVE: case VM_RT_GET_INVOKE_SPECIAL_ADDR_WITHRESOLVE: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_NEW_VECTOR_USING_VTABLE: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_WRITE_BARRIER_FASTCALL: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_MONITOR_ENTER: case VM_RT_MONITOR_ENTER_NON_NULL: - return TRUE; + return INTERRUPTIBLE_SOMETIMES; case VM_RT_MONITOR_ENTER_STATIC: - return TRUE; + return INTERRUPTIBLE_SOMETIMES; case VM_RT_MONITOR_EXIT: case VM_RT_MONITOR_EXIT_NON_NULL: - return TRUE; + return INTERRUPTIBLE_SOMETIMES; case VM_RT_MONITOR_EXIT_STATIC: - return TRUE; + return INTERRUPTIBLE_SOMETIMES; case VM_RT_CHAR_ARRAYCOPY_NO_EXC: - return TRUE; + return INTERRUPTIBLE_ALWAYS; case VM_RT_GC_HEAP_WRITE_REF: - return FALSE; + return INTERRUPTIBLE_NEVER; default: ASSERT(false, "Unexpected helper id" << f); - return TRUE; + return INTERRUPTIBLE_SOMETIMES; } } Index: vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (revision 541236) +++ vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (working copy) @@ -2238,7 +2238,7 @@ if (!isInternalHelper) { CompilationInterface* ci = CompilationContext::getCurrentContext()->getVMCompilationInterface(); isNonGCVMHelper = rt && rt->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress - && !ci->isGCInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)rt->getValue(0)); + && !ci->mayBeInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)rt->getValue(0)); } bool isGCPoint = !isInternalHelper && !isNonGCVMHelper; return isGCPoint; Index: vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp (revision 541236) +++ vm/jitrino/src/codegenerator/ia32/Ia32BBPolling.cpp (working copy) @@ -393,14 +393,17 @@ if (!ri) { return false; } else { - if ( ri->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress ) { - return true; - } if ( ri->getKind() == Opnd::RuntimeInfo::Kind_MethodDirectAddr && ((MethodDesc*)ri->getValue(0))->isNative() ) { return true; } + CompilationInterface* ci = CompilationContext::getCurrentContext()->getVMCompilationInterface(); + if ( ri->getKind() == Opnd::RuntimeInfo::Kind_HelperAddress && + ci->isInterruptible((CompilationInterface::RuntimeHelperId)(POINTER_SIZE_INT)ri->getValue(0)) ) + { + return true; + } } } return false; Index: vm/jitrino/src/vm/drl/DrlVMInterface.cpp =================================================================== --- vm/jitrino/src/vm/drl/DrlVMInterface.cpp (revision 541236) +++ vm/jitrino/src/vm/drl/DrlVMInterface.cpp (working copy) @@ -595,12 +595,18 @@ } bool -CompilationInterface::isGCInterruptible(RuntimeHelperId runtimeHelperId) { +CompilationInterface::isInterruptible(RuntimeHelperId runtimeHelperId) { VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId); - return vm_helper_is_gc_interruptible(drlHelperId); + return INTERRUPTIBLE_ALWAYS == vm_helper_get_interruptibility_kind(drlHelperId); } +bool +CompilationInterface::mayBeInterruptible(RuntimeHelperId runtimeHelperId) { + VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId); + return INTERRUPTIBLE_NEVER != vm_helper_get_interruptibility_kind(drlHelperId); +} + bool CompilationInterface::compileMethod(MethodDesc *method) { if (Log::isEnabled()) { Index: vm/jitrino/src/vm/VMInterface.h =================================================================== --- vm/jitrino/src/vm/VMInterface.h (revision 541236) +++ vm/jitrino/src/vm/VMInterface.h (working copy) @@ -380,7 +380,8 @@ static RuntimeHelperId str2rid( const char * helperName ); VmCallingConvention getRuntimeHelperCallingConvention(RuntimeHelperId id); - bool isGCInterruptible(RuntimeHelperId id); + bool isInterruptible(RuntimeHelperId id); + bool mayBeInterruptible(RuntimeHelperId id); void* getRuntimeHelperAddress(RuntimeHelperId); void* getRuntimeHelperAddressForType(RuntimeHelperId, Type*);