summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStan Cox <scox@redhat.com>2009-04-01 15:48:24 -0400
committerStan Cox <scox@redhat.com>2009-04-01 15:48:24 -0400
commit952ce18c9672046c052fc77d5da8f98e8ae75735 (patch)
tree2b817cebd7db30900b90251acab8ad5cd3979c73
parentf34b7eea333adc0bc9dc8e51445c2bbc39e9bc82 (diff)
downloadsystemtap-steved-952ce18c9672046c052fc77d5da8f98e8ae75735.tar.gz
systemtap-steved-952ce18c9672046c052fc77d5da8f98e8ae75735.tar.xz
systemtap-steved-952ce18c9672046c052fc77d5da8f98e8ae75735.zip
Use alloca trick to keep argN active on GCC 4.1.
* includes/sys/sdt.h (STAP_UNINLINE): New. (STAP_UNINLINE_LABEL): New. static_uprobes.exp: Match using charset instead of .*
-rw-r--r--includes/sys/sdt.h48
-rw-r--r--tapsets.cxx5
-rw-r--r--testsuite/systemtap.base/static_uprobes.exp2
3 files changed, 38 insertions, 17 deletions
diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h
index ba75076b..c3fa16d9 100644
--- a/includes/sys/sdt.h
+++ b/includes/sys/sdt.h
@@ -39,6 +39,19 @@
#endif
#define STAP_LABEL(a,b) STAP_CONCAT(a,b)
+/* Taking the address of a local label and/or referencing alloca prevents the
+ containing function from being inlined, which keeps the parameters visible. */
+
+#if __GNUC__ == 4 && __GNUC_MINOR__ <= 1
+#include <alloca.h>
+#define STAP_UNINLINE alloca((size_t)0)
+#else
+#define STAP_UNINLINE
+#endif
+
+#define STAP_UNINLINE_LABEL(label) \
+ __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label
+
#define STAP_PROBE_(probe) \
do { \
STAP_PROBE_DATA(probe); \
@@ -46,13 +59,11 @@ do { \
"\tnop"); \
} while (0)
-/* Taking the address of a local label prevents the containing function
- from being inlined, which keeps the parameters visible. */
-
#define STAP_PROBE1_(probe,label,parm1) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -61,9 +72,10 @@ do { \
#define STAP_PROBE2_(probe,label,parm1,parm2) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -72,10 +84,11 @@ do { \
#define STAP_PROBE3_(probe,label,parm1,parm2,parm3) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
- volatile __typeof__((parm1)) arg1 = parm1; \
+ STAP_UNINLINE_LABEL(label); \
+ volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -84,11 +97,12 @@ do { \
#define STAP_PROBE4_(probe,label,parm1,parm2,parm3,parm4) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
volatile __typeof__((parm4)) arg4 = parm4; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -97,12 +111,13 @@ do { \
#define STAP_PROBE5_(probe,label,parm1,parm2,parm3,parm4,parm5) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
volatile __typeof__((parm4)) arg4 = parm4; \
volatile __typeof__((parm5)) arg5 = parm5; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -111,13 +126,14 @@ do { \
#define STAP_PROBE6_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
volatile __typeof__((parm4)) arg4 = parm4; \
volatile __typeof__((parm5)) arg5 = parm5; \
volatile __typeof__((parm6)) arg6 = parm6; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -126,7 +142,7 @@ do { \
#define STAP_PROBE7_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
@@ -134,6 +150,7 @@ do { \
volatile __typeof__((parm5)) arg5 = parm5; \
volatile __typeof__((parm6)) arg6 = parm6; \
volatile __typeof__((parm7)) arg7 = parm7; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -142,7 +159,7 @@ do { \
#define STAP_PROBE8_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
@@ -151,6 +168,7 @@ do { \
volatile __typeof__((parm6)) arg6 = parm6; \
volatile __typeof__((parm7)) arg7 = parm7; \
volatile __typeof__((parm8)) arg8 = parm8; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -159,7 +177,7 @@ do { \
#define STAP_PROBE9_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
@@ -169,6 +187,7 @@ do { \
volatile __typeof__((parm7)) arg7 = parm7; \
volatile __typeof__((parm8)) arg8 = parm8; \
volatile __typeof__((parm9)) arg9 = parm9; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
@@ -177,7 +196,7 @@ do { \
#define STAP_PROBE10_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \
do { \
- __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \
+ STAP_UNINLINE_LABEL(label); \
volatile __typeof__((parm1)) arg1 = parm1; \
volatile __typeof__((parm2)) arg2 = parm2; \
volatile __typeof__((parm3)) arg3 = parm3; \
@@ -188,6 +207,7 @@ do { \
volatile __typeof__((parm8)) arg8 = parm8; \
volatile __typeof__((parm9)) arg9 = parm9; \
volatile __typeof__((parm10)) arg10 = parm10; \
+ STAP_UNINLINE; \
STAP_PROBE_DATA(probe); \
label: \
__asm__ volatile ("2:\n" \
diff --git a/tapsets.cxx b/tapsets.cxx
index 50ee563a..449d7cc0 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -5812,7 +5812,8 @@ dwarf_builder::build(systemtap_session & sess,
&& dw->function_name_matches_pattern
(probe_name.c_str(),
location->components[1]->arg->tok->content.c_str())))
- ;
+ {
+ }
else
continue;
const token* sv_tok = location->components[1]->arg->tok;
@@ -5833,7 +5834,7 @@ dwarf_builder::build(systemtap_session & sess,
return;
}
- if (probe_type == dwarf_no_probes)
+ else if (probe_type == dwarf_no_probes)
{
location->components[1]->functor = TOK_FUNCTION;
location->components[1]->arg = new literal_string("*");
diff --git a/testsuite/systemtap.base/static_uprobes.exp b/testsuite/systemtap.base/static_uprobes.exp
index 820626b8..d6b6e1e3 100644
--- a/testsuite/systemtap.base/static_uprobes.exp
+++ b/testsuite/systemtap.base/static_uprobes.exp
@@ -196,7 +196,7 @@ set ok 0
spawn stap -l "process(\"./sdt_types.x\").mark(\"*\")"
expect {
-timeout 180
- -re {mark\(\".*\"\)} { incr ok; exp_continue }
+ -re {mark\(\"[a-z_]+\"\)} { incr ok; exp_continue }
timeout { fail "$test C (timeout)" }
eof { }
}