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).
180 // This is only a CheapObj to ease debugging after a deopt failure
181 class UnrollBlock : public CHeapObj<mtCompiler> {
182 friend class VMStructs;
|
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
147 // Revoke biased locks at deopt.
148 static void revoke_from_deopt_handler(JavaThread* thread, frame fr, RegisterMap* map);
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 *reg_map, DeoptReason reason = Reason_constraint);
153
154 #if INCLUDE_JVMCI
155 static address deoptimize_for_missing_exception_handler(CompiledMethod* cm);
156 static oop get_cached_box(AutoBoxObjectValue* bv, frame* fr, RegisterMap* reg_map, TRAPS);
157 #endif
158
159 private:
160 // Does the actual work for deoptimizing a single frame
161 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason);
162
163 #if COMPILER2_OR_JVMCI
164 public:
165
166 // Support for restoring non-escaping objects
167 static bool realloc_objects(JavaThread* thread, frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, TRAPS);
168 static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type);
169 static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj);
170 static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal);
171 static void relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread, bool realloc_failures);
172 static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array);
173 NOT_PRODUCT(static void print_objects(GrowableArray<ScopeValue*>* objects, bool realloc_failures);)
174 #endif // COMPILER2_OR_JVMCI
175
176 public:
177 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk, bool realloc_failures);
178
179 // Interface used for unpacking deoptimized frames
180
181 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob).
182 // This is only a CheapObj to ease debugging after a deopt failure
183 class UnrollBlock : public CHeapObj<mtCompiler> {
184 friend class VMStructs;
|