[dart/fuzzer] Add kbc execution mode

Rationale:
This enables testing of bytecode interpretation,
compilation, or mixed mode.


Change-Id: Ie4322c62f1f6a1abe4896ec98c4edf40d25b7135
Reviewed-on: https://dart-review.googlesource.com/c/78186
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Aart Bik <ajcbik@google.com>
This commit is contained in:
Aart Bik 2018-10-05 05:39:09 +00:00 committed by commit-bot@chromium.org
parent 7e77c29989
commit d31db6581c
2 changed files with 64 additions and 8 deletions

View file

@ -48,13 +48,16 @@ where
--dart-top : sets DART_TOP explicitly through command line
--mode1 : m1
--mode2 : m2, and values one of
jit-[debug-]ia32 = Dart JIT (ia32)
jit-[debug-]x64 = Dart JIT (x64)
jit-[debug-]arm32 = Dart JIT (simarm)
jit-[debug-]arm64 = Dart JIT (simarm64)
aot-[debug-]x64 = Dart AOT (x64)
aot-[debug-]arm64 = Dart AOT (simarm64)
js = dart2js + JS
jit-[debug-]ia32 = Dart JIT (ia32)
jit-[debug-]x64 = Dart JIT (x64)
jit-[debug-]arm32 = Dart JIT (simarm)
jit-[debug-]arm64 = Dart JIT (simarm64)
aot-[debug-]x64 = Dart AOT (x64)
aot-[debug-]arm64 = Dart AOT (simarm64)
kbc-int-[debug-]x64 = Dart KBC (interpreted bytecode)
kbc-mix-[debug-]x64 = Dart KBC (mixed-mode bytecode)
kbc-cmp-[debug-]x64 = Dart KBC (compiled bytecode)
js = dart2js + JS
If no modes are given, a random JIT and/or AOT combination is used.

View file

@ -55,6 +55,8 @@ abstract class TestRunner {
return new TestRunnerJIT(getTag(mode), top, tmp, env);
if (mode.startsWith('aot'))
return new TestRunnerAOT(getTag(mode), top, tmp, env);
if (mode.startsWith('kbc'))
return new TestRunnerKBC(mode, getTag(mode), top, tmp, env);
if (mode.startsWith('js')) return new TestRunnerJS(top, tmp, env);
throw ('unknown runner in mode: $mode');
}
@ -120,6 +122,51 @@ class TestRunnerAOT implements TestRunner {
Map<String, String> env;
}
/// Concrete test runner of bytecode.
class TestRunnerKBC implements TestRunner {
TestRunnerKBC(
String mode, String tag, String top, String tmp, Map<String, String> e) {
generate = '$top/pkg/vm/tool/gen_kernel';
platform = '--platform=$top/out/$tag/vm_platform_strong.dill';
dill = '$tmp/out.dill';
dart = '$top/out/$tag/dart';
fileName = '$tmp/fuzz.dart';
env = e;
cmd = [dart];
if (mode.startsWith('kbc-int')) {
description = 'KBC-INT-${tag}';
cmd += ['--enable-interpreter', '--compilation-counter-threshold=-1'];
} else if (mode.startsWith('kbc-mix')) {
description = 'KBC-MIX-${tag}';
cmd += ['--enable-interpreter'];
} else if (mode.startsWith('kbc-cmp')) {
description = 'KBC-CMP-${tag}';
cmd += ['--use-bytecode-compiler'];
} else {
throw ('unknown KBC mode: $mode');
}
cmd += [dill];
}
TestResult run() {
TestResult result = runCommand(
[generate, '--gen-bytecode', platform, '-o', dill, fileName], env);
if (result.code != ResultCode.success) {
return result;
}
return runCommand(cmd, env);
}
String description;
String generate;
String platform;
String dill;
String dart;
String fileName;
List<String> cmd;
Map<String, String> env;
}
/// Concrete test runner of Dart2JS.
class TestRunnerJS implements TestRunner {
TestRunnerJS(String top, String tmp, Map<String, String> e) {
@ -349,7 +396,7 @@ class DartFuzzTestSession {
// Random when not set.
if (mode == null || mode == '') {
// Pick a mode at random (cluster), different from other.
const cluster_modes = 10;
const cluster_modes = 16;
Random rand = new Random();
do {
mode = modes[rand.nextInt(cluster_modes)];
@ -387,6 +434,12 @@ class DartFuzzTestSession {
'jit-arm64',
'aot-debug-x64',
'aot-x64',
'kbc-int-debug-x64',
'kbc-cmp-debug-x64',
'kbc-mix-debug-x64',
'kbc-int-x64',
'kbc-cmp-x64',
'kbc-mix-x64',
// Times out often:
'aot-arm64',
'aot-debug-arm64',