示例#1
0
def test_wasm_emscripten_finalize():
    print '\n[ checking wasm-emscripten-finalize testcases... ]\n'

    for wast_path in files_with_pattern(options.binaryen_test, 'lld',
                                        '*.wast'):
        print '..', wast_path
        mem_file = wast_path + '.mem'
        extension_arg_map = {
            '.out': [],
            '.mem.out': ['--separate-data-segments', mem_file],
        }
        for ext, ext_args in extension_arg_map.items():
            expected_file = wast_path + ext
            if ext != '.out' and not os.path.exists(expected_file):
                continue

            cmd = WASM_EMSCRIPTEN_FINALIZE + [wast_path, '-S'] + ext_args
            cmd += args_for_finalize(os.path.basename(wast_path))
            actual = run_command(cmd)

            if not os.path.exists(expected_file):
                print actual
                fail_with_error('output ' + expected_file + ' does not exist')
            fail_if_not_identical_to_file(actual, expected_file)
            if ext == '.mem.out':
                with open(mem_file) as mf:
                    mem = mf.read()
                    fail_if_not_identical_to_file(mem, wast_path + '.mem.mem')
                os.remove(mem_file)
示例#2
0
文件: lld.py 项目: aheejin/binaryen
def test_wasm_emscripten_finalize():
  print '\n[ checking wasm-emscripten-finalize testcases... ]\n'

  for wast_path in files_with_pattern(options.binaryen_test, 'lld', '*.wast'):
    print '..', wast_path
    mem_file = wast_path + '.mem'
    extension_arg_map = {
      '.out': [],
      '.mem.out': ['--separate-data-segments', mem_file],
    }
    for ext, ext_args in extension_arg_map.items():
      expected_file = wast_path + ext
      if ext != '.out' and not os.path.exists(expected_file):
        continue

      cmd = WASM_EMSCRIPTEN_FINALIZE + [wast_path, '-S'] + ext_args
      cmd += args_for_finalize(os.path.basename(wast_path))
      actual = run_command(cmd)

      if not os.path.exists(expected_file):
        print actual
        fail_with_error('output ' + expected_file + ' does not exist')
      fail_if_not_identical_to_file(actual, expected_file)
      if ext == '.mem.out':
        with open(mem_file) as mf:
          mem = mf.read()
          fail_if_not_identical_to_file(mem, wast_path + '.mem.mem')
        os.remove(mem_file)
示例#3
0
def test_wasm2js_output():
  for wasm in tests + spec_tests + extra_wasm2js_tests:
    if not wasm.endswith('.wast'):
      continue
    basename = os.path.basename(wasm)
    if basename in wasm2js_blacklist:
      continue

    asm = basename.replace('.wast', '.2asm.js')
    expected_file = os.path.join(wasm2js_dir, asm)

    if not os.path.exists(expected_file):
      continue

    print '..', wasm

    t = os.path.join(options.binaryen_test, wasm)

    all_out = []

    for module, asserts in split_wast(t):
      with open('split.wast', 'w') as o:
        o.write(module + '\n'.join(asserts))

      cmd = WASM2JS + ['split.wast', '-O']
      if 'emscripten' in wasm:
        cmd += ['--emscripten']
      out = run_command(cmd)
      all_out.append(out)

      if not NODEJS and not MOZJS:
        print 'No JS interpreters. Skipping spec tests.'
        continue

      open('a.2asm.mjs', 'w').write(out)

      cmd += ['--allow-asserts']
      out = run_command(cmd)
      # also verify it passes pass-debug verifications
      with_pass_debug(lambda: run_command(cmd))

      open('a.2asm.asserts.mjs', 'w').write(out)

      # verify asm.js is valid js, note that we're using --experimental-modules
      # to enable ESM syntax and we're also passing a custom loader to handle the
      # `spectest` and `env` modules in our tests.
      if NODEJS:
        node = [NODEJS, '--experimental-modules', '--loader', './scripts/test/node-esm-loader.mjs']
        cmd = node[:]
        cmd.append('a.2asm.mjs')
        out = run_command(cmd)
        fail_if_not_identical(out, '')
        cmd = node[:]
        cmd.append('a.2asm.asserts.mjs')
        out = run_command(cmd, expected_err='', err_ignore='The ESM module loader is experimental')
        fail_if_not_identical(out, '')

    fail_if_not_identical_to_file(''.join(all_out), expected_file)
