1 #ifndef JEMALLOC_INTERNAL_MACROS_H
2 #define JEMALLOC_INTERNAL_MACROS_H
3 
4 #ifdef JEMALLOC_DEBUG
5 #  define JEMALLOC_ALWAYS_INLINE static inline
6 #else
7 #  define JEMALLOC_ALWAYS_INLINE JEMALLOC_ATTR(always_inline) static inline
8 #endif
9 #ifdef _MSC_VER
10 #  define inline _inline
11 #endif
12 
13 #define UNUSED JEMALLOC_ATTR(unused)
14 
15 #define ZU(z)	((size_t)z)
16 #define ZD(z)	((ssize_t)z)
17 #define QU(q)	((uint64_t)q)
18 #define QD(q)	((int64_t)q)
19 
20 #define KZU(z)	ZU(z##ULL)
21 #define KZD(z)	ZD(z##LL)
22 #define KQU(q)	QU(q##ULL)
23 #define KQD(q)	QI(q##LL)
24 
25 #ifndef __DECONST
26 #  define	__DECONST(type, var)	((type)(uintptr_t)(const void *)(var))
27 #endif
28 
29 #if !defined(JEMALLOC_HAS_RESTRICT) || defined(__cplusplus)
30 #  define restrict
31 #endif
32 
33 /* Various function pointers are static and immutable except during testing. */
34 #ifdef JEMALLOC_JET
35 #  define JET_MUTABLE
36 #else
37 #  define JET_MUTABLE const
38 #endif
39 
40 #define JEMALLOC_VA_ARGS_HEAD(head, ...) head
41 #define JEMALLOC_VA_ARGS_TAIL(head, ...) __VA_ARGS__
42 
43 #if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__) \
44   && defined(JEMALLOC_HAVE_ATTR) && (__GNUC__ >= 7)
45 #define JEMALLOC_FALLTHROUGH JEMALLOC_ATTR(fallthrough);
46 #else
47 #define JEMALLOC_FALLTHROUGH /* falls through */
48 #endif
49 
50 /* Diagnostic suppression macros */
51 #if defined(_MSC_VER) && !defined(__clang__)
52 #  define JEMALLOC_DIAGNOSTIC_PUSH __pragma(warning(push))
53 #  define JEMALLOC_DIAGNOSTIC_POP __pragma(warning(pop))
54 #  define JEMALLOC_DIAGNOSTIC_IGNORE(W) __pragma(warning(disable:W))
55 #  define JEMALLOC_DIAGNOSTIC_IGNORE_MISSING_STRUCT_FIELD_INITIALIZERS
56 #  define JEMALLOC_DIAGNOSTIC_IGNORE_TYPE_LIMITS
57 #  define JEMALLOC_DIAGNOSTIC_IGNORE_ALLOC_SIZE_LARGER_THAN
58 #  define JEMALLOC_DIAGNOSTIC_DISABLE_SPURIOUS
59 /* #pragma GCC diagnostic first appeared in gcc 4.6. */
60 #elif (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && \
61   (__GNUC_MINOR__ > 5)))) || defined(__clang__)
62 /*
63  * The JEMALLOC_PRAGMA__ macro is an implementation detail of the GCC and Clang
64  * diagnostic suppression macros and should not be used anywhere else.
65  */
66 #  define JEMALLOC_PRAGMA__(X) _Pragma(#X)
67 #  define JEMALLOC_DIAGNOSTIC_PUSH JEMALLOC_PRAGMA__(GCC diagnostic push)
68 #  define JEMALLOC_DIAGNOSTIC_POP JEMALLOC_PRAGMA__(GCC diagnostic pop)
69 #  define JEMALLOC_DIAGNOSTIC_IGNORE(W) \
70      JEMALLOC_PRAGMA__(GCC diagnostic ignored W)
71 
72 /*
73  * The -Wmissing-field-initializers warning is buggy in GCC versions < 5.1 and
74  * all clang versions up to version 7 (currently trunk, unreleased).  This macro
75  * suppresses the warning for the affected compiler versions only.
76  */
77 #  if ((defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ < 5)) || \
78      defined(__clang__)
79 #    define JEMALLOC_DIAGNOSTIC_IGNORE_MISSING_STRUCT_FIELD_INITIALIZERS  \
80           JEMALLOC_DIAGNOSTIC_IGNORE("-Wmissing-field-initializers")
81 #  else
82 #    define JEMALLOC_DIAGNOSTIC_IGNORE_MISSING_STRUCT_FIELD_INITIALIZERS
83 #  endif
84 
85 #  define JEMALLOC_DIAGNOSTIC_IGNORE_TYPE_LIMITS  \
86      JEMALLOC_DIAGNOSTIC_IGNORE("-Wtype-limits")
87 #  define JEMALLOC_DIAGNOSTIC_IGNORE_UNUSED_PARAMETER \
88      JEMALLOC_DIAGNOSTIC_IGNORE("-Wunused-parameter")
89 #  if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ >= 7)
90 #    define JEMALLOC_DIAGNOSTIC_IGNORE_ALLOC_SIZE_LARGER_THAN \
91        JEMALLOC_DIAGNOSTIC_IGNORE("-Walloc-size-larger-than=")
92 #  else
93 #    define JEMALLOC_DIAGNOSTIC_IGNORE_ALLOC_SIZE_LARGER_THAN
94 #  endif
95 #  define JEMALLOC_DIAGNOSTIC_DISABLE_SPURIOUS \
96   JEMALLOC_DIAGNOSTIC_PUSH \
97   JEMALLOC_DIAGNOSTIC_IGNORE_UNUSED_PARAMETER
98 #else
99 #  define JEMALLOC_DIAGNOSTIC_PUSH
100 #  define JEMALLOC_DIAGNOSTIC_POP
101 #  define JEMALLOC_DIAGNOSTIC_IGNORE(W)
102 #  define JEMALLOC_DIAGNOSTIC_IGNORE_MISSING_STRUCT_FIELD_INITIALIZERS
103 #  define JEMALLOC_DIAGNOSTIC_IGNORE_TYPE_LIMITS
104 #  define JEMALLOC_DIAGNOSTIC_IGNORE_ALLOC_SIZE_LARGER_THAN
105 #  define JEMALLOC_DIAGNOSTIC_DISABLE_SPURIOUS
106 #endif
107 
108 /*
109  * Disables spurious diagnostics for all headers.  Since these headers are not
110  * included by users directly, it does not affect their diagnostic settings.
111  */
112 JEMALLOC_DIAGNOSTIC_DISABLE_SPURIOUS
113 
114 #endif /* JEMALLOC_INTERNAL_MACROS_H */
115