120 };
121
122 enum {
123 _action_bits = 3,
124 _reason_bits = 5,
125 _debug_id_bits = 23,
126 _action_shift = 0,
127 _reason_shift = _action_shift+_action_bits,
128 _debug_id_shift = _reason_shift+_reason_bits,
129 BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist
130 };
131
132 enum UnpackType {
133 Unpack_deopt = 0, // normal deoptimization, use pc computed in unpack_vframe_on_stack
134 Unpack_exception = 1, // exception is pending
135 Unpack_uncommon_trap = 2, // redo last byte code (C2 only)
136 Unpack_reexecute = 3, // reexecute bytecode (C1 only)
137 Unpack_LIMIT = 4
138 };
139
140 // Checks all compiled methods. Invalid methods are deleted and
141 // corresponding activations are deoptimized.
142 static int deoptimize_dependents();
143
144 // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame
145 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map);
146 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason);
147
148 #if INCLUDE_JVMCI
149 static address deoptimize_for_missing_exception_handler(CompiledMethod* cm);
150 static oop get_cached_box(AutoBoxObjectValue* bv, frame* fr, RegisterMap* reg_map, TRAPS);
151 #endif
152
153 private:
154 // Does the actual work for deoptimizing a single frame
155 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason);
156
157 // Helper function to revoke biases of all monitors in frame if UseBiasedLocking
158 // is enabled
159 static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map);
160
161 #if COMPILER2_OR_JVMCI
162 JVMCI_ONLY(public:)
163
164 // Support for restoring non-escaping objects
165 static bool realloc_objects(JavaThread* thread, frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, TRAPS);
166 static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type);
167 static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj);
168 static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal);
169 static void relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread, bool realloc_failures);
170 static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array);
171 NOT_PRODUCT(static void print_objects(GrowableArray<ScopeValue*>* objects, bool realloc_failures);)
172 #endif // COMPILER2_OR_JVMCI
173
174 public:
175 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk, bool realloc_failures);
176
177 // Interface used for unpacking deoptimized frames
178
179 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
|
120 };
121
122 enum {
123 _action_bits = 3,
124 _reason_bits = 5,
125 _debug_id_bits = 23,
126 _action_shift = 0,
127 _reason_shift = _action_shift+_action_bits,
128 _debug_id_shift = _reason_shift+_reason_bits,
129 BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist
130 };
131
132 enum UnpackType {
133 Unpack_deopt = 0, // normal deoptimization, use pc computed in unpack_vframe_on_stack
134 Unpack_exception = 1, // exception is pending
135 Unpack_uncommon_trap = 2, // redo last byte code (C2 only)
136 Unpack_reexecute = 3, // reexecute bytecode (C1 only)
137 Unpack_LIMIT = 4
138 };
139
140 static void deoptimize_all_marked();
141
142 private:
143 // Checks all compiled methods. Invalid methods are deleted and
144 // corresponding activations are deoptimized.
145 static int deoptimize_dependents();
146 static void revoke_using_handshake(JavaThread* thread, frame fr, RegisterMap* map);
147 static void revoke_using_safepoint(JavaThread* thread, frame fr, RegisterMap* map);
148 static void deopt_thread(bool in_handshake, JavaThread* thread, frame fr, RegisterMap *map, DeoptReason reason);
149
150 public:
151 // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame
152 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *map, bool in_handshake = false);
153 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason);
154
155 #if INCLUDE_JVMCI
156 static address deoptimize_for_missing_exception_handler(CompiledMethod* cm);
157 static oop get_cached_box(AutoBoxObjectValue* bv, frame* fr, RegisterMap* reg_map, TRAPS);
158 #endif
159
160 private:
161 // Does the actual work for deoptimizing a single frame
162 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason);
163
164 // Helper function to revoke biases of all monitors in frame if UseBiasedLocking
165 // is enabled
166 static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map) {
167 revoke_using_safepoint(thread, fr, map);
168 }
169
170 #if COMPILER2_OR_JVMCI
171 JVMCI_ONLY(public:)
172
173 // Support for restoring non-escaping objects
174 static bool realloc_objects(JavaThread* thread, frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, TRAPS);
175 static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type);
176 static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj);
177 static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal);
178 static void relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread, bool realloc_failures);
179 static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array);
180 NOT_PRODUCT(static void print_objects(GrowableArray<ScopeValue*>* objects, bool realloc_failures);)
181 #endif // COMPILER2_OR_JVMCI
182
183 public:
184 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk, bool realloc_failures);
185
186 // Interface used for unpacking deoptimized frames
187
188 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
|