示例#4
0
        def do_asm2wasm_test():
          actual = run_command(cmd)

          # verify output
          if not os.path.exists(wasm):
            fail_with_error('output .wast file %s does not exist' % wasm)
          fail_if_not_identical_to_file(actual, wasm)

          binary_format_check(wasm, verify_final_result=False)
示例#5
0
        def do_asm2wasm_test():
          actual = run_command(cmd)

          # verify output
          if not os.path.exists(wasm):
            fail_with_error('output .wast file %s does not exist' % wasm)
          fail_if_not_identical_to_file(actual, wasm)

          binary_format_check(wasm, verify_final_result=False)
示例#6
0
def test_s2wasm():
    print '\n[ checking .s testcases... ]\n'

    cmd = S2WASM + [
        os.path.join(options.binaryen_test, 'dot_s', 'basics.s'),
        '--import-memory'
    ]
    output = run_command(cmd)
    fail_if_not_contained(output, '(import "env" "memory" (memory $0 1))')

    extension_arg_map = {
        '.wast': [],
        '.clamp.wast': ['--trap-mode=clamp'],
        '.js.wast': ['--trap-mode=js'],
        '.jscall.wast': ['--emscripten-reserved-function-pointers=3'],
    }
    for dot_s_dir in ['dot_s', 'llvm_autogenerated']:
        dot_s_path = os.path.join(options.binaryen_test, dot_s_dir)
        for s in sorted(os.listdir(dot_s_path)):
            if not s.endswith('.s'):
                continue
            print '..', s
            for ext, ext_args in extension_arg_map.iteritems():
                wasm = s.replace('.s', ext)
                expected_file = os.path.join(options.binaryen_test, dot_s_dir,
                                             wasm)
                expected_exists = os.path.exists(expected_file)
                if ext != '.wast' and not expected_exists:
                    continue

                full = os.path.join(options.binaryen_test, dot_s_dir, s)
                stack_alloc = (['--allocate-stack=1024']
                               if dot_s_dir == 'llvm_autogenerated' else [])
                cmd = S2WASM + [full, '--emscripten-glue'
                                ] + stack_alloc + ext_args
                if s.startswith('start_'):
                    cmd.append('--start')
                actual = run_command(cmd)

                # verify output
                if not expected_exists:
                    print actual
                    fail_with_error('output ' + expected_file +
                                    ' does not exist')
                fail_if_not_identical_to_file(actual, expected_file)

                # verify with options
                cmd = S2WASM + [full, '--global-base=1024'] + stack_alloc
                run_command(cmd)

                # run wasm-shell on the .wast to verify that it parses
                cmd = WASM_SHELL + [expected_file]
                run_command(cmd)
示例#7
0
def test_wasm2js_output():
    for wasm in tests + spec_tests + extra_wasm2js_tests:
        if not wasm.endswith('.wast'):
            continue
        basename = os.path.basename(wasm)
        if basename in wasm2js_blacklist:
            continue

        asm = basename.replace('.wast', '.2asm.js')
        expected_file = os.path.join(wasm2js_dir, asm)

        if not os.path.exists(expected_file):
            continue

        print '..', wasm

        cmd = WASM2JS + [os.path.join(options.binaryen_test, wasm)]
        out = run_command(cmd)
        fail_if_not_identical_to_file(out, expected_file)

        if not NODEJS and not MOZJS:
            print 'No JS interpreters. Skipping spec tests.'
            continue

        open('a.2asm.mjs', 'w').write(out)

        cmd += ['--allow-asserts']
        out = run_command(cmd)

        open('a.2asm.asserts.mjs', 'w').write(out)

        # verify asm.js is valid js, note that we're using --experimental-modules
        # to enable ESM syntax and we're also passing a custom loader to handle the
        # `spectest` module in our tests.
        if NODEJS:
            node = [
                NODEJS, '--experimental-modules', '--loader',
                './scripts/test/node-esm-loader.mjs'
            ]
            cmd = node[:]
            cmd.append('a.2asm.mjs')
            out = run_command(cmd)
            fail_if_not_identical(out, '')
            cmd = node[:]
            cmd.append('a.2asm.asserts.mjs')
            out = run_command(
                cmd,
                expected_err='',
                err_ignore='The ESM module loader is experimental')
            fail_if_not_identical(out, '')
