[ltt-dev] SystemTAP support in tracepoints
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Tue Apr 12 14:35:55 EDT 2011
* Josh Stone (jistone at redhat.com) wrote:
> On 04/11/2011 02:19 PM, Josh Stone wrote:
> > AFAIK, the only roadblock is that our probes are argument-numbered
> > rather than variadic. I've been thinking for a while that it would be
> > nice if we had a variadic SDT macro, e.g. STAP_PROBEV, and then UST
> > could invoke it directly. Since you and I were brainstorming this,
> > here's a neat trick I found to count __VA_ARGS__:
> > http://groups.google.com/group/comp.std.c/msg/346fc464319b1ee5
> >
> > I'm going to try to adapt that for SDT, so I'll post if I get it working...
>
> Here's what I came up with:
>
> #define _SDT_NARG(...) __SDT_NARG(__VA_ARGS__, 10,9,8,7,6,5,4,3,2,1,0)
> #define __SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, N, ...) N
> #define _SDT_PROBE_N(provider, name, N, ...) \
> _SDT_PROBE(provider, name, N, (__VA_ARGS__))
> #define STAP_PROBEV(provider, name, ...) \
> _SDT_PROBE_N(provider, name, _SDT_NARG(0,##__VA_ARGS__),##__VA_ARGS__)
>
> _SDT_NARG is actually returning the count minus one, and I call it with
> an extra arg, so we can avoid non-standard empty macro args.
>
> Comments?
Cool! I tweaked it a bit and came up with the following. Comments ?
#include <stdio.h>
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition))
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
#undef offsetof
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
/* for x86 64 */
#define _ASM_PTR ".quad "
#define _A0()
#define _A1(first) \
"g" (first)
#define _A2(first, args...) \
"g" (first), _A1(args)
#define _A3(first, args...) \
"g" (first), _A2(args)
#define _A4(first, args...) \
"g" (first), _A3(args)
#define _A5(first, args...) \
"g" (first), _A4(args)
#define _A6(first, args...) \
"g" (first), _A5(args)
#define _A7(first, args...) \
"g" (first), _A6(args)
#define _A8(first, args...) \
"g" (first), _A7(args)
#define _A9(first, args...) \
"g" (first), _A8(args)
#define _A10(first, args...) \
"g" (first), _A9(args)
#define ___TP_NARGS(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, N, args...) N
#define __TP_NARGS(args...) \
___TP_NARGS(args, 10,9,8,7,6,5,4,3,2,1,0)
/* Handle empty args with added 0. */
#define _TP_NARGS(args...) \
__TP_NARGS(0,##args)
/* Create a section with IP and tracepoint name */
#define _TRACEPOINT_ENTRY(name) \
".section __tracepoint_strings\"aw\"\n\t" \
"0:\n\t" \
".string \"" __stringify(name) "\"\n\t" \
".previous\n\t" \
".section __tracepoint_ip\"aw\"\n\t" \
_ASM_PTR "(0b)\n\t" \
_ASM_PTR "(1f)\n\t" \
".previous\n\t" \
"1:\n\t"
/* Create macro name by pasting the result of macro evaluation */
#define __tp_sym(_a, _b) _a##_b
#define _tp_sym(_a, _b) __tp_sym(_a, _b)
#define tracepoint(name, args...) \
do { \
asm volatile (_TRACEPOINT_ENTRY(name) : : _tp_sym(_A, _TP_NARGS(args))(args) : "memory"); \
BUILD_BUG_ON(_TP_NARGS(args) > 10); \
} while (0)
int main(int argc, char **argv)
{
int one, two, three, four;
unsigned long long five, six, seven, eight, nine, ten, eleven;
//trace(name, one, two, three, four, five);
//trace(name, one, two, three);
tracepoint(namet1);
tracepoint(namet2, one);
tracepoint(namet3, one, two);
tracepoint(namet3, one, two, three, four, five);
tracepoint(namet3, one, two, three, four, five,
six, seven, eight, &nine, ten);
//tracepoint(namet3, one, two, three, four, five,
// six, seven, eight, &nine, ten, eleven);
// error trace(name, one, two, three, four, five, six);
// error trace(name, one, two, three, four, noexist);
return 0;
}
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list