changeset 1708:5cfd9324c1b7

Enable systemtap JNI tracing. 2009-10-14 Mark Wielaard <mjw@redhat.com> * configure.ac: When enabling systemtap support check sys/sdt.h and g++ are recent enough to allow probes in class constructors and destructors. * patches/icedtea-systemtap.patch: Enable compiling probes in jni.cpp. Rewrite Set<prim>Field and SetStatic<prim>Field macros to use DTRACE_PROBE interface directly instead of generating dtrace implementation calls. Clean up dtrace.hpp. * tapset/hotspot.stp.in: Enable hotspot.monitor_notify. Fix up comments.
author Mark Wielaard <mark@klomp.org>
date Wed, 14 Oct 2009 15:42:32 +0200
parents f734c3dcd1a0
children 4ed9452515ba
files ChangeLog configure.ac patches/icedtea-systemtap.patch tapset/hotspot.stp.in
diffstat 4 files changed, 91 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Mar 17 22:12:42 2010 +0000
+++ b/ChangeLog	Wed Oct 14 15:42:32 2009 +0200
@@ -14,6 +14,18 @@
 	Adding stack markings to the x86 assembly for not using executable
         stack.
 
+2009-10-14  Mark Wielaard  <mjw@redhat.com>
+
+	* configure.ac: When enabling systemtap support check sys/sdt.h
+	and g++ are recent enough to allow probes in class constructors
+	and destructors.
+	* patches/icedtea-systemtap.patch: Enable compiling probes in
+	jni.cpp. Rewrite Set<prim>Field and SetStatic<prim>Field macros
+	to use DTRACE_PROBE interface directly instead of generating
+	dtrace implementation calls. Clean up dtrace.hpp.
+	* tapset/hotspot.stp.in: Enable hotspot.monitor_notify. Fix up
+	comments.
+
 2010-03-17  Andrew John Hughes  <ahughes@redhat.com>
 
 	* NEWS: Update for 1.6.3.
--- a/configure.ac	Wed Mar 17 22:12:42 2010 +0000
+++ b/configure.ac	Wed Oct 14 15:42:32 2009 +0200
@@ -326,6 +326,43 @@
                 [SDT_H_FOUND='no';
                    AC_MSG_ERROR([systemtap support needs sys/sdt.h header])])
 
