ac7ca17652
To enable bytecode generation, toggle kEnableKernelBytecode flag at the beginning of pkg/vm/lib/bytecode/gen_bytecode.dart. This will also enable generation of bytecode in platform dill files. Also, bytecode generation can be enabled using --gen-bytecode option of pkg/vm/tool/gen_kernel. In kernel binaries, the generated bytecode and constant pool are placed into 'vm.bytecode' metadata attached to members. pkg/vm/tool/dump_kernel tool can be used to disassemble bytecode and print constant pool. Differences between generated bytecode and original DBC are described in pkg/vm/lib/bytecode/dbc.dart. Format of constant pool is described in pkg/vm/lib/bytecode/constant_pool.dart. Currently, only a small subset of Dart language is supported. Bytecode generator will not emit vm.bytecode metadata for a member if its body has an unsupported operation. Change-Id: I27d9a361dc779ea115e5676508ee757c1754e05d Reviewed-on: https://dart-review.googlesource.com/49600 Reviewed-by: Samir Jindel <sjindel@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Régis Crelier <regis@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
49 lines
1.8 KiB
Dart
49 lines
1.8 KiB
Dart
// 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 'package:kernel/kernel.dart' show Component, writeComponentToText;
|
|
import 'package:kernel/binary/ast_from_binary.dart'
|
|
show BinaryBuilderWithMetadata;
|
|
|
|
import 'package:vm/metadata/bytecode.dart' show BytecodeMetadataRepository;
|
|
import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
|
|
import 'package:vm/metadata/inferred_type.dart'
|
|
show InferredTypeMetadataRepository;
|
|
import 'package:vm/metadata/procedure_attributes.dart'
|
|
show ProcedureAttributesMetadataRepository;
|
|
import 'package:vm/metadata/unreachable.dart'
|
|
show UnreachableNodeMetadataRepository;
|
|
|
|
final String _usage = '''
|
|
Usage: dump_kernel input.dill output.txt
|
|
Dumps kernel binary file with VM-specific metadata.
|
|
''';
|
|
|
|
main(List<String> arguments) async {
|
|
if (arguments.length != 2) {
|
|
print(_usage);
|
|
exit(1);
|
|
}
|
|
|
|
final input = arguments[0];
|
|
final output = arguments[1];
|
|
|
|
final component = new Component();
|
|
|
|
// Register VM-specific metadata.
|
|
component.addMetadataRepository(new DirectCallMetadataRepository());
|
|
component.addMetadataRepository(new InferredTypeMetadataRepository());
|
|
component.addMetadataRepository(new ProcedureAttributesMetadataRepository());
|
|
component.addMetadataRepository(new UnreachableNodeMetadataRepository());
|
|
component.addMetadataRepository(new BytecodeMetadataRepository());
|
|
|
|
final List<int> bytes = new File(input).readAsBytesSync();
|
|
new BinaryBuilderWithMetadata(bytes).readComponent(component);
|
|
|
|
writeComponentToText(component,
|
|
path: output, showExternal: true, showMetadata: true);
|
|
}
|