89#define USDT_MAJOR_VERSION 0
90#define USDT_MINOR_VERSION 1
91#define USDT_PATCH_VERSION 0
94#if (defined(__STDC_VERSION__) && __STDC_VERSION__ > 201710L) || (defined(__cplusplus) && __cplusplus > 201703L)
95#define __usdt_va_opt 1
96#define __usdt_va_args(...) __VA_OPT__(,) __VA_ARGS__
98#define __usdt_va_args(...) , ##__VA_ARGS__
113#define USDT(group, name, ...) \
114 __usdt_probe(group, name, __usdt_sema_none, 0 __VA_OPT__(,) __VA_ARGS__)
116#define USDT(group, name, ...) \
117 __usdt_probe(group, name, __usdt_sema_none, 0, ##__VA_ARGS__)
160#define USDT_WITH_SEMA(group, name, ...) \
161 __usdt_probe(group, name, \
162 __usdt_sema_implicit, __usdt_sema_name(group, name) \
163 __VA_OPT__(,) __VA_ARGS__)
165#define USDT_WITH_SEMA(group, name, ...) \
166 __usdt_probe(group, name, \
167 __usdt_sema_implicit, __usdt_sema_name(group, name), \
171struct usdt_sema {
volatile unsigned short active; };
189#define USDT_IS_ACTIVE(group, name) ({ \
190 extern struct usdt_sema __usdt_sema_name(group, name) \
191 __usdt_asm_name(__usdt_sema_name(group, name)); \
192 __usdt_sema_implicit(__usdt_sema_name(group, name)); \
193 __usdt_sema_name(group, name).active > 0; \
215#define USDT_SEMA(sema) __usdt_sema_##sema
251#define USDT_DEFINE_SEMA(sema) \
252 struct usdt_sema __usdt_sema_sec USDT_SEMA(sema) \
253 __usdt_asm_name(USDT_SEMA(sema)) \
254 __attribute__((visibility("hidden"))) = { 0 }
265#define USDT_DECLARE_SEMA(sema) \
266 extern struct usdt_sema USDT_SEMA(sema) __usdt_asm_name(USDT_SEMA(sema))
283#define USDT_SEMA_IS_ACTIVE(sema) (USDT_SEMA(sema).active > 0)
294#define USDT_WITH_EXPLICIT_SEMA(sema, group, name, ...) \
295 __usdt_probe(group, name, __usdt_sema_explicit, USDT_SEMA(sema), ##__VA_ARGS__)
297#define USDT_WITH_EXPLICIT_SEMA(sema, group, name, ...) \
298 __usdt_probe(group, name, __usdt_sema_explicit, USDT_SEMA(sema) __VA_OPT__(,) __VA_ARGS__)
304#ifndef USDT_ARG_CONSTRAINT
305#if defined __powerpc__
306#define USDT_ARG_CONSTRAINT nZr
308#define USDT_ARG_CONSTRAINT g
309#elif defined __loongarch__
310#define USDT_ARG_CONSTRAINT nmr
312#define USDT_ARG_CONSTRAINT nor
317#if defined(__ia64__) || defined(__s390__) || defined(__s390x__)
318#define USDT_NOP nop 0
328#define __usdt_sema_name(group, name) __usdt_sema_##group##__##name
330#define __usdt_sema_sec __attribute__((section(".probes")))
332#define __usdt_concat(a, b) a ## b
333#define __usdt_apply(fn, n) __usdt_concat(fn, n)
336#define __usdt_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, N, ...) N
341#define __usdt_narg(...) __usdt_nth(_ __VA_OPT__(,) __VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
343#define __usdt_narg(...) __usdt_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
348#define __usdt_str_(x) #x
349#define __usdt_str(x) __usdt_str_(x)
351#ifndef __usdt_asm_name
352#define __usdt_asm_name(name) __asm__(__usdt_str(name))
355#define __usdt_asm1(a) __usdt_str(a) "\n"
356#define __usdt_asm2(a,b) __usdt_str(a) "," __usdt_str(b) "\n"
357#define __usdt_asm3(a,b,c) __usdt_str(a) "," __usdt_str(b) "," __usdt_str(c) "\n"
358#define __usdt_asm5(a,b,c,d,e) __usdt_str(a) "," __usdt_str(b) "," __usdt_str(c) "," \
359 __usdt_str(d) "," __usdt_str(e) "\n"
362#define __usdt_asm_addr .8byte
364#define __usdt_asm_addr .4byte
367#define __usdt_asm_strz_(x) __usdt_asm1(.asciz #x)
368#define __usdt_asm_strz(x) __usdt_asm_strz_(x)
369#define __usdt_asm_str_(x) __usdt_asm1(.ascii #x)
370#define __usdt_asm_str(x) __usdt_asm_str_(x)
373#ifndef __usdt_sema_none
374#define __usdt_sema_none(sema)
378#ifndef __usdt_sema_implicit
379#define __usdt_sema_implicit(sema) \
380 __asm__ __volatile__ ( \
381 __usdt_asm1(.ifndef sema) \
382 __usdt_asm3( .pushsection .probes, "aw", "progbits") \
383 __usdt_asm1( .weak sema) \
384 __usdt_asm1( .hidden sema) \
385 __usdt_asm1( .align 2) \
387 __usdt_asm1( .zero 2) \
388 __usdt_asm2( .type sema, @object) \
389 __usdt_asm2( .size sema, 2) \
390 __usdt_asm1( .popsection) \
391 __usdt_asm1(.endif) \
396#ifndef __usdt_sema_explicit
397#define __usdt_sema_explicit(sema) \
398 __asm__ __volatile__ ("" :: "m" (sema));
402#define __usdt_probe(group, name, sema_def, sema, ...) do { \
404 __asm__ __volatile__ ( \
405 __usdt_asm1(990: USDT_NOP) \
406 __usdt_asm3( .pushsection .note.stapsdt, "", "note") \
407 __usdt_asm1( .balign 4) \
408 __usdt_asm3( .4byte 992f-991f,994f-993f,3) \
409 __usdt_asm1(991: .asciz "stapsdt") \
410 __usdt_asm1(992: .balign 4) \
411 __usdt_asm1(993: __usdt_asm_addr 990b) \
412 __usdt_asm1( __usdt_asm_addr _.stapsdt.base) \
413 __usdt_asm1( __usdt_asm_addr sema) \
414 __usdt_asm_strz(group) \
415 __usdt_asm_strz(name) \
416 __usdt_asm_args(__VA_ARGS__) \
417 __usdt_asm1( .ascii "\0") \
418 __usdt_asm1(994: .balign 4) \
419 __usdt_asm1( .popsection) \
420 __usdt_asm1(.ifndef _.stapsdt.base) \
421 __usdt_asm5( .pushsection .stapsdt.base,"aG","progbits",.stapsdt.base,comdat)\
422 __usdt_asm1( .weak _.stapsdt.base) \
423 __usdt_asm1( .hidden _.stapsdt.base) \
424 __usdt_asm1(_.stapsdt.base:) \
425 __usdt_asm1( .space 1) \
426 __usdt_asm2( .size _.stapsdt.base, 1) \
427 __usdt_asm1( .popsection) \
428 __usdt_asm1(.endif) \
429 :: __usdt_asm_ops(__VA_ARGS__) \
450#if defined(__powerpc__) || defined(__powerpc64__)
451#define __usdt_argref(id) %I[id]%[id]
452#elif defined(__i386__)
453#define __usdt_argref(id) %k[id]
455#define __usdt_argref(id) %[id]
458#define __usdt_asm_arg(n) __usdt_asm_str(%c[__usdt_asz##n]) \
459 __usdt_asm1(.ascii "@") \
460 __usdt_asm_str(__usdt_argref(__usdt_aval##n))
462#define __usdt_asm_args0
463#define __usdt_asm_args1 __usdt_asm_arg(1)
464#define __usdt_asm_args2 __usdt_asm_args1 __usdt_asm1(.ascii " ") __usdt_asm_arg(2)
465#define __usdt_asm_args3 __usdt_asm_args2 __usdt_asm1(.ascii " ") __usdt_asm_arg(3)
466#define __usdt_asm_args4 __usdt_asm_args3 __usdt_asm1(.ascii " ") __usdt_asm_arg(4)
467#define __usdt_asm_args5 __usdt_asm_args4 __usdt_asm1(.ascii " ") __usdt_asm_arg(5)
468#define __usdt_asm_args6 __usdt_asm_args5 __usdt_asm1(.ascii " ") __usdt_asm_arg(6)
469#define __usdt_asm_args7 __usdt_asm_args6 __usdt_asm1(.ascii " ") __usdt_asm_arg(7)
470#define __usdt_asm_args8 __usdt_asm_args7 __usdt_asm1(.ascii " ") __usdt_asm_arg(8)
471#define __usdt_asm_args9 __usdt_asm_args8 __usdt_asm1(.ascii " ") __usdt_asm_arg(9)
472#define __usdt_asm_args10 __usdt_asm_args9 __usdt_asm1(.ascii " ") __usdt_asm_arg(10)
473#define __usdt_asm_args11 __usdt_asm_args10 __usdt_asm1(.ascii " ") __usdt_asm_arg(11)
474#define __usdt_asm_args12 __usdt_asm_args11 __usdt_asm1(.ascii " ") __usdt_asm_arg(12)
475#define __usdt_asm_args(...) __usdt_apply(__usdt_asm_args, __usdt_narg(__VA_ARGS__))
477#define __usdt_is_arr(x) (__builtin_classify_type(x) == 14 || __builtin_classify_type(x) == 5)
478#define __usdt_arg_size(x) (__usdt_is_arr(x) ? sizeof(void *) : sizeof(x))
486#define __usdt_is_signed(x) (!__usdt_is_arr(x) && __usdt_t<__typeof(x)>::is_signed)
490template<
typename T>
struct __usdt_t {
static const bool is_signed =
false; };
491template<
typename A>
struct __usdt_t<A[]> :
public __usdt_t<A *> {};
492template<
typename A,
size_t N>
struct __usdt_t<A[N]> :
public __usdt_t<A *> {};
494#define __usdt_def_signed(T) \
495template<> struct __usdt_t<T> { static const bool is_signed = true; }; \
496template<> struct __usdt_t<const T> { static const bool is_signed = true; }; \
497template<> struct __usdt_t<volatile T> { static const bool is_signed = true; }; \
498template<> struct __usdt_t<const volatile T> { static const bool is_signed = true; }
499#define __usdt_maybe_signed(T) \
500template<> struct __usdt_t<T> { static const bool is_signed = (T)-1 < (T)1; }; \
501template<> struct __usdt_t<const T> { static const bool is_signed = (T)-1 < (T)1; }; \
502template<> struct __usdt_t<volatile T> { static const bool is_signed = (T)-1 < (T)1; }; \
503template<> struct __usdt_t<const volatile T> { static const bool is_signed = (T)-1 < (T)1; }
505__usdt_def_signed(
signed char);
506__usdt_def_signed(
short);
507__usdt_def_signed(
int);
508__usdt_def_signed(
long);
509__usdt_def_signed(
long long);
510__usdt_maybe_signed(
char);
511__usdt_maybe_signed(
wchar_t);
515#define __usdt_is_inttype(x) (__builtin_classify_type(x) >= 1 && __builtin_classify_type(x) <= 4)
516#define __usdt_inttype(x) __typeof(__builtin_choose_expr(__usdt_is_inttype(x), (x), 0U))
517#define __usdt_is_signed(x) ((__usdt_inttype(x))-1 < (__usdt_inttype(x))1)
521#define __usdt_asm_op(n, x) \
522 [__usdt_asz##n] "n" ((__usdt_is_signed(x) ? (int)-1 : 1) * (int)__usdt_arg_size(x)), \
523 [__usdt_aval##n] __usdt_str(USDT_ARG_CONSTRAINT)(x)
525#define __usdt_asm_ops0() [__usdt_dummy] "g" (0)
526#define __usdt_asm_ops1(x) __usdt_asm_op(1, x)
527#define __usdt_asm_ops2(a,x) __usdt_asm_ops1(a), __usdt_asm_op(2, x)
528#define __usdt_asm_ops3(a,b,x) __usdt_asm_ops2(a,b), __usdt_asm_op(3, x)
529#define __usdt_asm_ops4(a,b,c,x) __usdt_asm_ops3(a,b,c), __usdt_asm_op(4, x)
530#define __usdt_asm_ops5(a,b,c,d,x) __usdt_asm_ops4(a,b,c,d), __usdt_asm_op(5, x)
531#define __usdt_asm_ops6(a,b,c,d,e,x) __usdt_asm_ops5(a,b,c,d,e), __usdt_asm_op(6, x)
532#define __usdt_asm_ops7(a,b,c,d,e,f,x) __usdt_asm_ops6(a,b,c,d,e,f), __usdt_asm_op(7, x)
533#define __usdt_asm_ops8(a,b,c,d,e,f,g,x) __usdt_asm_ops7(a,b,c,d,e,f,g), __usdt_asm_op(8, x)
534#define __usdt_asm_ops9(a,b,c,d,e,f,g,h,x) __usdt_asm_ops8(a,b,c,d,e,f,g,h), __usdt_asm_op(9, x)
535#define __usdt_asm_ops10(a,b,c,d,e,f,g,h,i,x) __usdt_asm_ops9(a,b,c,d,e,f,g,h,i), __usdt_asm_op(10, x)
536#define __usdt_asm_ops11(a,b,c,d,e,f,g,h,i,j,x) __usdt_asm_ops10(a,b,c,d,e,f,g,h,i,j), __usdt_asm_op(11, x)
537#define __usdt_asm_ops12(a,b,c,d,e,f,g,h,i,j,k,x) __usdt_asm_ops11(a,b,c,d,e,f,g,h,i,j,k), __usdt_asm_op(12, x)
538#define __usdt_asm_ops(...) __usdt_apply(__usdt_asm_ops, __usdt_narg(__VA_ARGS__))(__VA_ARGS__)