106 Action_make_not_entrant, // invalidate the nmethod, recompile (probably)
107 Action_make_not_compilable, // invalidate the nmethod and do not compile
108 Action_LIMIT
109 // Note: Keep this enum in sync. with _trap_action_name.
110 };
111
112 enum {
113 _action_bits = 3,
114 _reason_bits = 5,
115 _debug_id_bits = 23,
116 _action_shift = 0,
117 _reason_shift = _action_shift+_action_bits,
118 _debug_id_shift = _reason_shift+_reason_bits,
119 BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist
120 };
121
122 enum UnpackType {
123 Unpack_deopt = 0, // normal deoptimization, use pc computed in unpack_vframe_on_stack
124 Unpack_exception = 1, // exception is pending
125 Unpack_uncommon_trap = 2, // redo last byte code (C2 only)
126 Unpack_reexecute = 3 // reexecute bytecode (C1 only)
127 };
128
129 // Checks all compiled methods. Invalid methods are deleted and
130 // corresponding activations are deoptimized.
131 static int deoptimize_dependents();
132
133 // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame
134 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map);
135 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason);
136
137 private:
138 // Does the actual work for deoptimizing a single frame
139 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason);
140
141 // Helper function to revoke biases of all monitors in frame if UseBiasedLocking
142 // is enabled
143 static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map);
144 // Helper function to revoke biases of all monitors in frames
145 // executing in a particular CodeBlob if UseBiasedLocking is enabled
146 static void revoke_biases_of_monitors(CodeBlob* cb);
162 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk, bool realloc_failures);
163
164 // Interface used for unpacking deoptimized frames
165
166 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
167 // This is only a CheapObj to ease debugging after a deopt failure
168 class UnrollBlock : public CHeapObj<mtCompiler> {
169 friend class VMStructs;
170 private:
171 int _size_of_deoptimized_frame; // Size, in bytes, of current deoptimized frame
172 int _caller_adjustment; // Adjustment, in bytes, to caller's SP by initial interpreted frame
173 int _number_of_frames; // Number frames to unroll
174 int _total_frame_sizes; // Total of number*sizes frames
175 intptr_t* _frame_sizes; // Array of frame sizes, in bytes, for unrolling the stack
176 address* _frame_pcs; // Array of frame pc's, in bytes, for unrolling the stack
177 intptr_t* _register_block; // Block for storing callee-saved registers.
178 BasicType _return_type; // Tells if we have to restore double or long return value
179 intptr_t _initial_info; // Platform dependent data for the sender frame (was FP on x86)
180 int _caller_actual_parameters; // The number of actual arguments at the
181 // interpreted caller of the deoptimized frame
182
183 // The following fields are used as temps during the unpacking phase
184 // (which is tight on registers, especially on x86). They really ought
185 // to be PD variables but that involves moving this class into its own
186 // file to use the pd include mechanism. Maybe in a later cleanup ...
187 intptr_t _counter_temp; // SHOULD BE PD VARIABLE (x86 frame count temp)
188 intptr_t _unpack_kind; // SHOULD BE PD VARIABLE (x86 unpack kind)
189 intptr_t _sender_sp_temp; // SHOULD BE PD VARIABLE (x86 sender_sp)
190 public:
191 // Constructor
192 UnrollBlock(int size_of_deoptimized_frame,
193 int caller_adjustment,
194 int caller_actual_parameters,
195 int number_of_frames,
196 intptr_t* frame_sizes,
197 address* frames_pcs,
198 BasicType return_type);
199 ~UnrollBlock();
200
201 // Returns where a register is located.
202 intptr_t* value_addr_at(int register_number) const;
203
204 // Accessors
205 intptr_t* frame_sizes() const { return _frame_sizes; }
206 int number_of_frames() const { return _number_of_frames; }
207 address* frame_pcs() const { return _frame_pcs ; }
208
209 // Returns the total size of frames
210 int size_of_frames() const;
211
212 void set_initial_info(intptr_t info) { _initial_info = info; }
213
214 int caller_actual_parameters() const { return _caller_actual_parameters; }
215
216 // Accessors used by the code generator for the unpack stub.
217 static int size_of_deoptimized_frame_offset_in_bytes() { return offset_of(UnrollBlock, _size_of_deoptimized_frame); }
218 static int caller_adjustment_offset_in_bytes() { return offset_of(UnrollBlock, _caller_adjustment); }
219 static int number_of_frames_offset_in_bytes() { return offset_of(UnrollBlock, _number_of_frames); }
220 static int frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _frame_sizes); }
221 static int total_frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _total_frame_sizes); }
222 static int frame_pcs_offset_in_bytes() { return offset_of(UnrollBlock, _frame_pcs); }
223 static int register_block_offset_in_bytes() { return offset_of(UnrollBlock, _register_block); }
224 static int return_type_offset_in_bytes() { return offset_of(UnrollBlock, _return_type); }
225 static int counter_temp_offset_in_bytes() { return offset_of(UnrollBlock, _counter_temp); }
226 static int initial_info_offset_in_bytes() { return offset_of(UnrollBlock, _initial_info); }
227 static int unpack_kind_offset_in_bytes() { return offset_of(UnrollBlock, _unpack_kind); }
228 static int sender_sp_temp_offset_in_bytes() { return offset_of(UnrollBlock, _sender_sp_temp); }
229
230 BasicType return_type() const { return _return_type; }
231 void print();
232 };
233
234 //** Returns an UnrollBlock continuing information
235 // how to make room for the resulting interpreter frames.
236 // Called by assembly stub after execution has returned to
237 // deoptimized frame.
238 // @argument thread. Thread where stub_frame resides.
239 // @see OptoRuntime::deoptimization_fetch_unroll_info_C
240 static UnrollBlock* fetch_unroll_info(JavaThread* thread);
241
242 //** Unpacks vframeArray onto execution stack
243 // Called by assembly stub after execution has returned to
244 // deoptimized frame and after the stack unrolling.
245 // @argument thread. Thread where stub_frame resides.
246 // @argument exec_mode. Determines how execution should be continued in top frame.
247 // 0 means continue after current byte code
248 // 1 means exception has happened, handle exception
249 // 2 means reexecute current bytecode (for uncommon traps).
250 // @see OptoRuntime::deoptimization_unpack_frames_C
251 // Return BasicType of call return type, if any
252 static BasicType unpack_frames(JavaThread* thread, int exec_mode);
253
254 // Cleans up deoptimization bits on thread after unpacking or in the
255 // case of an exception.
256 static void cleanup_deopt_info(JavaThread *thread,
257 vframeArray * array);
258
259 // Restores callee saved values from deoptimized frame into oldest interpreter frame
260 // so caller of the deoptimized frame will get back the values it expects.
261 static void unwind_callee_save_values(frame* f, vframeArray* vframe_array);
262
263 //** Performs an uncommon trap for compiled code.
264 // The top most compiler frame is converted into interpreter frames
265 static UnrollBlock* uncommon_trap(JavaThread* thread, jint unloaded_class_index);
266 // Helper routine that enters the VM and may block
267 static void uncommon_trap_inner(JavaThread* thread, jint unloaded_class_index);
268
269 //** Deoptimizes the frame identified by id.
270 // Only called from VMDeoptimizeFrame
271 // @argument thread. Thread where stub_frame resides.
272 // @argument id. id of frame that should be deoptimized.
273 static void deoptimize_frame_internal(JavaThread* thread, intptr_t* id, DeoptReason reason);
274
275 // if thread is not the current thread then execute
276 // VM_DeoptimizeFrame otherwise deoptimize directly.
277 static void deoptimize_frame(JavaThread* thread, intptr_t* id, DeoptReason reason);
278 static void deoptimize_frame(JavaThread* thread, intptr_t* id);
279
280 // Statistics
281 static void gather_statistics(DeoptReason reason, DeoptAction action,
282 Bytecodes::Code bc = Bytecodes::_illegal);
283 static void print_statistics();
284
285 // How much room to adjust the last frame's SP by, to make space for
406
407 static MethodData* get_method_data(JavaThread* thread, methodHandle m, bool create_if_missing);
408 private:
409 // Update the mdo's count and per-BCI reason bits, returning previous state:
410 static ProfileData* query_update_method_data(MethodData* trap_mdo,
411 int trap_bci,
412 DeoptReason reason,
413 bool update_total_trap_count,
414 #if INCLUDE_JVMCI
415 bool is_osr,
416 #endif
417 Method* compiled_method,
418 //outputs:
419 uint& ret_this_trap_count,
420 bool& ret_maybe_prior_trap,
421 bool& ret_maybe_prior_recompile);
422 // class loading support for uncommon trap
423 static void load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS);
424 static void load_class_by_index(constantPoolHandle constant_pool, int index);
425
426 static UnrollBlock* fetch_unroll_info_helper(JavaThread* thread);
427
428 static DeoptAction _unloaded_action; // == Action_reinterpret;
429 static const char* _trap_reason_name[];
430 static const char* _trap_action_name[];
431
432 static juint _deoptimization_hist[Reason_LIMIT][1+Action_LIMIT][BC_CASE_LIMIT];
433 // Note: Histogram array size is 1-2 Kb.
434
435 public:
436 static void update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason);
437 };
438
439 class DeoptimizationMarker : StackObj { // for profiling
440 static bool _is_active;
441 public:
442 DeoptimizationMarker() { _is_active = true; }
443 ~DeoptimizationMarker() { _is_active = false; }
444 static bool is_active() { return _is_active; }
445 };
446
|
106 Action_make_not_entrant, // invalidate the nmethod, recompile (probably)
107 Action_make_not_compilable, // invalidate the nmethod and do not compile
108 Action_LIMIT
109 // Note: Keep this enum in sync. with _trap_action_name.
110 };
111
112 enum {
113 _action_bits = 3,
114 _reason_bits = 5,
115 _debug_id_bits = 23,
116 _action_shift = 0,
117 _reason_shift = _action_shift+_action_bits,
118 _debug_id_shift = _reason_shift+_reason_bits,
119 BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist
120 };
121
122 enum UnpackType {
123 Unpack_deopt = 0, // normal deoptimization, use pc computed in unpack_vframe_on_stack
124 Unpack_exception = 1, // exception is pending
125 Unpack_uncommon_trap = 2, // redo last byte code (C2 only)
126 Unpack_reexecute = 3, // reexecute bytecode (C1 only)
127 Unpack_LIMIT = 4
128 };
129
130 // Checks all compiled methods. Invalid methods are deleted and
131 // corresponding activations are deoptimized.
132 static int deoptimize_dependents();
133
134 // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame
135 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map);
136 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason);
137
138 private:
139 // Does the actual work for deoptimizing a single frame
140 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason);
141
142 // Helper function to revoke biases of all monitors in frame if UseBiasedLocking
143 // is enabled
144 static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map);
145 // Helper function to revoke biases of all monitors in frames
146 // executing in a particular CodeBlob if UseBiasedLocking is enabled
147 static void revoke_biases_of_monitors(CodeBlob* cb);
163 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk, bool realloc_failures);
164
165 // Interface used for unpacking deoptimized frames
166
167 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
168 // This is only a CheapObj to ease debugging after a deopt failure
169 class UnrollBlock : public CHeapObj<mtCompiler> {
170 friend class VMStructs;
171 private:
172 int _size_of_deoptimized_frame; // Size, in bytes, of current deoptimized frame
173 int _caller_adjustment; // Adjustment, in bytes, to caller's SP by initial interpreted frame
174 int _number_of_frames; // Number frames to unroll
175 int _total_frame_sizes; // Total of number*sizes frames
176 intptr_t* _frame_sizes; // Array of frame sizes, in bytes, for unrolling the stack
177 address* _frame_pcs; // Array of frame pc's, in bytes, for unrolling the stack
178 intptr_t* _register_block; // Block for storing callee-saved registers.
179 BasicType _return_type; // Tells if we have to restore double or long return value
180 intptr_t _initial_info; // Platform dependent data for the sender frame (was FP on x86)
181 int _caller_actual_parameters; // The number of actual arguments at the
182 // interpreted caller of the deoptimized frame
183 int _unpack_kind; // exec_mode that can be changed during fetch_unroll_info
184
185 // The following fields are used as temps during the unpacking phase
186 // (which is tight on registers, especially on x86). They really ought
187 // to be PD variables but that involves moving this class into its own
188 // file to use the pd include mechanism. Maybe in a later cleanup ...
189 intptr_t _counter_temp; // SHOULD BE PD VARIABLE (x86 frame count temp)
190 intptr_t _sender_sp_temp; // SHOULD BE PD VARIABLE (x86 sender_sp)
191 public:
192 // Constructor
193 UnrollBlock(int size_of_deoptimized_frame,
194 int caller_adjustment,
195 int caller_actual_parameters,
196 int number_of_frames,
197 intptr_t* frame_sizes,
198 address* frames_pcs,
199 BasicType return_type,
200 int unpack_kind);
201 ~UnrollBlock();
202
203 // Returns where a register is located.
204 intptr_t* value_addr_at(int register_number) const;
205
206 // Accessors
207 intptr_t* frame_sizes() const { return _frame_sizes; }
208 int number_of_frames() const { return _number_of_frames; }
209 address* frame_pcs() const { return _frame_pcs ; }
210 int unpack_kind() const { return _unpack_kind; }
211
212 // Returns the total size of frames
213 int size_of_frames() const;
214
215 void set_initial_info(intptr_t info) { _initial_info = info; }
216
217 int caller_actual_parameters() const { return _caller_actual_parameters; }
218
219 // Accessors used by the code generator for the unpack stub.
220 static int size_of_deoptimized_frame_offset_in_bytes() { return offset_of(UnrollBlock, _size_of_deoptimized_frame); }
221 static int caller_adjustment_offset_in_bytes() { return offset_of(UnrollBlock, _caller_adjustment); }
222 static int number_of_frames_offset_in_bytes() { return offset_of(UnrollBlock, _number_of_frames); }
223 static int frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _frame_sizes); }
224 static int total_frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _total_frame_sizes); }
225 static int frame_pcs_offset_in_bytes() { return offset_of(UnrollBlock, _frame_pcs); }
226 static int register_block_offset_in_bytes() { return offset_of(UnrollBlock, _register_block); }
227 static int return_type_offset_in_bytes() { return offset_of(UnrollBlock, _return_type); }
228 static int counter_temp_offset_in_bytes() { return offset_of(UnrollBlock, _counter_temp); }
229 static int initial_info_offset_in_bytes() { return offset_of(UnrollBlock, _initial_info); }
230 static int unpack_kind_offset_in_bytes() { return offset_of(UnrollBlock, _unpack_kind); }
231 static int sender_sp_temp_offset_in_bytes() { return offset_of(UnrollBlock, _sender_sp_temp); }
232
233 BasicType return_type() const { return _return_type; }
234 void print();
235 };
236
237 //** Returns an UnrollBlock continuing information
238 // how to make room for the resulting interpreter frames.
239 // Called by assembly stub after execution has returned to
240 // deoptimized frame.
241 // @argument thread. Thread where stub_frame resides.
242 // @see OptoRuntime::deoptimization_fetch_unroll_info_C
243 static UnrollBlock* fetch_unroll_info(JavaThread* thread, int exec_mode);
244
245 //** Unpacks vframeArray onto execution stack
246 // Called by assembly stub after execution has returned to
247 // deoptimized frame and after the stack unrolling.
248 // @argument thread. Thread where stub_frame resides.
249 // @argument exec_mode. Determines how execution should be continued in top frame.
250 // 0 means continue after current byte code
251 // 1 means exception has happened, handle exception
252 // 2 means reexecute current bytecode (for uncommon traps).
253 // @see OptoRuntime::deoptimization_unpack_frames_C
254 // Return BasicType of call return type, if any
255 static BasicType unpack_frames(JavaThread* thread, int exec_mode);
256
257 // Cleans up deoptimization bits on thread after unpacking or in the
258 // case of an exception.
259 static void cleanup_deopt_info(JavaThread *thread,
260 vframeArray * array);
261
262 // Restores callee saved values from deoptimized frame into oldest interpreter frame
263 // so caller of the deoptimized frame will get back the values it expects.
264 static void unwind_callee_save_values(frame* f, vframeArray* vframe_array);
265
266 //** Performs an uncommon trap for compiled code.
267 // The top most compiler frame is converted into interpreter frames
268 static UnrollBlock* uncommon_trap(JavaThread* thread, jint unloaded_class_index, jint exec_mode);
269 // Helper routine that enters the VM and may block
270 static void uncommon_trap_inner(JavaThread* thread, jint unloaded_class_index);
271
272 //** Deoptimizes the frame identified by id.
273 // Only called from VMDeoptimizeFrame
274 // @argument thread. Thread where stub_frame resides.
275 // @argument id. id of frame that should be deoptimized.
276 static void deoptimize_frame_internal(JavaThread* thread, intptr_t* id, DeoptReason reason);
277
278 // if thread is not the current thread then execute
279 // VM_DeoptimizeFrame otherwise deoptimize directly.
280 static void deoptimize_frame(JavaThread* thread, intptr_t* id, DeoptReason reason);
281 static void deoptimize_frame(JavaThread* thread, intptr_t* id);
282
283 // Statistics
284 static void gather_statistics(DeoptReason reason, DeoptAction action,
285 Bytecodes::Code bc = Bytecodes::_illegal);
286 static void print_statistics();
287
288 // How much room to adjust the last frame's SP by, to make space for
409
410 static MethodData* get_method_data(JavaThread* thread, methodHandle m, bool create_if_missing);
411 private:
412 // Update the mdo's count and per-BCI reason bits, returning previous state:
413 static ProfileData* query_update_method_data(MethodData* trap_mdo,
414 int trap_bci,
415 DeoptReason reason,
416 bool update_total_trap_count,
417 #if INCLUDE_JVMCI
418 bool is_osr,
419 #endif
420 Method* compiled_method,
421 //outputs:
422 uint& ret_this_trap_count,
423 bool& ret_maybe_prior_trap,
424 bool& ret_maybe_prior_recompile);
425 // class loading support for uncommon trap
426 static void load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS);
427 static void load_class_by_index(constantPoolHandle constant_pool, int index);
428
429 static UnrollBlock* fetch_unroll_info_helper(JavaThread* thread, int exec_mode);
430
431 static DeoptAction _unloaded_action; // == Action_reinterpret;
432 static const char* _trap_reason_name[];
433 static const char* _trap_action_name[];
434
435 static juint _deoptimization_hist[Reason_LIMIT][1+Action_LIMIT][BC_CASE_LIMIT];
436 // Note: Histogram array size is 1-2 Kb.
437
438 public:
439 static void update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason);
440 };
441
442 class DeoptimizationMarker : StackObj { // for profiling
443 static bool _is_active;
444 public:
445 DeoptimizationMarker() { _is_active = true; }
446 ~DeoptimizationMarker() { _is_active = false; }
447 static bool is_active() { return _is_active; }
448 };
449
|