8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_RUNTIME_SHAREDRUNTIME_HPP
26 #define SHARE_RUNTIME_SHAREDRUNTIME_HPP
27
28 #include "code/codeBlob.hpp"
29 #include "code/vmreg.hpp"
30 #include "interpreter/linkResolver.hpp"
31 #include "memory/allStatic.hpp"
32 #include "memory/resourceArea.hpp"
33 #include "runtime/stubDeclarations.hpp"
34 #include "utilities/macros.hpp"
35
36 class AdapterHandlerEntry;
37 class AdapterFingerPrint;
38 class vframeStream;
39
40 // Runtime is the base class for various runtime interfaces
41 // (InterpreterRuntime, CompilerRuntime, etc.). It provides
42 // shared functionality such as exception forwarding (C++ to
43 // Java exceptions), locking/unlocking mechanisms, statistical
44 // information, etc.
45
46 // define SharedStubId enum tags: wrong_method_id, etc
47
48 #define SHARED_STUB_ID_ENUM_DECLARE(name, type) STUB_ID_NAME(name),
49 enum class SharedStubId :int {
50 NO_STUBID = -1,
51 SHARED_STUBS_DO(SHARED_STUB_ID_ENUM_DECLARE)
99 // Counters
100 static int64_t _nof_megamorphic_calls; // total # of megamorphic calls (through vtable)
101 #endif // !PRODUCT
102
103 private:
104 static SafepointBlob* generate_handler_blob(SharedStubId id, address call_ptr);
105 static RuntimeStub* generate_resolve_blob(SharedStubId id, address destination);
106 static RuntimeStub* generate_throw_exception(SharedStubId id, address runtime_entry);
107 public:
108 static void generate_initial_stubs(void);
109 static void generate_stubs(void);
110 #if INCLUDE_JFR
111 static void generate_jfr_stubs(void);
112 // For c2: c_rarg0 is junk, call to runtime to write a checkpoint.
113 // It returns a jobject handle to the event writer.
114 // The handle is dereferenced and the return value is the event writer oop.
115 static RuntimeStub* generate_jfr_write_checkpoint();
116 // For c2: call to runtime to return a buffer lease.
117 static RuntimeStub* generate_jfr_return_lease();
118 #endif
119
120 static const char *stub_name(SharedStubId id) {
121 assert(id > SharedStubId::NO_STUBID && id < SharedStubId::NUM_STUBIDS, "stub id out of range");
122 return _stub_names[(int)id];
123 }
124
125 // max bytes for each dtrace string parameter
126 enum { max_dtrace_string_size = 256 };
127
128 // The following arithmetic routines are used on platforms that do
129 // not have machine instructions to implement their functionality.
130 // Do not remove these.
131
132 // long arithmetics
133 static jlong lmul(jlong y, jlong x);
134 static jlong ldiv(jlong y, jlong x);
135 static jlong lrem(jlong y, jlong x);
136
137 // float and double remainder
138 static jfloat frem(jfloat x, jfloat y);
449 // by the time we reach the blob there is compiled code available. This allows
450 // the blob to pass the incoming stack pointer (the sender sp) in a known
451 // location for the interpreter to record. This is used by the frame code
452 // to correct the sender code to match up with the stack pointer when the
453 // thread left the compiled code. In addition it allows the interpreter
454 // to remove the space the c2i adapter allocated to do its argument conversion.
455
456 // Although a c2i blob will always run interpreted even if compiled code is
457 // present if we see that compiled code is present the compiled call site
458 // will be patched/re-resolved so that later calls will run compiled.
459
460 // Additionally a c2i blob need to have a unverified entry because it can be reached
461 // in situations where the call site is an inlined cache site and may go megamorphic.
462
463 // A i2c adapter is simpler than the c2i adapter. This is because it is assumed
464 // that the interpreter before it does any call dispatch will record the current
465 // stack pointer in the interpreter frame. On return it will restore the stack
466 // pointer as needed. This means the i2c adapter code doesn't need any special
467 // handshaking path with compiled code to keep the stack walking correct.
468
469 static AdapterHandlerEntry* generate_i2c2i_adapters(MacroAssembler *_masm,
470 int total_args_passed,
471 int max_arg,
472 const BasicType *sig_bt,
473 const VMRegPair *regs,
474 AdapterFingerPrint* fingerprint);
475
476 static void gen_i2c_adapter(MacroAssembler *_masm,
477 int total_args_passed,
478 int comp_args_on_stack,
479 const BasicType *sig_bt,
480 const VMRegPair *regs);
481
482 // OSR support
483
484 // OSR_migration_begin will extract the jvm state from an interpreter
485 // frame (locals, monitors) and store the data in a piece of C heap
486 // storage. This then allows the interpreter frame to be removed from the
487 // stack and the OSR nmethod to be called. That method is called with a
488 // pointer to the C heap storage. This pointer is the return value from
489 // OSR_migration_begin.
490
491 static intptr_t* OSR_migration_begin(JavaThread *thread);
492
493 // OSR_migration_end is a trivial routine. It is called after the compiled
494 // method has extracted the jvm state from the C heap that OSR_migration_begin
550
551 // Resolving of calls
552 static address get_resolved_entry (JavaThread* current, methodHandle callee_method);
553 static address resolve_static_call_C (JavaThread* current);
554 static address resolve_virtual_call_C (JavaThread* current);
555 static address resolve_opt_virtual_call_C(JavaThread* current);
556
557 // arraycopy, the non-leaf version. (See StubRoutines for all the leaf calls.)
558 static void slow_arraycopy_C(oopDesc* src, jint src_pos,
559 oopDesc* dest, jint dest_pos,
560 jint length, JavaThread* thread);
561
562 // handle ic miss with caller being compiled code
563 // wrong method handling (inline cache misses)
564 static address handle_wrong_method(JavaThread* current);
565 static address handle_wrong_method_abstract(JavaThread* current);
566 static address handle_wrong_method_ic_miss(JavaThread* current);
567
568 static address handle_unsafe_access(JavaThread* thread, address next_pc);
569
570 #ifndef PRODUCT
571
572 // Collect and print inline cache miss statistics
573 private:
574 enum { maxICmiss_count = 100 };
575 static int _ICmiss_index; // length of IC miss histogram
576 static int _ICmiss_count[maxICmiss_count]; // miss counts
577 static address _ICmiss_at[maxICmiss_count]; // miss addresses
578 static void trace_ic_miss(address at);
579
580 public:
581 static uint _ic_miss_ctr; // total # of IC misses
582 static uint _wrong_method_ctr;
583 static uint _resolve_static_ctr;
584 static uint _resolve_virtual_ctr;
585 static uint _resolve_opt_virtual_ctr;
586 static uint _implicit_null_throws;
587 static uint _implicit_div0_throws;
588
589 static uint _jbyte_array_copy_ctr; // Slow-path byte array copy
590 static uint _jshort_array_copy_ctr; // Slow-path short array copy
591 static uint _jint_array_copy_ctr; // Slow-path int array copy
592 static uint _jlong_array_copy_ctr; // Slow-path long array copy
593 static uint _oop_array_copy_ctr; // Slow-path oop array copy
594 static uint _checkcast_array_copy_ctr; // Slow-path oop array copy, with cast
595 static uint _unsafe_array_copy_ctr; // Slow-path includes alignment checks
596 static uint _generic_array_copy_ctr; // Slow-path includes type decoding
597 static uint _slow_array_copy_ctr; // Slow-path failed out to a method call
598
599 static uint _unsafe_set_memory_ctr; // Slow-path includes alignment checks
600
601 static uint _new_instance_ctr; // 'new' object requires GC
602 static uint _new_array_ctr; // 'new' array requires GC
603 static uint _multi2_ctr, _multi3_ctr, _multi4_ctr, _multi5_ctr;
604 static uint _find_handler_ctr; // find exception handler
605 static uint _rethrow_ctr; // rethrow exception
609 static uint _mon_exit_ctr; // monitor exit slow
610 static uint _partial_subtype_ctr; // SubRoutines::partial_subtype_check
611
612 // Statistics code
613 // stats for "normal" compiled calls (non-interface)
614 static int64_t _nof_normal_calls; // total # of calls
615 static int64_t _nof_inlined_calls; // total # of inlined normal calls
616 static int64_t _nof_static_calls; // total # of calls to static methods or super methods (invokespecial)
617 static int64_t _nof_inlined_static_calls; // total # of inlined static calls
618 // stats for compiled interface calls
619 static int64_t _nof_interface_calls; // total # of compiled calls
620 static int64_t _nof_inlined_interface_calls; // total # of inlined interface calls
621
622 public: // for compiler
623 static address nof_normal_calls_addr() { return (address)&_nof_normal_calls; }
624 static address nof_inlined_calls_addr() { return (address)&_nof_inlined_calls; }
625 static address nof_static_calls_addr() { return (address)&_nof_static_calls; }
626 static address nof_inlined_static_calls_addr() { return (address)&_nof_inlined_static_calls; }
627 static address nof_interface_calls_addr() { return (address)&_nof_interface_calls; }
628 static address nof_inlined_interface_calls_addr() { return (address)&_nof_inlined_interface_calls; }
629 static void print_call_statistics(uint64_t comp_total);
630 static void print_ic_miss_histogram();
631
632 #endif // PRODUCT
633
634 static void print_statistics() PRODUCT_RETURN;
635 };
636
637
638 // ---------------------------------------------------------------------------
639 // Implementation of AdapterHandlerLibrary
640 //
641 // This library manages argument marshaling adapters and native wrappers.
642 // There are 2 flavors of adapters: I2C and C2I.
643 //
644 // The I2C flavor takes a stock interpreted call setup, marshals the
645 // arguments for a Java-compiled call, and jumps to Rmethod-> code()->
646 // code_begin(). It is broken to call it without an nmethod assigned.
647 // The usual behavior is to lift any register arguments up out of the
648 // stack and possibly re-pack the extra arguments to be contiguous.
649 // I2C adapters will save what the interpreter's stack pointer will be
650 // after arguments are popped, then adjust the interpreter's frame
651 // size to force alignment and possibly to repack the arguments.
652 // After re-packing, it jumps to the compiled code start. There are
653 // no safepoints in this adapter code and a GC cannot happen while
654 // marshaling is in progress.
655 //
656 // The C2I flavor takes a stock compiled call setup plus the target method in
657 // Rmethod, marshals the arguments for an interpreted call and jumps to
658 // Rmethod->_i2i_entry. On entry, the interpreted frame has not yet been
659 // setup. Compiled frames are fixed-size and the args are likely not in the
660 // right place. Hence all the args will likely be copied into the
661 // interpreter's frame, forcing that frame to grow. The compiled frame's
662 // outgoing stack args will be dead after the copy.
663 //
664 // Native wrappers, like adapters, marshal arguments. Unlike adapters they
665 // also perform an official frame push & pop. They have a call to the native
666 // routine in their middles and end in a return (instead of ending in a jump).
667 // The native wrappers are stored in real nmethods instead of the BufferBlobs
668 // used by the adapters. The code generation happens here because it's very
669 // similar to what the adapters have to do.
670
671 class AdapterHandlerEntry : public CHeapObj<mtCode> {
672 friend class AdapterHandlerLibrary;
673
674 private:
675 AdapterFingerPrint* _fingerprint;
676 address _i2c_entry;
677 address _c2i_entry;
678 address _c2i_unverified_entry;
679 address _c2i_no_clinit_check_entry;
680
681 #ifdef ASSERT
682 // Captures code and signature used to generate this adapter when
683 // verifying adapter equivalence.
684 unsigned char* _saved_code;
685 int _saved_code_length;
686 #endif
687
688 AdapterHandlerEntry(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry,
689 address c2i_unverified_entry,
690 address c2i_no_clinit_check_entry) :
691 _fingerprint(fingerprint),
692 _i2c_entry(i2c_entry),
693 _c2i_entry(c2i_entry),
694 _c2i_unverified_entry(c2i_unverified_entry),
695 _c2i_no_clinit_check_entry(c2i_no_clinit_check_entry)
696 #ifdef ASSERT
697 , _saved_code_length(0)
698 #endif
699 { }
700
701 ~AdapterHandlerEntry();
702
703 public:
704 address get_i2c_entry() const { return _i2c_entry; }
705 address get_c2i_entry() const { return _c2i_entry; }
706 address get_c2i_unverified_entry() const { return _c2i_unverified_entry; }
707 address get_c2i_no_clinit_check_entry() const { return _c2i_no_clinit_check_entry; }
708
709 address base_address();
710 void relocate(address new_base);
711
712 AdapterFingerPrint* fingerprint() const { return _fingerprint; }
713
714 #ifdef ASSERT
715 // Used to verify that code generated for shared adapters is equivalent
716 void save_code (unsigned char* code, int length);
717 bool compare_code(AdapterHandlerEntry* other);
718 #endif
719
720 //virtual void print_on(outputStream* st) const; DO NOT USE
721 void print_adapter_on(outputStream* st) const;
722 };
723
724 class AdapterHandlerLibrary: public AllStatic {
725 friend class SharedRuntime;
726 private:
727 static BufferBlob* _buffer; // the temporary code buffer in CodeCache
728 static AdapterHandlerEntry* _abstract_method_handler;
729 static AdapterHandlerEntry* _no_arg_handler;
730 static AdapterHandlerEntry* _int_arg_handler;
731 static AdapterHandlerEntry* _obj_arg_handler;
732 static AdapterHandlerEntry* _obj_int_arg_handler;
733 static AdapterHandlerEntry* _obj_obj_arg_handler;
734
735 static BufferBlob* buffer_blob();
736 static void initialize();
737 static AdapterHandlerEntry* create_adapter(AdapterBlob*& new_adapter,
738 int total_args_passed,
739 BasicType* sig_bt,
740 bool allocate_code_blob);
741 static AdapterHandlerEntry* get_simple_adapter(const methodHandle& method);
742 public:
743
744 static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint,
745 address i2c_entry,
746 address c2i_entry,
747 address c2i_unverified_entry,
748 address c2i_no_clinit_check_entry = nullptr);
749 static void create_native_wrapper(const methodHandle& method);
750 static AdapterHandlerEntry* get_adapter(const methodHandle& method);
751
752 static void print_handler(const CodeBlob* b) { print_handler_on(tty, b); }
753 static void print_handler_on(outputStream* st, const CodeBlob* b);
754 static bool contains(const CodeBlob* b);
755 #ifndef PRODUCT
756 static void print_statistics();
757 #endif // PRODUCT
758
759 };
760
761 #endif // SHARE_RUNTIME_SHAREDRUNTIME_HPP
|
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_RUNTIME_SHAREDRUNTIME_HPP
26 #define SHARE_RUNTIME_SHAREDRUNTIME_HPP
27
28 #include "classfile/compactHashtable.hpp"
29 #include "code/codeBlob.hpp"
30 #include "code/vmreg.hpp"
31 #include "interpreter/linkResolver.hpp"
32 #include "memory/allStatic.hpp"
33 #include "memory/metaspaceClosure.hpp"
34 #include "memory/resourceArea.hpp"
35 #include "runtime/stubDeclarations.hpp"
36 #include "utilities/macros.hpp"
37
38 class AdapterHandlerEntry;
39 class AdapterFingerPrint;
40 class vframeStream;
41
42 // Runtime is the base class for various runtime interfaces
43 // (InterpreterRuntime, CompilerRuntime, etc.). It provides
44 // shared functionality such as exception forwarding (C++ to
45 // Java exceptions), locking/unlocking mechanisms, statistical
46 // information, etc.
47
48 // define SharedStubId enum tags: wrong_method_id, etc
49
50 #define SHARED_STUB_ID_ENUM_DECLARE(name, type) STUB_ID_NAME(name),
51 enum class SharedStubId :int {
52 NO_STUBID = -1,
53 SHARED_STUBS_DO(SHARED_STUB_ID_ENUM_DECLARE)
101 // Counters
102 static int64_t _nof_megamorphic_calls; // total # of megamorphic calls (through vtable)
103 #endif // !PRODUCT
104
105 private:
106 static SafepointBlob* generate_handler_blob(SharedStubId id, address call_ptr);
107 static RuntimeStub* generate_resolve_blob(SharedStubId id, address destination);
108 static RuntimeStub* generate_throw_exception(SharedStubId id, address runtime_entry);
109 public:
110 static void generate_initial_stubs(void);
111 static void generate_stubs(void);
112 #if INCLUDE_JFR
113 static void generate_jfr_stubs(void);
114 // For c2: c_rarg0 is junk, call to runtime to write a checkpoint.
115 // It returns a jobject handle to the event writer.
116 // The handle is dereferenced and the return value is the event writer oop.
117 static RuntimeStub* generate_jfr_write_checkpoint();
118 // For c2: call to runtime to return a buffer lease.
119 static RuntimeStub* generate_jfr_return_lease();
120 #endif
121 static void init_adapter_library();
122
123 static const char *stub_name(SharedStubId id) {
124 assert(id > SharedStubId::NO_STUBID && id < SharedStubId::NUM_STUBIDS, "stub id out of range");
125 return _stub_names[(int)id];
126 }
127
128 // max bytes for each dtrace string parameter
129 enum { max_dtrace_string_size = 256 };
130
131 // The following arithmetic routines are used on platforms that do
132 // not have machine instructions to implement their functionality.
133 // Do not remove these.
134
135 // long arithmetics
136 static jlong lmul(jlong y, jlong x);
137 static jlong ldiv(jlong y, jlong x);
138 static jlong lrem(jlong y, jlong x);
139
140 // float and double remainder
141 static jfloat frem(jfloat x, jfloat y);
452 // by the time we reach the blob there is compiled code available. This allows
453 // the blob to pass the incoming stack pointer (the sender sp) in a known
454 // location for the interpreter to record. This is used by the frame code
455 // to correct the sender code to match up with the stack pointer when the
456 // thread left the compiled code. In addition it allows the interpreter
457 // to remove the space the c2i adapter allocated to do its argument conversion.
458
459 // Although a c2i blob will always run interpreted even if compiled code is
460 // present if we see that compiled code is present the compiled call site
461 // will be patched/re-resolved so that later calls will run compiled.
462
463 // Additionally a c2i blob need to have a unverified entry because it can be reached
464 // in situations where the call site is an inlined cache site and may go megamorphic.
465
466 // A i2c adapter is simpler than the c2i adapter. This is because it is assumed
467 // that the interpreter before it does any call dispatch will record the current
468 // stack pointer in the interpreter frame. On return it will restore the stack
469 // pointer as needed. This means the i2c adapter code doesn't need any special
470 // handshaking path with compiled code to keep the stack walking correct.
471
472 static void generate_i2c2i_adapters(MacroAssembler *_masm,
473 int total_args_passed,
474 int max_arg,
475 const BasicType *sig_bt,
476 const VMRegPair *regs,
477 AdapterHandlerEntry* handler);
478
479 static void gen_i2c_adapter(MacroAssembler *_masm,
480 int total_args_passed,
481 int comp_args_on_stack,
482 const BasicType *sig_bt,
483 const VMRegPair *regs);
484
485 // OSR support
486
487 // OSR_migration_begin will extract the jvm state from an interpreter
488 // frame (locals, monitors) and store the data in a piece of C heap
489 // storage. This then allows the interpreter frame to be removed from the
490 // stack and the OSR nmethod to be called. That method is called with a
491 // pointer to the C heap storage. This pointer is the return value from
492 // OSR_migration_begin.
493
494 static intptr_t* OSR_migration_begin(JavaThread *thread);
495
496 // OSR_migration_end is a trivial routine. It is called after the compiled
497 // method has extracted the jvm state from the C heap that OSR_migration_begin
553
554 // Resolving of calls
555 static address get_resolved_entry (JavaThread* current, methodHandle callee_method);
556 static address resolve_static_call_C (JavaThread* current);
557 static address resolve_virtual_call_C (JavaThread* current);
558 static address resolve_opt_virtual_call_C(JavaThread* current);
559
560 // arraycopy, the non-leaf version. (See StubRoutines for all the leaf calls.)
561 static void slow_arraycopy_C(oopDesc* src, jint src_pos,
562 oopDesc* dest, jint dest_pos,
563 jint length, JavaThread* thread);
564
565 // handle ic miss with caller being compiled code
566 // wrong method handling (inline cache misses)
567 static address handle_wrong_method(JavaThread* current);
568 static address handle_wrong_method_abstract(JavaThread* current);
569 static address handle_wrong_method_ic_miss(JavaThread* current);
570
571 static address handle_unsafe_access(JavaThread* thread, address next_pc);
572
573 private:
574 static PerfTickCounters* _perf_resolve_opt_virtual_total_time;
575 static PerfTickCounters* _perf_resolve_virtual_total_time;
576 static PerfTickCounters* _perf_resolve_static_total_time;
577 static PerfTickCounters* _perf_handle_wrong_method_total_time;
578 static PerfTickCounters* _perf_ic_miss_total_time;
579 public:
580 static uint _ic_miss_ctr; // total # of IC misses
581 static uint _wrong_method_ctr;
582 static uint _resolve_static_ctr;
583 static uint _resolve_virtual_ctr;
584 static uint _resolve_opt_virtual_ctr;
585
586 static void print_counters_on(outputStream* st);
587
588 #ifndef PRODUCT
589
590 // Collect and print inline cache miss statistics
591 private:
592 enum { maxICmiss_count = 100 };
593 static int _ICmiss_index; // length of IC miss histogram
594 static int _ICmiss_count[maxICmiss_count]; // miss counts
595 static address _ICmiss_at[maxICmiss_count]; // miss addresses
596 static void trace_ic_miss(address at);
597
598 public:
599 static uint _implicit_null_throws;
600 static uint _implicit_div0_throws;
601
602 static uint _jbyte_array_copy_ctr; // Slow-path byte array copy
603 static uint _jshort_array_copy_ctr; // Slow-path short array copy
604 static uint _jint_array_copy_ctr; // Slow-path int array copy
605 static uint _jlong_array_copy_ctr; // Slow-path long array copy
606 static uint _oop_array_copy_ctr; // Slow-path oop array copy
607 static uint _checkcast_array_copy_ctr; // Slow-path oop array copy, with cast
608 static uint _unsafe_array_copy_ctr; // Slow-path includes alignment checks
609 static uint _generic_array_copy_ctr; // Slow-path includes type decoding
610 static uint _slow_array_copy_ctr; // Slow-path failed out to a method call
611
612 static uint _unsafe_set_memory_ctr; // Slow-path includes alignment checks
613
614 static uint _new_instance_ctr; // 'new' object requires GC
615 static uint _new_array_ctr; // 'new' array requires GC
616 static uint _multi2_ctr, _multi3_ctr, _multi4_ctr, _multi5_ctr;
617 static uint _find_handler_ctr; // find exception handler
618 static uint _rethrow_ctr; // rethrow exception
622 static uint _mon_exit_ctr; // monitor exit slow
623 static uint _partial_subtype_ctr; // SubRoutines::partial_subtype_check
624
625 // Statistics code
626 // stats for "normal" compiled calls (non-interface)
627 static int64_t _nof_normal_calls; // total # of calls
628 static int64_t _nof_inlined_calls; // total # of inlined normal calls
629 static int64_t _nof_static_calls; // total # of calls to static methods or super methods (invokespecial)
630 static int64_t _nof_inlined_static_calls; // total # of inlined static calls
631 // stats for compiled interface calls
632 static int64_t _nof_interface_calls; // total # of compiled calls
633 static int64_t _nof_inlined_interface_calls; // total # of inlined interface calls
634
635 public: // for compiler
636 static address nof_normal_calls_addr() { return (address)&_nof_normal_calls; }
637 static address nof_inlined_calls_addr() { return (address)&_nof_inlined_calls; }
638 static address nof_static_calls_addr() { return (address)&_nof_static_calls; }
639 static address nof_inlined_static_calls_addr() { return (address)&_nof_inlined_static_calls; }
640 static address nof_interface_calls_addr() { return (address)&_nof_interface_calls; }
641 static address nof_inlined_interface_calls_addr() { return (address)&_nof_inlined_interface_calls; }
642
643 static void print_call_statistics_on(outputStream* st);
644 static void print_ic_miss_histogram_on(outputStream* st);
645 #endif // PRODUCT
646
647 static void print_statistics() PRODUCT_RETURN;
648 };
649
650
651 // ---------------------------------------------------------------------------
652 // Implementation of AdapterHandlerLibrary
653 //
654 // This library manages argument marshaling adapters and native wrappers.
655 // There are 2 flavors of adapters: I2C and C2I.
656 //
657 // The I2C flavor takes a stock interpreted call setup, marshals the
658 // arguments for a Java-compiled call, and jumps to Rmethod-> code()->
659 // code_begin(). It is broken to call it without an nmethod assigned.
660 // The usual behavior is to lift any register arguments up out of the
661 // stack and possibly re-pack the extra arguments to be contiguous.
662 // I2C adapters will save what the interpreter's stack pointer will be
663 // after arguments are popped, then adjust the interpreter's frame
664 // size to force alignment and possibly to repack the arguments.
665 // After re-packing, it jumps to the compiled code start. There are
666 // no safepoints in this adapter code and a GC cannot happen while
667 // marshaling is in progress.
668 //
669 // The C2I flavor takes a stock compiled call setup plus the target method in
670 // Rmethod, marshals the arguments for an interpreted call and jumps to
671 // Rmethod->_i2i_entry. On entry, the interpreted frame has not yet been
672 // setup. Compiled frames are fixed-size and the args are likely not in the
673 // right place. Hence all the args will likely be copied into the
674 // interpreter's frame, forcing that frame to grow. The compiled frame's
675 // outgoing stack args will be dead after the copy.
676 //
677 // Native wrappers, like adapters, marshal arguments. Unlike adapters they
678 // also perform an official frame push & pop. They have a call to the native
679 // routine in their middles and end in a return (instead of ending in a jump).
680 // The native wrappers are stored in real nmethods instead of the BufferBlobs
681 // used by the adapters. The code generation happens here because it's very
682 // similar to what the adapters have to do.
683
684 class AdapterHandlerEntry : public MetaspaceObj {
685 friend class AdapterHandlerLibrary;
686
687 private:
688 AdapterFingerPrint* _fingerprint;
689 address _i2c_entry;
690 address _c2i_entry;
691 address _c2i_unverified_entry;
692 address _c2i_no_clinit_check_entry;
693 bool _linked;
694
695 #ifdef ASSERT
696 // Captures code and signature used to generate this adapter when
697 // verifying adapter equivalence.
698 unsigned char* _saved_code;
699 int _saved_code_length;
700 #endif
701
702 AdapterHandlerEntry(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry,
703 address c2i_unverified_entry,
704 address c2i_no_clinit_check_entry) :
705 _fingerprint(fingerprint),
706 _i2c_entry(i2c_entry),
707 _c2i_entry(c2i_entry),
708 _c2i_unverified_entry(c2i_unverified_entry),
709 _c2i_no_clinit_check_entry(c2i_no_clinit_check_entry),
710 _linked(false)
711 #ifdef ASSERT
712 , _saved_code_length(0)
713 #endif
714 { }
715
716 ~AdapterHandlerEntry();
717
718 public:
719 static AdapterHandlerEntry* allocate(AdapterFingerPrint* fingerprint,
720 address i2c_entry,
721 address c2i_entry,
722 address c2i_unverified_entry,
723 address c2i_no_clinit_check_entry)
724 {
725 return new (mtCode) AdapterHandlerEntry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry, c2i_no_clinit_check_entry);
726 }
727
728 static void deallocate(AdapterHandlerEntry *handler) {
729 handler->~AdapterHandlerEntry();
730 }
731
732 void set_entry_points(address i2c_entry, address c2i_entry, address c2i_unverified_entry, address c2i_no_clinit_check_entry, bool linked = true) {
733 _i2c_entry = i2c_entry;
734 _c2i_entry = c2i_entry;
735 _c2i_unverified_entry = c2i_unverified_entry;
736 _c2i_no_clinit_check_entry = c2i_no_clinit_check_entry;
737 _linked = linked;
738 }
739
740 address get_i2c_entry() const { return _i2c_entry; }
741 address get_c2i_entry() const { return _c2i_entry; }
742 address get_c2i_unverified_entry() const { return _c2i_unverified_entry; }
743 address get_c2i_no_clinit_check_entry() const { return _c2i_no_clinit_check_entry; }
744
745 bool is_linked() const { return _linked; }
746 address base_address();
747 void relocate(address new_base);
748
749 AdapterFingerPrint* fingerprint() const { return _fingerprint; }
750
751 #ifdef ASSERT
752 // Used to verify that code generated for shared adapters is equivalent
753 void save_code (unsigned char* code, int length);
754 bool compare_code(AdapterHandlerEntry* other);
755 #endif
756
757 //virtual void print_on(outputStream* st) const; DO NOT USE
758 void print_adapter_on(outputStream* st) const;
759
760 void metaspace_pointers_do(MetaspaceClosure* it);
761 int size() const {return (int)heap_word_size(sizeof(AdapterHandlerEntry)); }
762 MetaspaceObj::Type type() const { return AdapterHandlerEntryType; }
763
764 void remove_unshareable_info() NOT_CDS_RETURN;
765 void restore_unshareable_info(TRAPS) NOT_CDS_RETURN;
766 };
767
768 #if INCLUDE_CDS
769 class ArchivedAdapterTable;
770 #endif // INCLUDE_CDS
771
772 class AdapterHandlerLibrary: public AllStatic {
773 friend class SharedRuntime;
774 private:
775 static BufferBlob* _buffer; // the temporary code buffer in CodeCache
776 static AdapterHandlerEntry* _abstract_method_handler;
777 static AdapterHandlerEntry* _no_arg_handler;
778 static AdapterHandlerEntry* _int_arg_handler;
779 static AdapterHandlerEntry* _obj_arg_handler;
780 static AdapterHandlerEntry* _obj_int_arg_handler;
781 static AdapterHandlerEntry* _obj_obj_arg_handler;
782 #if INCLUDE_CDS
783 static ArchivedAdapterTable _archived_adapter_handler_table;
784 #endif // INCLUDE_CDS
785 static BufferBlob* buffer_blob();
786 static void initialize();
787 static AdapterHandlerEntry* create_simple_adapter(AdapterBlob*& new_adapter,
788 int total_args_passed,
789 BasicType* sig_bt);
790 static AdapterHandlerEntry* get_simple_adapter(const methodHandle& method);
791 static bool lookup_aot_cache(AdapterHandlerEntry* handler, CodeBuffer* buffer);
792 static AdapterHandlerEntry* create_adapter(AdapterBlob*& new_adapter,
793 AdapterFingerPrint* fingerprint,
794 int total_args_passed,
795 BasicType* sig_bt,
796 bool is_transient);
797 #ifndef PRODUCT
798 static void print_adapter_handler_info(AdapterHandlerEntry* handler, AdapterBlob* adapter_blob);
799 #endif // PRODUCT
800 public:
801
802 static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint,
803 address i2c_entry = nullptr,
804 address c2i_entry = nullptr,
805 address c2i_unverified_entry = nullptr,
806 address c2i_no_clinit_check_entry = nullptr);
807 static void create_native_wrapper(const methodHandle& method);
808 static AdapterHandlerEntry* get_adapter(const methodHandle& method);
809 static AdapterHandlerEntry* lookup(AdapterFingerPrint* fp);
810 static bool generate_adapter_code(AdapterBlob*& adapter_blob,
811 AdapterHandlerEntry* handler,
812 int total_args_passed,
813 BasicType* sig_bt,
814 bool is_transient);
815
816 static void print_handler(const CodeBlob* b) { print_handler_on(tty, b); }
817 static void print_handler_on(outputStream* st, const CodeBlob* b);
818 static bool contains(const CodeBlob* b);
819 static const char* name(AdapterFingerPrint* fingerprint);
820 static uint32_t id(AdapterFingerPrint* fingerprint);
821 #ifndef PRODUCT
822 static void print_statistics_on(outputStream* st);
823 #endif // PRODUCT
824
825 static bool is_abstract_method_adapter(AdapterHandlerEntry* adapter);
826
827 static bool link_adapter_handler(AdapterHandlerEntry* handler, AdapterBlob*& adapter_blob) NOT_CDS_RETURN_(false);
828 static size_t estimate_size_for_archive() NOT_CDS_RETURN_(0);
829 static void archive_adapter_table() NOT_CDS_RETURN;
830 static void serialize_shared_table_header(SerializeClosure* soc) NOT_CDS_RETURN;
831 };
832
833 #endif // SHARE_RUNTIME_SHAREDRUNTIME_HPP
|