// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:io' as io; import 'package:args/args.dart' show ArgParser, ArgResults; import 'package:vm/bytecode/ngrams.dart'; final ArgParser _argParser = new ArgParser(allowTrailingOptions: true) ..addFlag('basic-blocks', help: 'Only allow control flow as the last instruction in a window', defaultsTo: true) ..addOption('output', abbr: 'o', help: 'Path to output file', defaultsTo: null) ..addFlag('merge-pushes', help: 'Do not distinguish among different kinds of Push opcodes', defaultsTo: false) ..addFlag('sort', abbr: 's', help: 'Sort the output by ngram frequency', defaultsTo: true) ..addOption('threshold', abbr: 't', help: 'Minimum ngram count threshold', defaultsTo: "1") ..addOption('window', abbr: 'w', help: 'Window size', defaultsTo: "3"); final String _usage = ''' Usage: dump_bytecode_ngrams [options] input.trace Dumps stats about a dynamic bytecode instruction trace produced with the Dart VM option --interpreter-trace-file, e.g.: \$ dart --enable-interpreter --interpreter-trace-file=trace program.dart Options: ${_argParser.usage} '''; const int _badUsageExitCode = 1; int main(List arguments) { final ArgResults options = _argParser.parse(arguments); if ((options.rest.length != 1) || (options['output'] == null)) { print(_usage); return _badUsageExitCode; } final basicBlocks = options['basic-blocks']; final input = options.rest.single; final output = options['output']; final mergePushes = options['merge-pushes']; final windowSize = int.parse(options['window']); final sort = options['sort']; final threshold = int.parse(options['threshold']); if (!(new io.File(input).existsSync())) { print("The file '$input' does not exist"); print(_usage); return _badUsageExitCode; } NGramReader nGramReader = new NGramReader(input); nGramReader.readAllNGrams(windowSize, basicBlocks: basicBlocks, mergePushes: mergePushes); nGramReader.writeNGramStats(output, sort: sort, minCount: threshold); return 0; }