8a09d7ab5a
Previously, before switching to compact encoding of bytecode instructions, we had to align bytecode instructions by 4. Since that time sections of bytecode binary were aligned. However, this alignment doesn't work well in AOT mode if dill file contains both bytecode and AST, as other metadata (such as obfuscation prohibitions) may precede bytecode metadata and may make the whole bytecode binary misaligned. This results in incorrect calculation of section offsets, failed assertion assert(writer.offset - start == section.offset); and VM may fail to load bytecode binary with error bytecode_reader.cc: 1368: error: unreachable code In order to fix these problems, extra alignment of bytecode sections is removed. Change-Id: Iaa3b7c46999615aaa446781a7018db409261ead8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/123686 Reviewed-by: Régis Crelier <regis@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
70 lines
2.1 KiB
Dart
70 lines
2.1 KiB
Dart
// 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.
|
|
|
|
library vm.metadata.bytecode;
|
|
|
|
import 'package:kernel/ast.dart'
|
|
show BinarySink, BinarySource, MetadataRepository, Node, TreeNode;
|
|
import '../bytecode/bytecode_serialization.dart'
|
|
show BufferedWriter, BufferedReader, LinkWriter, LinkReader;
|
|
import '../bytecode/declarations.dart' show Component;
|
|
|
|
import 'dart:developer';
|
|
|
|
class BytecodeMetadata {
|
|
final Component component;
|
|
|
|
BytecodeMetadata(this.component);
|
|
|
|
void write(BufferedWriter writer) {
|
|
Timeline.timeSync("BytecodeMetadata.write", () {
|
|
component.write(writer);
|
|
});
|
|
}
|
|
|
|
factory BytecodeMetadata.read(BufferedReader reader) {
|
|
return Timeline.timeSync("BytecodeMetadata.read", () {
|
|
return new BytecodeMetadata(new Component.read(reader));
|
|
});
|
|
}
|
|
|
|
@override
|
|
String toString() => "\n"
|
|
"BytecodeMetadata {\n"
|
|
"$component\n"
|
|
"}\n";
|
|
}
|
|
|
|
/// Repository for [BytecodeMetadata].
|
|
class BytecodeMetadataRepository extends MetadataRepository<BytecodeMetadata> {
|
|
@override
|
|
final String tag = 'vm.bytecode';
|
|
|
|
@override
|
|
final Map<TreeNode, BytecodeMetadata> mapping =
|
|
<TreeNode, BytecodeMetadata>{};
|
|
|
|
@override
|
|
void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
|
|
final bytecodeComponent = metadata.component;
|
|
final linkWriter = new LinkWriter();
|
|
final writer = new BufferedWriter(
|
|
bytecodeComponent.version,
|
|
bytecodeComponent.stringTable,
|
|
bytecodeComponent.objectTable,
|
|
linkWriter);
|
|
metadata.write(writer);
|
|
writer.writeContentsToBinarySink(sink);
|
|
}
|
|
|
|
@override
|
|
BytecodeMetadata readFromBinary(Node node, BinarySource source) {
|
|
final linkReader = new LinkReader();
|
|
final reader = new BufferedReader(-1, null, null, linkReader, source.bytes,
|
|
baseOffset: source.currentOffset);
|
|
final bytecodeComponent = new Component.read(reader);
|
|
return new BytecodeMetadata(bytecodeComponent);
|
|
}
|
|
}
|