blob: 9abb543000b69410add89001ac2f6826d764ec2a [file] [log] [blame] [edit]
// Copyright (c) 2017, 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';
import 'dart:typed_data';
import 'package:args/args.dart';
import 'package:kernel/binary/ast_from_binary.dart'
show BinaryBuilderWithMetadata;
import 'package:kernel/kernel.dart' show Component, writeComponentToText;
import 'package:vm/metadata/closure_id.dart' show ClosureIdMetadataRepository;
import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
import 'package:vm/metadata/inferred_type.dart'
show InferredTypeMetadataRepository, InferredArgTypeMetadataRepository;
import 'package:vm/metadata/loading_units.dart'
show LoadingUnitsMetadataRepository;
import 'package:vm/metadata/procedure_attributes.dart'
show ProcedureAttributesMetadataRepository;
import 'package:vm/metadata/table_selector.dart'
show TableSelectorMetadataRepository;
import 'package:vm/metadata/unboxing_info.dart'
show UnboxingInfoMetadataRepository;
import 'package:vm/metadata/unreachable.dart'
show UnreachableNodeMetadataRepository;
import 'package:vm/modular/metadata/call_site_attributes.dart'
show CallSiteAttributesMetadataRepository;
final ArgParser _argParser =
ArgParser()..addFlag('show-offsets', help: 'Print file offsets');
final String _usage = '''
Usage: dump_kernel [options] input.dill output.txt
Dumps kernel binary file with VM-specific metadata.
Options:
${_argParser.usage}
''';
void main(List<String> arguments) async {
final argResults = _argParser.parse(arguments);
if (argResults.rest.length != 2) {
print(_usage);
exit(1);
}
final input = argResults.rest[0];
final output = argResults.rest[1];
final component = new Component();
// Register VM-specific metadata.
component.addMetadataRepository(new DirectCallMetadataRepository());
component.addMetadataRepository(new InferredTypeMetadataRepository());
component.addMetadataRepository(new InferredArgTypeMetadataRepository());
component.addMetadataRepository(new ProcedureAttributesMetadataRepository());
component.addMetadataRepository(new TableSelectorMetadataRepository());
component.addMetadataRepository(new UnboxingInfoMetadataRepository());
component.addMetadataRepository(new UnreachableNodeMetadataRepository());
component.addMetadataRepository(new CallSiteAttributesMetadataRepository());
component.addMetadataRepository(new LoadingUnitsMetadataRepository());
component.addMetadataRepository(new ClosureIdMetadataRepository());
final Uint8List bytes = new File(input).readAsBytesSync();
new BinaryBuilderWithMetadata(bytes).readComponent(component);
writeComponentToText(
component,
path: output,
showMetadata: true,
showOffsets: argResults['show-offsets'],
);
}