summaryrefslogtreecommitdiff
path: root/mydtrace.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2016-02-15 13:48:24 +0000
committerDavid Mitchell <davem@iabyn.com>2016-03-18 23:45:25 +0000
commit3f6bd23a1b9204dda7aaaef6efe17dc87f50a675 (patch)
tree3d11776a33725904ad8cc55dd664d693a7c0b7dd /mydtrace.h
parent5fa8e144165a5c086facccf35630b9c4a781c4ad (diff)
downloadperl-3f6bd23a1b9204dda7aaaef6efe17dc87f50a675.tar.gz
rename and function-ise dtrace macros
This commit: 1. Renames the various dtrace probe macros into a consistent and self-documenting pattern, e.g. ENTRY_PROBE => PERL_DTRACE_PROBE_ENTRY RETURN_PROBE => PERL_DTRACE_PROBE_RETURN Since they're supposed to be defined only under PERL_CORE, this shouldn't break anything that's not being naughty. 2. Implement the main body of these macros using a real function. They were formerly defined along the lines of if (PERL_SUB_ENTRY_ENABLED()) PERL_SUB_ENTRY(...); The PERL_SUB_ENTRY() part is a macro generated by the dtrace system, which for example on linux expands to a large bunch of assembly directives. Replace the direct macro with a function wrapper, e.g. if (PERL_SUB_ENTRY_ENABLED()) Perl_dtrace_probe_call(aTHX_ cv, TRUE); This reduces to once the number of times the macro is expanded. The new functions also take simpler args and then process the values they need using intermediate temporary vars to avoid huge macro expansions. For example ENTRY_PROBE(CvNAMED(cv) ? HEK_KEY(CvNAME_HEK(cv)) : GvENAME(CvGV(cv)), CopFILE((const COP *)CvSTART(cv)), CopLINE((const COP *)CvSTART(cv)), CopSTASHPV((const COP *)CvSTART(cv))); is now PERL_DTRACE_PROBE_ENTRY(cv); This reduces the executable size by 1K on -O2 -Dusedtrace builds, and by 45K on -DDEBUGGING -Dusedtrace builds.
Diffstat (limited to 'mydtrace.h')
-rw-r--r--mydtrace.h89
1 files changed, 24 insertions, 65 deletions
diff --git a/mydtrace.h b/mydtrace.h
index 6e797676fa..6c66a08509 100644
--- a/mydtrace.h
+++ b/mydtrace.h
@@ -13,80 +13,39 @@
# include "perldtrace.h"
-# if defined(STAP_PROBE_ADDR) && !defined(DEBUGGING)
+# define PERL_DTRACE_PROBE_ENTRY(cv) \
+ if (PERL_SUB_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_call(aTHX_ cv, TRUE);
-/* SystemTap 1.2 uses a construct that chokes on passing a char array
- * as a char *, in this case hek_key in struct hek. Workaround it
- * with a temporary.
- */
-
-# define ENTRY_PROBE(func, file, line, stash) \
- if (PERL_SUB_ENTRY_ENABLED()) { \
- const char *tmp_func = func; \
- PERL_SUB_ENTRY(tmp_func, file, line, stash); \
- }
-
-# define RETURN_PROBE(func, file, line, stash) \
- if (PERL_SUB_RETURN_ENABLED()) { \
- const char *tmp_func = func; \
- PERL_SUB_RETURN(tmp_func, file, line, stash); \
- }
-
-# define LOADING_FILE_PROBE(name) \
- if (PERL_LOADING_FILE_ENABLED()) { \
- const char *tmp_name = name; \
- PERL_LOADING_FILE(tmp_name); \
- }
-
-# define LOADED_FILE_PROBE(name) \
- if (PERL_LOADED_FILE_ENABLED()) { \
- const char *tmp_name = name; \
- PERL_LOADED_FILE(tmp_name); \
- }
-
-# else
-
-# define ENTRY_PROBE(func, file, line, stash) \
- if (PERL_SUB_ENTRY_ENABLED()) { \
- PERL_SUB_ENTRY(func, file, line, stash); \
- }
-
-# define RETURN_PROBE(func, file, line, stash) \
- if (PERL_SUB_RETURN_ENABLED()) { \
- PERL_SUB_RETURN(func, file, line, stash); \
- }
-
-# define LOADING_FILE_PROBE(name) \
- if (PERL_LOADING_FILE_ENABLED()) { \
- PERL_LOADING_FILE(name); \
- }
+# define PERL_DTRACE_PROBE_RETURN(cv) \
+ if (PERL_SUB_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_call(aTHX_ cv, FALSE);
-# define LOADED_FILE_PROBE(name) \
- if (PERL_LOADED_FILE_ENABLED()) { \
- PERL_LOADED_FILE(name); \
- }
+# define PERL_DTRACE_PROBE_FILE_LOADING(name) \
+ if (PERL_SUB_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_load(aTHX_ name, TRUE);
-# endif
+# define PERL_DTRACE_PROBE_FILE_LOADED(name) \
+ if (PERL_SUB_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_load(aTHX_ name, FALSE);
-# define OP_ENTRY_PROBE(name) \
- if (PERL_OP_ENTRY_ENABLED()) { \
- PERL_OP_ENTRY(name); \
- }
+# define PERL_DTRACE_PROBE_OP(op) \
+ if (PERL_OP_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_op(aTHX_ op);
-# define PHASE_CHANGE_PROBE(new_phase, old_phase) \
- if (PERL_PHASE_CHANGE_ENABLED()) { \
- PERL_PHASE_CHANGE(new_phase, old_phase); \
- }
+# define PERL_DTRACE_PROBE_PHASE(phase) \
+ if (PERL_OP_ENTRY_ENABLED()) \
+ Perl_dtrace_probe_phase(aTHX_ phase);
#else
/* NOPs */
-# define ENTRY_PROBE(func, file, line, stash)
-# define RETURN_PROBE(func, file, line, stash)
-# define PHASE_CHANGE_PROBE(new_phase, old_phase)
-# define OP_ENTRY_PROBE(name)
-# define LOADING_FILE_PROBE(name)
-# define LOADED_FILE_PROBE(name)
+# define PERL_DTRACE_PROBE_ENTRY(cv)
+# define PERL_DTRACE_PROBE_RETURN(cv)
+# define PERL_DTRACE_PROBE_FILE_LOADING(cv)
+# define PERL_DTRACE_PROBE_FILE_LOADED(cv)
+# define PERL_DTRACE_PROBE_OP(op)
+# define PERL_DTRACE_PROBE_PHASE(phase)
#endif