1 /* |
1 /* |
2 * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 1999-2010 Sun Microsystems, Inc. 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. |
1522 if (target->is_loaded() && !target->is_abstract() && |
1522 if (target->is_loaded() && !target->is_abstract() && |
1523 target->can_be_statically_bound() && code == Bytecodes::_invokevirtual) { |
1523 target->can_be_statically_bound() && code == Bytecodes::_invokevirtual) { |
1524 code = Bytecodes::_invokespecial; |
1524 code = Bytecodes::_invokespecial; |
1525 } |
1525 } |
1526 |
1526 |
1527 if (code == Bytecodes::_invokedynamic) { |
|
1528 BAILOUT("invokedynamic NYI"); // FIXME |
|
1529 return; |
|
1530 } |
|
1531 |
|
1532 // NEEDS_CLEANUP |
1527 // NEEDS_CLEANUP |
1533 // I've added the target-is_loaded() test below but I don't really understand |
1528 // I've added the target-is_loaded() test below but I don't really understand |
1534 // how klass->is_loaded() can be true and yet target->is_loaded() is false. |
1529 // how klass->is_loaded() can be true and yet target->is_loaded() is false. |
1535 // this happened while running the JCK invokevirtual tests under doit. TKR |
1530 // this happened while running the JCK invokevirtual tests under doit. TKR |
1536 ciMethod* cha_monomorphic_target = NULL; |
1531 ciMethod* cha_monomorphic_target = NULL; |
1537 ciMethod* exact_target = NULL; |
1532 ciMethod* exact_target = NULL; |
1538 if (UseCHA && DeoptC1 && klass->is_loaded() && target->is_loaded()) { |
1533 if (UseCHA && DeoptC1 && klass->is_loaded() && target->is_loaded() && |
|
1534 !target->is_method_handle_invoke()) { |
1539 Value receiver = NULL; |
1535 Value receiver = NULL; |
1540 ciInstanceKlass* receiver_klass = NULL; |
1536 ciInstanceKlass* receiver_klass = NULL; |
1541 bool type_is_exact = false; |
1537 bool type_is_exact = false; |
1542 // try to find a precise receiver type |
1538 // try to find a precise receiver type |
1543 if (will_link && !target->is_static()) { |
1539 if (will_link && !target->is_static()) { |
1679 // corrupting the graph. (We currently bail out with a non-empty |
1675 // corrupting the graph. (We currently bail out with a non-empty |
1680 // stack at a ret in these situations.) |
1676 // stack at a ret in these situations.) |
1681 CHECK_BAILOUT(); |
1677 CHECK_BAILOUT(); |
1682 |
1678 |
1683 // inlining not successful => standard invoke |
1679 // inlining not successful => standard invoke |
1684 bool is_static = code == Bytecodes::_invokestatic; |
1680 bool is_loaded = target->is_loaded(); |
|
1681 bool has_receiver = |
|
1682 code == Bytecodes::_invokespecial || |
|
1683 code == Bytecodes::_invokevirtual || |
|
1684 code == Bytecodes::_invokeinterface; |
|
1685 bool is_invokedynamic = code == Bytecodes::_invokedynamic; |
1685 ValueType* result_type = as_ValueType(target->return_type()); |
1686 ValueType* result_type = as_ValueType(target->return_type()); |
|
1687 |
|
1688 // We require the debug info to be the "state before" because |
|
1689 // invokedynamics may deoptimize. |
|
1690 ValueStack* state_before = is_invokedynamic ? state()->copy() : NULL; |
|
1691 |
1686 Values* args = state()->pop_arguments(target->arg_size_no_receiver()); |
1692 Values* args = state()->pop_arguments(target->arg_size_no_receiver()); |
1687 Value recv = is_static ? NULL : apop(); |
1693 Value recv = has_receiver ? apop() : NULL; |
1688 bool is_loaded = target->is_loaded(); |
|
1689 int vtable_index = methodOopDesc::invalid_vtable_index; |
1694 int vtable_index = methodOopDesc::invalid_vtable_index; |
1690 |
1695 |
1691 #ifdef SPARC |
1696 #ifdef SPARC |
1692 // Currently only supported on Sparc. |
1697 // Currently only supported on Sparc. |
1693 // The UseInlineCaches only controls dispatch to invokevirtuals for |
1698 // The UseInlineCaches only controls dispatch to invokevirtuals for |
1721 target_klass = exact_target->holder(); |
1726 target_klass = exact_target->holder(); |
1722 } |
1727 } |
1723 profile_call(recv, target_klass); |
1728 profile_call(recv, target_klass); |
1724 } |
1729 } |
1725 |
1730 |
1726 Invoke* result = new Invoke(code, result_type, recv, args, vtable_index, target); |
1731 Invoke* result = new Invoke(code, result_type, recv, args, vtable_index, target, state_before); |
1727 // push result |
1732 // push result |
1728 append_split(result); |
1733 append_split(result); |
1729 |
1734 |
1730 if (result_type != voidType) { |
1735 if (result_type != voidType) { |
1731 if (method()->is_strict()) { |
1736 if (method()->is_strict()) { |
2860 |
2865 |
2861 // setup state for std entry |
2866 // setup state for std entry |
2862 _initial_state = state_at_entry(); |
2867 _initial_state = state_at_entry(); |
2863 start_block->merge(_initial_state); |
2868 start_block->merge(_initial_state); |
2864 |
2869 |
2865 BlockBegin* sync_handler = NULL; |
2870 // setup an exception handler to do the unlocking and/or |
2866 if (method()->is_synchronized() || _compilation->env()->dtrace_method_probes()) { |
2871 // notification and unwind the frame. |
2867 // setup an exception handler to do the unlocking and/or notification |
2872 BlockBegin* sync_handler = new BlockBegin(-1); |
2868 sync_handler = new BlockBegin(-1); |
2873 sync_handler->set(BlockBegin::exception_entry_flag); |
2869 sync_handler->set(BlockBegin::exception_entry_flag); |
2874 sync_handler->set(BlockBegin::is_on_work_list_flag); |
2870 sync_handler->set(BlockBegin::is_on_work_list_flag); |
2875 sync_handler->set(BlockBegin::default_exception_handler_flag); |
2871 sync_handler->set(BlockBegin::default_exception_handler_flag); |
2876 |
2872 |
2877 ciExceptionHandler* desc = new ciExceptionHandler(method()->holder(), 0, method()->code_size(), -1, 0); |
2873 ciExceptionHandler* desc = new ciExceptionHandler(method()->holder(), 0, method()->code_size(), -1, 0); |
2878 XHandler* h = new XHandler(desc); |
2874 XHandler* h = new XHandler(desc); |
2879 h->set_entry_block(sync_handler); |
2875 h->set_entry_block(sync_handler); |
2880 scope_data()->xhandlers()->append(h); |
2876 scope_data()->xhandlers()->append(h); |
2881 scope_data()->set_has_handler(); |
2877 scope_data()->set_has_handler(); |
|
2878 } |
|
2879 |
2882 |
2880 // complete graph |
2883 // complete graph |
2881 _vmap = new ValueMap(); |
2884 _vmap = new ValueMap(); |
2882 scope->compute_lock_stack_size(); |
2885 scope->compute_lock_stack_size(); |
2883 switch (scope->method()->intrinsic_id()) { |
2886 switch (scope->method()->intrinsic_id()) { |