| Index: pkg/front_end/tool/perf.dart | 
| diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart | 
| index d56012e6529e8f68b4f3e72664c5adac4280b900..d900b9708b99e454fd10272b0c9131950fb7c54b 100644 | 
| --- a/pkg/front_end/tool/perf.dart | 
| +++ b/pkg/front_end/tool/perf.dart | 
| @@ -6,7 +6,7 @@ | 
| library front_end.tool.perf; | 
|  | 
| import 'dart:async'; | 
| -import 'dart:io' show exit; | 
| +import 'dart:io' show exit, stderr; | 
|  | 
| import 'package:analyzer/dart/ast/ast.dart'; | 
| import 'package:analyzer/dart/ast/token.dart'; | 
| @@ -22,6 +22,8 @@ import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk; | 
| import 'package:analyzer/src/generated/parser.dart'; | 
| import 'package:analyzer/src/generated/source.dart'; | 
| import 'package:analyzer/src/generated/source_io.dart'; | 
| +import 'package:kernel/analyzer/loader.dart'; | 
| +import 'package:kernel/kernel.dart'; | 
| import 'package:package_config/discovery.dart'; | 
|  | 
| /// Cumulative total number of chars scanned. | 
| @@ -46,19 +48,36 @@ main(List<String> args) async { | 
|  | 
| await setup(entryUri); | 
|  | 
| -  if (bench == 'scan') { | 
| -    Set<Source> files = scanReachableFiles(entryUri); | 
| -    // TODO(sigmund): consider replacing the warmup with instrumented snapshots. | 
| -    for (int i = 0; i < 10; i++) scanFiles(files); | 
| -  } else if (bench == 'parse') { | 
| -    Set<Source> files = scanReachableFiles(entryUri); | 
| -    // TODO(sigmund): consider replacing the warmup with instrumented snapshots. | 
| -    for (int i = 0; i < 10; i++) parseFiles(files); | 
| -  } else { | 
| -    print('unsupported bench-id: $bench. Please specify "scan" or "parse"'); | 
| +  var handlers = { | 
| +    'scan': () async { | 
| +      Set<SourceFile> files = scanReachableFiles(entryUri); | 
| +      // TODO(sigmund): replace the warmup with instrumented snapshots. | 
| +      for (int i = 0; i < 10; i++) scanFiles(files); | 
| +    }, | 
| +    'parse': () async { | 
| +      Set<SourceFile> files = scanReachableFiles(entryUri); | 
| +      // TODO(sigmund): replace the warmup with instrumented snapshots. | 
| +      for (int i = 0; i < 10; i++) parseFiles(files); | 
| +    }, | 
| +    'kernel_gen_e2e': () async { | 
| +      // TODO(sigmund): remove. This is used to compute the input size, we | 
| +      // should extract input size from frontend instead. | 
| +      scanReachableFiles(entryUri); | 
| +      // TODO(sigmund): replace this warmup. Note that for very large programs, | 
| +      // the GC pressure on the VM seems to make this worse with time (maybe we | 
| +      // are leaking memory?). That's why we run it twice and not 10 times. | 
| +      for (int i = 0; i < 2; i++) await generateKernel(entryUri); | 
| +    }, | 
| +  }; | 
| + | 
| +  var handler = handlers[bench]; | 
| +  if (handler == null) { | 
| // TODO(sigmund): implement the remaining benchmarks. | 
| +    print('unsupported bench-id: $bench. Please specify one of the following: ' | 
| +        '${handler.keys.join(", ")}'); | 
| exit(1); | 
| } | 
| +  await handler(); | 
|  | 
| totalTimer.stop(); | 
| report("total", totalTimer.elapsedMicroseconds); | 
| @@ -201,3 +220,26 @@ void report(String name, int time) { | 
| sb.write(', ${scanTotalChars * 1000 ~/ time} chars/ms'); | 
| print('$sb'); | 
| } | 
| + | 
| +// TODO(sigmund): replace this once kernel is produced by the frontend directly. | 
| +Future<Program> generateKernel(Uri entryUri) async { | 
| +  var dartkTimer = new Stopwatch()..start(); | 
| +  var options = new DartOptions(strongMode: false, sdk: 'sdk'); | 
| +  var packages = | 
| +      await createPackages(options.packagePath, discoveryPath: entryUri.path); | 
| +  var repository = new Repository(); | 
| +  DartLoader loader = new DartLoader(repository, options, packages); | 
| + | 
| +  Program program = loader.loadProgram(entryUri.path); | 
| +  List errors = loader.errors; | 
| +  if (errors.isNotEmpty) { | 
| +    const int errorLimit = 100; | 
| +    stderr.writeln(errors.take(errorLimit).join('\n')); | 
| +    if (errors.length > errorLimit) { | 
| +      stderr.writeln('[error] ${errors.length - errorLimit} errors not shown'); | 
| +    } | 
| +  } | 
| +  dartkTimer.stop(); | 
| +  report("kernel_gen_e2e", dartkTimer.elapsedMicroseconds); | 
| +  return program; | 
| +} | 
|  |