DTrace support: function calls, GC activity, line execution

Tested on macOS 10.11 dtrace, Ubuntu 16.04 SystemTap, and libbcc.

Largely based by an initial patch by Jesús Cea Avión, with some
influence from Dave Malcolm's SystemTap patch and Nikhil Benesch's
unification patch.

Things deliberately left out for simplicity:
- ustack helpers, I have no way of testing them at this point since
they are Solaris-specific
- PyFrameObject * in function__entry/function__return, this is
SystemTap-specific
- SPARC support
- dynamic tracing
- sys module dtrace facility introspection

All of those might be added later.
diff --git a/Include/pydtrace.h b/Include/pydtrace.h
new file mode 100644
index 0000000..4c06d0e
--- /dev/null
+++ b/Include/pydtrace.h
@@ -0,0 +1,47 @@
+/* Static DTrace probes interface */
+
+#ifndef Py_DTRACE_H
+#define Py_DTRACE_H
+
+#ifdef WITH_DTRACE
+
+#include "pydtrace_probes.h"
+
+/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include
+   `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe
+   defined in pydtrace_provider.d.
+
+   Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()`
+   check to minimize performance impact when probing is off. For example:
+
+       if (PyDTrace_FUNCTION_ENTRY_ENABLED())
+           PyDTrace_FUNCTION_ENTRY(f);
+*/
+
+#else
+
+/* Without DTrace, compile to nothing. */
+
+#define PyDTrace_LINE(arg0, arg1, arg2, arg3) do ; while (0)
+#define PyDTrace_FUNCTION_ENTRY(arg0, arg1, arg2)  do ; while (0)
+#define PyDTrace_FUNCTION_RETURN(arg0, arg1, arg2) do ; while (0)
+#define PyDTrace_GC_START(arg0)               do ; while (0)
+#define PyDTrace_GC_DONE(arg0)                do ; while (0)
+#define PyDTrace_INSTANCE_NEW_START(arg0)     do ; while (0)
+#define PyDTrace_INSTANCE_NEW_DONE(arg0)      do ; while (0)
+#define PyDTrace_INSTANCE_DELETE_START(arg0)  do ; while (0)
+#define PyDTrace_INSTANCE_DELETE_DONE(arg0)   do ; while (0)
+
+#define PyDTrace_LINE_ENABLED()                  (0)
+#define PyDTrace_FUNCTION_ENTRY_ENABLED()        (0)
+#define PyDTrace_FUNCTION_RETURN_ENABLED()       (0)
+#define PyDTrace_GC_START_ENABLED()              (0)
+#define PyDTrace_GC_DONE_ENABLED()               (0)
+#define PyDTrace_INSTANCE_NEW_START_ENABLED()    (0)
+#define PyDTrace_INSTANCE_NEW_DONE_ENABLED()     (0)
+#define PyDTrace_INSTANCE_DELETE_START_ENABLED() (0)
+#define PyDTrace_INSTANCE_DELETE_DONE_ENABLED()  (0)
+
+#endif /* !WITH_DTRACE */
+
+#endif /* !Py_DTRACE_H */