Revert "Use backend targets to run Kernel transformations in Fasta"

This reverts commit 8ff762067a.

TBR=ahe@google.com

Review-Url: https://codereview.chromium.org/2918923003 .
This commit is contained in:
Dmitry Stefantsov 2017-06-02 12:45:33 +02:00
parent f72b893fea
commit 0b424ca5d2
21 changed files with 73 additions and 160 deletions

View file

@ -53,7 +53,7 @@ Future<Program> kernelForProgram(Uri source, CompilerOptions options) async {
TranslateUri uriTranslator = await pOptions.getUriTranslator();
var dillTarget =
new DillTarget(new Ticker(isVerbose: false), uriTranslator, "vm_fasta");
new DillTarget(new Ticker(isVerbose: false), uriTranslator, "vm");
var summary = await pOptions.sdkSummaryProgram;
if (summary != null) {
dillTarget.loader.appendLibraries(summary);
@ -149,7 +149,7 @@ Future<Program> kernelForBuildUnit(
TranslateUri uriTranslator = await pOptions.getUriTranslator();
var dillTarget =
new DillTarget(new Ticker(isVerbose: false), uriTranslator, "vm_fasta");
new DillTarget(new Ticker(isVerbose: false), uriTranslator, "vm");
var summary = await pOptions.sdkSummaryProgram;
if (summary != null) {
dillTarget.loader.appendLibraries(summary);

View file

@ -91,7 +91,7 @@ class CompilerCommandLine extends CommandLine {
bool get strongMode => options.containsKey("--strong-mode");
String get target {
return options["-t"] ?? options["--target"] ?? "vm_fasta";
return options["-t"] ?? options["--target"] ?? "vm";
}
static dynamic withGlobalOptions(String programName, List<String> arguments,

View file

@ -8,7 +8,7 @@ import 'dart:async' show Future;
import 'package:kernel/ast.dart' show Class;
import 'package:kernel/target/targets.dart' show getTarget, TargetFlags;
import 'package:kernel/target/targets.dart' show getTarget;
import '../errors.dart' show internalError;
import '../kernel/kernel_builder.dart' show ClassBuilder;
@ -23,10 +23,8 @@ class DillTarget extends TargetImplementation {
DillLoader loader;
DillTarget(
Ticker ticker, TranslateUri uriTranslator, String backendTargetName,
{TargetFlags flags})
: super(ticker, uriTranslator,
getTarget(backendTargetName, flags ?? new TargetFlags())) {
Ticker ticker, TranslateUri uriTranslator, String backendTargetName)
: super(ticker, uriTranslator, getTarget(backendTargetName, null)) {
loader = new DillLoader(this);
}

View file

@ -186,7 +186,7 @@ Future<CompilationResult> parseScript(
Future<CompilationResult> parseScriptInFileSystem(
Uri fileName, FileSystem fileSystem, Uri packages, Uri patchedSdk,
{bool verbose: false, bool strongMode: false, String backendTarget}) async {
backendTarget ??= "vm_fasta";
backendTarget ??= "vm";
try {
if (!await fileSystem.entityForUri(fileName).exists()) {
return new CompilationResult.error(
@ -204,9 +204,8 @@ Future<CompilationResult> parseScriptInFileSystem(
TranslateUri uriTranslator =
await TranslateUri.parse(fileSystem, patchedSdk, packages: packages);
final Ticker ticker = new Ticker(isVerbose: verbose);
final DillTarget dillTarget = new DillTarget(
ticker, uriTranslator, backendTarget,
flags: new TargetFlags(strongMode: strongMode));
final DillTarget dillTarget =
new DillTarget(ticker, uriTranslator, backendTarget);
_appendDillForUri(dillTarget, patchedSdk.resolve('platform.dill'));
final KernelTarget kernelTarget =
new KernelTarget(fileSystem, dillTarget, uriTranslator, strongMode);
@ -227,6 +226,11 @@ Future<CompilationResult> parseScriptInFileSystem(
return new CompilationResult.error("No 'main' method found.");
}
// Perform target-specific transformations.
Target target = getTarget("vm", new TargetFlags(strongMode: false));
target.performModularTransformations(coreTypes, hierarchy, program);
target.performGlobalTransformations(coreTypes, program);
// Write the program to a list of bytes and return it. Do not include
// libraries that have a dart: import URI.
//
@ -245,14 +249,9 @@ Future<CompilationResult> parseScriptInFileSystem(
}
Future compilePlatform(Uri patchedSdk, Uri fullOutput,
{Uri outlineOutput,
Uri packages,
bool verbose: false,
String backendTarget}) async {
backendTarget ??= "vm_fasta";
{Uri outlineOutput, Uri packages, bool verbose: false}) async {
Ticker ticker = new Ticker(isVerbose: verbose);
await CompilerCommandLine.withGlobalOptions("", [""], (CompilerContext c) {
c.options.options["--target"] = backendTarget;
c.options.options["--packages"] = packages;
if (verbose) {
c.options.options["--verbose"] = true;
@ -269,7 +268,7 @@ Future writeDepsFile(Uri script, Uri depsFile, Uri output,
Iterable<Uri> extraDependencies,
bool verbose: false,
String backendTarget}) async {
backendTarget ??= "vm_fasta";
backendTarget ??= "vm";
Ticker ticker = new Ticker(isVerbose: verbose);
await CompilerCommandLine.withGlobalOptions("", [""],
(CompilerContext c) async {
@ -282,8 +281,8 @@ Future writeDepsFile(Uri script, Uri depsFile, Uri output,
TranslateUri uriTranslator = await TranslateUri.parse(c.fileSystem, sdk,
packages: c.options.packages);
ticker.logMs("Read packages file");
DillTarget dillTarget = new DillTarget(ticker, uriTranslator, backendTarget,
flags: new TargetFlags(strongMode: false));
DillTarget dillTarget =
new DillTarget(ticker, uriTranslator, backendTarget);
_appendDillForUri(dillTarget, platform);
KernelTarget kernelTarget = new KernelTarget(PhysicalFileSystem.instance,
dillTarget, uriTranslator, false, c.uriToSource);

View file

@ -655,11 +655,27 @@ class KernelTarget extends TargetImplementation {
/// Run all transformations that are needed when building a program for the
/// first time.
void runBuildTransformations() {
backendTarget.performModularTransformationsOnLibraries(
loader.coreTypes, loader.hierarchy, loader.libraries,
logger: (String msg) => ticker.logMs(msg));
backendTarget.performGlobalTransformations(loader.coreTypes, program,
logger: (String msg) => ticker.logMs(msg));
transformMixinApplications();
otherTransformations();
}
void transformMixinApplications() {
mix.transformLibraries(
backendTarget, loader.coreTypes, loader.hierarchy, loader.libraries);
ticker.logMs("Transformed mixin applications");
}
void otherTransformations() {
if (!strongMode) {
// TODO(ahe): Don't generate type variables in the first place.
program.accept(new Erasure());
ticker.logMs("Erased type variables in generic methods");
}
if (errors.isEmpty && loader.collectCompileTimeErrors().isEmpty) {
// TODO(kmillikin): Make this run on a per-method basis.
transformAsync.transformLibraries(loader.coreTypes, loader.libraries);
}
ticker.logMs("Transformed async methods");
}
void verify() {

View file

@ -100,8 +100,8 @@ class IncrementalKernelGeneratorImpl implements IncrementalKernelGenerator {
});
CanonicalName nameRoot = new CanonicalName.root();
DillTarget dillTarget = new DillTarget(
new Ticker(isVerbose: false), _uriTranslator, "vm_fasta");
DillTarget dillTarget =
new DillTarget(new Ticker(isVerbose: false), _uriTranslator, "vm");
List<_LibraryCycleResult> results = [];
await _logger.runAsync('Compute results for cycles', () async {

View file

@ -95,7 +95,7 @@ class BuildProgram
var platformOutline = context.loadPlatformOutline();
platformOutline.unbindCanonicalNames();
var dillTarget = new DillTarget(
new Ticker(isVerbose: false), context.uriTranslator, "vm_fasta");
new Ticker(isVerbose: false), context.uriTranslator, "vm");
dillTarget.loader.appendLibraries(platformOutline);
var sourceTarget = new KernelTarget(PhysicalFileSystem.instance,
dillTarget, context.uriTranslator, false);

View file

@ -216,8 +216,7 @@ class Outline extends Step<TestDescription, Program, FastaContext> {
CompilerContext.current.disableColors();
Program platformOutline = await context.loadPlatformOutline();
Ticker ticker = new Ticker();
DillTarget dillTarget =
new DillTarget(ticker, context.uriTranslator, "vm_fasta");
DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator, "vm");
platformOutline.unbindCanonicalNames();
dillTarget.loader.appendLibraries(platformOutline);
// We create a new URI translator to avoid reading plaform libraries from

View file

@ -214,7 +214,7 @@ generateKernel(Uri entryUri,
var timer = new Stopwatch()..start();
final Ticker ticker = new Ticker();
final DillTarget dillTarget = new DillTarget(ticker, uriResolver, "vm_fasta");
final DillTarget dillTarget = new DillTarget(ticker, uriResolver, "vm");
final KernelTarget kernelTarget = new KernelTarget(
PhysicalFileSystem.instance, dillTarget, uriResolver, strongMode);
var entrypoints = [

View file

@ -51,14 +51,12 @@ class FlutterTarget extends Target {
'dart:vmservice_sky',
];
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)}) {
mix.transformLibraries(this, coreTypes, hierarchy, libraries);
void performModularTransformations(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program) {
mix.transformLibraries(this, coreTypes, hierarchy, program.libraries);
}
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {
void performGlobalTransformations(CoreTypes coreTypes, Program program) {
cont.transformProgram(coreTypes, program);
// Repair `_getMainClosure()` function in dart:{_builtin,ui} libraries.

View file

@ -7,11 +7,10 @@ import '../ast.dart';
import '../class_hierarchy.dart';
import '../core_types.dart';
import '../transformations/treeshaker.dart' show ProgramRoot;
import 'flutter.dart' show FlutterTarget;
import 'vm.dart' show VmTarget;
import 'vm_fasta.dart' show VmFastaTarget;
import 'vmcc.dart' show VmClosureConvertedTarget;
import 'vmreify.dart' show VmGenericTypesReifiedTarget;
import 'flutter.dart';
import 'vm.dart';
import 'vmcc.dart';
import 'vmreify.dart';
final List<String> targetNames = targets.keys.toList();
@ -33,7 +32,6 @@ typedef Target _TargetBuilder(TargetFlags flags);
final Map<String, _TargetBuilder> targets = <String, _TargetBuilder>{
'none': (TargetFlags flags) => new NoneTarget(flags),
'vm': (TargetFlags flags) => new VmTarget(flags),
'vm_fasta': (TargetFlags flags) => new VmFastaTarget(flags),
'vmcc': (TargetFlags flags) => new VmClosureConvertedTarget(flags),
'vmreify': (TargetFlags flags) => new VmGenericTypesReifiedTarget(flags),
'flutter': (TargetFlags flags) => new FlutterTarget(flags),
@ -70,47 +68,19 @@ abstract class Target {
/// If true, the SDK should be loaded in strong mode.
bool get strongModeSdk => strongMode;
/// Perform target-specific modular transformations on the given program.
/// Perform target-specific modular transformations.
///
/// These transformations should not be whole-program transformations. They
/// should expect that the program will contain external libraries.
void performModularTransformationsOnProgram(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program,
{void logger(String msg)}) {
performModularTransformationsOnLibraries(
coreTypes, hierarchy, program.libraries,
logger: logger);
}
/// Perform target-specific modular transformations on the given libraries.
///
/// The intent of this method is to perform the transformations only on some
/// subset of the program libraries and avoid packing them into a temporary
/// [Program] instance to pass into [performModularTransformationsOnProgram].
///
/// Note that the following should be equivalent:
///
/// target.performModularTransformationsOnProgram(coreTypes, program);
///
/// and
///
/// target.performModularTransformationsOnLibraries(
/// coreTypes, program.libraries);
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)});
void performModularTransformations(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program);
/// Perform target-specific whole-program transformations.
///
/// These transformations should be optimizations and not required for
/// correctness. Everything should work if a simple and fast linker chooses
/// not to apply these transformations.
///
/// Note that [performGlobalTransformations] doesn't have -OnProgram and
/// -OnLibraries alternatives, because the global knowledge required by the
/// transformations is assumed to be retrieved from a [Program] instance.
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)});
void performGlobalTransformations(CoreTypes coreTypes, Program program);
/// Builds an expression that instantiates an [Invocation] that can be passed
/// to [noSuchMethod].
@ -128,11 +98,9 @@ class NoneTarget extends Target {
bool get strongMode => flags.strongMode;
String get name => 'none';
List<String> get extraRequiredLibraries => <String>[];
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)}) {}
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {}
void performModularTransformations(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program) {}
void performGlobalTransformations(CoreTypes coreTypes, Program program) {}
@override
Expression instantiateInvocation(Member target, Expression receiver,

View file

@ -56,17 +56,15 @@ class VmTarget extends Target {
ClassHierarchy _hierarchy;
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)}) {
void performModularTransformations(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program) {
var mixins = new mix.MixinFullResolution(this, coreTypes, hierarchy)
..transform(libraries);
..transform(program.libraries);
_hierarchy = mixins.hierarchy;
}
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {
void performGlobalTransformations(CoreTypes coreTypes, Program program) {
if (strongMode) {
new InsertTypeChecks(coreTypes, _hierarchy).transformProgram(program);
new InsertCovarianceChecks(coreTypes, _hierarchy)

View file

@ -1,44 +0,0 @@
// Copyright (c) 2016, 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 kernel.target.vm_fasta;
import '../ast.dart' show Program, Library;
import '../core_types.dart' show CoreTypes;
import '../class_hierarchy.dart' show ClassHierarchy;
import '../transformations/mixin_full_resolution.dart' as transformMixins
show transformLibraries;
import '../transformations/continuation.dart' as transformAsync
show transformLibraries;
import '../transformations/erasure.dart' as tranformErasure
show transformLibraries;
import 'targets.dart' show TargetFlags;
import 'vm.dart' as vm_target;
class VmFastaTarget extends vm_target.VmTarget {
VmFastaTarget(TargetFlags flags) : super(flags);
String get name => "vm_fasta";
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
{void logger(String msg)}) {
transformMixins.transformLibraries(this, coreTypes, hierarchy, libraries);
logger?.call("Transformed mixin applications");
// TODO(ahe): Don't generate type variables in the first place.
if (!strongMode) {
tranformErasure.transformLibraries(coreTypes, libraries);
logger?.call("Erased type variables in generic methods");
}
// TODO(kmillikin): Make this run on a per-method basis.
transformAsync.transformLibraries(coreTypes, libraries);
logger?.call("Transformed async methods");
}
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {}
}

View file

@ -16,8 +16,7 @@ class VmClosureConvertedTarget extends vm_target.VmTarget {
String get name => "vmcc";
@override
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {
void performGlobalTransformations(CoreTypes coreTypes, Program program) {
super.performGlobalTransformations(coreTypes, program);
cc.transformProgram(coreTypes, program);
}

View file

@ -27,8 +27,7 @@ class VmGenericTypesReifiedTarget extends vmcc_target.VmClosureConvertedTarget {
}
@override
void performGlobalTransformations(CoreTypes coreTypes, Program program,
{void logger(String msg)}) {
void performGlobalTransformations(CoreTypes coreTypes, Program program) {
super.performGlobalTransformations(coreTypes, program);
// TODO(dmitryas) this transformation should be made modular
reify.transformProgram(coreTypes, program);

View file

@ -5,18 +5,6 @@ library kernel.transformations.erasure;
import '../ast.dart';
import '../type_algebra.dart';
import '../core_types.dart';
Program transformProgram(CoreTypes coreTypes, Program program) {
program.accept(new Erasure());
}
void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
Erasure erasure = new Erasure();
for (Library library in libraries) {
library.accept(erasure);
}
}
/// This pass is a temporary measure to run strong mode code in the VM, which
/// does not yet have the necessary runtime support.

View file

@ -27,12 +27,10 @@ abstract class TestTarget extends Target {
Annotator get annotator => null;
// Return a list of strings so that we can accumulate errors.
List<String> performModularTransformationsOnProgram(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program,
{void logger(String msg)});
List<String> performModularTransformations(
CoreTypes coreTypes, ClassHierarchy hierarchy, Program program);
List<String> performGlobalTransformations(
CoreTypes coreTypes, Program program,
{void logger(String msg)});
CoreTypes coreTypes, Program program);
}
void runBaselineTests(String folderName, TestTarget target) {
@ -63,7 +61,7 @@ void runBaselineTests(String folderName, TestTarget target) {
loader.loadProgram(dartPath, target: target);
verifyProgram(program);
var errors = <String>[];
errors.addAll(target.performModularTransformationsOnProgram(
errors.addAll(target.performModularTransformations(
coreTypes, hierarchy, program));
verifyProgram(program);
errors.addAll(target.performGlobalTransformations(coreTypes, program));

View file

@ -99,8 +99,7 @@ class FastaCompile
TestDescription description, ClosureConversionContext context) async {
Program platform = await context.loadPlatform();
Ticker ticker = new Ticker();
DillTarget dillTarget =
new DillTarget(ticker, context.uriTranslator, "vm_fasta");
DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator, "vm");
platform.unbindCanonicalNames();
dillTarget.loader.appendLibraries(platform);
KernelTarget sourceTarget = new KernelTarget(PhysicalFileSystem.instance,

View file

@ -80,8 +80,7 @@ class FastaCompile extends Step<TestDescription, Program, InterpreterContext> {
TestDescription description, InterpreterContext context) async {
Program platform = await context.loadPlatform();
Ticker ticker = new Ticker();
DillTarget dillTarget =
new DillTarget(ticker, context.uriTranslator, "vm_fasta");
DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator, "vm");
platform.unbindCanonicalNames();
dillTarget.loader.appendLibraries(platform);
KernelTarget sourceTarget = new KernelTarget(PhysicalFileSystem.instance,

View file

@ -198,7 +198,7 @@ class NotReifiedKernel extends Step<TestDescription, Program, TestContext> {
var coreTypes = new CoreTypes(program);
var hierarchy = new ClosedWorldClassHierarchy(program);
target
..performModularTransformationsOnProgram(coreTypes, hierarchy, program)
..performModularTransformations(coreTypes, hierarchy, program)
..performGlobalTransformations(coreTypes, program);
return pass(program);
} catch (e, s) {

View file

@ -409,8 +409,7 @@ Future<CompilerOutcome> batchMain(
if (target != null && canContinueCompilation) {
CoreTypes coreTypes = new CoreTypes(program);
ClassHierarchy hierarchy = new ClosedWorldClassHierarchy(program);
target.performModularTransformationsOnProgram(
coreTypes, hierarchy, program);
target.performModularTransformations(coreTypes, hierarchy, program);
runVerifier();
if (options['link']) {
target.performGlobalTransformations(coreTypes, program);