1 /* |
1 /* |
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
193 EntryPoint TemplateInterpreter::_trace_code; |
193 EntryPoint TemplateInterpreter::_trace_code; |
194 #endif // !PRODUCT |
194 #endif // !PRODUCT |
195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries]; |
195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries]; |
196 EntryPoint TemplateInterpreter::_earlyret_entry; |
196 EntryPoint TemplateInterpreter::_earlyret_entry; |
197 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; |
197 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; |
|
198 address TemplateInterpreter::_deopt_reexecute_return_entry; |
198 EntryPoint TemplateInterpreter::_safept_entry; |
199 EntryPoint TemplateInterpreter::_safept_entry; |
199 |
200 |
200 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs]; |
201 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs]; |
201 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs]; |
202 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs]; |
202 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs]; |
203 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs]; |
246 return _invokeinterface_return_entry[index]; |
247 return _invokeinterface_return_entry[index]; |
247 case Bytecodes::_invokedynamic: |
248 case Bytecodes::_invokedynamic: |
248 return _invokedynamic_return_entry[index]; |
249 return _invokedynamic_return_entry[index]; |
249 default: |
250 default: |
250 assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code)); |
251 assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code)); |
251 return _return_entry[length].entry(state); |
252 address entry = _return_entry[length].entry(state); |
|
253 vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index); |
|
254 return entry; |
252 } |
255 } |
253 } |
256 } |
254 |
257 |
255 |
258 |
256 address TemplateInterpreter::deopt_entry(TosState state, int length) { |
259 address TemplateInterpreter::deopt_entry(TosState state, int length) { |
257 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); |
260 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); |
258 return _deopt_entry[length].entry(state); |
261 address entry = _deopt_entry[length].entry(state); |
|
262 vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state)); |
|
263 return entry; |
259 } |
264 } |
260 |
265 |
261 //------------------------------------------------------------------------------------------------------------------------ |
266 //------------------------------------------------------------------------------------------------------------------------ |
262 // Suport for invokes |
267 // Suport for invokes |
263 |
268 |
311 // the bytecode. |
316 // the bytecode. |
312 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases |
317 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases |
313 // that do not return "Interpreter::deopt_entry(vtos, 0)" |
318 // that do not return "Interpreter::deopt_entry(vtos, 0)" |
314 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) { |
319 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) { |
315 assert(method->contains(bcp), "just checkin'"); |
320 assert(method->contains(bcp), "just checkin'"); |
316 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp); |
321 Bytecodes::Code code = Bytecodes::code_at(method, bcp); |
317 if (code == Bytecodes::_return) { |
322 if (code == Bytecodes::_return_register_finalizer) { |
318 // This is used for deopt during registration of finalizers |
323 // This is used for deopt during registration of finalizers |
319 // during Object.<init>. We simply need to resume execution at |
324 // during Object.<init>. We simply need to resume execution at |
320 // the standard return vtos bytecode to pop the frame normally. |
325 // the standard return vtos bytecode to pop the frame normally. |
321 // reexecuting the real bytecode would cause double registration |
326 // reexecuting the real bytecode would cause double registration |
322 // of the finalizable object. |
327 // of the finalizable object. |
323 return _normal_table.entry(Bytecodes::_return).entry(vtos); |
328 return Interpreter::deopt_reexecute_return_entry(); |
324 } else { |
329 } else { |
325 return AbstractInterpreter::deopt_reexecute_entry(method, bcp); |
330 return AbstractInterpreter::deopt_reexecute_entry(method, bcp); |
326 } |
331 } |
327 } |
332 } |
328 |
333 |