summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2011-08-09 20:31:24 +1000
committerTony Cook <tony@develop-help.com>2011-08-11 17:48:10 +1000
commitee3ace03a45521163d0977e8a8fe5387f0193e80 (patch)
tree8ae8ddea3d4f2c8798cd24437495e44ee3c9e719
parent44d8286067ef9ddcc99d811b6ab8d14fddc0bb81 (diff)
downloadperl-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.h27
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); \