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 */
112JEMALLOC_DIAGNOSTIC_DISABLE_SPURIOUS
113
114#endif /* JEMALLOC_INTERNAL_MACROS_H */
115