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