From 64c6aab0a7992ed950d01fec0d9592630af39ca4 Mon Sep 17 00:00:00 2001 From: Stan Cox Date: Tue, 24 Mar 2009 12:40:05 -0400 Subject: Keep static probe parameters visible while inlining. * includes/sys/sdt.h (STAP_PROBEN): Revive the STAP_LABEL macro to prevent inlining to keep probe parameters visible. Use +rm constraints. * tapsets.cxx (build): Use .probes section for all uses of static probes. --- includes/sys/sdt.h | 217 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 123 insertions(+), 94 deletions(-) (limited to 'includes/sys/sdt.h') diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h index 3da4ff66..ac24b6fb 100644 --- a/includes/sys/sdt.h +++ b/includes/sys/sdt.h @@ -13,180 +13,209 @@ #include #include -#define STAP_PROBE_DATA_(probe,dataop) \ +#define STAP_PROBE_DATA_(probe) \ __asm__ volatile (".section .probes\n" \ "\t.align 8\n" \ "1:\n\t.asciz " #probe "\n" \ "\t.align 4\n" \ "\t.int 0x31425250\n" \ "\t.align 8\n" \ - "\t" #dataop " 1b\n" \ + "\t.long 1b\n" \ "\t.align 8\n" \ - "\t" #dataop " 2f\n" \ + "\t.long 2f\n" \ "\t.previous\n") -#if _LP64 #define STAP_PROBE_DATA(probe) \ - STAP_PROBE_DATA_(#probe,.quad) + STAP_PROBE_DATA_(#probe) + +/* These baroque macros are used to create a unique label. */ +#define STAP_CONCAT(a,b) a ## b +#define STAP_LABEL_PREFIX(p) _stapprobe1_ ## p +/* __COUNTER__ is not present in gcc 4.1 */ +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 3 +#define STAP_COUNTER STAP_CONCAT(__,COUNTER__) #else -#define STAP_PROBE_DATA(probe) \ - STAP_PROBE_DATA_(#probe,.long) +#define STAP_COUNTER STAP_CONCAT(__,LINE__) #endif +#define STAP_LABEL(a,b) STAP_CONCAT(a,b) -#define STAP_PROBE_(probe) \ +#define STAP_PROBE_(probe) \ do { \ STAP_PROBE_DATA(probe); \ - __asm__ volatile ("2:\n" \ + __asm__ volatile ("2:\n" \ "\tnop"); \ } while (0) -#define STAP_PROBE1_(probe,parm1) \ +/* 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 { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \ + volatile __typeof__((parm1)) arg1 = parm1; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 */" :: "X"(arg1)); \ + "\tnop /* %0 */" : "+rm"(arg1)); \ } while (0) -#define STAP_PROBE2_(probe,parm1,parm2) \ +#define STAP_PROBE2_(probe,label,parm1,parm2) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \ + volatile __typeof__((parm1)) arg1 = parm1; \ + volatile __typeof__((parm2)) arg2 = parm2; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 */" :: "X"(arg1), "X"(arg2)); \ + "\tnop /* %0 %1 */" : "+rm"(arg1), "+rm"(arg2)); \ } while (0) -#define STAP_PROBE3_(probe,parm1,parm2,parm3) \ +#define STAP_PROBE3_(probe,label,parm1,parm2,parm3) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \ + volatile __typeof__((parm1)) arg1 = parm1; \ + volatile __typeof__((parm2)) arg2 = parm2; \ + volatile __typeof__((parm3)) arg3 = parm3; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 */" :: "X"(arg1), "X"(arg2), "X"(arg3)); \ + "\tnop /* %0 %1 %2 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3)); \ } while (0) -#define STAP_PROBE4_(probe,parm1,parm2,parm3,parm4) \ +#define STAP_PROBE4_(probe,label,parm1,parm2,parm3,parm4) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&label; \ + volatile __typeof__((parm1)) arg1 = parm1; \ + volatile __typeof__((parm2)) arg2 = parm2; \ + volatile __typeof__((parm3)) arg3 = parm3; \ + volatile __typeof__((parm4)) arg4 = parm4; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4)); \ + "\tnop /* %0 %1 %2 %3 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4)); \ } while (0) -#define STAP_PROBE5_(probe,parm1,parm2,parm3,parm4,parm5) \ +#define STAP_PROBE5_(probe,label,parm1,parm2,parm3,parm4,parm5) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5)); \ + "\tnop /* %0 %1 %2 %3 %4 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5)); \ } while (0) -#define STAP_PROBE6_(probe,parm1,parm2,parm3,parm4,parm5,parm6) \ +#define STAP_PROBE6_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ - volatile __typeof__((parm6)) arg6 __attribute__ ((unused)) = parm6; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5), "X"(arg6)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6)); \ } while (0) -#define STAP_PROBE7_(probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \ +#define STAP_PROBE7_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ - volatile __typeof__((parm6)) arg6 __attribute__ ((unused)) = parm6; \ - volatile __typeof__((parm7)) arg7 __attribute__ ((unused)) = parm7; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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; \ + volatile __typeof__((parm7)) arg7 = parm7; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5), "X"(arg6), "X"(arg7)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7)); \ } while (0) -#define STAP_PROBE8_(probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \ +#define STAP_PROBE8_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ - volatile __typeof__((parm6)) arg6 __attribute__ ((unused)) = parm6; \ - volatile __typeof__((parm7)) arg7 __attribute__ ((unused)) = parm7; \ - volatile __typeof__((parm8)) arg8 __attribute__ ((unused)) = parm8; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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; \ + volatile __typeof__((parm7)) arg7 = parm7; \ + volatile __typeof__((parm8)) arg8 = parm8; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5), "X"(arg6), "X"(arg7), "X"(arg8)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8)); \ } while (0) -#define STAP_PROBE9_(probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \ +#define STAP_PROBE9_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ - volatile __typeof__((parm6)) arg6 __attribute__ ((unused)) = parm6; \ - volatile __typeof__((parm7)) arg7 __attribute__ ((unused)) = parm7; \ - volatile __typeof__((parm8)) arg8 __attribute__ ((unused)) = parm8; \ - volatile __typeof__((parm9)) arg9 __attribute__ ((unused)) = parm9; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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; \ + volatile __typeof__((parm7)) arg7 = parm7; \ + volatile __typeof__((parm8)) arg8 = parm8; \ + volatile __typeof__((parm9)) arg9 = parm9; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5), "X"(arg6), "X"(arg7), "X"(arg8), "X"(arg9)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8), "+rm"(arg9)); \ } while (0) -#define STAP_PROBE10_(probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \ +#define STAP_PROBE10_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \ do { \ - volatile __typeof__((parm1)) arg1 __attribute__ ((unused)) = parm1; \ - volatile __typeof__((parm2)) arg2 __attribute__ ((unused)) = parm2; \ - volatile __typeof__((parm3)) arg3 __attribute__ ((unused)) = parm3; \ - volatile __typeof__((parm4)) arg4 __attribute__ ((unused)) = parm4; \ - volatile __typeof__((parm5)) arg5 __attribute__ ((unused)) = parm5; \ - volatile __typeof__((parm6)) arg6 __attribute__ ((unused)) = parm6; \ - volatile __typeof__((parm7)) arg7 __attribute__ ((unused)) = parm7; \ - volatile __typeof__((parm8)) arg8 __attribute__ ((unused)) = parm8; \ - volatile __typeof__((parm9)) arg9 __attribute__ ((unused)) = parm9; \ - volatile __typeof__((parm10)) arg10 __attribute__ ((unused)) = parm10; \ + __extension__ static volatile long labelval __attribute__ ((unused)) = (long) &&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; \ + volatile __typeof__((parm7)) arg7 = parm7; \ + volatile __typeof__((parm8)) arg8 = parm8; \ + volatile __typeof__((parm9)) arg9 = parm9; \ + volatile __typeof__((parm10)) arg10 = parm10; \ STAP_PROBE_DATA(probe); \ + label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 */" :: "X"(arg1), "X"(arg2), "X"(arg3), "X"(arg4), "X"(arg5), "X"(arg6), "X"(arg7), "X"(arg8), "X"(arg9), "X"(arg10)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8), "+rm"(arg9), "+rm"(arg10)); \ } while (0) #define STAP_PROBE(provider,probe) \ STAP_PROBE_(probe) #define STAP_PROBE1(provider,probe,parm1) \ - STAP_PROBE1_(probe,(parm1)) + STAP_PROBE1_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1)) #define STAP_PROBE2(provider,probe,parm1,parm2) \ - STAP_PROBE2_(probe,(parm1),(parm2)) + STAP_PROBE2_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2)) #define STAP_PROBE3(provider,probe,parm1,parm2,parm3) \ - STAP_PROBE3_(probe,(parm1),(parm2),(parm3)) + STAP_PROBE3_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3)) #define STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \ - STAP_PROBE4_(probe,(parm1),(parm2),(parm3),(parm4)) + STAP_PROBE4_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4)) #define STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) \ - STAP_PROBE5_(probe,(parm1),(parm2),(parm3),(parm4),(parm5)) + STAP_PROBE5_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5)) #define STAP_PROBE6(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6) \ - STAP_PROBE6_(probe,(parm1),(parm2),(parm3),(parm4),(parm5),(parm6)) + STAP_PROBE6_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5),(parm6)) #define STAP_PROBE7(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \ - STAP_PROBE7_(probe,(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7)) + STAP_PROBE7_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7)) #define STAP_PROBE8(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \ - STAP_PROBE8_(probe,(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8)) + STAP_PROBE8_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8)) #define STAP_PROBE9(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \ - STAP_PROBE9_(probe,(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8),(parm9)) + STAP_PROBE9_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8),(parm9)) #define STAP_PROBE10(provider,probe,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \ - STAP_PROBE10_(probe,(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8),(parm9),(parm10)) + STAP_PROBE10_(probe,STAP_LABEL(STAP_LABEL_PREFIX(probe),STAP_COUNTER),(parm1),(parm2),(parm3),(parm4),(parm5),(parm6),(parm7),(parm8),(parm9),(parm10)) #define DTRACE_PROBE(provider,probe) \ STAP_PROBE(provider,probe) -- cgit From 8f7c6d4680717700fe8beb8cc6d59c241e6677ed Mon Sep 17 00:00:00 2001 From: Stan Cox Date: Tue, 24 Mar 2009 14:06:36 -0400 Subject: Use read operand "g" constraints. * includes/sdt.h (STAP_PROBEN): Use R "g" instead of RW "+rm" which can result in "read-only variable arg1 used as asm output" --- includes/sys/sdt.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'includes/sys/sdt.h') diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h index ac24b6fb..ba75076b 100644 --- a/includes/sys/sdt.h +++ b/includes/sys/sdt.h @@ -56,7 +56,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 */" : "+rm"(arg1)); \ + "\tnop /* %0 */" :: "g"(arg1)); \ } while (0) #define STAP_PROBE2_(probe,label,parm1,parm2) \ @@ -67,7 +67,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 */" : "+rm"(arg1), "+rm"(arg2)); \ + "\tnop /* %0 %1 */" :: "g"(arg1), "g"(arg2)); \ } while (0) #define STAP_PROBE3_(probe,label,parm1,parm2,parm3) \ @@ -79,7 +79,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3)); \ + "\tnop /* %0 %1 %2 */" :: "g"(arg1), "g"(arg2), "g"(arg3)); \ } while (0) #define STAP_PROBE4_(probe,label,parm1,parm2,parm3,parm4) \ @@ -92,7 +92,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4)); \ + "\tnop /* %0 %1 %2 %3 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4)); \ } while (0) #define STAP_PROBE5_(probe,label,parm1,parm2,parm3,parm4,parm5) \ @@ -106,7 +106,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5)); \ + "\tnop /* %0 %1 %2 %3 %4 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5)); \ } while (0) #define STAP_PROBE6_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6) \ @@ -121,7 +121,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5), "g"(arg6)); \ } while (0) #define STAP_PROBE7_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7) \ @@ -137,7 +137,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5), "g"(arg6), "g"(arg7)); \ } while (0) #define STAP_PROBE8_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8) \ @@ -154,7 +154,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5), "g"(arg6), "g"(arg7), "g"(arg8)); \ } while (0) #define STAP_PROBE9_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9) \ @@ -172,7 +172,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8), "+rm"(arg9)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5), "g"(arg6), "g"(arg7), "g"(arg8), "g"(arg9)); \ } while (0) #define STAP_PROBE10_(probe,label,parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10) \ @@ -191,7 +191,7 @@ do { \ STAP_PROBE_DATA(probe); \ label: \ __asm__ volatile ("2:\n" \ - "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 */" : "+rm"(arg1), "+rm"(arg2), "+rm"(arg3), "+rm"(arg4), "+rm"(arg5), "+rm"(arg6), "+rm"(arg7), "+rm"(arg8), "+rm"(arg9), "+rm"(arg10)); \ + "\tnop /* %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 */" :: "g"(arg1), "g"(arg2), "g"(arg3), "g"(arg4), "g"(arg5), "g"(arg6), "g"(arg7), "g"(arg8), "g"(arg9), "g"(arg10)); \ } while (0) #define STAP_PROBE(provider,probe) \ -- cgit