示例#8
0
def test_wasm2asm_output():
    for wasm in tests + spec_tests + extra_wasm2asm_tests:
        if not wasm.endswith('.wast'):
            continue

        asm = os.path.basename(wasm).replace('.wast', '.2asm.js')
        expected_file = os.path.join(wasm2asm_dir, asm)

        if not os.path.exists(expected_file):
            continue

        print '..', wasm

        cmd = WASM2ASM + [os.path.join(options.binaryen_test, wasm)]
        out = run_command(cmd)
        fail_if_not_identical_to_file(out, expected_file)

        if not NODEJS and not MOZJS:
            print 'No JS interpreters. Skipping spec tests.'
            continue

        open('a.2asm.js', 'w').write(out)

        cmd += ['--allow-asserts']
        out = run_command(cmd)

        open('a.2asm.asserts.js', 'w').write(out)

        # verify asm.js is valid js
        if NODEJS:
            out = run_command([NODEJS, 'a.2asm.js'])
            fail_if_not_identical(out, '')
            out = run_command([NODEJS, 'a.2asm.asserts.js'], expected_err='')
            fail_if_not_identical(out, '')

        if MOZJS:
            # verify asm.js validates, if this is asm.js code (we emit
            # almost-asm instead when we need to)
            if 'use asm' in open('a.2asm.js').read():
                # check only subset of err because mozjs emits timing info
                out = run_command(
                    [MOZJS, '-w', 'a.2asm.js'],
                    expected_err='Successfully compiled asm.js code',
                    err_contains=True)
                fail_if_not_identical(out, '')
                out = run_command([MOZJS, 'a.2asm.asserts.js'],
                                  expected_err='')
                fail_if_not_identical(out, '')
示例#9
0
def test_asserts_output():
  for wasm in assert_tests:
    print '..', wasm

    asserts = os.path.basename(wasm).replace('.wast.asserts', '.asserts.js')
    traps = os.path.basename(wasm).replace('.wast.asserts', '.traps.js')
    asserts_expected_file = os.path.join(options.binaryen_test, asserts)
    traps_expected_file = os.path.join(options.binaryen_test, traps)

    wasm = os.path.join(wasm2js_dir, wasm)
    cmd = WASM2JS + [wasm, '--allow-asserts']
    out = run_command(cmd)
    fail_if_not_identical_to_file(out, asserts_expected_file)

    cmd += ['--pedantic']
    out = run_command(cmd)
    fail_if_not_identical_to_file(out, traps_expected_file)
示例#10
0
def test_asserts_output():
    for wasm in assert_tests:
        print '..', wasm

        asserts = os.path.basename(wasm).replace('.wast.asserts',
                                                 '.asserts.js')
        traps = os.path.basename(wasm).replace('.wast.asserts', '.traps.js')
        asserts_expected_file = os.path.join(options.binaryen_test, asserts)
        traps_expected_file = os.path.join(options.binaryen_test, traps)

        wasm = os.path.join(wasm2asm_dir, wasm)
        cmd = WASM2ASM + [wasm, '--allow-asserts']
        out = run_command(cmd)
        fail_if_not_identical_to_file(out, asserts_expected_file)

        cmd += ['--pedantic']
        out = run_command(cmd)
        fail_if_not_identical_to_file(out, traps_expected_file)
