Tests: Introduce arch-mo unit tests
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 10 Apr 2023 17:40:34 +0000 (13:40 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 20 Apr 2023 21:41:48 +0000 (17:41 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ibef415f2c9d2c9356c00b11870057f74f89d75d5

configure.ac
include/rseq/compiler.h
tests/Makefile.am
tests/unit/.gitignore [new file with mode: 0644]
tests/unit/Makefile.am [new file with mode: 0644]
tests/unit/arch-mo-cxx.cpp [new file with mode: 0644]
tests/unit/arch-mo.c [new file with mode: 0644]

index 8606a0f602d5abde60bfb382f1fabd803acb9b8d..7f712ad7f2745b79499b0503737f7c07d49f3cf5 100644 (file)
@@ -226,6 +226,7 @@ AC_CONFIG_FILES([
        src/librseq.pc
        tests/Makefile
        tests/utils/Makefile
+       tests/unit/Makefile
 ])
 
 AC_OUTPUT
index d09e770ce4ceecdc9cec16548d66709041217fd3..3f4327e1bab47c91961c4cf12158424bb4c3e7e4 100644 (file)
  */
 #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_ */
index a0842e31704639d623ebe33e0f0b00412a838a76..c60f345e794635da84a11c2aea1314465b7fb167 100644 (file)
@@ -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 (file)
index 0000000..bce47cc
--- /dev/null
@@ -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 (file)
index 0000000..3257b5e
--- /dev/null
@@ -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 (file)
index 0000000..14e70c7
--- /dev/null
@@ -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 (file)
index 0000000..72cd3cc
--- /dev/null
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: MIT
+
+#include <stdint.h>
+#include <rseq/rseq.h>
+#include <rseq/compiler.h>
+
+#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());
+}
This page took 0.026576 seconds and 4 git commands to generate.