diff options
author | Tony Cook <tony@develop-help.com> | 2011-08-09 20:31:24 +1000 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2011-08-11 17:48:10 +1000 |
commit | ee3ace03a45521163d0977e8a8fe5387f0193e80 (patch) | |
tree | 8ae8ddea3d4f2c8798cd24437495e44ee3c9e719 | |
parent | 44d8286067ef9ddcc99d811b6ab8d14fddc0bb81 (diff) | |
download | perl-ee3ace03a45521163d0977e8a8fe5387f0193e80.tar.gz |
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.
-rw-r--r-- | mydtrace.h | 27 |
1 files changed, 25 insertions, 2 deletions
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); \ |