示例#11
0
def test_wasm_emscripten_finalize():
    print '\n[ checking wasm-emscripten-finalize testcases... ]\n'

    extension_arg_map = {
        '.out': [],
        '.jscall.out': ['--emscripten-reserved-function-pointers=3'],
    }

    for wast_path in files_with_pattern(options.binaryen_test, 'lld',
                                        '*.wast'):
        print '..', wast_path
        for ext, ext_args in extension_arg_map.items():
            expected_file = wast_path + ext
            if ext != '.out' and not os.path.exists(expected_file):
                continue

            cmd = (WASM_EMSCRIPTEN_FINALIZE +
                   [wast_path, '-S', '--global-base=568'] + ext_args)
            actual = run_command(cmd)

            if not os.path.exists(expected_file):
                print actual
                fail_with_error('output ' + expected_file + ' does not exist')
            fail_if_not_identical_to_file(actual, expected_file)
示例#12
0
def test_asm2wasm():
  print '[ checking asm2wasm testcases... ]\n'

  for asm in tests:
    if not asm.endswith('.asm.js'):
      continue
    for precise in [0, 1, 2]:
      for opts in [1, 0]:
        cmd = ASM2WASM + [os.path.join(options.binaryen_test, asm)]
        if 'threads' in asm:
          cmd += ['--enable-threads']
        wasm = asm.replace('.asm.js', '.fromasm')
        if not precise:
          cmd += ['--trap-mode=allow', '--ignore-implicit-traps']
          wasm += '.imprecise'
        elif precise == 2:
          cmd += ['--trap-mode=clamp']
          wasm += '.clamp'
        if not opts:
          wasm += '.no-opts'
          if precise:
            cmd += ['-O0']  # test that -O0 does nothing
        else:
          cmd += ['-O']
        if 'debugInfo' in asm:
          cmd += ['-g']
        if 'noffi' in asm:
          cmd += ['--no-legalize-javascript-ffi']
        if precise and opts:
          # test mem init importing
          open('a.mem', 'wb').write(asm)
          cmd += ['--mem-init=a.mem']
          if asm[0] == 'e':
            cmd += ['--mem-base=1024']
        if '4GB' in asm:
          cmd += ['--mem-max=4294967296']
        if 'i64' in asm or 'wasm-only' in asm or 'noffi' in asm:
          cmd += ['--wasm-only']
        wasm = os.path.join(options.binaryen_test, wasm)
        print '..', asm, wasm

        def do_asm2wasm_test():
          actual = run_command(cmd)

          # verify output
          if not os.path.exists(wasm):
            fail_with_error('output .wast file %s does not exist' % wasm)
          fail_if_not_identical_to_file(actual, wasm)

          binary_format_check(wasm, verify_final_result=False)

        # test both normally and with pass debug (so each inter-pass state
        # is validated)
        old_pass_debug = os.environ.get('BINARYEN_PASS_DEBUG')
        try:
          os.environ['BINARYEN_PASS_DEBUG'] = '1'
          print "With BINARYEN_PASS_DEBUG=1:"
          do_asm2wasm_test()
          del os.environ['BINARYEN_PASS_DEBUG']
          print "With BINARYEN_PASS_DEBUG disabled:"
          do_asm2wasm_test()
        finally:
          if old_pass_debug is not None:
            os.environ['BINARYEN_PASS_DEBUG'] = old_pass_debug
          else:
            if 'BINARYEN_PASS_DEBUG' in os.environ:
              del os.environ['BINARYEN_PASS_DEBUG']

        # verify in wasm
        if options.interpreter:
          # remove imports, spec interpreter doesn't know what to do with them
          subprocess.check_call(WASM_OPT + ['--remove-imports', wasm],
                                stdout=open('ztemp.wast', 'w'),
                                stderr=subprocess.PIPE)
          proc = subprocess.Popen([options.interpreter, 'ztemp.wast'],
                                  stderr=subprocess.PIPE)
          out, err = proc.communicate()
          if proc.returncode != 0:
            try:  # to parse the error
              reported = err.split(':')[1]
              start, end = reported.split('-')
              start_line, start_col = map(int, start.split('.'))
              lines = open('ztemp.wast').read().split('\n')
              print
              print '=' * 80
              print lines[start_line - 1]
              print (' ' * (start_col - 1)) + '^'
              print (' ' * (start_col - 2)) + '/_\\'
              print '=' * 80
              print err
            except Exception:
              # failed to pretty-print
              fail_with_error('wasm interpreter error: ' + err)
            fail_with_error('wasm interpreter error')

        # verify debug info
        if 'debugInfo' in asm:
          jsmap = 'a.wasm.map'
          cmd += ['--source-map', jsmap,
                  '--source-map-url', 'http://example.org/' + jsmap,
                  '-o', 'a.wasm']
          run_command(cmd)
          if not os.path.isfile(jsmap):
            fail_with_error('Debug info map not created: %s' % jsmap)
          with open(jsmap, 'rb') as actual:
            fail_if_not_identical_to_file(actual.read(), wasm + '.map')
          with open('a.wasm', 'rb') as binary:
            url_section_name = bytearray([16]) + bytearray('sourceMappingURL')
            url = 'http://example.org/' + jsmap
            assert len(url) < 256, 'name too long'
            url_section_contents = bytearray([len(url)]) + bytearray(url)
            print url_section_name
            binary_contents = bytearray(binary.read())
            if url_section_name not in binary_contents:
              fail_with_error('source map url section not found in binary')
            url_section_index = binary_contents.index(url_section_name)
            if url_section_contents not in binary_contents[url_section_index:]:
              fail_with_error('source map url not found in url section')
