This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
8ee130f609ede6e6b16d42bd47db27bfbea5ccfe
[perl5.git] / mydtrace.h
1 /*    mydtrace.h
2  *
3  *    Copyright (C) 2008, 2010, 2011 by Larry Wall and others
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  *      Provides macros that wrap the various DTrace probes we use. We add
9  *      an extra level of wrapping to encapsulate the _ENABLED tests.
10  */
11
12 #if defined(USE_DTRACE) && defined(PERL_CORE)
13
14 #  include "perldtrace.h"
15
16 #  if defined(STAP_PROBE_ADDR) && !defined(DEBUGGING)
17
18 /* SystemTap 1.2 uses a construct that chokes on passing a char array
19  * as a char *, in this case hek_key in struct hek.  Workaround it
20  * with a temporary.
21  */
22
23 #    define ENTRY_PROBE(func, file, line, stash)        \
24     if (PERL_SUB_ENTRY_ENABLED()) {                     \
25         const char *tmp_func = func;                    \
26         PERL_SUB_ENTRY(tmp_func, file, line, stash);    \
27     }
28
29 #    define RETURN_PROBE(func, file, line, stash)       \
30     if (PERL_SUB_RETURN_ENABLED()) {                    \
31         const char *tmp_func = func;                    \
32         PERL_SUB_RETURN(tmp_func, file, line, stash);   \
33     }
34
35 #    define OP_ENTRY_PROBE(name)                        \
36     if (PERL_OP_ENTRY_ENABLED()) {                      \
37         const char *tmp_name = name;                    \
38         PERL_OP_ENTRY(tmp_name, file, line, stash);     \
39     }
40
41 #  else
42
43 #    define ENTRY_PROBE(func, file, line, stash)        \
44     if (PERL_SUB_ENTRY_ENABLED()) {                     \
45         PERL_SUB_ENTRY(func, file, line, stash);        \
46     }
47
48 #    define RETURN_PROBE(func, file, line, stash)       \
49     if (PERL_SUB_RETURN_ENABLED()) {                    \
50         PERL_SUB_RETURN(func, file, line, stash);       \
51     }
52
53 #    define OP_ENTRY_PROBE(name)                        \
54     if (PERL_OP_ENTRY_ENABLED()) {                      \
55         PERL_OP_ENTRY(name);                            \
56     }
57
58 #  endif
59
60 #  define PHASE_CHANGE_PROBE(new_phase, old_phase)      \
61     if (PERL_PHASE_CHANGE_ENABLED()) {                  \
62         PERL_PHASE_CHANGE(new_phase, old_phase);        \
63     }
64
65 #else
66
67 /* NOPs */
68 #  define ENTRY_PROBE(func, file, line, stash)
69 #  define RETURN_PROBE(func, file, line, stash)
70 #  define PHASE_CHANGE_PROBE(new_phase, old_phase)
71 #  define OP_ENTRY_PROBE(name)
72
73 #endif
74
75 /*
76  * Local variables:
77  * c-indentation-style: bsd
78  * c-basic-offset: 4
79  * indent-tabs-mode: nil
80  * End:
81  *
82  * ex: set ts=8 sts=4 sw=4 et:
83  */