Skip to content

Commit a6105cb

Browse files
vtjnashKristofferC
authored andcommitted
update atomics.h to be more fully C11/C++11 compliant (#42152)
Fixes #42098
1 parent e242b96 commit a6105cb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+785
-577
lines changed

src/Makefile

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ endif
9595

9696
# headers are used for dependency tracking, while public headers will be part of the dist
9797
UV_HEADERS :=
98-
HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h locks.h atomics.h julia_internal.h options.h timing.h) $(addprefix $(BUILDDIR)/, $(DTRACE_HEADERS))
99-
PUBLIC_HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h locks.h atomics.h julia_gcext.h)
98+
HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h julia_locks.h julia_atomics.h julia_internal.h options.h timing.h) $(addprefix $(BUILDDIR)/, $(DTRACE_HEADERS))
99+
PUBLIC_HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h julia_locks.h julia_atomics.h julia_gcext.h)
100100
ifeq ($(USE_SYSTEM_LIBUV),0)
101101
UV_HEADERS += uv.h
102102
UV_HEADERS += uv/*.h
@@ -376,15 +376,23 @@ endif
376376

377377
clangsa: $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT)
378378

379-
clang-sa-%: $(SRCDIR)/%.c $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) | analyzegc-deps-check
380-
@$(call PRINT_ANALYZE, $(build_bindir)/clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text -Xclang -load -Xclang $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) $(CLANGSA_FLAGS) $(JCPPFLAGS) $(JCFLAGS) $(DEBUGFLAGS) -Xclang -analyzer-checker=core$(COMMA)julia.GCChecker --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c $<)
381-
clang-sa-%: $(SRCDIR)/%.cpp $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) | analyzegc-deps-check
382-
@$(call PRINT_ANALYZE, $(build_bindir)/clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text -Xclang -load -Xclang $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) $(CLANGSA_FLAGS) $(CLANGSA_CXXFLAGS) $(LLVM_CXXFLAGS) $(JCPPFLAGS) $(JCXXFLAGS) $(DEBUGFLAGS) -Xclang -analyzer-checker=core$(COMMA)julia.GCChecker --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c++ $<)
379+
clang-sagc-%: $(SRCDIR)/%.c $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) .FORCE | analyzegc-deps-check
380+
@$(call PRINT_ANALYZE, $(build_bindir)/clang -D__clang_gcanalyzer__ --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text -Xclang -load -Xclang $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) $(CLANGSA_FLAGS) $(JCPPFLAGS) $(JCFLAGS) $(DEBUGFLAGS) -Xclang -analyzer-checker=core$(COMMA)julia.GCChecker --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c $<)
381+
clang-sagc-%: $(SRCDIR)/%.cpp $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) .FORCE | analyzegc-deps-check
382+
@$(call PRINT_ANALYZE, $(build_bindir)/clang -D__clang_gcanalyzer__ --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text -Xclang -load -Xclang $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT) $(CLANGSA_FLAGS) $(CLANGSA_CXXFLAGS) $(LLVM_CXXFLAGS) $(JCPPFLAGS) $(JCXXFLAGS) $(DEBUGFLAGS) -Xclang -analyzer-checker=core$(COMMA)julia.GCChecker --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c++ $<)
383383

384-
# Add C files as a target of `analyzegc`
385-
analyzegc: $(addprefix clang-sa-,$(RUNTIME_SRCS))
384+
clang-sa-%: $(SRCDIR)/%.c .FORCE | analyzegc-deps-check
385+
@$(call PRINT_ANALYZE, $(build_bindir)/clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text $(CLANGSA_FLAGS) $(JCPPFLAGS) $(JCFLAGS) $(DEBUGFLAGS) --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c $<)
386+
clang-sa-%: $(SRCDIR)/%.cpp .FORCE | analyzegc-deps-check
387+
@$(call PRINT_ANALYZE, $(build_bindir)/clang --analyze -Xanalyzer -analyzer-werror -Xanalyzer -analyzer-output=text $(CLANGSA_FLAGS) $(CLANGSA_CXXFLAGS) $(LLVM_CXXFLAGS) $(JCPPFLAGS) $(JCXXFLAGS) $(DEBUGFLAGS) --analyzer-no-default-checks -fcolor-diagnostics -Werror -x c++ $<)
388+
389+
390+
# Add C files as a target of `analyzesrc` and `analyzegc`
391+
analyzesrc: $(addprefix clang-sa-,$(SRCS))
392+
analyzegc: analyzesrc $(addprefix clang-sagc-,$(RUNTIME_SRCS))
386393

387394
clean-analyzegc:
388395
rm -f $(build_shlibdir)/libGCCheckerPlugin.$(SHLIB_EXT)
389396

390-
.PHONY: default all debug release clean cleanall clean-* libccalltest libllvmcalltest julia_flisp.boot.inc.phony analyzegc clang-sa-*
397+
.FORCE:
398+
.PHONY: default all debug release clean cleanall clean-* libccalltest libllvmcalltest julia_flisp.boot.inc.phony analyzegc analyzesrc .FORCE

src/array.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ static inline void arrayassign_safe(int hasptr, jl_value_t *parent, char *dst, c
2626
assert(nb >= jl_datatype_size(jl_typeof(src))); // nb might move some undefined bits, but we should be okay with that
2727
if (hasptr) {
2828
size_t nptr = nb / sizeof(void*);
29-
memmove_refs((void**)dst, (void**)src, nptr);
29+
memmove_refs((void**)dst, (void* const*)src, nptr);
3030
jl_gc_multi_wb(parent, src);
3131
}
3232
else {
@@ -588,7 +588,7 @@ JL_DLLEXPORT jl_value_t *jl_ptrarrayref(jl_array_t *a JL_PROPAGATES_ROOT, size_t
588588
{
589589
assert(i < jl_array_len(a));
590590
assert(a->flags.ptrarray);
591-
jl_value_t *elt = jl_atomic_load_relaxed(((jl_value_t**)a->data) + i);
591+
jl_value_t *elt = jl_atomic_load_relaxed(((_Atomic(jl_value_t*)*)a->data) + i);
592592
if (elt == NULL)
593593
jl_throw(jl_undefref_exception);
594594
return elt;
@@ -617,7 +617,7 @@ JL_DLLEXPORT jl_value_t *jl_arrayref(jl_array_t *a, size_t i)
617617
JL_DLLEXPORT int jl_array_isassigned(jl_array_t *a, size_t i)
618618
{
619619
if (a->flags.ptrarray) {
620-
return jl_atomic_load_relaxed(((jl_value_t**)jl_array_data(a)) + i) != NULL;
620+
return jl_atomic_load_relaxed(((_Atomic(jl_value_t*)*)jl_array_data(a)) + i) != NULL;
621621
}
622622
else if (a->flags.hasptr) {
623623
jl_datatype_t *eltype = (jl_datatype_t*)jl_tparam0(jl_typeof(a));
@@ -656,7 +656,7 @@ JL_DLLEXPORT void jl_arrayset(jl_array_t *a JL_ROOTING_ARGUMENT, jl_value_t *rhs
656656
arrayassign_safe(hasptr, jl_array_owner(a), &((char*)a->data)[i * a->elsize], rhs, a->elsize);
657657
}
658658
else {
659-
jl_atomic_store_relaxed(((jl_value_t**)a->data) + i, rhs);
659+
jl_atomic_store_relaxed(((_Atomic(jl_value_t*)*)a->data) + i, rhs);
660660
jl_gc_wb(jl_array_owner(a), rhs);
661661
}
662662
}
@@ -666,7 +666,7 @@ JL_DLLEXPORT void jl_arrayunset(jl_array_t *a, size_t i)
666666
if (i >= jl_array_len(a))
667667
jl_bounds_error_int((jl_value_t*)a, i + 1);
668668
if (a->flags.ptrarray)
669-
jl_atomic_store_relaxed(((jl_value_t**)a->data) + i, NULL);
669+
jl_atomic_store_relaxed(((_Atomic(jl_value_t*)*)a->data) + i, NULL);
670670
else if (a->flags.hasptr) {
671671
size_t elsize = a->elsize;
672672
jl_assume(elsize >= sizeof(void*) && elsize % sizeof(void*) == 0);
@@ -1243,9 +1243,11 @@ static NOINLINE ssize_t jl_array_ptr_copy_forward(jl_value_t *owner,
12431243
void **src_p, void **dest_p,
12441244
ssize_t n) JL_NOTSAFEPOINT
12451245
{
1246+
_Atomic(void*) *src_pa = (_Atomic(void*)*)src_p;
1247+
_Atomic(void*) *dest_pa = (_Atomic(void*)*)dest_p;
12461248
for (ssize_t i = 0; i < n; i++) {
1247-
void *val = jl_atomic_load_relaxed(src_p + i);
1248-
jl_atomic_store_relaxed(dest_p + i, val);
1249+
void *val = jl_atomic_load_relaxed(src_pa + i);
1250+
jl_atomic_store_relaxed(dest_pa + i, val);
12491251
// `val` is young or old-unmarked
12501252
if (val && !(jl_astaggedvalue(val)->bits.gc & GC_MARKED)) {
12511253
jl_gc_queue_root(owner);
@@ -1259,9 +1261,11 @@ static NOINLINE ssize_t jl_array_ptr_copy_backward(jl_value_t *owner,
12591261
void **src_p, void **dest_p,
12601262
ssize_t n) JL_NOTSAFEPOINT
12611263
{
1264+
_Atomic(void*) *src_pa = (_Atomic(void*)*)src_p;
1265+
_Atomic(void*) *dest_pa = (_Atomic(void*)*)dest_p;
12621266
for (ssize_t i = 0; i < n; i++) {
1263-
void *val = jl_atomic_load_relaxed(src_p + n - i - 1);
1264-
jl_atomic_store_relaxed(dest_p + n - i - 1, val);
1267+
void *val = jl_atomic_load_relaxed(src_pa + n - i - 1);
1268+
jl_atomic_store_relaxed(dest_pa + n - i - 1, val);
12651269
// `val` is young or old-unmarked
12661270
if (val && !(jl_astaggedvalue(val)->bits.gc & GC_MARKED)) {
12671271
jl_gc_queue_root(owner);

src/ast.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ typedef struct _jl_ast_context_t {
125125

126126
static jl_ast_context_t jl_ast_main_ctx;
127127

128-
#ifdef __clang_analyzer__
128+
#ifdef __clang_gcanalyzer__
129129
jl_ast_context_t *jl_ast_ctx(fl_context_t *fl) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT;
130130
#else
131131
#define jl_ast_ctx(fl_ctx) container_of(fl_ctx, jl_ast_context_t, fl)

src/atomics.h

Lines changed: 0 additions & 163 deletions
This file was deleted.

src/builtins.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ static jl_value_t *do_apply( jl_value_t **args, uint32_t nargs, jl_value_t *iter
706706
}
707707
if (arg_heap) {
708708
// optimization: keep only the first root, free the others
709-
#ifndef __clang_analyzer__
709+
#ifndef __clang_gcanalyzer__
710710
((void**)roots)[-2] = (void*)JL_GC_ENCODE_PUSHARGS(1);
711711
#endif
712712
}

src/cgmemmgr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ static intptr_t get_anon_hdl(void)
205205
return -1;
206206
}
207207

208-
static size_t map_offset = 0;
208+
static _Atomic(size_t) map_offset{0};
209209
// Multiple of 128MB.
210210
// Hopefully no one will set a ulimit for this to be a problem...
211211
static constexpr size_t map_size_inc_default = 128 * 1024 * 1024;
@@ -239,7 +239,7 @@ static intptr_t init_shared_map()
239239
anon_hdl = get_anon_hdl();
240240
if (anon_hdl == -1)
241241
return -1;
242-
map_offset = 0;
242+
jl_atomic_store_relaxed(&map_offset, 0);
243243
map_size = get_map_size_inc();
244244
int ret = ftruncate(anon_hdl, map_size);
245245
if (ret != 0) {

0 commit comments

Comments
 (0)