@@ -69,6 +69,7 @@ bool enableCompiledMethodLoadHookOnly = false;
69
69
// Static data initialization
70
70
// -----------------------------------------------------------------------------
71
71
72
+ J9::Options::FSDInitStatus J9::Options::_fsdInitStatus = J9::Options::FSDInitStatus::FSDInit_NotInitialized;
72
73
bool J9::Options::_doNotProcessEnvVars = false ; // set through XX options in Java
73
74
bool J9::Options::_reportByteCodeInfoAtCatchBlock = false ;
74
75
int32_t J9::Options::_samplingFrequencyInIdleMode = 1000 ; // ms
@@ -2872,6 +2873,60 @@ J9::Options::fePostProcessAOT(void * base)
2872
2873
return true ;
2873
2874
}
2874
2875
2876
+ bool
2877
+ J9::Options::isFSDNeeded (J9JavaVM *javaVM, J9HookInterface **vmHooks)
2878
+ {
2879
+ return
2880
+ #if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2881
+ (javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
2882
+ #endif
2883
+ #if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
2884
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
2885
+ #endif
2886
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_BREAKPOINT) ||
2887
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_FRAME_POPPED) ||
2888
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_FRAME_POP) ||
2889
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_GET_FIELD) ||
2890
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_PUT_FIELD) ||
2891
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
2892
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
2893
+ (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_SINGLE_STEP);
2894
+ }
2895
+
2896
+ J9::Options::FSDInitStatus
2897
+ J9::Options::initializeFSDIfNeeded (J9JavaVM *javaVM, J9HookInterface **vmHooks, bool &doAOT)
2898
+ {
2899
+ if (self ()->isFSDNeeded (javaVM, vmHooks))
2900
+ {
2901
+ static bool TR_DisableFullSpeedDebug = (feGetEnv (" TR_DisableFullSpeedDebug" ) != NULL );
2902
+ static bool TR_DisableFullSpeedDebugAOT = (feGetEnv (" TR_DisableFullSpeedDebugAOT" ) != NULL );
2903
+ #if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2904
+ if (TR_DisableFullSpeedDebug)
2905
+ {
2906
+ return FSDInitStatus::FSDInit_Error;
2907
+ }
2908
+ else if (TR_DisableFullSpeedDebugAOT)
2909
+ {
2910
+ doAOT = false ;
2911
+ }
2912
+
2913
+ self ()->setOption (TR_FullSpeedDebug);
2914
+ self ()->setOption (TR_DisableDirectToJNI);
2915
+ // setOption(TR_DisableNoVMAccess);
2916
+ // setOption(TR_DisableAsyncCompilation);
2917
+ // setOption(TR_DisableInterpreterProfiling, true);
2918
+
2919
+ initializeFSD (javaVM);
2920
+
2921
+ _fsdInitStatus = FSDInitStatus::FSDInit_Initialized;
2922
+ #else
2923
+ _fsdInitStatus = FSDInitStatus::FSDInit_Error;
2924
+ #endif
2925
+ }
2926
+
2927
+ return _fsdInitStatus;
2928
+ }
2929
+
2875
2930
bool J9::Options::feLatePostProcess (void * base, TR::OptionSet * optionSet)
2876
2931
{
2877
2932
// vmPostProcess is called indirectly from the JIT_INITIALIZED phase
@@ -2887,6 +2942,7 @@ bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
2887
2942
J9JITConfig * jitConfig = (J9JITConfig*)base;
2888
2943
J9JavaVM * javaVM = jitConfig->javaVM ;
2889
2944
J9HookInterface * * vmHooks = javaVM->internalVMFunctions ->getVMHookInterface (javaVM);
2945
+ J9VMThread * vmThread = javaVM->internalVMFunctions ->currentVMThread (javaVM);
2890
2946
2891
2947
TR_J9VMBase * vm = TR_J9VMBase::get (jitConfig, 0 );
2892
2948
TR::CompilationInfo * compInfo = TR::CompilationInfo::get (jitConfig);
@@ -2915,46 +2971,19 @@ bool J9::Options::feLatePostProcess(void * base, TR::OptionSet * optionSet)
2915
2971
#endif
2916
2972
2917
2973
// Determine whether or not to call the hooked helpers
2918
- //
2919
- if (
2920
- #if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2921
- (javaVM->requiredDebugAttributes & J9VM_DEBUG_ATTRIBUTE_CAN_ACCESS_LOCALS) ||
2922
- #endif
2923
- #if defined (J9VM_INTERP_HOT_CODE_REPLACEMENT)
2924
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_POP_FRAMES_INTERRUPT) ||
2925
- #endif
2926
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_BREAKPOINT) ||
2927
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_FRAME_POPPED) ||
2928
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_FRAME_POP) ||
2929
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_GET_FIELD) ||
2930
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_PUT_FIELD) ||
2931
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_GET_STATIC_FIELD) ||
2932
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_PUT_STATIC_FIELD) ||
2933
- (*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_SINGLE_STEP))
2934
- {
2935
- static bool TR_DisableFullSpeedDebug = (feGetEnv (" TR_DisableFullSpeedDebug" ) != NULL );
2936
- static bool TR_DisableFullSpeedDebugAOT = (feGetEnv (" TR_DisableFullSpeedDebugAOT" ) != NULL );
2937
- #if defined(J9VM_JIT_FULL_SPEED_DEBUG)
2938
- if (TR_DisableFullSpeedDebug)
2939
- {
2940
- return false ;
2941
- }
2942
- else if (TR_DisableFullSpeedDebugAOT)
2943
- {
2944
- doAOT = false ;
2945
- }
2946
-
2947
- self ()->setOption (TR_FullSpeedDebug);
2948
- self ()->setOption (TR_DisableDirectToJNI);
2949
- // setOption(TR_DisableNoVMAccess);
2950
- // setOption(TR_DisableAsyncCompilation);
2951
- // setOption(TR_DisableInterpreterProfiling, true);
2952
-
2953
- initializeFSD (javaVM);
2954
- #else
2955
- return false ;
2956
- #endif
2974
+ FSDInitStatus fsdStatus = initializeFSDIfNeeded (javaVM, vmHooks, doAOT);
2975
+ if (fsdStatus == FSDInitStatus::FSDInit_Error)
2976
+ {
2977
+ return false ;
2957
2978
}
2979
+ #if defined(J9VM_OPT_CRIU_SUPPORT)
2980
+ else if (fsdStatus == FSDInitStatus::FSDInit_NotInitialized
2981
+ && javaVM->internalVMFunctions ->isDebugOnRestoreEnabled (vmThread))
2982
+ {
2983
+ self ()->setOption (TR_FullSpeedDebug);
2984
+ self ()->setOption (TR_DisableDirectToJNI);
2985
+ }
2986
+ #endif
2958
2987
2959
2988
bool exceptionEventHooked = false ;
2960
2989
if ((*vmHooks)->J9HookDisable (vmHooks, J9HOOK_VM_EXCEPTION_CATCH))
@@ -3593,3 +3622,53 @@ J9::Options::closeLogFileForClientOptions()
3593
3622
}
3594
3623
}
3595
3624
#endif /* defined(J9VM_OPT_JITSERVER) */
3625
+
3626
+ #if defined(J9VM_OPT_CRIU_SUPPORT)
3627
+ void
3628
+ J9::Options::resetFSDOptions ()
3629
+ {
3630
+ // TODO: Need to handle if these options were set/unset as part of
3631
+ // the post restore options processing.
3632
+
3633
+ setOption (TR_EnableHCR);
3634
+
3635
+ setOption (TR_FullSpeedDebug, false );
3636
+ setOption (TR_DisableDirectToJNI, false );
3637
+
3638
+ setReportByteCodeInfoAtCatchBlock (false );
3639
+ setOption (TR_DisableProfiling, false );
3640
+ setOption (TR_DisableNewInstanceImplOpt, false );
3641
+ setDisabled (OMR::redundantGotoElimination, false );
3642
+ setDisabled (OMR::loopReplicator, false );
3643
+ setOption (TR_DisableMethodHandleThunks, false );
3644
+ }
3645
+
3646
+ void
3647
+ J9::Options::resetFSDOptionsForAll ()
3648
+ {
3649
+ resetFSDOptions ();
3650
+ for (auto optionSet = _optionSets; optionSet; optionSet = optionSet->getNext ())
3651
+ {
3652
+ optionSet->getOptions ()->resetFSDOptions ();
3653
+ }
3654
+ }
3655
+
3656
+ J9::Options::FSDInitStatus
3657
+ J9::Options::resetFSD (J9JavaVM *vm, J9VMThread *vmThread, bool &doAOT)
3658
+ {
3659
+ J9HookInterface ** vmHooks = vm->internalVMFunctions ->getVMHookInterface (vm);
3660
+ auto fsdStatusJIT = getCmdLineOptions ()->initializeFSDIfNeeded (vm, vmHooks, doAOT);
3661
+ auto fsdStatusAOT = getAOTCmdLineOptions ()->initializeFSDIfNeeded (vm, vmHooks, doAOT);
3662
+ TR_ASSERT_FATAL (fsdStatusJIT == fsdStatusAOT, " fsdStatusJIT=%d != fsdStatusAOT=%d!\n " , fsdStatusJIT, fsdStatusAOT);
3663
+
3664
+ if (fsdStatusJIT == TR::Options::FSDInitStatus::FSDInit_NotInitialized
3665
+ && !vm->internalVMFunctions ->isCheckpointAllowed (vmThread)
3666
+ && vm->internalVMFunctions ->isDebugOnRestoreEnabled (vmThread))
3667
+ {
3668
+ getCmdLineOptions ()->resetFSDOptionsForAll ();
3669
+ getAOTCmdLineOptions ()->resetFSDOptionsForAll ();
3670
+ }
3671
+
3672
+ return fsdStatusJIT;
3673
+ }
3674
+ #endif /* defined(J9VM_OPT_CRIU_SUPPORT) */
0 commit comments