| # Copyright 2018 the V8 project authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import random |
| |
| # List of configuration experiments for correctness fuzzing. |
| # List of <probability>, <1st config name>, <2nd config name>, <2nd d8>. |
| # Probabilities must add up to 100. |
| FOOZZIE_EXPERIMENTS = [ |
| [10, 'ignition', 'jitless', 'd8'], |
| [10, 'ignition', 'slow_path', 'd8'], |
| [5, 'ignition', 'slow_path_opt', 'd8'], |
| [26, 'ignition', 'ignition_turbo', 'd8'], |
| [2, 'ignition_no_ic', 'ignition_turbo', 'd8'], |
| [2, 'ignition', 'ignition_turbo_no_ic', 'd8'], |
| [18, 'ignition', 'ignition_turbo_opt', 'd8'], |
| [2, 'ignition_no_ic', 'ignition_turbo_opt', 'd8'], |
| [5, 'ignition_turbo_opt', 'ignition_turbo_opt', 'clang_x86/d8'], |
| [5, 'ignition_turbo', 'ignition_turbo', 'clang_x86/d8'], |
| [5, 'ignition', 'ignition', 'clang_x86/d8'], |
| [5, 'ignition', 'ignition', 'clang_x64_v8_arm64/d8'], |
| [5, 'ignition', 'ignition', 'clang_x86_v8_arm/d8'], |
| ] |
| |
| # Additional flag experiments. List of tuples like |
| # (<likelihood to use flags in [0,1)>, <flag>). |
| ADDITIONAL_FLAGS = [ |
| (0.1, '--stress-marking=100'), |
| (0.1, '--stress-scavenge=100'), |
| (0.1, '--stress-compaction-random'), |
| (0.1, '--random-gc-interval=2000'), |
| (0.2, '--noanalyze-environment-liveness'), |
| (0.1, '--stress-delay-tasks'), |
| (0.01, '--thread-pool-size=1'), |
| (0.01, '--thread-pool-size=2'), |
| (0.01, '--thread-pool-size=4'), |
| (0.01, '--thread-pool-size=8'), |
| (0.1, '--interrupt-budget=1000'), |
| ] |
| |
| class Config(object): |
| def __init__(self, name, rng=None, random_seed=None): |
| """ |
| Args: |
| name: Name of the used fuzzer. |
| rng: Random number generator for generating experiments. |
| random_seed: Random-seed used for d8 throughout one fuzz session. |
| TODO(machenbach): Remove random_seed after a grace period of a couple of |
| days. We only have it to keep bisection stable. Afterwards we can just |
| use rng. |
| """ |
| self.name = name |
| self.rng = rng or random.Random() |
| self.random_seed = random_seed |
| |
| def choose_foozzie_flags(self): |
| """Randomly chooses a configuration from FOOZZIE_EXPERIMENTS. |
| |
| Returns: List of flags to pass to v8_foozzie.py fuzz harness. |
| """ |
| # TODO(machenbach): Temporarily use same RNG state for all test cases in one |
| # fuzz session. See also TODO above. |
| if self.random_seed is not None: |
| flags_rng = random.Random(self.random_seed) |
| else: |
| flags_rng = random.Random() |
| |
| # Add additional flags to second config based on experiment percentages. |
| extra_flags = [] |
| for p, flag in ADDITIONAL_FLAGS: |
| if flags_rng.random() < p: |
| extra_flags.append('--second-config-extra-flags=%s' % flag) |
| |
| # Calculate flags determining the experiment. |
| acc = 0 |
| threshold = self.rng.random() * 100 |
| for prob, first_config, second_config, second_d8 in FOOZZIE_EXPERIMENTS: |
| acc += prob |
| if acc > threshold: |
| return [ |
| '--first-config=' + first_config, |
| '--second-config=' + second_config, |
| '--second-d8=' + second_d8, |
| ] + extra_flags |
| assert False |