< prev index next >

src/hotspot/share/runtime/sharedRuntime.hpp

Print this page

  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
< prev index next >