ef3bbed
diff -up Python-2.6.4/configure.in.systemtap Python-2.6.4/configure.in
ef3bbed
--- Python-2.6.4/configure.in.systemtap	2009-12-18 15:37:15.632242686 -0500
ef3bbed
+++ Python-2.6.4/configure.in	2009-12-18 15:37:15.713244483 -0500
ef3bbed
@@ -2481,6 +2481,38 @@ if test "$with_valgrind" != no; then
ef3bbed
     )
ef3bbed
 fi
ef3bbed
 
ef3bbed
+# Check for dtrace support
ef3bbed
+AC_MSG_CHECKING(for --with-dtrace)
ef3bbed
+AC_ARG_WITH(dtrace,
ef3bbed
+            AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
ef3bbed
+
ef3bbed
+if test ! -z "$with_dtrace"
ef3bbed
+then
ef3bbed
+    if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
ef3bbed
+    then
ef3bbed
+	AC_DEFINE(WITH_DTRACE, 1, 
ef3bbed
+	 [Define if you want to compile in Dtrace support])
ef3bbed
+	with_dtrace="Sun"
15c3fb1
+	DTRACEOBJS="Python/dtrace.o"
ef3bbed
+	DTRADEHDRS=""
ef3bbed
+    elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
ef3bbed
+    then
ef3bbed
+	AC_DEFINE(WITH_DTRACE, 1, 
ef3bbed
+	 [Define if you want to compile in Dtrace support])
ef3bbed
+	with_dtrace="Apple"
ef3bbed
+	DTRACEOBJS=""
15c3fb1
+	DTRADEHDRS="pydtrace.h"
ef3bbed
+    else
ef3bbed
+	with_dtrace="no"
ef3bbed
+    fi
ef3bbed
+else
ef3bbed
+    with_dtrace="no"
ef3bbed
+fi
ef3bbed
+
ef3bbed
+AC_MSG_RESULT($with_dtrace)
ef3bbed
+AC_SUBST(DTRACEOBJS)
ef3bbed
+AC_SUBST(DTRACEHDRS)
ef3bbed
+
ef3bbed
 # Check for --with-wctype-functions
ef3bbed
 AC_MSG_CHECKING(for --with-wctype-functions)
ef3bbed
 AC_ARG_WITH(wctype-functions, 
ef3bbed
diff -up Python-2.6.4/Include/pydtrace.d.systemtap Python-2.6.4/Include/pydtrace.d
ef3bbed
--- Python-2.6.4/Include/pydtrace.d.systemtap	2009-12-18 15:37:15.697243772 -0500
ef3bbed
+++ Python-2.6.4/Include/pydtrace.d	2009-12-18 15:37:15.697243772 -0500
ef3bbed
@@ -0,0 +1,10 @@
ef3bbed
+provider python {
ef3bbed
+	probe function__entry(const char *, const char *, int);
ef3bbed
+	probe function__return(const char *, const char *, int);
ef3bbed
+};
ef3bbed
+
ef3bbed
+#pragma D attributes Evolving/Evolving/Common provider python provider
ef3bbed
+#pragma D attributes Private/Private/Common provider python module
ef3bbed
+#pragma D attributes Private/Private/Common provider python function
ef3bbed
+#pragma D attributes Evolving/Evolving/Common provider python name
ef3bbed
+#pragma D attributes Evolving/Evolving/Common provider python args
ef3bbed
diff -up Python-2.6.4/Makefile.pre.in.systemtap Python-2.6.4/Makefile.pre.in
ef3bbed
--- Python-2.6.4/Makefile.pre.in.systemtap	2009-12-18 15:37:15.399242581 -0500
ef3bbed
+++ Python-2.6.4/Makefile.pre.in	2009-12-18 15:37:15.715242573 -0500
ef3bbed
@@ -290,6 +290,7 @@ PYTHON_OBJS=	\
ef3bbed
 		Python/formatter_unicode.o \
ef3bbed
 		Python/formatter_string.o \
ef3bbed
 		Python/$(DYNLOADFILE) \
ef3bbed
+		@DTRACEOBJS@ \
ef3bbed
 		$(LIBOBJS) \
ef3bbed
 		$(MACHDEP_OBJS) \
ef3bbed
 		$(THREADOBJ)
15c3fb1
@@ -577,6 +578,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
ef3bbed
 Python/formatter_string.o: $(srcdir)/Python/formatter_string.c \
ef3bbed
 				$(STRINGLIB_HEADERS)
ef3bbed
 
ef3bbed
+# Only needed with --with-dtrace
ef3bbed
+buildinclude:
ef3bbed
+	mkdir -p Include
ef3bbed
+
ef3bbed
+Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
ef3bbed
+	dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
ef3bbed
+
ef3bbed
+Python/ceval.o: Include/pydtrace.h
ef3bbed
+
ef3bbed
+Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
ef3bbed
+	dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
ef3bbed
+
ef3bbed
 ############################################################################
ef3bbed
 # Header files
ef3bbed
 
ef3bbed
@@ -1213,6 +1231,6 @@ Python/thread.o: @THREADHEADERS@
ef3bbed
 .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
ef3bbed
 .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
ef3bbed
 .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean 
ef3bbed
-.PHONY: smelly funny patchcheck
ef3bbed
+.PHONY: smelly funny patchcheck buildinclude
ef3bbed
 
ef3bbed
 # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
ef3bbed
diff -up Python-2.6.4/pyconfig.h.in.systemtap Python-2.6.4/pyconfig.h.in
ef3bbed
--- Python-2.6.4/pyconfig.h.in.systemtap	2009-12-18 15:37:15.649243175 -0500
ef3bbed
+++ Python-2.6.4/pyconfig.h.in	2009-12-18 15:37:15.719242803 -0500
ef3bbed
@@ -964,6 +989,9 @@
ef3bbed
 /* Define if you want documentation strings in extension modules */
ef3bbed
 #undef WITH_DOC_STRINGS
ef3bbed
 
ef3bbed
+/* Define if you want to compile in Dtrace support */
ef3bbed
+#undef WITH_DTRACE
ef3bbed
+
ef3bbed
 /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
ef3bbed
    linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
ef3bbed
    Dyld is necessary to support frameworks. */
ef3bbed
diff -up Python-2.6.4/Python/ceval.c.systemtap Python-2.6.4/Python/ceval.c
ef3bbed
--- Python-2.6.4/Python/ceval.c.systemtap	2009-05-30 17:43:48.000000000 -0400
ef3bbed
+++ Python-2.6.4/Python/ceval.c	2009-12-18 15:37:15.723242474 -0500
ef3bbed
@@ -19,6 +19,10 @@
ef3bbed
 
ef3bbed
 #include <ctype.h>
ef3bbed
 
ef3bbed
+#ifdef WITH_DTRACE
ef3bbed
+#include "pydtrace.h"
ef3bbed
+#endif
ef3bbed
+
ef3bbed
 #ifndef WITH_TSC
ef3bbed
 
ef3bbed
 #define READ_TIMESTAMP(var)
ef3bbed
@@ -527,6 +531,55 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
ef3bbed
 			  NULL);
ef3bbed
 }
