summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rwxr-xr-xtest/run-spec-wasm2c.py33
-rw-r--r--test/wasm2c/spec/threads/atomic.txt51
2 files changed, 52 insertions, 32 deletions
diff --git a/test/run-spec-wasm2c.py b/test/run-spec-wasm2c.py
index 0ab42a04..6a59471d 100755
--- a/test/run-spec-wasm2c.py
+++ b/test/run-spec-wasm2c.py
@@ -445,20 +445,26 @@ class CWriter(object):
raise Error('Unexpected action type: %s' % type_)
-def Compile(cc, c_filename, out_dir, *cflags):
+def Compile(cc, c_filename, out_dir, use_c11, *cflags):
if IS_WINDOWS:
ext = '.obj'
else:
ext = '.o'
o_filename = utils.ChangeDir(utils.ChangeExt(c_filename, ext), out_dir)
args = list(cflags)
+
if IS_WINDOWS:
- args += ['/nologo', '/MDd', '/c', c_filename, '/Fo' + o_filename]
+ cstd_flag = ['/std:c11', '/experimental:c11atomics'] if use_c11 else []
+ args += cstd_flag + ['/nologo', '/MDd', '/c', c_filename, '/Fo' + o_filename]
else:
# See "Compiling the wasm2c output" section of wasm2c/README.md
# When compiling with -O2, GCC and clang require '-fno-optimize-sibling-calls'
# and '-frounding-math' to maintain conformance with the spec tests
# (GCC also requires '-fsignaling-nans')
+ if use_c11:
+ args.append('-std=c11')
+ else:
+ args.append('-std=c99')
args += ['-c', c_filename, '-o', o_filename, '-O2',
'-Wall', '-Werror', '-Wno-unused',
'-Wno-array-bounds',
@@ -467,7 +473,7 @@ def Compile(cc, c_filename, out_dir, *cflags):
'-Wno-infinite-recursion',
'-fno-optimize-sibling-calls',
'-frounding-math', '-fsignaling-nans',
- '-std=c99', '-D_DEFAULT_SOURCE']
+ '-D_DEFAULT_SOURCE']
# Use RunWithArgsForStdout and discard stdout because cl.exe
# unconditionally prints the name of input files on stdout
# and we don't want that to be part of our stdout.
@@ -602,6 +608,8 @@ def main(args):
return SKIPPED
cflags.append('-DSUPPORT_MEMORY64=1')
+ use_c11 = options.enable_threads
+
for i, wasm_filename in enumerate(cwriter.GetModuleFilenames()):
wasm_filename = os.path.join(out_dir, wasm_filename)
c_filename_input = utils.ChangeExt(wasm_filename, '.c')
@@ -616,7 +624,7 @@ def main(args):
wasm2c.RunWithArgs(wasm_filename, '-o', c_filename_input, *args)
if options.compile:
for j, c_filename in enumerate(c_filenames):
- o_filenames.append(Compile(cc, c_filename, out_dir, *cflags))
+ o_filenames.append(Compile(cc, c_filename, out_dir, use_c11, *cflags))
cwriter.Write()
main_filename = utils.ChangeExt(json_file_path, '-main.c')
@@ -624,16 +632,17 @@ def main(args):
out_main_file.write(output.getvalue())
if options.compile:
- # Compile wasm-rt-impl.
- wasm_rt_impl_c = os.path.join(options.wasmrt_dir, 'wasm-rt-impl.c')
- o_filenames.append(Compile(cc, wasm_rt_impl_c, out_dir, *cflags))
+ # Compile runtime code
+ source_files = [
+ main_filename,
+ os.path.join(options.wasmrt_dir, 'wasm-rt-impl.c'),
+ os.path.join(options.wasmrt_dir, 'wasm-rt-exceptions-impl.c'),
+ os.path.join(options.wasmrt_dir, 'wasm-rt-mem-impl.c'),
+ ]
- # Compile wasm-rt-exceptions.
- wasm_rt_exceptions_c = os.path.join(options.wasmrt_dir, 'wasm-rt-exceptions-impl.c')
- o_filenames.append(Compile(cc, wasm_rt_exceptions_c, out_dir, *cflags))
+ for f in source_files:
+ o_filenames.append(Compile(cc, f, out_dir, use_c11, *cflags))
- # Compile and link -main test run entry point
- o_filenames.append(Compile(cc, main_filename, out_dir, *cflags))
if IS_WINDOWS:
exe_ext = '.exe'
libs = []
diff --git a/test/wasm2c/spec/threads/atomic.txt b/test/wasm2c/spec/threads/atomic.txt
index 256adc68..d9880c71 100644
--- a/test/wasm2c/spec/threads/atomic.txt
+++ b/test/wasm2c/spec/threads/atomic.txt
@@ -1,6 +1,8 @@
;;; TOOL: run-spec-wasm2c
;;; ARGS*: --enable-threads
-;; atomic operations --- This is a subset of the full test suite, that is currently supported by wasm2c
+;; atomic operations --- This is a subset of the full test suite taken from the
+;; threads proposal repo, from the upstream-rebuild branch (pending future
+;; merge of threads upstream-rebuild branch).
(module
(memory 1 1 shared)
@@ -324,21 +326,41 @@
(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
(invoke "init" (i64.const 0x1111111111111111))
+(assert_return (invoke "i32.atomic.rmw8.cmpxchg_u" (i32.const 0) (i32.const 0x11111111) (i32.const 0xcdcdcdcd)) (i32.const 0x11))
+(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x11111111111111cd))
+
+(invoke "init" (i64.const 0x1111111111111111))
(assert_return (invoke "i32.atomic.rmw16.cmpxchg_u" (i32.const 0) (i32.const 0) (i32.const 0xcafecafe)) (i32.const 0x1111))
(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
(invoke "init" (i64.const 0x1111111111111111))
+(assert_return (invoke "i32.atomic.rmw16.cmpxchg_u" (i32.const 0) (i32.const 0x11111111) (i32.const 0xcafecafe)) (i32.const 0x1111))
+(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x111111111111cafe))
+
+(invoke "init" (i64.const 0x1111111111111111))
(assert_return (invoke "i64.atomic.rmw8.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0x4242424242424242)) (i64.const 0x11))
(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
(invoke "init" (i64.const 0x1111111111111111))
+(assert_return (invoke "i64.atomic.rmw8.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0x4242424242424242)) (i64.const 0x11))
+(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111142))
+
+(invoke "init" (i64.const 0x1111111111111111))
(assert_return (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0xbeefbeefbeefbeef)) (i64.const 0x1111))
(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
(invoke "init" (i64.const 0x1111111111111111))
+(assert_return (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0xbeefbeefbeefbeef)) (i64.const 0x1111))
+(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x111111111111beef))
+
+(invoke "init" (i64.const 0x1111111111111111))
(assert_return (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0xcabba6e5cabba6e5)) (i64.const 0x11111111))
(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x1111111111111111))
+(invoke "init" (i64.const 0x1111111111111111))
+(assert_return (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 0) (i64.const 0x1111111111111111) (i64.const 0xcabba6e5cabba6e5)) (i64.const 0x11111111))
+(assert_return (invoke "i64.atomic.load" (i32.const 0)) (i64.const 0x11111111cabba6e5))
+
;; *.atomic.rmw*.cmpxchg (compare true)
(invoke "init" (i64.const 0x1111111111111111))
@@ -422,26 +444,11 @@
(memory 1 1 shared)
(func (export "init") (param $value i64) (i64.store (i32.const 0) (local.get $value)))
-
-;; ;; (func (export "memory.atomic.notify") (param $addr i32) (param $count i32) (result i32)
-;; ;; (memory.atomic.notify (local.get 0) (local.get 1)))
-;; ;; (func (export "memory.atomic.wait32") (param $addr i32) (param $expected i32) (param $timeout i64) (result i32)
-;; ;; (memory.atomic.wait32 (local.get 0) (local.get 1) (local.get 2)))
-;; ;; (func (export "memory.atomic.wait64") (param $addr i32) (param $expected i64) (param $timeout i64) (result i32)
-;; ;; (memory.atomic.wait64 (local.get 0) (local.get 1) (local.get 2)))
)
-;; (invoke "init" (i64.const 0xffffffffffff))
-;; ;; (assert_return (invoke "memory.atomic.wait32" (i32.const 0) (i32.const 0) (i64.const 0)) (i32.const 1))
-;; ;; (assert_return (invoke "memory.atomic.wait64" (i32.const 0) (i64.const 0) (i64.const 0)) (i32.const 1))
-;; ;; (assert_return (invoke "memory.atomic.notify" (i32.const 0) (i32.const 0)) (i32.const 0))
-
;; unshared memory is OK
(module
(memory 1 1)
- ;; (func (drop (memory.atomic.notify (i32.const 0) (i32.const 0))))
- ;; (func (drop (memory.atomic.wait32 (i32.const 0) (i32.const 0) (i64.const 0))))
- ;; (func (drop (memory.atomic.wait64 (i32.const 0) (i64.const 0) (i64.const 0))))
(func (drop (i32.atomic.load (i32.const 0))))
(func (drop (i64.atomic.load (i32.const 0))))
(func (drop (i32.atomic.load16_u (i32.const 0))))
@@ -489,10 +496,14 @@
(func (drop (i64.atomic.rmw32.cmpxchg_u (i32.const 0) (i64.const 0) (i64.const 0))))
)
+;; atomic.fence: no memory is ok
+(module
+ (func (export "fence") (atomic.fence))
+)
+
+(assert_return (invoke "fence"))
+
;; Fails with no memory
-;; (assert_invalid (module (func (drop (memory.atomic.notify (i32.const 0) (i32.const 0))))) "unknown memory")
-;; (assert_invalid (module (func (drop (memory.atomic.wait32 (i32.const 0) (i32.const 0) (i64.const 0))))) "unknown memory")
-;; (assert_invalid (module (func (drop (memory.atomic.wait64 (i32.const 0) (i64.const 0) (i64.const 0))))) "unknown memory")
(assert_invalid (module (func (drop (i32.atomic.load (i32.const 0))))) "unknown memory")
(assert_invalid (module (func (drop (i64.atomic.load (i32.const 0))))) "unknown memory")
(assert_invalid (module (func (drop (i32.atomic.load16_u (i32.const 0))))) "unknown memory")
@@ -539,5 +550,5 @@
(assert_invalid (module (func (drop (i64.atomic.rmw16.cmpxchg_u (i32.const 0) (i64.const 0) (i64.const 0))))) "unknown memory")
(assert_invalid (module (func (drop (i64.atomic.rmw32.cmpxchg_u (i32.const 0) (i64.const 0) (i64.const 0))))) "unknown memory")
(;; STDOUT ;;;
-184/184 tests passed.
+195/195 tests passed.
;;; STDOUT ;;)