diff options
Diffstat (limited to 'scripts/fuzz_passes_wast.py')
-rwxr-xr-x | scripts/fuzz_passes_wast.py | 148 |
1 files changed, 74 insertions, 74 deletions
diff --git a/scripts/fuzz_passes_wast.py b/scripts/fuzz_passes_wast.py index 18506c377..0ef452c7d 100755 --- a/scripts/fuzz_passes_wast.py +++ b/scripts/fuzz_passes_wast.py @@ -54,86 +54,86 @@ args = sys.argv[2:] def run(): - try: - cmd = ['bin/wasm-opt', wast] - print('run', cmd) - subprocess.check_call(cmd, stderr=open('/dev/null')) - except Exception as e: - return ">>> !!! ", e, " !!!" - return 'ok' + try: + cmd = ['bin/wasm-opt', wast] + print('run', cmd) + subprocess.check_call(cmd, stderr=open('/dev/null')) + except Exception as e: + return ">>> !!! ", e, " !!!" + return 'ok' original_wast = None try: - # get normal output - - normal = run() - print('>>> normal output:\n', normal) - assert normal, 'must be output' - - # ensure we actually use the wast - - original_wast = wast + '.original.wast' - shutil.move(wast, original_wast) - - def apply_passes(passes): - wasm_opt = os.path.join('bin', 'wasm-opt') - subprocess.check_call([wasm_opt, original_wast] + passes + ['-o', wast], - stderr=open('/dev/null')) + # get normal output + + normal = run() + print('>>> normal output:\n', normal) + assert normal, 'must be output' + + # ensure we actually use the wast + + original_wast = wast + '.original.wast' + shutil.move(wast, original_wast) + + def apply_passes(passes): + wasm_opt = os.path.join('bin', 'wasm-opt') + subprocess.check_call([wasm_opt, original_wast] + passes + ['-o', wast], + stderr=open('/dev/null')) + + # loop, looking for failures + + def simplify(passes): + # passes is known to fail, try to simplify down by removing + more = True + while more: + more = False + print('>>> trying to reduce:', ' '.join(passes), ' [' + str(len(passes)) + ']') + for i in range(len(passes)): + smaller = passes[:i] + passes[i + 1:] + print('>>>>>> try to reduce to:', ' '.join(smaller), ' [' + str(len(smaller)) + ']') + try: + apply_passes(smaller) + assert run() == normal + except Exception: + # this failed too, so it's a good reduction + passes = smaller + print('>>> reduction successful') + more = True + break + print('>>> reduced to:', ' '.join(passes)) + + tested = set() + + def pick_passes(): + # return '--waka'.split(' ') + ret = [] + while 1: + str_ret = str(ret) + if random.random() < 0.5 and str_ret not in tested: + tested.add(str_ret) + return ret + ret.append('--' + random.choice(PASSES)) + + counter = 0 - # loop, looking for failures - - def simplify(passes): - # passes is known to fail, try to simplify down by removing - more = True - while more: - more = False - print('>>> trying to reduce:', ' '.join(passes), ' [' + str(len(passes)) + ']') - for i in range(len(passes)): - smaller = passes[:i] + passes[i + 1:] - print('>>>>>> try to reduce to:', ' '.join(smaller), ' [' + str(len(smaller)) + ']') - try: - apply_passes(smaller) - assert run() == normal - except Exception: - # this failed too, so it's a good reduction - passes = smaller - print('>>> reduction successful') - more = True - break - print('>>> reduced to:', ' '.join(passes)) - - tested = set() - - def pick_passes(): - # return '--waka'.split(' ') - ret = [] while 1: - str_ret = str(ret) - if random.random() < 0.5 and str_ret not in tested: - tested.add(str_ret) - return ret - ret.append('--' + random.choice(PASSES)) - - counter = 0 - - while 1: - passes = pick_passes() - print('>>> [' + str(counter) + '] testing:', ' '.join(passes)) - counter += 1 - try: - apply_passes(passes) - except Exception as e: - print(e) - simplify(passes) - break - seen = run() - if seen != normal: - print('>>> bad output:\n', seen) - simplify(passes) - break + passes = pick_passes() + print('>>> [' + str(counter) + '] testing:', ' '.join(passes)) + counter += 1 + try: + apply_passes(passes) + except Exception as e: + print(e) + simplify(passes) + break + seen = run() + if seen != normal: + print('>>> bad output:\n', seen) + simplify(passes) + break finally: - if original_wast: - shutil.move(original_wast, wast) + if original_wast: + shutil.move(original_wast, wast) |