ef3bbed
 
ef3bbed
+#ifdef WITH_DTRACE
ef3bbed
+static void
ef3bbed
+dtrace_entry(PyFrameObject *f)
ef3bbed
+{
ef3bbed
+	const char *filename;
ef3bbed
+	const char *fname;
ef3bbed
+	int lineno;
ef3bbed
+	
ef3bbed
+	filename = PyString_AsString(f->f_code->co_filename);
ef3bbed
+	fname = PyString_AsString(f->f_code->co_name);
ef3bbed
+	lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
ef3bbed
+
ef3bbed
+	PYTHON_FUNCTION_ENTRY((char *)filename, (char *)fname, lineno);
ef3bbed
+
ef3bbed
+	/*
ef3bbed
+	 * Currently a USDT tail-call will not receive the correct arguments.
ef3bbed
+	 * Disable the tail call here.
ef3bbed
+	 */
ef3bbed
+#if defined(__sparc)
ef3bbed
+	asm("nop");
ef3bbed
+#endif
ef3bbed
+}
ef3bbed
+
ef3bbed
+static void
ef3bbed
+dtrace_return(PyFrameObject *f)
ef3bbed
+{
ef3bbed
+	const char *filename;
ef3bbed
+	const char *fname;
ef3bbed
+	int lineno;
ef3bbed
+	
ef3bbed
+	filename = PyString_AsString(f->f_code->co_filename);
ef3bbed
+	fname = PyString_AsString(f->f_code->co_name);
ef3bbed
+	lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
ef3bbed
+	PYTHON_FUNCTION_RETURN((char *)filename, (char *)fname, lineno);
ef3bbed
+
ef3bbed
+	/*
ef3bbed
+	 * Currently a USDT tail-call will not receive the correct arguments.
ef3bbed
+	 * Disable the tail call here.
ef3bbed
+	 */
ef3bbed
+#if defined(__sparc)
ef3bbed
+	asm("nop");
ef3bbed
+#endif
ef3bbed
+}
ef3bbed
+#else
ef3bbed
+#define	PYTHON_FUNCTION_ENTRY_ENABLED() 0
ef3bbed
+#define	PYTHON_FUNCTION_RETURN_ENABLED() 0
ef3bbed
+#define	dtrace_entry(f)
ef3bbed
+#define	dtrace_return(f)
ef3bbed
+#endif
ef3bbed
 
ef3bbed
 /* Interpreter main loop */
ef3bbed
 
ef3bbed
@@ -763,6 +891,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
ef3bbed
 		}
ef3bbed
 	}
ef3bbed
 
ef3bbed
+        if (PYTHON_FUNCTION_ENTRY_ENABLED())
ef3bbed
+                dtrace_entry(f);
ef3bbed
+
ef3bbed
 	co = f->f_code;
ef3bbed
 	names = co->co_names;
ef3bbed
 	consts = co->co_consts;
ef3bbed
@@ -2723,6 +2863,8 @@ fast_yield:
ef3bbed
 
ef3bbed
 	/* pop frame */
ef3bbed
 exit_eval_frame:
ef3bbed
+	if (PYTHON_FUNCTION_RETURN_ENABLED())
ef3bbed
+		dtrace_return(f);
ef3bbed
 	Py_LeaveRecursiveCall();
ef3bbed
 	tstate->frame = f->f_back;
ef3bbed