From ac3c8bfe354d39c2a64fc48ff34c3dc1a5742e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 6 Dec 2023 00:44:06 +0200 Subject: [PATCH] test: Add a testcase for atomic helpers --- test/Makefile | 7 ++++++- test/atomic-helpers.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/atomic-helpers.c diff --git a/test/Makefile b/test/Makefile index 843e46e..bf2a342 100644 --- a/test/Makefile +++ b/test/Makefile @@ -92,6 +92,7 @@ ifneq ($(HAVE_CFGUARD),) TESTS_CFGUARD = cfguard-test TESTS_ASAN_CFGUARD = $(TESTS_ASAN) endif +TESTS_ATOMIC = atomic-helpers TARGETS_C = $(addsuffix $(EXEEXT), $(TESTS_C)) TARGETS_C_DLL = $(addsuffix $(DLLEXT), $(TESTS_C_DLL)) @@ -120,6 +121,7 @@ TARGETS_ASAN = $(addsuffix -asan$(EXEEXT), $(TESTS_ASAN)) TARGETS_UBSAN = $(addsuffix $(EXEEXT), $(TESTS_UBSAN)) TARGETS_ASAN_CFGUARD = $(addsuffix -asan-cfguard$(EXEEXT), $(TESTS_ASAN_CFGUARD)) TARGETS_OMP = $(addsuffix $(EXEEXT), $(TESTS_OMP)) +TARGETS_ATOMIC = $(addsuffix $(EXEEXT), $(TESTS_ATOMIC)) TARGETS = \ $(TARGETS_C) $(TARGETS_C_DLL) $(TARGETS_C_LINK_DLL) $(TARGETS_C_NO_BUILTIN) $(TARGETS_C_ANSI_STDIO) \ @@ -128,7 +130,7 @@ TARGETS = \ $(TARGETS_IDL) $(TARGETS_RES) \ $(TARGETS_OTHER_TARGETS) $(TARGETS_UWP) $(TARGETS_UWP_FAIL) \ $(TARGETS_ASAN) $(TARGETS_UBSAN) $(TARGETS_ASAN_CFGUARD) \ - $(TARGETS_OMP) + $(TARGETS_OMP) $(TARGETS_ATOMIC) # crt-test-fortify doesn't trigger failures FAILURE_TESTS = \ @@ -197,6 +199,9 @@ $(TARGETS_ASAN_CFGUARD): %-asan-cfguard$(EXEEXT): %.c $(TARGETS_OMP): %$(EXEEXT): %.c $(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ -fopenmp=libomp +$(TARGETS_ATOMIC): %$(EXEEXT): %.c + $(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ -Wno-atomic-alignment + %.h: %.idl $(WIDL) $< -h -o $@ diff --git a/test/atomic-helpers.c b/test/atomic-helpers.c new file mode 100644 index 0000000..b39f750 --- /dev/null +++ b/test/atomic-helpers.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +struct large { + int data[20]; +}; + +typedef struct large type; + +_Atomic type value; + +type get(void) { + return atomic_load(&value); +} + +type myValue; + +int lockfree; + +int main(int argc, char* argv[]) { + myValue = get(); + lockfree = atomic_is_lock_free(&value); + return 0; +}