Index: tools/testing/dart/compiler_configuration.dart |
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart |
index 49368ce1cc60234084f1e0b2310966c7de4bd1df..2ad03e4cab92b70a7f77fc6adc97de16626bdd58 100644 |
--- a/tools/testing/dart/compiler_configuration.dart |
+++ b/tools/testing/dart/compiler_configuration.dart |
@@ -89,6 +89,19 @@ abstract class CompilerConfiguration { |
arch: configuration['arch'], |
useBlobs: useBlobs, |
isAndroid: configuration['system'] == 'android'); |
+ case 'dartk': |
+ return ComposedCompilerConfiguration.createDartKConfiguration( |
+ isHostChecked: isHostChecked, |
+ kernel_transformers: configuration['kernel_transformers'], |
+ useSdk: useSdk); |
+ case 'dartkp': |
+ return ComposedCompilerConfiguration.createDartKPConfiguration( |
+ isHostChecked: isHostChecked, |
+ arch: configuration['arch'], |
+ useBlobs: useBlobs, |
+ isAndroid: configuration['system'] == 'android', |
+ kernel_transformers: configuration['kernel_transformers'], |
+ useSdk: useSdk); |
case 'none': |
return new NoneCompilerConfiguration( |
isDebug: isDebug, |
@@ -199,6 +212,257 @@ class NoneCompilerConfiguration extends CompilerConfiguration { |
} |
} |
+/// The "dartk" compiler. |
+class DartKCompilerConfiguration extends CompilerConfiguration { |
+ DartKCompilerConfiguration({bool isHostChecked, bool useSdk}) |
+ : super._subclass(isHostChecked: isHostChecked, useSdk: useSdk); |
+ |
+ @override |
+ String computeCompilerPath(String buildDir) { |
+ return 'third_party/pkg/kernel/bin/dartk.dart'; |
+ } |
+ |
+ CompilationCommand computeCompilationCommand( |
+ String outputFileName, |
+ String buildDir, |
+ CommandBuilder commandBuilder, |
+ List arguments, |
+ Map<String, String> environmentOverrides) { |
+ var extraArguments = [ |
+ '--sdk', |
+ '$buildDir/obj/gen/patched_sdk', |
+ '--link', |
+ '--target=vm', |
+ '--out', |
+ outputFileName |
+ ]; |
+ return commandBuilder.getKernelCompilationCommand( |
+ 'dartk', |
+ outputFileName, |
+ true, |
+ bootstrapDependencies(buildDir), |
+ computeCompilerPath(buildDir), |
+ []..addAll(arguments)..addAll(extraArguments), |
+ environmentOverrides); |
+ } |
+ |
+ CommandArtifact computeCompilationArtifact( |
+ String buildDir, |
+ String tempDir, |
+ CommandBuilder commandBuilder, |
+ List arguments, |
+ Map<String, String> environmentOverrides) { |
+ return new CommandArtifact(<Command>[ |
+ this.computeCompilationCommand('$tempDir/out.dill', buildDir, |
+ CommandBuilder.instance, arguments, environmentOverrides) |
+ ], '$tempDir/out.dill', 'application/dart'); |
+ } |
+} |
+ |
+typedef List<String> CompilerArgumentsFunction( |
+ List<String> globalArguments, |
+ String previousCompilerOutput); |
+ |
+class PipelineCommand { |
+ final CompilerConfiguration compilerConfiguration; |
+ final CompilerArgumentsFunction _argumentsFunction; |
+ |
+ PipelineCommand._(this.compilerConfiguration, this._argumentsFunction); |
+ |
+ factory PipelineCommand.runWithGlobalArguments(CompilerConfiguration conf) { |
+ return new PipelineCommand._(conf, (List<String> globalArguments, |
+ String previousOutput) { |
+ assert(previousOutput == null); |
+ return globalArguments; |
+ }); |
+ } |
+ |
+ factory PipelineCommand.runWithDartOrKernelFile(CompilerConfiguration conf) { |
+ return new PipelineCommand._(conf, (List<String> globalArguments, |
+ String previousOutput) { |
+ var filtered = globalArguments |
+ .where((String name) => name.endsWith('.dart') || |
+ name.endsWith('.dill')) |
+ .toList(); |
+ assert(filtered.length == 1); |
+ return filtered; |
+ }); |
+ } |
+ |
+ factory PipelineCommand.runWithPreviousKernelOutput( |
+ CompilerConfiguration conf) { |
+ return new PipelineCommand._(conf, (List<String> globalArguments, |
+ String previousOutput) { |
+ assert(previousOutput.endsWith('.dill')); |
+ return [previousOutput]; |
+ }); |
+ } |
+ |
+ List<String> extractArguments(List<String> globalArguments, |
+ String previousOutput) { |
+ return _argumentsFunction(globalArguments, previousOutput); |
+ } |
+} |
+ |
+class ComposedCompilerConfiguration extends CompilerConfiguration { |
+ final List<PipelineCommand> pipelineCommands; |
+ |
+ ComposedCompilerConfiguration(this.pipelineCommands) |
+ : super._subclass(); |
+ |
+ CommandArtifact computeCompilationArtifact( |
+ String buildDir, |
+ String tempDir, |
+ CommandBuilder commandBuilder, |
+ List globalArguments, |
+ Map<String, String> environmentOverrides) { |
+ |
+ List<Command> allCommands = []; |
+ |
+ // The first compilation command is as usual. |
+ var arguments = pipelineCommands[0].extractArguments(globalArguments, null); |
+ CommandArtifact artifact = |
+ pipelineCommands[0].compilerConfiguration.computeCompilationArtifact( |
+ buildDir, tempDir, commandBuilder, arguments, environmentOverrides); |
+ allCommands.addAll(artifact.commands); |
+ |
+ // The following compilation commands are based on the output of the |
+ // previous one. |
+ for (int i = 1; i < pipelineCommands.length; i++) { |
+ PipelineCommand pc = pipelineCommands[i]; |
+ |
+ arguments = pc.extractArguments(globalArguments, artifact.filename); |
+ artifact = pc.compilerConfiguration.computeCompilationArtifact( |
+ buildDir, tempDir, commandBuilder, arguments, environmentOverrides); |
+ |
+ allCommands.addAll(artifact.commands); |
+ } |
+ |
+ return new CommandArtifact( |
+ allCommands, artifact.filename, artifact.mimeType); |
+ } |
+ |
+ List<String> computeCompilerArguments(vmOptions, sharedOptions, args) { |
+ // The result will be passed as an input to [extractArguments] |
+ // (i.e. the arguments to the [PipelineCommand]). |
+ return new List<String>.from(sharedOptions)..addAll(args); |
+ } |
+ |
+ List<String> computeRuntimeArguments( |
+ RuntimeConfiguration runtimeConfiguration, |
+ String buildDir, |
+ TestInformation info, |
+ List<String> vmOptions, |
+ List<String> sharedOptions, |
+ List<String> originalArguments, |
+ CommandArtifact artifact) { |
+ return <String>[artifact.filename]; |
+ } |
+ |
+ static ComposedCompilerConfiguration createDartKPConfiguration( |
+ {bool isHostChecked, String arch, bool useBlobs, bool isAndroid, |
+ String kernel_transformers, bool useSdk}) { |
+ var nested = []; |
+ |
+ // Compile with dartk. |
+ nested.add(new PipelineCommand.runWithGlobalArguments( |
+ new DartKCompilerConfiguration(isHostChecked: isHostChecked, |
+ useSdk: useSdk))); |
+ |
+ // Run zero or more transformations. |
+ addKernelTransformations(nested, kernel_transformers); |
+ |
+ // Run the normal precompiler. |
+ nested.add(new PipelineCommand.runWithPreviousKernelOutput( |
+ new PrecompilerCompilerConfiguration( |
+ arch: arch, useBlobs: useBlobs, isAndroid: isAndroid))); |
+ |
+ return new ComposedCompilerConfiguration(nested); |
+ } |
+ |
+ static ComposedCompilerConfiguration createDartKConfiguration( |
+ {bool isHostChecked, bool useSdk, String kernel_transformers}) { |
+ var nested = []; |
+ |
+ // Compile with dartk. |
+ nested.add(new PipelineCommand.runWithGlobalArguments( |
+ new DartKCompilerConfiguration(isHostChecked: isHostChecked, |
+ useSdk: useSdk))); |
+ |
+ // Run zero or more transformations. |
+ addKernelTransformations(nested, kernel_transformers); |
+ |
+ return new ComposedCompilerConfiguration(nested); |
+ } |
+ |
+ static void addKernelTransformations(List<PipelineCommand> nested, |
+ String kernel_transformers) { |
+ if (kernel_transformers != null && kernel_transformers.length > 0) { |
+ List<String> names = kernel_transformers.split(','); |
+ for (var name in names) { |
+ var transformation = new KernelTransformation(name); |
+ nested.add(nested.isEmpty |
+ ? new PipelineCommand.runWithDartOrKernelFile(transformation) |
+ : new PipelineCommand.runWithPreviousKernelOutput(transformation)); |
+ } |
+ } |
+ } |
+} |
+ |
+class KernelTransformation extends CompilerConfiguration { |
+ final String transformation; |
+ |
+ KernelTransformation(this.transformation) : super._subclass(); |
+ |
+ CommandArtifact computeCompilationArtifact( |
+ String buildDir, |
+ String tempDir, |
+ CommandBuilder commandBuilder, |
+ List arguments, |
+ Map<String, String> environmentOverrides) { |
+ assert(arguments.length == 1); |
+ assert(arguments.last.contains('/')); |
+ assert(arguments.last.endsWith('.dill')); |
+ |
+ // The --kernel-transformers=a,b can be specified as |
+ // a = <name> |
+ // a = <name>:<path-to-transformer-executable> |
+ int colonIndex = transformation.indexOf(':'); |
+ String transformationName = transformation; |
+ String executable; |
+ if (colonIndex > 0) { |
+ executable = transformation.substring(colonIndex + 1); |
+ transformationName = transformation.substring(0, colonIndex); |
+ } |
+ |
+ // The transformed output will be always written to a new file in the |
+ // test-specific temporary directory. |
+ var inputFile = arguments.last; |
+ var baseInputFilename = inputFile.substring( |
+ inputFile.lastIndexOf('/') + 1, inputFile.length - '.dill'.length); |
+ var outputFile = '$tempDir/$baseInputFilename.$transformationName.dill'; |
+ |
+ // Use the user-supplied transformer or fall back to `transformer.dart`. |
+ List<String> transformerArguments; |
+ bool useBatchMode = false; |
+ if (executable == null) { |
+ executable = 'third_party/pkg/kernel/bin/transform.dart'; |
+ transformerArguments = |
+ ['-f', 'bin', '-t', transformation, '-o', outputFile, inputFile]; |
+ useBatchMode = true; |
+ } else { |
+ transformerArguments = [inputFile, outputFile]; |
+ } |
+ |
+ var command = commandBuilder.getKernelTransformationCommand( |
+ transformationName, executable, transformerArguments, outputFile, |
+ environmentOverrides, useBatchMode); |
+ |
+ return new CommandArtifact( |
+ <Command>[ command ], outputFile, 'application/dart'); |
+ } |
+} |
+ |
/// Common configuration for dart2js-based tools, such as, dart2js |
class Dart2xCompilerConfiguration extends CompilerConfiguration { |
final String moniker; |