From: Mathieu Desnoyers Date: Mon, 10 Apr 2023 17:40:34 +0000 (-0400) Subject: Tests: Introduce arch-mo unit tests X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=eb5d1cbec33a58c153a101b664b1bd90c43cb27f;p=librseq.git Tests: Introduce arch-mo unit tests Signed-off-by: Mathieu Desnoyers Change-Id: Ibef415f2c9d2c9356c00b11870057f74f89d75d5 --- diff --git a/configure.ac b/configure.ac index 8606a0f..7f712ad 100644 --- a/configure.ac +++ b/configure.ac @@ -226,6 +226,7 @@ AC_CONFIG_FILES([ src/librseq.pc tests/Makefile tests/utils/Makefile + tests/unit/Makefile ]) AC_OUTPUT diff --git a/include/rseq/compiler.h b/include/rseq/compiler.h index d09e770..3f4327e 100644 --- a/include/rseq/compiler.h +++ b/include/rseq/compiler.h @@ -27,4 +27,12 @@ */ #define rseq_after_asm_goto() asm volatile ("" : : : "memory") +#if defined(__SIZEOF_LONG__) +#define RSEQ_BITS_PER_LONG (__SIZEOF_LONG__ * 8) +#elif defined(_LP64) +#define RSEQ_BITS_PER_LONG 64 +#else +#define RSEQ_BITS_PER_LONG 32 +#endif + #endif /* RSEQ_COMPILER_H_ */ diff --git a/tests/Makefile.am b/tests/Makefile.am index a0842e3..c60f345 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -3,7 +3,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/tests/utils -SUBDIRS = utils +SUBDIRS = utils unit TEST_EXTENSIONS = .tap TAP_LOG_DRIVER_FLAGS = --merge --comments diff --git a/tests/unit/.gitignore b/tests/unit/.gitignore new file mode 100644 index 0000000..bce47cc --- /dev/null +++ b/tests/unit/.gitignore @@ -0,0 +1,2 @@ +/arch_mo.tap +/arch_mo_cxx.tap diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am new file mode 100644 index 0000000..3257b5e --- /dev/null +++ b/tests/unit/Makefile.am @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MIT + +AM_CPPFLAGS += -I$(top_srcdir)/tests/utils + +TEST_EXTENSIONS = .tap +TAP_LOG_DRIVER_FLAGS = --merge --comments +TAP_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' \ + RSEQ_TESTS_SRCDIR='$(abs_top_srcdir)/tests' \ + RSEQ_TESTS_BUILDDIR='$(abs_top_builddir)/tests' \ + $(SHELL) $(abs_top_srcdir)/tests/utils/tap-driver.sh + +noinst_PROGRAMS = \ + arch_mo.tap \ + arch_mo_cxx.tap + +arch_mo_tap_SOURCES = arch-mo.c +arch_mo_tap_LDADD = $(top_builddir)/tests/utils/libtap.la $(DL_LIBS) + +arch_mo_cxx_tap_SOURCES = arch-mo-cxx.cpp +arch_mo_cxx_tap_LDADD = $(top_builddir)/tests/utils/libtap.la $(DL_LIBS) + +TESTS = \ + arch_mo.tap \ + arch_mo_cxx.tap diff --git a/tests/unit/arch-mo-cxx.cpp b/tests/unit/arch-mo-cxx.cpp new file mode 100644 index 0000000..14e70c7 --- /dev/null +++ b/tests/unit/arch-mo-cxx.cpp @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: MIT + +#include "arch-mo.c" diff --git a/tests/unit/arch-mo.c b/tests/unit/arch-mo.c new file mode 100644 index 0000000..72cd3cc --- /dev/null +++ b/tests/unit/arch-mo.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT + +#include +#include +#include + +#include "tap.h" + +struct { + uint8_t v_u8; + int8_t v_s8; + uint16_t v_u16; + int16_t v_s16; + uint32_t v_u32; + int32_t v_s32; +#if RSEQ_BITS_PER_LONG == 64 + uint64_t v_u64; + int64_t v_s64; +#endif + void *p; + volatile int vol_int; + const int const_int; +} load_s = { + .v_u8 = 0x11, + .v_s8 = -(0x11), + .v_u16 = 0x1122, + .v_s16 = -(0x1122), + .v_u32 = (0x11223344), + .v_s32 = -(0x11223344), +#if RSEQ_BITS_PER_LONG == 64 + .v_u64 = 0x1122334455667788ULL, + .v_s64 = -(0x1122334455667788LL), + .p = (void *)0x1122334455667788ULL, +#else + .p = (void *)0x11223344, +#endif + .vol_int = -(0x11223344), + .const_int = -(0x11223344), +}; + +static +void test_load_acquire(void) +{ + ok(rseq_smp_load_acquire(&load_s.v_u8) == 0x11, "load-acquire u8"); + ok(rseq_smp_load_acquire(&load_s.v_s8) == -(0x11), "load-acquire s8"); + ok(rseq_smp_load_acquire(&load_s.v_u16) == 0x1122, "load-acquire u16"); + ok(rseq_smp_load_acquire(&load_s.v_s16) == -(0x1122), "load-acquire s16"); + ok(rseq_smp_load_acquire(&load_s.v_u32) == 0x11223344, "load-acquire u32"); + ok(rseq_smp_load_acquire(&load_s.v_s32) == -(0x11223344), "load-acquire s32"); +#if RSEQ_BITS_PER_LONG == 64 + ok(rseq_smp_load_acquire(&load_s.v_u64) == 0x1122334455667788ULL, "load-acquire u64"); + ok(rseq_smp_load_acquire(&load_s.v_s64) == -(0x1122334455667788LL), "load-acquire s64"); + ok(rseq_smp_load_acquire(&load_s.p) == (void *)0x1122334455667788ULL, "load-acquire pointer"); +#else + ok(rseq_smp_load_acquire(&load_s.p) == (void *)0x11223344, "load-acquire pointer"); +#endif + ok(rseq_smp_load_acquire(&load_s.vol_int) == -(0x11223344), "load-acquire volatile int"); + ok(rseq_smp_load_acquire(&load_s.const_int) == -(0x11223344), "load-acquire const int"); +} + +struct { + uint8_t v_u8; + int8_t v_s8; + uint16_t v_u16; + int16_t v_s16; + uint32_t v_u32; + int32_t v_s32; +#if RSEQ_BITS_PER_LONG == 64 + uint64_t v_u64; + int64_t v_s64; +#endif + void *p; + volatile int vol_int; +} store_s; + +static +void test_store_release(void) +{ + rseq_smp_store_release(&store_s.v_u8, 0x11); + ok(store_s.v_u8 == 0x11, "store-release u8"); + rseq_smp_store_release(&store_s.v_s8, -(0x11)); + ok(store_s.v_s8 == -(0x11), "store-release s8"); + rseq_smp_store_release(&store_s.v_u16, 0x1122); + ok(store_s.v_u16 == 0x1122, "store-release u16"); + rseq_smp_store_release(&store_s.v_s16, -(0x1122)); + ok(store_s.v_s16 == -(0x1122), "store-release s16"); + rseq_smp_store_release(&store_s.v_u32, 0x11223344); + ok(store_s.v_u32 == 0x11223344, "store-release u32"); + rseq_smp_store_release(&store_s.v_s32, -(0x11223344)); + ok(store_s.v_s32 == -(0x11223344), "store-release s32"); +#if RSEQ_BITS_PER_LONG == 64 + rseq_smp_store_release(&store_s.v_u64, 0x1122334455667788ULL); + ok(store_s.v_u64 == 0x1122334455667788ULL, "store-release u64"); + rseq_smp_store_release(&store_s.v_s64, -(0x1122334455667788LL)); + ok(store_s.v_s64 == -(0x1122334455667788LL), "store-release s64"); + rseq_smp_store_release(&store_s.p, (void *)0x1122334455667788ULL); + ok(store_s.p == (void *)0x1122334455667788ULL, "store-release pointer"); +#else + rseq_smp_store_release(&store_s.p, (void *)0x11223344); + ok(store_s.p == (void *)0x11223344, "store-release pointer"); +#endif + rseq_smp_store_release(&store_s.vol_int, -(0x11223344)); + ok(store_s.vol_int == -(0x11223344), "store-release volatile int"); +} + +int main(void) +{ + plan_no_plan(); + test_load_acquire(); + test_store_release(); + exit(exit_status()); +}