Commit | Line | Data |
---|---|---|
2e197497 MD |
1 | // SPDX-License-Identifier: MIT |
2 | /* | |
3 | * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
4 | */ | |
5 | ||
6 | #ifndef _SIDE_MACROS_H | |
7 | #define _SIDE_MACROS_H | |
8 | ||
9 | #include <stddef.h> | |
10 | #include <limits.h> | |
11 | ||
12 | /* Helper macros */ | |
13 | ||
14 | #define SIDE_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) | |
15 | ||
16 | /* | |
17 | * Compound literals with static storage are needed by SIDE | |
18 | * instrumentation. | |
19 | * Compound literals are part of the C99 and C11 standards, but not | |
20 | * part of the C++ standards. They are supported by most C++ compilers | |
21 | * though. | |
22 | * | |
23 | * Example use: | |
24 | * static struct mystruct *var = LTTNG_UST_COMPOUND_LITERAL(struct mystruct, { 1, 2, 3 }); | |
25 | */ | |
26 | #define SIDE_COMPOUND_LITERAL(type, ...) (type[]) { __VA_ARGS__ } | |
27 | ||
28 | #define side_likely(x) __builtin_expect(!!(x), 1) | |
29 | #define side_unlikely(x) __builtin_expect(!!(x), 0) | |
30 | ||
31 | #define SIDE_PARAM(...) __VA_ARGS__ | |
32 | ||
33 | /* Select arg1 in list of arguments. */ | |
34 | #define SIDE_PARAM_SELECT_ARG1(_arg0, _arg1, ...) _arg1 | |
35 | ||
36 | /* | |
37 | * Use the default parameter if no additional arguments are provided, | |
38 | .* else use the following arguments. Use inside macros to implement | |
39 | * optional last macro argument. | |
40 | */ | |
41 | #define SIDE_PARAM_DEFAULT(_default, ...) \ | |
42 | SIDE_PARAM_SELECT_ARG1(dummy, ##__VA_ARGS__, _default) | |
43 | ||
44 | /* | |
45 | * side_container_of - Get the address of an object containing a field. | |
46 | * | |
47 | * @ptr: pointer to the field. | |
48 | * @type: type of the object. | |
49 | * @member: name of the field within the object. | |
50 | */ | |
51 | #define side_container_of(ptr, type, member) \ | |
52 | __extension__ \ | |
53 | ({ \ | |
54 | const __typeof__(((type *) NULL)->member) * __ptr = (ptr); \ | |
55 | (type *)((char *)__ptr - offsetof(type, member)); \ | |
56 | }) | |
57 | ||
58 | #define side_struct_field_sizeof(_struct, _field) \ | |
59 | sizeof(((_struct * )NULL)->_field) | |
60 | ||
61 | #if defined(__SIZEOF_LONG__) | |
62 | #define SIDE_BITS_PER_LONG (__SIZEOF_LONG__ * 8) | |
63 | #elif defined(_LP64) | |
64 | #define SIDE_BITS_PER_LONG 64 | |
65 | #else | |
66 | #define SIDE_BITS_PER_LONG 32 | |
67 | #endif | |
68 | ||
69 | #define SIDE_PACKED __attribute__((packed)) | |
70 | ||
71 | #endif /* _SIDE_MACROS_H */ |