From ee3ace03a45521163d0977e8a8fe5387f0193e80 Mon Sep 17 00:00:00 2001 From: Tony Cook Date: Tue, 9 Aug 2011 20:31:24 +1000 Subject: workaround a type handling bug in SystemTap Dtrace 1.2 It uses a construct similar to: __typeof__((func)) x = func; but hek_key is a char[1] so the above becomes: char arg1[1] = func; which is invalid. Using a temporary allows an implicit conversion to const char * and avoids possible bugs that might be hidden by an explicit cast. --- mydtrace.h | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'mydtrace.h') diff --git a/mydtrace.h b/mydtrace.h index a7a4e470c6..01732742e4 100644 --- a/mydtrace.h +++ b/mydtrace.h @@ -13,16 +13,39 @@ # include "perldtrace.h" -# define ENTRY_PROBE(func, file, line, stash) \ +# if defined(STAP_PROBE_ADDR) && !defined(DEBUGGING) + +/* 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); \ + } + +# 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) \ +# define RETURN_PROBE(func, file, line, stash) \ if (PERL_SUB_RETURN_ENABLED()) { \ PERL_SUB_RETURN(func, file, line, stash); \ } +# endif + # define PHASE_CHANGE_PROBE(new_phase, old_phase) \ if (PERL_PHASE_CHANGE_ENABLED()) { \ PERL_PHASE_CHANGE(new_phase, old_phase); \ -- cgit v1.2.1