85#define USDT_MAJOR_VERSION 0
86#define USDT_MINOR_VERSION 1
87#define USDT_PATCH_VERSION 0
90#if (defined(__STDC_VERSION__) && __STDC_VERSION__ > 201710L) || (defined(__cplusplus) && __cplusplus > 201703L)
91#define __usdt_va_opt 1
92#define __usdt_va_args(...) __VA_OPT__(,) __VA_ARGS__
94#define __usdt_va_args(...) , ##__VA_ARGS__
109#define USDT(group, name, ...) \
110 __usdt_probe(group, name, __usdt_sema_none, 0 __VA_OPT__(,) __VA_ARGS__)
112#define USDT(group, name, ...) \
113 __usdt_probe(group, name, __usdt_sema_none, 0, ##__VA_ARGS__)
156#define USDT_WITH_SEMA(group, name, ...) \
157 __usdt_probe(group, name, \
158 __usdt_sema_implicit, __usdt_sema_name(group, name) \
159 __VA_OPT__(,) __VA_ARGS__)
161#define USDT_WITH_SEMA(group, name, ...) \
162 __usdt_probe(group, name, \
163 __usdt_sema_implicit, __usdt_sema_name(group, name), \
185#define USDT_IS_ACTIVE(group, name) ({ \
186 extern struct usdt_sema __usdt_sema_name(group, name) \
187 __usdt_asm_name(__usdt_sema_name(group, name)); \
188 __usdt_sema_implicit(__usdt_sema_name(group, name)); \
189 __usdt_sema_name(group, name).active > 0; \
211#define USDT_SEMA(sema) __usdt_sema_##sema
247#define USDT_DEFINE_SEMA(sema) \
248 struct usdt_sema __usdt_sema_sec USDT_SEMA(sema) \
249 __usdt_asm_name(USDT_SEMA(sema)) \
250 __attribute__((visibility("hidden"))) = { 0 }
261#define USDT_DECLARE_SEMA(sema) \
262 extern struct usdt_sema USDT_SEMA(sema) __usdt_asm_name(USDT_SEMA(sema))
279#define USDT_SEMA_IS_ACTIVE(sema) (USDT_SEMA(sema).active > 0)
290#define USDT_WITH_EXPLICIT_SEMA(sema, group, name, ...) \
291 __usdt_probe(group, name, __usdt_sema_explicit, USDT_SEMA(sema), ##__VA_ARGS__)
293#define USDT_WITH_EXPLICIT_SEMA(sema, group, name, ...) \
294 __usdt_probe(group, name, __usdt_sema_explicit, USDT_SEMA(sema) __VA_OPT__(,) __VA_ARGS__)
300#ifndef USDT_ARG_CONSTRAINT
301#if defined __powerpc__
302#define USDT_ARG_CONSTRAINT nZr
304#define USDT_ARG_CONSTRAINT g
305#elif defined __loongarch__
306#define USDT_ARG_CONSTRAINT nmr
308#define USDT_ARG_CONSTRAINT nor
313#if defined(__ia64__) || defined(__s390__) || defined(__s390x__)
314#define USDT_NOP nop 0
315#elif defined(__x86_64__)
316#define USDT_NOP .byte 0x90, 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00
326#define __usdt_sema_name(group, name) __usdt_sema_##group##__##name
328#define __usdt_sema_sec __attribute__((section(".probes")))
330#define __usdt_concat(a, b) a ## b
331#define __usdt_apply(fn, n) __usdt_concat(fn, n)
334#define __usdt_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, N, ...) N
339#define __usdt_narg(...) __usdt_nth(_ __VA_OPT__(,) __VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
341#define __usdt_narg(...) __usdt_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
346#define __usdt_str_(x) #x
347#define __usdt_str(x) __usdt_str_(x)
349#ifndef __usdt_asm_name
350#define __usdt_asm_name(name) __asm__(__usdt_str(name))
353#define __usdt_asm0() "\n"
354#define __usdt_asm1(x) __usdt_str(x) "\n"
355#define __usdt_asm2(x, ...) __usdt_str(x) "," __usdt_asm1(__VA_ARGS__)
356#define __usdt_asm3(x, ...) __usdt_str(x) "," __usdt_asm2(__VA_ARGS__)
357#define __usdt_asm4(x, ...) __usdt_str(x) "," __usdt_asm3(__VA_ARGS__)
358#define __usdt_asm5(x, ...) __usdt_str(x) "," __usdt_asm4(__VA_ARGS__)
359#define __usdt_asm6(x, ...) __usdt_str(x) "," __usdt_asm5(__VA_ARGS__)
360#define __usdt_asm7(x, ...) __usdt_str(x) "," __usdt_asm6(__VA_ARGS__)
361#define __usdt_asm8(x, ...) __usdt_str(x) "," __usdt_asm7(__VA_ARGS__)
362#define __usdt_asm9(x, ...) __usdt_str(x) "," __usdt_asm8(__VA_ARGS__)
363#define __usdt_asm10(x, ...) __usdt_str(x) "," __usdt_asm9(__VA_ARGS__)
364#define __usdt_asm11(x, ...) __usdt_str(x) "," __usdt_asm10(__VA_ARGS__)
365#define __usdt_asm12(x, ...) __usdt_str(x) "," __usdt_asm11(__VA_ARGS__)
366#define __usdt_asm(...) __usdt_apply(__usdt_asm, __usdt_narg(__VA_ARGS__))(__VA_ARGS__)
369#define __usdt_asm_addr .8byte
371#define __usdt_asm_addr .4byte
374#define __usdt_asm_strz_(x) __usdt_asm1(.asciz #x)
375#define __usdt_asm_strz(x) __usdt_asm_strz_(x)
376#define __usdt_asm_str_(x) __usdt_asm1(.ascii #x)
377#define __usdt_asm_str(x) __usdt_asm_str_(x)
380#ifndef __usdt_sema_none
381#define __usdt_sema_none(sema)
385#ifndef __usdt_sema_implicit
386#define __usdt_sema_implicit(sema) \
387 __asm__ __volatile__ ( \
388 __usdt_asm1(.ifndef sema) \
389 __usdt_asm3( .pushsection .probes, "aw", "progbits") \
390 __usdt_asm1( .weak sema) \
391 __usdt_asm1( .hidden sema) \
392 __usdt_asm1( .align 2) \
394 __usdt_asm1( .zero 2) \
395 __usdt_asm2( .type sema, @object) \
396 __usdt_asm2( .size sema, 2) \
397 __usdt_asm1( .popsection) \
398 __usdt_asm1(.endif) \
403#ifndef __usdt_sema_explicit
404#define __usdt_sema_explicit(sema) \
405 __asm__ __volatile__ ("" :: "m" (sema));
409#define __usdt_probe(group, name, sema_def, sema, ...) do { \
411 __asm__ __volatile__ ( \
412 __usdt_asm( 990: USDT_NOP) \
413 __usdt_asm3( .pushsection .note.stapsdt, "", "note") \
414 __usdt_asm1( .balign 4) \
415 __usdt_asm3( .4byte 992f-991f,994f-993f,3) \
416 __usdt_asm1(991: .asciz "stapsdt") \
417 __usdt_asm1(992: .balign 4) \
418 __usdt_asm1(993: __usdt_asm_addr 990b) \
419 __usdt_asm1( __usdt_asm_addr _.stapsdt.base) \
420 __usdt_asm1( __usdt_asm_addr sema) \
421 __usdt_asm_strz(group) \
422 __usdt_asm_strz(name) \
423 __usdt_asm_args(__VA_ARGS__) \
424 __usdt_asm1( .ascii "\0") \
425 __usdt_asm1(994: .balign 4) \
426 __usdt_asm1( .popsection) \
427 __usdt_asm1(.ifndef _.stapsdt.base) \
428 __usdt_asm5( .pushsection .stapsdt.base,"aG","progbits",.stapsdt.base,comdat)\
429 __usdt_asm1( .weak _.stapsdt.base) \
430 __usdt_asm1( .hidden _.stapsdt.base) \
431 __usdt_asm1(_.stapsdt.base:) \
432 __usdt_asm1( .space 1) \
433 __usdt_asm2( .size _.stapsdt.base, 1) \
434 __usdt_asm1( .popsection) \
435 __usdt_asm1(.endif) \
436 :: __usdt_asm_ops(__VA_ARGS__) \
457#if defined(__powerpc__) || defined(__powerpc64__)
458#define __usdt_argref(id) %I[id]%[id]
459#elif defined(__i386__)
460#define __usdt_argref(id) %k[id]
462#define __usdt_argref(id) %[id]
465#define __usdt_asm_arg(n) __usdt_asm_str(%c[__usdt_asz##n]) \
466 __usdt_asm1(.ascii "@") \
467 __usdt_asm_str(__usdt_argref(__usdt_aval##n))
469#define __usdt_asm_args0
470#define __usdt_asm_args1 __usdt_asm_arg(1)
471#define __usdt_asm_args2 __usdt_asm_args1 __usdt_asm1(.ascii " ") __usdt_asm_arg(2)
472#define __usdt_asm_args3 __usdt_asm_args2 __usdt_asm1(.ascii " ") __usdt_asm_arg(3)
473#define __usdt_asm_args4 __usdt_asm_args3 __usdt_asm1(.ascii " ") __usdt_asm_arg(4)
474#define __usdt_asm_args5 __usdt_asm_args4 __usdt_asm1(.ascii " ") __usdt_asm_arg(5)
475#define __usdt_asm_args6 __usdt_asm_args5 __usdt_asm1(.ascii " ") __usdt_asm_arg(6)
476#define __usdt_asm_args7 __usdt_asm_args6 __usdt_asm1(.ascii " ") __usdt_asm_arg(7)
477#define __usdt_asm_args8 __usdt_asm_args7 __usdt_asm1(.ascii " ") __usdt_asm_arg(8)
478#define __usdt_asm_args9 __usdt_asm_args8 __usdt_asm1(.ascii " ") __usdt_asm_arg(9)
479#define __usdt_asm_args10 __usdt_asm_args9 __usdt_asm1(.ascii " ") __usdt_asm_arg(10)
480#define __usdt_asm_args11 __usdt_asm_args10 __usdt_asm1(.ascii " ") __usdt_asm_arg(11)
481#define __usdt_asm_args12 __usdt_asm_args11 __usdt_asm1(.ascii " ") __usdt_asm_arg(12)
482#define __usdt_asm_args(...) __usdt_apply(__usdt_asm_args, __usdt_narg(__VA_ARGS__))
484#define __usdt_is_arr(x) (__builtin_classify_type(x) == 14 || __builtin_classify_type(x) == 5)
485#define __usdt_arg_size(x) (__usdt_is_arr(x) ? sizeof(void *) : sizeof(x))
493#define __usdt_is_signed(x) (!__usdt_is_arr(x) && __usdt_t<__typeof(x)>::is_signed)
497template<
typename T>
struct __usdt_t {
static const bool is_signed =
false; };
498template<
typename A>
struct __usdt_t<A[]> :
public __usdt_t<A *> {};
499template<
typename A,
size_t N>
struct __usdt_t<A[N]> :
public __usdt_t<A *> {};
501#define __usdt_def_signed(T) \
502template<> struct __usdt_t<T> { static const bool is_signed = true; }; \
503template<> struct __usdt_t<const T> { static const bool is_signed = true; }; \
504template<> struct __usdt_t<volatile T> { static const bool is_signed = true; }; \
505template<> struct __usdt_t<const volatile T> { static const bool is_signed = true; }
506#define __usdt_maybe_signed(T) \
507template<> struct __usdt_t<T> { static const bool is_signed = (T)-1 < (T)1; }; \
508template<> struct __usdt_t<const T> { static const bool is_signed = (T)-1 < (T)1; }; \
509template<> struct __usdt_t<volatile T> { static const bool is_signed = (T)-1 < (T)1; }; \
510template<> struct __usdt_t<const volatile T> { static const bool is_signed = (T)-1 < (T)1; }
512__usdt_def_signed(
signed char);
513__usdt_def_signed(
short);
514__usdt_def_signed(
int);
515__usdt_def_signed(
long);
516__usdt_def_signed(
long long);
517__usdt_maybe_signed(
char);
518__usdt_maybe_signed(
wchar_t);
522#define __usdt_is_inttype(x) (__builtin_classify_type(x) >= 1 && __builtin_classify_type(x) <= 4)
523#define __usdt_inttype(x) __typeof(__builtin_choose_expr(__usdt_is_inttype(x), (x), 0U))
524#define __usdt_is_signed(x) ((__usdt_inttype(x))-1 < (__usdt_inttype(x))1)
528#define __usdt_asm_op(n, x) \
529 [__usdt_asz##n] "n" ((__usdt_is_signed(x) ? (int)-1 : 1) * (int)__usdt_arg_size(x)), \
530 [__usdt_aval##n] __usdt_str(USDT_ARG_CONSTRAINT)(x)
532#define __usdt_asm_ops0() [__usdt_dummy] "g" (0)
533#define __usdt_asm_ops1(x) __usdt_asm_op(1, x)
534#define __usdt_asm_ops2(a,x) __usdt_asm_ops1(a), __usdt_asm_op(2, x)
535#define __usdt_asm_ops3(a,b,x) __usdt_asm_ops2(a,b), __usdt_asm_op(3, x)
536#define __usdt_asm_ops4(a,b,c,x) __usdt_asm_ops3(a,b,c), __usdt_asm_op(4, x)
537#define __usdt_asm_ops5(a,b,c,d,x) __usdt_asm_ops4(a,b,c,d), __usdt_asm_op(5, x)
538#define __usdt_asm_ops6(a,b,c,d,e,x) __usdt_asm_ops5(a,b,c,d,e), __usdt_asm_op(6, x)
539#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)
540#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)
541#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)
542#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)
543#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)
544#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)
545#define __usdt_asm_ops(...) __usdt_apply(__usdt_asm_ops, __usdt_narg(__VA_ARGS__))(__VA_ARGS__)
volatile unsigned short active