blob: e856f72692ab44014b8c5f9e0cf057374c6dc5fe [file] [log] [blame]
// Copyright (c) 2026, 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 'package:kernel/ast.dart' as ast show Class;
import 'package:native_compiler/back_end/assembler.dart';
import 'package:native_compiler/back_end/code.dart';
import 'package:native_compiler/back_end/locations.dart';
/// Interface class for architecture-specific stub code generator.
abstract interface class StubCodeGenerator {
Assembler generate();
}
/// Base class for architecture-specific stub factory.
///
/// Generates and caches stubs on demand.
abstract base class StubFactory {
final CodeConsumer consumeGeneratedCode;
Map<ast.Class, Code> _allocationStubs = {};
Map<(Register, Register), Code> _writeBarrierStubs = {};
StubFactory(this.consumeGeneratedCode);
StubCodeGenerator allocationStubGenerator(ast.Class cls);
StubCodeGenerator writeBarrierStubGenerator(
Register objectReg,
Register valueReg,
);
Code _generateCode(String name, StubCodeGenerator generator) {
final asm = generator.generate();
final code = Code(name, null, asm.bytes, asm.objectPool);
consumeGeneratedCode(code);
return code;
}
Code getAllocationStub(ast.Class cls) => _allocationStubs[cls] ??=
_generateCode('AllocationStub for ${cls}', allocationStubGenerator(cls));
Code getWriteBarrierStub(Register objectReg, Register valueReg) =>
_writeBarrierStubs[(objectReg, valueReg)] ??= _generateCode(
'WriteBarrierStub for $objectReg, $valueReg',
writeBarrierStubGenerator(objectReg, valueReg),
);
}