+ AC_MSG_CHECKING([working sys/sdt.h and g++ support])
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/sdt.h>
+class ProbeClass
+{
+private:
+  int& ref;
+  const char *name;
+
+public:
+  ProbeClass(int& v, const char *n) : ref(v), name(n)
+  {
+    DTRACE_PROBE2(_test_, cons, name, ref);
+  }
+
+  void method(int min)
+  {
+    DTRACE_PROBE3(_test_, meth, name, ref, min);
+    ref -= min;
+  }
+
+  ~ProbeClass()
+  {
+    DTRACE_PROBE2(_test_, dest, name, ref);
+  }
+};
+]],
+[[
+  int i = 64;
+  DTRACE_PROBE1(_test_, call, i);
+  ProbeClass inst = ProbeClass(i, "call");
+  inst.method(24);
+]])], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([systemtap sdt.h or g++ too old])])
+  AC_LANG_RESTORE
+
   AC_MSG_CHECKING([for absolute java home install dir])
   AC_ARG_WITH([abs-install-dir],
 	      [AS_HELP_STRING([--with-abs-install-dir], 
--- a/patches/icedtea-systemtap.patch	Wed Mar 17 22:12:42 2010 +0000
+++ b/patches/icedtea-systemtap.patch	Wed Oct 14 15:42:32 2009 +0200
@@ -9,22 +9,33 @@
 +CFLAGS += -DDTRACE_ENABLED
 +
 +# It doesn't support HAVE_DTRACE_H though.
-diff -r 945bf7540697 src/share/vm/prims/jni.cpp
---- openjdk/hotspot/src/share/vm/prims/jni.cpp	Thu Jan 22 14:42:01 2009 -0800
-+++ openjdk/hotspot/src/share/vm/prims/jni.cpp	Mon Feb 02 13:47:34 2009 +0100
-@@ -22,6 +22,12 @@
-  *
-  */
- 
-+#ifdef __GNUC__
-+// Unfortunately the gcc c preprocessor doesn't like some of the
-+// FP_SELECT defines below, so for now we make sure to disable them.
-+#undef DTRACE_ENABLED
-+#endif
-+
- # include "incls/_precompiled.incl"
- # include "incls/_jni.cpp.incl"
- 
+--- openjdk/hotspot/src/share/vm/prims/jni.cpp	2009-10-13 15:34:52.499809508 +0200
++++ openjdk/hotspot/src/share/vm/prims/jni.cpp	2009-10-13 15:31:26.117823588 +0200
+@@ -1747,10 +1744,7 @@
+ JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
+   JNIWrapper("Set" XSTR(Result) "Field"); \
+ \
+-  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \
+-    ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
+-  HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \
+-    ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
++  FP_SELECT_##Result(DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value),DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
+ \
+   oop o = JNIHandles::resolve_non_null(obj); \
+   klassOop k = o->klass(); \
+@@ -1924,10 +1918,7 @@
+ \
+ JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
+   JNIWrapper("SetStatic" XSTR(Result) "Field"); \
+-  HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
+-    ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
+-  HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
+-    ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
++  FP_SELECT_##Result(DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value),DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
+ \
+   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
+   assert(id->is_static_field_id(), "invalid static field id"); \
+-
 diff -r 945bf7540697 src/share/vm/utilities/dtrace.hpp
 --- openjdk/hotspot/src/share/vm/utilities/dtrace.hpp	Thu Jan 22 14:42:01 2009 -0800
 +++ openjdk/hotspot/src/share/vm/utilities/dtrace.hpp	Mon Feb 02 13:47:34 2009 +0100
@@ -52,7 +63,7 @@
  
  #define DTRACE_ONLY(x)
  #define NOT_DTRACE(x) x
-@@ -40,9 +41,15 @@
+@@ -40,9 +41,16 @@
  #define DTRACE_PROBE3(a,b,c,d,e) {;}
  #define DTRACE_PROBE4(a,b,c,d,e,f) {;}
  #define DTRACE_PROBE5(a,b,c,d,e,f,g) {;}
@@ -60,6 +71,7 @@
 +#define DTRACE_PROBE7(a,b,c,d,e,f,g,h,i) {;}
 +#define DTRACE_PROBE8(a,b,c,d,e,f,g,h,i,j) {;}
 +#define DTRACE_PROBE9(a,b,c,d,e,f,g,h,i,j,k) {;}
++#define DTRACE_PROBE10(a,b,c,d,e,f,g,h,i,j,k,l) {;}
  
  #endif
  
@@ -68,30 +80,28 @@
  #define HS_DTRACE_PROBE_FN(provider,name)\
    __dtrace_##provider##___##name
  
-@@ -50,6 +57,13 @@
+@@ -50,6 +58,11 @@
    DTRACE_ONLY(extern "C" void HS_DTRACE_PROBE_FN(provider,name) args)
  #define HS_DTRACE_PROBE_CDECL_N(provider,name,args) \
    DTRACE_ONLY(extern void HS_DTRACE_PROBE_FN(provider,name) args)
 +#else
 +// Systemtap dtrace compatible probes on GNU/Linux don't.
-+#define HS_DTRACE_PROBE_FN(provider,name)
-+
 +#define HS_DTRACE_PROBE_DECL_N(provider,name,args)
 +#define HS_DTRACE_PROBE_CDECL_N(provider,name,args)
 +#endif 
  
  /* Dtrace probe declarations */
  #define HS_DTRACE_PROBE_DECL(provider,name) \
-@@ -91,6 +105,8 @@
+@@ -88,6 +101,8 @@
+     uintptr_t,uintptr_t,uintptr_t))
+ 
+ /* Dtrace probe definitions */
++#if defined(SOLARIS)
++// Solaris dtrace uses actual function calls.
  #define HS_DTRACE_PROBE_N(provider,name, args) \
    DTRACE_ONLY(HS_DTRACE_PROBE_FN(provider,name) args)
  
-+#if defined(SOLARIS)
-+// Solaris dtrace uses actual function calls.
- #define HS_DTRACE_PROBE(provider,name) HS_DTRACE_PROBE0(provider,name)
- #define HS_DTRACE_PROBE0(provider,name)\
-   HS_DTRACE_PROBE_N(provider,name,())
-@@ -123,3 +139,27 @@
+@@ -123,3 +138,29 @@
    HS_DTRACE_PROBE_N(provider,name,((uintptr_t)a0,(uintptr_t)a1,(uintptr_t)a2,\
      (uintptr_t)a3,(uintptr_t)a4,(uintptr_t)a5,(uintptr_t)a6,(uintptr_t)a7,\
      (uintptr_t)a8,(uintptr_t)a9))
@@ -118,6 +128,8 @@
 +  DTRACE_PROBE8(provider,name,a0,a1,a2,a3,a4,a5,a6,a7)
 +#define HS_DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)\
 +  DTRACE_PROBE9(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)
++#define HS_DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)\
++  DTRACE_PROBE10(provider,name,a0,a1,a2,a3,a4,a5,a6,a7,a8)
 +#endif
 --- openjdk/hotspot/src/share/vm/runtime/arguments.cpp	2009-03-04 14:39:43.000000000 +0100
 +++ openjdk/hotspot/src/share/vm/runtime/arguments.cpp	2009-03-04 22:11:37.000000000 +0100
--- a/tapset/hotspot.stp.in	Wed Mar 17 22:12:42 2010 +0000
+++ b/tapset/hotspot.stp.in	Wed Oct 14 15:42:32 2009 +0200
@@ -311,12 +311,12 @@
                      name, thread_id, id, class);
 }
 
-/* Doesn't resolve atm.
-   hotspot.monitor_notify (extended probe)
+/* hotspot.monitor_notify (extended probe)
    Triggers when a thread calls Object.notify().
    Sets thread_id to the current java thread, id to the unique id
    for this monitor and class to the class name of the object.
    Needs -XX:+ExtendedDTraceProbes.
+ */
 probe hotspot.monitor_notify =
   process("@ABS_CLIENT_LIBJVM_SO@").mark("monitor__notify"),
   process("@ABS_SERVER_LIBJVM_SO@").mark("monitor__notify")
@@ -328,7 +328,6 @@
   probestr = sprintf("%s(thread_id=%d,id=0x%x,class='%s')",
                      name, thread_id, id, class);
 }
- */
 
 /* hotspot.monitor_notifyAll (extended probe)
    Triggers when a thread calls Object.notifyAll().
@@ -369,7 +368,7 @@
                      name, thread_id, id, class);
 }
 
-/* hotspot.monitor_contended_enter (extended probe)
+/* hotspot.monitor_contended_entered (extended probe)
    Triggers when a thread acquires a contended monotor (after
    hotspot.monitor_contended_enter has been triggered on this thread,
    and the other thread triggered a hotspot.monitor_contended_exit).