Skip to content

Commit 3a3289a

Browse files
xal-0topolarity
andauthored
Make jl_assume, jl_assume_aligned, jl_unreachable asserts in debug (#61015)
When JL_NDEBUG is undefined, we should use these as assertions. Suggested by @topolarity in #60031 (comment). --------- Co-authored-by: Cody Tapscott <84105208+topolarity@users.noreply.github.com>
1 parent 1acf168 commit 3a3289a

2 files changed

Lines changed: 70 additions & 30 deletions

File tree

src/julia_internal.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,10 +2021,14 @@ struct _jl_image_fptrs_t;
20212021
JL_DLLEXPORT void jl_write_coverage_data(const char*);
20222022
void jl_write_malloc_log(void);
20232023

2024-
#if jl_has_builtin(__builtin_unreachable) || defined(_COMPILER_GCC_) || defined(_COMPILER_INTEL_)
2025-
# define jl_unreachable() __builtin_unreachable()
2024+
#ifdef JL_NDEBUG
2025+
# if jl_has_builtin(__builtin_unreachable) || defined(_COMPILER_GCC_) || defined(_COMPILER_INTEL_)
2026+
# define jl_unreachable() __builtin_unreachable()
2027+
# else
2028+
# define jl_unreachable() ((void)jl_assume(0))
2029+
# endif
20262030
#else
2027-
# define jl_unreachable() ((void)jl_assume(0))
2031+
# define jl_unreachable() assert(0 && "unreachable")
20282032
#endif
20292033

20302034
extern uv_mutex_t symtab_lock;

src/support/dtypes.h

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#ifndef JL_DTYPES_H
44
#define JL_DTYPES_H
55

6+
#include <assert.h>
67
#include <stddef.h>
78
#include <stddef.h> // double include of stddef.h fixes #3421
89
#include <stdint.h>
@@ -142,52 +143,87 @@ typedef intptr_t ssize_t;
142143
# define JL_ATTRIBUTE_ALIGN_PTRSIZE(x)
143144
#endif
144145

145-
#ifdef __has_builtin
146+
#if defined(__has_builtin)
146147
# define jl_has_builtin(x) __has_builtin(x)
147148
#else
148149
# define jl_has_builtin(x) 0
149150
#endif
150151

151-
#if jl_has_builtin(__builtin_assume)
152-
#define jl_assume(cond) (__extension__ ({ \
153-
__typeof__(cond) cond_ = (cond); \
154-
__builtin_assume(!!(cond_)); \
155-
cond_; \
156-
}))
157-
#elif defined(__GNUC__)
152+
#ifdef JL_NDEBUG
153+
# if jl_has_builtin(__builtin_assume)
154+
# define jl_assume(cond) \
155+
(__extension__({ \
156+
__typeof__(cond) cond_ = (cond); \
157+
__builtin_assume(!!(cond_)); \
158+
cond_; \
159+
}))
160+
# elif defined(__GNUC__)
158161
static inline void jl_assume_(int cond)
159162
{
160163
if (!cond) {
161164
__builtin_unreachable();
162165
}
163166
}
164-
#define jl_assume(cond) (__extension__ ({ \
165-
__typeof__(cond) cond_ = (cond); \
166-
jl_assume_(!!(cond_)); \
167-
cond_; \
168-
}))
169-
#else
170-
#define jl_assume(cond) (cond)
171-
#endif
172-
173-
#if jl_has_builtin(__builtin_assume_aligned) || defined(_COMPILER_GCC_)
174-
#define jl_assume_aligned(ptr, align) __builtin_assume_aligned(ptr, align)
175-
#elif defined(__GNUC__)
176-
#define jl_assume_aligned(ptr, align) (__extension__ ({ \
177-
__typeof__(ptr) ptr_ = (ptr); \
178-
jl_assume(((uintptr_t)ptr) % (align) == 0); \
179-
ptr_; \
180-
}))
181-
#elif defined(__cplusplus)
167+
# define jl_assume(cond) \
168+
(__extension__({ \
169+
__typeof__(cond) cond_ = (cond); \
170+
jl_assume_(!!(cond_)); \
171+
cond_; \
172+
}))
173+
# else
174+
# define jl_assume(cond) (cond)
175+
# endif
176+
# if jl_has_builtin(__builtin_assume_aligned) || defined(_COMPILER_GCC_)
177+
# define jl_assume_aligned(ptr, align) __builtin_assume_aligned(ptr, align)
178+
# elif defined(__GNUC__)
179+
# define jl_assume_aligned(ptr, align) \
180+
(__extension__({ \
181+
__typeof__(ptr) ptr_ = (ptr); \
182+
jl_assume(((uintptr_t)ptr_) % (align) == 0); \
183+
ptr_; \
184+
}))
185+
# elif defined(__cplusplus)
182186
template<typename T>
183187
static inline T
184188
jl_assume_aligned(T ptr, unsigned align)
185189
{
186190
(void)jl_assume(((uintptr_t)ptr) % align == 0);
187191
return ptr;
188192
}
193+
# else
194+
# define jl_assume_aligned(ptr, align) (ptr)
195+
# endif
189196
#else
190-
#define jl_assume_aligned(ptr, align) (ptr)
197+
# if defined(__GNUC__)
198+
# define jl_assume(cond) \
199+
(__extension__({ \
200+
__typeof__(cond) cond_ = (cond); \
201+
assert(!!(cond_)); \
202+
cond_; \
203+
}))
204+
# define jl_assume_aligned(ptr, align) \
205+
(__extension__({ \
206+
__typeof__(ptr) ptr_ = (ptr); \
207+
assert(((uintptr_t)ptr_) % (align) == 0); \
208+
ptr_; \
209+
}))
210+
# elif defined(__cplusplus)
211+
# define jl_assume(cond) \
212+
(([&]() { \
213+
auto cond_ = (cond); \
214+
assert(!!(cond_)); \
215+
return cond_; \
216+
})())
217+
# define jl_assume_aligned(ptr, align) \
218+
(([&]() { \
219+
auto ptr_ = (ptr); \
220+
assert(((uintptr_t)ptr_) % (align) == 0); \
221+
return ptr_; \
222+
})())
223+
# else
224+
# define jl_assume(cond) (cond)
225+
# define jl_assume_aligned(ptr, align) (ptr)
226+
# endif
191227
#endif
192228

193229
typedef int bool_t;

0 commit comments

Comments
 (0)