示例#13
0
def test_asm2wasm():
  print '[ checking asm2wasm testcases... ]\n'

  for asm in tests:
    if not asm.endswith('.asm.js'):
      continue
    for precise in [0, 1, 2]:
      for opts in [1, 0]:
        cmd = ASM2WASM + [os.path.join(options.binaryen_test, asm)]
        if 'threads' in asm:
          cmd += ['--enable-threads']
        wasm = asm.replace('.asm.js', '.fromasm')
        if not precise:
          cmd += ['--trap-mode=allow', '--ignore-implicit-traps']
          wasm += '.imprecise'
        elif precise == 2:
          cmd += ['--trap-mode=clamp']
          wasm += '.clamp'
        if not opts:
          wasm += '.no-opts'
          if precise:
            cmd += ['-O0']  # test that -O0 does nothing
        else:
          cmd += ['-O']
        if 'debugInfo' in asm:
          cmd += ['-g']
        if 'noffi' in asm:
          cmd += ['--no-legalize-javascript-ffi']
        if precise and opts:
          # test mem init importing
          open('a.mem', 'wb').write(asm)
          cmd += ['--mem-init=a.mem']
          if asm[0] == 'e':
            cmd += ['--mem-base=1024']
        if 'i64' in asm or 'wasm-only' in asm or 'noffi' in asm:
          cmd += ['--wasm-only']
        wasm = os.path.join(options.binaryen_test, wasm)
        print '..', asm, wasm

        def do_asm2wasm_test():
          actual = run_command(cmd)

          # verify output
          if not os.path.exists(wasm):
            fail_with_error('output .wast file %s does not exist' % wasm)
          fail_if_not_identical_to_file(actual, wasm)

          binary_format_check(wasm, verify_final_result=False)

        # test both normally and with pass debug (so each inter-pass state
        # is validated)
        old_pass_debug = os.environ.get('BINARYEN_PASS_DEBUG')
        try:
          os.environ['BINARYEN_PASS_DEBUG'] = '1'
          print "With BINARYEN_PASS_DEBUG=1:"
          do_asm2wasm_test()
          del os.environ['BINARYEN_PASS_DEBUG']
          print "With BINARYEN_PASS_DEBUG disabled:"
          do_asm2wasm_test()
        finally:
          if old_pass_debug is not None:
            os.environ['BINARYEN_PASS_DEBUG'] = old_pass_debug
          else:
            if 'BINARYEN_PASS_DEBUG' in os.environ:
              del os.environ['BINARYEN_PASS_DEBUG']

        # verify in wasm
        if options.interpreter:
          # remove imports, spec interpreter doesn't know what to do with them
          subprocess.check_call(WASM_OPT + ['--remove-imports', wasm],
                                stdout=open('ztemp.wast', 'w'),
                                stderr=subprocess.PIPE)
          proc = subprocess.Popen([options.interpreter, 'ztemp.wast'],
                                  stderr=subprocess.PIPE)
          out, err = proc.communicate()
          if proc.returncode != 0:
            try:  # to parse the error
              reported = err.split(':')[1]
              start, end = reported.split('-')
              start_line, start_col = map(int, start.split('.'))
              lines = open('ztemp.wast').read().split('\n')
              print
              print '=' * 80
              print lines[start_line - 1]
              print (' ' * (start_col - 1)) + '^'
              print (' ' * (start_col - 2)) + '/_\\'
              print '=' * 80
              print err
            except Exception:
              # failed to pretty-print
              fail_with_error('wasm interpreter error: ' + err)
            fail_with_error('wasm interpreter error')

        # verify debug info
        if 'debugInfo' in asm:
          jsmap = 'a.wasm.map'
          cmd += ['--source-map', jsmap,
                  '--source-map-url', 'http://example.org/' + jsmap,
                  '-o', 'a.wasm']
          run_command(cmd)
          if not os.path.isfile(jsmap):
            fail_with_error('Debug info map not created: %s' % jsmap)
          with open(jsmap, 'rb') as actual:
            fail_if_not_identical_to_file(actual.read(), wasm + '.map')
          with open('a.wasm', 'rb') as binary:
            url_section_name = bytearray([16]) + bytearray('sourceMappingURL')
            url = 'http://example.org/' + jsmap
            assert len(url) < 256, 'name too long'
            url_section_contents = bytearray([len(url)]) + bytearray(url)
            print url_section_name
            binary_contents = bytearray(binary.read())
            if url_section_name not in binary_contents:
              fail_with_error('source map url section not found in binary')
            url_section_index = binary_contents.index(url_section_name)
            if url_section_contents not in binary_contents[url_section_index:]:
              fail_with_error('source map url not found in url section')
