[dart2bytecode, vm] Adjust bytecode file format

* Switch UInt32 from big-endian to little-endian encoding.
* Reorder object kinds, constant tags, type tags and constant pool tags.
* Reorder field and function flags.
* Cleanup yield point marker from source positions.

TEST=ci

Change-Id: I05ee940b6393a478831af11ac93fee9ec1441c4e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/384040
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov
2024-09-10 13:37:29 +00:00
committed by Commit Queue
parent 0e58775986
commit fcdcdeddad
10 changed files with 121 additions and 150 deletions
-6
View File
@@ -105,12 +105,6 @@ class BytecodeAssembler {
}
}
void emitYieldPointSourcePosition(int yieldSourcePosition) {
if (!isUnreachable) {
sourcePositions.addYieldPoint(offset, yieldSourcePosition);
}
}
void _grow() {
final newSize = _buffer.length << 1;
final newBuffer = new Uint8List(newSize);
@@ -525,7 +525,7 @@ class BytecodeGenerator extends RecursiveVisitor {
flags |= FieldDeclaration.isCovariantFlag;
}
if (field.isCovariantByClass) {
flags |= FieldDeclaration.isGenericCovariantImplFlag;
flags |= FieldDeclaration.isCovariantByClassFlag;
}
if (field.isExtensionMember) {
flags |= FieldDeclaration.isExtensionMemberFlag;
@@ -584,9 +584,6 @@ class BytecodeGenerator extends RecursiveVisitor {
if (member.isStatic) {
flags |= FunctionDeclaration.isStaticFlag;
}
if (member.isForwardingStub) {
flags |= FunctionDeclaration.isForwardingStubFlag;
}
if (member.isNoSuchMethodForwarder) {
flags |= FunctionDeclaration.isNoSuchMethodForwarderFlag;
}
@@ -765,7 +762,7 @@ class BytecodeGenerator extends RecursiveVisitor {
flags |= ParameterDeclaration.isCovariantFlag;
}
if (variable.isCovariantByClass) {
flags |= ParameterDeclaration.isGenericCovariantImplFlag;
flags |= ParameterDeclaration.isCovariantByClassFlag;
}
if (variable.isFinal) {
flags |= ParameterDeclaration.isFinalFlag;
@@ -194,11 +194,10 @@ class BufferedWriter {
if (_currentLength > _currentBuffer.length - 4) {
_grow();
}
// TODO(alexmarkov): consider using native byte order
_addByte((value >> 24) & 0xFF);
_addByte((value >> 16) & 0xFF);
_addByte((value >> 8) & 0xFF);
_addByte(value & 0xFF);
_addByte((value >> 8) & 0xFF);
_addByte((value >> 16) & 0xFF);
_addByte((value >> 24) & 0xFF);
}
@pragma('vm:prefer-inline')
@@ -291,10 +290,10 @@ class BufferedReader {
int readByte() => bytes[_pos++];
int readUInt32() {
return (readByte() << 24) |
(readByte() << 16) |
return readByte() |
(readByte() << 8) |
readByte();
(readByte() << 16) |
(readByte() << 24);
}
int readPackedUInt30() {
+3 -3
View File
@@ -110,16 +110,16 @@ type ConstantDynamicCall extends ConstantPoolEntry {
enum ConstantTag {
kInvalid,
kObjectRef,
kClass,
kType,
kStaticField,
kInstanceField,
kClass,
kTypeArgumentsField,
kType,
kClosureFunction,
kEndClosureFunctionScope,
kSubtypeTestCache,
kEmptyTypeArguments,
kObjectRef,
kDirectCall,
kInterfaceCall,
kInstantiatedInterfaceCall,
+37 -41
View File
@@ -313,23 +313,23 @@ class Members extends BytecodeDeclaration {
}
class FieldDeclaration {
static const hasNontrivialInitializerFlag = 1 << 0;
static const hasGetterFlag = 1 << 1;
static const hasSetterFlag = 1 << 2;
static const isReflectableFlag = 1 << 3;
static const isStaticFlag = 1 << 4;
static const isConstFlag = 1 << 5;
static const isFinalFlag = 1 << 6;
static const isCovariantFlag = 1 << 7;
static const isGenericCovariantImplFlag = 1 << 8;
static const hasSourcePositionsFlag = 1 << 9;
static const hasAnnotationsFlag = 1 << 10;
static const hasPragmaFlag = 1 << 11;
static const hasCustomScriptFlag = 1 << 12;
static const hasInitializerCodeFlag = 1 << 13;
static const isLateFlag = 1 << 14;
static const isExtensionMemberFlag = 1 << 15;
static const hasInitializerFlag = 1 << 16;
static const isStaticFlag = 1 << 0;
static const isConstFlag = 1 << 1;
static const isFinalFlag = 1 << 2;
static const isLateFlag = 1 << 3;
static const isCovariantFlag = 1 << 4;
static const isCovariantByClassFlag = 1 << 5;
static const isExtensionMemberFlag = 1 << 6;
static const isReflectableFlag = 1 << 7;
static const hasGetterFlag = 1 << 8;
static const hasSetterFlag = 1 << 9;
static const hasInitializerFlag = 1 << 10;
static const hasNontrivialInitializerFlag = 1 << 11;
static const hasInitializerCodeFlag = 1 << 12;
static const hasSourcePositionsFlag = 1 << 13;
static const hasAnnotationsFlag = 1 << 14;
static const hasPragmaFlag = 1 << 15;
static const hasCustomScriptFlag = 1 << 16;
final int flags;
final ObjectHandle name;
@@ -472,31 +472,30 @@ class FieldDeclaration {
}
class FunctionDeclaration {
static const isConstructorFlag = 1 << 0;
static const isGetterFlag = 1 << 1;
static const isSetterFlag = 1 << 2;
static const isFactoryFlag = 1 << 3;
static const isStaticFlag = 1 << 4;
static const isAbstractFlag = 1 << 5;
static const isStaticFlag = 1 << 0;
static const isAbstractFlag = 1 << 1;
static const isGetterFlag = 1 << 2;
static const isSetterFlag = 1 << 3;
static const isConstructorFlag = 1 << 4;
static const isFactoryFlag = 1 << 5;
static const isConstFlag = 1 << 6;
static const hasOptionalPositionalParamsFlag = 1 << 7;
static const hasOptionalNamedParamsFlag = 1 << 8;
static const hasTypeParamsFlag = 1 << 9;
static const isReflectableFlag = 1 << 10;
static const isDebuggableFlag = 1 << 11;
static const isAsyncFlag = 1 << 12;
static const isAsyncStarFlag = 1 << 13;
static const isSyncStarFlag = 1 << 14;
static const isForwardingStubFlag = 1 << 15;
static const isNoSuchMethodForwarderFlag = 1 << 16;
static const isNativeFlag = 1 << 17;
static const hasParameterFlagsFlag = 1 << 10;
static const isExtensionMemberFlag = 1 << 11;
static const isReflectableFlag = 1 << 12;
static const isDebuggableFlag = 1 << 13;
static const isAsyncFlag = 1 << 14;
static const isAsyncStarFlag = 1 << 15;
static const isSyncStarFlag = 1 << 16;
static const isNoSuchMethodForwarderFlag = 1 << 17;
static const isExternalFlag = 1 << 18;
static const hasSourcePositionsFlag = 1 << 19;
static const hasAnnotationsFlag = 1 << 20;
static const hasPragmaFlag = 1 << 21;
static const hasCustomScriptFlag = 1 << 22;
static const isExtensionMemberFlag = 1 << 23;
static const hasParameterFlagsFlag = 1 << 24;
static const isNativeFlag = 1 << 19;
static const hasSourcePositionsFlag = 1 << 20;
static const hasAnnotationsFlag = 1 << 21;
static const hasPragmaFlag = 1 << 22;
static const hasCustomScriptFlag = 1 << 23;
final int flags;
final ObjectHandle name;
@@ -670,9 +669,6 @@ class FunctionDeclaration {
if ((flags & isSyncStarFlag) != 0) {
sb.write(', sync*');
}
if ((flags & isForwardingStubFlag) != 0) {
sb.write(', forwarding-stub');
}
if ((flags & isNoSuchMethodForwarderFlag) != 0) {
sb.write(', no-such-method-forwarder');
}
@@ -751,7 +747,7 @@ class TypeParametersDeclaration {
class ParameterDeclaration {
// Parameter flags are written separately (in Code).
static const isCovariantFlag = 1 << 0;
static const isGenericCovariantImplFlag = 1 << 1;
static const isCovariantByClassFlag = 1 << 1;
static const isFinalFlag = 1 << 2;
static const isRequiredFlag = 1 << 3;
+13 -13
View File
@@ -284,44 +284,44 @@ type BoundAndDefaultType {
enum ObjectKind {
kInvalid,
kLibrary,
kScript,
kClass,
kMember,
kClosure,
kName,
kTypeArguments,
kConstObject,
kArgDesc,
kScript,
kType,
kTypeArguments,
kArgDesc,
}
enum ConstTag {
kInvalid,
kInstance,
kInt,
kDouble,
kList,
kTearOff,
kBool,
kSymbol,
kTearOffInstantiation,
kString,
kSymbol,
kInstance,
kList,
kMap,
kSet,
kRecord,
kTearOff,
kTearOffInstantiation,
}
enum TypeTag {
kInvalid,
kDynamic,
kVoid,
kSimpleType,
kTypeParameter,
kGenericType,
kFunctionType,
kRecordType,
kNull,
kNever,
kSimpleType,
kGenericType,
kTypeParameter,
kFunctionType,
kRecordType,
}
/// Name of artificial class containing top-level members of a library.
+1 -16
View File
@@ -17,8 +17,6 @@ class SourcePositions extends BytecodeDeclaration {
// Special value of fileOffset which marks synthetic code without source
// position.
static const syntheticCodeMarker = -1;
// Special value of fileOffset which marks yield point.
static const yieldPointMarker = -2;
final List<int> _positions = <int>[]; // Pairs (PC, fileOffset).
int _lastPc = 0;
@@ -37,17 +35,6 @@ class SourcePositions extends BytecodeDeclaration {
}
}
void addYieldPoint(int pc, int fileOffset) {
assert(pc > _lastPc);
assert((fileOffset >= 0) || (fileOffset == syntheticCodeMarker));
_positions.add(pc);
_positions.add(yieldPointMarker);
_positions.add(pc);
_positions.add(fileOffset);
_lastPc = pc;
_lastOffset = fileOffset;
}
bool get isEmpty => _positions.isEmpty;
bool get isNotEmpty => !isEmpty;
@@ -83,9 +70,7 @@ class SourcePositions extends BytecodeDeclaration {
for (int i = 0; i < _positions.length; i += 2) {
final int pc = _positions[i];
final int fileOffset = _positions[i + 1];
final entry = (fileOffset == yieldPointMarker)
? 'yield point'
: 'source position $fileOffset';
final entry = 'source position $fileOffset';
if (map[pc] == null) {
map[pc] = entry;
} else {
@@ -588,7 +588,7 @@ ConstantPool {
}
Function 'foo7', reflectable, debuggable, forwarding-stub
Function 'foo7', reflectable, debuggable
parameters [dart:core::num 'b', dart:core::String 'c'] (required: 2)
return-type void
+54 -56
View File
@@ -438,16 +438,16 @@ intptr_t BytecodeReaderHelper::ReadConstantPool(const Function& function,
// be kept in sync with pkg/dart2bytecode/lib/constant_pool.dart.
enum ConstantPoolTag {
kInvalid,
kObjectRef,
kClass,
kType,
kStaticField,
kInstanceField,
kClass,
kTypeArgumentsField,
kType,
kClosureFunction,
kEndClosureFunctionScope,
kSubtypeTestCache,
kEmptyTypeArguments,
kObjectRef,
kDirectCall,
kInterfaceCall,
kInstantiatedInterfaceCall,
@@ -879,15 +879,15 @@ ObjectPtr BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
enum ObjectKind {
kInvalid,
kLibrary,
kScript,
kClass,
kMember,
kClosure,
kName,
kTypeArguments,
kConstObject,
kArgDesc,
kScript,
kType,
kTypeArguments,
kArgDesc,
};
// Member flags, must be in sync with _MemberHandle constants in
@@ -1053,18 +1053,18 @@ ObjectPtr BytecodeReaderHelper::ReadConstObject(intptr_t tag) {
// pkg/dart2bytecode/lib/object_table.dart.
enum ConstTag {
kInvalid,
kInstance,
kInt,
kDouble,
kList,
kTearOff,
kBool,
kSymbol,
kTearOffInstantiation,
kString,
kSymbol,
kInstance,
kList,
kMap,
kSet,
kRecord,
kTearOff,
kTearOffInstantiation,
};
switch (tag) {
@@ -1250,13 +1250,13 @@ ObjectPtr BytecodeReaderHelper::ReadType(intptr_t tag,
kInvalid,
kDynamic,
kVoid,
kSimpleType,
kTypeParameter,
kGenericType,
kFunctionType,
kRecordType,
kNull,
kNever,
kSimpleType,
kGenericType,
kTypeParameter,
kFunctionType,
kRecordType,
};
// FunctionType flags, must be in sync with _FunctionTypeHandle constants in
@@ -1479,23 +1479,23 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls,
bool discard_fields) {
// Field flags, must be in sync with FieldDeclaration constants in
// pkg/dart2bytecode/lib/declarations.dart.
const int kHasNontrivialInitializerFlag = 1 << 0;
const int kHasGetterFlag = 1 << 1;
const int kHasSetterFlag = 1 << 2;
const int kIsReflectableFlag = 1 << 3;
const int kIsStaticFlag = 1 << 4;
const int kIsConstFlag = 1 << 5;
const int kIsFinalFlag = 1 << 6;
const int kIsCovariantFlag = 1 << 7;
const int kIsGenericCovariantImplFlag = 1 << 8;
const int kHasSourcePositionsFlag = 1 << 9;
const int kHasAnnotationsFlag = 1 << 10;
const int kHasPragmaFlag = 1 << 11;
const int kHasCustomScriptFlag = 1 << 12;
const int kHasInitializerCodeFlag = 1 << 13;
const int kIsLateFlag = 1 << 14;
const int kIsExtensionMemberFlag = 1 << 15;
const int kHasInitializerFlag = 1 << 16;
const int kIsStaticFlag = 1 << 0;
const int kIsConstFlag = 1 << 1;
const int kIsFinalFlag = 1 << 2;
const int kIsLateFlag = 1 << 3;
const int kIsCovariantFlag = 1 << 4;
const int kIsCovariantByClassFlag = 1 << 5;
const int kIsExtensionMemberFlag = 1 << 6;
const int kIsReflectableFlag = 1 << 7;
const int kHasGetterFlag = 1 << 8;
const int kHasSetterFlag = 1 << 9;
const int kHasInitializerFlag = 1 << 10;
const int kHasNontrivialInitializerFlag = 1 << 11;
const int kHasInitializerCodeFlag = 1 << 12;
const int kHasSourcePositionsFlag = 1 << 13;
const int kHasAnnotationsFlag = 1 << 14;
const int kHasPragmaFlag = 1 << 15;
const int kHasCustomScriptFlag = 1 << 16;
const int num_fields = reader_.ReadListLength();
if ((num_fields == 0) && !cls.is_enum_class()) {
@@ -1546,8 +1546,7 @@ void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls,
field.set_has_pragma(has_pragma);
field.set_is_covariant((flags & kIsCovariantFlag) != 0);
field.set_is_generic_covariant_impl((flags & kIsGenericCovariantImplFlag) !=
0);
field.set_is_generic_covariant_impl((flags & kIsCovariantByClassFlag) != 0);
field.set_has_nontrivial_initializer(has_nontrivial_initializer);
field.set_is_extension_member(is_extension_member);
field.set_has_initializer(has_initializer);
@@ -1728,31 +1727,30 @@ InstancePtr BytecodeReaderHelper::Canonicalize(const Instance& instance) {
void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) {
// Function flags, must be in sync with FunctionDeclaration constants in
// pkg/dart2bytecode/lib/declarations.dart.
const int kIsConstructorFlag = 1 << 0;
const int kIsGetterFlag = 1 << 1;
const int kIsSetterFlag = 1 << 2;
const int kIsFactoryFlag = 1 << 3;
const int kIsStaticFlag = 1 << 4;
const int kIsAbstractFlag = 1 << 5;
const int kIsStaticFlag = 1 << 0;
const int kIsAbstractFlag = 1 << 1;
const int kIsGetterFlag = 1 << 2;
const int kIsSetterFlag = 1 << 3;
const int kIsConstructorFlag = 1 << 4;
const int kIsFactoryFlag = 1 << 5;
const int kIsConstFlag = 1 << 6;
const int kHasOptionalPositionalParamsFlag = 1 << 7;
const int kHasOptionalNamedParamsFlag = 1 << 8;
const int kHasTypeParamsFlag = 1 << 9;
const int kIsReflectableFlag = 1 << 10;
const int kIsDebuggableFlag = 1 << 11;
const int kIsAsyncFlag = 1 << 12;
const int kIsAsyncStarFlag = 1 << 13;
const int kIsSyncStarFlag = 1 << 14;
// const int kIsForwardingStubFlag = 1 << 15;
const int kIsNoSuchMethodForwarderFlag = 1 << 16;
const int kIsNativeFlag = 1 << 17;
const int kHasParameterFlagsFlag = 1 << 10;
const int kIsExtensionMemberFlag = 1 << 11;
const int kIsReflectableFlag = 1 << 12;
const int kIsDebuggableFlag = 1 << 13;
const int kIsAsyncFlag = 1 << 14;
const int kIsAsyncStarFlag = 1 << 15;
const int kIsSyncStarFlag = 1 << 16;
const int kIsNoSuchMethodForwarderFlag = 1 << 17;
const int kIsExternalFlag = 1 << 18;
const int kHasSourcePositionsFlag = 1 << 19;
const int kHasAnnotationsFlag = 1 << 20;
const int kHasPragmaFlag = 1 << 21;
const int kHasCustomScriptFlag = 1 << 22;
const int kIsExtensionMemberFlag = 1 << 23;
const int kHasParameterFlagsFlag = 1 << 24;
const int kIsNativeFlag = 1 << 19;
const int kHasSourcePositionsFlag = 1 << 20;
const int kHasAnnotationsFlag = 1 << 21;
const int kHasPragmaFlag = 1 << 22;
const int kHasCustomScriptFlag = 1 << 23;
const intptr_t num_functions = reader_.ReadListLength();
ASSERT(function_index_ + num_functions == functions_->Length());
@@ -2200,7 +2198,7 @@ void BytecodeReaderHelper::ReadParameterCovariance(
if ((flags & Parameter::kIsCovariantFlag) != 0) {
is_covariant->Add(i);
}
if ((flags & Parameter::kIsGenericCovariantImplFlag) != 0) {
if ((flags & Parameter::kIsCovariantByClassFlag) != 0) {
is_generic_covariant_impl->Add(i);
}
}
+4 -2
View File
@@ -52,7 +52,9 @@ class Reader : public ValueObject {
ASSERT((size_ >= 4) && (offset >= 0) && (offset <= size_ - 4));
uint32_t value =
LoadUnaligned(reinterpret_cast<const uint32_t*>(raw_buffer_ + offset));
return Utils::BigEndianToHost32(value);
// All supported platforms are little-endian, so there is no need to
// convert from little-endian to host.
return value;
}
uint32_t ReadUInt32() {
@@ -265,7 +267,7 @@ class BytecodeReaderHelper : public ValueObject {
// pkg/dart2bytecode/lib/declarations.dart.
struct Parameter {
static const int kIsCovariantFlag = 1 << 0;
static const int kIsGenericCovariantImplFlag = 1 << 1;
static const int kIsCovariantByClassFlag = 1 << 1;
static const int kIsFinalFlag = 1 << 2;
static const int kIsRequiredFlag = 1 << 3;
};