Files
sdk/pkg/vm/lib/metadata/bytecode.dart
T
Alexander Markov 8a09d7ab5a [vm/bytecode] Remove alignment of sections in bytecode
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>
2019-10-31 21:37:44 +00:00

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);
}
}