diff -r 00cf4bffd828 -r 99d43e8a76ad hotspot/src/share/vm/runtime/sharedRuntime.hpp --- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Apr 16 17:36:29 2008 -0400 +++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Thu Apr 17 22:18:15 2008 -0400 @@ -59,6 +59,10 @@ #endif // !PRODUCT public: + + // max bytes for each dtrace string parameter + enum { max_dtrace_string_size = 256 }; + // The following arithmetic routines are used on platforms that do // not have machine instructions to implement their functionality. // Do not remove these. @@ -258,9 +262,6 @@ public: - - static void create_native_wrapper (JavaThread* thread, methodOop method); - // Read the array of BasicTypes from a Java signature, and compute where // compiled Java code would like to put the results. Values in reg_lo and // reg_hi refer to 4-byte quantities. Values less than SharedInfo::stack0 are @@ -354,6 +355,19 @@ VMRegPair *regs, BasicType ret_type ); +#ifdef HAVE_DTRACE_H + // Generate a dtrace wrapper for a given method. The method takes arguments + // in the Java compiled code convention, marshals them to the native + // convention (handlizes oops, etc), transitions to native, makes the call, + // returns to java state (possibly blocking), unhandlizes any result and + // returns. + static nmethod *generate_dtrace_nmethod(MacroAssembler* masm, + methodHandle method); + + // dtrace support to convert a Java string to utf8 + static void get_utf(oopDesc* src, address dst); +#endif // def HAVE_DTRACE_H + // A compiled caller has just called the interpreter, but compiled code // exists. Patch the caller so he no longer calls into the interpreter. static void fixup_callers_callsite(methodOopDesc* moop, address ret_pc); @@ -492,42 +506,55 @@ address _c2i_unverified_entry; public: + + // The name we give all buffer blobs + static const char* name; + AdapterHandlerEntry(address i2c_entry, address c2i_entry, address c2i_unverified_entry): _i2c_entry(i2c_entry), _c2i_entry(c2i_entry), _c2i_unverified_entry(c2i_unverified_entry) { } - // The name we give all buffer blobs - static const char* name; address get_i2c_entry() { return _i2c_entry; } address get_c2i_entry() { return _c2i_entry; } address get_c2i_unverified_entry() { return _c2i_unverified_entry; } + void relocate(address new_base); #ifndef PRODUCT void print(); #endif /* PRODUCT */ }; - class AdapterHandlerLibrary: public AllStatic { private: + static u_char _buffer[]; // the temporary code buffer + static GrowableArray* _fingerprints; // the fingerprint collection + static GrowableArray * _handlers; // the corresponding handlers enum { AbstractMethodHandler = 1 // special handler for abstract methods }; - static GrowableArray* _fingerprints; // the fingerprint collection - static GrowableArray * _handlers; // the corresponding handlers - static u_char _buffer[]; // the temporary code buffer static void initialize(); - static AdapterHandlerEntry* get_entry( int index ) { return _handlers->at(index); } static int get_create_adapter_index(methodHandle method); - static address get_i2c_entry( int index ) { return get_entry(index)->get_i2c_entry(); } - static address get_c2i_entry( int index ) { return get_entry(index)->get_c2i_entry(); } - static address get_c2i_unverified_entry( int index ) { return get_entry(index)->get_c2i_unverified_entry(); } + static address get_i2c_entry( int index ) { + return get_entry(index)->get_i2c_entry(); + } + static address get_c2i_entry( int index ) { + return get_entry(index)->get_c2i_entry(); + } + static address get_c2i_unverified_entry( int index ) { + return get_entry(index)->get_c2i_unverified_entry(); + } public: + static AdapterHandlerEntry* get_entry( int index ) { return _handlers->at(index); } static nmethod* create_native_wrapper(methodHandle method); - static AdapterHandlerEntry* get_adapter(methodHandle method) { return get_entry(get_create_adapter_index(method)); } + static AdapterHandlerEntry* get_adapter(methodHandle method) { + return get_entry(get_create_adapter_index(method)); + } +#ifdef HAVE_DTRACE_H + static nmethod* create_dtrace_nmethod (methodHandle method); +#endif // HAVE_DTRACE_H #ifndef PRODUCT static void print_handler(CodeBlob* b);