diff options
Diffstat (limited to 'test')
-rwxr-xr-x | test/run-spec-wasm2c.py | 33 | ||||
-rw-r--r-- | test/wasm2c/spec/threads/atomic.txt | 51 |
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 ;;) |