94 // Other map edges may contain locals or monitors, and should not 95 // be changed in meaning. 96 // 97 // If the call traps, the returned map must have a control edge of top. 98 // If the call can throw, the returned map must report has_exceptions(). 99 // 100 // If the result is NULL, it means that this CallGenerator was unable 101 // to handle the given call, and another CallGenerator should be consulted. 102 virtual JVMState* generate(JVMState* jvms) = 0; 103 104 // How to generate a call site that is inlined: 105 static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1); 106 // How to generate code for an on-stack replacement handler. 107 static CallGenerator* for_osr(ciMethod* m, int osr_bci); 108 109 // How to generate vanilla out-of-line call sites: 110 static CallGenerator* for_direct_call(ciMethod* m, bool separate_io_projs = false); // static, special 111 static CallGenerator* for_dynamic_call(ciMethod* m); // invokedynamic 112 static CallGenerator* for_virtual_call(ciMethod* m, int vtable_index); // virtual, interface 113 114 // How to generate a replace a direct call with an inline version 115 static CallGenerator* for_late_inline(ciMethod* m, CallGenerator* inline_cg); 116 117 // How to make a call but defer the decision whether to inline or not. 118 static CallGenerator* for_warm_call(WarmCallInfo* ci, 119 CallGenerator* if_cold, 120 CallGenerator* if_hot); 121 122 // How to make a call that optimistically assumes a receiver type: 123 static CallGenerator* for_predicted_call(ciKlass* predicted_receiver, 124 CallGenerator* if_missed, 125 CallGenerator* if_hit, 126 float hit_prob); 127 128 // How to make a call that optimistically assumes a MethodHandle target: 129 static CallGenerator* for_predicted_dynamic_call(ciMethodHandle* predicted_method_handle, 130 CallGenerator* if_missed, 131 CallGenerator* if_hit, 132 float hit_prob); 133 | 94 // Other map edges may contain locals or monitors, and should not 95 // be changed in meaning. 96 // 97 // If the call traps, the returned map must have a control edge of top. 98 // If the call can throw, the returned map must report has_exceptions(). 99 // 100 // If the result is NULL, it means that this CallGenerator was unable 101 // to handle the given call, and another CallGenerator should be consulted. 102 virtual JVMState* generate(JVMState* jvms) = 0; 103 104 // How to generate a call site that is inlined: 105 static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1); 106 // How to generate code for an on-stack replacement handler. 107 static CallGenerator* for_osr(ciMethod* m, int osr_bci); 108 109 // How to generate vanilla out-of-line call sites: 110 static CallGenerator* for_direct_call(ciMethod* m, bool separate_io_projs = false); // static, special 111 static CallGenerator* for_dynamic_call(ciMethod* m); // invokedynamic 112 static CallGenerator* for_virtual_call(ciMethod* m, int vtable_index); // virtual, interface 113 114 static CallGenerator* for_method_handle_inline(Node* method_handle, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile); 115 116 // How to generate a replace a direct call with an inline version 117 static CallGenerator* for_late_inline(ciMethod* m, CallGenerator* inline_cg); 118 119 // How to make a call but defer the decision whether to inline or not. 120 static CallGenerator* for_warm_call(WarmCallInfo* ci, 121 CallGenerator* if_cold, 122 CallGenerator* if_hot); 123 124 // How to make a call that optimistically assumes a receiver type: 125 static CallGenerator* for_predicted_call(ciKlass* predicted_receiver, 126 CallGenerator* if_missed, 127 CallGenerator* if_hit, 128 float hit_prob); 129 130 // How to make a call that optimistically assumes a MethodHandle target: 131 static CallGenerator* for_predicted_dynamic_call(ciMethodHandle* predicted_method_handle, 132 CallGenerator* if_missed, 133 CallGenerator* if_hit, 134 float hit_prob); 135 |