sharedRuntime.hpp revision 342:37f87013dfd8
1/*
2 * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation.
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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25class AdapterHandlerEntry;
26class vframeStream;
27
28// Runtime is the base class for various runtime interfaces
29// (InterpreterRuntime, CompilerRuntime, etc.). It provides
30// shared functionality such as exception forwarding (C++ to
31// Java exceptions), locking/unlocking mechanisms, statistical
32// information, etc.
33
34class SharedRuntime: AllStatic {
35 private:
36  static methodHandle resolve_sub_helper(JavaThread *thread,
37                                     bool is_virtual,
38                                     bool is_optimized, TRAPS);
39
40  // Shared stub locations
41
42  static RuntimeStub* _wrong_method_blob;
43  static RuntimeStub* _ic_miss_blob;
44  static RuntimeStub* _resolve_opt_virtual_call_blob;
45  static RuntimeStub* _resolve_virtual_call_blob;
46  static RuntimeStub* _resolve_static_call_blob;
47
48  static SafepointBlob* _polling_page_safepoint_handler_blob;
49  static SafepointBlob* _polling_page_return_handler_blob;
50#ifdef COMPILER2
51  static ExceptionBlob*       _exception_blob;
52  static UncommonTrapBlob*    _uncommon_trap_blob;
53#endif // COMPILER2
54
55#ifndef PRODUCT
56
57  // Counters
58  static int     _nof_megamorphic_calls;         // total # of megamorphic calls (through vtable)
59
60#endif // !PRODUCT
61 public:
62
63  // max bytes for each dtrace string parameter
64  enum { max_dtrace_string_size = 256 };
65
66  // The following arithmetic routines are used on platforms that do
67  // not have machine instructions to implement their functionality.
68  // Do not remove these.
69
70  // long arithmetics
71  static jlong   lmul(jlong y, jlong x);
72  static jlong   ldiv(jlong y, jlong x);
73  static jlong   lrem(jlong y, jlong x);
74
75  // float and double remainder
76  static jfloat  frem(jfloat  x, jfloat  y);
77  static jdouble drem(jdouble x, jdouble y);
78
79  // float conversion (needs to set appropriate rounding mode)
80  static jint    f2i (jfloat  x);
81  static jlong   f2l (jfloat  x);
82  static jint    d2i (jdouble x);
83  static jlong   d2l (jdouble x);
84  static jfloat  d2f (jdouble x);
85  static jfloat  l2f (jlong   x);
86  static jdouble l2d (jlong   x);
87
88  // double trigonometrics and transcendentals
89  static jdouble dsin(jdouble x);
90  static jdouble dcos(jdouble x);
91  static jdouble dtan(jdouble x);
92  static jdouble dlog(jdouble x);
93  static jdouble dlog10(jdouble x);
94  static jdouble dexp(jdouble x);
95  static jdouble dpow(jdouble x, jdouble y);
96
97
98  // exception handling across interpreter/compiler boundaries
99  static address raw_exception_handler_for_return_address(address return_address);
100  static address exception_handler_for_return_address(address return_address);
101
102#ifndef SERIALGC
103  // G1 write barriers
104  static void g1_wb_pre(oopDesc* orig, JavaThread *thread);
105  static void g1_wb_post(void* card_addr, JavaThread* thread);
106#endif // !SERIALGC
107
108  // exception handling and implicit exceptions
109  static address compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception,
110                                              bool force_unwind, bool top_frame_only);
111  enum ImplicitExceptionKind {
112    IMPLICIT_NULL,
113    IMPLICIT_DIVIDE_BY_ZERO,
114    STACK_OVERFLOW
115  };
116  static void    throw_AbstractMethodError(JavaThread* thread);
117  static void    throw_IncompatibleClassChangeError(JavaThread* thread);
118  static void    throw_ArithmeticException(JavaThread* thread);
119  static void    throw_NullPointerException(JavaThread* thread);
120  static void    throw_NullPointerException_at_call(JavaThread* thread);
121  static void    throw_StackOverflowError(JavaThread* thread);
122  static address continuation_for_implicit_exception(JavaThread* thread,
123                                                     address faulting_pc,
124                                                     ImplicitExceptionKind exception_kind);
125
126  // Shared stub locations
127  static address get_poll_stub(address pc);
128
129  static address get_ic_miss_stub() {
130    assert(_ic_miss_blob!= NULL, "oops");
131    return _ic_miss_blob->instructions_begin();
132  }
133
134  static address get_handle_wrong_method_stub() {
135    assert(_wrong_method_blob!= NULL, "oops");
136    return _wrong_method_blob->instructions_begin();
137  }
138
139#ifdef COMPILER2
140  static void generate_uncommon_trap_blob(void);
141  static UncommonTrapBlob* uncommon_trap_blob()                  { return _uncommon_trap_blob; }
142#endif // COMPILER2
143
144  static address get_resolve_opt_virtual_call_stub(){
145    assert(_resolve_opt_virtual_call_blob != NULL, "oops");
146    return _resolve_opt_virtual_call_blob->instructions_begin();
147  }
148  static address get_resolve_virtual_call_stub() {
149    assert(_resolve_virtual_call_blob != NULL, "oops");
150    return _resolve_virtual_call_blob->instructions_begin();
151  }
152  static address get_resolve_static_call_stub() {
153    assert(_resolve_static_call_blob != NULL, "oops");
154    return _resolve_static_call_blob->instructions_begin();
155  }
156
157  static SafepointBlob* polling_page_return_handler_blob()     { return _polling_page_return_handler_blob; }
158  static SafepointBlob* polling_page_safepoint_handler_blob()  { return _polling_page_safepoint_handler_blob; }
159
160  // Counters
161#ifndef PRODUCT
162  static address nof_megamorphic_calls_addr() { return (address)&_nof_megamorphic_calls; }
163#endif // PRODUCT
164
165  // Helper routine for full-speed JVMTI exception throwing support
166  static void throw_and_post_jvmti_exception(JavaThread *thread, Handle h_exception);
167  static void throw_and_post_jvmti_exception(JavaThread *thread, symbolOop name, const char *message = NULL);
168
169  // To be used as the entry point for unresolved native methods.
170  static address native_method_throw_unsatisfied_link_error_entry();
171
172  // bytecode tracing is only used by the TraceBytecodes
173  static intptr_t trace_bytecode(JavaThread* thread, intptr_t preserve_this_value, intptr_t tos, intptr_t tos2) PRODUCT_RETURN0;
174
175  // Used to back off a spin lock that is under heavy contention
176  static void yield_all(JavaThread* thread, int attempts = 0);
177
178  static oop retrieve_receiver( symbolHandle sig, frame caller );
179
180  static void verify_caller_frame(frame caller_frame, methodHandle callee_method) PRODUCT_RETURN;
181  static methodHandle find_callee_method_inside_interpreter(frame caller_frame, methodHandle caller_method, int bci) PRODUCT_RETURN_(return methodHandle(););
182
183  static void register_finalizer(JavaThread* thread, oopDesc* obj);
184
185  // dtrace notifications
186  static int dtrace_object_alloc(oopDesc* o);
187  static int dtrace_object_alloc_base(Thread* thread, oopDesc* o);
188  static int dtrace_method_entry(JavaThread* thread, methodOopDesc* m);
189  static int dtrace_method_exit(JavaThread* thread, methodOopDesc* m);
190
191  // Utility method for retrieving the Java thread id, returns 0 if the
192  // thread is not a well formed Java thread.
193  static jlong get_java_tid(Thread* thread);
194
195
196  // used by native wrappers to reenable yellow if overflow happened in native code
197  static void reguard_yellow_pages();
198
199  /**
200   * Fill in the "X cannot be cast to a Y" message for ClassCastException
201   *
202   * @param thr the current thread
203   * @param name the name of the class of the object attempted to be cast
204   * @return the dynamically allocated exception message (must be freed
205   * by the caller using a resource mark)
206   *
207   * BCP must refer to the current 'checkcast' opcode for the frame
208   * on top of the stack.
209   * The caller (or one of it's callers) must use a ResourceMark
210   * in order to correctly free the result.
211   */
212  static char* generate_class_cast_message(JavaThread* thr, const char* name);
213
214  /**
215   * Fill in the "X cannot be cast to a Y" message for ClassCastException
216   *
217   * @param name the name of the class of the object attempted to be cast
218   * @param klass the name of the target klass attempt
219   * @return the dynamically allocated exception message (must be freed
220   * by the caller using a resource mark)
221   *
222   * This version does not require access the frame, so it can be called
223   * from interpreted code
224   * The caller (or one of it's callers) must use a ResourceMark
225   * in order to correctly free the result.
226   */
227  static char* generate_class_cast_message(const char* name, const char* klass);
228
229  // Resolves a call site- may patch in the destination of the call into the
230  // compiled code.
231  static methodHandle resolve_helper(JavaThread *thread,
232                                     bool is_virtual,
233                                     bool is_optimized, TRAPS);
234
235  static void generate_stubs(void);
236
237  private:
238  // deopt blob
239  static void generate_deopt_blob(void);
240  static DeoptimizationBlob* _deopt_blob;
241
242  public:
243  static DeoptimizationBlob* deopt_blob(void)      { return _deopt_blob; }
244
245  // Resets a call-site in compiled code so it will get resolved again.
246  static methodHandle reresolve_call_site(JavaThread *thread, TRAPS);
247
248  // In the code prolog, if the klass comparison fails, the inline cache
249  // misses and the call site is patched to megamorphic
250  static methodHandle handle_ic_miss_helper(JavaThread* thread, TRAPS);
251
252  // Find the method that called us.
253  static methodHandle find_callee_method(JavaThread* thread, TRAPS);
254
255
256 private:
257  static Handle find_callee_info(JavaThread* thread,
258                                 Bytecodes::Code& bc,
259                                 CallInfo& callinfo, TRAPS);
260  static Handle find_callee_info_helper(JavaThread* thread,
261                                        vframeStream& vfst,
262                                        Bytecodes::Code& bc,
263                                        CallInfo& callinfo, TRAPS);
264
265  static address clean_virtual_call_entry();
266  static address clean_opt_virtual_call_entry();
267  static address clean_static_call_entry();
268
269 public:
270
271  // Read the array of BasicTypes from a Java signature, and compute where
272  // compiled Java code would like to put the results.  Values in reg_lo and
273  // reg_hi refer to 4-byte quantities.  Values less than SharedInfo::stack0 are
274  // registers, those above refer to 4-byte stack slots.  All stack slots are
275  // based off of the window top.  SharedInfo::stack0 refers to the first usable
276  // slot in the bottom of the frame. SharedInfo::stack0+1 refers to the memory word
277  // 4-bytes higher. So for sparc because the register window save area is at
278  // the bottom of the frame the first 16 words will be skipped and SharedInfo::stack0
279  // will be just above it. (
280  // return value is the maximum number of VMReg stack slots the convention will use.
281  static int java_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed, int is_outgoing);
282
283  // Ditto except for calling C
284  static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed);
285
286  // Generate I2C and C2I adapters. These adapters are simple argument marshalling
287  // blobs. Unlike adapters in the tiger and earlier releases the code in these
288  // blobs does not create a new frame and are therefore virtually invisible
289  // to the stack walking code. In general these blobs extend the callers stack
290  // as needed for the conversion of argument locations.
291
292  // When calling a c2i blob the code will always call the interpreter even if
293  // by the time we reach the blob there is compiled code available. This allows
294  // the blob to pass the incoming stack pointer (the sender sp) in a known
295  // location for the interpreter to record. This is used by the frame code
296  // to correct the sender code to match up with the stack pointer when the
297  // thread left the compiled code. In addition it allows the interpreter
298  // to remove the space the c2i adapter allocated to do it argument conversion.
299
300  // Although a c2i blob will always run interpreted even if compiled code is
301  // present if we see that compiled code is present the compiled call site
302  // will be patched/re-resolved so that later calls will run compiled.
303
304  // Aditionally a c2i blob need to have a unverified entry because it can be reached
305  // in situations where the call site is an inlined cache site and may go megamorphic.
306
307  // A i2c adapter is simpler than the c2i adapter. This is because it is assumed
308  // that the interpreter before it does any call dispatch will record the current
309  // stack pointer in the interpreter frame. On return it will restore the stack
310  // pointer as needed. This means the i2c adapter code doesn't need any special
311  // handshaking path with compiled code to keep the stack walking correct.
312
313  static AdapterHandlerEntry* generate_i2c2i_adapters(MacroAssembler *_masm,
314                                                      int total_args_passed,
315                                                      int max_arg,
316                                                      const BasicType *sig_bt,
317                                                      const VMRegPair *regs);
318
319  // OSR support
320
321  // OSR_migration_begin will extract the jvm state from an interpreter
322  // frame (locals, monitors) and store the data in a piece of C heap
323  // storage. This then allows the interpreter frame to be removed from the
324  // stack and the OSR nmethod to be called. That method is called with a
325  // pointer to the C heap storage. This pointer is the return value from
326  // OSR_migration_begin.
327
328  static intptr_t* OSR_migration_begin( JavaThread *thread);
329
330  // OSR_migration_end is a trivial routine. It is called after the compiled
331  // method has extracted the jvm state from the C heap that OSR_migration_begin
332  // created. It's entire job is to simply free this storage.
333  static void      OSR_migration_end  ( intptr_t* buf);
334
335  // Convert a sig into a calling convention register layout
336  // and find interesting things about it.
337  static VMRegPair* find_callee_arguments(symbolOop sig, bool is_static, int *arg_size);
338  static VMReg     name_for_receiver();
339
340  // "Top of Stack" slots that may be unused by the calling convention but must
341  // otherwise be preserved.
342  // On Intel these are not necessary and the value can be zero.
343  // On Sparc this describes the words reserved for storing a register window
344  // when an interrupt occurs.
345  static uint out_preserve_stack_slots();
346
347  // Save and restore a native result
348  static void    save_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots );
349  static void restore_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots );
350
351  // Generate a native wrapper for a given method.  The method takes arguments
352  // in the Java compiled code convention, marshals them to the native
353  // convention (handlizes oops, etc), transitions to native, makes the call,
354  // returns to java state (possibly blocking), unhandlizes any result and
355  // returns.
356  static nmethod *generate_native_wrapper(MacroAssembler* masm,
357                                          methodHandle method,
358                                          int total_args_passed,
359                                          int max_arg,
360                                          BasicType *sig_bt,
361                                          VMRegPair *regs,
362                                          BasicType ret_type );
363
364#ifdef HAVE_DTRACE_H
365  // Generate a dtrace wrapper for a given method.  The method takes arguments
366  // in the Java compiled code convention, marshals them to the native
367  // convention (handlizes oops, etc), transitions to native, makes the call,
368  // returns to java state (possibly blocking), unhandlizes any result and
369  // returns.
370  static nmethod *generate_dtrace_nmethod(MacroAssembler* masm,
371                                          methodHandle method);
372
373  // dtrace support to convert a Java string to utf8
374  static void get_utf(oopDesc* src, address dst);
375#endif // def HAVE_DTRACE_H
376
377  // A compiled caller has just called the interpreter, but compiled code
378  // exists.  Patch the caller so he no longer calls into the interpreter.
379  static void fixup_callers_callsite(methodOopDesc* moop, address ret_pc);
380
381  // Slow-path Locking and Unlocking
382  static void complete_monitor_locking_C(oopDesc* obj, BasicLock* lock, JavaThread* thread);
383  static void complete_monitor_unlocking_C(oopDesc* obj, BasicLock* lock);
384
385  // Resolving of calls
386  static address resolve_static_call_C     (JavaThread *thread);
387  static address resolve_virtual_call_C    (JavaThread *thread);
388  static address resolve_opt_virtual_call_C(JavaThread *thread);
389
390  // arraycopy, the non-leaf version.  (See StubRoutines for all the leaf calls.)
391  static void slow_arraycopy_C(oopDesc* src,  jint src_pos,
392                               oopDesc* dest, jint dest_pos,
393                               jint length, JavaThread* thread);
394
395  // handle ic miss with caller being compiled code
396  // wrong method handling (inline cache misses, zombie methods)
397  static address handle_wrong_method(JavaThread* thread);
398  static address handle_wrong_method_ic_miss(JavaThread* thread);
399
400#ifndef PRODUCT
401
402  // Collect and print inline cache miss statistics
403 private:
404  enum { maxICmiss_count = 100 };
405  static int     _ICmiss_index;                  // length of IC miss histogram
406  static int     _ICmiss_count[maxICmiss_count]; // miss counts
407  static address _ICmiss_at[maxICmiss_count];    // miss addresses
408  static void trace_ic_miss(address at);
409
410 public:
411  static int _monitor_enter_ctr;                 // monitor enter slow
412  static int _monitor_exit_ctr;                  // monitor exit slow
413  static int _throw_null_ctr;                    // throwing a null-pointer exception
414  static int _ic_miss_ctr;                       // total # of IC misses
415  static int _wrong_method_ctr;
416  static int _resolve_static_ctr;
417  static int _resolve_virtual_ctr;
418  static int _resolve_opt_virtual_ctr;
419  static int _implicit_null_throws;
420  static int _implicit_div0_throws;
421
422  static int _jbyte_array_copy_ctr;        // Slow-path byte array copy
423  static int _jshort_array_copy_ctr;       // Slow-path short array copy
424  static int _jint_array_copy_ctr;         // Slow-path int array copy
425  static int _jlong_array_copy_ctr;        // Slow-path long array copy
426  static int _oop_array_copy_ctr;          // Slow-path oop array copy
427  static int _checkcast_array_copy_ctr;    // Slow-path oop array copy, with cast
428  static int _unsafe_array_copy_ctr;       // Slow-path includes alignment checks
429  static int _generic_array_copy_ctr;      // Slow-path includes type decoding
430  static int _slow_array_copy_ctr;         // Slow-path failed out to a method call
431
432  static int _new_instance_ctr;            // 'new' object requires GC
433  static int _new_array_ctr;               // 'new' array requires GC
434  static int _multi1_ctr, _multi2_ctr, _multi3_ctr, _multi4_ctr, _multi5_ctr;
435  static int _find_handler_ctr;            // find exception handler
436  static int _rethrow_ctr;                 // rethrow exception
437  static int _mon_enter_stub_ctr;          // monitor enter stub
438  static int _mon_exit_stub_ctr;           // monitor exit stub
439  static int _mon_enter_ctr;               // monitor enter slow
440  static int _mon_exit_ctr;                // monitor exit slow
441  static int _partial_subtype_ctr;         // SubRoutines::partial_subtype_check
442
443  // Statistics code
444  // stats for "normal" compiled calls (non-interface)
445  static int     _nof_normal_calls;              // total # of calls
446  static int     _nof_optimized_calls;           // total # of statically-bound calls
447  static int     _nof_inlined_calls;             // total # of inlined normal calls
448  static int     _nof_static_calls;              // total # of calls to static methods or super methods (invokespecial)
449  static int     _nof_inlined_static_calls;      // total # of inlined static calls
450  // stats for compiled interface calls
451  static int     _nof_interface_calls;           // total # of compiled calls
452  static int     _nof_optimized_interface_calls; // total # of statically-bound interface calls
453  static int     _nof_inlined_interface_calls;   // total # of inlined interface calls
454  static int     _nof_megamorphic_interface_calls;// total # of megamorphic interface calls
455  // stats for runtime exceptions
456  static int     _nof_removable_exceptions;      // total # of exceptions that could be replaced by branches due to inlining
457
458 public: // for compiler
459  static address nof_normal_calls_addr()                { return (address)&_nof_normal_calls; }
460  static address nof_optimized_calls_addr()             { return (address)&_nof_optimized_calls; }
461  static address nof_inlined_calls_addr()               { return (address)&_nof_inlined_calls; }
462  static address nof_static_calls_addr()                { return (address)&_nof_static_calls; }
463  static address nof_inlined_static_calls_addr()        { return (address)&_nof_inlined_static_calls; }
464  static address nof_interface_calls_addr()             { return (address)&_nof_interface_calls; }
465  static address nof_optimized_interface_calls_addr()   { return (address)&_nof_optimized_interface_calls; }
466  static address nof_inlined_interface_calls_addr()     { return (address)&_nof_inlined_interface_calls; }
467  static address nof_megamorphic_interface_calls_addr() { return (address)&_nof_megamorphic_interface_calls; }
468  static void print_call_statistics(int comp_total);
469  static void print_statistics();
470  static void print_ic_miss_histogram();
471
472#endif // PRODUCT
473};
474
475
476// ---------------------------------------------------------------------------
477// Implementation of AdapterHandlerLibrary
478//
479// This library manages argument marshaling adapters and native wrappers.
480// There are 2 flavors of adapters: I2C and C2I.
481//
482// The I2C flavor takes a stock interpreted call setup, marshals the arguments
483// for a Java-compiled call, and jumps to Rmethod-> code()->
484// instructions_begin().  It is broken to call it without an nmethod assigned.
485// The usual behavior is to lift any register arguments up out of the stack
486// and possibly re-pack the extra arguments to be contigious.  I2C adapters
487// will save what the interpreter's stack pointer will be after arguments are
488// popped, then adjust the interpreter's frame size to force alignment and
489// possibly to repack the arguments.  After re-packing, it jumps to the
490// compiled code start.  There are no safepoints in this adapter code and a GC
491// cannot happen while marshaling is in progress.
492//
493// The C2I flavor takes a stock compiled call setup plus the target method in
494// Rmethod, marshals the arguments for an interpreted call and jumps to
495// Rmethod->_i2i_entry.  On entry, the interpreted frame has not yet been
496// setup.  Compiled frames are fixed-size and the args are likely not in the
497// right place.  Hence all the args will likely be copied into the
498// interpreter's frame, forcing that frame to grow.  The compiled frame's
499// outgoing stack args will be dead after the copy.
500//
501// Native wrappers, like adapters, marshal arguments.  Unlike adapters they
502// also perform an offical frame push & pop.  They have a call to the native
503// routine in their middles and end in a return (instead of ending in a jump).
504// The native wrappers are stored in real nmethods instead of the BufferBlobs
505// used by the adapters.  The code generation happens here because it's very
506// similar to what the adapters have to do.
507
508class AdapterHandlerEntry : public CHeapObj {
509 private:
510  address _i2c_entry;
511  address _c2i_entry;
512  address _c2i_unverified_entry;
513
514 public:
515
516  // The name we give all buffer blobs
517  static const char* name;
518
519  AdapterHandlerEntry(address i2c_entry, address c2i_entry, address c2i_unverified_entry):
520    _i2c_entry(i2c_entry),
521    _c2i_entry(c2i_entry),
522    _c2i_unverified_entry(c2i_unverified_entry) {
523  }
524
525  address get_i2c_entry()            { return _i2c_entry; }
526  address get_c2i_entry()            { return _c2i_entry; }
527  address get_c2i_unverified_entry() { return _c2i_unverified_entry; }
528
529  void relocate(address new_base);
530#ifndef PRODUCT
531  void print();
532#endif /* PRODUCT */
533};
534
535class AdapterHandlerLibrary: public AllStatic {
536 private:
537  static u_char                   _buffer[];  // the temporary code buffer
538  static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection
539  static GrowableArray<AdapterHandlerEntry*> * _handlers; // the corresponding handlers
540  enum {
541    AbstractMethodHandler = 1 // special handler for abstract methods
542  };
543  static void initialize();
544  static int get_create_adapter_index(methodHandle method);
545  static address get_i2c_entry( int index ) {
546    return get_entry(index)->get_i2c_entry();
547  }
548  static address get_c2i_entry( int index ) {
549    return get_entry(index)->get_c2i_entry();
550  }
551  static address get_c2i_unverified_entry( int index ) {
552    return get_entry(index)->get_c2i_unverified_entry();
553  }
554
555 public:
556  static AdapterHandlerEntry* get_entry( int index ) { return _handlers->at(index); }
557  static nmethod* create_native_wrapper(methodHandle method);
558  static AdapterHandlerEntry* get_adapter(methodHandle method)  {
559    return get_entry(get_create_adapter_index(method));
560  }
561#ifdef HAVE_DTRACE_H
562  static nmethod* create_dtrace_nmethod (methodHandle method);
563#endif // HAVE_DTRACE_H
564
565#ifndef PRODUCT
566  static void print_handler(CodeBlob* b);
567  static bool contains(CodeBlob* b);
568#endif /* PRODUCT */
569
570};
571