Files
sdk/pkg/native_compiler/lib/configuration.dart
T
Alexander Markov ca604cf41a Modular AOT compiler main
Issue: https://github.com/dart-lang/sdk/issues/61635
Change-Id: I55eaf5267c63d75b317276dfeab4d27e93139db3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/475407
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2026-01-26 09:25:01 -08:00

107 lines
3.6 KiB
Dart

// 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:cfg/ir/functions.dart';
import 'package:cfg/ir/ssa_computation.dart';
import 'package:cfg/passes/constant_propagation.dart';
import 'package:cfg/passes/control_flow_optimizations.dart';
import 'package:cfg/passes/pass.dart';
import 'package:cfg/passes/simplification.dart';
import 'package:cfg/passes/value_numbering.dart';
import 'package:native_compiler/back_end/arm64/code_generator.dart';
import 'package:native_compiler/back_end/arm64/constraints.dart';
import 'package:native_compiler/back_end/back_end_state.dart';
import 'package:native_compiler/back_end/code_generator.dart';
import 'package:native_compiler/back_end/constraints.dart';
import 'package:native_compiler/back_end/regalloc_checker.dart';
import 'package:native_compiler/back_end/register_allocator.dart';
import 'package:native_compiler/passes/lowering.dart';
import 'package:native_compiler/passes/reorder_blocks.dart';
import 'package:native_compiler/runtime/vm_defs.dart';
import 'package:native_compiler/snapshot/image_writer.dart';
import 'package:native_compiler/snapshot/macho/macho_image_writer.dart';
enum TargetCPU {
arm64;
static final String defaultName = arm64.name;
static final List<String> allowedNames = [for (final v in values) v.name];
static TargetCPU fromName(String name) => values.byName(name);
}
enum ImageFormat {
macho;
static final String defaultName = macho.name;
static final List<String> allowedNames = [for (final v in values) v.name];
static ImageFormat fromName(String name) => values.byName(name);
}
abstract base class Configuration {
final TargetCPU targetCPU;
final ImageFormat imageFormat;
final bool enableAsserts;
final String outputLibraryName;
Configuration(
this.targetCPU,
this.imageFormat, {
required this.enableAsserts,
required this.outputLibraryName,
});
Pipeline createPipeline(
FunctionRegistry functionRegistry,
CodeConsumer consumeGeneratedCode,
);
Constraints createConstraints() => switch (targetCPU) {
TargetCPU.arm64 => Arm64Constraints(),
};
CodeGenerator createCodeGenerator(BackEndState backEndState) =>
switch (targetCPU) {
TargetCPU.arm64 => Arm64CodeGenerator(backEndState),
};
ImageWriter createImageWriter() => switch (imageFormat) {
ImageFormat.macho => MachoImageWriter(targetCPU, outputLibraryName),
};
}
final class DevelopmentCompilerConfiguration extends Configuration {
DevelopmentCompilerConfiguration(
super.targetCPU,
super.imageFormat, {
required super.enableAsserts,
required super.outputLibraryName,
});
VMOffsets createVMOffsets() => switch (targetCPU) {
TargetCPU.arm64 => Arm64VMOffsets(),
};
@override
Pipeline createPipeline(
FunctionRegistry functionRegistry,
CodeConsumer consumeGeneratedCode,
) {
final backEndState = BackEndState();
backEndState.vmOffsets = createVMOffsets();
backEndState.consumeGeneratedCode = consumeGeneratedCode;
final constraints = createConstraints();
return Pipeline([
SSAComputation(),
ValueNumbering(simplification: Simplification()),
ConstantPropagation(),
ControlFlowOptimizations(),
Lowering(functionRegistry),
ReorderBlocks(backEndState),
LinearScanRegisterAllocator(backEndState, constraints),
RegisterAllocationChecker(backEndState, constraints),
createCodeGenerator(backEndState),
]);
}
}