示例#14
0
文件: wasm2js.py 项目: timjb/asterius
def test_wasm2js_output():
    for opt in (0, 1):
        for wasm in tests + spec_tests + extra_wasm2js_tests:
            if not wasm.endswith('.wast'):
                continue
            basename = os.path.basename(wasm)
            if basename in wasm2js_blacklist:
                continue

            asm = basename.replace('.wast', '.2asm.js')
            expected_file = os.path.join(wasm2js_dir, asm)
            if opt:
                expected_file += '.opt'

            if not os.path.exists(expected_file):
                continue

            print '..', wasm

            t = os.path.join(options.binaryen_test, wasm)

            all_out = []

            for module, asserts in split_wast(t):
                with open('split.wast', 'w') as o:
                    o.write(module + '\n'.join(asserts))

                cmd = WASM2JS + ['split.wast']
                if opt:
                    cmd += ['-O']
                if 'emscripten' in wasm:
                    cmd += ['--emscripten']
                out = run_command(cmd)
                all_out.append(out)

                if not NODEJS and not MOZJS:
                    print 'No JS interpreters. Skipping spec tests.'
                    continue

                open('a.2asm.mjs', 'w').write(out)

                cmd += ['--allow-asserts']
                out = run_command(cmd)
                # also verify it passes pass-debug verifications
                with_pass_debug(lambda: run_command(cmd))

                open('a.2asm.asserts.mjs', 'w').write(out)

                # verify asm.js is valid js, note that we're using --experimental-modules
                # to enable ESM syntax and we're also passing a custom loader to handle the
                # `spectest` and `env` modules in our tests.
                if NODEJS:
                    node = [
                        NODEJS, '--experimental-modules', '--loader',
                        './scripts/test/node-esm-loader.mjs'
                    ]
                    cmd = node[:]
                    cmd.append('a.2asm.mjs')
                    out = run_command(cmd)
                    fail_if_not_identical(out, '')
                    cmd = node[:]
                    cmd.append('a.2asm.asserts.mjs')
                    out = run_command(
                        cmd,
                        expected_err='',
                        err_ignore='The ESM module loader is experimental')
                    fail_if_not_identical(out, '')

            fail_if_not_identical_to_file(''.join(all_out), expected_file)